From 98196585a620cba60c0d9767a0cba327e800703a Mon Sep 17 00:00:00 2001 From: Simone Gasparini Date: Sat, 13 Jul 2019 15:28:00 +0200 Subject: [PATCH] [geogram] Update to 1.7.0 --- CMakeLists.txt | 4 +- README.txt | 0 cmake/platforms/Darwin-clang.cmake | 4 +- output.obj | 61851 ---------------- src/bin/CMakeLists.txt | 1 + src/bin/fpg/CMakeLists.txt | 8 +- src/bin/geobox/main.cpp | 30 +- src/bin/geocod/CMakeLists.txt | 9 +- src/bin/geocod/lua/embed_lua_files.sh | 2 +- src/bin/geocod/lua/embedded_lua_files.cpp | 598 +- src/bin/geocod/lua/examples/flake.lua | 2 +- src/bin/geocod/lua/examples/radis.lua | 548 + src/bin/geocod/lua/examples/sierpinski.lua | 2 +- src/bin/geocod/main.cpp | 100 +- src/bin/geodump/CMakeLists.txt | 9 +- src/bin/geoshade/CMakeLists.txt | 10 + .../glsl/ShaderToy/AlloyPlatedVoronoi.glsl | 335 + .../glsl/ShaderToy/AndromedaJewel.glsl | 81 + src/bin/geoshade/glsl/ShaderToy/Circuits.glsl | 57 + .../glsl/ShaderToy/ContouredLayers.glsl | 365 + .../geoshade/glsl/ShaderToy/FractalLand.glsl | 218 + .../glsl/ShaderToy/GeodesicTiling.glsl | 708 + .../glsl/ShaderToy/Geomechanical.glsl | 712 + src/bin/geoshade/glsl/ShaderToy/HexFlow.glsl | 459 + .../geoshade/glsl/ShaderToy/JellyTubes.glsl | 127 + .../geoshade/glsl/ShaderToy/MengerTunnel.glsl | 464 + .../glsl/ShaderToy/QuadTreeTruchet.glsl | 435 + .../glsl/ShaderToy/RayMarchingPrimitives.glsl | 405 + .../glsl/ShaderToy/RoundedVoronoiEdges.glsl | 142 + .../glsl/ShaderToy/RounderVoronoi.glsl | 243 + .../geoshade/glsl/ShaderToy/SiggraphLogo.glsl | 139 + .../glsl/ShaderToy/TentacleObject.glsl | 279 + .../glsl/ShaderToy/ThePopularShader.glsl | 394 + .../glsl/ShaderToy/TracedMinkwskiTube.glsl | 191 + .../geoshade/glsl/ShaderToy/VoxelPacMan.glsl | 295 + src/bin/geoshade/glsl/ShaderToy/Voxels.glsl | 333 + src/bin/geoshade/glsl/ShaderToy/rabbit.glsl | 213 + .../geoshade/glsl/course/raytrace_step1.glsl | 78 + .../geoshade/glsl/course/raytrace_step2.glsl | 92 + .../geoshade/glsl/course/raytrace_step3.glsl | 168 + .../geoshade/glsl/course/raytrace_step4.glsl | 183 + .../geoshade/glsl/course/raytrace_step5.glsl | 211 + .../geoshade/glsl/course/raytrace_step6.glsl | 219 + .../geoshade/glsl/course/raytrace_step7.glsl | 324 + .../geoshade/glsl/course/raytrace_step8.glsl | 377 + src/bin/geoshade/glsl/embed_glsl_files.sh | 60 + src/bin/geoshade/glsl/embedded_glsl_files.cpp | 7965 ++ src/bin/geoshade/main.cpp | 378 + src/bin/vorpacomp/CMakeLists.txt | 7 +- src/bin/vorpalite/CMakeLists.txt | 9 +- src/bin/vorpastat/CMakeLists.txt | 7 +- src/bin/vorpaview/CMakeLists.txt | 9 +- src/bin/vorpaview/main.cpp | 6 +- .../exploragram/compute_OTM/CMakeLists.txt | 10 +- .../hexdom_pipeline/CMakeLists.txt | 8 +- .../geogram/compute_RVD/CMakeLists.txt | 8 +- .../geogram/compute_delaunay/CMakeLists.txt | 8 +- .../geogram/manifold_harmonics/CMakeLists.txt | 8 +- .../geogram/opennl_LSCM/CMakeLists.txt | 8 +- .../opennl_basic_example/CMakeLists.txt | 8 +- .../geogram/opennl_mesh_smooth/CMakeLists.txt | 8 +- .../geogram/simple_raytrace/CMakeLists.txt | 8 +- src/examples/geogram/simple_raytrace/main.cpp | 19 +- .../geogram/simple_raytrace/raytracing.h | 52 +- src/examples/graphics/CMakeLists.txt | 3 +- .../GLUP_basic_example/CMakeLists.txt | 8 - .../graphics/GLUP_basic_example/main.cpp | 910 - .../graphics/GLUP_basic_example/uv.xpm | 771 - .../graphics/demo_Application/CMakeLists.txt | 9 + .../graphics/demo_Application/main.cpp | 178 + .../graphics/demo_Delaunay2d/CMakeLists.txt | 11 +- .../graphics/demo_Delaunay2d/gui_state.h | 4 + .../graphics/demo_Delaunay2d/main.cpp | 1177 +- .../graphics/demo_Delaunay2d/main.cpp.old | 798 + .../graphics/demo_Delaunay3d/CMakeLists.txt | 11 +- .../graphics/demo_Delaunay3d/main.cpp | 72 +- .../graphics/demo_Evert/CMakeLists.txt | 9 +- src/examples/graphics/demo_Evert/main.cpp | 105 +- .../graphics/demo_GLUP/CMakeLists.txt | 9 +- src/examples/graphics/demo_GLUP/main.cpp | 145 +- .../graphics/demo_Raytrace/CMakeLists.txt | 9 +- src/examples/graphics/demo_Raytrace/main.cpp | 335 +- .../demo_SimpleApplication/CMakeLists.txt | 9 + .../graphics/demo_SimpleApplication/main.cpp | 299 + src/lib/geogram/CMakeLists.txt | 1 - src/lib/geogram/basic/android_wrapper.h | 74 + src/lib/geogram/basic/command_line.cpp | 18 + src/lib/geogram/basic/command_line.h | 23 + src/lib/geogram/basic/command_line_args.cpp | 20 +- .../geogram/delaunay/parallel_delaunay_3d.cpp | 8 +- src/lib/geogram/mesh/mesh.h | 8 +- src/lib/geogram/mesh/mesh_io.cpp | 6 - src/lib/geogram/third_party/CMakeLists.txt | 8 + .../third_party/PoissonRecon/Allocator.h | 0 .../geogram/third_party/PoissonRecon/Array.h | 242 +- .../third_party/PoissonRecon/Array.inl | 1324 +- .../third_party/PoissonRecon/BSplineData.h | 816 +- .../third_party/PoissonRecon/BSplineData.inl | 960 +- .../third_party/PoissonRecon/BinaryNode.h | 140 +- .../third_party/PoissonRecon/Factor.cpp | 528 +- .../geogram/third_party/PoissonRecon/Factor.h | 100 +- .../third_party/PoissonRecon/FunctionData.h | 82 +- .../third_party/PoissonRecon/FunctionData.inl | 60 +- .../third_party/PoissonRecon/Geometry.cpp | 247 +- .../third_party/PoissonRecon/Geometry.h | 760 +- .../third_party/PoissonRecon/Geometry.inl | 1212 +- .../geogram/third_party/PoissonRecon/Hash.h | 60 +- .../third_party/PoissonRecon/LICENSE.txt | 0 .../geogram/third_party/PoissonRecon/MAT.h | 96 +- .../geogram/third_party/PoissonRecon/MAT.inl | 0 .../PoissonRecon/MarchingCubes.cpp | 2052 +- .../third_party/PoissonRecon/MarchingCubes.h | 294 +- .../third_party/PoissonRecon/MemoryUsage.h | 400 +- .../MultiGridOctreeData.Evaluation.inl | 1612 +- .../MultiGridOctreeData.IsoSurface.inl | 2371 +- .../MultiGridOctreeData.SortedTreeNodes.inl | 730 +- .../MultiGridOctreeData.System.inl | 3130 +- .../MultiGridOctreeData.WeightedSamples.inl | 1196 +- .../PoissonRecon/MultiGridOctreeData.h | 1402 +- .../PoissonRecon/MultiGridOctreeData.inl | 1116 +- .../geogram/third_party/PoissonRecon/MyTime.h | 108 +- .../geogram/third_party/PoissonRecon/Octree.h | 350 +- .../third_party/PoissonRecon/Octree.inl | 2136 +- .../third_party/PoissonRecon/PPolynomial.h | 226 +- .../third_party/PoissonRecon/PPolynomial.inl | 940 +- .../third_party/PoissonRecon/PlyVertexMini.h | 0 .../third_party/PoissonRecon/PointStream.h | 286 +- .../third_party/PoissonRecon/PointStream.inl | 406 +- .../third_party/PoissonRecon/Polynomial.h | 200 +- .../third_party/PoissonRecon/Polynomial.inl | 738 +- .../third_party/PoissonRecon/SparseMatrix.h | 388 +- .../third_party/PoissonRecon/SparseMatrix.inl | 1060 +- .../PoissonRecon/poisson_geogram.cpp | 6 +- .../PoissonRecon/poisson_geogram.h | 0 src/lib/geogram_gfx/CMakeLists.txt | 13 +- src/lib/geogram_gfx/GLUP/GLUP.cpp | 3 +- .../GLUP/shaders/GLUPGLSL/vertex_shader.h | 2 +- src/lib/geogram_gfx/ImGui_ext/file_dialog.cpp | 640 - src/lib/geogram_gfx/ImGui_ext/file_dialog.h | 249 - src/lib/geogram_gfx/ImGui_ext/icon_font.cpp | 11 + src/lib/geogram_gfx/ImGui_ext/icon_font.h | 20 +- src/lib/geogram_gfx/ImGui_ext/imgui_ext.cpp | 737 +- src/lib/geogram_gfx/ImGui_ext/imgui_ext.h | 85 +- src/lib/geogram_gfx/basic/GL.cpp | 128 +- src/lib/geogram_gfx/basic/GL.h | 11 + .../geogram_gfx/basic/frame_buffer_object.cpp | 5 +- .../full_screen_effect.cpp | 10 +- .../full_screen_effects/unsharp_masking.cpp | 7 + src/lib/geogram_gfx/glup_viewer/glup_viewer.c | 2589 - src/lib/geogram_gfx/glup_viewer/glup_viewer.h | 317 - .../glup_viewer/glup_viewer_gui.cpp | 2484 - .../glup_viewer/glup_viewer_gui_private.cpp | 289 - .../glup_viewer/glup_viewer_gui_private.h | 166 - src/lib/geogram_gfx/gui/application.cpp | 1236 + src/lib/geogram_gfx/gui/application.h | 557 + .../arc_ball_impl.cpp => gui/arc_ball.cpp} | 28 +- .../arc_ball_impl.h => gui/arc_ball.h} | 17 +- .../{glup_viewer => gui}/colormaps/README.txt | 0 .../colormaps/black_white.xpm | 0 .../colormaps/blue_red.xpm | 0 .../colormaps/cei_60757.xpm | 0 .../{glup_viewer => gui}/colormaps/french.xpm | 0 .../colormaps/inferno.xpm | 0 .../{glup_viewer => gui}/colormaps/magma.xpm | 0 .../{glup_viewer => gui}/colormaps/parula.xpm | 0 .../{glup_viewer => gui}/colormaps/plasma.xpm | 0 .../colormaps/rainbow.xpm | 0 .../colormaps/viridis.xpm | 0 src/lib/geogram_gfx/gui/command.cpp | 551 + .../glup_viewer_gui.h => gui/command.h} | 891 +- src/lib/geogram_gfx/gui/console.cpp | 393 + src/lib/geogram_gfx/gui/console.h | 200 + src/lib/geogram_gfx/gui/events.h | 67 + .../{glup_viewer => gui}/geogram_logo_256.xpm | 0 src/lib/geogram_gfx/gui/gui_state.h | 4 + src/lib/geogram_gfx/gui/gui_state_bigfont_h.h | 4 + src/lib/geogram_gfx/gui/gui_state_bigfont_v.h | 4 + .../geogram_gfx/gui/simple_application.cpp | 1250 + src/lib/geogram_gfx/gui/simple_application.h | 547 + .../gui/simple_mesh_application.cpp | 527 + .../geogram_gfx/gui/simple_mesh_application.h | 295 + src/lib/geogram_gfx/gui/status_bar.cpp | 124 + src/lib/geogram_gfx/gui/status_bar.h | 115 + src/lib/geogram_gfx/gui/text_editor.cpp | 134 + src/lib/geogram_gfx/gui/text_editor.h | 84 + src/lib/geogram_gfx/lua/lua_imgui.cpp | 2 +- ..._viewer.cpp => lua_simple_application.cpp} | 104 +- ...glup_viewer.h => lua_simple_application.h} | 10 +- src/lib/geogram_gfx/mesh/mesh_gfx.cpp | 19 +- .../geogram_gfx/third_party/ImGui/imgui.cpp | 1 + .../third_party/ImGui/imgui_impl_android.cpp | 615 - .../third_party/ImGui/imgui_impl_android.h | 41 - .../third_party/ImGui/imgui_internal.h | 2 +- .../ImGuiColorTextEdit/OLD/TextEditor.cpp | 2248 - .../ImGuiColorTextEdit/OLD/TextEditor.h | 445 - svn-commit.tmp | 4 + tests/FileInput.txt | 3 - 197 files changed, 41422 insertions(+), 89689 deletions(-) create mode 100644 README.txt delete mode 100644 output.obj mode change 100755 => 100644 src/bin/CMakeLists.txt mode change 100755 => 100644 src/bin/geocod/lua/examples/flake.lua create mode 100644 src/bin/geocod/lua/examples/radis.lua mode change 100755 => 100644 src/bin/geocod/lua/examples/sierpinski.lua create mode 100755 src/bin/geoshade/CMakeLists.txt create mode 100644 src/bin/geoshade/glsl/ShaderToy/AlloyPlatedVoronoi.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/AndromedaJewel.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/Circuits.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/ContouredLayers.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/FractalLand.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/GeodesicTiling.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/Geomechanical.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/HexFlow.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/JellyTubes.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/MengerTunnel.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/QuadTreeTruchet.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/RayMarchingPrimitives.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/RoundedVoronoiEdges.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/RounderVoronoi.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/SiggraphLogo.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/TentacleObject.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/ThePopularShader.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/TracedMinkwskiTube.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/VoxelPacMan.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/Voxels.glsl create mode 100644 src/bin/geoshade/glsl/ShaderToy/rabbit.glsl create mode 100644 src/bin/geoshade/glsl/course/raytrace_step1.glsl create mode 100644 src/bin/geoshade/glsl/course/raytrace_step2.glsl create mode 100644 src/bin/geoshade/glsl/course/raytrace_step3.glsl create mode 100644 src/bin/geoshade/glsl/course/raytrace_step4.glsl create mode 100644 src/bin/geoshade/glsl/course/raytrace_step5.glsl create mode 100644 src/bin/geoshade/glsl/course/raytrace_step6.glsl create mode 100644 src/bin/geoshade/glsl/course/raytrace_step7.glsl create mode 100644 src/bin/geoshade/glsl/course/raytrace_step8.glsl create mode 100755 src/bin/geoshade/glsl/embed_glsl_files.sh create mode 100644 src/bin/geoshade/glsl/embedded_glsl_files.cpp create mode 100644 src/bin/geoshade/main.cpp mode change 100755 => 100644 src/bin/vorpaview/main.cpp delete mode 100755 src/examples/graphics/GLUP_basic_example/CMakeLists.txt delete mode 100644 src/examples/graphics/GLUP_basic_example/main.cpp delete mode 100755 src/examples/graphics/GLUP_basic_example/uv.xpm create mode 100755 src/examples/graphics/demo_Application/CMakeLists.txt create mode 100644 src/examples/graphics/demo_Application/main.cpp create mode 100644 src/examples/graphics/demo_Delaunay2d/gui_state.h create mode 100644 src/examples/graphics/demo_Delaunay2d/main.cpp.old mode change 100755 => 100644 src/examples/graphics/demo_Evert/main.cpp create mode 100755 src/examples/graphics/demo_SimpleApplication/CMakeLists.txt create mode 100644 src/examples/graphics/demo_SimpleApplication/main.cpp create mode 100644 src/lib/geogram/basic/android_wrapper.h mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/Allocator.h mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/Array.h mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/Array.inl mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/BSplineData.h mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/BSplineData.inl mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/BinaryNode.h mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/Factor.cpp mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/Factor.h mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/FunctionData.h mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/FunctionData.inl mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/Geometry.cpp mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/Geometry.h mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/Geometry.inl mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/LICENSE.txt mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/MAT.h mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/MAT.inl mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/MarchingCubes.h mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.Evaluation.inl mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.IsoSurface.inl mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.SortedTreeNodes.inl mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.System.inl mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.WeightedSamples.inl mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.h mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.inl mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/Octree.h mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/Octree.inl mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/PPolynomial.h mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/PlyVertexMini.h mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/PointStream.h mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/PointStream.inl mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/Polynomial.h mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/Polynomial.inl mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/SparseMatrix.h mode change 100755 => 100644 src/lib/geogram/third_party/PoissonRecon/poisson_geogram.h delete mode 100644 src/lib/geogram_gfx/ImGui_ext/file_dialog.cpp delete mode 100644 src/lib/geogram_gfx/ImGui_ext/file_dialog.h mode change 100755 => 100644 src/lib/geogram_gfx/full_screen_effects/unsharp_masking.cpp delete mode 100644 src/lib/geogram_gfx/glup_viewer/glup_viewer.c delete mode 100644 src/lib/geogram_gfx/glup_viewer/glup_viewer.h delete mode 100644 src/lib/geogram_gfx/glup_viewer/glup_viewer_gui.cpp delete mode 100644 src/lib/geogram_gfx/glup_viewer/glup_viewer_gui_private.cpp delete mode 100755 src/lib/geogram_gfx/glup_viewer/glup_viewer_gui_private.h create mode 100644 src/lib/geogram_gfx/gui/application.cpp create mode 100644 src/lib/geogram_gfx/gui/application.h rename src/lib/geogram_gfx/{glup_viewer/arc_ball_impl.cpp => gui/arc_ball.cpp} (89%) mode change 100755 => 100644 rename src/lib/geogram_gfx/{glup_viewer/arc_ball_impl.h => gui/arc_ball.h} (95%) mode change 100755 => 100644 rename src/lib/geogram_gfx/{glup_viewer => gui}/colormaps/README.txt (100%) rename src/lib/geogram_gfx/{glup_viewer => gui}/colormaps/black_white.xpm (100%) rename src/lib/geogram_gfx/{glup_viewer => gui}/colormaps/blue_red.xpm (100%) rename src/lib/geogram_gfx/{glup_viewer => gui}/colormaps/cei_60757.xpm (100%) rename src/lib/geogram_gfx/{glup_viewer => gui}/colormaps/french.xpm (100%) rename src/lib/geogram_gfx/{glup_viewer => gui}/colormaps/inferno.xpm (100%) rename src/lib/geogram_gfx/{glup_viewer => gui}/colormaps/magma.xpm (100%) rename src/lib/geogram_gfx/{glup_viewer => gui}/colormaps/parula.xpm (100%) rename src/lib/geogram_gfx/{glup_viewer => gui}/colormaps/plasma.xpm (100%) rename src/lib/geogram_gfx/{glup_viewer => gui}/colormaps/rainbow.xpm (100%) rename src/lib/geogram_gfx/{glup_viewer => gui}/colormaps/viridis.xpm (100%) create mode 100644 src/lib/geogram_gfx/gui/command.cpp rename src/lib/geogram_gfx/{glup_viewer/glup_viewer_gui.h => gui/command.h} (66%) create mode 100644 src/lib/geogram_gfx/gui/console.cpp create mode 100644 src/lib/geogram_gfx/gui/console.h create mode 100644 src/lib/geogram_gfx/gui/events.h rename src/lib/geogram_gfx/{glup_viewer => gui}/geogram_logo_256.xpm (100%) mode change 100755 => 100644 create mode 100644 src/lib/geogram_gfx/gui/gui_state.h create mode 100644 src/lib/geogram_gfx/gui/gui_state_bigfont_h.h create mode 100644 src/lib/geogram_gfx/gui/gui_state_bigfont_v.h create mode 100644 src/lib/geogram_gfx/gui/simple_application.cpp create mode 100644 src/lib/geogram_gfx/gui/simple_application.h create mode 100644 src/lib/geogram_gfx/gui/simple_mesh_application.cpp create mode 100644 src/lib/geogram_gfx/gui/simple_mesh_application.h create mode 100644 src/lib/geogram_gfx/gui/status_bar.cpp create mode 100644 src/lib/geogram_gfx/gui/status_bar.h create mode 100644 src/lib/geogram_gfx/gui/text_editor.cpp create mode 100644 src/lib/geogram_gfx/gui/text_editor.h rename src/lib/geogram_gfx/lua/{lua_glup_viewer.cpp => lua_simple_application.cpp} (66%) rename src/lib/geogram_gfx/lua/{lua_glup_viewer.h => lua_simple_application.h} (90%) delete mode 100644 src/lib/geogram_gfx/third_party/ImGui/imgui_impl_android.cpp delete mode 100644 src/lib/geogram_gfx/third_party/ImGui/imgui_impl_android.h delete mode 100755 src/lib/geogram_gfx/third_party/ImGuiColorTextEdit/OLD/TextEditor.cpp delete mode 100755 src/lib/geogram_gfx/third_party/ImGuiColorTextEdit/OLD/TextEditor.h create mode 100644 svn-commit.tmp mode change 100755 => 100644 tests/FileInput.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index acf1da42..e14b4202 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,8 +47,8 @@ endif() include(cmake/geogram.cmake) set(VORPALINE_VERSION_MAJOR 1) -set(VORPALINE_VERSION_MINOR 6) -set(VORPALINE_VERSION_PATCH 13) +set(VORPALINE_VERSION_MINOR 7) +set(VORPALINE_VERSION_PATCH 0) set(VORPALINE_VERSION ${VORPALINE_VERSION_MAJOR}.${VORPALINE_VERSION_MINOR}.${VORPALINE_VERSION_PATCH}) set(VORPALINE_INCLUDE_SUBPATH geogram${VORPALINE_VERSION_MAJOR}) diff --git a/README.txt b/README.txt new file mode 100644 index 00000000..e69de29b diff --git a/cmake/platforms/Darwin-clang.cmake b/cmake/platforms/Darwin-clang.cmake index eca599e0..776a21fb 100644 --- a/cmake/platforms/Darwin-clang.cmake +++ b/cmake/platforms/Darwin-clang.cmake @@ -112,8 +112,8 @@ macro(vor_add_executable) if(NOT VORPALINE_BUILD_DYNAMIC) # Create a statically linked executable # Link with static libraries - add_flags(CMAKE_CXX_FLAGS -static) - add_flags(CMAKE_C_FLAGS -static) + # add_flags(CMAKE_CXX_FLAGS -static) + # add_flags(CMAKE_C_FLAGS -static) endif() add_executable(${ARGN}) diff --git a/output.obj b/output.obj deleted file mode 100644 index 6db93efc..00000000 --- a/output.obj +++ /dev/null @@ -1,61851 +0,0 @@ -v -9108.5 -8581.51 119.7 -vt 0.960515 0.558533 -v -9273.5 -8581.51 284.7 -vt 0.959174 0.559883 -v -10518.5 -8581.51 119.7 -vt 0.960515 0.570074 -v -9108.5 -8581.51 2369.7 -vt 0.942228 0.558533 -v -9273.5 -8581.51 2204.7 -vt 0.943569 0.559883 -v -10353.5 -8581.51 2204.7 -vt 0.943569 0.568724 -v -10353.5 -8581.51 284.7 -vt 0.959174 0.568724 -v -10518.5 -8581.51 2369.7 -vt 0.942228 0.570074 -o mesh000 -s off -f 1/1/1 2/2/2 3/3/3 -f 2/2/2 1/1/1 4/4/4 -f 2/2/2 4/4/4 5/5/5 -f 5/5/5 4/4/4 6/6/6 -f 3/3/3 7/7/7 8/8/8 -f 7/7/7 3/3/3 2/2/2 -f 8/8/8 7/7/7 6/6/6 -f 8/8/8 6/6/6 4/4/4 -g charts -o chart0000 -s off -f 1/1/1 2/2/2 3/3/3 -f 2/2/2 1/1/1 4/4/4 -f 2/2/2 4/4/4 5/5/5 -f 5/5/5 4/4/4 6/6/6 -f 3/3/3 7/7/7 8/8/8 -f 7/7/7 3/3/3 2/2/2 -f 8/8/8 7/7/7 6/6/6 -f 8/8/8 6/6/6 4/4/4 -v -6611 17871 -465.3 -vt 0.348711 0.459604 -v -6573.5 22326 -465.3 -vt 0.312968 0.459604 -v -6573.5 22326 -1185.3 -vt 0.312968 0.453833 -v -6611 17871 -1185.3 -vt 0.348711 0.453833 -o mesh001 -s off -f 9/9/9 10/10/10 11/11/11 -f 9/9/9 11/11/11 12/12/12 -g charts -o chart0000 -s off -f 9/9/9 10/10/10 11/11/11 -f 9/9/9 11/11/11 12/12/12 -v 16286.5 13776 2954.7 -vt 0.357855 0.419208 -v 16286.5 24861 2954.7 -vt 0.269742 0.419208 -v 16286.5 24861 3314.7 -vt 0.269742 0.415911 -v 16286.5 13776 3314.7 -vt 0.357855 0.415911 -o mesh002 -s off -f 13/13/13 14/14/14 15/15/15 -f 13/13/13 15/15/15 16/16/16 -g charts -o chart0000 -s off -f 13/13/13 14/14/14 15/15/15 -f 13/13/13 15/15/15 16/16/16 -v 16286.5 24861 2954.7 -vt 0.736076 0.892416 -v 10856.5 24861 2954.7 -vt 0.779302 0.892416 -v 10856.5 24861 3314.7 -vt 0.779302 0.895713 -v 16286.5 24861 3314.7 -vt 0.736076 0.895713 -o mesh003 -s off -f 17/17/17 18/18/18 19/19/19 -f 17/17/17 19/19/19 20/20/20 -g charts -o chart0000 -s off -f 17/17/17 18/18/18 19/19/19 -f 17/17/17 19/19/19 20/20/20 -v 18986.5 13776 2954.7 -vt 0.620532 0.602226 -v 16286.5 13776 2954.7 -vt 0.642145 0.602226 -v 16286.5 13776 3314.7 -vt 0.642145 0.605523 -v 18986.5 13776 3314.7 -vt 0.620532 0.605523 -o mesh004 -s off -f 21/21/21 22/22/22 23/23/23 -f 21/21/21 23/23/23 24/24/24 -g charts -o chart0000 -s off -f 21/21/21 22/22/22 23/23/23 -f 21/21/21 23/23/23 24/24/24 -v 18986.5 8345.99 2954.7 -vt 0.037822 0.424979 -v 18986.5 13776 2954.7 -vt 0.037822 0.38211 -v 18986.5 13776 3314.7 -vt 0.0344971 0.38211 -v 18986.5 8345.99 3314.7 -vt 0.0344971 0.424979 -o mesh005 -s off -f 25/25/25 26/26/26 27/27/27 -f 25/25/25 27/27/27 28/28/28 -g charts -o chart0000 -s off -f 25/25/25 26/26/26 27/27/27 -f 25/25/25 27/27/27 28/28/28 -v 16286.5 8345.99 2954.7 -vt 0.158354 0.999588 -v 18986.5 8345.99 2954.7 -vt 0.136741 0.999588 -v 18986.5 8345.99 3314.7 -vt 0.136741 0.99629 -v 16286.5 8345.99 3314.7 -vt 0.158354 0.99629 -o mesh006 -s off -f 29/29/29 30/30/30 31/31/31 -f 29/29/29 31/31/31 32/32/32 -g charts -o chart0000 -s off -f 29/29/29 30/30/30 31/31/31 -f 29/29/29 31/31/31 32/32/32 -v 16286.5 5120.99 2954.7 -vt 0.997922 0.578318 -v 16286.5 8345.99 2954.7 -vt 0.997922 0.552762 -v 16286.5 8345.99 3314.7 -vt 0.994597 0.552762 -v 16286.5 5120.99 3314.7 -vt 0.994597 0.578318 -o mesh007 -s off -f 33/33/33 34/34/34 35/35/35 -f 33/33/33 35/35/35 36/36/36 -g charts -o chart0000 -s off -f 33/33/33 34/34/34 35/35/35 -f 33/33/33 35/35/35 36/36/36 -v 10856.5 5120.99 2954.7 -vt 0.568163 0.997114 -v 16286.5 5120.99 2954.7 -vt 0.524938 0.997114 -v 16286.5 5120.99 3314.7 -vt 0.524938 0.993817 -v 10856.5 5120.99 3314.7 -vt 0.568163 0.993817 -o mesh008 -s off -f 37/37/37 38/38/38 39/39/39 -f 37/37/37 39/39/39 40/40/40 -g charts -o chart0000 -s off -f 37/37/37 38/38/38 39/39/39 -f 37/37/37 39/39/39 40/40/40 -v 10856.5 24861 2954.7 -vt 0.812552 0.667354 -v 10856.5 5120.99 2954.7 -vt 0.812552 0.821517 -v 10856.5 5120.99 3314.7 -vt 0.815877 0.821517 -v 10856.5 24861 3314.7 -vt 0.815877 0.667354 -o mesh009 -s off -f 41/41/41 42/42/42 43/43/43 -f 41/41/41 43/43/43 44/44/44 -g charts -o chart0000 -s off -f 41/41/41 42/42/42 43/43/43 -f 41/41/41 43/43/43 44/44/44 -v 16286.5 5120.99 2954.7 -vt 0.525769 0.551034 -v 10856.5 5120.99 2954.7 -vt 0.525769 0.593982 -v 10856.5 24861 2954.7 -vt 0.370324 0.593982 -v 16286.5 24861 2954.7 -vt 0.370324 0.551034 -v 16286.5 13776 2954.7 -vt 0.457614 0.551034 -v 18986.5 13776 2954.7 -vt 0.457614 0.529678 -v 18986.5 8345.99 2954.7 -vt 0.500373 0.529678 -v 16286.5 5120.99 2954.7 -vt 0.157523 0.545342 -v 18986.5 8345.99 2954.7 -vt 0.13591 0.570898 -v 16286.5 8345.99 2954.7 -vt 0.157523 0.570898 -o mesh010 -s off -f 45/45/45 46/46/46 47/47/47 -f 45/45/45 47/47/47 48/48/48 -f 45/45/45 48/48/48 49/49/49 -f 45/45/45 49/49/49 50/50/50 -f 45/45/45 50/50/50 51/51/51 -f 52/52/52 53/53/53 54/54/54 -g charts -o chart0000 -s off -f 45/45/45 46/46/46 47/47/47 -f 45/45/45 47/47/47 48/48/48 -f 45/45/45 48/48/48 49/49/49 -f 45/45/45 49/49/49 50/50/50 -f 45/45/45 50/50/50 51/51/51 -o chart0001 -s off -f 52/52/52 53/53/53 54/54/54 -v 10856.5 5120.99 3314.7 -vt 0.176642 0.992168 -v 16286.5 5120.99 3314.7 -vt 0.139772 0.969909 -v 16286.5 8345.99 3314.7 -vt 0.126766 0.992168 -v 10856.5 5120.99 3314.7 -vt 0.32793 0.585738 -v 16286.5 8345.99 3314.7 -vt 0.301448 0.541689 -v 18986.5 8345.99 3314.7 -vt 0.301448 0.519786 -v 18986.5 13776 3314.7 -vt 0.25686 0.519786 -v 16286.5 13776 3314.7 -vt 0.25686 0.541689 -v 16286.5 24861 3314.7 -vt 0.165835 0.541689 -v 10856.5 24861 3314.7 -vt 0.165835 0.585738 -o mesh011 -s off -f 55/55/55 56/56/56 57/57/57 -f 58/58/58 59/59/59 60/60/60 -f 58/58/58 60/60/60 61/61/61 -f 58/58/58 61/61/61 62/62/62 -f 58/58/58 62/62/62 63/63/63 -f 58/58/58 63/63/63 64/64/64 -g charts -o chart0000 -s off -f 55/55/55 56/56/56 57/57/57 -o chart0001 -s off -f 58/58/58 59/59/59 60/60/60 -f 58/58/58 60/60/60 61/61/61 -f 58/58/58 61/61/61 62/62/62 -f 58/58/58 62/62/62 63/63/63 -f 58/58/58 63/63/63 64/64/64 -v 16724 25746 5866.54 -vt 0.633832 0.715993 -v 16724 4235.99 5866.54 -vt 0.803408 0.715993 -v 13571.5 4235.99 8230.95 -vt 0.803408 0.747321 -v 13571.5 25746 8230.95 -vt 0.633832 0.747321 -o mesh012 -s off -f 65/65/65 66/66/66 67/67/67 -f 65/65/65 67/67/67 68/68/68 -g charts -o chart0000 -s off -f 65/65/65 66/66/66 67/67/67 -f 65/65/65 67/67/67 68/68/68 -v 16823.4 25746 5999.02 -vt 0.816708 0.314509 -v 13571.5 25746 8437.95 -vt 0.784289 0.314509 -v 13571.5 4235.99 8437.95 -vt 0.784289 0.146331 -v 16823.4 4235.99 5999.02 -vt 0.816708 0.146331 -o mesh013 -s off -f 69/69/69 70/70/70 71/71/71 -f 69/69/69 71/71/71 72/72/72 -g charts -o chart0000 -s off -f 69/69/69 70/70/70 71/71/71 -f 69/69/69 71/71/71 72/72/72 -v 13571.5 4235.99 8230.95 -vt 0.295563 0.97404 -v 16724 4235.99 5866.54 -vt 0.320493 0.992992 -v 16823.4 4235.99 5999.02 -vt 0.32128 0.991933 -v 13571.5 4235.99 8437.95 -vt 0.295565 0.972383 -v 10311.1 4235.99 5992.62 -vt 0.269742 0.991931 -v 10410.4 4235.99 5860.14 -vt 0.270528 0.992992 -o mesh014 -s off -f 73/73/73 74/74/74 75/75/75 -f 73/73/73 75/75/75 76/76/76 -f 73/73/73 76/76/76 77/77/77 -f 73/73/73 77/77/77 78/78/78 -g charts -o chart0000 -s off -f 73/73/73 74/74/74 75/75/75 -f 73/73/73 75/75/75 76/76/76 -f 73/73/73 76/76/76 77/77/77 -f 73/73/73 77/77/77 78/78/78 -v 13571.5 25746 8437.95 -vt 0.419315 0.523908 -v 16823.4 25746 5999.02 -vt 0.393599 0.543458 -v 16724 25746 5866.54 -vt 0.394387 0.544518 -v 13571.5 25746 8230.95 -vt 0.419317 0.525565 -v 10410.4 25746 5860.14 -vt 0.444352 0.544518 -v 10311.1 25746 5992.62 -vt 0.445137 0.543456 -o mesh015 -s off -f 79/79/79 80/80/80 81/81/81 -f 79/79/79 81/81/81 82/82/82 -f 79/79/79 82/82/82 83/83/83 -f 79/79/79 83/83/83 84/84/84 -g charts -o chart0000 -s off -f 79/79/79 80/80/80 81/81/81 -f 79/79/79 81/81/81 82/82/82 -f 79/79/79 82/82/82 83/83/83 -f 79/79/79 83/83/83 84/84/84 -v 10311.1 25746 5992.62 -vt 0.5133 0.608821 -v 10410.4 25746 5860.14 -vt 0.5133 0.607172 -v 10410.4 4235.99 5860.14 -vt 0.343724 0.607172 -v 10311.1 4235.99 5992.62 -vt 0.343724 0.608821 -o mesh016 -s off -f 85/85/85 86/86/86 87/87/87 -f 85/85/85 87/87/87 88/88/88 -g charts -o chart0000 -s off -f 85/85/85 86/86/86 87/87/87 -f 85/85/85 87/87/87 88/88/88 -v 16724 25746 5866.54 -vt 0.422693 0.616241 -v 16823.4 25746 5999.02 -vt 0.422693 0.614592 -v 16823.4 4235.99 5999.02 -vt 0.253117 0.614592 -v 16724 4235.99 5866.54 -vt 0.253117 0.616241 -o mesh017 -s off -f 89/89/89 90/90/90 91/91/91 -f 89/89/89 91/91/91 92/92/92 -g charts -o chart0000 -s off -f 89/89/89 90/90/90 91/91/91 -f 89/89/89 91/91/91 92/92/92 -v 13571.5 25746 8437.95 -vt 0.4468 0.711871 -v 10311.1 25746 5992.62 -vt 0.4468 0.67972 -v 10311.1 4235.99 5992.62 -vt 0.277224 0.67972 -v 13571.5 4235.99 8437.95 -vt 0.277224 0.711871 -o mesh018 -s off -f 93/93/93 94/94/94 95/95/95 -f 93/93/93 95/95/95 96/96/96 -g charts -o chart0000 -s off -f 93/93/93 94/94/94 95/95/95 -f 93/93/93 95/95/95 96/96/96 -v 13571.5 4235.99 8230.95 -vt 0.388612 0.712696 -v 10410.4 4235.99 5860.14 -vt 0.388612 0.744023 -v 10410.4 25746 5860.14 -vt 0.219036 0.744023 -v 13571.5 25746 8230.95 -vt 0.219036 0.712696 -o mesh019 -s off -f 97/97/97 98/98/98 99/99/99 -f 97/97/97 99/99/99 100/100/100 -g charts -o chart0000 -s off -f 97/97/97 98/98/98 99/99/99 -f 97/97/97 99/99/99 100/100/100 -v 13571.5 14213.5 5866.54 -vt 0.563175 0.976504 -v 19871.5 14213.5 5866.54 -vt 0.563175 0.92704 -v 19871.5 11061 8230.95 -vt 0.531588 0.92704 -v 13571.5 11061 8230.95 -vt 0.531588 0.976504 -o mesh020 -s off -f 101/101/101 102/102/102 103/103/103 -f 101/101/101 103/103/103 104/104/104 -g charts -o chart0000 -s off -f 101/101/101 102/102/102 103/103/103 -f 101/101/101 103/103/103 104/104/104 -v 13571.5 14312.9 5999.02 -vt 0.94389 0.314509 -v 13571.5 11061 8437.95 -vt 0.94389 0.346661 -v 19871.5 11061 8437.95 -vt 0.993765 0.346661 -v 19871.5 14312.9 5999.02 -vt 0.993765 0.314509 -o mesh021 -s off -f 105/105/105 106/106/106 107/107/107 -f 105/105/105 107/107/107 108/108/108 -g charts -o chart0000 -s off -f 105/105/105 106/106/106 107/107/107 -f 105/105/105 107/107/107 108/108/108 -v 19871.5 11061 8230.95 -vt 0.943942 0.922927 -v 19871.5 14213.5 5866.54 -vt 0.968872 0.94188 -v 19871.5 14312.9 5999.02 -vt 0.969659 0.94082 -v 19871.5 11061 8437.95 -vt 0.943944 0.92127 -v 19871.5 7800.55 5992.62 -vt 0.918121 0.940818 -v 19871.5 7899.91 5860.14 -vt 0.918907 0.94188 -o mesh022 -s off -f 109/109/109 110/110/110 111/111/111 -f 109/109/109 111/111/111 112/112/112 -f 109/109/109 112/112/112 113/113/113 -f 109/109/109 113/113/113 114/114/114 -g charts -o chart0000 -s off -f 109/109/109 110/110/110 111/111/111 -f 109/109/109 111/111/111 112/112/112 -f 109/109/109 112/112/112 113/113/113 -f 109/109/109 113/113/113 114/114/114 -v 13571.5 11061 8437.95 -vt 0.110919 0.662407 -v 13571.5 14312.9 5999.02 -vt 0.0852037 0.681958 -v 13571.5 14213.5 5866.54 -vt 0.085991 0.683017 -v 13571.5 11061 8230.95 -vt 0.110921 0.664064 -v 13571.5 7899.91 5860.14 -vt 0.135956 0.683017 -v 13571.5 7800.55 5992.62 -vt 0.136741 0.681956 -o mesh023 -s off -f 115/115/115 116/116/116 117/117/117 -f 115/115/115 117/117/117 118/118/118 -f 115/115/115 118/118/118 119/119/119 -f 115/115/115 119/119/119 120/120/120 -g charts -o chart0000 -s off -f 115/115/115 116/116/116 117/117/117 -f 115/115/115 117/117/117 118/118/118 -f 115/115/115 118/118/118 119/119/119 -f 115/115/115 119/119/119 120/120/120 -v 13571.5 7800.55 5992.62 -vt 0.0710723 0.90643 -v 13571.5 7899.91 5860.14 -vt 0.0727348 0.90643 -v 19871.5 7899.91 5860.14 -vt 0.0727348 0.856966 -v 19871.5 7800.55 5992.62 -vt 0.0710723 0.856966 -o mesh024 -s off -f 121/121/121 122/122/122 123/123/123 -f 121/121/121 123/123/123 124/124/124 -g charts -o chart0000 -s off -f 121/121/121 122/122/122 123/123/123 -f 121/121/121 123/123/123 124/124/124 -v 13571.5 14213.5 5866.54 -vt 0.836658 0.377164 -v 13571.5 14312.9 5999.02 -vt 0.838321 0.377164 -v 19871.5 14312.9 5999.02 -vt 0.838321 0.3277 -v 19871.5 14213.5 5866.54 -vt 0.836658 0.3277 -o mesh025 -s off -f 125/125/125 126/126/126 127/127/127 -f 125/125/125 127/127/127 128/128/128 -g charts -o chart0000 -s off -f 125/125/125 126/126/126 127/127/127 -f 125/125/125 127/127/127 128/128/128 -v 13571.5 11061 8437.95 -vt 0.386118 0.938582 -v 13571.5 7800.55 5992.62 -vt 0.386118 0.970734 -v 19871.5 7800.55 5992.62 -vt 0.336243 0.970734 -v 19871.5 11061 8437.95 -vt 0.336243 0.938582 -o mesh026 -s off -f 129/129/129 130/130/130 131/131/131 -f 129/129/129 131/131/131 132/132/132 -g charts -o chart0000 -s off -f 129/129/129 130/130/130 131/131/131 -f 129/129/129 131/131/131 132/132/132 -v 19871.5 11061 8230.95 -vt 0.998753 0.122424 -v 19871.5 7899.91 5860.14 -vt 0.967165 0.122424 -v 13571.5 7899.91 5860.14 -vt 0.967165 0.0729596 -v 13571.5 11061 8230.95 -vt 0.998753 0.0729596 -o mesh027 -s off -f 133/133/133 134/134/134 135/135/135 -f 133/133/133 135/135/135 136/136/136 -g charts -o chart0000 -s off -f 133/133/133 134/134/134 135/135/135 -f 133/133/133 135/135/135 136/136/136 -v 18536.5 13963.5 3719.7 -vt 0.219036 0.510717 -v 18371.5 13963.5 3884.7 -vt 0.220398 0.509387 -v 17126.5 13963.5 3719.7 -vt 0.230673 0.510717 -v 18536.5 13963.5 5969.7 -vt 0.219036 0.49258 -v 18371.5 13963.5 5804.7 -vt 0.220398 0.49391 -v 17291.5 13963.5 5804.7 -vt 0.229311 0.49391 -v 17291.5 13963.5 3884.7 -vt 0.229311 0.509387 -v 17126.5 13963.5 5969.7 -vt 0.230673 0.49258 -o mesh028 -s off -f 137/137/137 138/138/138 139/139/139 -f 138/138/138 137/137/137 140/140/140 -f 138/138/138 140/140/140 141/141/141 -f 141/141/141 140/140/140 142/142/142 -f 139/139/139 143/143/143 144/144/144 -f 143/143/143 139/139/139 138/138/138 -f 144/144/144 143/143/143 142/142/142 -f 144/144/144 142/142/142 140/140/140 -g charts -o chart0000 -s off -f 137/137/137 138/138/138 139/139/139 -f 138/138/138 137/137/137 140/140/140 -f 138/138/138 140/140/140 141/141/141 -f 141/141/141 140/140/140 142/142/142 -f 139/139/139 143/143/143 144/144/144 -f 143/143/143 139/139/139 138/138/138 -f 144/144/144 143/143/143 142/142/142 -f 144/144/144 142/142/142 140/140/140 -v 17291.5 13963.5 5804.7 -vt 0.10931 0.682193 -v 17291.5 13963.5 3884.7 -vt 0.125104 0.682193 -v 17291.5 13986 3884.7 -vt 0.125104 0.683017 -v 17291.5 13986 5804.7 -vt 0.10931 0.683017 -o mesh029 -s off -f 145/145/145 146/146/146 147/147/147 -f 145/145/145 147/147/147 148/148/148 -g charts -o chart0000 -s off -f 145/145/145 146/146/146 147/147/147 -f 145/145/145 147/147/147 148/148/148 -v 18371.5 13963.5 5804.7 -vt 0.886534 0.678071 -v 17291.5 13963.5 5804.7 -vt 0.895677 0.678071 -v 17291.5 13986 5804.7 -vt 0.895677 0.678895 -v 18371.5 13986 5804.7 -vt 0.886534 0.678895 -o mesh030 -s off -f 149/149/149 150/150/150 151/151/151 -f 149/149/149 151/151/151 152/152/152 -g charts -o chart0000 -s off -f 149/149/149 150/150/150 151/151/151 -f 149/149/149 151/151/151 152/152/152 -v 18371.5 13963.5 3884.7 -vt 0.928096 0.766282 -v 18371.5 13963.5 5804.7 -vt 0.912303 0.766282 -v 18371.5 13986 5804.7 -vt 0.912303 0.765458 -v 18371.5 13986 3884.7 -vt 0.928096 0.765458 -o mesh031 -s off -f 153/153/153 154/154/154 155/155/155 -f 153/153/153 155/155/155 156/156/156 -g charts -o chart0000 -s off -f 153/153/153 154/154/154 155/155/155 -f 153/153/153 155/155/155 156/156/156 -v 18536.5 13963.5 5969.7 -vt 0.27473 0.473619 -v 18536.5 13963.5 3719.7 -vt 0.293017 0.473619 -v 18536.5 13986 3719.7 -vt 0.293017 0.474443 -v 18536.5 13986 5969.7 -vt 0.27473 0.474443 -o mesh032 -s off -f 157/157/157 158/158/158 159/159/159 -f 157/157/157 159/159/159 160/160/160 -g charts -o chart0000 -s off -f 157/157/157 158/158/158 159/159/159 -f 157/157/157 159/159/159 160/160/160 -v 17126.5 13963.5 5969.7 -vt 0.180798 0.397774 -v 18536.5 13963.5 5969.7 -vt 0.180798 0.386232 -v 18536.5 13986 5969.7 -vt 0.179967 0.386232 -v 17126.5 13986 5969.7 -vt 0.179967 0.397774 -o mesh033 -s off -f 161/161/161 162/162/162 163/163/163 -f 161/161/161 163/163/163 164/164/164 -g charts -o chart0000 -s off -f 161/161/161 162/162/162 163/163/163 -f 161/161/161 163/163/163 164/164/164 -v 17126.5 13986 3719.7 -vt 0.578969 0.938582 -v 17291.5 13986 3884.7 -vt 0.577607 0.937252 -v 18536.5 13986 3719.7 -vt 0.567332 0.938582 -v 17126.5 13986 5969.7 -vt 0.578969 0.920445 -v 17291.5 13986 5804.7 -vt 0.577607 0.921775 -v 18371.5 13986 5804.7 -vt 0.568694 0.921775 -v 18371.5 13986 3884.7 -vt 0.568694 0.937252 -v 18536.5 13986 5969.7 -vt 0.567332 0.920445 -o mesh034 -s off -f 165/165/165 166/166/166 167/167/167 -f 166/166/166 165/165/165 168/168/168 -f 166/166/166 168/168/168 169/169/169 -f 169/169/169 168/168/168 170/170/170 -f 167/167/167 171/171/171 172/172/172 -f 171/171/171 167/167/167 166/166/166 -f 172/172/172 171/171/171 170/170/170 -f 172/172/172 170/170/170 168/168/168 -g charts -o chart0000 -s off -f 165/165/165 166/166/166 167/167/167 -f 166/166/166 165/165/165 168/168/168 -f 166/166/166 168/168/168 169/169/169 -f 169/169/169 168/168/168 170/170/170 -f 167/167/167 171/171/171 172/172/172 -f 171/171/171 167/167/167 166/166/166 -f 172/172/172 171/171/171 170/170/170 -f 172/172/172 170/170/170 168/168/168 -v 17291.5 13963.5 3884.7 -vt 0.608063 0.636851 -v 18371.5 13963.5 3884.7 -vt 0.598919 0.636851 -v 18371.5 13986 3884.7 -vt 0.598919 0.636026 -v 17291.5 13986 3884.7 -vt 0.608063 0.636026 -o mesh035 -s off -f 173/173/173 174/174/174 175/175/175 -f 173/173/173 175/175/175 176/176/176 -g charts -o chart0000 -s off -f 173/173/173 174/174/174 175/175/175 -f 173/173/173 175/175/175 176/176/176 -v 18536.5 13963.5 3719.7 -vt 0.554863 0.815746 -v 17126.5 13963.5 3719.7 -vt 0.5665 0.815746 -v 17126.5 13986 3719.7 -vt 0.5665 0.81657 -v 18536.5 13986 3719.7 -vt 0.554863 0.81657 -o mesh036 -s off -f 177/177/177 178/178/178 179/179/179 -f 177/177/177 179/179/179 180/180/180 -g charts -o chart0000 -s off -f 177/177/177 178/178/178 179/179/179 -f 177/177/177 179/179/179 180/180/180 -v 17126.5 13963.5 3719.7 -vt 0.89734 0.867683 -v 17126.5 13963.5 5969.7 -vt 0.879052 0.867683 -v 17126.5 13986 5969.7 -vt 0.879052 0.866859 -v 17126.5 13986 3719.7 -vt 0.89734 0.866859 -o mesh037 -s off -f 181/181/181 182/182/182 183/183/183 -f 181/181/181 183/183/183 184/184/184 -g charts -o chart0000 -s off -f 181/181/181 182/182/182 183/183/183 -f 181/181/181 183/183/183 184/184/184 -v 18536.5 13963.5 119.7 -vt 0.00124688 0.273289 -v 18371.5 13963.5 284.7 -vt 0.00260872 0.271959 -v 17126.5 13963.5 119.7 -vt 0.0128844 0.273289 -v 18536.5 13963.5 2369.7 -vt 0.00124688 0.255153 -v 18371.5 13963.5 2204.7 -vt 0.00260872 0.256482 -v 17291.5 13963.5 2204.7 -vt 0.0115225 0.256482 -v 17291.5 13963.5 284.7 -vt 0.0115225 0.271959 -v 17126.5 13963.5 2369.7 -vt 0.0128844 0.255153 -o mesh038 -s off -f 185/185/185 186/186/186 187/187/187 -f 186/186/186 185/185/185 188/188/188 -f 186/186/186 188/188/188 189/189/189 -f 189/189/189 188/188/188 190/190/190 -f 187/187/187 191/191/191 192/192/192 -f 191/191/191 187/187/187 186/186/186 -f 192/192/192 191/191/191 190/190/190 -f 192/192/192 190/190/190 188/188/188 -g charts -o chart0000 -s off -f 185/185/185 186/186/186 187/187/187 -f 186/186/186 185/185/185 188/188/188 -f 186/186/186 188/188/188 189/189/189 -f 189/189/189 188/188/188 190/190/190 -f 187/187/187 191/191/191 192/192/192 -f 191/191/191 187/187/187 186/186/186 -f 192/192/192 191/191/191 190/190/190 -f 192/192/192 190/190/190 188/188/188 -v 17291.5 13963.5 2204.7 -vt 0.443475 0.290602 -v 17291.5 13963.5 284.7 -vt 0.443475 0.306265 -v 17291.5 13986 284.7 -vt 0.444306 0.306265 -v 17291.5 13986 2204.7 -vt 0.444306 0.290602 -o mesh039 -s off -f 193/193/193 194/194/194 195/195/195 -f 193/193/193 195/195/195 196/196/196 -g charts -o chart0000 -s off -f 193/193/193 194/194/194 195/195/195 -f 193/193/193 195/195/195 196/196/196 -v 18371.5 13963.5 2204.7 -vt 0.248961 0.586562 -v 17291.5 13963.5 2204.7 -vt 0.258105 0.586562 -v 17291.5 13986 2204.7 -vt 0.258105 0.587387 -v 18371.5 13986 2204.7 -vt 0.248961 0.587387 -o mesh040 -s off -f 197/197/197 198/198/198 199/199/199 -f 197/197/197 199/199/199 200/200/200 -g charts -o chart0000 -s off -f 197/197/197 198/198/198 199/199/199 -f 197/197/197 199/199/199 200/200/200 -v 18371.5 13963.5 284.7 -vt 0.353699 0.486809 -v 18371.5 13963.5 2204.7 -vt 0.337905 0.486809 -v 18371.5 13986 2204.7 -vt 0.337905 0.485985 -v 18371.5 13986 284.7 -vt 0.353699 0.485985 -o mesh041 -s off -f 201/201/201 202/202/202 203/203/203 -f 201/201/201 203/203/203 204/204/204 -g charts -o chart0000 -s off -f 201/201/201 202/202/202 203/203/203 -f 201/201/201 203/203/203 204/204/204 -v 18536.5 13963.5 2369.7 -vt 0.893184 0.225474 -v 18536.5 13963.5 119.7 -vt 0.893184 0.243611 -v 18536.5 13986 119.7 -vt 0.894015 0.243611 -v 18536.5 13986 2369.7 -vt 0.894015 0.225474 -o mesh042 -s off -f 205/205/205 206/206/206 207/207/207 -f 205/205/205 207/207/207 208/208/208 -g charts -o chart0000 -s off -f 205/205/205 206/206/206 207/207/207 -f 205/205/205 207/207/207 208/208/208 -v 17126.5 13963.5 2369.7 -vt 0.119285 0.675598 -v 18536.5 13963.5 2369.7 -vt 0.107648 0.675598 -v 18536.5 13986 2369.7 -vt 0.107648 0.674773 -v 17126.5 13986 2369.7 -vt 0.119285 0.674773 -o mesh043 -s off -f 209/209/209 210/210/210 211/211/211 -f 209/209/209 211/211/211 212/212/212 -g charts -o chart0000 -s off -f 209/209/209 210/210/210 211/211/211 -f 209/209/209 211/211/211 212/212/212 -v 17126.5 13986 119.7 -vt 0.105985 0.504946 -v 17291.5 13986 284.7 -vt 0.104644 0.503596 -v 18536.5 13986 119.7 -vt 0.105985 0.493405 -v 17126.5 13986 2369.7 -vt 0.0876974 0.504946 -v 17291.5 13986 2204.7 -vt 0.0890384 0.503596 -v 18371.5 13986 2204.7 -vt 0.0890384 0.494755 -v 18371.5 13986 284.7 -vt 0.104644 0.494755 -v 18536.5 13986 2369.7 -vt 0.0876974 0.493405 -o mesh044 -s off -f 213/213/213 214/214/214 215/215/215 -f 214/214/214 213/213/213 216/216/216 -f 214/214/214 216/216/216 217/217/217 -f 217/217/217 216/216/216 218/218/218 -f 215/215/215 219/219/219 220/220/220 -f 219/219/219 215/215/215 214/214/214 -f 220/220/220 219/219/219 218/218/218 -f 220/220/220 218/218/218 216/216/216 -g charts -o chart0000 -s off -f 213/213/213 214/214/214 215/215/215 -f 214/214/214 213/213/213 216/216/216 -f 214/214/214 216/216/216 217/217/217 -f 217/217/217 216/216/216 218/218/218 -f 215/215/215 219/219/219 220/220/220 -f 219/219/219 215/215/215 214/214/214 -f 220/220/220 219/219/219 218/218/218 -f 220/220/220 218/218/218 216/216/216 -v 17291.5 13963.5 284.7 -vt 0.37448 0.910552 -v 18371.5 13963.5 284.7 -vt 0.365337 0.910552 -v 18371.5 13986 284.7 -vt 0.365337 0.909728 -v 17291.5 13986 284.7 -vt 0.37448 0.909728 -o mesh045 -s off -f 221/221/221 222/222/222 223/223/223 -f 221/221/221 223/223/223 224/224/224 -g charts -o chart0000 -s off -f 221/221/221 222/222/222 223/223/223 -f 221/221/221 223/223/223 224/224/224 -v 18536.5 13963.5 119.7 -vt 0.287199 0.424155 -v 17126.5 13963.5 119.7 -vt 0.298836 0.424155 -v 17126.5 13986 119.7 -vt 0.298836 0.424979 -v 18536.5 13986 119.7 -vt 0.287199 0.424979 -o mesh046 -s off -f 225/225/225 226/226/226 227/227/227 -f 225/225/225 227/227/227 228/228/228 -g charts -o chart0000 -s off -f 225/225/225 226/226/226 227/227/227 -f 225/225/225 227/227/227 228/228/228 -v 17126.5 13963.5 119.7 -vt 0.37448 0.52061 -v 17126.5 13963.5 2369.7 -vt 0.356193 0.52061 -v 17126.5 13986 2369.7 -vt 0.356193 0.519786 -v 17126.5 13986 119.7 -vt 0.37448 0.519786 -o mesh047 -s off -f 229/229/229 230/230/230 231/231/231 -f 229/229/229 231/231/231 232/232/232 -g charts -o chart0000 -s off -f 229/229/229 230/230/230 231/231/231 -f 229/229/229 231/231/231 232/232/232 -v 16451.5 20593.5 -1365.3 -vt 0.797589 0.681368 -v 17291.5 20593.5 -1365.3 -vt 0.797589 0.674773 -v 17291.5 18373.5 -1365.3 -vt 0.779302 0.674773 -v 16451.5 18373.5 -1365.3 -vt 0.779302 0.681368 -o mesh048 -s off -f 233/233/233 234/234/234 235/235/235 -f 233/233/233 235/235/235 236/236/236 -g charts -o chart0000 -s off -f 233/233/233 234/234/234 235/235/235 -f 233/233/233 235/235/235 236/236/236 -v 17291.5 20593.5 9157.95 -vt 0.775977 0.527205 -v 16451.5 20593.5 9157.95 -vt 0.775977 0.52061 -v 16451.5 18373.5 9157.95 -vt 0.757689 0.52061 -v 17291.5 18373.5 9157.95 -vt 0.757689 0.527205 -o mesh049 -s off -f 237/237/237 238/238/238 239/239/239 -f 237/237/237 239/239/239 240/240/240 -g charts -o chart0000 -s off -f 237/237/237 238/238/238 239/239/239 -f 237/237/237 239/239/239 240/240/240 -v 17291.5 20593.5 -1365.3 -vt 0.960515 0.738252 -v 16451.5 20593.5 -1365.3 -vt 0.967165 0.738252 -v 16451.5 20593.5 9157.95 -vt 0.967165 0.655812 -v 17291.5 20593.5 9157.95 -vt 0.960515 0.655812 -o mesh050 -s off -f 241/241/241 242/242/242 243/243/243 -f 241/241/241 243/243/243 244/244/244 -g charts -o chart0000 -s off -f 241/241/241 242/242/242 243/243/243 -f 241/241/241 243/243/243 244/244/244 -v 16451.5 18373.5 -1365.3 -vt 0.872402 0.30709 -v 17291.5 18373.5 -1365.3 -vt 0.879052 0.30709 -v 17291.5 18373.5 9157.95 -vt 0.879052 0.22465 -v 16451.5 18373.5 9157.95 -vt 0.872402 0.22465 -o mesh051 -s off -f 245/245/245 246/246/246 247/247/247 -f 245/245/245 247/247/247 248/248/248 -g charts -o chart0000 -s off -f 245/245/245 246/246/246 247/247/247 -f 245/245/245 247/247/247 248/248/248 -v 16451.5 20593.5 -1365.3 -vt 0.949709 0.917972 -v 16451.5 18373.5 -1365.3 -vt 0.967997 0.917972 -v 16451.5 18373.5 9157.95 -vt 0.967997 0.835532 -v 16451.5 20593.5 9157.95 -vt 0.949709 0.835532 -o mesh052 -s off -f 249/249/249 250/250/250 251/251/251 -f 249/249/249 251/251/251 252/252/252 -g charts -o chart0000 -s off -f 249/249/249 250/250/250 251/251/251 -f 249/249/249 251/251/251 252/252/252 -v 17291.5 18373.5 -1365.3 -vt 0.955528 0.213108 -v 17291.5 20593.5 -1365.3 -vt 0.973815 0.213108 -v 17291.5 20593.5 9157.95 -vt 0.973815 0.130668 -v 17291.5 18373.5 9157.95 -vt 0.955528 0.130668 -o mesh053 -s off -f 253/253/253 254/254/254 255/255/255 -f 253/253/253 255/255/255 256/256/256 -g charts -o chart0000 -s off -f 253/253/253 254/254/254 255/255/255 -f 253/253/253 255/255/255 256/256/256 -v 15236.5 25026 5819.7 -vt 0.549044 0.337593 -v 11906.5 25026 5819.7 -vt 0.575644 0.337593 -v 11906.5 25048.5 5819.7 -vt 0.575644 0.338417 -v 15236.5 25048.5 5819.7 -vt 0.549044 0.338417 -o mesh054 -s off -f 257/257/257 258/258/258 259/259/259 -f 257/257/257 259/259/259 260/260/260 -g charts -o chart0000 -s off -f 257/257/257 258/258/258 259/259/259 -f 257/257/257 259/259/259 260/260/260 -v 11906.5 25026 5819.7 -vt 0.17581 0.887469 -v 11906.5 25026 3899.7 -vt 0.17581 0.903133 -v 11906.5 25048.5 3899.7 -vt 0.176642 0.903133 -v 11906.5 25048.5 5819.7 -vt 0.176642 0.887469 -o mesh055 -s off -f 261/261/261 262/262/262 263/263/263 -f 261/261/261 263/263/263 264/264/264 -g charts -o chart0000 -s off -f 261/261/261 262/262/262 263/263/263 -f 261/261/261 263/263/263 264/264/264 -v 15236.5 25026 3899.7 -vt 0.0145469 0.604699 -v 15236.5 25026 5819.7 -vt 0.0145469 0.589035 -v 15236.5 25048.5 5819.7 -vt 0.0137157 0.589035 -v 15236.5 25048.5 3899.7 -vt 0.0137157 0.604699 -o mesh056 -s off -f 265/265/265 266/266/266 267/267/267 -f 265/265/265 267/267/267 268/268/268 -g charts -o chart0000 -s off -f 265/265/265 266/266/266 267/267/267 -f 265/265/265 267/267/267 268/268/268 -v 11906.5 25026 3899.7 -vt 0.037822 0.487634 -v 15236.5 25026 3899.7 -vt 0.037822 0.461253 -v 15236.5 25048.5 3899.7 -vt 0.0369909 0.461253 -v 11906.5 25048.5 3899.7 -vt 0.0369909 0.487634 -o mesh057 -s off -f 269/269/269 270/270/270 271/271/271 -f 269/269/269 271/271/271 272/272/272 -g charts -o chart0000 -s off -f 269/269/269 270/270/270 271/271/271 -f 269/269/269 271/271/271 272/272/272 -v 11741.5 25026 3734.7 -vt 0.880715 0.529678 -v 11741.5 25026 5984.7 -vt 0.880715 0.511542 -v 11741.5 25048.5 5984.7 -vt 0.879884 0.511542 -v 11741.5 25048.5 3734.7 -vt 0.879884 0.529678 -o mesh058 -s off -f 273/273/273 274/274/274 275/275/275 -f 273/273/273 275/275/275 276/276/276 -g charts -o chart0000 -s off -f 273/273/273 274/274/274 275/275/275 -f 273/273/273 275/275/275 276/276/276 -v 11741.5 25026 5984.7 -vt 0.412718 0.884996 -v 15401.5 25026 5984.7 -vt 0.383624 0.884996 -v 15401.5 25048.5 5984.7 -vt 0.383624 0.884171 -v 11741.5 25048.5 5984.7 -vt 0.412718 0.884171 -o mesh059 -s off -f 277/277/277 278/278/278 279/279/279 -f 277/277/277 279/279/279 280/280/280 -g charts -o chart0000 -s off -f 277/277/277 278/278/278 279/279/279 -f 277/277/277 279/279/279 280/280/280 -v 15401.5 25026 3734.7 -vt 0.879884 0.829761 -v 11741.5 25026 3734.7 -vt 0.879884 0.858615 -v 11741.5 25048.5 3734.7 -vt 0.880715 0.858615 -v 15401.5 25048.5 3734.7 -vt 0.880715 0.829761 -o mesh060 -s off -f 281/281/281 282/282/282 283/283/283 -f 281/281/281 283/283/283 284/284/284 -g charts -o chart0000 -s off -f 281/281/281 282/282/282 283/283/283 -f 281/281/281 283/283/283 284/284/284 -v 15401.5 25026 3734.7 -vt 0.369493 0.593982 -v 15236.5 25026 3899.7 -vt 0.36783 0.592681 -v 11741.5 25026 3734.7 -vt 0.369493 0.565128 -v 11906.5 25026 3899.7 -vt 0.36783 0.566429 -o mesh061 -s off -f 285/285/285 286/286/286 287/287/287 -f 288/288/288 287/287/287 286/286/286 -g charts -o chart0000 -s off -f 285/285/285 286/286/286 287/287/287 -f 288/288/288 287/287/287 286/286/286 -v 15236.5 25026 3899.7 -vt 0.480881 0.460934 -v 15401.5 25026 3734.7 -vt 0.482544 0.459604 -v 15401.5 25026 5984.7 -vt 0.482544 0.477741 -v 15236.5 25026 5819.7 -vt 0.480881 0.476411 -o mesh062 -s off -f 289/289/289 290/290/290 291/291/291 -f 289/289/289 291/291/291 292/292/292 -g charts -o chart0000 -s off -f 289/289/289 290/290/290 291/291/291 -f 289/289/289 291/291/291 292/292/292 -v 15236.5 25026 5819.7 -vt 0.126286 0.748145 -v 15401.5 25026 5984.7 -vt 0.127598 0.746496 -v 11906.5 25026 5819.7 -vt 0.0998153 0.748145 -v 11741.5 25026 5984.7 -vt 0.0985037 0.746496 -o mesh063 -s off -f 293/293/293 294/294/294 295/295/295 -f 296/296/296 295/295/295 294/294/294 -g charts -o chart0000 -s off -f 293/293/293 294/294/294 295/295/295 -f 296/296/296 295/295/295 294/294/294 -v 11741.5 25026 3734.7 -vt 0.201579 0.847898 -v 11906.5 25026 3899.7 -vt 0.203242 0.849228 -v 11741.5 25026 5984.7 -vt 0.201579 0.866035 -v 11906.5 25026 5819.7 -vt 0.203242 0.864705 -o mesh064 -s off -f 297/297/297 298/298/298 299/299/299 -f 299/299/299 298/298/298 300/300/300 -g charts -o chart0000 -s off -f 297/297/297 298/298/298 299/299/299 -f 299/299/299 298/298/298 300/300/300 -v 11741.5 25048.5 3734.7 -vt 0.810058 0.728359 -v 11906.5 25048.5 3899.7 -vt 0.811721 0.72966 -v 15401.5 25048.5 3734.7 -vt 0.810058 0.757213 -v 15236.5 25048.5 3899.7 -vt 0.811721 0.755913 -o mesh065 -s off -f 301/301/301 302/302/302 303/303/303 -f 304/304/304 303/303/303 302/302/302 -g charts -o chart0000 -s off -f 301/301/301 302/302/302 303/303/303 -f 304/304/304 303/303/303 302/302/302 -v 11906.5 25048.5 3899.7 -vt 0.171654 0.899516 -v 11741.5 25048.5 3734.7 -vt 0.173317 0.898186 -v 11741.5 25048.5 5984.7 -vt 0.173317 0.916323 -v 11906.5 25048.5 5819.7 -vt 0.171654 0.914993 -o mesh066 -s off -f 305/305/305 306/306/306 307/307/307 -f 305/305/305 307/307/307 308/308/308 -g charts -o chart0000 -s off -f 305/305/305 306/306/306 307/307/307 -f 305/305/305 307/307/307 308/308/308 -v 11906.5 25048.5 5819.7 -vt 0.65212 0.600229 -v 11741.5 25048.5 5984.7 -vt 0.653782 0.598928 -v 15236.5 25048.5 5819.7 -vt 0.65212 0.626481 -v 15401.5 25048.5 5984.7 -vt 0.653782 0.627782 -o mesh067 -s off -f 309/309/309 310/310/310 311/311/311 -f 312/312/312 311/311/311 310/310/310 -g charts -o chart0000 -s off -f 309/309/309 310/310/310 311/311/311 -f 312/312/312 311/311/311 310/310/310 -v 15401.5 25048.5 3734.7 -vt 0.741895 0.976505 -v 15236.5 25048.5 3899.7 -vt 0.743236 0.978153 -v 15401.5 25048.5 5984.7 -vt 0.760183 0.976505 -v 15236.5 25048.5 5819.7 -vt 0.758842 0.978153 -o mesh068 -s off -f 313/313/313 314/314/314 315/315/315 -f 315/315/315 314/314/314 316/316/316 -g charts -o chart0000 -s off -f 313/313/313 314/314/314 315/315/315 -f 315/315/315 314/314/314 316/316/316 -v 15401.5 25026 5984.7 -vt 0.185786 0.789365 -v 15401.5 25026 3734.7 -vt 0.204073 0.789365 -v 15401.5 25048.5 3734.7 -vt 0.204073 0.79019 -v 15401.5 25048.5 5984.7 -vt 0.185786 0.79019 -o mesh069 -s off -f 317/317/317 318/318/318 319/319/319 -f 317/317/317 319/319/319 320/320/320 -g charts -o chart0000 -s off -f 317/317/317 318/318/318 319/319/319 -f 317/317/317 319/319/319 320/320/320 -v 16451.5 22558.5 5804.7 -vt 0.539069 0.998763 -v 16451.5 24763.5 5804.7 -vt 0.521613 0.998763 -v 16474 24763.5 5804.7 -vt 0.521613 0.997939 -v 16474 22558.5 5804.7 -vt 0.539069 0.997939 -o mesh070 -s off -f 321/321/321 322/322/322 323/323/323 -f 321/321/321 323/323/323 324/324/324 -g charts -o chart0000 -s off -f 321/321/321 322/322/322 323/323/323 -f 321/321/321 323/323/323 324/324/324 -v 16451.5 22393.5 3719.7 -vt 0.322111 0.995466 -v 16451.5 24928.5 3719.7 -vt 0.30133 0.995466 -v 16474 24928.5 3719.7 -vt 0.30133 0.994641 -v 16474 22393.5 3719.7 -vt 0.322111 0.994641 -o mesh071 -s off -f 325/325/325 326/326/326 327/327/327 -f 325/325/325 327/327/327 328/328/328 -g charts -o chart0000 -s off -f 325/325/325 326/326/326 327/327/327 -f 325/325/325 327/327/327 328/328/328 -v 16451.5 24763.5 5804.7 -vt 0.997922 0.339242 -v 16451.5 24763.5 3884.7 -vt 0.997922 0.354905 -v 16474 24763.5 3884.7 -vt 0.998753 0.354905 -v 16474 24763.5 5804.7 -vt 0.998753 0.339242 -o mesh072 -s off -f 329/329/329 330/330/330 331/331/331 -f 329/329/329 331/331/331 332/332/332 -g charts -o chart0000 -s off -f 329/329/329 330/330/330 331/331/331 -f 329/329/329 331/331/331 332/332/332 -v 16451.5 22393.5 5969.7 -vt 0.97714 0.670651 -v 16451.5 22558.5 5804.7 -vt 0.978482 0.66931 -v 16451.5 22393.5 3719.7 -vt 0.995428 0.670651 -v 16451.5 24928.5 5969.7 -vt 0.97714 0.650041 -v 16451.5 24763.5 5804.7 -vt 0.978482 0.651383 -v 16451.5 24763.5 3884.7 -vt 0.994087 0.651383 -v 16451.5 22558.5 3884.7 -vt 0.994087 0.66931 -v 16451.5 24928.5 3719.7 -vt 0.995428 0.650041 -o mesh073 -s off -f 333/333/333 334/334/334 335/335/335 -f 334/334/334 333/333/333 336/336/336 -f 334/334/334 336/336/336 337/337/337 -f 337/337/337 336/336/336 338/338/338 -f 335/335/335 339/339/339 340/340/340 -f 339/339/339 335/335/335 334/334/334 -f 340/340/340 339/339/339 338/338/338 -f 340/340/340 338/338/338 336/336/336 -g charts -o chart0000 -s off -f 333/333/333 334/334/334 335/335/335 -f 334/334/334 333/333/333 336/336/336 -f 334/334/334 336/336/336 337/337/337 -f 337/337/337 336/336/336 338/338/338 -f 335/335/335 339/339/339 340/340/340 -f 339/339/339 335/335/335 334/334/334 -f 340/340/340 339/339/339 338/338/338 -f 340/340/340 338/338/338 336/336/336 -v 16474 22393.5 3719.7 -vt 0.590607 0.990519 -v 16474 22558.5 3884.7 -vt 0.589266 0.989178 -v 16474 22393.5 5969.7 -vt 0.572319 0.990519 -v 16474 24928.5 3719.7 -vt 0.590607 0.969909 -v 16474 24763.5 3884.7 -vt 0.589266 0.971251 -v 16474 24763.5 5804.7 -vt 0.57366 0.971251 -v 16474 22558.5 5804.7 -vt 0.57366 0.989178 -v 16474 24928.5 5969.7 -vt 0.572319 0.969909 -o mesh074 -s off -f 341/341/341 342/342/342 343/343/343 -f 342/342/342 341/341/341 344/344/344 -f 342/342/342 344/344/344 345/345/345 -f 345/345/345 344/344/344 346/346/346 -f 343/343/343 347/347/347 348/348/348 -f 347/347/347 343/343/343 342/342/342 -f 348/348/348 347/347/347 346/346/346 -f 348/348/348 346/346/346 344/344/344 -g charts -o chart0000 -s off -f 341/341/341 342/342/342 343/343/343 -f 342/342/342 341/341/341 344/344/344 -f 342/342/342 344/344/344 345/345/345 -f 345/345/345 344/344/344 346/346/346 -f 343/343/343 347/347/347 348/348/348 -f 347/347/347 343/343/343 342/342/342 -f 348/348/348 347/347/347 346/346/346 -f 348/348/348 346/346/346 344/344/344 -v 16451.5 22558.5 3884.7 -vt 0.886534 0.634377 -v 16451.5 22558.5 5804.7 -vt 0.87074 0.634377 -v 16474 22558.5 5804.7 -vt 0.87074 0.633553 -v 16474 22558.5 3884.7 -vt 0.886534 0.633553 -o mesh075 -s off -f 349/349/349 350/350/350 351/351/351 -f 349/349/349 351/351/351 352/352/352 -g charts -o chart0000 -s off -f 349/349/349 350/350/350 351/351/351 -f 349/349/349 351/351/351 352/352/352 -v 16451.5 22393.5 5969.7 -vt 0.810889 0.659934 -v 16451.5 22393.5 3719.7 -vt 0.810889 0.678071 -v 16474 22393.5 3719.7 -vt 0.811721 0.678071 -v 16474 22393.5 5969.7 -vt 0.811721 0.659934 -o mesh076 -s off -f 353/353/353 354/354/354 355/355/355 -f 353/353/353 355/355/355 356/356/356 -g charts -o chart0000 -s off -f 353/353/353 354/354/354 355/355/355 -f 353/353/353 355/355/355 356/356/356 -v 16451.5 24763.5 3884.7 -vt 0.394431 0.434872 -v 16451.5 22558.5 3884.7 -vt 0.411887 0.434872 -v 16474 22558.5 3884.7 -vt 0.411887 0.435697 -v 16474 24763.5 3884.7 -vt 0.394431 0.435697 -o mesh077 -s off -f 357/357/357 358/358/358 359/359/359 -f 357/357/357 359/359/359 360/360/360 -g charts -o chart0000 -s off -f 357/357/357 358/358/358 359/359/359 -f 357/357/357 359/359/359 360/360/360 -v 16451.5 24928.5 5969.7 -vt 0.131754 0.538747 -v 16451.5 22393.5 5969.7 -vt 0.152535 0.538747 -v 16474 22393.5 5969.7 -vt 0.152535 0.539571 -v 16474 24928.5 5969.7 -vt 0.131754 0.539571 -o mesh078 -s off -f 361/361/361 362/362/362 363/363/363 -f 361/361/361 363/363/363 364/364/364 -g charts -o chart0000 -s off -f 361/361/361 362/362/362 363/363/363 -f 361/361/361 363/363/363 364/364/364 -v 16451.5 24928.5 3719.7 -vt 0.0943474 0.966612 -v 16451.5 24928.5 5969.7 -vt 0.0943474 0.948475 -v 16474 24928.5 5969.7 -vt 0.0935162 0.948475 -v 16474 24928.5 3719.7 -vt 0.0935162 0.966612 -o mesh079 -s off -f 365/365/365 366/366/366 367/367/367 -f 365/365/365 367/367/367 368/368/368 -g charts -o chart0000 -s off -f 365/365/365 366/366/366 367/367/367 -f 365/365/365 367/367/367 368/368/368 -v 10691.5 24928.5 3719.7 -vt 0.875727 0.130668 -v 10691.5 22393.5 3719.7 -vt 0.875727 0.151278 -v 10669 22393.5 3719.7 -vt 0.876558 0.151278 -v 10669 24928.5 3719.7 -vt 0.876558 0.130668 -o mesh080 -s off -f 369/369/369 370/370/370 371/371/371 -f 369/369/369 371/371/371 372/372/372 -g charts -o chart0000 -s off -f 369/369/369 370/370/370 371/371/371 -f 369/369/369 371/371/371 372/372/372 -v 10691.5 22558.5 5804.7 -vt 0.0045719 0.58986 -v 10691.5 22558.5 3884.7 -vt 0.0045719 0.605523 -v 10669 22558.5 3884.7 -vt 0.00540308 0.605523 -v 10669 22558.5 5804.7 -vt 0.00540308 0.58986 -o mesh081 -s off -f 373/373/373 374/374/374 375/375/375 -f 373/373/373 375/375/375 376/376/376 -g charts -o chart0000 -s off -f 373/373/373 374/374/374 375/375/375 -f 373/373/373 375/375/375 376/376/376 -v 10691.5 24928.5 5969.7 -vt 0.284705 0.931987 -v 10691.5 24928.5 3719.7 -vt 0.302992 0.931987 -v 10669 24928.5 3719.7 -vt 0.302992 0.932811 -v 10669 24928.5 5969.7 -vt 0.284705 0.932811 -o mesh082 -s off -f 377/377/377 378/378/378 379/379/379 -f 377/377/377 379/379/379 380/380/380 -g charts -o chart0000 -s off -f 377/377/377 378/378/378 379/379/379 -f 377/377/377 379/379/379 380/380/380 -v 10691.5 24763.5 5804.7 -vt 0.28803 0.444765 -v 10691.5 22558.5 5804.7 -vt 0.305486 0.444765 -v 10669 22558.5 5804.7 -vt 0.305486 0.445589 -v 10669 24763.5 5804.7 -vt 0.28803 0.445589 -o mesh083 -s off -f 381/381/381 382/382/382 383/383/383 -f 381/381/381 383/383/383 384/384/384 -g charts -o chart0000 -s off -f 381/381/381 382/382/382 383/383/383 -f 381/381/381 383/383/383 384/384/384 -v 10691.5 22393.5 5969.7 -vt 0.15586 0.330997 -v 10691.5 24928.5 5969.7 -vt 0.15586 0.310387 -v 10669 24928.5 5969.7 -vt 0.155029 0.310387 -v 10669 22393.5 5969.7 -vt 0.155029 0.330997 -o mesh084 -s off -f 385/385/385 386/386/386 387/387/387 -f 385/385/385 387/387/387 388/388/388 -g charts -o chart0000 -s off -f 385/385/385 386/386/386 387/387/387 -f 385/385/385 387/387/387 388/388/388 -v 10691.5 22393.5 3719.7 -vt 0.660432 0.969909 -v 10691.5 22558.5 3884.7 -vt 0.65908 0.968579 -v 10691.5 22393.5 5969.7 -vt 0.660432 0.951772 -v 10691.5 24928.5 3719.7 -vt 0.639651 0.969909 -v 10691.5 24763.5 3884.7 -vt 0.641003 0.968579 -v 10691.5 24763.5 5804.7 -vt 0.641003 0.953102 -v 10691.5 22558.5 5804.7 -vt 0.65908 0.953102 -v 10691.5 24928.5 5969.7 -vt 0.639651 0.951772 -o mesh085 -s off -f 389/389/389 390/390/390 391/391/391 -f 390/390/390 389/389/389 392/392/392 -f 390/390/390 392/392/392 393/393/393 -f 393/393/393 392/392/392 394/394/394 -f 391/391/391 395/395/395 396/396/396 -f 395/395/395 391/391/391 390/390/390 -f 396/396/396 395/395/395 394/394/394 -f 396/396/396 394/394/394 392/392/392 -g charts -o chart0000 -s off -f 389/389/389 390/390/390 391/391/391 -f 390/390/390 389/389/389 392/392/392 -f 390/390/390 392/392/392 393/393/393 -f 393/393/393 392/392/392 394/394/394 -f 391/391/391 395/395/395 396/396/396 -f 395/395/395 391/391/391 390/390/390 -f 396/396/396 395/395/395 394/394/394 -f 396/396/396 394/394/394 392/392/392 -v 10669 22393.5 5969.7 -vt 0.928928 0.669002 -v 10669 22558.5 5804.7 -vt 0.930269 0.667661 -v 10669 22393.5 3719.7 -vt 0.947215 0.669002 -v 10669 24928.5 5969.7 -vt 0.928928 0.648392 -v 10669 24763.5 5804.7 -vt 0.930269 0.649734 -v 10669 24763.5 3884.7 -vt 0.945874 0.649734 -v 10669 22558.5 3884.7 -vt 0.945874 0.667661 -v 10669 24928.5 3719.7 -vt 0.947215 0.648392 -o mesh086 -s off -f 397/397/397 398/398/398 399/399/399 -f 398/398/398 397/397/397 400/400/400 -f 398/398/398 400/400/400 401/401/401 -f 401/401/401 400/400/400 402/402/402 -f 399/399/399 403/403/403 404/404/404 -f 403/403/403 399/399/399 398/398/398 -f 404/404/404 403/403/403 402/402/402 -f 404/404/404 402/402/402 400/400/400 -g charts -o chart0000 -s off -f 397/397/397 398/398/398 399/399/399 -f 398/398/398 397/397/397 400/400/400 -f 398/398/398 400/400/400 401/401/401 -f 401/401/401 400/400/400 402/402/402 -f 399/399/399 403/403/403 404/404/404 -f 403/403/403 399/399/399 398/398/398 -f 404/404/404 403/403/403 402/402/402 -f 404/404/404 402/402/402 400/400/400 -v 10691.5 22393.5 3719.7 -vt 0.920615 0.773701 -v 10691.5 22393.5 5969.7 -vt 0.902328 0.773701 -v 10669 22393.5 5969.7 -vt 0.902328 0.772877 -v 10669 22393.5 3719.7 -vt 0.920615 0.772877 -o mesh087 -s off -f 405/405/405 406/406/406 407/407/407 -f 405/405/405 407/407/407 408/408/408 -g charts -o chart0000 -s off -f 405/405/405 406/406/406 407/407/407 -f 405/405/405 407/407/407 408/408/408 -v 10691.5 24763.5 3884.7 -vt 0.259767 0.886645 -v 10691.5 24763.5 5804.7 -vt 0.243973 0.886645 -v 10669 24763.5 5804.7 -vt 0.243973 0.88582 -v 10669 24763.5 3884.7 -vt 0.259767 0.88582 -o mesh088 -s off -f 409/409/409 410/410/410 411/411/411 -f 409/409/409 411/411/411 412/412/412 -g charts -o chart0000 -s off -f 409/409/409 410/410/410 411/411/411 -f 409/409/409 411/411/411 412/412/412 -v 10691.5 22558.5 3884.7 -vt 0.110141 0.98887 -v 10691.5 24763.5 3884.7 -vt 0.110141 0.971558 -v 10669 24763.5 3884.7 -vt 0.10931 0.971558 -v 10669 22558.5 3884.7 -vt 0.10931 0.98887 -o mesh089 -s off -f 413/413/413 414/414/414 415/415/415 -f 413/413/413 415/415/415 416/416/416 -g charts -o chart0000 -s off -f 413/413/413 414/414/414 415/415/415 -f 413/413/413 415/415/415 416/416/416 -v 16474 22296 -285.3 -vt 0.108479 0.401896 -v 16474 22461 -285.3 -vt 0.106816 0.401821 -v 16474 22461 2594.7 -vt 0.108479 0.378813 -v 16474 22296 -285.3 -vt 0.0187032 0.236191 -v 16474 22461 2594.7 -vt 0.0200094 0.213108 -v 16474 24861 2594.7 -vt 0.0390095 0.213108 -v 16474 24861 -285.3 -vt 0.0390095 0.236191 -v 16474 25026 -285.3 -vt 0.0403158 0.236191 -v 16474 22296 -285.3 -vt 0.26808 0.706925 -v 16474 25026 -285.3 -vt 0.246467 0.706925 -v 16474 25026 2759.7 -vt 0.246467 0.683017 -v 16474 22296 2759.7 -vt 0.26808 0.683017 -o mesh090 -s off -f 417/417/417 418/418/418 419/419/419 -f 420/420/420 421/421/421 422/422/422 -f 420/420/420 422/422/422 423/423/423 -f 420/420/420 423/423/423 424/424/424 -f 425/425/425 426/426/426 427/427/427 -f 425/425/425 427/427/427 428/428/428 -g charts -o chart0000 -s off -f 417/417/417 418/418/418 419/419/419 -o chart0001 -s off -f 420/420/420 421/421/421 422/422/422 -f 420/420/420 422/422/422 423/423/423 -f 420/420/420 423/423/423 424/424/424 -o chart0002 -s off -f 425/425/425 426/426/426 427/427/427 -f 425/425/425 427/427/427 428/428/428 -v 16451.5 22461 -285.3 -vt 0.869077 0.279885 -v 16451.5 22461 2594.7 -vt 0.869077 0.256801 -v 16474 22461 2594.7 -vt 0.868246 0.256801 -v 16474 22461 -285.3 -vt 0.868246 0.279885 -o mesh091 -s off -f 429/429/429 430/430/430 431/431/431 -f 429/429/429 431/431/431 432/432/432 -g charts -o chart0000 -s off -f 429/429/429 430/430/430 431/431/431 -f 429/429/429 431/431/431 432/432/432 -v 16451.5 22296 2759.7 -vt 0.998753 0.590684 -v 16451.5 22296 -285.3 -vt 0.998753 0.614592 -v 16474 22296 -285.3 -vt 0.999584 0.614592 -v 16474 22296 2759.7 -vt 0.999584 0.590684 -o mesh092 -s off -f 433/433/433 434/434/434 435/435/435 -f 433/433/433 435/435/435 436/436/436 -g charts -o chart0000 -s off -f 433/433/433 434/434/434 435/435/435 -f 433/433/433 435/435/435 436/436/436 -v 16451.5 25026 2759.7 -vt 0.243142 0.297197 -v 16451.5 22296 2759.7 -vt 0.264755 0.297197 -v 16474 22296 2759.7 -vt 0.264755 0.298021 -v 16474 25026 2759.7 -vt 0.243142 0.298021 -o mesh093 -s off -f 437/437/437 438/438/438 439/439/439 -f 437/437/437 439/439/439 440/440/440 -g charts -o chart0000 -s off -f 437/437/437 438/438/438 439/439/439 -f 437/437/437 439/439/439 440/440/440 -v 16451.5 25026 -285.3 -vt 0.0843723 0.412613 -v 16451.5 24861 -285.3 -vt 0.0842962 0.410965 -v 16451.5 24861 2594.7 -vt 0.0610973 0.412613 -v 16451.5 25026 -285.3 -vt 0.636326 0.662407 -v 16451.5 24861 2594.7 -vt 0.637632 0.639324 -v 16451.5 22461 2594.7 -vt 0.656632 0.639324 -v 16451.5 22461 -285.3 -vt 0.656632 0.662407 -v 16451.5 22296 -285.3 -vt 0.657938 0.662407 -v 16451.5 25026 -285.3 -vt 0.980465 0.21723 -v 16451.5 22296 -285.3 -vt 0.980465 0.238664 -v 16451.5 22296 2759.7 -vt 0.956359 0.238664 -v 16451.5 25026 2759.7 -vt 0.956359 0.21723 -o mesh094 -s off -f 441/441/441 442/442/442 443/443/443 -f 444/444/444 445/445/445 446/446/446 -f 444/444/444 446/446/446 447/447/447 -f 444/444/444 447/447/447 448/448/448 -f 449/449/449 450/450/450 451/451/451 -f 449/449/449 451/451/451 452/452/452 -g charts -o chart0000 -s off -f 441/441/441 442/442/442 443/443/443 -o chart0001 -s off -f 444/444/444 445/445/445 446/446/446 -f 444/444/444 446/446/446 447/447/447 -f 444/444/444 447/447/447 448/448/448 -o chart0002 -s off -f 449/449/449 450/450/450 451/451/451 -f 449/449/449 451/451/451 452/452/452 -v 16451.5 22461 2594.7 -vt 0.971322 0.38953 -v 16451.5 24861 2594.7 -vt 0.971322 0.370569 -v 16474 24861 2594.7 -vt 0.97049 0.370569 -v 16474 22461 2594.7 -vt 0.97049 0.38953 -o mesh095 -s off -f 453/453/453 454/454/454 455/455/455 -f 453/453/453 455/455/455 456/456/456 -g charts -o chart0000 -s off -f 453/453/453 454/454/454 455/455/455 -f 453/453/453 455/455/455 456/456/456 -v 16451.5 22296 -285.3 -vt 0.542394 0.415911 -v 16451.5 22461 -285.3 -vt 0.540731 0.415911 -v 16474 22461 -285.3 -vt 0.540731 0.415087 -v 16474 22296 -285.3 -vt 0.542394 0.415087 -o mesh096 -s off -f 457/457/457 458/458/458 459/459/459 -f 457/457/457 459/459/459 460/460/460 -g charts -o chart0000 -s off -f 457/457/457 458/458/458 459/459/459 -f 457/457/457 459/459/459 460/460/460 -v 16451.5 25026 -285.3 -vt 0.929759 0.769579 -v 16451.5 25026 2759.7 -vt 0.905653 0.769579 -v 16474 25026 2759.7 -vt 0.905653 0.768755 -v 16474 25026 -285.3 -vt 0.929759 0.768755 -o mesh097 -s off -f 461/461/461 462/462/462 463/463/463 -f 461/461/461 463/463/463 464/464/464 -g charts -o chart0000 -s off -f 461/461/461 462/462/462 463/463/463 -f 461/461/461 463/463/463 464/464/464 -v 16451.5 24861 -285.3 -vt 0.795096 0.90066 -v 16451.5 22461 -285.3 -vt 0.814214 0.90066 -v 16474 22461 -285.3 -vt 0.814214 0.901484 -v 16474 24861 -285.3 -vt 0.795096 0.901484 -o mesh098 -s off -f 465/465/465 466/466/466 467/467/467 -f 465/465/465 467/467/467 468/468/468 -g charts -o chart0000 -s off -f 465/465/465 466/466/466 467/467/467 -f 465/465/465 467/467/467 468/468/468 -v 16451.5 24861 2594.7 -vt 0.107648 0.703627 -v 16451.5 24861 -285.3 -vt 0.130923 0.703627 -v 16474 24861 -285.3 -vt 0.130923 0.704452 -v 16474 24861 2594.7 -vt 0.107648 0.704452 -o mesh099 -s off -f 469/469/469 470/470/470 471/471/471 -f 469/469/469 471/471/471 472/472/472 -g charts -o chart0000 -s off -f 469/469/469 470/470/470 471/471/471 -f 469/469/469 471/471/471 472/472/472 -v 16474 25026 -285.3 -vt 0.199917 0.87263 -v 16474 24861 -285.3 -vt 0.201579 0.87263 -v 16451.5 24861 -285.3 -vt 0.201579 0.873454 -v 16451.5 25026 -285.3 -vt 0.199917 0.873454 -o mesh100 -s off -f 473/473/473 474/474/474 475/475/475 -f 473/473/473 475/475/475 476/476/476 -g charts -o chart0000 -s off -f 473/473/473 474/474/474 475/475/475 -f 473/473/473 475/475/475 476/476/476 -v 10691.5 25026 -285.3 -vt 0.0137157 0.97568 -v 10856.5 25026 -285.3 -vt 0.0153781 0.97568 -v 10856.5 25026 2594.7 -vt 0.0153781 0.952597 -v 10691.5 25026 -285.3 -vt 0.603076 0.870981 -v 10856.5 25026 2594.7 -vt 0.60438 0.847898 -v 16286.5 25026 2594.7 -vt 0.647312 0.847898 -v 16286.5 25026 -285.3 -vt 0.647312 0.870981 -v 16474 25026 -285.3 -vt 0.648795 0.870981 -v 10691.5 25026 -285.3 -vt 0.514962 0.875103 -v 16474 25026 -285.3 -vt 0.469244 0.875103 -v 16474 25026 2759.7 -vt 0.469244 0.851195 -v 10691.5 25026 2759.7 -vt 0.514962 0.851195 -o mesh101 -s off -f 477/477/477 478/478/478 479/479/479 -f 480/480/480 481/481/481 482/482/482 -f 480/480/480 482/482/482 483/483/483 -f 480/480/480 483/483/483 484/484/484 -f 485/485/485 486/486/486 487/487/487 -f 485/485/485 487/487/487 488/488/488 -g charts -o chart0000 -s off -f 477/477/477 478/478/478 479/479/479 -o chart0001 -s off -f 480/480/480 481/481/481 482/482/482 -f 480/480/480 482/482/482 483/483/483 -f 480/480/480 483/483/483 484/484/484 -o chart0002 -s off -f 485/485/485 486/486/486 487/487/487 -f 485/485/485 487/487/487 488/488/488 -v 16474 25048.5 -285.3 -vt 0.948878 0.123248 -v 16286.5 25048.5 -285.3 -vt 0.948779 0.121599 -v 16286.5 25048.5 2594.7 -vt 0.925603 0.123248 -v 16474 25048.5 -285.3 -vt 0.0569409 0.976505 -v 16286.5 25048.5 2594.7 -vt 0.0554584 0.999588 -v 10856.5 25048.5 2594.7 -vt 0.0125265 0.999588 -v 10856.5 25048.5 -285.3 -vt 0.0125265 0.976505 -v 10691.5 25048.5 -285.3 -vt 0.0112219 0.976505 -v 16474 25048.5 -285.3 -vt 0.964672 0.536274 -v 10691.5 25048.5 -285.3 -vt 0.964672 0.581616 -v 10691.5 25048.5 2759.7 -vt 0.988778 0.581616 -v 16474 25048.5 2759.7 -vt 0.988778 0.536274 -o mesh102 -s off -f 489/489/489 490/490/490 491/491/491 -f 492/492/492 493/493/493 494/494/494 -f 492/492/492 494/494/494 495/495/495 -f 492/492/492 495/495/495 496/496/496 -f 497/497/497 498/498/498 499/499/499 -f 497/497/497 499/499/499 500/500/500 -g charts -o chart0000 -s off -f 489/489/489 490/490/490 491/491/491 -o chart0001 -s off -f 492/492/492 493/493/493 494/494/494 -f 492/492/492 494/494/494 495/495/495 -f 492/492/492 495/495/495 496/496/496 -o chart0002 -s off -f 497/497/497 498/498/498 499/499/499 -f 497/497/497 499/499/499 500/500/500 -v 10691.5 25026 2759.7 -vt 0.998753 0.227947 -v 16474 25026 2759.7 -vt 0.998753 0.273289 -v 16474 25048.5 2759.7 -vt 0.997922 0.273289 -v 10691.5 25048.5 2759.7 -vt 0.997922 0.227947 -o mesh103 -s off -f 501/501/501 502/502/502 503/503/503 -f 501/501/501 503/503/503 504/504/504 -g charts -o chart0000 -s off -f 501/501/501 502/502/502 503/503/503 -f 501/501/501 503/503/503 504/504/504 -v 16474 25026 2759.7 -vt 0.230673 0.759687 -v 16474 25026 -285.3 -vt 0.230673 0.783594 -v 16474 25048.5 -285.3 -vt 0.231504 0.783594 -v 16474 25048.5 2759.7 -vt 0.231504 0.759687 -o mesh104 -s off -f 505/505/505 506/506/506 507/507/507 -f 505/505/505 507/507/507 508/508/508 -g charts -o chart0000 -s off -f 505/505/505 506/506/506 507/507/507 -f 505/505/505 507/507/507 508/508/508 -v 16474 25026 -285.3 -vt 0.191604 0.797609 -v 16286.5 25026 -285.3 -vt 0.191604 0.799258 -v 16286.5 25048.5 -285.3 -vt 0.192435 0.799258 -v 16474 25048.5 -285.3 -vt 0.192435 0.797609 -o mesh105 -s off -f 509/509/509 510/510/510 511/511/511 -f 509/509/509 511/511/511 512/512/512 -g charts -o chart0000 -s off -f 509/509/509 510/510/510 511/511/511 -f 509/509/509 511/511/511 512/512/512 -v 10691.5 25026 -285.3 -vt 0.00706559 0.575845 -v 10691.5 25026 2759.7 -vt 0.00706559 0.551937 -v 10691.5 25048.5 2759.7 -vt 0.00623441 0.551937 -v 10691.5 25048.5 -285.3 -vt 0.00623441 0.575845 -o mesh106 -s off -f 513/513/513 514/514/514 515/515/515 -f 513/513/513 515/515/515 516/516/516 -g charts -o chart0000 -s off -f 513/513/513 514/514/514 515/515/515 -f 513/513/513 515/515/515 516/516/516 -v 10856.5 25026 2594.7 -vt 0.879884 0.395301 -v 10856.5 25026 -285.3 -vt 0.903159 0.395301 -v 10856.5 25048.5 -285.3 -vt 0.903159 0.396125 -v 10856.5 25048.5 2594.7 -vt 0.879884 0.396125 -o mesh107 -s off -f 517/517/517 518/518/518 519/519/519 -f 517/517/517 519/519/519 520/520/520 -g charts -o chart0000 -s off -f 517/517/517 518/518/518 519/519/519 -f 517/517/517 519/519/519 520/520/520 -v 10856.5 25026 -285.3 -vt 0.994597 0.727535 -v 16286.5 25026 -285.3 -vt 0.994597 0.684666 -v 16286.5 25048.5 -285.3 -vt 0.993766 0.684666 -v 10856.5 25048.5 -285.3 -vt 0.993766 0.727535 -o mesh108 -s off -f 521/521/521 522/522/522 523/523/523 -f 521/521/521 523/523/523 524/524/524 -g charts -o chart0000 -s off -f 521/521/521 522/522/522 523/523/523 -f 521/521/521 523/523/523 524/524/524 -v 16286.5 25026 -285.3 -vt 0.639651 0.540396 -v 16286.5 25026 2594.7 -vt 0.616376 0.540396 -v 16286.5 25048.5 2594.7 -vt 0.616376 0.539571 -v 16286.5 25048.5 -285.3 -vt 0.639651 0.539571 -o mesh109 -s off -f 525/525/525 526/526/526 527/527/527 -f 525/525/525 527/527/527 528/528/528 -g charts -o chart0000 -s off -f 525/525/525 526/526/526 527/527/527 -f 525/525/525 527/527/527 528/528/528 -v 16286.5 25026 2594.7 -vt 0.997091 0.954246 -v 10856.5 25026 2594.7 -vt 0.997091 0.997114 -v 10856.5 25048.5 2594.7 -vt 0.997922 0.997114 -v 16286.5 25048.5 2594.7 -vt 0.997922 0.954246 -o mesh110 -s off -f 529/529/529 530/530/530 531/531/531 -f 529/529/529 531/531/531 532/532/532 -g charts -o chart0000 -s off -f 529/529/529 530/530/530 531/531/531 -f 529/529/529 531/531/531 532/532/532 -v 10691.5 25048.5 -285.3 -vt 0.876558 0.914674 -v 10856.5 25048.5 -285.3 -vt 0.874896 0.914674 -v 10856.5 25026 -285.3 -vt 0.874896 0.91385 -v 10691.5 25026 -285.3 -vt 0.876558 0.91385 -o mesh111 -s off -f 533/533/533 534/534/534 535/535/535 -f 533/533/533 535/535/535 536/536/536 -g charts -o chart0000 -s off -f 533/533/533 534/534/534 535/535/535 -f 533/533/533 535/535/535 536/536/536 -v 10691.5 22296 -285.3 -vt 0.28138 0.847073 -v 10691.5 22461 -285.3 -vt 0.28138 0.848722 -v 10691.5 22461 2594.7 -vt 0.258105 0.848722 -v 10691.5 22296 -285.3 -vt 0.601413 0.554411 -v 10691.5 22461 2594.7 -vt 0.578138 0.555706 -v 10691.5 23616 2594.7 -vt 0.578138 0.564774 -v 10691.5 23706 2594.7 -vt 0.578138 0.565481 -v 10691.5 24861 2594.7 -vt 0.578138 0.574549 -v 10691.5 24861 -285.3 -vt 0.601413 0.574549 -v 10691.5 25026 -285.3 -vt 0.601413 0.575845 -v 10691.5 22296 -285.3 -vt 0.48005 0.47939 -v 10691.5 25026 -285.3 -vt 0.458437 0.47939 -v 10691.5 25026 2759.7 -vt 0.458437 0.455482 -v 10691.5 23706 2759.7 -vt 0.468887 0.455482 -v 10691.5 23616 2759.7 -vt 0.4696 0.455482 -v 10691.5 22296 2759.7 -vt 0.48005 0.455482 -o mesh112 -s off -f 537/537/537 538/538/538 539/539/539 -f 540/540/540 541/541/541 542/542/542 -f 540/540/540 542/542/542 543/543/543 -f 540/540/540 543/543/543 544/544/544 -f 540/540/540 544/544/544 545/545/545 -f 540/540/540 545/545/545 546/546/546 -f 547/547/547 548/548/548 549/549/549 -f 547/547/547 549/549/549 550/550/550 -f 547/547/547 550/550/550 551/551/551 -f 547/547/547 551/551/551 552/552/552 -g charts -o chart0000 -s off -f 537/537/537 538/538/538 539/539/539 -o chart0001 -s off -f 540/540/540 541/541/541 542/542/542 -f 540/540/540 542/542/542 543/543/543 -f 540/540/540 543/543/543 544/544/544 -f 540/540/540 544/544/544 545/545/545 -f 540/540/540 545/545/545 546/546/546 -o chart0002 -s off -f 547/547/547 548/548/548 549/549/549 -f 547/547/547 549/549/549 550/550/550 -f 547/547/547 550/550/550 551/551/551 -f 547/547/547 551/551/551 552/552/552 -v 10691.5 22461 -285.3 -vt 0.528263 0.92704 -v 10691.5 24861 -285.3 -vt 0.509144 0.92704 -v 10669 24861 -285.3 -vt 0.509144 0.926216 -v 10669 22461 -285.3 -vt 0.528263 0.926216 -o mesh113 -s off -f 553/553/553 554/554/554 555/555/555 -f 553/553/553 555/555/555 556/556/556 -g charts -o chart0000 -s off -f 553/553/553 554/554/554 555/555/555 -f 553/553/553 555/555/555 556/556/556 -v 10669 25026 -285.3 -vt 0.353699 0.41014 -v 10669 24861 -285.3 -vt 0.355362 0.41014 -v 10669 24861 2594.7 -vt 0.355362 0.387057 -v 10669 25026 -285.3 -vt 0.376974 0.884171 -v 10669 24861 2594.7 -vt 0.353699 0.885467 -v 10669 23706 2594.7 -vt 0.353699 0.894535 -v 10669 23616 2594.7 -vt 0.353699 0.895242 -v 10669 22461 2594.7 -vt 0.353699 0.90431 -v 10669 22461 -285.3 -vt 0.376974 0.90431 -v 10669 22296 -285.3 -vt 0.376974 0.905606 -v 10669 25026 -285.3 -vt 0.903159 0.00700742 -v 10669 22296 -285.3 -vt 0.903159 0.0284418 -v 10669 22296 2759.7 -vt 0.879052 0.0284418 -v 10669 23616 2759.7 -vt 0.879052 0.0180779 -v 10669 23706 2759.7 -vt 0.879052 0.0173713 -v 10669 25026 2759.7 -vt 0.879052 0.00700742 -o mesh114 -s off -f 557/557/557 558/558/558 559/559/559 -f 560/560/560 561/561/561 562/562/562 -f 560/560/560 562/562/562 563/563/563 -f 560/560/560 563/563/563 564/564/564 -f 560/560/560 564/564/564 565/565/565 -f 560/560/560 565/565/565 566/566/566 -f 567/567/567 568/568/568 569/569/569 -f 567/567/567 569/569/569 570/570/570 -f 567/567/567 570/570/570 571/571/571 -f 567/567/567 571/571/571 572/572/572 -g charts -o chart0000 -s off -f 557/557/557 558/558/558 559/559/559 -o chart0001 -s off -f 560/560/560 561/561/561 562/562/562 -f 560/560/560 562/562/562 563/563/563 -f 560/560/560 563/563/563 564/564/564 -f 560/560/560 564/564/564 565/565/565 -f 560/560/560 565/565/565 566/566/566 -o chart0002 -s off -f 567/567/567 568/568/568 569/569/569 -f 567/567/567 569/569/569 570/570/570 -f 567/567/567 570/570/570 571/571/571 -f 567/567/567 571/571/571 572/572/572 -v 10691.5 25026 2759.7 -vt 0.820033 0.385408 -v 10691.5 25026 -285.3 -vt 0.820033 0.409316 -v 10669 25026 -285.3 -vt 0.820864 0.409316 -v 10669 25026 2759.7 -vt 0.820864 0.385408 -o mesh115 -s off -f 573/573/573 574/574/574 575/575/575 -f 573/573/573 575/575/575 576/576/576 -g charts -o chart0000 -s off -f 573/573/573 574/574/574 575/575/575 -f 573/573/573 575/575/575 576/576/576 -v 10691.5 24861 2594.7 -vt 0.662095 0.943528 -v 10691.5 23706 2594.7 -vt 0.671238 0.943528 -v 10669 23706 2594.7 -vt 0.671238 0.944353 -v 10669 24861 2594.7 -vt 0.662095 0.944353 -o mesh116 -s off -f 577/577/577 578/578/578 579/579/579 -f 577/577/577 579/579/579 580/580/580 -g charts -o chart0000 -s off -f 577/577/577 578/578/578 579/579/579 -f 577/577/577 579/579/579 580/580/580 -v 10691.5 23706 2594.7 -vt 0.907315 0.129019 -v 10691.5 23616 2594.7 -vt 0.907315 0.129843 -v 10669 23616 2594.7 -vt 0.908146 0.129843 -v 10669 23706 2594.7 -vt 0.908146 0.129019 -o mesh117 -s off -f 581/581/581 582/582/582 583/583/583 -f 581/581/581 583/583/583 584/584/584 -g charts -o chart0000 -s off -f 581/581/581 582/582/582 583/583/583 -f 581/581/581 583/583/583 584/584/584 -v 10691.5 23706 2759.7 -vt 0.75852 0.751443 -v 10691.5 25026 2759.7 -vt 0.747714 0.751443 -v 10669 25026 2759.7 -vt 0.747714 0.750618 -v 10669 23706 2759.7 -vt 0.75852 0.750618 -o mesh118 -s off -f 585/585/585 586/586/586 587/587/587 -f 585/585/585 587/587/587 588/588/588 -g charts -o chart0000 -s off -f 585/585/585 586/586/586 587/587/587 -f 585/585/585 587/587/587 588/588/588 -v 10691.5 22461 2594.7 -vt 0.996259 0.0391591 -v 10691.5 22461 -285.3 -vt 0.996259 0.0622423 -v 10669 22461 -285.3 -vt 0.997091 0.0622423 -v 10669 22461 2594.7 -vt 0.997091 0.0391591 -o mesh119 -s off -f 589/589/589 590/590/590 591/591/591 -f 589/589/589 591/591/591 592/592/592 -g charts -o chart0000 -s off -f 589/589/589 590/590/590 591/591/591 -f 589/589/589 591/591/591 592/592/592 -v 10691.5 22296 -285.3 -vt 0.435993 0.489283 -v 10691.5 22296 2759.7 -vt 0.411887 0.489283 -v 10669 22296 2759.7 -vt 0.411887 0.488458 -v 10669 22296 -285.3 -vt 0.435993 0.488458 -o mesh120 -s off -f 593/593/593 594/594/594 595/595/595 -f 593/593/593 595/595/595 596/596/596 -g charts -o chart0000 -s off -f 593/593/593 594/594/594 595/595/595 -f 593/593/593 595/595/595 596/596/596 -v 10691.5 25026 -285.3 -vt 0.165835 0.319456 -v 10691.5 24861 -285.3 -vt 0.165835 0.321105 -v 10669 24861 -285.3 -vt 0.166667 0.321105 -v 10669 25026 -285.3 -vt 0.166667 0.319456 -o mesh121 -s off -f 597/597/597 598/598/598 599/599/599 -f 597/597/597 599/599/599 600/600/600 -g charts -o chart0000 -s off -f 597/597/597 598/598/598 599/599/599 -f 597/597/597 599/599/599 600/600/600 -v 10691.5 23616 2594.7 -vt 0.607232 0.45136 -v 10691.5 22461 2594.7 -vt 0.607232 0.460429 -v 10669 22461 2594.7 -vt 0.608063 0.460429 -v 10669 23616 2594.7 -vt 0.608063 0.45136 -o mesh122 -s off -f 601/601/601 602/602/602 603/603/603 -f 601/601/601 603/603/603 604/604/604 -g charts -o chart0000 -s off -f 601/601/601 602/602/602 603/603/603 -f 601/601/601 603/603/603 604/604/604 -v 10691.5 23616 2759.7 -vt 0.410224 0.845424 -v 10691.5 23706 2759.7 -vt 0.409393 0.845424 -v 10669 23706 2759.7 -vt 0.409393 0.8446 -v 10669 23616 2759.7 -vt 0.410224 0.8446 -o mesh123 -s off -f 605/605/605 606/606/606 607/607/607 -f 605/605/605 607/607/607 608/608/608 -g charts -o chart0000 -s off -f 605/605/605 606/606/606 607/607/607 -f 605/605/605 607/607/607 608/608/608 -v 10691.5 22296 2759.7 -vt 0.667082 0.469497 -v 10691.5 23616 2759.7 -vt 0.656276 0.469497 -v 10669 23616 2759.7 -vt 0.656276 0.468673 -v 10669 22296 2759.7 -vt 0.667082 0.468673 -o mesh124 -s off -f 609/609/609 610/610/610 611/611/611 -f 609/609/609 611/611/611 612/612/612 -g charts -o chart0000 -s off -f 609/609/609 610/610/610 611/611/611 -f 609/609/609 611/611/611 612/612/612 -v 10691.5 24861 -285.3 -vt 0.769327 0.864386 -v 10691.5 24861 2594.7 -vt 0.769327 0.841303 -v 10669 24861 2594.7 -vt 0.768495 0.841303 -v 10669 24861 -285.3 -vt 0.768495 0.864386 -o mesh125 -s off -f 613/613/613 614/614/614 615/615/615 -f 613/613/613 615/615/615 616/616/616 -g charts -o chart0000 -s off -f 613/613/613 614/614/614 615/615/615 -f 613/613/613 615/615/615 616/616/616 -v 10669 22296 -285.3 -vt 0.813383 0.658285 -v 10669 22461 -285.3 -vt 0.811721 0.658285 -v 10691.5 22461 -285.3 -vt 0.811721 0.657461 -v 10691.5 22296 -285.3 -vt 0.813383 0.657461 -o mesh126 -s off -f 617/617/617 618/618/618 619/619/619 -f 617/617/617 619/619/619 620/620/620 -g charts -o chart0000 -s off -f 617/617/617 618/618/618 619/619/619 -f 617/617/617 619/619/619 620/620/620 -v 10691.5 18268.5 -285.3 -vt 0.444306 0.997115 -v 10691.5 18433.5 -285.3 -vt 0.444306 0.998763 -v 10691.5 18433.5 2594.7 -vt 0.421031 0.998763 -v 10691.5 18268.5 -285.3 -vt 0.894015 0.276587 -v 10691.5 18433.5 2594.7 -vt 0.895337 0.253504 -v 10691.5 20593.5 2594.7 -vt 0.912643 0.253504 -v 10691.5 20593.5 -285.3 -vt 0.912643 0.276587 -v 10691.5 20758.5 -285.3 -vt 0.913965 0.276587 -v 10691.5 18268.5 -285.3 -vt 0.820033 0.96826 -v 10691.5 20758.5 -285.3 -vt 0.800083 0.96826 -v 10691.5 20758.5 2759.7 -vt 0.800083 0.944353 -v 10691.5 18268.5 2759.7 -vt 0.820033 0.944353 -o mesh127 -s off -f 621/621/621 622/622/622 623/623/623 -f 624/624/624 625/625/625 626/626/626 -f 624/624/624 626/626/626 627/627/627 -f 624/624/624 627/627/627 628/628/628 -f 629/629/629 630/630/630 631/631/631 -f 629/629/629 631/631/631 632/632/632 -g charts -o chart0000 -s off -f 621/621/621 622/622/622 623/623/623 -o chart0001 -s off -f 624/624/624 625/625/625 626/626/626 -f 624/624/624 626/626/626 627/627/627 -f 624/624/624 627/627/627 628/628/628 -o chart0002 -s off -f 629/629/629 630/630/630 631/631/631 -f 629/629/629 631/631/631 632/632/632 -v 10669 20758.5 -285.3 -vt 0.868246 0.165293 -v 10669 20593.5 -285.3 -vt 0.869908 0.165293 -v 10669 20593.5 2594.7 -vt 0.869908 0.142209 -v 10669 20758.5 -285.3 -vt 0.999584 0.125721 -v 10669 20593.5 2594.7 -vt 0.976309 0.127032 -v 10669 18433.5 2594.7 -vt 0.976309 0.144196 -v 10669 18433.5 -285.3 -vt 0.999584 0.144196 -v 10669 18268.5 -285.3 -vt 0.999584 0.145507 -v 10669 20758.5 -285.3 -vt 0.391937 0.525556 -v 10669 18268.5 -285.3 -vt 0.391937 0.545342 -v 10669 18268.5 2759.7 -vt 0.36783 0.545342 -v 10669 20758.5 2759.7 -vt 0.36783 0.525556 -o mesh128 -s off -f 633/633/633 634/634/634 635/635/635 -f 636/636/636 637/637/637 638/638/638 -f 636/636/636 638/638/638 639/639/639 -f 636/636/636 639/639/639 640/640/640 -f 641/641/641 642/642/642 643/643/643 -f 641/641/641 643/643/643 644/644/644 -g charts -o chart0000 -s off -f 633/633/633 634/634/634 635/635/635 -o chart0001 -s off -f 636/636/636 637/637/637 638/638/638 -f 636/636/636 638/638/638 639/639/639 -f 636/636/636 639/639/639 640/640/640 -o chart0002 -s off -f 641/641/641 642/642/642 643/643/643 -f 641/641/641 643/643/643 644/644/644 -v 10691.5 20758.5 2759.7 -vt 0.603907 0.374691 -v 10691.5 20758.5 -285.3 -vt 0.603907 0.398598 -v 10669 20758.5 -285.3 -vt 0.604738 0.398598 -v 10669 20758.5 2759.7 -vt 0.604738 0.374691 -o mesh129 -s off -f 645/645/645 646/646/646 647/647/647 -f 645/645/645 647/647/647 648/648/648 -g charts -o chart0000 -s off -f 645/645/645 646/646/646 647/647/647 -f 645/645/645 647/647/647 648/648/648 -v 10691.5 20758.5 -285.3 -vt 0.445968 0.298846 -v 10691.5 20593.5 -285.3 -vt 0.445968 0.300495 -v 10669 20593.5 -285.3 -vt 0.4468 0.300495 -v 10669 20758.5 -285.3 -vt 0.4468 0.298846 -o mesh130 -s off -f 649/649/649 650/650/650 651/651/651 -f 649/649/649 651/651/651 652/652/652 -g charts -o chart0000 -s off -f 649/649/649 650/650/650 651/651/651 -f 649/649/649 651/651/651 652/652/652 -v 10691.5 18268.5 -285.3 -vt 0.32793 0.410964 -v 10691.5 18268.5 2759.7 -vt 0.303824 0.410964 -v 10669 18268.5 2759.7 -vt 0.303824 0.41014 -v 10669 18268.5 -285.3 -vt 0.32793 0.41014 -o mesh131 -s off -f 653/653/653 654/654/654 655/655/655 -f 653/653/653 655/655/655 656/656/656 -g charts -o chart0000 -s off -f 653/653/653 654/654/654 655/655/655 -f 653/653/653 655/655/655 656/656/656 -v 10691.5 18268.5 2759.7 -vt 0.10266 0.401072 -v 10691.5 20758.5 2759.7 -vt 0.10266 0.381286 -v 10669 20758.5 2759.7 -vt 0.101829 0.381286 -v 10669 18268.5 2759.7 -vt 0.101829 0.401072 -o mesh132 -s off -f 657/657/657 658/658/658 659/659/659 -f 657/657/657 659/659/659 660/660/660 -g charts -o chart0000 -s off -f 657/657/657 658/658/658 659/659/659 -f 657/657/657 659/659/659 660/660/660 -v 10691.5 20593.5 2594.7 -vt 0.872402 0.145507 -v 10691.5 18433.5 2594.7 -vt 0.872402 0.162819 -v 10669 18433.5 2594.7 -vt 0.873233 0.162819 -v 10669 20593.5 2594.7 -vt 0.873233 0.145507 -o mesh133 -s off -f 661/661/661 662/662/662 663/663/663 -f 661/661/661 663/663/663 664/664/664 -g charts -o chart0000 -s off -f 661/661/661 662/662/662 663/663/663 -f 661/661/661 663/663/663 664/664/664 -v 10691.5 18433.5 2594.7 -vt 0.529925 0.822341 -v 10691.5 18433.5 -285.3 -vt 0.5532 0.822341 -v 10669 18433.5 -285.3 -vt 0.5532 0.823166 -v 10669 18433.5 2594.7 -vt 0.529925 0.823166 -o mesh134 -s off -f 665/665/665 666/666/666 667/667/667 -f 665/665/665 667/667/667 668/668/668 -g charts -o chart0000 -s off -f 665/665/665 666/666/666 667/667/667 -f 665/665/665 667/667/667 668/668/668 -v 10691.5 18433.5 -285.3 -vt 0.485869 0.415086 -v 10691.5 20593.5 -285.3 -vt 0.468412 0.415086 -v 10669 20593.5 -285.3 -vt 0.468412 0.414262 -v 10669 18433.5 -285.3 -vt 0.485869 0.414262 -o mesh135 -s off -f 669/669/669 670/670/670 671/671/671 -f 669/669/669 671/671/671 672/672/672 -g charts -o chart0000 -s off -f 669/669/669 670/670/670 671/671/671 -f 669/669/669 671/671/671 672/672/672 -v 10691.5 20593.5 -285.3 -vt 0.779302 0.556059 -v 10691.5 20593.5 2594.7 -vt 0.779302 0.532976 -v 10669 20593.5 2594.7 -vt 0.778471 0.532976 -v 10669 20593.5 -285.3 -vt 0.778471 0.556059 -o mesh136 -s off -f 673/673/673 674/674/674 675/675/675 -f 673/673/673 675/675/675 676/676/676 -g charts -o chart0000 -s off -f 673/673/673 674/674/674 675/675/675 -f 673/673/673 675/675/675 676/676/676 -v 10669 18268.5 -285.3 -vt 0.0328345 0.49258 -v 10669 18433.5 -285.3 -vt 0.0311721 0.49258 -v 10691.5 18433.5 -285.3 -vt 0.0311721 0.491756 -v 10691.5 18268.5 -285.3 -vt 0.0328345 0.491756 -o mesh137 -s off -f 677/677/677 678/678/678 679/679/679 -f 677/677/677 679/679/679 680/680/680 -g charts -o chart0000 -s off -f 677/677/677 678/678/678 679/679/679 -f 677/677/677 679/679/679 680/680/680 -v -18038.5 31071 -4785.3 -vt 0.364505 0.309563 -v -13508.5 30351 -4785.3 -vt 0.370208 0.34495 -v -18038.5 22251 -4785.3 -vt 0.434361 0.309563 -v 4651.5 31071 -4785.3 -vt 0.364505 0.486809 -v -548.499 30351 -4785.3 -vt 0.370208 0.446189 -v -548.499 24231 -4785.3 -vt 0.418679 0.446189 -v -13508.5 22251 -4785.3 -vt 0.434361 0.34495 -v -13508.5 24231 -4785.3 -vt 0.418679 0.34495 -v -6588.5 22161 -4785.3 -vt 0.435074 0.399006 -v -13508.5 13963.5 -4785.3 -vt 0.5 0.34495 -v 4651.5 22161 -4785.3 -vt 0.435074 0.486809 -v -6588.5 13963.5 -4785.3 -vt 0.5 0.399006 -o mesh138 -s off -f 681/681/681 682/682/682 683/683/683 -f 682/682/682 681/681/681 684/684/684 -f 682/682/682 684/684/684 685/685/685 -f 685/685/685 684/684/684 686/686/686 -f 682/682/682 687/687/687 683/683/683 -f 687/687/687 682/682/682 688/688/688 -f 687/687/687 688/688/688 686/686/686 -f 687/687/687 686/686/686 689/689/689 -f 687/687/687 689/689/689 690/690/690 -f 689/689/689 686/686/686 691/691/691 -f 691/691/691 686/686/686 684/684/684 -f 692/692/692 690/690/690 689/689/689 -g charts -o chart0000 -s off -f 681/681/681 682/682/682 683/683/683 -f 682/682/682 681/681/681 684/684/684 -f 682/682/682 684/684/684 685/685/685 -f 685/685/685 684/684/684 686/686/686 -f 682/682/682 687/687/687 683/683/683 -f 687/687/687 682/682/682 688/688/688 -f 687/687/687 688/688/688 686/686/686 -f 687/687/687 686/686/686 689/689/689 -f 687/687/687 689/689/689 690/690/690 -f 689/689/689 686/686/686 691/691/691 -f 691/691/691 686/686/686 684/684/684 -f 692/692/692 690/690/690 689/689/689 -v -13508.5 30351 -4785.3 -vt 0.712801 0.995466 -v -13508.5 30351 -3345.3 -vt 0.712801 0.983924 -v -13508.5 24231 -3345.3 -vt 0.664589 0.983924 -v -13508.5 24231 -4785.3 -vt 0.664589 0.995466 -v -13508.5 30351 -1185.3 -vt 0.712801 0.966612 -v -13508.5 24231 -1185.3 -vt 0.664589 0.966612 -o mesh139 -s off -f 693/693/693 694/694/694 695/695/695 -f 693/693/693 695/695/695 696/696/696 -f 697/697/697 698/698/698 695/695/695 -f 697/697/697 695/695/695 694/694/694 -g charts -o chart0000 -s off -f 693/693/693 694/694/694 695/695/695 -f 693/693/693 695/695/695 696/696/696 -f 697/697/697 698/698/698 695/695/695 -f 697/697/697 695/695/695 694/694/694 -v -548.499 24231 -4785.3 -vt 0.447631 0.717642 -v -548.499 24231 -3345.3 -vt 0.459268 0.717642 -v -548.499 30351 -3345.3 -vt 0.459268 0.669827 -v -548.499 30351 -4785.3 -vt 0.447631 0.669827 -o mesh140 -s off -f 699/699/699 700/700/700 701/701/701 -f 699/699/699 701/701/701 702/702/702 -g charts -o chart0000 -s off -f 699/699/699 700/700/700 701/701/701 -f 699/699/699 701/701/701 702/702/702 -v -6588.5 13963.5 -1185.3 -vt 0.601825 0.431574 -v -13508.5 22251 -1185.3 -vt 0.547319 0.366477 -v -13508.5 13963.5 -1185.3 -vt 0.547319 0.431574 -v -13508.5 24231 -1185.3 -vt 0.547319 0.350924 -v -6588.5 22161 -1185.3 -vt 0.601825 0.367184 -v -548.499 24231 -1185.3 -vt 0.649399 0.350924 -v 4651.5 22161 -1185.3 -vt 0.690357 0.367184 -v -548.499 30351 -1185.3 -vt 0.649399 0.302853 -v -18038.5 31071 -1185.3 -vt 0.511638 0.297197 -v -18038.5 22251 -1185.3 -vt 0.511638 0.366477 -v -13508.5 30351 -1185.3 -vt 0.547319 0.302853 -v 4651.5 31071 -1185.3 -vt 0.690357 0.297197 -o mesh141 -s off -f 703/703/703 704/704/704 705/705/705 -f 704/704/704 703/703/703 706/706/706 -f 706/706/706 703/703/703 707/707/707 -f 706/706/706 707/707/707 708/708/708 -f 708/708/708 707/707/707 709/709/709 -f 708/708/708 709/709/709 710/710/710 -f 704/704/704 711/711/711 712/712/712 -f 711/711/711 704/704/704 713/713/713 -f 711/711/711 713/713/713 714/714/714 -f 713/713/713 704/704/704 706/706/706 -f 714/714/714 713/713/713 710/710/710 -f 714/714/714 710/710/710 709/709/709 -g charts -o chart0000 -s off -f 703/703/703 704/704/704 705/705/705 -f 704/704/704 703/703/703 706/706/706 -f 706/706/706 703/703/703 707/707/707 -f 706/706/706 707/707/707 708/708/708 -f 708/708/708 707/707/707 709/709/709 -f 708/708/708 709/709/709 710/710/710 -f 704/704/704 711/711/711 712/712/712 -f 711/711/711 704/704/704 713/713/713 -f 711/711/711 713/713/713 714/714/714 -f 713/713/713 704/704/704 706/706/706 -f 714/714/714 713/713/713 710/710/710 -f 714/714/714 710/710/710 709/709/709 -v -548.499 30351 -2265.3 -vt 0.16916 0.383759 -v -548.499 24231 -2265.3 -vt 0.16916 0.431574 -v -548.499 24231 -1185.3 -vt 0.178304 0.431574 -v -548.499 30351 -1185.3 -vt 0.178304 0.383759 -o mesh142 -s off -f 715/715/715 716/716/716 717/717/717 -f 715/715/715 717/717/717 718/718/718 -g charts -o chart0000 -s off -f 715/715/715 716/716/716 717/717/717 -f 715/715/715 717/717/717 718/718/718 -v -13508.5 30351 -3345.3 -vt 0.869908 0.50742 -v -548.499 30351 -3345.3 -vt 0.869908 0.406018 -v -548.499 24231 -3345.3 -vt 0.821696 0.406018 -v -13508.5 24231 -3345.3 -vt 0.821696 0.50742 -o mesh143 -s off -f 719/719/719 720/720/720 721/721/721 -f 719/719/719 721/721/721 722/722/722 -g charts -o chart0000 -s off -f 719/719/719 720/720/720 721/721/721 -f 719/719/719 721/721/721 722/722/722 -v -13508.5 30351 -1185.3 -vt 0.860765 0.924567 -v -13508.5 30351 -3345.3 -vt 0.860765 0.907255 -v -548.499 30351 -2265.3 -vt 0.75852 0.915911 -v -548.499 30351 -1185.3 -vt 0.75852 0.924567 -o mesh144 -s off -f 723/723/723 724/724/724 725/725/725 -f 723/723/723 725/725/725 726/726/726 -g charts -o chart0000 -s off -f 723/723/723 724/724/724 725/725/725 -f 723/723/723 725/725/725 726/726/726 -v -18038.5 31071 -1185.3 -vt 0.630507 0.667354 -v 4651.5 31071 -1185.3 -vt 0.451787 0.667354 -v 4651.5 31071 -4785.3 -vt 0.451787 0.6385 -v -18038.5 31071 -4785.3 -vt 0.630507 0.6385 -o mesh145 -s off -f 727/727/727 728/728/728 729/729/729 -f 727/727/727 729/729/729 730/730/730 -g charts -o chart0000 -s off -f 727/727/727 728/728/728 729/729/729 -f 727/727/727 729/729/729 730/730/730 -v -13508.5 24231 -4785.3 -vt 0.903159 0.419209 -v -13508.5 24231 -3345.3 -vt 0.914796 0.419209 -v -548.499 24231 -3345.3 -vt 0.914796 0.52061 -v -548.499 24231 -4785.3 -vt 0.903159 0.52061 -o mesh146 -s off -f 731/731/731 732/732/732 733/733/733 -f 731/731/731 733/733/733 734/734/734 -g charts -o chart0000 -s off -f 731/731/731 732/732/732 733/733/733 -f 731/731/731 733/733/733 734/734/734 -v 4651.5 31071 -1185.3 -vt 0.390274 0.935284 -v 4651.5 22161 -1185.3 -vt 0.460931 0.935284 -v 4651.5 22161 -4785.3 -vt 0.460931 0.964138 -v 4651.5 31071 -4785.3 -vt 0.390274 0.964138 -o mesh147 -s off -f 735/735/735 736/736/736 737/737/737 -f 735/735/735 737/737/737 738/738/738 -g charts -o chart0000 -s off -f 735/735/735 736/736/736 737/737/737 -f 735/735/735 737/737/737 738/738/738 -v -13508.5 24231 -1185.3 -vt 0.173317 0.83141 -v -548.499 24231 -1185.3 -vt 0.275561 0.83141 -v -548.499 24231 -2265.3 -vt 0.275561 0.822753 -v -13508.5 24231 -3345.3 -vt 0.173317 0.814097 -o mesh148 -s off -f 739/739/739 740/740/740 741/741/741 -f 739/739/739 741/741/741 742/742/742 -g charts -o chart0000 -s off -f 739/739/739 740/740/740 741/741/741 -f 739/739/739 741/741/741 742/742/742 -v -548.499 30351 -2265.3 -vt 0.81754 0.0754328 -v -13508.5 30351 -3345.3 -vt 0.81754 0.177659 -v -13508.5 24231 -3345.3 -vt 0.865752 0.177659 -v -548.499 24231 -2265.3 -vt 0.865752 0.0754328 -o mesh149 -s off -f 743/743/743 744/744/744 745/745/745 -f 743/743/743 745/745/745 746/746/746 -g charts -o chart0000 -s off -f 743/743/743 744/744/744 745/745/745 -f 743/743/743 745/745/745 746/746/746 -v 4651.5 22161 -1185.3 -vt 0.5532 0.306265 -v -6588.5 22161 -1185.3 -vt 0.642145 0.306265 -v -6588.5 22161 -4785.3 -vt 0.642145 0.335119 -v 4651.5 22161 -4785.3 -vt 0.5532 0.335119 -o mesh150 -s off -f 747/747/747 748/748/748 749/749/749 -f 747/747/747 749/749/749 750/750/750 -g charts -o chart0000 -s off -f 747/747/747 748/748/748 749/749/749 -f 747/747/747 749/749/749 750/750/750 -v -548.499 30351 -4785.3 -vt 0.340399 0.47197 -v -548.499 30351 -3345.3 -vt 0.340399 0.460429 -v -13508.5 30351 -3345.3 -vt 0.238155 0.460429 -v -13508.5 30351 -4785.3 -vt 0.238155 0.47197 -o mesh151 -s off -f 751/751/751 752/752/752 753/753/753 -f 751/751/751 753/753/753 754/754/754 -g charts -o chart0000 -s off -f 751/751/751 752/752/752 753/753/753 -f 751/751/751 753/753/753 754/754/754 -v -13508.5 13963.5 -4785.3 -vt 0.871571 0.814922 -v -6588.5 13963.5 -4785.3 -vt 0.816708 0.814922 -v -6588.5 13963.5 -1185.3 -vt 0.816708 0.786068 -v -13508.5 13963.5 -1185.3 -vt 0.871571 0.786068 -o mesh152 -s off -f 755/755/755 756/756/756 757/757/757 -f 755/755/755 757/757/757 758/758/758 -g charts -o chart0000 -s off -f 755/755/755 756/756/756 757/757/757 -f 755/755/755 757/757/757 758/758/758 -v -6588.5 22161 -4785.3 -vt 0.953034 0.647568 -v -6588.5 22161 -1185.3 -vt 0.982128 0.647568 -v -6588.5 13963.5 -1185.3 -vt 0.982128 0.583265 -v -6588.5 13963.5 -4785.3 -vt 0.953034 0.583265 -o mesh153 -s off -f 759/759/759 760/760/760 761/761/761 -f 759/759/759 761/761/761 762/762/762 -g charts -o chart0000 -s off -f 759/759/759 760/760/760 761/761/761 -f 759/759/759 761/761/761 762/762/762 -v -18038.5 31071 -4785.3 -vt 0.00374065 0.919621 -v -18038.5 22251 -4785.3 -vt 0.073566 0.919621 -v -18038.5 22251 -1185.3 -vt 0.073566 0.948475 -v -18038.5 31071 -1185.3 -vt 0.00374065 0.948475 -o mesh154 -s off -f 763/763/763 764/764/764 765/765/765 -f 763/763/763 765/765/765 766/766/766 -g charts -o chart0000 -s off -f 763/763/763 764/764/764 765/765/765 -f 763/763/763 765/765/765 766/766/766 -v -13508.5 13963.5 -1185.3 -vt 0.327099 0.96249 -v -13508.5 22251 -1185.3 -vt 0.26143 0.96249 -v -13508.5 22251 -4785.3 -vt 0.26143 0.933636 -v -13508.5 13963.5 -4785.3 -vt 0.327099 0.933636 -o mesh155 -s off -f 767/767/767 768/768/768 769/769/769 -f 767/767/767 769/769/769 770/770/770 -g charts -o chart0000 -s off -f 767/767/767 768/768/768 769/769/769 -f 767/767/767 769/769/769 770/770/770 -v -18038.5 22251 -1185.3 -vt 0.4202 0.662407 -v -18038.5 22251 -4785.3 -vt 0.449293 0.662407 -v -13508.5 22251 -4785.3 -vt 0.449293 0.626958 -v -13508.5 22251 -1185.3 -vt 0.4202 0.626958 -o mesh156 -s off -f 771/771/771 772/772/772 773/773/773 -f 771/771/771 773/773/773 774/774/774 -g charts -o chart0000 -s off -f 771/771/771 772/772/772 773/773/773 -f 771/771/771 773/773/773 774/774/774 -v 4666.5 20291 -825.3 -vt 0.995428 0.352432 -v 4666.5 20291 -645.3 -vt 0.997091 0.352432 -v 4666.5 19356 -645.3 -vt 0.997091 0.345012 -v 4666.5 20291 -825.3 -vt 0.953865 0.684631 -v 4666.5 19356 -645.3 -vt 0.955528 0.692086 -v 4666.5 19356 -465.3 -vt 0.95719 0.692086 -v 4666.5 22251 -465.3 -vt 0.95719 0.669002 -v 4666.5 22251 -1005.3 -vt 0.952203 0.669002 -v 4666.5 21226 -1005.3 -vt 0.952203 0.677175 -v 4666.5 20291 -825.3 -vt 0.5266 0.414262 -v 4666.5 21226 -1005.3 -vt 0.534081 0.412613 -v 4666.5 21226 -825.3 -vt 0.534081 0.414262 -o mesh157 -s off -f 775/775/775 776/776/776 777/777/777 -f 778/778/778 779/779/779 780/780/780 -f 778/778/778 780/780/780 781/781/781 -f 778/778/778 781/781/781 782/782/782 -f 778/778/778 782/782/782 783/783/783 -f 784/784/784 785/785/785 786/786/786 -g charts -o chart0000 -s off -f 775/775/775 776/776/776 777/777/777 -o chart0001 -s off -f 778/778/778 779/779/779 780/780/780 -f 778/778/778 780/780/780 781/781/781 -f 778/778/778 781/781/781 782/782/782 -f 778/778/778 782/782/782 783/783/783 -o chart0002 -s off -f 784/784/784 785/785/785 786/786/786 -v -563.499 19356 -465.3 -vt 0.918121 0.570074 -v 4666.5 19356 -465.3 -vt 0.918121 0.528854 -v 4666.5 19356 -645.3 -vt 0.916459 0.528854 -v -563.499 19356 -645.3 -vt 0.916459 0.570074 -o mesh158 -s off -f 787/787/787 788/788/788 789/789/789 -f 787/787/787 789/789/789 790/790/790 -g charts -o chart0000 -s off -f 787/787/787 788/788/788 789/789/789 -f 787/787/787 789/789/789 790/790/790 -v 4666.5 19356 -645.3 -vt 0.94389 0.693734 -v 4666.5 20291 -645.3 -vt 0.94389 0.686315 -v -548.499 20291 -645.3 -vt 0.902447 0.686315 -v -563.499 20291 -645.3 -vt 0.902328 0.686315 -v -563.499 19356 -645.3 -vt 0.902328 0.693734 -o mesh159 -s off -f 791/791/791 792/792/792 793/793/793 -f 791/791/791 793/793/793 794/794/794 -f 791/791/791 794/794/794 795/795/795 -g charts -o chart0000 -s off -f 791/791/791 792/792/792 793/793/793 -f 791/791/791 793/793/793 794/794/794 -f 791/791/791 794/794/794 795/795/795 -v 10691.5 16791 -465.3 -vt 0.652951 0.786892 -v 9791.5 16791 -465.3 -vt 0.64547 0.786892 -v 9791.5 16791 -4494.67 -vt 0.64547 0.75474 -v 10691.5 16791 -4494.67 -vt 0.652951 0.75474 -o mesh160 -s off -f 796/796/796 797/797/797 798/798/798 -f 796/796/796 798/798/798 799/799/799 -g charts -o chart0000 -s off -f 796/796/796 797/797/797 798/798/798 -f 796/796/796 798/798/798 799/799/799 -v 9791.5 16431 -465.3 -vt 0.814214 0.539571 -v -5688.5 16431 -465.3 -vt 0.814214 0.660758 -v -5688.5 16431 -4494.67 -vt 0.846633 0.660758 -v 9791.5 16431 -4494.67 -vt 0.846633 0.539571 -o mesh161 -s off -f 800/800/800 801/801/801 802/802/802 -f 800/800/800 802/802/802 803/803/803 -g charts -o chart0000 -s off -f 800/800/800 801/801/801 802/802/802 -f 800/800/800 802/802/802 803/803/803 -v -6573.5 16791 -4494.67 -vt 0.434331 0.810461 -v -6573.5 22341 -4494.67 -vt 0.434331 0.767106 -v -5711 22341 -4494.67 -vt 0.441141 0.767106 -v -5711 22251 -4494.67 -vt 0.441141 0.767809 -v 10691.5 22251 -4494.67 -vt 0.570657 0.767809 -v 10691.5 16791 -4494.67 -vt 0.570657 0.810461 -v 9791.5 16791 -4494.67 -vt 0.56355 0.810461 -v 9791.5 16431 -4494.67 -vt 0.56355 0.813273 -v -5688.5 16431 -4494.67 -vt 0.441319 0.813273 -v -6573.5 16791 -4494.67 -vt 0.780964 0.964963 -v -5688.5 16431 -4494.67 -vt 0.788445 0.961665 -v -5688.5 16791 -4494.67 -vt 0.788445 0.964963 -o mesh162 -s off -f 804/804/804 805/805/805 806/806/806 -f 804/804/804 806/806/806 807/807/807 -f 804/804/804 807/807/807 808/808/808 -f 804/804/804 808/808/808 809/809/809 -f 804/804/804 809/809/809 810/810/810 -f 804/804/804 810/810/810 811/811/811 -f 804/804/804 811/811/811 812/812/812 -f 813/813/813 814/814/814 815/815/815 -g charts -o chart0000 -s off -f 804/804/804 805/805/805 806/806/806 -f 804/804/804 806/806/806 807/807/807 -f 804/804/804 807/807/807 808/808/808 -f 804/804/804 808/808/808 809/809/809 -f 804/804/804 809/809/809 810/810/810 -f 804/804/804 810/810/810 811/811/811 -f 804/804/804 811/811/811 812/812/812 -o chart0001 -s off -f 813/813/813 814/814/814 815/815/815 -v -5688.5 16431 -465.3 -vt 0.395262 0.770404 -v -5688.5 16791 -465.3 -vt 0.391937 0.770404 -v -5688.5 16791 -4494.67 -vt 0.391937 0.738252 -v -5688.5 16431 -4494.67 -vt 0.395262 0.738252 -o mesh163 -s off -f 816/816/816 817/817/817 818/818/818 -f 816/816/816 818/818/818 819/819/819 -g charts -o chart0000 -s off -f 816/816/816 817/817/817 818/818/818 -f 816/816/816 818/818/818 819/819/819 -v -5688.5 16791 -465.3 -vt 0.67872 0.671476 -v -6573.5 16791 -465.3 -vt 0.67872 0.664056 -v -6573.5 16791 -4494.67 -vt 0.646301 0.664056 -v -5688.5 16791 -4494.67 -vt 0.646301 0.671476 -o mesh164 -s off -f 820/820/820 821/821/821 822/822/822 -f 820/820/820 822/822/822 823/823/823 -g charts -o chart0000 -s off -f 820/820/820 821/821/821 822/822/822 -f 820/820/820 822/822/822 823/823/823 -v 10691.5 22251 -465.3 -vt 0.4335 0.720115 -v 10691.5 16791 -465.3 -vt 0.4335 0.762984 -v 10691.5 16791 -4494.67 -vt 0.465918 0.762984 -v 10691.5 22251 -4494.67 -vt 0.465918 0.720115 -o mesh165 -s off -f 824/824/824 825/825/825 826/826/826 -f 824/824/824 826/826/826 827/827/827 -g charts -o chart0000 -s off -f 824/824/824 825/825/825 826/826/826 -f 824/824/824 826/826/826 827/827/827 -v 9791.5 16791 -465.3 -vt 0.184123 0.432399 -v 9791.5 16431 -465.3 -vt 0.180798 0.432399 -v 9791.5 16431 -4494.67 -vt 0.180798 0.400247 -v 9791.5 16791 -4494.67 -vt 0.184123 0.400247 -o mesh166 -s off -f 828/828/828 829/829/829 830/830/830 -f 828/828/828 830/830/830 831/831/831 -g charts -o chart0000 -s off -f 828/828/828 829/829/829 830/830/830 -f 828/828/828 830/830/830 831/831/831 -v 4666.5 20291 -825.3 -vt 0.775977 0.669827 -v 4666.5 21226 -825.3 -vt 0.775977 0.662407 -v -548.499 21226 -825.3 -vt 0.734533 0.662407 -v -563.499 21226 -825.3 -vt 0.734414 0.662407 -v -563.499 20291 -825.3 -vt 0.734414 0.669827 -v -548.499 20291 -825.3 -vt 0.734533 0.669827 -o mesh167 -s off -f 832/832/832 833/833/833 834/834/834 -f 832/832/832 834/834/834 835/835/835 -f 832/832/832 835/835/835 836/836/836 -f 832/832/832 836/836/836 837/837/837 -g charts -o chart0000 -s off -f 832/832/832 833/833/833 834/834/834 -f 832/832/832 834/834/834 835/835/835 -f 832/832/832 835/835/835 836/836/836 -f 832/832/832 836/836/836 837/837/837 -v -563.499 20291 -645.3 -vt 0.65877 0.755565 -v -548.499 20291 -645.3 -vt 0.65877 0.755683 -v -548.499 20291 -825.3 -vt 0.657107 0.755683 -v -563.499 20291 -825.3 -vt 0.657107 0.755565 -v 4666.5 20291 -645.3 -vt 0.65877 0.796785 -v 4666.5 20291 -825.3 -vt 0.657107 0.796785 -o mesh168 -s off -f 838/838/838 839/839/839 840/840/840 -f 838/838/838 840/840/840 841/841/841 -f 839/839/839 842/842/842 843/843/843 -f 839/839/839 843/843/843 840/840/840 -g charts -o chart0000 -s off -f 838/838/838 839/839/839 840/840/840 -f 838/838/838 840/840/840 841/841/841 -f 839/839/839 842/842/842 843/843/843 -f 839/839/839 843/843/843 840/840/840 -v -563.499 22251 -1005.3 -vt 0.209061 0.75474 -v -563.499 21226 -1005.3 -vt 0.217373 0.75474 -v -548.499 21226 -1005.3 -vt 0.217373 0.754622 -v 4666.5 21226 -1005.3 -vt 0.217373 0.71352 -v 4666.5 22251 -1005.3 -vt 0.209061 0.71352 -o mesh169 -s off -f 844/844/844 845/845/845 846/846/846 -f 844/844/844 846/846/846 847/847/847 -f 844/844/844 847/847/847 848/848/848 -g charts -o chart0000 -s off -f 844/844/844 845/845/845 846/846/846 -f 844/844/844 846/846/846 847/847/847 -f 844/844/844 847/847/847 848/848/848 -v -563.499 21226 -825.3 -vt 0.260598 0.957543 -v -548.499 21226 -825.3 -vt 0.260598 0.957662 -v -548.499 21226 -1005.3 -vt 0.258936 0.957662 -v -563.499 21226 -1005.3 -vt 0.258936 0.957543 -v 4666.5 21226 -825.3 -vt 0.260598 0.998763 -v 4666.5 21226 -1005.3 -vt 0.258936 0.998763 -o mesh170 -s off -f 849/849/849 850/850/850 851/851/851 -f 849/849/849 851/851/851 852/852/852 -f 850/850/850 853/853/853 854/854/854 -f 850/850/850 854/854/854 851/851/851 -g charts -o chart0000 -s off -f 849/849/849 850/850/850 851/851/851 -f 849/849/849 851/851/851 852/852/852 -f 850/850/850 853/853/853 854/854/854 -f 850/850/850 854/854/854 851/851/851 -v -563.499 22251 -1005.3 -vt 0.372818 0.434872 -v -563.499 22251 -465.3 -vt 0.378637 0.434872 -v -563.499 19356 -465.3 -vt 0.378637 0.407667 -v -563.499 19356 -645.3 -vt 0.376697 0.407667 -v -563.499 20291 -645.3 -vt 0.376697 0.416453 -v -563.499 22251 -1005.3 -vt 0.308811 0.965787 -v -563.499 20291 -645.3 -vt 0.335411 0.965787 -v -563.499 20291 -825.3 -vt 0.334977 0.963314 -v -563.499 21226 -825.3 -vt 0.322702 0.965674 -v -563.499 22251 -1005.3 -vt 0.210723 0.838005 -v -563.499 21226 -825.3 -vt 0.202411 0.836356 -v -563.499 21226 -1005.3 -vt 0.202411 0.838005 -o mesh171 -s off -f 855/855/855 856/856/856 857/857/857 -f 855/855/855 857/857/857 858/858/858 -f 855/855/855 858/858/858 859/859/859 -f 860/860/860 861/861/861 862/862/862 -f 860/860/860 862/862/862 863/863/863 -f 864/864/864 865/865/865 866/866/866 -g charts -o chart0000 -s off -f 855/855/855 856/856/856 857/857/857 -f 855/855/855 857/857/857 858/858/858 -f 855/855/855 858/858/858 859/859/859 -o chart0001 -s off -f 860/860/860 861/861/861 862/862/862 -f 860/860/860 862/862/862 863/863/863 -o chart0002 -s off -f 864/864/864 865/865/865 866/866/866 -v -6573.5 22326 -904.05 -vt 0.322111 0.980627 -v -6573.5 16806 -904.05 -vt 0.366168 0.980627 -v -5711 16806 -904.05 -vt 0.366168 0.988046 -v -5711 22251 -904.05 -vt 0.32271 0.988046 -v -5711 22326 -904.05 -vt 0.322111 0.988046 -o mesh172 -s off -f 867/867/867 868/868/868 869/869/869 -f 867/867/867 869/869/869 870/870/870 -f 867/867/867 870/870/870 871/871/871 -g charts -o chart0000 -s off -f 867/867/867 868/868/868 869/869/869 -f 867/867/867 869/869/869 870/870/870 -f 867/867/867 870/870/870 871/871/871 -v -6573.5 16806 -465.3 -vt 0.973815 0.72094 -v -6573.5 22326 -465.3 -vt 0.973815 0.677247 -v -6573.5 22326 -904.05 -vt 0.969659 0.677247 -v -6573.5 16806 -904.05 -vt 0.969659 0.72094 -o mesh173 -s off -f 872/872/872 873/873/873 874/874/874 -f 872/872/872 874/874/874 875/875/875 -g charts -o chart0000 -s off -f 872/872/872 873/873/873 874/874/874 -f 872/872/872 874/874/874 875/875/875 -v -6573.5 16806 -465.3 -vt 0.859933 0.618714 -v -5711 16806 -465.3 -vt 0.859933 0.611294 -v -5711 16806 -904.05 -vt 0.855777 0.611294 -v -6573.5 16806 -904.05 -vt 0.855777 0.618714 -o mesh174 -s off -f 876/876/876 877/877/877 878/878/878 -f 876/876/876 878/878/878 879/879/879 -g charts -o chart0000 -s off -f 876/876/876 877/877/877 878/878/878 -f 876/876/876 878/878/878 879/879/879 -v -5711 22326 -465.3 -vt 0.458437 0.595631 -v -6573.5 22326 -465.3 -vt 0.465918 0.595631 -v -6573.5 22326 -904.05 -vt 0.465918 0.599753 -v -5711 22326 -904.05 -vt 0.458437 0.599753 -o mesh175 -s off -f 880/880/880 881/881/881 882/882/882 -f 880/880/880 882/882/882 883/883/883 -g charts -o chart0000 -s off -f 880/880/880 881/881/881 882/882/882 -f 880/880/880 882/882/882 883/883/883 -v 10691.5 22251 -4494.67 -vt 0.222361 0.302968 -v -5711 22251 -4494.67 -vt 0.36118 0.302968 -v -5711 22251 -904.05 -vt 0.36118 0.333088 -v -5711 22251 -465.3 -vt 0.36118 0.336768 -v -563.499 22251 -465.3 -vt 0.317615 0.336768 -v -563.499 22251 -1005.3 -vt 0.317615 0.332238 -v 10691.5 22251 -4494.67 -vt 0.647963 0.879225 -v -563.499 22251 -1005.3 -vt 0.559019 0.907068 -v 4666.5 22251 -1005.3 -vt 0.60035 0.907068 -v 4666.5 22251 -465.3 -vt 0.60035 0.911377 -v 10691.5 22251 -465.3 -vt 0.647963 0.911377 -o mesh176 -s off -f 884/884/884 885/885/885 886/886/886 -f 884/884/884 886/886/886 887/887/887 -f 884/884/884 887/887/887 888/888/888 -f 884/884/884 888/888/888 889/889/889 -f 890/890/890 891/891/891 892/892/892 -f 890/890/890 892/892/892 893/893/893 -f 890/890/890 893/893/893 894/894/894 -g charts -o chart0000 -s off -f 884/884/884 885/885/885 886/886/886 -f 884/884/884 886/886/886 887/887/887 -f 884/884/884 887/887/887 888/888/888 -f 884/884/884 888/888/888 889/889/889 -o chart0001 -s off -f 890/890/890 891/891/891 892/892/892 -f 890/890/890 892/892/892 893/893/893 -f 890/890/890 893/893/893 894/894/894 -v -6573.5 22341 -465.3 -vt 0.770989 0.573372 -v -5711 22341 -465.3 -vt 0.763508 0.573372 -v -5711 22341 -4494.67 -vt 0.763508 0.54122 -v -6573.5 22341 -4494.67 -vt 0.770989 0.54122 -o mesh177 -s off -f 895/895/895 896/896/896 897/897/897 -f 895/895/895 897/897/897 898/898/898 -g charts -o chart0000 -s off -f 895/895/895 896/896/896 897/897/897 -f 895/895/895 897/897/897 898/898/898 -v -5711 16806 -465.3 -vt 0.967997 0.531327 -v -5711 22251 -465.3 -vt 0.967997 0.488458 -v -5711 22251 -904.05 -vt 0.96384 0.488458 -v -5711 16806 -904.05 -vt 0.96384 0.531327 -o mesh178 -s off -f 899/899/899 900/900/900 901/901/901 -f 899/899/899 901/901/901 902/902/902 -g charts -o chart0000 -s off -f 899/899/899 900/900/900 901/901/901 -f 899/899/899 901/901/901 902/902/902 -v -5711 22251 -465.3 -vt 0.232336 0.793487 -v -5711 22251 -904.05 -vt 0.238986 0.793487 -v -5711 22326 -904.05 -vt 0.234715 0.79294 -v -5711 22326 -465.3 -vt 0.232446 0.792077 -v -5711 22341 -465.3 -vt 0.232489 0.791838 -v -5711 22341 -465.3 -vt 0.4867 0.927865 -v -5711 22326 -904.05 -vt 0.485078 0.926916 -v -5711 22251 -904.05 -vt 0.481915 0.926216 -v -5711 22251 -4494.67 -vt 0.465104 0.926216 -v -5711 22341 -4494.67 -vt 0.465087 0.927865 -o mesh179 -s off -f 903/903/903 904/904/904 905/905/905 -f 903/903/903 905/905/905 906/906/906 -f 907/907/907 906/906/906 905/905/905 -f 908/908/908 909/909/909 910/910/910 -f 908/908/908 910/910/910 911/911/911 -f 908/908/908 911/911/911 912/912/912 -g charts -o chart0000 -s off -f 903/903/903 904/904/904 905/905/905 -f 903/903/903 905/905/905 906/906/906 -f 907/907/907 906/906/906 905/905/905 -o chart0001 -s off -f 908/908/908 909/909/909 910/910/910 -f 908/908/908 910/910/910 911/911/911 -f 908/908/908 911/911/911 912/912/912 -v -6573.5 22341 -465.3 -vt 0.728595 0.647568 -v -6573.5 22326 -465.3 -vt 0.729426 0.647568 -v -5711 22326 -465.3 -vt 0.729426 0.640148 -v -5711 22341 -465.3 -vt 0.728595 0.640148 -o mesh180 -s off -f 913/913/913 914/914/914 915/915/915 -f 913/913/913 915/915/915 916/916/916 -g charts -o chart0000 -s off -f 913/913/913 914/914/914 915/915/915 -f 913/913/913 915/915/915 916/916/916 -v -5711 16806 -465.3 -vt 0.0945377 0.656636 -v -6573.5 16806 -465.3 -vt 0.101829 0.656636 -v -6573.5 16791 -465.3 -vt 0.101829 0.657461 -v -5688.5 16791 -465.3 -vt 0.0943475 0.657461 -v -5711 16806 -465.3 -vt 0.240648 0.79976 -v -5688.5 16791 -465.3 -vt 0.240826 0.79964 -v -5688.5 16431 -465.3 -vt 0.240826 0.796785 -v 9791.5 16431 -465.3 -vt 0.363209 0.796785 -v 9791.5 16791 -465.3 -vt 0.363209 0.79964 -v 10691.5 16791 -465.3 -vt 0.370324 0.79964 -v 10691.5 22251 -465.3 -vt 0.370324 0.842951 -v 4666.5 22251 -465.3 -vt 0.322691 0.842951 -v -5711 16806 -465.3 -vt 0.818371 0.49258 -v 4666.5 22251 -465.3 -vt 0.818371 0.345012 -v 4666.5 19356 -465.3 -vt 0.785121 0.36195 -v -563.499 19356 -465.3 -vt 0.816638 0.420266 -v -5711 16806 -465.3 -vt 0.544888 0.411789 -v -563.499 19356 -465.3 -vt 0.524644 0.371393 -v -563.499 22251 -465.3 -vt 0.501662 0.371393 -v -5711 22251 -465.3 -vt 0.501662 0.411789 -o mesh181 -s off -f 917/917/917 918/918/918 919/919/919 -f 917/917/917 919/919/919 920/920/920 -f 921/921/921 922/922/922 923/923/923 -f 921/921/921 923/923/923 924/924/924 -f 921/921/921 924/924/924 925/925/925 -f 921/921/921 925/925/925 926/926/926 -f 921/921/921 926/926/926 927/927/927 -f 921/921/921 927/927/927 928/928/928 -f 929/929/929 930/930/930 931/931/931 -f 929/929/929 931/931/931 932/932/932 -f 933/933/933 934/934/934 935/935/935 -f 933/933/933 935/935/935 936/936/936 -g charts -o chart0000 -s off -f 917/917/917 918/918/918 919/919/919 -f 917/917/917 919/919/919 920/920/920 -o chart0001 -s off -f 921/921/921 922/922/922 923/923/923 -f 921/921/921 923/923/923 924/924/924 -f 921/921/921 924/924/924 925/925/925 -f 921/921/921 925/925/925 926/926/926 -f 921/921/921 926/926/926 927/927/927 -f 921/921/921 927/927/927 928/928/928 -o chart0002 -s off -f 929/929/929 930/930/930 931/931/931 -f 929/929/929 931/931/931 932/932/932 -o chart0003 -s off -f 933/933/933 934/934/934 935/935/935 -f 933/933/933 935/935/935 936/936/936 -v -13508.5 24231 -1185.3 -vt 0.865752 0.306265 -v -548.499 24231 -1185.3 -vt 0.865752 0.204864 -v -548.499 30351 -1185.3 -vt 0.81754 0.204864 -v -13508.5 30351 -1185.3 -vt 0.81754 0.306265 -o mesh182 -s off -f 937/937/937 938/938/938 939/939/939 -f 937/937/937 939/939/939 940/940/940 -g charts -o chart0000 -s off -f 937/937/937 938/938/938 939/939/939 -f 937/937/937 939/939/939 940/940/940 -v -548.499 24231 -1652.18 -vt 0.818371 0.678895 -v -13508.5 24231 -1652.18 -vt 0.818371 0.780297 -v -13508.5 30351 -1652.18 -vt 0.866583 0.780297 -v -548.499 30351 -1652.18 -vt 0.866583 0.678895 -o mesh183 -s off -f 941/941/941 942/942/942 943/943/943 -f 941/941/941 943/943/943 944/944/944 -g charts -o chart0000 -s off -f 941/941/941 942/942/942 943/943/943 -f 941/941/941 943/943/943 944/944/944 -v -548.499 24231 -1185.3 -vt 0.0286783 0.371393 -v -13508.5 24231 -1185.3 -vt 0.0286783 0.472795 -v -13508.5 24231 -1652.18 -vt 0.0328345 0.472795 -v -548.499 24231 -1652.18 -vt 0.0328345 0.371393 -o mesh184 -s off -f 945/945/945 946/946/946 947/947/947 -f 945/945/945 947/947/947 948/948/948 -g charts -o chart0000 -s off -f 945/945/945 946/946/946 947/947/947 -f 945/945/945 947/947/947 948/948/948 -v -13508.5 24231 -1185.3 -vt 0.954696 0.00535853 -v -13508.5 30351 -1185.3 -vt 0.906484 0.00535853 -v -13508.5 30351 -1652.18 -vt 0.906484 0.0012366 -v -13508.5 24231 -1652.18 -vt 0.954696 0.0012366 -o mesh185 -s off -f 949/949/949 950/950/950 951/951/951 -f 949/949/949 951/951/951 952/952/952 -g charts -o chart0000 -s off -f 949/949/949 950/950/950 951/951/951 -f 949/949/949 951/951/951 952/952/952 -v -13508.5 30351 -1185.3 -vt 0.903159 0.390354 -v -548.499 30351 -1185.3 -vt 0.903159 0.288953 -v -548.499 30351 -1652.18 -vt 0.899002 0.288953 -v -13508.5 30351 -1652.18 -vt 0.899002 0.390354 -o mesh186 -s off -f 953/953/953 954/954/954 955/955/955 -f 953/953/953 955/955/955 956/956/956 -g charts -o chart0000 -s off -f 953/953/953 954/954/954 955/955/955 -f 953/953/953 955/955/955 956/956/956 -v -548.499 30351 -1185.3 -vt 0.89069 0.956719 -v -548.499 24231 -1185.3 -vt 0.938903 0.956719 -v -548.499 24231 -1652.18 -vt 0.938903 0.960841 -v -548.499 30351 -1652.18 -vt 0.89069 0.960841 -o mesh187 -s off -f 957/957/957 958/958/958 959/959/959 -f 957/957/957 959/959/959 960/960/960 -g charts -o chart0000 -s off -f 957/957/957 958/958/958 959/959/959 -f 957/957/957 959/959/959 960/960/960 -v 16429 4955.99 -1365.3 -vt 0.681214 0.894889 -v 16429 8180.99 -1365.3 -vt 0.655445 0.894889 -v 16429 8180.99 -285.3 -vt 0.655445 0.88582 -v 16429 4955.99 -285.3 -vt 0.681214 0.88582 -o mesh188 -s off -f 961/961/961 962/962/962 963/963/963 -f 961/961/961 963/963/963 964/964/964 -g charts -o chart0000 -s off -f 961/961/961 962/962/962 963/963/963 -f 961/961/961 963/963/963 964/964/964 -v 16429 25026 -1365.3 -vt 0.986284 0.596455 -v 10669 25026 -1365.3 -vt 0.986284 0.641797 -v 10669 25026 -285.3 -vt 0.995428 0.641797 -v 16429 25026 -285.3 -vt 0.995428 0.596455 -o mesh189 -s off -f 965/965/965 966/966/966 967/967/967 -f 965/965/965 967/967/967 968/968/968 -g charts -o chart0000 -s off -f 965/965/965 966/966/966 967/967/967 -f 965/965/965 967/967/967 968/968/968 -v 10669 4955.99 -1365.3 -vt 0.770158 0.992168 -v 16429 4955.99 -1365.3 -vt 0.724439 0.992168 -v 16429 4955.99 -285.3 -vt 0.724439 0.9831 -v 10669 4955.99 -285.3 -vt 0.770158 0.9831 -o mesh190 -s off -f 969/969/969 970/970/970 971/971/971 -f 969/969/969 971/971/971 972/972/972 -g charts -o chart0000 -s off -f 969/969/969 970/970/970 971/971/971 -f 969/969/969 971/971/971 972/972/972 -v 10669 5855.99 -1365.3 -vt 0.951371 0.297197 -v 10669 4955.99 -1365.3 -vt 0.951371 0.304617 -v 10669 4955.99 -285.3 -vt 0.942228 0.304617 -v 10669 5855.99 -285.3 -vt 0.942228 0.297197 -o mesh191 -s off -f 973/973/973 974/974/974 975/975/975 -f 973/973/973 975/975/975 976/976/976 -g charts -o chart0000 -s off -f 973/973/973 974/974/974 975/975/975 -f 973/973/973 975/975/975 976/976/976 -v 19129 8180.99 -1365.3 -vt 0.879884 0.724237 -v 19129 13941 -1365.3 -vt 0.879884 0.678895 -v 19129 13941 -285.3 -vt 0.87074 0.678895 -v 19129 8180.99 -285.3 -vt 0.87074 0.724237 -o mesh192 -s off -f 977/977/977 978/978/978 979/979/979 -f 977/977/977 979/979/979 980/980/980 -g charts -o chart0000 -s off -f 977/977/977 978/978/978 979/979/979 -f 977/977/977 979/979/979 980/980/980 -v 16429 8180.99 -1365.3 -vt 0.743558 0.596455 -v 19129 8180.99 -1365.3 -vt 0.721945 0.596455 -v 19129 8180.99 -285.3 -vt 0.721945 0.587387 -v 16429 8180.99 -285.3 -vt 0.743558 0.587387 -o mesh193 -s off -f 981/981/981 982/982/982 983/983/983 -f 981/981/981 983/983/983 984/984/984 -g charts -o chart0000 -s off -f 981/981/981 982/982/982 983/983/983 -f 981/981/981 983/983/983 984/984/984 -v 9769 5855.99 -1365.3 -vt 0.514131 0.702803 -v 10669 5855.99 -1365.3 -vt 0.514131 0.710222 -v 10669 5855.99 -285.3 -vt 0.504988 0.710222 -v 9769 5855.99 -285.3 -vt 0.504988 0.702803 -o mesh194 -s off -f 985/985/985 986/986/986 987/987/987 -f 985/985/985 987/987/987 988/988/988 -g charts -o chart0000 -s off -f 985/985/985 986/986/986 987/987/987 -f 985/985/985 987/987/987 988/988/988 -v -660.999 4955.99 -285.3 -vt 0.653782 0.83141 -v 4719 4955.99 -285.3 -vt 0.643807 0.789988 -v 4719 6215.99 -285.3 -vt 0.653782 0.787716 -v -660.999 4955.99 -285.3 -vt 0.4335 0.252679 -v 4719 6215.99 -285.3 -vt 0.443475 0.210636 -v 9769 6215.99 -285.3 -vt 0.443475 0.171172 -v 9769 5855.99 -285.3 -vt 0.440625 0.171172 -v 10669 5855.99 -285.3 -vt 0.440625 0.164139 -v 10669 4955.99 -285.3 -vt 0.4335 0.164139 -v 16429 4955.99 -285.3 -vt 0.4335 0.119126 -v -660.999 4955.99 -285.3 -vt 0.000415628 0.305441 -v 16429 4955.99 -285.3 -vt 0.000415628 0.438994 -v 16429 8180.99 -285.3 -vt 0.0261845 0.438994 -v -660.999 4955.99 -285.3 -vt 0.624688 0.462902 -v 16429 8180.99 -285.3 -vt 0.764544 0.459438 -v 19129 8180.99 -285.3 -vt 0.785981 0.462902 -v 19129 13941 -285.3 -vt 0.793433 0.417562 -v 16429 13941 -285.3 -vt 0.771997 0.414099 -v 16429 25026 -285.3 -vt 0.786339 0.326844 -v 10669 25026 -285.3 -vt 0.740608 0.319456 -v -660.999 4955.99 -285.3 -vt 0.429343 0.518961 -v 10669 25026 -285.3 -vt 0.226517 0.518961 -v 10669 16791 -285.3 -vt 0.289627 0.483512 -v 9769 16791 -285.3 -vt 0.293521 0.490375 -v 9769 16431 -285.3 -vt 0.29628 0.488825 -v -660.999 4955.99 -285.3 -vt 0.157523 0.676422 -v 9769 16431 -285.3 -vt 0.0453034 0.627111 -v -5711 16431 -285.3 -vt 0.157523 0.578318 -v -660.999 4955.99 -285.3 -vt 0.356193 0.453009 -v -5711 16431 -285.3 -vt 0.238337 0.446423 -v -5711 16791 -285.3 -vt 0.23531 0.444765 -v -6611 16791 -285.3 -vt 0.231505 0.453009 -v -660.999 4955.99 -285.3 -vt 0.140898 0.581616 -v -6611 16791 -285.3 -vt 0.0703819 0.495649 -v -6611 17871 -285.3 -vt 0.0683997 0.48681 -v -11831 17871 -285.3 -vt 0.0255919 0.496371 -v -13976 17871 -285.3 -vt 0.0080013 0.5003 -v -13976 13941 -285.3 -vt 0.0152142 0.532466 -v -15071 13941 -285.3 -vt 0.00623441 0.534472 -v -15071 8180.99 -285.3 -vt 0.016806 0.581616 -v -12371 8180.99 -285.3 -vt 0.038948 0.57667 -v -660.999 4955.99 -285.3 -vt 0.660432 0.8446 -v -12371 8180.99 -285.3 -vt 0.594918 0.77535 -v -12371 4955.99 -285.3 -vt 0.581686 0.796887 -v -12191 4955.99 -285.3 -vt 0.582897 0.79762 -v -12191 -2079.01 -285.3 -vt 0.554032 0.8446 -v -660.999 4955.99 -285.3 -vt 0.107647 0.154575 -v -12191 -2079.01 -285.3 -vt 0.0865772 0.304981 -v -16856 -2079.01 -285.3 -vt 0.107647 0.353084 -v -16856 -8559.01 -285.3 -vt 0.0402708 0.38211 -v -8216 -8559.01 -285.3 -vt 0.00124688 0.293018 -v -8216 -2244.01 -285.3 -vt 0.0669079 0.264731 -v -6791 -2244.01 -285.3 -vt 0.0604717 0.250037 -v -660.999 4955.99 -285.3 -vt 0.00124688 0.159574 -v -6791 -2244.01 -285.3 -vt 0.0502909 0.216406 -v -6791 4955.99 -285.3 -vt 0.0502909 0.159574 -v -6611 4955.99 -285.3 -vt 0.0488507 0.159574 -v -6611 5855.99 -285.3 -vt 0.0488507 0.152471 -v -5711 5855.99 -285.3 -vt 0.0416502 0.152471 -v -5711 6215.99 -285.3 -vt 0.0416502 0.149629 -v -660.999 6215.99 -285.3 -vt 0.00124688 0.149629 -o mesh195 -s off -f 989/989/989 990/990/990 991/991/991 -f 992/992/992 993/993/993 994/994/994 -f 992/992/992 994/994/994 995/995/995 -f 992/992/992 995/995/995 996/996/996 -f 992/992/992 996/996/996 997/997/997 -f 992/992/992 997/997/997 998/998/998 -f 999/999/999 1000/1000/1000 1001/1001/1001 -f 1002/1002/1002 1003/1003/1003 1004/1004/1004 -f 1002/1002/1002 1004/1004/1004 1005/1005/1005 -f 1002/1002/1002 1005/1005/1005 1006/1006/1006 -f 1002/1002/1002 1006/1006/1006 1007/1007/1007 -f 1002/1002/1002 1007/1007/1007 1008/1008/1008 -f 1009/1009/1009 1010/1010/1010 1011/1011/1011 -f 1009/1009/1009 1011/1011/1011 1012/1012/1012 -f 1009/1009/1009 1012/1012/1012 1013/1013/1013 -f 1014/1014/1014 1015/1015/1015 1016/1016/1016 -f 1017/1017/1017 1018/1018/1018 1019/1019/1019 -f 1017/1017/1017 1019/1019/1019 1020/1020/1020 -f 1021/1021/1021 1022/1022/1022 1023/1023/1023 -f 1021/1021/1021 1023/1023/1023 1024/1024/1024 -f 1021/1021/1021 1024/1024/1024 1025/1025/1025 -f 1021/1021/1021 1025/1025/1025 1026/1026/1026 -f 1021/1021/1021 1026/1026/1026 1027/1027/1027 -f 1021/1021/1021 1027/1027/1027 1028/1028/1028 -f 1021/1021/1021 1028/1028/1028 1029/1029/1029 -f 1030/1030/1030 1031/1031/1031 1032/1032/1032 -f 1030/1030/1030 1032/1032/1032 1033/1033/1033 -f 1030/1030/1030 1033/1033/1033 1034/1034/1034 -f 1035/1035/1035 1036/1036/1036 1037/1037/1037 -f 1035/1035/1035 1037/1037/1037 1038/1038/1038 -f 1035/1035/1035 1038/1038/1038 1039/1039/1039 -f 1035/1035/1035 1039/1039/1039 1040/1040/1040 -f 1035/1035/1035 1040/1040/1040 1041/1041/1041 -f 1042/1042/1042 1043/1043/1043 1044/1044/1044 -f 1042/1042/1042 1044/1044/1044 1045/1045/1045 -f 1042/1042/1042 1045/1045/1045 1046/1046/1046 -f 1042/1042/1042 1046/1046/1046 1047/1047/1047 -f 1042/1042/1042 1047/1047/1047 1048/1048/1048 -f 1042/1042/1042 1048/1048/1048 1049/1049/1049 -g charts -o chart0000 -s off -f 989/989/989 990/990/990 991/991/991 -o chart0001 -s off -f 992/992/992 993/993/993 994/994/994 -f 992/992/992 994/994/994 995/995/995 -f 992/992/992 995/995/995 996/996/996 -f 992/992/992 996/996/996 997/997/997 -f 992/992/992 997/997/997 998/998/998 -o chart0002 -s off -f 999/999/999 1000/1000/1000 1001/1001/1001 -o chart0003 -s off -f 1002/1002/1002 1003/1003/1003 1004/1004/1004 -f 1002/1002/1002 1004/1004/1004 1005/1005/1005 -f 1002/1002/1002 1005/1005/1005 1006/1006/1006 -f 1002/1002/1002 1006/1006/1006 1007/1007/1007 -f 1002/1002/1002 1007/1007/1007 1008/1008/1008 -o chart0004 -s off -f 1009/1009/1009 1010/1010/1010 1011/1011/1011 -f 1009/1009/1009 1011/1011/1011 1012/1012/1012 -f 1009/1009/1009 1012/1012/1012 1013/1013/1013 -o chart0005 -s off -f 1014/1014/1014 1015/1015/1015 1016/1016/1016 -o chart0006 -s off -f 1017/1017/1017 1018/1018/1018 1019/1019/1019 -f 1017/1017/1017 1019/1019/1019 1020/1020/1020 -o chart0007 -s off -f 1021/1021/1021 1022/1022/1022 1023/1023/1023 -f 1021/1021/1021 1023/1023/1023 1024/1024/1024 -f 1021/1021/1021 1024/1024/1024 1025/1025/1025 -f 1021/1021/1021 1025/1025/1025 1026/1026/1026 -f 1021/1021/1021 1026/1026/1026 1027/1027/1027 -f 1021/1021/1021 1027/1027/1027 1028/1028/1028 -f 1021/1021/1021 1028/1028/1028 1029/1029/1029 -o chart0008 -s off -f 1030/1030/1030 1031/1031/1031 1032/1032/1032 -f 1030/1030/1030 1032/1032/1032 1033/1033/1033 -f 1030/1030/1030 1033/1033/1033 1034/1034/1034 -o chart0009 -s off -f 1035/1035/1035 1036/1036/1036 1037/1037/1037 -f 1035/1035/1035 1037/1037/1037 1038/1038/1038 -f 1035/1035/1035 1038/1038/1038 1039/1039/1039 -f 1035/1035/1035 1039/1039/1039 1040/1040/1040 -f 1035/1035/1035 1040/1040/1040 1041/1041/1041 -o chart0010 -s off -f 1042/1042/1042 1043/1043/1043 1044/1044/1044 -f 1042/1042/1042 1044/1044/1044 1045/1045/1045 -f 1042/1042/1042 1045/1045/1045 1046/1046/1046 -f 1042/1042/1042 1046/1046/1046 1047/1047/1047 -f 1042/1042/1042 1047/1047/1047 1048/1048/1048 -f 1042/1042/1042 1048/1048/1048 1049/1049/1049 -v -660.999 4955.99 -1365.3 -vt 0.289692 0.842951 -v 4719 4955.99 -1365.3 -vt 0.247298 0.842951 -v 4719 4955.99 -285.3 -vt 0.247298 0.833883 -v -660.999 4955.99 -285.3 -vt 0.289692 0.833883 -o mesh196 -s off -f 1050/1050/1050 1051/1051/1051 1052/1052/1052 -f 1050/1050/1050 1052/1052/1052 1053/1053/1053 -g charts -o chart0000 -s off -f 1050/1050/1050 1051/1051/1051 1052/1052/1052 -f 1050/1050/1050 1052/1052/1052 1053/1053/1053 -v -8216 -2244.01 -1365.3 -vt 0.729426 0.3277 -v -6791 -2244.01 -1365.3 -vt 0.717789 0.3277 -v -6791 -2244.01 -285.3 -vt 0.717789 0.318632 -v -8216 -2244.01 -285.3 -vt 0.729426 0.318632 -o mesh197 -s off -f 1054/1054/1054 1055/1055/1055 1056/1056/1056 -f 1054/1054/1054 1056/1056/1056 1057/1057/1057 -g charts -o chart0000 -s off -f 1054/1054/1054 1055/1055/1055 1056/1056/1056 -f 1054/1054/1054 1056/1056/1056 1057/1057/1057 -v -8216 -8559.01 -1365.3 -vt 0.963009 0.122424 -v -8216 -2244.01 -1365.3 -vt 0.963009 0.0729596 -v -8216 -2244.01 -285.3 -vt 0.953865 0.0729596 -v -8216 -8559.01 -285.3 -vt 0.953865 0.122424 -o mesh198 -s off -f 1058/1058/1058 1059/1059/1059 1060/1060/1060 -f 1058/1058/1058 1060/1060/1060 1061/1061/1061 -g charts -o chart0000 -s off -f 1058/1058/1058 1059/1059/1059 1060/1060/1060 -f 1058/1058/1058 1060/1060/1060 1061/1061/1061 -v -6791 4955.99 -1365.3 -vt 0.673732 0.654163 -v -6611 4955.99 -1365.3 -vt 0.675395 0.654163 -v -6611 4955.99 -285.3 -vt 0.675395 0.645095 -v -6791 4955.99 -285.3 -vt 0.673732 0.645095 -o mesh199 -s off -f 1062/1062/1062 1063/1063/1063 1064/1064/1064 -f 1062/1062/1062 1064/1064/1064 1065/1065/1065 -g charts -o chart0000 -s off -f 1062/1062/1062 1063/1063/1063 1064/1064/1064 -f 1062/1062/1062 1064/1064/1064 1065/1065/1065 -v -5711 5855.99 -1365.3 -vt 0.164173 0.665705 -v -5711 6215.99 -1365.3 -vt 0.167498 0.665705 -v -5711 6215.99 -285.3 -vt 0.167498 0.656636 -v -5711 5855.99 -285.3 -vt 0.164173 0.656636 -o mesh200 -s off -f 1066/1066/1066 1067/1067/1067 1068/1068/1068 -f 1066/1066/1066 1068/1068/1068 1069/1069/1069 -g charts -o chart0000 -s off -f 1066/1066/1066 1067/1067/1067 1068/1068/1068 -f 1066/1066/1066 1068/1068/1068 1069/1069/1069 -v -6611 5855.99 -1365.3 -vt 0.18246 0.955894 -v -5711 5855.99 -1365.3 -vt 0.18246 0.963314 -v -5711 5855.99 -285.3 -vt 0.173317 0.963314 -v -6611 5855.99 -285.3 -vt 0.173317 0.955894 -o mesh201 -s off -f 1070/1070/1070 1071/1071/1071 1072/1072/1072 -f 1070/1070/1070 1072/1072/1072 1073/1073/1073 -g charts -o chart0000 -s off -f 1070/1070/1070 1071/1071/1071 1072/1072/1072 -f 1070/1070/1070 1072/1072/1072 1073/1073/1073 -v -16856 -8559.01 -1365.3 -vt 0.485037 0.626133 -v -8216 -8559.01 -1365.3 -vt 0.416874 0.626133 -v -8216 -8559.01 -285.3 -vt 0.416874 0.617065 -v -16856 -8559.01 -285.3 -vt 0.485037 0.617065 -o mesh202 -s off -f 1074/1074/1074 1075/1075/1075 1076/1076/1076 -f 1074/1074/1074 1076/1076/1076 1077/1077/1077 -g charts -o chart0000 -s off -f 1074/1074/1074 1075/1075/1075 1076/1076/1076 -f 1074/1074/1074 1076/1076/1076 1077/1077/1077 -v -5711 6215.99 -1365.3 -vt 0.255611 0.981451 -v -660.999 6215.99 -1365.3 -vt 0.215711 0.981451 -v -660.999 6215.99 -285.3 -vt 0.215711 0.972383 -v -5711 6215.99 -285.3 -vt 0.255611 0.972383 -o mesh203 -s off -f 1078/1078/1078 1079/1079/1079 1080/1080/1080 -f 1078/1078/1078 1080/1080/1080 1081/1081/1081 -g charts -o chart0000 -s off -f 1078/1078/1078 1079/1079/1079 1080/1080/1080 -f 1078/1078/1078 1080/1080/1080 1081/1081/1081 -v -6791 -2244.01 -1365.3 -vt 0.67207 0.658285 -v -6791 4955.99 -1365.3 -vt 0.67207 0.601402 -v -6791 4955.99 -285.3 -vt 0.662926 0.601402 -v -6791 -2244.01 -285.3 -vt 0.662926 0.658285 -o mesh204 -s off -f 1082/1082/1082 1083/1083/1083 1084/1084/1084 -f 1082/1082/1082 1084/1084/1084 1085/1085/1085 -g charts -o chart0000 -s off -f 1082/1082/1082 1083/1083/1083 1084/1084/1084 -f 1082/1082/1082 1084/1084/1084 1085/1085/1085 -v -6611 4955.99 -1365.3 -vt 0.625519 0.463726 -v -6611 5855.99 -1365.3 -vt 0.625519 0.471146 -v -6611 5855.99 -285.3 -vt 0.616376 0.471146 -v -6611 4955.99 -285.3 -vt 0.616376 0.463726 -o mesh205 -s off -f 1086/1086/1086 1087/1087/1087 1088/1088/1088 -f 1086/1086/1086 1088/1088/1088 1089/1089/1089 -g charts -o chart0000 -s off -f 1086/1086/1086 1087/1087/1087 1088/1088/1088 -f 1086/1086/1086 1088/1088/1088 1089/1089/1089 -v -13976 13941 -285.3 -vt 0.187448 0.929514 -v -13976 17871 -285.3 -vt 0.187448 0.898186 -v -13976 17871 -1365.3 -vt 0.178304 0.898186 -v -13976 13941 -1365.3 -vt 0.178304 0.929514 -o mesh206 -s off -f 1090/1090/1090 1091/1091/1091 1092/1092/1092 -f 1090/1090/1090 1092/1092/1092 1093/1093/1093 -g charts -o chart0000 -s off -f 1090/1090/1090 1091/1091/1091 1092/1092/1092 -f 1090/1090/1090 1092/1092/1092 1093/1093/1093 -v 16429 13941 -1365.3 -vt 0.97049 0.95507 -v 16429 25026 -1365.3 -vt 0.883209 0.95507 -v 16429 25026 -285.3 -vt 0.883209 0.946002 -v 16429 13941 -285.3 -vt 0.97049 0.946002 -o mesh207 -s off -f 1094/1094/1094 1095/1095/1095 1096/1096/1096 -f 1094/1094/1094 1096/1096/1096 1097/1097/1097 -g charts -o chart0000 -s off -f 1094/1094/1094 1095/1095/1095 1096/1096/1096 -f 1094/1094/1094 1096/1096/1096 1097/1097/1097 -v 19129 13941 -1365.3 -vt 0.0802161 0.899835 -v 16429 13941 -1365.3 -vt 0.101829 0.899835 -v 16429 13941 -285.3 -vt 0.101829 0.908903 -v 19129 13941 -285.3 -vt 0.0802161 0.908903 -o mesh208 -s off -f 1098/1098/1098 1099/1099/1099 1100/1100/1100 -f 1098/1098/1098 1100/1100/1100 1101/1101/1101 -g charts -o chart0000 -s off -f 1098/1098/1098 1099/1099/1099 1100/1100/1100 -f 1098/1098/1098 1100/1100/1100 1101/1101/1101 -v 10669 25026 -1365.3 -vt 0.982128 0.413438 -v 10669 16791 -1365.3 -vt 0.982128 0.478565 -v 10669 16791 -285.3 -vt 0.991272 0.478565 -v 10669 25026 -285.3 -vt 0.991272 0.413438 -o mesh209 -s off -f 1102/1102/1102 1103/1103/1103 1104/1104/1104 -f 1102/1102/1102 1104/1104/1104 1105/1105/1105 -g charts -o chart0000 -s off -f 1102/1102/1102 1103/1103/1103 1104/1104/1104 -f 1102/1102/1102 1104/1104/1104 1105/1105/1105 -v 10669 16791 -1365.3 -vt 0.469243 0.481039 -v 9769 16791 -1365.3 -vt 0.469243 0.488458 -v 9769 16791 -285.3 -vt 0.4601 0.488458 -v 10669 16791 -285.3 -vt 0.4601 0.481039 -o mesh210 -s off -f 1106/1106/1106 1107/1107/1107 1108/1108/1108 -f 1106/1106/1106 1108/1108/1108 1109/1109/1109 -g charts -o chart0000 -s off -f 1106/1106/1106 1107/1107/1107 1108/1108/1108 -f 1106/1106/1106 1108/1108/1108 1109/1109/1109 -v 9769 16791 -1365.3 -vt 0.454281 0.928689 -v 9769 16431 -1365.3 -vt 0.454281 0.931987 -v 9769 16431 -285.3 -vt 0.445137 0.931987 -v 9769 16791 -285.3 -vt 0.445137 0.928689 -o mesh211 -s off -f 1110/1110/1110 1111/1111/1111 1112/1112/1112 -f 1110/1110/1110 1112/1112/1112 1113/1113/1113 -g charts -o chart0000 -s off -f 1110/1110/1110 1111/1111/1111 1112/1112/1112 -f 1110/1110/1110 1112/1112/1112 1113/1113/1113 -v 9769 6215.99 -1365.3 -vt 0.435162 0.160346 -v 9769 5855.99 -1365.3 -vt 0.438487 0.160346 -v 9769 5855.99 -285.3 -vt 0.438487 0.151278 -v 9769 6215.99 -285.3 -vt 0.435162 0.151278 -o mesh212 -s off -f 1114/1114/1114 1115/1115/1115 1116/1116/1116 -f 1114/1114/1114 1116/1116/1116 1117/1117/1117 -g charts -o chart0000 -s off -f 1114/1114/1114 1115/1115/1115 1116/1116/1116 -f 1114/1114/1114 1116/1116/1116 1117/1117/1117 -v -13976 13941 -1365.3 -vt 0.929759 0.339242 -v -15071 13941 -1365.3 -vt 0.938903 0.339242 -v -15071 13941 -285.3 -vt 0.938903 0.34831 -v -13976 13941 -285.3 -vt 0.929759 0.34831 -o mesh213 -s off -f 1118/1118/1118 1119/1119/1119 1120/1120/1120 -f 1118/1118/1118 1120/1120/1120 1121/1121/1121 -g charts -o chart0000 -s off -f 1118/1118/1118 1119/1119/1119 1120/1120/1120 -f 1118/1118/1118 1120/1120/1120 1121/1121/1121 -v 4719 6215.99 -1365.3 -vt 0.384455 0.835532 -v 9769 6215.99 -1365.3 -vt 0.384455 0.79596 -v 9769 6215.99 -285.3 -vt 0.375312 0.79596 -v 4719 6215.99 -285.3 -vt 0.375312 0.835532 -o mesh214 -s off -f 1122/1122/1122 1123/1123/1123 1124/1124/1124 -f 1122/1122/1122 1124/1124/1124 1125/1125/1125 -g charts -o chart0000 -s off -f 1122/1122/1122 1123/1123/1123 1124/1124/1124 -f 1122/1122/1122 1124/1124/1124 1125/1125/1125 -v -15071 8180.99 -1365.3 -vt 0.969659 0.763809 -v -12371 8180.99 -1365.3 -vt 0.948047 0.763809 -v -12371 8180.99 -285.3 -vt 0.948047 0.75474 -v -15071 8180.99 -285.3 -vt 0.969659 0.75474 -o mesh215 -s off -f 1126/1126/1126 1127/1127/1127 1128/1128/1128 -f 1126/1126/1126 1128/1128/1128 1129/1129/1129 -g charts -o chart0000 -s off -f 1126/1126/1126 1127/1127/1127 1128/1128/1128 -f 1126/1126/1126 1128/1128/1128 1129/1129/1129 -v -15071 13941 -1365.3 -vt 0.501662 0.323578 -v -15071 8180.99 -1365.3 -vt 0.501662 0.36892 -v -15071 8180.99 -285.3 -vt 0.510806 0.36892 -v -15071 13941 -285.3 -vt 0.510806 0.323578 -o mesh216 -s off -f 1130/1130/1130 1131/1131/1131 1132/1132/1132 -f 1130/1130/1130 1132/1132/1132 1133/1133/1133 -g charts -o chart0000 -s off -f 1130/1130/1130 1131/1131/1131 1132/1132/1132 -f 1130/1130/1130 1132/1132/1132 1133/1133/1133 -v -5711 16431 -1365.3 -vt 0.826683 0.310387 -v -5711 16791 -1365.3 -vt 0.826683 0.313685 -v -5711 16791 -285.3 -vt 0.81754 0.313685 -v -5711 16431 -285.3 -vt 0.81754 0.310387 -o mesh217 -s off -f 1134/1134/1134 1135/1135/1135 1136/1136/1136 -f 1134/1134/1134 1136/1136/1136 1137/1137/1137 -g charts -o chart0000 -s off -f 1134/1134/1134 1135/1135/1135 1136/1136/1136 -f 1134/1134/1134 1136/1136/1136 1137/1137/1137 -v -5711 16791 -1365.3 -vt 0.691189 0.528854 -v -6611 16791 -1365.3 -vt 0.691189 0.536274 -v -6611 16791 -285.3 -vt 0.682045 0.536274 -v -5711 16791 -285.3 -vt 0.682045 0.528854 -o mesh218 -s off -f 1138/1138/1138 1139/1139/1139 1140/1140/1140 -f 1138/1138/1138 1140/1140/1140 1141/1141/1141 -g charts -o chart0000 -s off -f 1138/1138/1138 1139/1139/1139 1140/1140/1140 -f 1138/1138/1138 1140/1140/1140 1141/1141/1141 -v 4719 4955.99 -1365.3 -vt 0.647963 0.617889 -v 4719 6215.99 -1365.3 -vt 0.647963 0.607997 -v 4719 6215.99 -285.3 -vt 0.63882 0.607997 -v 4719 4955.99 -285.3 -vt 0.63882 0.617889 -o mesh219 -s off -f 1142/1142/1142 1143/1143/1143 1144/1144/1144 -f 1142/1142/1142 1144/1144/1144 1145/1145/1145 -g charts -o chart0000 -s off -f 1142/1142/1142 1143/1143/1143 1144/1144/1144 -f 1142/1142/1142 1144/1144/1144 1145/1145/1145 -v 9769 16431 -1365.3 -vt 0.887365 0.535449 -v -5711 16431 -1365.3 -vt 0.887365 0.414262 -v -5711 16431 -285.3 -vt 0.896509 0.414262 -v 9769 16431 -285.3 -vt 0.896509 0.535449 -o mesh220 -s off -f 1146/1146/1146 1147/1147/1147 1148/1148/1148 -f 1146/1146/1146 1148/1148/1148 1149/1149/1149 -g charts -o chart0000 -s off -f 1146/1146/1146 1147/1147/1147 1148/1148/1148 -f 1146/1146/1146 1148/1148/1148 1149/1149/1149 -v -12371 8180.99 -1365.3 -vt 0.212386 0.528854 -v -12371 4955.99 -1365.3 -vt 0.238155 0.528854 -v -12371 4955.99 -285.3 -vt 0.238155 0.537922 -v -12371 8180.99 -285.3 -vt 0.212386 0.537922 -o mesh221 -s off -f 1150/1150/1150 1151/1151/1151 1152/1152/1152 -f 1150/1150/1150 1152/1152/1152 1153/1153/1153 -g charts -o chart0000 -s off -f 1150/1150/1150 1151/1151/1151 1152/1152/1152 -f 1150/1150/1150 1152/1152/1152 1153/1153/1153 -v -12371 4955.99 -1365.3 -vt 0.319618 0.978978 -v -12191 4955.99 -1365.3 -vt 0.319618 0.980626 -v -12191 4955.99 -285.3 -vt 0.310474 0.980626 -v -12371 4955.99 -285.3 -vt 0.310474 0.978978 -o mesh222 -s off -f 1154/1154/1154 1155/1155/1155 1156/1156/1156 -f 1154/1154/1154 1156/1156/1156 1157/1157/1157 -g charts -o chart0000 -s off -f 1154/1154/1154 1155/1155/1155 1156/1156/1156 -f 1154/1154/1154 1156/1156/1156 1157/1157/1157 -v -12191 4955.99 -1365.3 -vt 0.587282 0.335944 -v -12191 -2079.01 -1365.3 -vt 0.642976 0.335944 -v -12191 -2079.01 -285.3 -vt 0.642976 0.345012 -v -12191 4955.99 -285.3 -vt 0.587282 0.345012 -o mesh223 -s off -f 1158/1158/1158 1159/1159/1159 1160/1160/1160 -f 1158/1158/1158 1160/1160/1160 1161/1161/1161 -g charts -o chart0000 -s off -f 1158/1158/1158 1159/1159/1159 1160/1160/1160 -f 1158/1158/1158 1160/1160/1160 1161/1161/1161 -v -12191 -2079.01 -1365.3 -vt 0.00706567 0.612119 -v -16856 -2079.01 -1365.3 -vt 0.00706567 0.649217 -v -16856 -2079.01 -285.3 -vt 0.0162094 0.649217 -v -12191 -2079.01 -285.3 -vt 0.0162094 0.612119 -o mesh224 -s off -f 1162/1162/1162 1163/1163/1163 1164/1164/1164 -f 1162/1162/1162 1164/1164/1164 1165/1165/1165 -g charts -o chart0000 -s off -f 1162/1162/1162 1163/1163/1163 1164/1164/1164 -f 1162/1162/1162 1164/1164/1164 1165/1165/1165 -v -16856 -2079.01 -1365.3 -vt 0.977972 0.0152514 -v -16856 -8559.01 -1365.3 -vt 0.977972 0.0663643 -v -16856 -8559.01 -285.3 -vt 0.987115 0.0663643 -v -16856 -2079.01 -285.3 -vt 0.987115 0.0152514 -o mesh225 -s off -f 1166/1166/1166 1167/1167/1167 1168/1168/1168 -f 1166/1166/1166 1168/1168/1168 1169/1169/1169 -g charts -o chart0000 -s off -f 1166/1166/1166 1167/1167/1167 1168/1168/1168 -f 1166/1166/1166 1168/1168/1168 1169/1169/1169 -v -660.999 6215.99 -1365.3 -vt 0.810058 0.334295 -v -660.999 4955.99 -1365.3 -vt 0.810058 0.344188 -v -660.999 4955.99 -285.3 -vt 0.819202 0.344188 -v -660.999 6215.99 -285.3 -vt 0.819202 0.334295 -o mesh226 -s off -f 1170/1170/1170 1171/1171/1171 1172/1172/1172 -f 1170/1170/1170 1172/1172/1172 1173/1173/1173 -g charts -o chart0000 -s off -f 1170/1170/1170 1171/1171/1171 1172/1172/1172 -f 1170/1170/1170 1172/1172/1172 1173/1173/1173 -v 4719 4955.99 -1365.3 -vt 0.501662 0.420033 -v -660.999 4955.99 -1365.3 -vt 0.544056 0.420033 -v -660.999 6215.99 -1365.3 -vt 0.544056 0.429926 -v 4719 4955.99 -1365.3 -vt 0.168329 0.322753 -v -660.999 6215.99 -1365.3 -vt 0.13704 0.353248 -v -5711 6215.99 -1365.3 -vt 0.115671 0.386784 -v -5711 5855.99 -1365.3 -vt 0.118106 0.38828 -v -6611 5855.99 -1365.3 -vt 0.114298 0.394257 -v -6611 4955.99 -1365.3 -vt 0.120386 0.397996 -v -6791 4955.99 -1365.3 -vt 0.119624 0.399191 -v -6791 -2244.01 -1365.3 -vt 0.168329 0.429101 -v 4719 4955.99 -1365.3 -vt 0.637988 0.710222 -v -6791 -2244.01 -1365.3 -vt 0.756109 0.680611 -v -8216 -2244.01 -1365.3 -vt 0.764953 0.671476 -v -8216 -8559.01 -1365.3 -vt 0.805902 0.710222 -v 4719 4955.99 -1365.3 -vt 0.258936 0.485985 -v -8216 -8559.01 -1365.3 -vt 0.110796 0.406843 -v -16856 -8559.01 -1365.3 -vt 0.0369909 0.430824 -v -16856 -2079.01 -1365.3 -vt 0.0550403 0.485985 -v -12191 -2079.01 -1365.3 -vt 0.0948902 0.473037 -v 4719 4955.99 -1365.3 -vt 0.657107 0.634377 -v -12191 -2079.01 -1365.3 -vt 0.536349 0.555235 -v -12191 4955.99 -1365.3 -vt 0.526061 0.609681 -v -12371 4955.99 -1365.3 -vt 0.524666 0.609418 -v -12371 8180.99 -1365.3 -vt 0.51995 0.634377 -v 4719 4955.99 -1365.3 -vt 0.427681 0.526381 -v -12371 8180.99 -1365.3 -vt 0.576493 0.522678 -v -15071 8180.99 -1365.3 -vt 0.599302 0.526381 -v -15071 13941 -1365.3 -vt 0.607232 0.477903 -v -13976 13941 -1365.3 -vt 0.597982 0.476401 -v -13976 17871 -1365.3 -vt 0.603392 0.443325 -v -6611 17871 -1365.3 -vt 0.541174 0.433223 -v -6611 16791 -1365.3 -vt 0.539687 0.442313 -v -5711 16791 -1365.3 -vt 0.532084 0.441079 -v -5711 16431 -1365.3 -vt 0.531588 0.444109 -v 4719 4955.99 -1365.3 -vt 0.806733 0.669827 -v -5711 16431 -1365.3 -vt 0.694514 0.620516 -v 9769 16431 -1365.3 -vt 0.806733 0.571723 -v 4719 4955.99 -1365.3 -vt 0.165004 0.296373 -v 9769 16431 -1365.3 -vt 0.27194 0.343176 -v 9769 16791 -1365.3 -vt 0.275295 0.343176 -v 10669 16791 -1365.3 -vt 0.275295 0.351518 -v 10669 25026 -1365.3 -vt 0.352036 0.351518 -v 16429 25026 -1365.3 -vt 0.352036 0.404902 -v 16429 13941 -1365.3 -vt 0.248735 0.404902 -v 19129 13941 -1365.3 -vt 0.248735 0.429926 -v 19129 8180.99 -1365.3 -vt 0.195058 0.429926 -v 16429 8180.99 -1365.3 -vt 0.195058 0.404902 -v 4719 4955.99 -1365.3 -vt 0.630507 0.881698 -v 16429 8180.99 -1365.3 -vt 0.515794 0.850371 -v 16429 4955.99 -1365.3 -vt 0.515794 0.881698 -v 10669 4955.99 -1365.3 -vt 0.57222 0.881698 -v 10669 5855.99 -1365.3 -vt 0.57222 0.872956 -v 9769 5855.99 -1365.3 -vt 0.581036 0.872956 -v 9769 6215.99 -1365.3 -vt 0.581036 0.869459 -v 4719 4955.99 -1365.3 -vt 0.692851 0.321929 -v 9769 6215.99 -1365.3 -vt 0.702826 0.3615 -v 4719 6215.99 -1365.3 -vt 0.702826 0.321929 -o mesh227 -s off -f 1174/1174/1174 1175/1175/1175 1176/1176/1176 -f 1177/1177/1177 1178/1178/1178 1179/1179/1179 -f 1177/1177/1177 1179/1179/1179 1180/1180/1180 -f 1177/1177/1177 1180/1180/1180 1181/1181/1181 -f 1177/1177/1177 1181/1181/1181 1182/1182/1182 -f 1177/1177/1177 1182/1182/1182 1183/1183/1183 -f 1177/1177/1177 1183/1183/1183 1184/1184/1184 -f 1185/1185/1185 1186/1186/1186 1187/1187/1187 -f 1185/1185/1185 1187/1187/1187 1188/1188/1188 -f 1189/1189/1189 1190/1190/1190 1191/1191/1191 -f 1189/1189/1189 1191/1191/1191 1192/1192/1192 -f 1189/1189/1189 1192/1192/1192 1193/1193/1193 -f 1194/1194/1194 1195/1195/1195 1196/1196/1196 -f 1194/1194/1194 1196/1196/1196 1197/1197/1197 -f 1194/1194/1194 1197/1197/1197 1198/1198/1198 -f 1199/1199/1199 1200/1200/1200 1201/1201/1201 -f 1199/1199/1199 1201/1201/1201 1202/1202/1202 -f 1199/1199/1199 1202/1202/1202 1203/1203/1203 -f 1199/1199/1199 1203/1203/1203 1204/1204/1204 -f 1199/1199/1199 1204/1204/1204 1205/1205/1205 -f 1199/1199/1199 1205/1205/1205 1206/1206/1206 -f 1199/1199/1199 1206/1206/1206 1207/1207/1207 -f 1199/1199/1199 1207/1207/1207 1208/1208/1208 -f 1209/1209/1209 1210/1210/1210 1211/1211/1211 -f 1212/1212/1212 1213/1213/1213 1214/1214/1214 -f 1212/1212/1212 1214/1214/1214 1215/1215/1215 -f 1212/1212/1212 1215/1215/1215 1216/1216/1216 -f 1212/1212/1212 1216/1216/1216 1217/1217/1217 -f 1212/1212/1212 1217/1217/1217 1218/1218/1218 -f 1212/1212/1212 1218/1218/1218 1219/1219/1219 -f 1212/1212/1212 1219/1219/1219 1220/1220/1220 -f 1212/1212/1212 1220/1220/1220 1221/1221/1221 -f 1222/1222/1222 1223/1223/1223 1224/1224/1224 -f 1222/1222/1222 1224/1224/1224 1225/1225/1225 -f 1222/1222/1222 1225/1225/1225 1226/1226/1226 -f 1222/1222/1222 1226/1226/1226 1227/1227/1227 -f 1222/1222/1222 1227/1227/1227 1228/1228/1228 -f 1229/1229/1229 1230/1230/1230 1231/1231/1231 -g charts -o chart0000 -s off -f 1174/1174/1174 1175/1175/1175 1176/1176/1176 -o chart0001 -s off -f 1177/1177/1177 1178/1178/1178 1179/1179/1179 -f 1177/1177/1177 1179/1179/1179 1180/1180/1180 -f 1177/1177/1177 1180/1180/1180 1181/1181/1181 -f 1177/1177/1177 1181/1181/1181 1182/1182/1182 -f 1177/1177/1177 1182/1182/1182 1183/1183/1183 -f 1177/1177/1177 1183/1183/1183 1184/1184/1184 -o chart0002 -s off -f 1185/1185/1185 1186/1186/1186 1187/1187/1187 -f 1185/1185/1185 1187/1187/1187 1188/1188/1188 -o chart0003 -s off -f 1189/1189/1189 1190/1190/1190 1191/1191/1191 -f 1189/1189/1189 1191/1191/1191 1192/1192/1192 -f 1189/1189/1189 1192/1192/1192 1193/1193/1193 -o chart0004 -s off -f 1194/1194/1194 1195/1195/1195 1196/1196/1196 -f 1194/1194/1194 1196/1196/1196 1197/1197/1197 -f 1194/1194/1194 1197/1197/1197 1198/1198/1198 -o chart0005 -s off -f 1199/1199/1199 1200/1200/1200 1201/1201/1201 -f 1199/1199/1199 1201/1201/1201 1202/1202/1202 -f 1199/1199/1199 1202/1202/1202 1203/1203/1203 -f 1199/1199/1199 1203/1203/1203 1204/1204/1204 -f 1199/1199/1199 1204/1204/1204 1205/1205/1205 -f 1199/1199/1199 1205/1205/1205 1206/1206/1206 -f 1199/1199/1199 1206/1206/1206 1207/1207/1207 -f 1199/1199/1199 1207/1207/1207 1208/1208/1208 -o chart0006 -s off -f 1209/1209/1209 1210/1210/1210 1211/1211/1211 -o chart0007 -s off -f 1212/1212/1212 1213/1213/1213 1214/1214/1214 -f 1212/1212/1212 1214/1214/1214 1215/1215/1215 -f 1212/1212/1212 1215/1215/1215 1216/1216/1216 -f 1212/1212/1212 1216/1216/1216 1217/1217/1217 -f 1212/1212/1212 1217/1217/1217 1218/1218/1218 -f 1212/1212/1212 1218/1218/1218 1219/1219/1219 -f 1212/1212/1212 1219/1219/1219 1220/1220/1220 -f 1212/1212/1212 1220/1220/1220 1221/1221/1221 -o chart0008 -s off -f 1222/1222/1222 1223/1223/1223 1224/1224/1224 -f 1222/1222/1222 1224/1224/1224 1225/1225/1225 -f 1222/1222/1222 1225/1225/1225 1226/1226/1226 -f 1222/1222/1222 1226/1226/1226 1227/1227/1227 -f 1222/1222/1222 1227/1227/1227 1228/1228/1228 -o chart0009 -s off -f 1229/1229/1229 1230/1230/1230 1231/1231/1231 -v -13976 17871 -285.3 -vt 0.114298 0.593982 -v -11831 17871 -285.3 -vt 0.0973508 0.593982 -v -6611 17871 -285.3 -vt 0.0561097 0.593982 -v -6611 17871 -1365.3 -vt 0.0561097 0.584913 -v -13976 17871 -1365.3 -vt 0.114298 0.584913 -o mesh228 -s off -f 1232/1232/1232 1233/1233/1233 1234/1234/1234 -f 1232/1232/1232 1234/1234/1234 1235/1235/1235 -f 1232/1232/1232 1235/1235/1235 1236/1236/1236 -g charts -o chart0000 -s off -f 1232/1232/1232 1233/1233/1233 1234/1234/1234 -f 1232/1232/1232 1234/1234/1234 1235/1235/1235 -f 1232/1232/1232 1235/1235/1235 1236/1236/1236 -v -6611 16791 -285.3 -vt 0.603907 0.425804 -v -6611 16791 -1365.3 -vt 0.613051 0.425804 -v -6611 17871 -1365.3 -vt 0.613051 0.416735 -v -6611 17871 -285.3 -vt 0.603907 0.416735 -o mesh229 -s off -f 1237/1237/1237 1238/1238/1238 1239/1239/1239 -f 1237/1237/1237 1239/1239/1239 1240/1240/1240 -g charts -o chart0000 -s off -f 1237/1237/1237 1238/1238/1238 1239/1239/1239 -f 1237/1237/1237 1239/1239/1239 1240/1240/1240 -v -11831 16071 -1185.3 -vt 0.485037 0.410964 -v -8756 16071 -1185.3 -vt 0.4601 0.410964 -v -8756 16071 -105.3 -vt 0.4601 0.401896 -v -11831 16071 -105.3 -vt 0.485037 0.401896 -o mesh230 -s off -f 1241/1241/1241 1242/1242/1242 1243/1243/1243 -f 1241/1241/1241 1243/1243/1243 1244/1244/1244 -g charts -o chart0000 -s off -f 1241/1241/1241 1242/1242/1242 1243/1243/1243 -f 1241/1241/1241 1243/1243/1243 1244/1244/1244 -v -8756 16791 -105.3 -vt 0.465919 0.332646 -v -11831 16791 -105.3 -vt 0.490856 0.332646 -v -11831 16071 -105.3 -vt 0.490856 0.338417 -v -8756 16071 -105.3 -vt 0.465919 0.338417 -o mesh231 -s off -f 1245/1245/1245 1246/1246/1246 1247/1247/1247 -f 1245/1245/1245 1247/1247/1247 1248/1248/1248 -g charts -o chart0000 -s off -f 1245/1245/1245 1246/1246/1246 1247/1247/1247 -f 1245/1245/1245 1247/1247/1247 1248/1248/1248 -v -11831 16791 -1185.3 -vt 0.362843 0.448887 -v -8756 16791 -1185.3 -vt 0.362843 0.424155 -v -8756 16071 -1185.3 -vt 0.357024 0.424155 -v -11831 16071 -1185.3 -vt 0.357024 0.448887 -o mesh232 -s off -f 1249/1249/1249 1250/1250/1250 1251/1251/1251 -f 1249/1249/1249 1251/1251/1251 1252/1252/1252 -g charts -o chart0000 -s off -f 1249/1249/1249 1250/1250/1250 1251/1251/1251 -f 1249/1249/1249 1251/1251/1251 1252/1252/1252 -v -8756 16071 -1185.3 -vt 0.83749 0.035037 -v -8756 16791 -1185.3 -vt 0.843308 0.035037 -v -8756 16791 -105.3 -vt 0.843308 0.0259687 -v -8756 16071 -105.3 -vt 0.83749 0.0259687 -o mesh233 -s off -f 1253/1253/1253 1254/1254/1254 1255/1255/1255 -f 1253/1253/1253 1255/1255/1255 1256/1256/1256 -g charts -o chart0000 -s off -f 1253/1253/1253 1254/1254/1254 1255/1255/1255 -f 1253/1253/1253 1255/1255/1255 1256/1256/1256 -v -8756 16791 -1185.3 -vt 0.564007 0.847073 -v -11831 16791 -1185.3 -vt 0.588944 0.847073 -v -11831 16791 -105.3 -vt 0.588944 0.856142 -v -8756 16791 -105.3 -vt 0.564007 0.856142 -o mesh234 -s off -f 1257/1257/1257 1258/1258/1258 1259/1259/1259 -f 1257/1257/1257 1259/1259/1259 1260/1260/1260 -g charts -o chart0000 -s off -f 1257/1257/1257 1258/1258/1258 1259/1259/1259 -f 1257/1257/1257 1259/1259/1259 1260/1260/1260 -v -11831 16791 -1185.3 -vt 0.684539 0.37634 -v -11831 16071 -1185.3 -vt 0.684539 0.38211 -v -11831 16071 -105.3 -vt 0.675395 0.38211 -v -11831 16791 -105.3 -vt 0.675395 0.37634 -o mesh235 -s off -f 1261/1261/1261 1262/1262/1262 1263/1263/1263 -f 1261/1261/1261 1263/1263/1263 1264/1264/1264 -g charts -o chart0000 -s off -f 1261/1261/1261 1262/1262/1262 1263/1263/1263 -f 1261/1261/1261 1263/1263/1263 1264/1264/1264 -v 9956.5 16266 -285.3 -vt 0.242311 0.530529 -v 9425.88 16266 -285.3 -vt 0.242311 0.526381 -v 9425.88 16431 -285.3 -vt 0.243706 0.526381 -v 9769 16431 -285.3 -vt 0.243706 0.529063 -v 9769 17151 -285.3 -vt 0.249792 0.529063 -v 10691.5 17151 -285.3 -vt 0.249792 0.536274 -v 10691.5 16626 -285.3 -vt 0.245354 0.536274 -v 9956.5 16266 -285.3 -vt 0.366168 0.776175 -v 10691.5 16626 -285.3 -vt 0.366168 0.76958 -v 9956.5 16626 -285.3 -vt 0.362843 0.774899 -o mesh236 -s off -f 1265/1265/1265 1266/1266/1266 1267/1267/1267 -f 1265/1265/1265 1267/1267/1267 1268/1268/1268 -f 1265/1265/1265 1268/1268/1268 1269/1269/1269 -f 1265/1265/1265 1269/1269/1269 1270/1270/1270 -f 1265/1265/1265 1270/1270/1270 1271/1271/1271 -f 1272/1272/1272 1273/1273/1273 1274/1274/1274 -g charts -o chart0000 -s off -f 1265/1265/1265 1266/1266/1266 1267/1267/1267 -f 1265/1265/1265 1267/1267/1267 1268/1268/1268 -f 1265/1265/1265 1268/1268/1268 1269/1269/1269 -f 1265/1265/1265 1269/1269/1269 1270/1270/1270 -f 1265/1265/1265 1270/1270/1270 1271/1271/1271 -o chart0001 -s off -f 1272/1272/1272 1273/1273/1273 1274/1274/1274 -v 9769 17151 -285.3 -vt 0.222361 0.793487 -v 9769 16431 -285.3 -vt 0.228179 0.793487 -v 9769 16431 3215.32 -vt 0.228179 0.765458 -v 9769 17151 3215.32 -vt 0.222361 0.765458 -o mesh237 -s off -f 1275/1275/1275 1276/1276/1276 1277/1277/1277 -f 1275/1275/1275 1277/1277/1277 1278/1278/1278 -g charts -o chart0000 -s off -f 1275/1275/1275 1276/1276/1276 1277/1277/1277 -f 1275/1275/1275 1277/1277/1277 1278/1278/1278 -v 10691.5 17151 -285.3 -vt 0.688695 0.828112 -v 9769 17151 -285.3 -vt 0.688695 0.835532 -v 9769 17151 3215.32 -vt 0.660432 0.835532 -v 10691.5 17151 3215.32 -vt 0.660432 0.828112 -o mesh238 -s off -f 1279/1279/1279 1280/1280/1280 1281/1281/1281 -f 1279/1279/1279 1281/1281/1281 1282/1282/1282 -g charts -o chart0000 -s off -f 1279/1279/1279 1280/1280/1280 1281/1281/1281 -f 1279/1279/1279 1281/1281/1281 1282/1282/1282 -v -109.125 16431 -285.3 -vt 0.731089 0.915499 -v -1003.5 16431 -285.3 -vt 0.731089 0.922918 -v -1003.5 16431 2954.7 -vt 0.756858 0.922918 -v -109.125 16431 -285.3 -vt 0.97049 0.969909 -v -1003.5 16431 2954.7 -vt 0.963428 0.995466 -v -5323.5 16431 2954.7 -vt 0.929316 0.995466 -v -5323.5 16431 -285.3 -vt 0.929316 0.969909 -v -5688.5 16431 -285.3 -vt 0.926434 0.969909 -v -109.125 16431 -285.3 -vt 0.0960989 0.708574 -v -5688.5 16431 -285.3 -vt 0.0369909 0.708574 -v -5688.5 16431 3215.32 -vt 0.0369909 0.745672 -v 9769 16431 3215.32 -vt 0.200748 0.745672 -v 9769 16431 -285.3 -vt 0.200748 0.708574 -v 9425.88 16431 -285.3 -vt 0.197113 0.708574 -v 9425.88 16431 2954.7 -vt 0.197113 0.74291 -v -109.125 16431 -285.3 -vt 0.702826 0.598104 -v 9425.88 16431 2954.7 -vt 0.623026 0.598104 -v 5105.88 16431 2954.7 -vt 0.655438 0.586562 -v -109.125 16431 -285.3 -vt 0.222361 0.846249 -v 5105.88 16431 2954.7 -vt 0.196592 0.887469 -v 5105.88 16431 -285.3 -vt 0.222361 0.887469 -v 4210.88 16431 -285.3 -vt 0.222361 0.880395 -v -109.125 16431 -285.3 -vt 0.00124688 0.443116 -v 4210.88 16431 -285.3 -vt 0.00124688 0.476917 -v 4210.88 16431 2954.7 -vt 0.0270157 0.476917 -v -109.125 16431 2954.7 -vt 0.0270157 0.443116 -o mesh239 -s off -f 1283/1283/1283 1284/1284/1284 1285/1285/1285 -f 1286/1286/1286 1287/1287/1287 1288/1288/1288 -f 1286/1286/1286 1288/1288/1288 1289/1289/1289 -f 1286/1286/1286 1289/1289/1289 1290/1290/1290 -f 1291/1291/1291 1292/1292/1292 1293/1293/1293 -f 1291/1291/1291 1293/1293/1293 1294/1294/1294 -f 1291/1291/1291 1294/1294/1294 1295/1295/1295 -f 1291/1291/1291 1295/1295/1295 1296/1296/1296 -f 1291/1291/1291 1296/1296/1296 1297/1297/1297 -f 1298/1298/1298 1299/1299/1299 1300/1300/1300 -f 1301/1301/1301 1302/1302/1302 1303/1303/1303 -f 1301/1301/1301 1303/1303/1303 1304/1304/1304 -f 1305/1305/1305 1306/1306/1306 1307/1307/1307 -f 1305/1305/1305 1307/1307/1307 1308/1308/1308 -g charts -o chart0000 -s off -f 1283/1283/1283 1284/1284/1284 1285/1285/1285 -o chart0001 -s off -f 1286/1286/1286 1287/1287/1287 1288/1288/1288 -f 1286/1286/1286 1288/1288/1288 1289/1289/1289 -f 1286/1286/1286 1289/1289/1289 1290/1290/1290 -o chart0002 -s off -f 1291/1291/1291 1292/1292/1292 1293/1293/1293 -f 1291/1291/1291 1293/1293/1293 1294/1294/1294 -f 1291/1291/1291 1294/1294/1294 1295/1295/1295 -f 1291/1291/1291 1295/1295/1295 1296/1296/1296 -f 1291/1291/1291 1296/1296/1296 1297/1297/1297 -o chart0003 -s off -f 1298/1298/1298 1299/1299/1299 1300/1300/1300 -o chart0004 -s off -f 1301/1301/1301 1302/1302/1302 1303/1303/1303 -f 1301/1301/1301 1303/1303/1303 1304/1304/1304 -o chart0005 -s off -f 1305/1305/1305 1306/1306/1306 1307/1307/1307 -f 1305/1305/1305 1307/1307/1307 1308/1308/1308 -v -5688.5 16431 -285.3 -vt 0.994597 0.000412201 -v -5688.5 17151 -285.3 -vt 0.994597 0.00618293 -v -5688.5 17151 3215.32 -vt 0.966334 0.00618293 -v -5688.5 16431 3215.32 -vt 0.966334 0.000412201 -o mesh240 -s off -f 1309/1309/1309 1310/1310/1310 1311/1311/1311 -f 1309/1309/1309 1311/1311/1311 1312/1312/1312 -g charts -o chart0000 -s off -f 1309/1309/1309 1310/1310/1310 1311/1311/1311 -f 1309/1309/1309 1311/1311/1311 1312/1312/1312 -v -6588.5 17151 -285.3 -vt 0.668745 0.945177 -v -6588.5 16626 -285.3 -vt 0.668745 0.949299 -v -6588.5 16626 3215.32 -vt 0.640482 0.949299 -v -6588.5 17151 3215.32 -vt 0.640482 0.945177 -o mesh241 -s off -f 1313/1313/1313 1314/1314/1314 1315/1315/1315 -f 1313/1313/1313 1315/1315/1315 1316/1316/1316 -g charts -o chart0000 -s off -f 1313/1313/1313 1314/1314/1314 1315/1315/1315 -f 1313/1313/1313 1315/1315/1315 1316/1316/1316 -v -6588.5 16626 -285.3 -vt 0.821696 0.936933 -v -5853.5 16626 -285.3 -vt 0.821696 0.942704 -v -5853.5 16626 3215.32 -vt 0.793433 0.942704 -v -6588.5 16626 3215.32 -vt 0.793433 0.936933 -o mesh242 -s off -f 1317/1317/1317 1318/1318/1318 1319/1319/1319 -f 1317/1317/1317 1319/1319/1319 1320/1320/1320 -g charts -o chart0000 -s off -f 1317/1317/1317 1318/1318/1318 1319/1319/1319 -f 1317/1317/1317 1319/1319/1319 1320/1320/1320 -v -5688.5 17151 -285.3 -vt 0.889859 0.904782 -v -6588.5 17151 -285.3 -vt 0.889859 0.912201 -v -6588.5 17151 3215.32 -vt 0.861596 0.912201 -v -5688.5 17151 3215.32 -vt 0.861596 0.904782 -o mesh243 -s off -f 1321/1321/1321 1322/1322/1322 1323/1323/1323 -f 1321/1321/1321 1323/1323/1323 1324/1324/1324 -g charts -o chart0000 -s off -f 1321/1321/1321 1322/1322/1322 1323/1323/1323 -f 1321/1321/1321 1323/1323/1323 1324/1324/1324 -v -5853.5 16626 -285.3 -vt 0.876559 0.811624 -v -5853.5 16266 -285.3 -vt 0.879884 0.811624 -v -5853.5 16266 3215.32 -vt 0.879884 0.783594 -v -5853.5 16626 3215.32 -vt 0.876559 0.783594 -o mesh244 -s off -f 1325/1325/1325 1326/1326/1326 1327/1327/1327 -f 1325/1325/1325 1327/1327/1327 1328/1328/1328 -g charts -o chart0000 -s off -f 1325/1325/1325 1326/1326/1326 1327/1327/1327 -f 1325/1325/1325 1327/1327/1327 1328/1328/1328 -v 9425.88 16266 -285.3 -vt 0.801756 0.519786 -v 9956.5 16266 -285.3 -vt 0.808396 0.519786 -v 9956.5 16266 3215.32 -vt 0.808396 0.476092 -v -5853.5 16266 3215.32 -vt 0.610557 0.476092 -v -5853.5 16266 -285.3 -vt 0.610557 0.519786 -v -5323.5 16266 -285.3 -vt 0.617189 0.519786 -v -5323.5 16266 2954.7 -vt 0.617189 0.479345 -v 9425.88 16266 -285.3 -vt 0.77847 0.907255 -v -5323.5 16266 2954.7 -vt 0.65877 0.907255 -v -1003.5 16266 2954.7 -vt 0.692215 0.899835 -v 9425.88 16266 -285.3 -vt 0.945553 0.239489 -v -1003.5 16266 2954.7 -vt 0.919784 0.157873 -v -1003.5 16266 -285.3 -vt 0.945553 0.157873 -v -109.125 16266 -285.3 -vt 0.945553 0.164872 -v 9425.88 16266 -285.3 -vt 0.799252 0.953421 -v -109.125 16266 -285.3 -vt 0.723608 0.953421 -v -109.125 16266 2954.7 -vt 0.723608 0.927865 -v 4210.88 16266 2954.7 -vt 0.757879 0.927865 -v 9425.88 16266 -285.3 -vt 0.438487 0.993817 -v 4210.88 16266 2954.7 -vt 0.487531 0.993817 -v 4210.88 16266 -285.3 -vt 0.473872 0.971558 -v 5105.88 16266 -285.3 -vt 0.4678 0.975378 -v 9425.88 16266 -285.3 -vt 0.954696 0.152927 -v 5105.88 16266 -285.3 -vt 0.920615 0.152927 -v 5105.88 16266 2954.7 -vt 0.920615 0.12737 -v 9425.88 16266 2954.7 -vt 0.954696 0.12737 -o mesh245 -s off -f 1329/1329/1329 1330/1330/1330 1331/1331/1331 -f 1329/1329/1329 1331/1331/1331 1332/1332/1332 -f 1329/1329/1329 1332/1332/1332 1333/1333/1333 -f 1329/1329/1329 1333/1333/1333 1334/1334/1334 -f 1329/1329/1329 1334/1334/1334 1335/1335/1335 -f 1336/1336/1336 1337/1337/1337 1338/1338/1338 -f 1339/1339/1339 1340/1340/1340 1341/1341/1341 -f 1339/1339/1339 1341/1341/1341 1342/1342/1342 -f 1343/1343/1343 1344/1344/1344 1345/1345/1345 -f 1343/1343/1343 1345/1345/1345 1346/1346/1346 -f 1347/1347/1347 1348/1348/1348 1349/1349/1349 -f 1347/1347/1347 1349/1349/1349 1350/1350/1350 -f 1351/1351/1351 1352/1352/1352 1353/1353/1353 -f 1351/1351/1351 1353/1353/1353 1354/1354/1354 -g charts -o chart0000 -s off -f 1329/1329/1329 1330/1330/1330 1331/1331/1331 -f 1329/1329/1329 1331/1331/1331 1332/1332/1332 -f 1329/1329/1329 1332/1332/1332 1333/1333/1333 -f 1329/1329/1329 1333/1333/1333 1334/1334/1334 -f 1329/1329/1329 1334/1334/1334 1335/1335/1335 -o chart0001 -s off -f 1336/1336/1336 1337/1337/1337 1338/1338/1338 -o chart0002 -s off -f 1339/1339/1339 1340/1340/1340 1341/1341/1341 -f 1339/1339/1339 1341/1341/1341 1342/1342/1342 -o chart0003 -s off -f 1343/1343/1343 1344/1344/1344 1345/1345/1345 -f 1343/1343/1343 1345/1345/1345 1346/1346/1346 -o chart0004 -s off -f 1347/1347/1347 1348/1348/1348 1349/1349/1349 -f 1347/1347/1347 1349/1349/1349 1350/1350/1350 -o chart0005 -s off -f 1351/1351/1351 1352/1352/1352 1353/1353/1353 -f 1351/1351/1351 1353/1353/1353 1354/1354/1354 -v 9956.5 16266 -285.3 -vt 0.470906 0.964138 -v 9956.5 16626 -285.3 -vt 0.474231 0.964138 -v 9956.5 16626 3215.32 -vt 0.474231 0.936109 -v 9956.5 16266 3215.32 -vt 0.470906 0.936109 -o mesh246 -s off -f 1355/1355/1355 1356/1356/1356 1357/1357/1357 -f 1355/1355/1355 1357/1357/1357 1358/1358/1358 -g charts -o chart0000 -s off -f 1355/1355/1355 1356/1356/1356 1357/1357/1357 -f 1355/1355/1355 1357/1357/1357 1358/1358/1358 -v 10691.5 16626 3215.32 -vt 0.696176 0.830671 -v 10691.5 17151 3215.32 -vt 0.696176 0.826463 -v 9769 17151 3215.32 -vt 0.703657 0.826463 -v 9769 16431 3215.32 -vt 0.703657 0.832234 -v 10691.5 16626 3215.32 -vt 0.394431 0.606348 -v 9769 16431 3215.32 -vt 0.401677 0.604548 -v -5688.5 16431 3215.32 -vt 0.523924 0.600577 -v -5688.5 17151 3215.32 -vt 0.524106 0.606348 -v 10691.5 16626 3215.32 -vt 0.807564 0.469777 -v -5688.5 17151 3215.32 -vt 0.678339 0.465375 -v -6588.5 17151 3215.32 -vt 0.671239 0.465375 -v -6588.5 16626 3215.32 -vt 0.671239 0.469777 -v -5853.5 16626 3215.32 -vt 0.677037 0.469777 -v -5853.5 16266 3215.32 -vt 0.677037 0.472795 -v 9956.5 16266 3215.32 -vt 0.801766 0.472795 -v 10691.5 16626 3215.32 -vt 0.815046 0.326876 -v 9956.5 16266 3215.32 -vt 0.820864 0.330173 -v 9956.5 16626 3215.32 -vt 0.820864 0.326876 -o mesh247 -s off -f 1359/1359/1359 1360/1360/1360 1361/1361/1361 -f 1359/1359/1359 1361/1361/1361 1362/1362/1362 -f 1363/1363/1363 1364/1364/1364 1365/1365/1365 -f 1363/1363/1363 1365/1365/1365 1366/1366/1366 -f 1367/1367/1367 1368/1368/1368 1369/1369/1369 -f 1367/1367/1367 1369/1369/1369 1370/1370/1370 -f 1367/1367/1367 1370/1370/1370 1371/1371/1371 -f 1367/1367/1367 1371/1371/1371 1372/1372/1372 -f 1367/1367/1367 1372/1372/1372 1373/1373/1373 -f 1374/1374/1374 1375/1375/1375 1376/1376/1376 -g charts -o chart0000 -s off -f 1359/1359/1359 1360/1360/1360 1361/1361/1361 -f 1359/1359/1359 1361/1361/1361 1362/1362/1362 -o chart0001 -s off -f 1363/1363/1363 1364/1364/1364 1365/1365/1365 -f 1363/1363/1363 1365/1365/1365 1366/1366/1366 -o chart0002 -s off -f 1367/1367/1367 1368/1368/1368 1369/1369/1369 -f 1367/1367/1367 1369/1369/1369 1370/1370/1370 -f 1367/1367/1367 1370/1370/1370 1371/1371/1371 -f 1367/1367/1367 1371/1371/1371 1372/1372/1372 -f 1367/1367/1367 1372/1372/1372 1373/1373/1373 -o chart0003 -s off -f 1374/1374/1374 1375/1375/1375 1376/1376/1376 -v 9956.5 16626 -285.3 -vt 0.748545 0.908079 -v 10691.5 16626 -285.3 -vt 0.748545 0.91385 -v 10691.5 16626 3215.32 -vt 0.720283 0.91385 -v 9956.5 16626 3215.32 -vt 0.720283 0.908079 -o mesh248 -s off -f 1377/1377/1377 1378/1378/1378 1379/1379/1379 -f 1377/1377/1377 1379/1379/1379 1380/1380/1380 -g charts -o chart0000 -s off -f 1377/1377/1377 1378/1378/1378 1379/1379/1379 -f 1377/1377/1377 1379/1379/1379 1380/1380/1380 -v 10691.5 16626 -285.3 -vt 0.357024 0.40272 -v 10691.5 17151 -285.3 -vt 0.36118 0.40272 -v 10691.5 17151 3215.32 -vt 0.36118 0.374691 -v 10691.5 16626 3215.32 -vt 0.357024 0.374691 -o mesh249 -s off -f 1381/1381/1381 1382/1382/1382 1383/1383/1383 -f 1381/1381/1381 1383/1383/1383 1384/1384/1384 -g charts -o chart0000 -s off -f 1381/1381/1381 1382/1382/1382 1383/1383/1383 -f 1381/1381/1381 1383/1383/1383 1384/1384/1384 -v 5105.88 16431 -285.3 -vt 0.954696 0.737428 -v 5105.88 16431 2954.7 -vt 0.954696 0.711871 -v 5105.88 16266 2954.7 -vt 0.953034 0.711871 -v 5105.88 16266 -285.3 -vt 0.953034 0.737428 -o mesh250 -s off -f 1385/1385/1385 1386/1386/1386 1387/1387/1387 -f 1385/1385/1385 1387/1387/1387 1388/1388/1388 -g charts -o chart0000 -s off -f 1385/1385/1385 1386/1386/1386 1387/1387/1387 -f 1385/1385/1385 1387/1387/1387 1388/1388/1388 -v 5105.88 16431 2954.7 -vt 0.821696 0.933636 -v 9425.88 16431 2954.7 -vt 0.787614 0.933636 -v 9425.88 16266 2954.7 -vt 0.787614 0.931987 -v 5105.88 16266 2954.7 -vt 0.821696 0.931987 -o mesh251 -s off -f 1389/1389/1389 1390/1390/1390 1391/1391/1391 -f 1389/1389/1389 1391/1391/1391 1392/1392/1392 -g charts -o chart0000 -s off -f 1389/1389/1389 1390/1390/1390 1391/1391/1391 -f 1389/1389/1389 1391/1391/1391 1392/1392/1392 -v 9425.88 16431 2954.7 -vt 0.014547 0.747321 -v 9425.88 16431 -285.3 -vt 0.014547 0.772877 -v 9425.88 16266 -285.3 -vt 0.0162094 0.772877 -v 9425.88 16266 2954.7 -vt 0.0162094 0.747321 -o mesh252 -s off -f 1393/1393/1393 1394/1394/1394 1395/1395/1395 -f 1393/1393/1393 1395/1395/1395 1396/1396/1396 -g charts -o chart0000 -s off -f 1393/1393/1393 1394/1394/1394 1395/1395/1395 -f 1393/1393/1393 1395/1395/1395 1396/1396/1396 -v 5105.88 16266 -285.3 -vt 0.478387 0.612119 -v 4210.88 16266 -285.3 -vt 0.485869 0.612119 -v 4210.88 16431 -285.3 -vt 0.485869 0.613767 -v 5105.88 16431 -285.3 -vt 0.478387 0.613767 -o mesh253 -s off -f 1397/1397/1397 1398/1398/1398 1399/1399/1399 -f 1397/1397/1397 1399/1399/1399 1400/1400/1400 -g charts -o chart0000 -s off -f 1397/1397/1397 1398/1398/1398 1399/1399/1399 -f 1397/1397/1397 1399/1399/1399 1400/1400/1400 -v -109.125 16431 -285.3 -vt 0.713632 0.941055 -v -109.125 16431 2954.7 -vt 0.713632 0.915499 -v -109.125 16266 2954.7 -vt 0.71197 0.915499 -v -109.125 16266 -285.3 -vt 0.71197 0.941055 -o mesh254 -s off -f 1401/1401/1401 1402/1402/1402 1403/1403/1403 -f 1401/1401/1401 1403/1403/1403 1404/1404/1404 -g charts -o chart0000 -s off -f 1401/1401/1401 1402/1402/1402 1403/1403/1403 -f 1401/1401/1401 1403/1403/1403 1404/1404/1404 -v -109.125 16431 2954.7 -vt 0.448462 0.205688 -v 4210.88 16431 2954.7 -vt 0.448462 0.171888 -v 4210.88 16266 2954.7 -vt 0.4468 0.171888 -v -109.125 16266 2954.7 -vt 0.4468 0.205688 -o mesh255 -s off -f 1405/1405/1405 1406/1406/1406 1407/1407/1407 -f 1405/1405/1405 1407/1407/1407 1408/1408/1408 -g charts -o chart0000 -s off -f 1405/1405/1405 1406/1406/1406 1407/1407/1407 -f 1405/1405/1405 1407/1407/1407 1408/1408/1408 -v 4210.88 16431 2954.7 -vt 0.232336 0.957543 -v 4210.88 16431 -285.3 -vt 0.258105 0.957543 -v 4210.88 16266 -285.3 -vt 0.258105 0.959192 -v 4210.88 16266 2954.7 -vt 0.232336 0.959192 -o mesh256 -s off -f 1409/1409/1409 1410/1410/1410 1411/1411/1411 -f 1409/1409/1409 1411/1411/1411 1412/1412/1412 -g charts -o chart0000 -s off -f 1409/1409/1409 1410/1410/1410 1411/1411/1411 -f 1409/1409/1409 1411/1411/1411 1412/1412/1412 -v -109.125 16266 -285.3 -vt 0.105985 0.487634 -v -1003.5 16266 -285.3 -vt 0.113466 0.487634 -v -1003.5 16431 -285.3 -vt 0.113466 0.489283 -v -109.125 16431 -285.3 -vt 0.105985 0.489283 -o mesh257 -s off -f 1413/1413/1413 1414/1414/1414 1415/1415/1415 -f 1413/1413/1413 1415/1415/1415 1416/1416/1416 -g charts -o chart0000 -s off -f 1413/1413/1413 1414/1414/1414 1415/1415/1415 -f 1413/1413/1413 1415/1415/1415 1416/1416/1416 -v -5323.5 16431 -285.3 -vt 0.997922 0.6723 -v -5323.5 16431 2954.7 -vt 0.997922 0.646744 -v -5323.5 16266 2954.7 -vt 0.996259 0.646744 -v -5323.5 16266 -285.3 -vt 0.996259 0.6723 -o mesh258 -s off -f 1417/1417/1417 1418/1418/1418 1419/1419/1419 -f 1417/1417/1417 1419/1419/1419 1420/1420/1420 -g charts -o chart0000 -s off -f 1417/1417/1417 1418/1418/1418 1419/1419/1419 -f 1417/1417/1417 1419/1419/1419 1420/1420/1420 -v -5323.5 16431 2954.7 -vt 0.100166 0.7061 -v -1003.5 16431 2954.7 -vt 0.0660848 0.7061 -v -1003.5 16266 2954.7 -vt 0.0660848 0.704452 -v -5323.5 16266 2954.7 -vt 0.100166 0.704452 -o mesh259 -s off -f 1421/1421/1421 1422/1422/1422 1423/1423/1423 -f 1421/1421/1421 1423/1423/1423 1424/1424/1424 -g charts -o chart0000 -s off -f 1421/1421/1421 1422/1422/1422 1423/1423/1423 -f 1421/1421/1421 1423/1423/1423 1424/1424/1424 -v -1003.5 16431 2954.7 -vt 0.946384 0.675598 -v -1003.5 16431 -285.3 -vt 0.946384 0.701154 -v -1003.5 16266 -285.3 -vt 0.948046 0.701154 -v -1003.5 16266 2954.7 -vt 0.948046 0.675598 -o mesh260 -s off -f 1425/1425/1425 1426/1426/1426 1427/1427/1427 -f 1425/1425/1425 1427/1427/1427 1428/1428/1428 -g charts -o chart0000 -s off -f 1425/1425/1425 1426/1426/1426 1427/1427/1427 -f 1425/1425/1425 1427/1427/1427 1428/1428/1428 -v -5323.5 16431 -285.3 -vt 0.287891 0.828112 -v -5323.5 16266 -285.3 -vt 0.286367 0.828112 -v -5853.5 16266 -285.3 -vt 0.286367 0.833058 -v -5853.5 16626 -285.3 -vt 0.289692 0.833058 -v -5323.5 16431 -285.3 -vt 0.485037 0.416735 -v -5853.5 16626 -285.3 -vt 0.484044 0.421769 -v -6588.5 16626 -285.3 -vt 0.485037 0.428374 -v -6588.5 17151 -285.3 -vt 0.480435 0.429101 -v -5688.5 17151 -285.3 -vt 0.479219 0.421013 -v -5323.5 16431 -285.3 -vt 0.929759 0.634378 -v -5688.5 17151 -285.3 -vt 0.935578 0.637675 -v -5688.5 16431 -285.3 -vt 0.929759 0.637675 -o mesh261 -s off -f 1429/1429/1429 1430/1430/1430 1431/1431/1431 -f 1429/1429/1429 1431/1431/1431 1432/1432/1432 -f 1433/1433/1433 1434/1434/1434 1435/1435/1435 -f 1433/1433/1433 1435/1435/1435 1436/1436/1436 -f 1433/1433/1433 1436/1436/1436 1437/1437/1437 -f 1438/1438/1438 1439/1439/1439 1440/1440/1440 -g charts -o chart0000 -s off -f 1429/1429/1429 1430/1430/1430 1431/1431/1431 -f 1429/1429/1429 1431/1431/1431 1432/1432/1432 -o chart0001 -s off -f 1433/1433/1433 1434/1434/1434 1435/1435/1435 -f 1433/1433/1433 1435/1435/1435 1436/1436/1436 -f 1433/1433/1433 1436/1436/1436 1437/1437/1437 -o chart0002 -s off -f 1438/1438/1438 1439/1439/1439 1440/1440/1440 -v -6956 15906 -285.3 -vt 0.479219 0.951772 -v -6986 15906 -251.015 -vt 0.478387 0.951533 -v -7991 15906 -285.3 -vt 0.479219 0.943528 -v -7961 15906 -251.015 -vt 0.478387 0.943767 -o mesh262 -s off -f 1441/1441/1441 1442/1442/1442 1443/1443/1443 -f 1444/1444/1444 1443/1443/1443 1442/1442/1442 -g charts -o chart0000 -s off -f 1441/1441/1441 1442/1442/1442 1443/1443/1443 -f 1444/1444/1444 1443/1443/1443 1442/1442/1442 -v -6986 15906 -251.015 -vt 0.339845 0.669827 -v -6956 15906 -285.3 -vt 0.339568 0.670651 -v -6956 15906 2594.7 -vt 0.362843 0.670651 -o mesh263 -s off -f 1445/1445/1445 1446/1446/1446 1447/1447/1447 -g charts -o chart0000 -s off -f 1445/1445/1445 1446/1446/1446 1447/1447/1447 -v -6986 15906 -251.015 -vt 0.936409 0.939406 -v -6956 15906 2594.7 -vt 0.958853 0.939406 -v -6986 15906 2560.41 -vt 0.95858 0.938582 -o mesh264 -s off -f 1448/1448/1448 1449/1449/1449 1450/1450/1450 -g charts -o chart0000 -s off -f 1448/1448/1448 1449/1449/1449 1450/1450/1450 -v -6986 15906 2560.41 -vt 0.687864 0.62507 -v -6956 15906 2594.7 -vt 0.687032 0.625309 -v -7961 15906 2560.41 -vt 0.687864 0.617304 -v -7991 15906 2594.7 -vt 0.687032 0.617065 -o mesh265 -s off -f 1451/1451/1451 1452/1452/1452 1453/1453/1453 -f 1454/1454/1454 1453/1453/1453 1452/1452/1452 -g charts -o chart0000 -s off -f 1451/1451/1451 1452/1452/1452 1453/1453/1453 -f 1454/1454/1454 1453/1453/1453 1452/1452/1452 -v -7991 15906 -285.3 -vt 0.902327 0.559357 -v -7961 15906 -251.015 -vt 0.901496 0.559082 -v -7991 15906 2594.7 -vt 0.902327 0.536274 -o mesh266 -s off -f 1455/1455/1455 1456/1456/1456 1457/1457/1457 -g charts -o chart0000 -s off -f 1455/1455/1455 1456/1456/1456 1457/1457/1457 -v -7991 15906 2594.7 -vt 0.262261 0.973207 -v -7961 15906 -251.015 -vt 0.284705 0.973207 -v -7961 15906 2560.41 -vt 0.262534 0.972383 -o mesh267 -s off -f 1458/1458/1458 1459/1459/1459 1460/1460/1460 -g charts -o chart0000 -s off -f 1458/1458/1458 1459/1459/1459 1460/1460/1460 -v -7991 16431 -285.3 -vt 0.350374 0.449711 -v -7961 16431 -251.015 -vt 0.350615 0.450536 -v -6956 16431 -285.3 -vt 0.358687 0.449711 -v -6986 16431 -251.015 -vt 0.358446 0.450536 -o mesh268 -s off -f 1461/1461/1461 1462/1462/1462 1463/1463/1463 -f 1464/1464/1464 1463/1463/1463 1462/1462/1462 -g charts -o chart0000 -s off -f 1461/1461/1461 1462/1462/1462 1463/1463/1463 -f 1464/1464/1464 1463/1463/1463 1462/1462/1462 -v -7961 16431 -251.015 -vt 0.372818 0.790464 -v -7991 16431 -285.3 -vt 0.373649 0.79019 -v -7991 16431 2594.7 -vt 0.373649 0.813273 -o mesh269 -s off -f 1465/1465/1465 1466/1466/1466 1467/1467/1467 -g charts -o chart0000 -s off -f 1465/1465/1465 1466/1466/1466 1467/1467/1467 -v -7961 16431 -251.015 -vt 0.558188 0.88582 -v -7991 16431 2594.7 -vt 0.558188 0.908079 -v -7961 16431 2560.41 -vt 0.557357 0.907808 -o mesh270 -s off -f 1468/1468/1468 1469/1469/1469 1470/1470/1470 -g charts -o chart0000 -s off -f 1468/1468/1468 1469/1469/1469 1470/1470/1470 -v -7961 16431 2560.41 -vt 0.843549 0.400247 -v -7991 16431 2594.7 -vt 0.843308 0.401072 -v -6986 16431 2560.41 -vt 0.85138 0.400247 -v -6956 16431 2594.7 -vt 0.851621 0.401072 -o mesh271 -s off -f 1471/1471/1471 1472/1472/1472 1473/1473/1473 -f 1474/1474/1474 1473/1473/1473 1472/1472/1472 -g charts -o chart0000 -s off -f 1471/1471/1471 1472/1472/1472 1473/1473/1473 -f 1474/1474/1474 1473/1473/1473 1472/1472/1472 -v -6956 16431 -285.3 -vt 0.256442 0.497527 -v -6986 16431 -251.015 -vt 0.256165 0.496702 -v -6956 16431 2594.7 -vt 0.233167 0.497527 -o mesh272 -s off -f 1475/1475/1475 1476/1476/1476 1477/1477/1477 -g charts -o chart0000 -s off -f 1475/1475/1475 1476/1476/1476 1477/1477/1477 -v -6956 16431 2594.7 -vt 0.312968 0.967436 -v -6986 16431 -251.015 -vt 0.335411 0.967436 -v -6986 16431 2560.41 -vt 0.31324 0.966612 -o mesh273 -s off -f 1478/1478/1478 1479/1479/1479 1480/1480/1480 -g charts -o chart0000 -s off -f 1478/1478/1478 1479/1479/1479 1480/1480/1480 -v -7991 15906 -285.3 -vt 0.766002 0.900659 -v -7991 15906 2594.7 -vt 0.742727 0.900659 -v -7991 16431 2594.7 -vt 0.742727 0.896537 -v -7991 16431 -285.3 -vt 0.766002 0.896537 -o mesh274 -s off -f 1481/1481/1481 1482/1482/1482 1483/1483/1483 -f 1481/1481/1481 1483/1483/1483 1484/1484/1484 -g charts -o chart0000 -s off -f 1481/1481/1481 1482/1482/1482 1483/1483/1483 -f 1481/1481/1481 1483/1483/1483 1484/1484/1484 -v -7991 15906 2594.7 -vt 0.118454 0.369744 -v -6956 15906 2594.7 -vt 0.110141 0.369744 -v -6956 16431 2594.7 -vt 0.110141 0.365622 -v -7991 16431 2594.7 -vt 0.118454 0.365622 -o mesh275 -s off -f 1485/1485/1485 1486/1486/1486 1487/1487/1487 -f 1485/1485/1485 1487/1487/1487 1488/1488/1488 -g charts -o chart0000 -s off -f 1485/1485/1485 1486/1486/1486 1487/1487/1487 -f 1485/1485/1485 1487/1487/1487 1488/1488/1488 -v -6956 15906 2594.7 -vt 0.796758 0.434872 -v -6956 15906 -285.3 -vt 0.796758 0.457955 -v -6956 16431 -285.3 -vt 0.800914 0.457955 -v -6956 16431 2594.7 -vt 0.800914 0.434872 -o mesh276 -s off -f 1489/1489/1489 1490/1490/1490 1491/1491/1491 -f 1489/1489/1489 1491/1491/1491 1492/1492/1492 -g charts -o chart0000 -s off -f 1489/1489/1489 1490/1490/1490 1491/1491/1491 -f 1489/1489/1489 1491/1491/1491 1492/1492/1492 -v -6956 15906 -285.3 -vt 0.521613 0.434872 -v -7991 15906 -285.3 -vt 0.529925 0.434872 -v -7991 16431 -285.3 -vt 0.529925 0.438994 -v -6956 16431 -285.3 -vt 0.521613 0.438994 -o mesh277 -s off -f 1493/1493/1493 1494/1494/1494 1495/1495/1495 -f 1493/1493/1493 1495/1495/1495 1496/1496/1496 -g charts -o chart0000 -s off -f 1493/1493/1493 1494/1494/1494 1495/1495/1495 -f 1493/1493/1493 1495/1495/1495 1496/1496/1496 -v -7961 16431 -251.015 -vt 0.782627 0.930338 -v -7961 16287.8 -251.015 -vt 0.782627 0.931462 -v -6986 16287.8 -251.015 -vt 0.774314 0.931462 -v -6986 16431 -251.015 -vt 0.774314 0.930338 -v -7961 15906 -251.015 -vt 0.782627 0.93446 -v -6986 15906 -251.015 -vt 0.774314 0.93446 -o mesh278 -s off -f 1497/1497/1497 1498/1498/1498 1499/1499/1499 -f 1497/1497/1497 1499/1499/1499 1500/1500/1500 -f 1501/1501/1501 1502/1502/1502 1499/1499/1499 -f 1501/1501/1501 1499/1499/1499 1498/1498/1498 -g charts -o chart0000 -s off -f 1497/1497/1497 1498/1498/1498 1499/1499/1499 -f 1497/1497/1497 1499/1499/1499 1500/1500/1500 -f 1501/1501/1501 1502/1502/1502 1499/1499/1499 -f 1501/1501/1501 1499/1499/1499 1498/1498/1498 -v -6986 16431 -251.015 -vt 0.613051 0.433223 -v -6986 16287.8 -251.015 -vt 0.613051 0.434348 -v -6986 16287.8 2560.41 -vt 0.590607 0.434348 -v -6986 16431 2560.41 -vt 0.590607 0.433223 -v -6986 15906 -251.015 -vt 0.613051 0.437345 -v -6986 15906 2560.41 -vt 0.590607 0.437345 -o mesh279 -s off -f 1503/1503/1503 1504/1504/1504 1505/1505/1505 -f 1503/1503/1503 1505/1505/1505 1506/1506/1506 -f 1507/1507/1507 1508/1508/1508 1505/1505/1505 -f 1507/1507/1507 1505/1505/1505 1504/1504/1504 -g charts -o chart0000 -s off -f 1503/1503/1503 1504/1504/1504 1505/1505/1505 -f 1503/1503/1503 1505/1505/1505 1506/1506/1506 -f 1507/1507/1507 1508/1508/1508 1505/1505/1505 -f 1507/1507/1507 1505/1505/1505 1504/1504/1504 -v -6986 16431 2560.41 -vt 0.0336658 0.744847 -v -6986 16287.8 2560.41 -vt 0.0336658 0.743723 -v -7961 16287.8 2560.41 -vt 0.0253533 0.743723 -v -7961 16431 2560.41 -vt 0.0253533 0.744847 -v -6986 15906 2560.41 -vt 0.0336658 0.740725 -v -7961 15906 2560.41 -vt 0.0253533 0.740725 -o mesh280 -s off -f 1509/1509/1509 1510/1510/1510 1511/1511/1511 -f 1509/1509/1509 1511/1511/1511 1512/1512/1512 -f 1513/1513/1513 1514/1514/1514 1511/1511/1511 -f 1513/1513/1513 1511/1511/1511 1510/1510/1510 -g charts -o chart0000 -s off -f 1509/1509/1509 1510/1510/1510 1511/1511/1511 -f 1509/1509/1509 1511/1511/1511 1512/1512/1512 -f 1513/1513/1513 1514/1514/1514 1511/1511/1511 -f 1513/1513/1513 1511/1511/1511 1510/1510/1510 -v -7961 16431 2560.41 -vt 0.997922 0.677246 -v -7961 16287.8 2560.41 -vt 0.997922 0.676122 -v -7961 16287.8 -251.015 -vt 0.975478 0.676122 -v -7961 16431 -251.015 -vt 0.975478 0.677246 -v -7961 15906 2560.41 -vt 0.997922 0.673124 -v -7961 15906 -251.015 -vt 0.975478 0.673124 -o mesh281 -s off -f 1515/1515/1515 1516/1516/1516 1517/1517/1517 -f 1515/1515/1515 1517/1517/1517 1518/1518/1518 -f 1519/1519/1519 1520/1520/1520 1517/1517/1517 -f 1519/1519/1519 1517/1517/1517 1516/1516/1516 -g charts -o chart0000 -s off -f 1515/1515/1515 1516/1516/1516 1517/1517/1517 -f 1515/1515/1515 1517/1517/1517 1518/1518/1518 -f 1519/1519/1519 1520/1520/1520 1517/1517/1517 -f 1519/1519/1519 1517/1517/1517 1516/1516/1516 -v -7961 16287.8 -251.015 -vt 0.89734 0.406842 -v -7841 16287.8 -113.872 -vt 0.896245 0.405828 -v -6986 16287.8 -251.015 -vt 0.89734 0.398599 -v -7961 16287.8 2560.41 -vt 0.874896 0.406842 -v -7841 16287.8 2423.27 -vt 0.875991 0.405828 -v -7106 16287.8 2423.27 -vt 0.875991 0.399613 -v -7106 16287.8 -113.872 -vt 0.896245 0.399613 -v -6986 16287.8 2560.41 -vt 0.874896 0.398599 -o mesh282 -s off -f 1521/1521/1521 1522/1522/1522 1523/1523/1523 -f 1522/1522/1522 1521/1521/1521 1524/1524/1524 -f 1522/1522/1522 1524/1524/1524 1525/1525/1525 -f 1525/1525/1525 1524/1524/1524 1526/1526/1526 -f 1523/1523/1523 1527/1527/1527 1528/1528/1528 -f 1527/1527/1527 1523/1523/1523 1522/1522/1522 -f 1528/1528/1528 1527/1527/1527 1526/1526/1526 -f 1528/1528/1528 1526/1526/1526 1524/1524/1524 -g charts -o chart0000 -s off -f 1521/1521/1521 1522/1522/1522 1523/1523/1523 -f 1522/1522/1522 1521/1521/1521 1524/1524/1524 -f 1522/1522/1522 1524/1524/1524 1525/1525/1525 -f 1525/1525/1525 1524/1524/1524 1526/1526/1526 -f 1523/1523/1523 1527/1527/1527 1528/1528/1528 -f 1527/1527/1527 1523/1523/1523 1522/1522/1522 -f 1528/1528/1528 1527/1527/1527 1526/1526/1526 -f 1528/1528/1528 1526/1526/1526 1524/1524/1524 -v -7841 15906 -113.872 -vt 0.368662 0.657461 -v -7106 15906 -113.872 -vt 0.368662 0.65169 -v -7106 16287.8 -113.872 -vt 0.365337 0.65169 -v -7841 16287.8 -113.872 -vt 0.365337 0.657461 -o mesh283 -s off -f 1529/1529/1529 1530/1530/1530 1531/1531/1531 -f 1529/1529/1529 1531/1531/1531 1532/1532/1532 -g charts -o chart0000 -s off -f 1529/1529/1529 1530/1530/1530 1531/1531/1531 -f 1529/1529/1529 1531/1531/1531 1532/1532/1532 -v -7106 15906 -113.872 -vt 0.154198 0.321105 -v -7106 15906 2423.27 -vt 0.154198 0.300495 -v -7106 16287.8 2423.27 -vt 0.150873 0.300495 -v -7106 16287.8 -113.872 -vt 0.150873 0.321105 -o mesh284 -s off -f 1533/1533/1533 1534/1534/1534 1535/1535/1535 -f 1533/1533/1533 1535/1535/1535 1536/1536/1536 -g charts -o chart0000 -s off -f 1533/1533/1533 1534/1534/1534 1535/1535/1535 -f 1533/1533/1533 1535/1535/1535 1536/1536/1536 -v -7106 15906 2423.27 -vt 0.477556 0.676422 -v -7841 15906 2423.27 -vt 0.477556 0.682193 -v -7841 16287.8 2423.27 -vt 0.480881 0.682193 -v -7106 16287.8 2423.27 -vt 0.480881 0.676422 -o mesh285 -s off -f 1537/1537/1537 1538/1538/1538 1539/1539/1539 -f 1537/1537/1537 1539/1539/1539 1540/1540/1540 -g charts -o chart0000 -s off -f 1537/1537/1537 1538/1538/1538 1539/1539/1539 -f 1537/1537/1537 1539/1539/1539 1540/1540/1540 -v -7841 15906 2423.27 -vt 0.4468 0.88582 -v -7841 15906 -113.872 -vt 0.4468 0.90643 -v -7841 16287.8 -113.872 -vt 0.450125 0.90643 -v -7841 16287.8 2423.27 -vt 0.450125 0.88582 -o mesh286 -s off -f 1541/1541/1541 1542/1542/1542 1543/1543/1543 -f 1541/1541/1541 1543/1543/1543 1544/1544/1544 -g charts -o chart0000 -s off -f 1541/1541/1541 1542/1542/1542 1543/1543/1543 -f 1541/1541/1541 1543/1543/1543 1544/1544/1544 -v 2043.32 10975 5070.29 -vt 0.0743973 0.911377 -v 2043.32 12374.2 5944.79 -vt 0.0743973 0.898186 -v 2043.32 12398.1 5906.63 -vt 0.0735661 0.898186 -v 2043.32 10998.9 5032.13 -vt 0.0735661 0.911377 -o mesh287 -s off -f 1545/1545/1545 1546/1546/1546 1547/1547/1547 -f 1545/1545/1545 1547/1547/1547 1548/1548/1548 -g charts -o chart0000 -s off -f 1545/1545/1545 1546/1546/1546 1547/1547/1547 -f 1545/1545/1545 1547/1547/1547 1548/1548/1548 -v 2043.32 10998.9 5032.13 -vt 0.399418 0.655812 -v 2073.32 10998.9 5032.13 -vt 0.399418 0.656636 -v 2073.32 10975 5070.29 -vt 0.398587 0.656636 -v 2043.32 10975 5070.29 -vt 0.398587 0.655812 -o mesh288 -s off -f 1549/1549/1549 1550/1550/1550 1551/1551/1551 -f 1549/1549/1549 1551/1551/1551 1552/1552/1552 -g charts -o chart0000 -s off -f 1549/1549/1549 1550/1550/1550 1551/1551/1551 -f 1549/1549/1549 1551/1551/1551 1552/1552/1552 -v 2073.32 12398.1 5906.63 -vt 0.372818 0.832234 -v 2073.32 12374.2 5944.79 -vt 0.371987 0.832234 -v 2073.32 10975 5070.29 -vt 0.371987 0.819044 -v 2073.32 10998.9 5032.13 -vt 0.372818 0.819044 -o mesh289 -s off -f 1553/1553/1553 1554/1554/1554 1555/1555/1555 -f 1553/1553/1553 1555/1555/1555 1556/1556/1556 -g charts -o chart0000 -s off -f 1553/1553/1553 1554/1554/1554 1555/1555/1555 -f 1553/1553/1553 1555/1555/1555 1556/1556/1556 -v 385.817 12450.5 5944.79 -vt 0.651288 0.673949 -v 2043.32 12450.5 5944.79 -vt 0.637988 0.673949 -v 2043.32 12426.7 5906.63 -vt 0.637988 0.673124 -v 385.817 12426.7 5906.63 -vt 0.651288 0.673124 -o mesh290 -s off -f 1557/1557/1557 1558/1558/1558 1559/1559/1559 -f 1557/1557/1557 1559/1559/1559 1560/1560/1560 -g charts -o chart0000 -s off -f 1557/1557/1557 1558/1558/1558 1559/1559/1559 -f 1557/1557/1557 1559/1559/1559 1560/1560/1560 -v 3730.82 12426.7 5906.63 -vt 0.11596 0.584913 -v 2073.32 12426.7 5906.63 -vt 0.12926 0.584913 -v 2073.32 12450.5 5944.79 -vt 0.12926 0.585738 -v 3730.82 12450.5 5944.79 -vt 0.11596 0.585738 -o mesh291 -s off -f 1561/1561/1561 1562/1562/1562 1563/1563/1563 -f 1561/1561/1561 1563/1563/1563 1564/1564/1564 -g charts -o chart0000 -s off -f 1561/1561/1561 1562/1562/1562 1563/1563/1563 -f 1561/1561/1561 1563/1563/1563 1564/1564/1564 -v 2073.32 13825.9 5032.13 -vt 0.923109 0.208161 -v 2043.32 13825.9 5032.13 -vt 0.92394 0.208161 -v 2043.32 13849.7 5070.29 -vt 0.92394 0.207337 -v 2073.32 13849.7 5070.29 -vt 0.923109 0.207337 -o mesh292 -s off -f 1565/1565/1565 1566/1566/1566 1567/1567/1567 -f 1565/1565/1565 1567/1567/1567 1568/1568/1568 -g charts -o chart0000 -s off -f 1565/1565/1565 1566/1566/1566 1567/1567/1567 -f 1565/1565/1565 1567/1567/1567 1568/1568/1568 -v 2073.32 12450.5 5944.79 -vt 0.71197 0.998763 -v 2073.32 12426.7 5906.63 -vt 0.71197 0.999588 -v 2073.32 13825.9 5032.13 -vt 0.69867 0.999588 -v 2073.32 13849.7 5070.29 -vt 0.69867 0.998763 -o mesh293 -s off -f 1569/1569/1569 1570/1570/1570 1571/1571/1571 -f 1569/1569/1569 1571/1571/1571 1572/1572/1572 -g charts -o chart0000 -s off -f 1569/1569/1569 1570/1570/1570 1571/1571/1571 -f 1569/1569/1569 1571/1571/1571 1572/1572/1572 -v 2043.32 12426.7 5906.63 -vt 0.905652 0.634378 -v 2043.32 12450.5 5944.79 -vt 0.905652 0.635202 -v 2043.32 13849.7 5070.29 -vt 0.892352 0.635202 -v 2043.32 13825.9 5032.13 -vt 0.892352 0.634378 -o mesh294 -s off -f 1573/1573/1573 1574/1574/1574 1575/1575/1575 -f 1573/1573/1573 1575/1575/1575 1576/1576/1576 -g charts -o chart0000 -s off -f 1573/1573/1573 1574/1574/1574 1575/1575/1575 -f 1573/1573/1573 1575/1575/1575 1576/1576/1576 -v 3730.82 12374.2 5944.79 -vt 0.320449 0.553586 -v 3730.82 12398.1 5906.63 -vt 0.319827 0.553586 -v 3730.82 12412.4 5915.58 -vt 0.319827 0.553371 -v 3730.82 12426.7 5906.63 -vt 0.319618 0.553277 -v 3730.82 12450.5 5944.79 -vt 0.31989 0.552762 -v 3730.82 12412.4 5968.64 -vt 0.320449 0.553013 -o mesh295 -s off -f 1577/1577/1577 1578/1578/1578 1579/1579/1579 -f 1577/1577/1577 1579/1579/1579 1580/1580/1580 -f 1577/1577/1577 1580/1580/1580 1581/1581/1581 -f 1577/1577/1577 1581/1581/1581 1582/1582/1582 -g charts -o chart0000 -s off -f 1577/1577/1577 1578/1578/1578 1579/1579/1579 -f 1577/1577/1577 1579/1579/1579 1580/1580/1580 -f 1577/1577/1577 1580/1580/1580 1581/1581/1581 -f 1577/1577/1577 1581/1581/1581 1582/1582/1582 -v 385.817 12398.1 5906.63 -vt 0.240648 0.706241 -v 385.817 12412.4 5915.58 -vt 0.240648 0.706925 -v 3730.82 12412.4 5915.58 -vt 0.103491 0.706925 -v 3730.82 12398.1 5906.63 -vt 0.103491 0.706241 -v 2073.32 12398.1 5906.63 -vt 0.171455 0.706241 -v 2073.32 10998.9 5032.13 -vt 0.171455 0.639324 -v 2043.32 10998.9 5032.13 -vt 0.172685 0.639324 -v 2043.32 12398.1 5906.63 -vt 0.172685 0.706241 -o mesh296 -s off -f 1583/1583/1583 1584/1584/1584 1585/1585/1585 -f 1583/1583/1583 1585/1585/1585 1586/1586/1586 -f 1583/1583/1583 1586/1586/1586 1587/1587/1587 -f 1583/1583/1583 1587/1587/1587 1588/1588/1588 -f 1583/1583/1583 1588/1588/1588 1589/1589/1589 -f 1583/1583/1583 1589/1589/1589 1590/1590/1590 -g charts -o chart0000 -s off -f 1583/1583/1583 1584/1584/1584 1585/1585/1585 -f 1583/1583/1583 1585/1585/1585 1586/1586/1586 -f 1583/1583/1583 1586/1586/1586 1587/1587/1587 -f 1583/1583/1583 1587/1587/1587 1588/1588/1588 -f 1583/1583/1583 1588/1588/1588 1589/1589/1589 -f 1583/1583/1583 1589/1589/1589 1590/1590/1590 -v 385.817 12398.1 5906.63 -vt 0.439318 0.297197 -v 2043.32 12398.1 5906.63 -vt 0.439318 0.284007 -v 2043.32 12374.2 5944.79 -vt 0.438487 0.284007 -v 385.817 12374.2 5944.79 -vt 0.438487 0.297197 -o mesh297 -s off -f 1591/1591/1591 1592/1592/1592 1593/1593/1593 -f 1591/1591/1591 1593/1593/1593 1594/1594/1594 -g charts -o chart0000 -s off -f 1591/1591/1591 1592/1592/1592 1593/1593/1593 -f 1591/1591/1591 1593/1593/1593 1594/1594/1594 -v 385.817 12398.1 5906.63 -vt 0.674252 0.682193 -v 385.817 12374.2 5944.79 -vt 0.673732 0.682463 -v 385.817 12412.4 5968.64 -vt 0.673986 0.683017 -v 385.817 12450.5 5944.79 -vt 0.674563 0.683017 -v 385.817 12426.7 5906.63 -vt 0.674563 0.682401 -v 385.817 12412.4 5915.58 -vt 0.674469 0.682193 -o mesh298 -s off -f 1595/1595/1595 1596/1596/1596 1597/1597/1597 -f 1595/1595/1595 1597/1597/1597 1598/1598/1598 -f 1595/1595/1595 1598/1598/1598 1599/1599/1599 -f 1595/1595/1595 1599/1599/1599 1600/1600/1600 -g charts -o chart0000 -s off -f 1595/1595/1595 1596/1596/1596 1597/1597/1597 -f 1595/1595/1595 1597/1597/1597 1598/1598/1598 -f 1595/1595/1595 1598/1598/1598 1599/1599/1599 -f 1595/1595/1595 1599/1599/1599 1600/1600/1600 -v 3730.82 12374.2 5944.79 -vt 0.998753 0.208162 -v 2073.32 12374.2 5944.79 -vt 0.998753 0.221352 -v 2073.32 12398.1 5906.63 -vt 0.999584 0.221352 -v 3730.82 12398.1 5906.63 -vt 0.999584 0.208162 -o mesh299 -s off -f 1601/1601/1601 1602/1602/1602 1603/1603/1603 -f 1601/1601/1601 1603/1603/1603 1604/1604/1604 -g charts -o chart0000 -s off -f 1601/1601/1601 1602/1602/1602 1603/1603/1603 -f 1601/1601/1601 1603/1603/1603 1604/1604/1604 -v 385.817 12412.4 5968.64 -vt 0.441812 0.401072 -v 385.817 12374.2 5944.79 -vt 0.44318 0.401072 -v 2043.32 12374.2 5944.79 -vt 0.44318 0.450909 -v 2043.32 10975 5070.29 -vt 0.49335 0.450909 -v 2073.32 10975 5070.29 -vt 0.49335 0.451811 -v 2073.32 12374.2 5944.79 -vt 0.44318 0.451811 -v 3730.82 12374.2 5944.79 -vt 0.44318 0.501649 -v 3730.82 12412.4 5968.64 -vt 0.441812 0.501649 -o mesh300 -s off -f 1605/1605/1605 1606/1606/1606 1607/1607/1607 -f 1605/1605/1605 1607/1607/1607 1608/1608/1608 -f 1605/1605/1605 1608/1608/1608 1609/1609/1609 -f 1605/1605/1605 1609/1609/1609 1610/1610/1610 -f 1605/1605/1605 1610/1610/1610 1611/1611/1611 -f 1605/1605/1605 1611/1611/1611 1612/1612/1612 -g charts -o chart0000 -s off -f 1605/1605/1605 1606/1606/1606 1607/1607/1607 -f 1605/1605/1605 1607/1607/1607 1608/1608/1608 -f 1605/1605/1605 1608/1608/1608 1609/1609/1609 -f 1605/1605/1605 1609/1609/1609 1610/1610/1610 -f 1605/1605/1605 1610/1610/1610 1611/1611/1611 -f 1605/1605/1605 1611/1611/1611 1612/1612/1612 -v 385.817 12450.5 5944.79 -vt 0.733583 0.675889 -v 385.817 12412.4 5968.64 -vt 0.733583 0.677246 -v 3730.82 12412.4 5968.64 -vt 0.63217 0.677246 -v 3730.82 12450.5 5944.79 -vt 0.63217 0.675889 -v 2073.32 12450.5 5944.79 -vt 0.682421 0.675889 -v 2073.32 13849.7 5070.29 -vt 0.682421 0.626134 -v 2043.32 13849.7 5070.29 -vt 0.683331 0.626134 -v 2043.32 12450.5 5944.79 -vt 0.683331 0.675889 -o mesh301 -s off -f 1613/1613/1613 1614/1614/1614 1615/1615/1615 -f 1613/1613/1613 1615/1615/1615 1616/1616/1616 -f 1613/1613/1613 1616/1616/1616 1617/1617/1617 -f 1613/1613/1613 1617/1617/1617 1618/1618/1618 -f 1613/1613/1613 1618/1618/1618 1619/1619/1619 -f 1613/1613/1613 1619/1619/1619 1620/1620/1620 -g charts -o chart0000 -s off -f 1613/1613/1613 1614/1614/1614 1615/1615/1615 -f 1613/1613/1613 1615/1615/1615 1616/1616/1616 -f 1613/1613/1613 1616/1616/1616 1617/1617/1617 -f 1613/1613/1613 1617/1617/1617 1618/1618/1618 -f 1613/1613/1613 1618/1618/1618 1619/1619/1619 -f 1613/1613/1613 1619/1619/1619 1620/1620/1620 -v 385.817 12412.4 5915.58 -vt 0.163342 0.596455 -v 385.817 12426.7 5906.63 -vt 0.163342 0.597139 -v 2043.32 12426.7 5906.63 -vt 0.231305 0.597139 -v 2043.32 13825.9 5032.13 -vt 0.231305 0.664056 -v 2073.32 13825.9 5032.13 -vt 0.232535 0.664056 -v 2073.32 12426.7 5906.63 -vt 0.232535 0.597139 -v 3730.82 12426.7 5906.63 -vt 0.300499 0.597139 -v 3730.82 12412.4 5915.58 -vt 0.300499 0.596455 -o mesh302 -s off -f 1621/1621/1621 1622/1622/1622 1623/1623/1623 -f 1621/1621/1621 1623/1623/1623 1624/1624/1624 -f 1621/1621/1621 1624/1624/1624 1625/1625/1625 -f 1621/1621/1621 1625/1625/1625 1626/1626/1626 -f 1621/1621/1621 1626/1626/1626 1627/1627/1627 -f 1621/1621/1621 1627/1627/1627 1628/1628/1628 -g charts -o chart0000 -s off -f 1621/1621/1621 1622/1622/1622 1623/1623/1623 -f 1621/1621/1621 1623/1623/1623 1624/1624/1624 -f 1621/1621/1621 1624/1624/1624 1625/1625/1625 -f 1621/1621/1621 1625/1625/1625 1626/1626/1626 -f 1621/1621/1621 1626/1626/1626 1627/1627/1627 -f 1621/1621/1621 1627/1627/1627 1628/1628/1628 -v 9671.5 11188.5 9157.95 -vt 0.675395 0.622836 -v 10856.5 11188.5 9157.95 -vt 0.68537 0.622836 -v 10856.5 13423.5 9157.95 -vt 0.68537 0.604699 -v 9671.5 13423.5 9157.95 -vt 0.675395 0.604699 -o mesh303 -s off -f 1629/1629/1629 1630/1630/1630 1631/1631/1631 -f 1629/1629/1629 1631/1631/1631 1632/1632/1632 -g charts -o chart0000 -s off -f 1629/1629/1629 1630/1630/1630 1631/1631/1631 -f 1629/1629/1629 1631/1631/1631 1632/1632/1632 -v 9671.5 11188.5 -285.3 -vt 0.442643 0.922918 -v 10856.5 11188.5 -285.3 -vt 0.442643 0.932811 -v 10856.5 11188.5 9157.95 -vt 0.36783 0.932811 -v 9671.5 11188.5 9157.95 -vt 0.36783 0.922918 -o mesh304 -s off -f 1633/1633/1633 1634/1634/1634 1635/1635/1635 -f 1633/1633/1633 1635/1635/1635 1636/1636/1636 -g charts -o chart0000 -s off -f 1633/1633/1633 1634/1634/1634 1635/1635/1635 -f 1633/1633/1633 1635/1635/1635 1636/1636/1636 -v 9671.5 13423.5 -285.3 -vt 0.0918536 0.950124 -v 9671.5 11188.5 -285.3 -vt 0.0918536 0.96826 -v 9671.5 11188.5 9157.95 -vt 0.0170407 0.96826 -v 9671.5 13423.5 9157.95 -vt 0.0170407 0.950124 -o mesh305 -s off -f 1637/1637/1637 1638/1638/1638 1639/1639/1639 -f 1637/1637/1637 1639/1639/1639 1640/1640/1640 -g charts -o chart0000 -s off -f 1637/1637/1637 1638/1638/1638 1639/1639/1639 -f 1637/1637/1637 1639/1639/1639 1640/1640/1640 -v 10856.5 13423.5 -285.3 -vt 0.823358 0.401072 -v 9671.5 13423.5 -285.3 -vt 0.833333 0.401072 -v 9671.5 13423.5 9157.95 -vt 0.833333 0.326876 -v 10856.5 13423.5 9157.95 -vt 0.823358 0.326876 -o mesh306 -s off -f 1641/1641/1641 1642/1642/1642 1643/1643/1643 -f 1641/1641/1641 1643/1643/1643 1644/1644/1644 -g charts -o chart0000 -s off -f 1641/1641/1641 1642/1642/1642 1643/1643/1643 -f 1641/1641/1641 1643/1643/1643 1644/1644/1644 -v 10856.5 11188.5 -285.3 -vt 0.604738 0.532976 -v 10856.5 13423.5 -285.3 -vt 0.604738 0.551113 -v 10856.5 13423.5 9157.95 -vt 0.529925 0.551113 -v 10856.5 11188.5 9157.95 -vt 0.529925 0.532976 -o mesh307 -s off -f 1645/1645/1645 1646/1646/1646 1647/1647/1647 -f 1645/1645/1645 1647/1647/1647 1648/1648/1648 -g charts -o chart0000 -s off -f 1645/1645/1645 1646/1646/1646 1647/1647/1647 -f 1645/1645/1645 1647/1647/1647 1648/1648/1648 -v 10856.5 11188.5 -285.3 -vt 0.0910224 0.833883 -v 9671.5 11188.5 -285.3 -vt 0.0910224 0.843776 -v 9671.5 13423.5 -285.3 -vt 0.0727348 0.843776 -v 10856.5 13423.5 -285.3 -vt 0.0727348 0.833883 -o mesh308 -s off -f 1649/1649/1649 1650/1650/1650 1651/1651/1651 -f 1649/1649/1649 1651/1651/1651 1652/1652/1652 -g charts -o chart0000 -s off -f 1649/1649/1649 1650/1650/1650 1651/1651/1651 -f 1649/1649/1649 1651/1651/1651 1652/1652/1652 -v -5688.5 6215.99 2594.7 -vt 0.00800668 0.87579 -v -5323.5 6215.99 2594.7 -vt 0.0045719 0.87579 -v -5323.5 6380.99 2594.7 -vt 0.0045719 0.874279 -v -5853.5 6380.99 2594.7 -vt 0.00955935 0.874279 -v -5853.5 6020.99 2594.7 -vt 0.00955935 0.877576 -v -5688.5 6215.99 2594.7 -vt 0.463425 0.673949 -v -5853.5 6020.99 2594.7 -vt 0.461762 0.675581 -v -6588.5 6020.99 2594.7 -vt 0.463425 0.681368 -v -5688.5 6215.99 2594.7 -vt 0.797589 0.45878 -v -6588.5 6020.99 2594.7 -vt 0.79939 0.466199 -v -6588.5 5855.99 2594.7 -vt 0.800914 0.466199 -v -5688.5 5855.99 2594.7 -vt 0.800914 0.45878 -o mesh309 -s off -f 1653/1653/1653 1654/1654/1654 1655/1655/1655 -f 1653/1653/1653 1655/1655/1655 1656/1656/1656 -f 1653/1653/1653 1656/1656/1656 1657/1657/1657 -f 1658/1658/1658 1659/1659/1659 1660/1660/1660 -f 1661/1661/1661 1662/1662/1662 1663/1663/1663 -f 1661/1661/1661 1663/1663/1663 1664/1664/1664 -g charts -o chart0000 -s off -f 1653/1653/1653 1654/1654/1654 1655/1655/1655 -f 1653/1653/1653 1655/1655/1655 1656/1656/1656 -f 1653/1653/1653 1656/1656/1656 1657/1657/1657 -o chart0001 -s off -f 1658/1658/1658 1659/1659/1659 1660/1660/1660 -o chart0002 -s off -f 1661/1661/1661 1662/1662/1662 1663/1663/1663 -f 1661/1661/1661 1663/1663/1663 1664/1664/1664 -v -473.499 5120.99 -285.3 -vt 0.0694097 0.643446 -v -473.499 6380.99 -285.3 -vt 0.0694097 0.653339 -v -473.499 6380.99 2594.7 -vt 0.0461347 0.653339 -v -473.499 5120.99 2594.7 -vt 0.0461347 0.643446 -o mesh310 -s off -f 1665/1665/1665 1666/1666/1666 1667/1667/1667 -f 1665/1665/1665 1667/1667/1667 1668/1668/1668 -g charts -o chart0000 -s off -f 1665/1665/1665 1666/1666/1666 1667/1667/1667 -f 1665/1665/1665 1667/1667/1667 1668/1668/1668 -v -6588.5 6020.99 -285.3 -vt 0.65877 0.643446 -v -6588.5 5855.99 -285.3 -vt 0.660432 0.643446 -v -6588.5 5855.99 2594.7 -vt 0.660432 0.620363 -v -6588.5 6020.99 2594.7 -vt 0.65877 0.620363 -o mesh311 -s off -f 1669/1669/1669 1670/1670/1670 1671/1671/1671 -f 1669/1669/1669 1671/1671/1671 1672/1672/1672 -g charts -o chart0000 -s off -f 1669/1669/1669 1670/1670/1670 1671/1671/1671 -f 1669/1669/1669 1671/1671/1671 1672/1672/1672 -v 10691.5 6020.99 -285.3 -vt 0.202411 0.747321 -v 9956.5 6020.99 -285.3 -vt 0.208229 0.747321 -v 9956.5 6020.99 2594.7 -vt 0.208229 0.724237 -v 10691.5 6020.99 2594.7 -vt 0.202411 0.724237 -o mesh312 -s off -f 1673/1673/1673 1674/1674/1674 1675/1675/1675 -f 1673/1673/1673 1675/1675/1675 1676/1676/1676 -g charts -o chart0000 -s off -f 1673/1673/1673 1674/1674/1674 1675/1675/1675 -f 1673/1673/1673 1675/1675/1675 1676/1676/1676 -v 9956.5 6020.99 -285.3 -vt 0.997922 0.0688376 -v 9956.5 6380.99 -285.3 -vt 0.997922 0.0721351 -v 9956.5 6380.99 2594.7 -vt 0.974647 0.0721351 -v 9956.5 6020.99 2594.7 -vt 0.974647 0.0688376 -o mesh313 -s off -f 1677/1677/1677 1678/1678/1678 1679/1679/1679 -f 1677/1677/1677 1679/1679/1679 1680/1680/1680 -g charts -o chart0000 -s off -f 1677/1677/1677 1678/1678/1678 1679/1679/1679 -f 1677/1677/1677 1679/1679/1679 1680/1680/1680 -v 10691.5 5855.99 -285.3 -vt 0.62552 0.742374 -v 10691.5 6020.99 -285.3 -vt 0.627182 0.742374 -v 10691.5 6020.99 2594.7 -vt 0.627182 0.719291 -v 10691.5 5855.99 2594.7 -vt 0.62552 0.719291 -o mesh314 -s off -f 1681/1681/1681 1682/1682/1682 1683/1683/1683 -f 1681/1681/1681 1683/1683/1683 1684/1684/1684 -g charts -o chart0000 -s off -f 1681/1681/1681 1682/1682/1682 1683/1683/1683 -f 1681/1681/1681 1683/1683/1683 1684/1684/1684 -v -5853.5 6380.99 -285.3 -vt 0.00124688 0.99629 -v -5853.5 6020.99 -285.3 -vt 0.00457182 0.99629 -v -5853.5 6020.99 2594.7 -vt 0.00457182 0.973207 -v -5853.5 6380.99 2594.7 -vt 0.00124688 0.973207 -o mesh315 -s off -f 1685/1685/1685 1686/1686/1686 1687/1687/1687 -f 1685/1685/1685 1687/1687/1687 1688/1688/1688 -g charts -o chart0000 -s off -f 1685/1685/1685 1686/1686/1686 1687/1687/1687 -f 1685/1685/1685 1687/1687/1687 1688/1688/1688 -v 9791.5 5855.99 -285.3 -vt 0.32128 0.54864 -v 10691.5 5855.99 -285.3 -vt 0.328761 0.54864 -v 10691.5 5855.99 2594.7 -vt 0.328761 0.525556 -v 9791.5 5855.99 2594.7 -vt 0.32128 0.525556 -o mesh316 -s off -f 1689/1689/1689 1690/1690/1690 1691/1691/1691 -f 1689/1689/1689 1691/1691/1691 1692/1692/1692 -g charts -o chart0000 -s off -f 1689/1689/1689 1690/1690/1690 1691/1691/1691 -f 1689/1689/1689 1691/1691/1691 1692/1692/1692 -v -5853.5 6380.99 2594.7 -vt 0.93724 0.243611 -v -5323.5 6380.99 2594.7 -vt 0.932253 0.243611 -v -5323.5 6380.99 -285.3 -vt 0.932253 0.220528 -v -5853.5 6380.99 -285.3 -vt 0.93724 0.220528 -o mesh317 -s off -f 1693/1693/1693 1694/1694/1694 1695/1695/1695 -f 1693/1693/1693 1695/1695/1695 1696/1696/1696 -g charts -o chart0000 -s off -f 1693/1693/1693 1694/1694/1694 1695/1695/1695 -f 1693/1693/1693 1695/1695/1695 1696/1696/1696 -v 4576.5 6380.99 2594.7 -vt 0.34788 0.425804 -v 5106.5 6380.99 2594.7 -vt 0.34788 0.420857 -v 5106.5 6380.99 -285.3 -vt 0.324605 0.420857 -v 4576.5 6380.99 -285.3 -vt 0.324605 0.425804 -o mesh318 -s off -f 1697/1697/1697 1698/1698/1698 1699/1699/1699 -f 1697/1697/1697 1699/1699/1699 1700/1700/1700 -g charts -o chart0000 -s off -f 1697/1697/1697 1698/1698/1698 1699/1699/1699 -f 1697/1697/1697 1699/1699/1699 1700/1700/1700 -v 4576.5 6380.99 -285.3 -vt 0.515794 0.429101 -v 4576.5 5120.99 -285.3 -vt 0.515794 0.438994 -v 4576.5 5120.99 2594.7 -vt 0.492519 0.438994 -v 4576.5 6380.99 2594.7 -vt 0.492519 0.429101 -o mesh319 -s off -f 1701/1701/1701 1702/1702/1702 1703/1703/1703 -f 1701/1701/1701 1703/1703/1703 1704/1704/1704 -g charts -o chart0000 -s off -f 1701/1701/1701 1702/1702/1702 1703/1703/1703 -f 1701/1701/1701 1703/1703/1703 1704/1704/1704 -v -5853.5 6020.99 -285.3 -vt 0.869077 0.128194 -v -6588.5 6020.99 -285.3 -vt 0.874896 0.128194 -v -6588.5 6020.99 2594.7 -vt 0.874896 0.105111 -v -5853.5 6020.99 2594.7 -vt 0.869077 0.105111 -o mesh320 -s off -f 1705/1705/1705 1706/1706/1706 1707/1707/1707 -f 1705/1705/1705 1707/1707/1707 1708/1708/1708 -g charts -o chart0000 -s off -f 1705/1705/1705 1706/1706/1706 1707/1707/1707 -f 1705/1705/1705 1707/1707/1707 1708/1708/1708 -v -473.499 5120.99 2594.7 -vt 0.952203 0.641797 -v 501.501 5120.99 2594.7 -vt 0.94389 0.641797 -v 501.501 5120.99 -285.3 -vt 0.94389 0.618714 -v -473.499 5120.99 -285.3 -vt 0.952203 0.618714 -o mesh321 -s off -f 1709/1709/1709 1710/1710/1710 1711/1711/1711 -f 1709/1709/1709 1711/1711/1711 1712/1712/1712 -g charts -o chart0000 -s off -f 1709/1709/1709 1710/1710/1710 1711/1711/1711 -f 1709/1709/1709 1711/1711/1711 1712/1712/1712 -v 9791.5 6215.99 -285.3 -vt 0.405237 0.598928 -v 9791.5 5855.99 -285.3 -vt 0.405237 0.602226 -v 9791.5 5855.99 2594.7 -vt 0.381962 0.602226 -v 9791.5 6215.99 2594.7 -vt 0.381962 0.598928 -o mesh322 -s off -f 1713/1713/1713 1714/1714/1714 1715/1715/1715 -f 1713/1713/1713 1715/1715/1715 1716/1716/1716 -g charts -o chart0000 -s off -f 1713/1713/1713 1714/1714/1714 1715/1715/1715 -f 1713/1713/1713 1715/1715/1715 1716/1716/1716 -v 9791.5 6215.99 2594.7 -vt 0.490025 0.331822 -v 9426.5 6215.99 2594.7 -vt 0.490025 0.328524 -v 9426.5 6215.99 -285.3 -vt 0.46675 0.328524 -v 9791.5 6215.99 -285.3 -vt 0.46675 0.331822 -o mesh323 -s off -f 1717/1717/1717 1718/1718/1718 1719/1719/1719 -f 1717/1717/1717 1719/1719/1719 1720/1720/1720 -g charts -o chart0000 -s off -f 1717/1717/1717 1718/1718/1718 1719/1719/1719 -f 1717/1717/1717 1719/1719/1719 1720/1720/1720 -v 4741.5 4955.99 -285.3 -vt 0.93724 0.674773 -v 4741.5 6215.99 -285.3 -vt 0.93724 0.684666 -v 4741.5 6215.99 2594.7 -vt 0.913965 0.684666 -v 4741.5 4955.99 2594.7 -vt 0.913965 0.674773 -o mesh324 -s off -f 1721/1721/1721 1722/1722/1722 1723/1723/1723 -f 1721/1721/1721 1723/1723/1723 1724/1724/1724 -g charts -o chart0000 -s off -f 1721/1721/1721 1722/1722/1722 1723/1723/1723 -f 1721/1721/1721 1723/1723/1723 1724/1724/1724 -v 4741.5 4955.99 2594.7 -vt 0.515794 0.630255 -v 3601.5 4955.99 2594.7 -vt 0.515794 0.621187 -v 3601.5 4955.99 -285.3 -vt 0.492519 0.621187 -v 4741.5 4955.99 -285.3 -vt 0.492519 0.630255 -o mesh325 -s off -f 1725/1725/1725 1726/1726/1726 1727/1727/1727 -f 1725/1725/1725 1727/1727/1727 1728/1728/1728 -g charts -o chart0000 -s off -f 1725/1725/1725 1726/1726/1726 1727/1727/1727 -f 1725/1725/1725 1727/1727/1727 1728/1728/1728 -v -638.499 6215.99 -285.3 -vt 0.993765 0.302143 -v -638.499 4955.99 -285.3 -vt 0.993765 0.312036 -v -638.499 4955.99 2594.7 -vt 0.97049 0.312036 -v -638.499 6215.99 2594.7 -vt 0.97049 0.302143 -o mesh326 -s off -f 1729/1729/1729 1730/1730/1730 1731/1731/1731 -f 1729/1729/1729 1731/1731/1731 1732/1732/1732 -g charts -o chart0000 -s off -f 1729/1729/1729 1730/1730/1730 1731/1731/1731 -f 1729/1729/1729 1731/1731/1731 1732/1732/1732 -v -638.499 6215.99 2594.7 -vt 0.0752285 0.703627 -v -1003.5 6215.99 2594.7 -vt 0.0752285 0.70033 -v -1003.5 6215.99 -285.3 -vt 0.0519534 0.70033 -v -638.499 6215.99 -285.3 -vt 0.0519534 0.703627 -o mesh327 -s off -f 1733/1733/1733 1734/1734/1734 1735/1735/1735 -f 1733/1733/1733 1735/1735/1735 1736/1736/1736 -g charts -o chart0000 -s off -f 1733/1733/1733 1734/1734/1734 1735/1735/1735 -f 1733/1733/1733 1735/1735/1735 1736/1736/1736 -v -5688.5 5855.99 -285.3 -vt 0.880715 0.301319 -v -5688.5 6215.99 -285.3 -vt 0.88404 0.301319 -v -5688.5 6215.99 2594.7 -vt 0.88404 0.278236 -v -5688.5 5855.99 2594.7 -vt 0.880715 0.278236 -o mesh328 -s off -f 1737/1737/1737 1738/1738/1738 1739/1739/1739 -f 1737/1737/1737 1739/1739/1739 1740/1740/1740 -g charts -o chart0000 -s off -f 1737/1737/1737 1738/1738/1738 1739/1739/1739 -f 1737/1737/1737 1739/1739/1739 1740/1740/1740 -v -6588.5 5855.99 -285.3 -vt 0.401912 0.894064 -v -5688.5 5855.99 -285.3 -vt 0.401912 0.901484 -v -5688.5 5855.99 2594.7 -vt 0.378637 0.901484 -v -6588.5 5855.99 2594.7 -vt 0.378637 0.894064 -o mesh329 -s off -f 1741/1741/1741 1742/1742/1742 1743/1743/1743 -f 1741/1741/1741 1743/1743/1743 1744/1744/1744 -g charts -o chart0000 -s off -f 1741/1741/1741 1742/1742/1742 1743/1743/1743 -f 1741/1741/1741 1743/1743/1743 1744/1744/1744 -v -5853.5 6380.99 -285.3 -vt 0.608063 0.467825 -v -5323.5 6380.99 -285.3 -vt 0.608063 0.47197 -v -5323.5 6215.99 -285.3 -vt 0.606757 0.47197 -v -5688.5 6215.99 -285.3 -vt 0.606757 0.469116 -v -5688.5 5855.99 -285.3 -vt 0.603907 0.469116 -v -6588.5 5855.99 -285.3 -vt 0.603907 0.462077 -v -6588.5 6020.99 -285.3 -vt 0.605213 0.462077 -v -5853.5 6380.99 -285.3 -vt 0.95719 0.705276 -v -6588.5 6020.99 -285.3 -vt 0.95719 0.698681 -v -5853.5 6020.99 -285.3 -vt 0.953865 0.704 -o mesh330 -s off -f 1745/1745/1745 1746/1746/1746 1747/1747/1747 -f 1745/1745/1745 1747/1747/1747 1748/1748/1748 -f 1745/1745/1745 1748/1748/1748 1749/1749/1749 -f 1745/1745/1745 1749/1749/1749 1750/1750/1750 -f 1745/1745/1745 1750/1750/1750 1751/1751/1751 -f 1752/1752/1752 1753/1753/1753 1754/1754/1754 -g charts -o chart0000 -s off -f 1745/1745/1745 1746/1746/1746 1747/1747/1747 -f 1745/1745/1745 1747/1747/1747 1748/1748/1748 -f 1745/1745/1745 1748/1748/1748 1749/1749/1749 -f 1745/1745/1745 1749/1749/1749 1750/1750/1750 -f 1745/1745/1745 1750/1750/1750 1751/1751/1751 -o chart0001 -s off -f 1752/1752/1752 1753/1753/1753 1754/1754/1754 -v -1003.5 6215.99 -285.3 -vt 0.869077 0.0655399 -v -1003.5 6215.99 2594.7 -vt 0.869077 0.0424567 -v -1003.5 6380.99 2594.7 -vt 0.867415 0.0424567 -v -1003.5 6380.99 -285.3 -vt 0.867415 0.0655399 -o mesh331 -s off -f 1755/1755/1755 1756/1756/1756 1757/1757/1757 -f 1755/1755/1755 1757/1757/1757 1758/1758/1758 -g charts -o chart0000 -s off -f 1755/1755/1755 1756/1756/1756 1757/1757/1757 -f 1755/1755/1755 1757/1757/1757 1758/1758/1758 -v -1003.5 6215.99 2594.7 -vt 0.439318 0.409316 -v -5323.5 6215.99 2594.7 -vt 0.439318 0.443116 -v -5323.5 6380.99 2594.7 -vt 0.440981 0.443116 -v -1003.5 6380.99 2594.7 -vt 0.440981 0.409316 -o mesh332 -s off -f 1759/1759/1759 1760/1760/1760 1761/1761/1761 -f 1759/1759/1759 1761/1761/1761 1762/1762/1762 -g charts -o chart0000 -s off -f 1759/1759/1759 1760/1760/1760 1761/1761/1761 -f 1759/1759/1759 1761/1761/1761 1762/1762/1762 -v -5323.5 6215.99 2594.7 -vt 0.255611 0.669002 -v -5323.5 6215.99 -285.3 -vt 0.278886 0.669002 -v -5323.5 6380.99 -285.3 -vt 0.278886 0.670651 -v -5323.5 6380.99 2594.7 -vt 0.255611 0.670651 -o mesh333 -s off -f 1763/1763/1763 1764/1764/1764 1765/1765/1765 -f 1763/1763/1763 1765/1765/1765 1766/1766/1766 -g charts -o chart0000 -s off -f 1763/1763/1763 1764/1764/1764 1765/1765/1765 -f 1763/1763/1763 1765/1765/1765 1766/1766/1766 -v -473.499 5120.99 -285.3 -vt 0.964197 0.0642274 -v 501.501 5120.99 -285.3 -vt 0.964197 0.0564716 -v 501.501 4955.99 -285.3 -vt 0.965503 0.0564716 -v -638.499 4955.99 -285.3 -vt 0.965503 0.0655399 -v -638.499 6215.99 -285.3 -vt 0.955528 0.0655398 -v -473.499 5120.99 -285.3 -vt 0.396924 0.52803 -v -638.499 6215.99 -285.3 -vt 0.405595 0.524732 -v -1003.5 6215.99 -285.3 -vt 0.406899 0.52803 -v -473.499 5120.99 -285.3 -vt 0.869077 0.974856 -v -1003.5 6215.99 -285.3 -vt 0.874065 0.983453 -v -1003.5 6380.99 -285.3 -vt 0.874065 0.984748 -v -473.499 6380.99 -285.3 -vt 0.869077 0.984748 -o mesh334 -s off -f 1767/1767/1767 1768/1768/1768 1769/1769/1769 -f 1767/1767/1767 1769/1769/1769 1770/1770/1770 -f 1767/1767/1767 1770/1770/1770 1771/1771/1771 -f 1772/1772/1772 1773/1773/1773 1774/1774/1774 -f 1775/1775/1775 1776/1776/1776 1777/1777/1777 -f 1775/1775/1775 1777/1777/1777 1778/1778/1778 -g charts -o chart0000 -s off -f 1767/1767/1767 1768/1768/1768 1769/1769/1769 -f 1767/1767/1767 1769/1769/1769 1770/1770/1770 -f 1767/1767/1767 1770/1770/1770 1771/1771/1771 -o chart0001 -s off -f 1772/1772/1772 1773/1773/1773 1774/1774/1774 -o chart0002 -s off -f 1775/1775/1775 1776/1776/1776 1777/1777/1777 -f 1775/1775/1775 1777/1777/1777 1778/1778/1778 -v 3601.5 4955.99 -285.3 -vt 0.642145 0.588211 -v 3601.5 4955.99 2594.7 -vt 0.618869 0.588211 -v 3601.5 5120.99 2594.7 -vt 0.618869 0.586562 -v 3601.5 5120.99 -285.3 -vt 0.642145 0.586562 -o mesh335 -s off -f 1779/1779/1779 1780/1780/1780 1781/1781/1781 -f 1779/1779/1779 1781/1781/1781 1782/1782/1782 -g charts -o chart0000 -s off -f 1779/1779/1779 1780/1780/1780 1781/1781/1781 -f 1779/1779/1779 1781/1781/1781 1782/1782/1782 -v 3601.5 4955.99 2594.7 -vt 0.77182 0.711047 -v 501.501 4955.99 2594.7 -vt 0.796758 0.711047 -v 501.501 5120.99 2594.7 -vt 0.796758 0.712696 -v 3601.5 5120.99 2594.7 -vt 0.77182 0.712696 -o mesh336 -s off -f 1783/1783/1783 1784/1784/1784 1785/1785/1785 -f 1783/1783/1783 1785/1785/1785 1786/1786/1786 -g charts -o chart0000 -s off -f 1783/1783/1783 1784/1784/1784 1785/1785/1785 -f 1783/1783/1783 1785/1785/1785 1786/1786/1786 -v 501.501 4955.99 2594.7 -vt 0.472569 0.297197 -v 501.501 4955.99 -285.3 -vt 0.495844 0.297197 -v 501.501 5120.99 -285.3 -vt 0.495844 0.298846 -v 501.501 5120.99 2594.7 -vt 0.472569 0.298846 -o mesh337 -s off -f 1787/1787/1787 1788/1788/1788 1789/1789/1789 -f 1787/1787/1787 1789/1789/1789 1790/1790/1790 -g charts -o chart0000 -s off -f 1787/1787/1787 1788/1788/1788 1789/1789/1789 -f 1787/1787/1787 1789/1789/1789 1790/1790/1790 -v 4576.5 6380.99 -285.3 -vt 0.57681 0.775061 -v 5106.5 6380.99 -285.3 -vt 0.575644 0.779107 -v 5106.5 6215.99 -285.3 -vt 0.576897 0.779472 -v 4741.5 6215.99 -285.3 -vt 0.5777 0.776686 -v 4741.5 4955.99 -285.3 -vt 0.587268 0.779472 -v 3601.5 4955.99 -285.3 -vt 0.589775 0.770769 -v 3601.5 5120.99 -285.3 -vt 0.588523 0.770404 -v 4576.5 6380.99 -285.3 -vt 0.344555 0.47197 -v 3601.5 5120.99 -285.3 -vt 0.35453 0.463726 -v 4576.5 5120.99 -285.3 -vt 0.35453 0.47197 -o mesh338 -s off -f 1791/1791/1791 1792/1792/1792 1793/1793/1793 -f 1791/1791/1791 1793/1793/1793 1794/1794/1794 -f 1791/1791/1791 1794/1794/1794 1795/1795/1795 -f 1791/1791/1791 1795/1795/1795 1796/1796/1796 -f 1791/1791/1791 1796/1796/1796 1797/1797/1797 -f 1798/1798/1798 1799/1799/1799 1800/1800/1800 -g charts -o chart0000 -s off -f 1791/1791/1791 1792/1792/1792 1793/1793/1793 -f 1791/1791/1791 1793/1793/1793 1794/1794/1794 -f 1791/1791/1791 1794/1794/1794 1795/1795/1795 -f 1791/1791/1791 1795/1795/1795 1796/1796/1796 -f 1791/1791/1791 1796/1796/1796 1797/1797/1797 -o chart0001 -s off -f 1798/1798/1798 1799/1799/1799 1800/1800/1800 -v 9426.5 6215.99 -285.3 -vt 0.189942 0.920445 -v 9426.5 6215.99 2594.7 -vt 0.189942 0.897362 -v 9426.5 6380.99 2594.7 -vt 0.188279 0.897362 -v 9426.5 6380.99 -285.3 -vt 0.188279 0.920445 -o mesh339 -s off -f 1801/1801/1801 1802/1802/1802 1803/1803/1803 -f 1801/1801/1801 1803/1803/1803 1804/1804/1804 -g charts -o chart0000 -s off -f 1801/1801/1801 1802/1802/1802 1803/1803/1803 -f 1801/1801/1801 1803/1803/1803 1804/1804/1804 -v 9426.5 6215.99 2594.7 -vt 0.431006 0.234542 -v 5106.5 6215.99 2594.7 -vt 0.431006 0.268343 -v 5106.5 6380.99 2594.7 -vt 0.432668 0.268343 -v 9426.5 6380.99 2594.7 -vt 0.432668 0.234542 -o mesh340 -s off -f 1805/1805/1805 1806/1806/1806 1807/1807/1807 -f 1805/1805/1805 1807/1807/1807 1808/1808/1808 -g charts -o chart0000 -s off -f 1805/1805/1805 1806/1806/1806 1807/1807/1807 -f 1805/1805/1805 1807/1807/1807 1808/1808/1808 -v 5106.5 6215.99 2594.7 -vt 0.691189 0.600577 -v 5106.5 6215.99 -285.3 -vt 0.714464 0.600577 -v 5106.5 6380.99 -285.3 -vt 0.714464 0.602226 -v 5106.5 6380.99 2594.7 -vt 0.691189 0.602226 -o mesh341 -s off -f 1809/1809/1809 1810/1810/1810 1811/1811/1811 -f 1809/1809/1809 1811/1811/1811 1812/1812/1812 -g charts -o chart0000 -s off -f 1809/1809/1809 1810/1810/1810 1811/1811/1811 -f 1809/1809/1809 1811/1811/1811 1812/1812/1812 -v 9426.5 6215.99 -285.3 -vt 0.244112 0.707749 -v 9426.5 6380.99 -285.3 -vt 0.245636 0.707749 -v 9956.5 6380.99 -285.3 -vt 0.245636 0.702803 -v 9956.5 6020.99 -285.3 -vt 0.242311 0.702803 -v 9426.5 6215.99 -285.3 -vt 0.775977 0.575845 -v 9956.5 6020.99 -285.3 -vt 0.78065 0.574196 -v 10691.5 6020.99 -285.3 -vt 0.786783 0.575845 -v 9426.5 6215.99 -285.3 -vt 0.694514 0.687139 -v 10691.5 6020.99 -285.3 -vt 0.705112 0.687139 -v 10691.5 5855.99 -285.3 -vt 0.70532 0.685796 -v 9791.5 5855.99 -285.3 -vt 0.697955 0.684666 -v 9426.5 6215.99 -285.3 -vt 0.218204 0.662407 -v 9791.5 5855.99 -285.3 -vt 0.221529 0.65911 -v 9791.5 6215.99 -285.3 -vt 0.221529 0.662407 -o mesh342 -s off -f 1813/1813/1813 1814/1814/1814 1815/1815/1815 -f 1813/1813/1813 1815/1815/1815 1816/1816/1816 -f 1817/1817/1817 1818/1818/1818 1819/1819/1819 -f 1820/1820/1820 1821/1821/1821 1822/1822/1822 -f 1820/1820/1820 1822/1822/1822 1823/1823/1823 -f 1824/1824/1824 1825/1825/1825 1826/1826/1826 -g charts -o chart0000 -s off -f 1813/1813/1813 1814/1814/1814 1815/1815/1815 -f 1813/1813/1813 1815/1815/1815 1816/1816/1816 -o chart0001 -s off -f 1817/1817/1817 1818/1818/1818 1819/1819/1819 -o chart0002 -s off -f 1820/1820/1820 1821/1821/1821 1822/1822/1822 -f 1820/1820/1820 1822/1822/1822 1823/1823/1823 -o chart0003 -s off -f 1824/1824/1824 1825/1825/1825 1826/1826/1826 -v -5323.5 6215.99 -285.3 -vt 0.908977 0.312036 -v -5323.5 6215.99 2594.7 -vt 0.908977 0.288953 -v -5688.5 6215.99 2594.7 -vt 0.905653 0.288953 -v -5688.5 6215.99 -285.3 -vt 0.905653 0.312036 -o mesh343 -s off -f 1827/1827/1827 1828/1828/1828 1829/1829/1829 -f 1827/1827/1827 1829/1829/1829 1830/1830/1830 -g charts -o chart0000 -s off -f 1827/1827/1827 1828/1828/1828 1829/1829/1829 -f 1827/1827/1827 1829/1829/1829 1830/1830/1830 -v 501.501 4955.99 -285.3 -vt 0.630507 0.534625 -v 501.501 4955.99 2594.7 -vt 0.607232 0.534625 -v -638.499 4955.99 2594.7 -vt 0.607232 0.525556 -v -638.499 4955.99 -285.3 -vt 0.630507 0.525556 -o mesh344 -s off -f 1831/1831/1831 1832/1832/1832 1833/1833/1833 -f 1831/1831/1831 1833/1833/1833 1834/1834/1834 -g charts -o chart0000 -s off -f 1831/1831/1831 1832/1832/1832 1833/1833/1833 -f 1831/1831/1831 1833/1833/1833 1834/1834/1834 -v 5106.5 6215.99 -285.3 -vt 0.672901 0.899835 -v 5106.5 6215.99 2594.7 -vt 0.649626 0.899835 -v 4741.5 6215.99 2594.7 -vt 0.649626 0.896537 -v 4741.5 6215.99 -285.3 -vt 0.672901 0.896537 -o mesh345 -s off -f 1835/1835/1835 1836/1836/1836 1837/1837/1837 -f 1835/1835/1835 1837/1837/1837 1838/1838/1838 -g charts -o chart0000 -s off -f 1835/1835/1835 1836/1836/1836 1837/1837/1837 -f 1835/1835/1835 1837/1837/1837 1838/1838/1838 -v 9426.5 6380.99 -285.3 -vt 0.45345 0.5 -v 9426.5 6380.99 2594.7 -vt 0.45345 0.476917 -v 9956.5 6380.99 2594.7 -vt 0.448462 0.476917 -v 9956.5 6380.99 -285.3 -vt 0.448462 0.5 -o mesh346 -s off -f 1839/1839/1839 1840/1840/1840 1841/1841/1841 -f 1839/1839/1839 1841/1841/1841 1842/1842/1842 -g charts -o chart0000 -s off -f 1839/1839/1839 1840/1840/1840 1841/1841/1841 -f 1839/1839/1839 1841/1841/1841 1842/1842/1842 -v 3601.5 5120.99 -285.3 -vt 0.993765 0.999588 -v 3601.5 5120.99 2594.7 -vt 0.993765 0.976505 -v 4576.5 5120.99 2594.7 -vt 0.985453 0.976505 -v 4576.5 5120.99 -285.3 -vt 0.985453 0.999588 -o mesh347 -s off -f 1843/1843/1843 1844/1844/1844 1845/1845/1845 -f 1843/1843/1843 1845/1845/1845 1846/1846/1846 -g charts -o chart0000 -s off -f 1843/1843/1843 1844/1844/1844 1845/1845/1845 -f 1843/1843/1843 1845/1845/1845 1846/1846/1846 -v -1003.5 6380.99 -285.3 -vt 0.0203657 0.879225 -v -1003.5 6380.99 2594.7 -vt 0.0203657 0.856142 -v -473.499 6380.99 2594.7 -vt 0.0153782 0.856142 -v -473.499 6380.99 -285.3 -vt 0.0153782 0.879225 -o mesh348 -s off -f 1847/1847/1847 1848/1848/1848 1849/1849/1849 -f 1847/1847/1847 1849/1849/1849 1850/1850/1850 -g charts -o chart0000 -s off -f 1847/1847/1847 1848/1848/1848 1849/1849/1849 -f 1847/1847/1847 1849/1849/1849 1850/1850/1850 -v 4576.5 5120.99 2594.7 -vt 0.295172 0.843305 -v 3601.5 5120.99 2594.7 -vt 0.302992 0.843305 -v 3601.5 4955.99 2594.7 -vt 0.302992 0.8446 -v 4741.5 4955.99 2594.7 -vt 0.293849 0.8446 -v 4741.5 6215.99 2594.7 -vt 0.293849 0.834707 -v 4576.5 5120.99 2594.7 -vt 0.860765 0.0638912 -v 4741.5 6215.99 2594.7 -vt 0.85744 0.0724908 -v 5106.5 6215.99 2594.7 -vt 0.860765 0.0737839 -v 4576.5 5120.99 2594.7 -vt 0.404406 0.629431 -v 5106.5 6215.99 2594.7 -vt 0.395737 0.624485 -v 5106.5 6380.99 2594.7 -vt 0.394431 0.624485 -v 4576.5 6380.99 2594.7 -vt 0.394431 0.629431 -o mesh349 -s off -f 1851/1851/1851 1852/1852/1852 1853/1853/1853 -f 1851/1851/1851 1853/1853/1853 1854/1854/1854 -f 1851/1851/1851 1854/1854/1854 1855/1855/1855 -f 1856/1856/1856 1857/1857/1857 1858/1858/1858 -f 1859/1859/1859 1860/1860/1860 1861/1861/1861 -f 1859/1859/1859 1861/1861/1861 1862/1862/1862 -g charts -o chart0000 -s off -f 1851/1851/1851 1852/1852/1852 1853/1853/1853 -f 1851/1851/1851 1853/1853/1853 1854/1854/1854 -f 1851/1851/1851 1854/1854/1854 1855/1855/1855 -o chart0001 -s off -f 1856/1856/1856 1857/1857/1857 1858/1858/1858 -o chart0002 -s off -f 1859/1859/1859 1860/1860/1860 1861/1861/1861 -f 1859/1859/1859 1861/1861/1861 1862/1862/1862 -v 9956.5 6380.99 2594.7 -vt 0.664589 0.691284 -v 9426.5 6380.99 2594.7 -vt 0.664589 0.687139 -v 9426.5 6215.99 2594.7 -vt 0.665895 0.687139 -v 9791.5 6215.99 2594.7 -vt 0.665895 0.689994 -v 9791.5 5855.99 2594.7 -vt 0.668745 0.689994 -v 10691.5 5855.99 2594.7 -vt 0.668745 0.697032 -v 10691.5 6020.99 2594.7 -vt 0.667439 0.697032 -v 9956.5 6380.99 2594.7 -vt 0.822527 0.930338 -v 10691.5 6020.99 2594.7 -vt 0.828346 0.933636 -v 9956.5 6020.99 2594.7 -vt 0.822527 0.933636 -o mesh350 -s off -f 1863/1863/1863 1864/1864/1864 1865/1865/1865 -f 1863/1863/1863 1865/1865/1865 1866/1866/1866 -f 1863/1863/1863 1866/1866/1866 1867/1867/1867 -f 1863/1863/1863 1867/1867/1867 1868/1868/1868 -f 1863/1863/1863 1868/1868/1868 1869/1869/1869 -f 1870/1870/1870 1871/1871/1871 1872/1872/1872 -g charts -o chart0000 -s off -f 1863/1863/1863 1864/1864/1864 1865/1865/1865 -f 1863/1863/1863 1865/1865/1865 1866/1866/1866 -f 1863/1863/1863 1866/1866/1866 1867/1867/1867 -f 1863/1863/1863 1867/1867/1867 1868/1868/1868 -f 1863/1863/1863 1868/1868/1868 1869/1869/1869 -o chart0001 -s off -f 1870/1870/1870 1871/1871/1871 1872/1872/1872 -v -638.499 4955.99 2594.7 -vt 0.87739 0.927027 -v 501.501 4955.99 2594.7 -vt 0.868614 0.929514 -v 501.501 5120.99 2594.7 -vt 0.868246 0.928271 -v -473.499 5120.99 2594.7 -vt 0.875752 0.926144 -v -473.499 6380.99 2594.7 -vt 0.872942 0.916655 -v -1003.5 6380.99 2594.7 -vt 0.877022 0.915499 -v -1003.5 6215.99 2594.7 -vt 0.87739 0.916741 -v -638.499 4955.99 2594.7 -vt 0.874896 0.180956 -v -1003.5 6215.99 2594.7 -vt 0.871571 0.190849 -v -638.499 6215.99 2594.7 -vt 0.874896 0.190849 -o mesh351 -s off -f 1873/1873/1873 1874/1874/1874 1875/1875/1875 -f 1873/1873/1873 1875/1875/1875 1876/1876/1876 -f 1873/1873/1873 1876/1876/1876 1877/1877/1877 -f 1873/1873/1873 1877/1877/1877 1878/1878/1878 -f 1873/1873/1873 1878/1878/1878 1879/1879/1879 -f 1880/1880/1880 1881/1881/1881 1882/1882/1882 -g charts -o chart0000 -s off -f 1873/1873/1873 1874/1874/1874 1875/1875/1875 -f 1873/1873/1873 1875/1875/1875 1876/1876/1876 -f 1873/1873/1873 1876/1876/1876 1877/1877/1877 -f 1873/1873/1873 1877/1877/1877 1878/1878/1878 -f 1873/1873/1873 1878/1878/1878 1879/1879/1879 -o chart0001 -s off -f 1880/1880/1880 1881/1881/1881 1882/1882/1882 -v 501.501 5120.99 -285.3 -vt 0.571488 0.887469 -v 567.216 5120.99 -195.3 -vt 0.572022 0.888293 -v 1421.5 5120.99 -285.3 -vt 0.578969 0.887469 -v 1355.79 5120.99 -195.3 -vt 0.578435 0.888293 -o mesh352 -s off -f 1883/1883/1883 1884/1884/1884 1885/1885/1885 -f 1886/1886/1886 1885/1885/1885 1884/1884/1884 -g charts -o chart0000 -s off -f 1883/1883/1883 1884/1884/1884 1885/1885/1885 -f 1886/1886/1886 1885/1885/1885 1884/1884/1884 -v 567.216 5120.99 -195.3 -vt 0.0202619 0.653339 -v 501.501 5120.99 -285.3 -vt 0.0195345 0.654163 -v 501.501 5120.99 2594.7 -vt 0.0428096 0.654163 -o mesh353 -s off -f 1887/1887/1887 1888/1888/1888 1889/1889/1889 -g charts -o chart0000 -s off -f 1887/1887/1887 1888/1888/1888 1889/1889/1889 -v 567.216 5120.99 -195.3 -vt 0.816708 0.0358615 -v 501.501 5120.99 2594.7 -vt 0.816708 0.0581203 -v 567.216 5120.99 2504.7 -vt 0.815877 0.0573903 -o mesh354 -s off -f 1890/1890/1890 1891/1891/1891 1892/1892/1892 -g charts -o chart0000 -s off -f 1890/1890/1890 1891/1891/1891 1892/1892/1892 -v 567.216 5120.99 2504.7 -vt 0.0649566 0.382935 -v 501.501 5120.99 2594.7 -vt 0.0644223 0.383759 -v 1355.79 5120.99 2504.7 -vt 0.0713691 0.382935 -v 1421.5 5120.99 2594.7 -vt 0.0719035 0.383759 -o mesh355 -s off -f 1893/1893/1893 1894/1894/1894 1895/1895/1895 -f 1896/1896/1896 1895/1895/1895 1894/1894/1894 -g charts -o chart0000 -s off -f 1893/1893/1893 1894/1894/1894 1895/1895/1895 -f 1896/1896/1896 1895/1895/1895 1894/1894/1894 -v 1421.5 5120.99 -285.3 -vt 0.027847 0.438994 -v 1355.79 5120.99 -195.3 -vt 0.0270158 0.438273 -v 1421.5 5120.99 2594.7 -vt 0.027847 0.415911 -o mesh356 -s off -f 1897/1897/1897 1898/1898/1898 1899/1899/1899 -g charts -o chart0000 -s off -f 1897/1897/1897 1898/1898/1898 1899/1899/1899 -v 1421.5 5120.99 2594.7 -vt 0.350374 0.605523 -v 1355.79 5120.99 -195.3 -vt 0.372818 0.605523 -v 1355.79 5120.99 2504.7 -vt 0.35111 0.604699 -o mesh357 -s off -f 1900/1900/1900 1901/1901/1901 1902/1902/1902 -g charts -o chart0000 -s off -f 1900/1900/1900 1901/1901/1901 1902/1902/1902 -v 1421.5 4955.99 -285.3 -vt 0.892352 0.312036 -v 1399.6 4955.99 -255.3 -vt 0.891521 0.31186 -v 501.501 4955.99 -285.3 -vt 0.892352 0.304617 -v 523.406 4955.99 -255.3 -vt 0.891521 0.304793 -o mesh358 -s off -f 1903/1903/1903 1904/1904/1904 1905/1905/1905 -f 1906/1906/1906 1905/1905/1905 1904/1904/1904 -g charts -o chart0000 -s off -f 1903/1903/1903 1904/1904/1904 1905/1905/1905 -f 1906/1906/1906 1905/1905/1905 1904/1904/1904 -v 1399.6 4955.99 -255.3 -vt 0.943302 0.312861 -v 1421.5 4955.99 -285.3 -vt 0.943059 0.313685 -v 1421.5 4955.99 1874.7 -vt 0.960515 0.313685 -o mesh359 -s off -f 1907/1907/1907 1908/1908/1908 1909/1909/1909 -g charts -o chart0000 -s off -f 1907/1907/1907 1908/1908/1908 1909/1909/1909 -v 1399.6 4955.99 -255.3 -vt 0.750208 0.924567 -v 1421.5 4955.99 1874.7 -vt 0.733256 0.923743 -v 1399.6 4955.99 2564.7 -vt 0.727764 0.924567 -o mesh360 -s off -f 1910/1910/1910 1911/1911/1911 1912/1912/1912 -g charts -o chart0000 -s off -f 1910/1910/1910 1911/1911/1911 1912/1912/1912 -v 1399.6 4955.99 2564.7 -vt 0.478145 0.683842 -v 1421.5 4955.99 1874.7 -vt 0.472569 0.684666 -v 1421.5 4955.99 2594.7 -vt 0.478387 0.684666 -o mesh361 -s off -f 1913/1913/1913 1914/1914/1914 1915/1915/1915 -g charts -o chart0000 -s off -f 1913/1913/1913 1914/1914/1914 1915/1915/1915 -v 1399.6 4955.99 2564.7 -vt 0.514131 0.536921 -v 1421.5 4955.99 2594.7 -vt 0.5133 0.537098 -v 523.406 4955.99 2564.7 -vt 0.514131 0.529855 -v 501.501 4955.99 2594.7 -vt 0.5133 0.529678 -o mesh362 -s off -f 1916/1916/1916 1917/1917/1917 1918/1918/1918 -f 1919/1919/1919 1918/1918/1918 1917/1917/1917 -g charts -o chart0000 -s off -f 1916/1916/1916 1917/1917/1917 1918/1918/1918 -f 1919/1919/1919 1918/1918/1918 1917/1917/1917 -v 501.501 4955.99 -285.3 -vt 0.793433 0.748969 -v 523.406 4955.99 -255.3 -vt 0.79319 0.748145 -v 501.501 4955.99 2594.7 -vt 0.770158 0.748969 -o mesh363 -s off -f 1920/1920/1920 1921/1921/1921 1922/1922/1922 -g charts -o chart0000 -s off -f 1920/1920/1920 1921/1921/1921 1922/1922/1922 -v 501.501 4955.99 2594.7 -vt 0.84414 0.971558 -v 523.406 4955.99 -255.3 -vt 0.866583 0.971558 -v 523.406 4955.99 2564.7 -vt 0.844377 0.970734 -o mesh364 -s off -f 1923/1923/1923 1924/1924/1924 1925/1925/1925 -g charts -o chart0000 -s off -f 1923/1923/1923 1924/1924/1924 1925/1925/1925 -v 501.501 5120.99 -285.3 -vt 0.931421 0.275762 -v 1421.5 5120.99 -285.3 -vt 0.931421 0.268343 -v 1421.5 4955.99 -285.3 -vt 0.929759 0.268343 -v 501.501 4955.99 -285.3 -vt 0.929759 0.275762 -o mesh365 -s off -f 1926/1926/1926 1927/1927/1927 1928/1928/1928 -f 1926/1926/1926 1928/1928/1928 1929/1929/1929 -g charts -o chart0000 -s off -f 1926/1926/1926 1927/1927/1927 1928/1928/1928 -f 1926/1926/1926 1928/1928/1928 1929/1929/1929 -v 1421.5 5120.99 -285.3 -vt 0.740233 0.71352 -v 1421.5 5120.99 2594.7 -vt 0.716958 0.71352 -v 1421.5 4955.99 2594.7 -vt 0.716958 0.711871 -v 1421.5 4955.99 1874.7 -vt 0.722776 0.711871 -v 1421.5 4955.99 -285.3 -vt 0.740233 0.711871 -o mesh366 -s off -f 1930/1930/1930 1931/1931/1931 1932/1932/1932 -f 1930/1930/1930 1932/1932/1932 1933/1933/1933 -f 1930/1930/1930 1933/1933/1933 1934/1934/1934 -g charts -o chart0000 -s off -f 1930/1930/1930 1931/1931/1931 1932/1932/1932 -f 1930/1930/1930 1932/1932/1932 1933/1933/1933 -f 1930/1930/1930 1933/1933/1933 1934/1934/1934 -v 501.501 5120.99 2594.7 -vt 0.392768 0.301319 -v 501.501 5120.99 -285.3 -vt 0.416043 0.301319 -v 501.501 4955.99 -285.3 -vt 0.416043 0.302968 -v 501.501 4955.99 2594.7 -vt 0.392768 0.302968 -o mesh367 -s off -f 1935/1935/1935 1936/1936/1936 1937/1937/1937 -f 1935/1935/1935 1937/1937/1937 1938/1938/1938 -g charts -o chart0000 -s off -f 1935/1935/1935 1936/1936/1936 1937/1937/1937 -f 1935/1935/1935 1937/1937/1937 1938/1938/1938 -v 1421.5 5120.99 2594.7 -vt 0.978803 0.41014 -v 501.501 5120.99 2594.7 -vt 0.986284 0.41014 -v 501.501 4955.99 2594.7 -vt 0.986284 0.411789 -v 1421.5 4955.99 2594.7 -vt 0.978803 0.411789 -o mesh368 -s off -f 1939/1939/1939 1940/1940/1940 1941/1941/1941 -f 1939/1939/1939 1941/1941/1941 1942/1942/1942 -g charts -o chart0000 -s off -f 1939/1939/1939 1940/1940/1940 1941/1941/1941 -f 1939/1939/1939 1941/1941/1941 1942/1942/1942 -v 1355.79 5120.99 2504.7 -vt 0.127598 0.539571 -v 1355.79 4985.99 2504.7 -vt 0.127598 0.537923 -v 567.216 4985.99 2504.7 -vt 0.120948 0.537923 -v 567.216 5120.99 2504.7 -vt 0.120948 0.539571 -o mesh369 -s off -f 1943/1943/1943 1944/1944/1944 1945/1945/1945 -f 1943/1943/1943 1945/1945/1945 1946/1946/1946 -g charts -o chart0000 -s off -f 1943/1943/1943 1944/1944/1944 1945/1945/1945 -f 1943/1943/1943 1945/1945/1945 1946/1946/1946 -v 567.216 5120.99 2504.7 -vt 0.783458 0.16859 -v 567.216 4985.99 2504.7 -vt 0.781796 0.16859 -v 567.216 4985.99 -195.3 -vt 0.781796 0.147156 -v 567.216 5120.99 -195.3 -vt 0.783458 0.147156 -o mesh370 -s off -f 1947/1947/1947 1948/1948/1948 1949/1949/1949 -f 1947/1947/1947 1949/1949/1949 1950/1950/1950 -g charts -o chart0000 -s off -f 1947/1947/1947 1948/1948/1948 1949/1949/1949 -f 1947/1947/1947 1949/1949/1949 1950/1950/1950 -v 567.216 5120.99 -195.3 -vt 0.915628 0.899011 -v 567.216 4985.99 -195.3 -vt 0.91729 0.899011 -v 1355.79 4985.99 -195.3 -vt 0.91729 0.892416 -v 1355.79 5120.99 -195.3 -vt 0.915628 0.892416 -o mesh371 -s off -f 1951/1951/1951 1952/1952/1952 1953/1953/1953 -f 1951/1951/1951 1953/1953/1953 1954/1954/1954 -g charts -o chart0000 -s off -f 1951/1951/1951 1952/1952/1952 1953/1953/1953 -f 1951/1951/1951 1953/1953/1953 1954/1954/1954 -v 1355.79 4985.99 2504.7 -vt 0.216542 0.590684 -v 1355.79 5045.99 1947.82 -vt 0.212084 0.589951 -v 1355.79 4985.99 -195.3 -vt 0.194929 0.590684 -v 1355.79 5120.99 2504.7 -vt 0.216542 0.589035 -v 1355.79 5060.99 1947.82 -vt 0.212084 0.589768 -v 1355.79 5060.99 1921.57 -vt 0.211874 0.589768 -v 1355.79 5045.99 1921.57 -vt 0.211874 0.589951 -v 1355.79 5120.99 -195.3 -vt 0.194929 0.589035 -o mesh372 -s off -f 1955/1955/1955 1956/1956/1956 1957/1957/1957 -f 1956/1956/1956 1955/1955/1955 1958/1958/1958 -f 1956/1956/1956 1958/1958/1958 1959/1959/1959 -f 1959/1959/1959 1958/1958/1958 1960/1960/1960 -f 1957/1957/1957 1961/1961/1961 1962/1962/1962 -f 1961/1961/1961 1957/1957/1957 1956/1956/1956 -f 1962/1962/1962 1961/1961/1961 1960/1960/1960 -f 1962/1962/1962 1960/1960/1960 1958/1958/1958 -g charts -o chart0000 -s off -f 1955/1955/1955 1956/1956/1956 1957/1957/1957 -f 1956/1956/1956 1955/1955/1955 1958/1958/1958 -f 1956/1956/1956 1958/1958/1958 1959/1959/1959 -f 1959/1959/1959 1958/1958/1958 1960/1960/1960 -f 1957/1957/1957 1961/1961/1961 1962/1962/1962 -f 1961/1961/1961 1957/1957/1957 1956/1956/1956 -f 1962/1962/1962 1961/1961/1961 1960/1960/1960 -f 1962/1962/1962 1960/1960/1960 1958/1958/1958 -v 1399.6 4985.99 -255.3 -vt 0.650457 0.391179 -v 1355.79 4985.99 -195.3 -vt 0.649626 0.390808 -v 523.406 4985.99 -255.3 -vt 0.650457 0.383759 -v 567.216 4985.99 -195.3 -vt 0.649626 0.38413 -o mesh373 -s off -f 1963/1963/1963 1964/1964/1964 1965/1965/1965 -f 1966/1966/1966 1965/1965/1965 1964/1964/1964 -g charts -o chart0000 -s off -f 1963/1963/1963 1964/1964/1964 1965/1965/1965 -f 1966/1966/1966 1965/1965/1965 1964/1964/1964 -v 1355.79 4985.99 -195.3 -vt 0.340045 0.791838 -v 1399.6 4985.99 -255.3 -vt 0.339568 0.792663 -v 1399.6 4985.99 2564.7 -vt 0.362012 0.792663 -o mesh374 -s off -f 1967/1967/1967 1968/1968/1968 1969/1969/1969 -g charts -o chart0000 -s off -f 1967/1967/1967 1968/1968/1968 1969/1969/1969 -v 1355.79 4985.99 -195.3 -vt 0.0453034 0.147155 -v 1399.6 4985.99 2564.7 -vt 0.0677472 0.147156 -v 1355.79 4985.99 2504.7 -vt 0.0672537 0.146331 -o mesh375 -s off -f 1970/1970/1970 1971/1971/1971 1972/1972/1972 -g charts -o chart0000 -s off -f 1970/1970/1970 1971/1971/1971 1972/1972/1972 -v 1355.79 4985.99 2504.7 -vt 0.617664 0.971558 -v 1399.6 4985.99 2564.7 -vt 0.618038 0.970734 -v 567.216 4985.99 2504.7 -vt 0.610931 0.971558 -v 523.406 4985.99 2564.7 -vt 0.610557 0.970734 -o mesh376 -s off -f 1973/1973/1973 1974/1974/1974 1975/1975/1975 -f 1976/1976/1976 1975/1975/1975 1974/1974/1974 -g charts -o chart0000 -s off -f 1973/1973/1973 1974/1974/1974 1975/1975/1975 -f 1976/1976/1976 1975/1975/1975 1974/1974/1974 -v 523.406 4985.99 -255.3 -vt 0.712801 0.346661 -v 567.216 4985.99 -195.3 -vt 0.71197 0.346187 -v 523.406 4985.99 2564.7 -vt 0.712801 0.324402 -o mesh377 -s off -f 1977/1977/1977 1978/1978/1978 1979/1979/1979 -g charts -o chart0000 -s off -f 1977/1977/1977 1978/1978/1978 1979/1979/1979 -v 523.406 4985.99 2564.7 -vt 0.763508 0.751443 -v 567.216 4985.99 -195.3 -vt 0.785952 0.751443 -v 567.216 4985.99 2504.7 -vt 0.764001 0.750618 -o mesh378 -s off -f 1980/1980/1980 1981/1981/1981 1982/1982/1982 -g charts -o chart0000 -s off -f 1980/1980/1980 1981/1981/1981 1982/1982/1982 -v 523.406 4955.99 2564.7 -vt 0.948878 0.158697 -v 523.406 4955.99 -255.3 -vt 0.948878 0.180956 -v 523.406 4985.99 -255.3 -vt 0.949709 0.180956 -v 523.406 4985.99 2564.7 -vt 0.949709 0.158697 -o mesh379 -s off -f 1983/1983/1983 1984/1984/1984 1985/1985/1985 -f 1983/1983/1983 1985/1985/1985 1986/1986/1986 -g charts -o chart0000 -s off -f 1983/1983/1983 1984/1984/1984 1985/1985/1985 -f 1983/1983/1983 1985/1985/1985 1986/1986/1986 -v 523.406 4955.99 -255.3 -vt 0.852452 0.0333882 -v 1399.6 4955.99 -255.3 -vt 0.844971 0.0333882 -v 1399.6 4985.99 -255.3 -vt 0.844971 0.0325639 -v 523.406 4985.99 -255.3 -vt 0.852452 0.0325639 -o mesh380 -s off -f 1987/1987/1987 1988/1988/1988 1989/1989/1989 -f 1987/1987/1987 1989/1989/1989 1990/1990/1990 -g charts -o chart0000 -s off -f 1987/1987/1987 1988/1988/1988 1989/1989/1989 -f 1987/1987/1987 1989/1989/1989 1990/1990/1990 -v 1399.6 4955.99 -255.3 -vt 0.379468 0.37634 -v 1399.6 4955.99 2564.7 -vt 0.379468 0.354081 -v 1399.6 4985.99 2564.7 -vt 0.378637 0.354081 -v 1399.6 4985.99 -255.3 -vt 0.378637 0.37634 -o mesh381 -s off -f 1991/1991/1991 1992/1992/1992 1993/1993/1993 -f 1991/1991/1991 1993/1993/1993 1994/1994/1994 -g charts -o chart0000 -s off -f 1991/1991/1991 1992/1992/1992 1993/1993/1993 -f 1991/1991/1991 1993/1993/1993 1994/1994/1994 -v 1399.6 4955.99 2564.7 -vt 0.628845 0.443941 -v 523.406 4955.99 2564.7 -vt 0.628845 0.45136 -v 523.406 4985.99 2564.7 -vt 0.629676 0.45136 -v 1399.6 4985.99 2564.7 -vt 0.629676 0.443941 -o mesh382 -s off -f 1995/1995/1995 1996/1996/1996 1997/1997/1997 -f 1995/1995/1995 1997/1997/1997 1998/1998/1998 -g charts -o chart0000 -s off -f 1995/1995/1995 1996/1996/1996 1997/1997/1997 -f 1995/1995/1995 1997/1997/1997 1998/1998/1998 -v 1421.5 5098.49 -285.3 -vt 0.940565 0.336768 -v 1571.5 5098.49 -75.3003 -vt 0.939378 0.335085 -v 2681.5 5098.49 -285.3 -vt 0.93059 0.336768 -v 1421.5 5098.49 2594.7 -vt 0.940565 0.313685 -v 1571.5 5098.49 2444.7 -vt 0.939378 0.314887 -v 2531.5 5098.49 2444.7 -vt 0.931778 0.314887 -v 2531.5 5098.49 -75.3003 -vt 0.931778 0.335085 -v 2681.5 5098.49 2594.7 -vt 0.93059 0.313685 -o mesh383 -s off -f 1999/1999/1999 2000/2000/2000 2001/2001/2001 -f 2000/2000/2000 1999/1999/1999 2002/2002/2002 -f 2000/2000/2000 2002/2002/2002 2003/2003/2003 -f 2003/2003/2003 2002/2002/2002 2004/2004/2004 -f 2001/2001/2001 2005/2005/2005 2006/2006/2006 -f 2005/2005/2005 2001/2001/2001 2000/2000/2000 -f 2006/2006/2006 2005/2005/2005 2004/2004/2004 -f 2006/2006/2006 2004/2004/2004 2002/2002/2002 -g charts -o chart0000 -s off -f 1999/1999/1999 2000/2000/2000 2001/2001/2001 -f 2000/2000/2000 1999/1999/1999 2002/2002/2002 -f 2000/2000/2000 2002/2002/2002 2003/2003/2003 -f 2003/2003/2003 2002/2002/2002 2004/2004/2004 -f 2001/2001/2001 2005/2005/2005 2006/2006/2006 -f 2005/2005/2005 2001/2001/2001 2000/2000/2000 -f 2006/2006/2006 2005/2005/2005 2004/2004/2004 -f 2006/2006/2006 2004/2004/2004 2002/2002/2002 -v 2681.5 4933.49 -285.3 -vt 0.272236 0.611294 -v 2651.5 4933.49 -255.3 -vt 0.271405 0.611059 -v 1421.5 4933.49 -285.3 -vt 0.272236 0.601402 -v 1451.5 4933.49 -255.3 -vt 0.271405 0.601637 -o mesh384 -s off -f 2007/2007/2007 2008/2008/2008 2009/2009/2009 -f 2010/2010/2010 2009/2009/2009 2008/2008/2008 -g charts -o chart0000 -s off -f 2007/2007/2007 2008/2008/2008 2009/2009/2009 -f 2010/2010/2010 2009/2009/2009 2008/2008/2008 -v 2651.5 4933.49 -255.3 -vt 0.676469 0.797609 -v 2681.5 4933.49 -285.3 -vt 0.676226 0.798434 -v 2681.5 4933.49 2594.7 -vt 0.699501 0.798434 -o mesh385 -s off -f 2011/2011/2011 2012/2012/2012 2013/2013/2013 -g charts -o chart0000 -s off -f 2011/2011/2011 2012/2012/2012 2013/2013/2013 -v 2651.5 4933.49 -255.3 -vt 0.291355 0.408491 -v 2681.5 4933.49 2594.7 -vt 0.313799 0.408491 -v 2651.5 4933.49 2564.7 -vt 0.31356 0.407667 -o mesh386 -s off -f 2014/2014/2014 2015/2015/2015 2016/2016/2016 -g charts -o chart0000 -s off -f 2014/2014/2014 2015/2015/2015 2016/2016/2016 -v 2651.5 4933.49 2564.7 -vt 0.415212 0.65063 -v 2681.5 4933.49 2594.7 -vt 0.414381 0.650865 -v 1451.5 4933.49 2564.7 -vt 0.415212 0.641208 -v 1421.5 4933.49 2594.7 -vt 0.414381 0.640973 -o mesh387 -s off -f 2017/2017/2017 2018/2018/2018 2019/2019/2019 -f 2020/2020/2020 2019/2019/2019 2018/2018/2018 -g charts -o chart0000 -s off -f 2017/2017/2017 2018/2018/2018 2019/2019/2019 -f 2020/2020/2020 2019/2019/2019 2018/2018/2018 -v 1421.5 4933.49 -285.3 -vt 0.726933 0.835532 -v 1451.5 4933.49 -255.3 -vt 0.72669 0.834707 -v 1421.5 4933.49 2594.7 -vt 0.703658 0.835532 -o mesh388 -s off -f 2021/2021/2021 2022/2022/2022 2023/2023/2023 -g charts -o chart0000 -s off -f 2021/2021/2021 2022/2022/2022 2023/2023/2023 -v 1421.5 4933.49 2594.7 -vt 0.368662 0.777823 -v 1451.5 4933.49 -255.3 -vt 0.391106 0.777823 -v 1451.5 4933.49 2564.7 -vt 0.3689 0.776999 -o mesh389 -s off -f 2024/2024/2024 2025/2025/2025 2026/2026/2026 -g charts -o chart0000 -s off -f 2024/2024/2024 2025/2025/2025 2026/2026/2026 -v 1421.5 5098.49 -285.3 -vt 0.947215 0.999588 -v 2681.5 5098.49 -285.3 -vt 0.93724 0.999588 -v 2681.5 4933.49 -285.3 -vt 0.93724 0.997939 -v 1421.5 4933.49 -285.3 -vt 0.947215 0.997939 -o mesh390 -s off -f 2027/2027/2027 2028/2028/2028 2029/2029/2029 -f 2027/2027/2027 2029/2029/2029 2030/2030/2030 -g charts -o chart0000 -s off -f 2027/2027/2027 2028/2028/2028 2029/2029/2029 -f 2027/2027/2027 2029/2029/2029 2030/2030/2030 -v 2681.5 5098.49 -285.3 -vt 0.0785535 0.909728 -v 2681.5 5098.49 2594.7 -vt 0.0785535 0.886645 -v 2681.5 4933.49 2594.7 -vt 0.0768911 0.886645 -v 2681.5 4933.49 -285.3 -vt 0.0768911 0.909728 -o mesh391 -s off -f 2031/2031/2031 2032/2032/2032 2033/2033/2033 -f 2031/2031/2031 2033/2033/2033 2034/2034/2034 -g charts -o chart0000 -s off -f 2031/2031/2031 2032/2032/2032 2033/2033/2033 -f 2031/2031/2031 2033/2033/2033 2034/2034/2034 -v 1421.5 5098.49 2594.7 -vt 0.205736 0.843776 -v 1421.5 5098.49 -285.3 -vt 0.229011 0.843776 -v 1421.5 4933.49 -285.3 -vt 0.229011 0.845424 -v 1421.5 4933.49 2594.7 -vt 0.205736 0.845424 -o mesh392 -s off -f 2035/2035/2035 2036/2036/2036 2037/2037/2037 -f 2035/2035/2035 2037/2037/2037 2038/2038/2038 -g charts -o chart0000 -s off -f 2035/2035/2035 2036/2036/2036 2037/2037/2037 -f 2035/2035/2035 2037/2037/2037 2038/2038/2038 -v 2681.5 5098.49 2594.7 -vt 0.140067 0.487634 -v 1421.5 5098.49 2594.7 -vt 0.150041 0.487634 -v 1421.5 4933.49 2594.7 -vt 0.150041 0.489283 -v 2681.5 4933.49 2594.7 -vt 0.140067 0.489283 -o mesh393 -s off -f 2039/2039/2039 2040/2040/2040 2041/2041/2041 -f 2039/2039/2039 2041/2041/2041 2042/2042/2042 -g charts -o chart0000 -s off -f 2039/2039/2039 2040/2040/2040 2041/2041/2041 -f 2039/2039/2039 2041/2041/2041 2042/2042/2042 -v 1571.5 5098.49 2444.7 -vt 0.282211 0.406843 -v 2038.38 5038.49 2444.7 -vt 0.278168 0.407575 -v 1571.5 4963.49 2444.7 -vt 0.282211 0.408491 -v 2531.5 5098.49 2444.7 -vt 0.273899 0.406843 -v 2064.63 5038.49 2444.7 -vt 0.277941 0.407575 -v 2064.63 5023.49 2444.7 -vt 0.277941 0.407758 -v 2038.38 5023.49 2444.7 -vt 0.278168 0.407758 -v 2531.5 4963.49 2444.7 -vt 0.273899 0.408491 -o mesh394 -s off -f 2043/2043/2043 2044/2044/2044 2045/2045/2045 -f 2044/2044/2044 2043/2043/2043 2046/2046/2046 -f 2044/2044/2044 2046/2046/2046 2047/2047/2047 -f 2047/2047/2047 2046/2046/2046 2048/2048/2048 -f 2045/2045/2045 2049/2049/2049 2050/2050/2050 -f 2049/2049/2049 2045/2045/2045 2044/2044/2044 -f 2050/2050/2050 2049/2049/2049 2048/2048/2048 -f 2050/2050/2050 2048/2048/2048 2046/2046/2046 -g charts -o chart0000 -s off -f 2043/2043/2043 2044/2044/2044 2045/2045/2045 -f 2044/2044/2044 2043/2043/2043 2046/2046/2046 -f 2044/2044/2044 2046/2046/2046 2047/2047/2047 -f 2047/2047/2047 2046/2046/2046 2048/2048/2048 -f 2045/2045/2045 2049/2049/2049 2050/2050/2050 -f 2049/2049/2049 2045/2045/2045 2044/2044/2044 -f 2050/2050/2050 2049/2049/2049 2048/2048/2048 -f 2050/2050/2050 2048/2048/2048 2046/2046/2046 -v 2651.5 4963.49 -255.3 -vt 0.989609 0.0300906 -v 2531.5 4963.49 -75.3003 -vt 0.990607 0.0286698 -v 1451.5 4963.49 -255.3 -vt 0.999584 0.0300906 -v 2651.5 4963.49 2564.7 -vt 0.989609 0.00783182 -v 2531.5 4963.49 2444.7 -vt 0.990607 0.00877895 -v 1571.5 4963.49 2444.7 -vt 0.998587 0.00877895 -v 1571.5 4963.49 -75.3003 -vt 0.998587 0.0286698 -v 1451.5 4963.49 2564.7 -vt 0.999584 0.00783182 -o mesh395 -s off -f 2051/2051/2051 2052/2052/2052 2053/2053/2053 -f 2052/2052/2052 2051/2051/2051 2054/2054/2054 -f 2052/2052/2052 2054/2054/2054 2055/2055/2055 -f 2055/2055/2055 2054/2054/2054 2056/2056/2056 -f 2053/2053/2053 2057/2057/2057 2058/2058/2058 -f 2057/2057/2057 2053/2053/2053 2052/2052/2052 -f 2058/2058/2058 2057/2057/2057 2056/2056/2056 -f 2058/2058/2058 2056/2056/2056 2054/2054/2054 -g charts -o chart0000 -s off -f 2051/2051/2051 2052/2052/2052 2053/2053/2053 -f 2052/2052/2052 2051/2051/2051 2054/2054/2054 -f 2052/2052/2052 2054/2054/2054 2055/2055/2055 -f 2055/2055/2055 2054/2054/2054 2056/2056/2056 -f 2053/2053/2053 2057/2057/2057 2058/2058/2058 -f 2057/2057/2057 2053/2053/2053 2052/2052/2052 -f 2058/2058/2058 2057/2057/2057 2056/2056/2056 -f 2058/2058/2058 2056/2056/2056 2054/2054/2054 -v 1451.5 4933.49 2564.7 -vt 0.691189 0.884996 -v 1451.5 4933.49 -255.3 -vt 0.713632 0.884996 -v 1451.5 4963.49 -255.3 -vt 0.713632 0.88582 -v 1451.5 4963.49 2564.7 -vt 0.691189 0.88582 -o mesh396 -s off -f 2059/2059/2059 2060/2060/2060 2061/2061/2061 -f 2059/2059/2059 2061/2061/2061 2062/2062/2062 -g charts -o chart0000 -s off -f 2059/2059/2059 2060/2060/2060 2061/2061/2061 -f 2059/2059/2059 2061/2061/2061 2062/2062/2062 -v 1451.5 4933.49 -255.3 -vt 0.706151 0.612943 -v 2651.5 4933.49 -255.3 -vt 0.696176 0.612943 -v 2651.5 4963.49 -255.3 -vt 0.696176 0.612119 -v 1451.5 4963.49 -255.3 -vt 0.706151 0.612119 -o mesh397 -s off -f 2063/2063/2063 2064/2064/2064 2065/2065/2065 -f 2063/2063/2063 2065/2065/2065 2066/2066/2066 -g charts -o chart0000 -s off -f 2063/2063/2063 2064/2064/2064 2065/2065/2065 -f 2063/2063/2063 2065/2065/2065 2066/2066/2066 -v 2651.5 4933.49 -255.3 -vt 0.362012 0.341715 -v 2651.5 4933.49 2564.7 -vt 0.339568 0.341715 -v 2651.5 4963.49 2564.7 -vt 0.339568 0.34089 -v 2651.5 4963.49 -255.3 -vt 0.362012 0.34089 -o mesh398 -s off -f 2067/2067/2067 2068/2068/2068 2069/2069/2069 -f 2067/2067/2067 2069/2069/2069 2070/2070/2070 -g charts -o chart0000 -s off -f 2067/2067/2067 2068/2068/2068 2069/2069/2069 -f 2067/2067/2067 2069/2069/2069 2070/2070/2070 -v 2651.5 4933.49 2564.7 -vt 0.30133 0.991344 -v 1451.5 4933.49 2564.7 -vt 0.311305 0.991344 -v 1451.5 4963.49 2564.7 -vt 0.311305 0.992168 -v 2651.5 4963.49 2564.7 -vt 0.30133 0.992168 -o mesh399 -s off -f 2071/2071/2071 2072/2072/2072 2073/2073/2073 -f 2071/2071/2071 2073/2073/2073 2074/2074/2074 -g charts -o chart0000 -s off -f 2071/2071/2071 2072/2072/2072 2073/2073/2073 -f 2071/2071/2071 2073/2073/2073 2074/2074/2074 -v 1571.5 5098.49 -75.3003 -vt 0.173317 0.373042 -v 1571.5 4963.49 -75.3003 -vt 0.174979 0.373042 -v 2531.5 4963.49 -75.3003 -vt 0.174979 0.364798 -v 2531.5 5098.49 -75.3003 -vt 0.173317 0.364798 -o mesh400 -s off -f 2075/2075/2075 2076/2076/2076 2077/2077/2077 -f 2075/2075/2075 2077/2077/2077 2078/2078/2078 -g charts -o chart0000 -s off -f 2075/2075/2075 2076/2076/2076 2077/2077/2077 -f 2075/2075/2075 2077/2077/2077 2078/2078/2078 -v 2531.5 4963.49 2444.7 -vt 0.842477 0.984748 -v 2531.5 5023.49 1947.82 -vt 0.838543 0.984016 -v 2531.5 4963.49 -75.3003 -vt 0.822527 0.984748 -v 2531.5 5098.49 2444.7 -vt 0.842477 0.9831 -v 2531.5 5038.49 1947.82 -vt 0.838543 0.983833 -v 2531.5 5038.49 1921.57 -vt 0.838336 0.983833 -v 2531.5 5023.49 1921.57 -vt 0.838336 0.984016 -v 2531.5 5098.49 -75.3003 -vt 0.822527 0.9831 -o mesh401 -s off -f 2079/2079/2079 2080/2080/2080 2081/2081/2081 -f 2080/2080/2080 2079/2079/2079 2082/2082/2082 -f 2080/2080/2080 2082/2082/2082 2083/2083/2083 -f 2083/2083/2083 2082/2082/2082 2084/2084/2084 -f 2081/2081/2081 2085/2085/2085 2086/2086/2086 -f 2085/2085/2085 2081/2081/2081 2080/2080/2080 -f 2086/2086/2086 2085/2085/2085 2084/2084/2084 -f 2086/2086/2086 2084/2084/2084 2082/2082/2082 -g charts -o chart0000 -s off -f 2079/2079/2079 2080/2080/2080 2081/2081/2081 -f 2080/2080/2080 2079/2079/2079 2082/2082/2082 -f 2080/2080/2080 2082/2082/2082 2083/2083/2083 -f 2083/2083/2083 2082/2082/2082 2084/2084/2084 -f 2081/2081/2081 2085/2085/2085 2086/2086/2086 -f 2085/2085/2085 2081/2081/2081 2080/2080/2080 -f 2086/2086/2086 2085/2085/2085 2084/2084/2084 -f 2086/2086/2086 2084/2084/2084 2082/2082/2082 -v 1571.5 5098.49 2444.7 -vt 0.165835 0.693734 -v 1571.5 4963.49 2444.7 -vt 0.164173 0.693734 -v 1571.5 4963.49 -75.3003 -vt 0.164173 0.673949 -v 1571.5 5098.49 -75.3003 -vt 0.165835 0.673949 -o mesh402 -s off -f 2087/2087/2087 2088/2088/2088 2089/2089/2089 -f 2087/2087/2087 2089/2089/2089 2090/2090/2090 -g charts -o chart0000 -s off -f 2087/2087/2087 2088/2088/2088 2089/2089/2089 -f 2087/2087/2087 2089/2089/2089 2090/2090/2090 -v 2531.5 4963.49 2444.7 -vt 0.583125 0.919621 -v 1571.5 4963.49 2444.7 -vt 0.583125 0.911377 -v 1571.5 4963.49 -75.3003 -vt 0.563175 0.911377 -v 2531.5 4963.49 -75.3003 -vt 0.563175 0.919621 -o mesh403 -s off -f 2091/2091/2091 2092/2092/2092 2093/2093/2093 -f 2091/2091/2091 2093/2093/2093 2094/2094/2094 -g charts -o chart0000 -s off -f 2091/2091/2091 2092/2092/2092 2093/2093/2093 -f 2091/2091/2091 2093/2093/2093 2094/2094/2094 -v -12168.5 -2079.01 2594.7 -vt 0.919436 0.0498763 -v -12168.5 4955.99 2594.7 -vt 0.975478 0.0498763 -v -6768.5 4955.99 2594.7 -vt 0.975478 0.00700742 -v -6768.5 -2244.01 2594.7 -vt 0.918121 0.00700742 -v -8193.5 -2244.01 2594.7 -vt 0.918121 0.01832 -v -12168.5 -2079.01 2594.7 -vt 0.921446 0.412613 -v -8193.5 -2244.01 2594.7 -vt 0.889859 0.410965 -v -8193.5 -2079.01 2594.7 -vt 0.889859 0.412613 -o mesh404 -s off -f 2095/2095/2095 2096/2096/2096 2097/2097/2097 -f 2095/2095/2095 2097/2097/2097 2098/2098/2098 -f 2095/2095/2095 2098/2098/2098 2099/2099/2099 -f 2100/2100/2100 2101/2101/2101 2102/2102/2102 -g charts -o chart0000 -s off -f 2095/2095/2095 2096/2096/2096 2097/2097/2097 -f 2095/2095/2095 2097/2097/2097 2098/2098/2098 -f 2095/2095/2095 2098/2098/2098 2099/2099/2099 -o chart0001 -s off -f 2100/2100/2100 2101/2101/2101 2102/2102/2102 -v -8193.5 -2244.01 2594.7 -vt 0.385287 0.937758 -v -6768.5 -2244.01 2594.7 -vt 0.373649 0.937758 -v -6768.5 -2244.01 2954.7 -vt 0.373649 0.93446 -v -8193.5 -2244.01 2954.7 -vt 0.385287 0.93446 -o mesh405 -s off -f 2103/2103/2103 2104/2104/2104 2105/2105/2105 -f 2103/2103/2103 2105/2105/2105 2106/2106/2106 -g charts -o chart0000 -s off -f 2103/2103/2103 2104/2104/2104 2105/2105/2105 -f 2103/2103/2103 2105/2105/2105 2106/2106/2106 -v -12168.5 -2079.01 2594.7 -vt 0.191604 0.594806 -v -8193.5 -2079.01 2594.7 -vt 0.160017 0.594806 -v -8193.5 -2079.01 2954.7 -vt 0.160017 0.591509 -v -12168.5 -2079.01 2954.7 -vt 0.191604 0.591509 -o mesh406 -s off -f 2107/2107/2107 2108/2108/2108 2109/2109/2109 -f 2107/2107/2107 2109/2109/2109 2110/2110/2110 -g charts -o chart0000 -s off -f 2107/2107/2107 2108/2108/2108 2109/2109/2109 -f 2107/2107/2107 2109/2109/2109 2110/2110/2110 -v -12168.5 4955.99 2954.7 -vt 0.246467 0.970734 -v -12168.5 -2079.01 2954.7 -vt 0.19795 0.943528 -v -8193.5 -2079.01 2954.7 -vt 0.182461 0.970734 -v -12168.5 4955.99 2954.7 -vt 0.663757 0.965787 -v -8193.5 -2079.01 2954.7 -vt 0.694458 0.909598 -v -8193.5 -2244.01 2954.7 -vt 0.695576 0.908904 -v -6768.5 -2244.01 2954.7 -vt 0.706982 0.908904 -v -6768.5 4955.99 2954.7 -vt 0.706982 0.965787 -o mesh407 -s off -f 2111/2111/2111 2112/2112/2112 2113/2113/2113 -f 2114/2114/2114 2115/2115/2115 2116/2116/2116 -f 2114/2114/2114 2116/2116/2116 2117/2117/2117 -f 2114/2114/2114 2117/2117/2117 2118/2118/2118 -g charts -o chart0000 -s off -f 2111/2111/2111 2112/2112/2112 2113/2113/2113 -o chart0001 -s off -f 2114/2114/2114 2115/2115/2115 2116/2116/2116 -f 2114/2114/2114 2116/2116/2116 2117/2117/2117 -f 2114/2114/2114 2117/2117/2117 2118/2118/2118 -v -12168.5 4955.99 2594.7 -vt 0.266417 0.420033 -v -12168.5 -2079.01 2594.7 -vt 0.322111 0.420033 -v -12168.5 -2079.01 2954.7 -vt 0.322111 0.42333 -v -12168.5 4955.99 2954.7 -vt 0.266417 0.42333 -o mesh408 -s off -f 2119/2119/2119 2120/2120/2120 2121/2121/2121 -f 2119/2119/2119 2121/2121/2121 2122/2122/2122 -g charts -o chart0000 -s off -f 2119/2119/2119 2120/2120/2120 2121/2121/2121 -f 2119/2119/2119 2121/2121/2121 2122/2122/2122 -v -6768.5 4955.99 2594.7 -vt 0.948047 0.194147 -v -12168.5 4955.99 2594.7 -vt 0.948047 0.237016 -v -12168.5 4955.99 2954.7 -vt 0.951371 0.237016 -v -6768.5 4955.99 2954.7 -vt 0.951371 0.194147 -o mesh409 -s off -f 2123/2123/2123 2124/2124/2124 2125/2125/2125 -f 2123/2123/2123 2125/2125/2125 2126/2126/2126 -g charts -o chart0000 -s off -f 2123/2123/2123 2124/2124/2124 2125/2125/2125 -f 2123/2123/2123 2125/2125/2125 2126/2126/2126 -v -6768.5 -2244.01 2594.7 -vt 0.750208 0.310387 -v -6768.5 4955.99 2594.7 -vt 0.692851 0.310387 -v -6768.5 4955.99 2954.7 -vt 0.692851 0.30709 -v -6768.5 -2244.01 2954.7 -vt 0.750208 0.30709 -o mesh410 -s off -f 2127/2127/2127 2128/2128/2128 2129/2129/2129 -f 2127/2127/2127 2129/2129/2129 2130/2130/2130 -g charts -o chart0000 -s off -f 2127/2127/2127 2128/2128/2128 2129/2129/2129 -f 2127/2127/2127 2129/2129/2129 2130/2130/2130 -v -8193.5 -2079.01 2594.7 -vt 0.825021 0.314509 -v -8193.5 -2244.01 2594.7 -vt 0.825021 0.316158 -v -8193.5 -2244.01 2954.7 -vt 0.821696 0.316158 -v -8193.5 -2079.01 2954.7 -vt 0.821696 0.314509 -o mesh411 -s off -f 2131/2131/2131 2132/2132/2132 2133/2133/2133 -f 2131/2131/2131 2133/2133/2133 2134/2134/2134 -g charts -o chart0000 -s off -f 2131/2131/2131 2132/2132/2132 2133/2133/2133 -f 2131/2131/2131 2133/2133/2133 2134/2134/2134 -v -8133.5 -8394.01 2789.7 -vt 0.830839 0.199917 -v -6768.5 -8394.01 2789.7 -vt 0.830839 0.1892 -v -6768.5 -8394.01 2954.7 -vt 0.829177 0.1892 -v -8133.5 -8394.01 2954.7 -vt 0.829177 0.199917 -o mesh412 -s off -f 2135/2135/2135 2136/2136/2136 2137/2137/2137 -f 2135/2135/2135 2137/2137/2137 2138/2138/2138 -g charts -o chart0000 -s off -f 2135/2135/2135 2136/2136/2136 2137/2137/2137 -f 2135/2135/2135 2137/2137/2137 2138/2138/2138 -v -6933.5 -2244.01 2789.7 -vt 0.243498 0.645919 -v -6768.5 -2244.01 2789.7 -vt 0.244805 0.645919 -v -6768.5 -8394.01 2789.7 -vt 0.244805 0.694559 -v -8133.5 -8394.01 2789.7 -vt 0.233998 0.694559 -v -8133.5 -8229.01 2789.7 -vt 0.233998 0.693254 -v -6933.5 -2244.01 2789.7 -vt 0.633001 0.534625 -v -8133.5 -8229.01 2789.7 -vt 0.681214 0.534625 -v -6933.5 -8229.01 2789.7 -vt 0.67935 0.524732 -o mesh413 -s off -f 2139/2139/2139 2140/2140/2140 2141/2141/2141 -f 2139/2139/2139 2141/2141/2141 2142/2142/2142 -f 2139/2139/2139 2142/2142/2142 2143/2143/2143 -f 2144/2144/2144 2145/2145/2145 2146/2146/2146 -g charts -o chart0000 -s off -f 2139/2139/2139 2140/2140/2140 2141/2141/2141 -f 2139/2139/2139 2141/2141/2141 2142/2142/2142 -f 2139/2139/2139 2142/2142/2142 2143/2143/2143 -o chart0001 -s off -f 2144/2144/2144 2145/2145/2145 2146/2146/2146 -v -6768.5 -2244.01 2954.7 -vt 0.356193 0.977329 -v -6933.5 -2244.01 2954.7 -vt 0.356157 0.97568 -v -6933.5 -8229.01 2954.7 -vt 0.308811 0.977329 -v -6768.5 -2244.01 2954.7 -vt 0.85744 0.981451 -v -6933.5 -8229.01 2954.7 -vt 0.810528 0.971558 -v -8133.5 -8229.01 2954.7 -vt 0.808396 0.981451 -v -6768.5 -2244.01 2954.7 -vt 0.428512 0.498351 -v -8133.5 -8229.01 2954.7 -vt 0.380784 0.487634 -v -8133.5 -8394.01 2954.7 -vt 0.379468 0.487634 -v -6768.5 -8394.01 2954.7 -vt 0.379468 0.498351 -o mesh414 -s off -f 2147/2147/2147 2148/2148/2148 2149/2149/2149 -f 2150/2150/2150 2151/2151/2151 2152/2152/2152 -f 2153/2153/2153 2154/2154/2154 2155/2155/2155 -f 2153/2153/2153 2155/2155/2155 2156/2156/2156 -g charts -o chart0000 -s off -f 2147/2147/2147 2148/2148/2148 2149/2149/2149 -o chart0001 -s off -f 2150/2150/2150 2151/2151/2151 2152/2152/2152 -o chart0002 -s off -f 2153/2153/2153 2154/2154/2154 2155/2155/2155 -f 2153/2153/2153 2155/2155/2155 2156/2156/2156 -v -6768.5 -2244.01 2789.7 -vt 0.859933 0.902308 -v -6768.5 -2244.01 2954.7 -vt 0.859933 0.903957 -v -6768.5 -8394.01 2954.7 -vt 0.810889 0.903957 -v -6768.5 -8394.01 2789.7 -vt 0.810889 0.902308 -o mesh415 -s off -f 2157/2157/2157 2158/2158/2158 2159/2159/2159 -f 2157/2157/2157 2159/2159/2159 2160/2160/2160 -g charts -o chart0000 -s off -f 2157/2157/2157 2158/2158/2158 2159/2159/2159 -f 2157/2157/2157 2159/2159/2159 2160/2160/2160 -v -6933.5 -2244.01 2789.7 -vt 0.871571 0.63108 -v -6933.5 -8229.01 2789.7 -vt 0.918953 0.63108 -v -6933.5 -8229.01 2954.7 -vt 0.918953 0.632729 -v -6933.5 -2244.01 2954.7 -vt 0.871571 0.632729 -o mesh416 -s off -f 2161/2161/2161 2162/2162/2162 2163/2163/2163 -f 2161/2161/2161 2163/2163/2163 2164/2164/2164 -g charts -o chart0000 -s off -f 2161/2161/2161 2162/2162/2162 2163/2163/2163 -f 2161/2161/2161 2163/2163/2163 2164/2164/2164 -v -8133.5 -8394.01 2954.7 -vt 0.972984 0.357378 -v -8133.5 -8229.01 2954.7 -vt 0.971322 0.357378 -v -8133.5 -8229.01 2789.7 -vt 0.971322 0.35573 -v -8133.5 -8394.01 2789.7 -vt 0.972984 0.35573 -o mesh417 -s off -f 2165/2165/2165 2166/2166/2166 2167/2167/2167 -f 2165/2165/2165 2167/2167/2167 2168/2168/2168 -g charts -o chart0000 -s off -f 2165/2165/2165 2166/2166/2166 2167/2167/2167 -f 2165/2165/2165 2167/2167/2167 2168/2168/2168 -v -6933.5 -8229.01 2954.7 -vt 0.153366 0.544518 -v -6933.5 -8229.01 2789.7 -vt 0.153366 0.542869 -v -8133.5 -8229.01 2789.7 -vt 0.143392 0.542869 -v -8133.5 -8229.01 2954.7 -vt 0.143392 0.544518 -o mesh418 -s off -f 2169/2169/2169 2170/2170/2170 2171/2171/2171 -f 2169/2169/2169 2171/2171/2171 2172/2172/2172 -g charts -o chart0000 -s off -f 2169/2169/2169 2170/2170/2170 2171/2171/2171 -f 2169/2169/2169 2171/2171/2171 2172/2172/2172 -v -17553.5 -5319.01 7004.7 -vt 0.00178925 0.22094 -v -17553.5 -8847.01 4358.7 -vt 0.0228594 0.248729 -v -17553.5 -8929.81 4469.1 -vt 0.0219803 0.249382 -v -17553.5 -5319.01 7177.2 -vt 0.000415628 0.22094 -v -17553.5 -1708.21 4469.1 -vt 0.0219803 0.192498 -v -17553.5 -1791.01 4358.7 -vt 0.0228594 0.19315 -o mesh419 -s off -f 2173/2173/2173 2174/2174/2174 2175/2175/2175 -f 2173/2173/2173 2175/2175/2175 2176/2176/2176 -f 2173/2173/2173 2176/2176/2176 2177/2177/2177 -f 2173/2173/2173 2177/2177/2177 2178/2178/2178 -g charts -o chart0000 -s off -f 2173/2173/2173 2174/2174/2174 2175/2175/2175 -f 2173/2173/2173 2175/2175/2175 2176/2176/2176 -f 2173/2173/2173 2176/2176/2176 2177/2177/2177 -f 2173/2173/2173 2177/2177/2177 2178/2178/2178 -v -7473.5 -8847.01 4358.7 -vt 0.790939 0.97568 -v -7473.5 -5319.01 7004.7 -vt 0.763092 0.954246 -v -7473.5 -1791.01 4358.7 -vt 0.735245 0.97568 -v -7473.5 -8847.01 4358.7 -vt 0.183949 0.812448 -v -7473.5 -1791.01 4358.7 -vt 0.239991 0.812448 -v -7473.5 -1708.21 4469.1 -vt 0.240648 0.811576 -v -7473.5 -5319.01 7177.2 -vt 0.21197 0.79019 -v -7473.5 -8929.81 4469.1 -vt 0.183292 0.811576 -o mesh420 -s off -f 2179/2179/2179 2180/2180/2180 2181/2181/2181 -f 2182/2182/2182 2183/2183/2183 2184/2184/2184 -f 2182/2182/2182 2184/2184/2184 2185/2185/2185 -f 2182/2182/2182 2185/2185/2185 2186/2186/2186 -g charts -o chart0000 -s off -f 2179/2179/2179 2180/2180/2180 2181/2181/2181 -o chart0001 -s off -f 2182/2182/2182 2183/2183/2183 2184/2184/2184 -f 2182/2182/2182 2184/2184/2184 2185/2185/2185 -f 2182/2182/2182 2185/2185/2185 2186/2186/2186 -v -7473.5 -8847.01 4358.7 -vt 0.027847 0.832234 -v -17553.5 -8847.01 4358.7 -vt 0.027847 0.911377 -v -17553.5 -5319.01 7004.7 -vt 0.0627597 0.911377 -v -7473.5 -5319.01 7004.7 -vt 0.0627597 0.832234 -o mesh421 -s off -f 2187/2187/2187 2188/2188/2188 2189/2189/2189 -f 2187/2187/2187 2189/2189/2189 2190/2190/2190 -g charts -o chart0000 -s off -f 2187/2187/2187 2188/2188/2188 2189/2189/2189 -f 2187/2187/2187 2189/2189/2189 2190/2190/2190 -v -17553.5 -8929.81 4469.1 -vt 0.992103 0.240313 -v -17553.5 -8847.01 4358.7 -vt 0.993765 0.240313 -v -7473.5 -8847.01 4358.7 -vt 0.993765 0.161171 -v -7473.5 -8929.81 4469.1 -vt 0.992103 0.161171 -o mesh422 -s off -f 2191/2191/2191 2192/2192/2192 2193/2193/2193 -f 2191/2191/2191 2193/2193/2193 2194/2194/2194 -g charts -o chart0000 -s off -f 2191/2191/2191 2192/2192/2192 2193/2193/2193 -f 2191/2191/2191 2193/2193/2193 2194/2194/2194 -v -17553.5 -5319.01 7177.2 -vt 0.380299 0.428277 -v -17553.5 -8929.81 4469.1 -vt 0.416043 0.428277 -v -7473.5 -8929.81 4469.1 -vt 0.416043 0.349134 -v -7473.5 -5319.01 7177.2 -vt 0.380299 0.349134 -o mesh423 -s off -f 2195/2195/2195 2196/2196/2196 2197/2197/2197 -f 2195/2195/2195 2197/2197/2197 2198/2198/2198 -g charts -o chart0000 -s off -f 2195/2195/2195 2196/2196/2196 2197/2197/2197 -f 2195/2195/2195 2197/2197/2197 2198/2198/2198 -v -17553.5 -1708.21 4469.1 -vt 0.927265 0.637675 -v -17553.5 -5319.01 7177.2 -vt 0.927265 0.673124 -v -7473.5 -5319.01 7177.2 -vt 0.847465 0.673124 -v -7473.5 -1708.21 4469.1 -vt 0.847465 0.637675 -o mesh424 -s off -f 2199/2199/2199 2200/2200/2200 2201/2201/2201 -f 2199/2199/2199 2201/2201/2201 2202/2202/2202 -g charts -o chart0000 -s off -f 2199/2199/2199 2200/2200/2200 2201/2201/2201 -f 2199/2199/2199 2201/2201/2201 2202/2202/2202 -v -17553.5 -1791.01 4358.7 -vt 0.978803 0.535449 -v -17553.5 -1708.21 4469.1 -vt 0.980465 0.535449 -v -7473.5 -1708.21 4469.1 -vt 0.980465 0.456307 -v -7473.5 -1791.01 4358.7 -vt 0.978803 0.456307 -o mesh425 -s off -f 2203/2203/2203 2204/2204/2204 2205/2205/2205 -f 2203/2203/2203 2205/2205/2205 2206/2206/2206 -g charts -o chart0000 -s off -f 2203/2203/2203 2204/2204/2204 2205/2205/2205 -f 2203/2203/2203 2205/2205/2205 2206/2206/2206 -v -17553.5 -1791.01 4358.7 -vt 0.365337 0.601401 -v -7473.5 -1791.01 4358.7 -vt 0.365337 0.522259 -v -7473.5 -5319.01 7004.7 -vt 0.330424 0.522259 -v -17553.5 -5319.01 7004.7 -vt 0.330424 0.601401 -o mesh426 -s off -f 2207/2207/2207 2208/2208/2208 2209/2209/2209 -f 2207/2207/2207 2209/2209/2209 2210/2210/2210 -g charts -o chart0000 -s off -f 2207/2207/2207 2208/2208/2208 2209/2209/2209 -f 2207/2207/2207 2209/2209/2209 2210/2210/2210 -v 2681.5 5120.99 -285.3 -vt 0.998753 0.280709 -v 2747.22 5120.99 -195.3 -vt 0.999584 0.281239 -v 3601.5 5120.99 -285.3 -vt 0.998753 0.288129 -v 3535.79 5120.99 -195.3 -vt 0.999584 0.287599 -o mesh427 -s off -f 2211/2211/2211 2212/2212/2212 2213/2213/2213 -f 2214/2214/2214 2213/2213/2213 2212/2212/2212 -g charts -o chart0000 -s off -f 2211/2211/2211 2212/2212/2212 2213/2213/2213 -f 2214/2214/2214 2213/2213/2213 2212/2212/2212 -v 2747.22 5120.99 -195.3 -vt 0.212386 0.499073 -v 2681.5 5120.99 -285.3 -vt 0.213217 0.498351 -v 2681.5 5120.99 2594.7 -vt 0.213217 0.521434 -o mesh428 -s off -f 2215/2215/2215 2216/2216/2216 2217/2217/2217 -g charts -o chart0000 -s off -f 2215/2215/2215 2216/2216/2216 2217/2217/2217 -v 2747.22 5120.99 -195.3 -vt 0.0112219 0.175185 -v 2681.5 5120.99 2594.7 -vt 0.0112219 0.197444 -v 2747.22 5120.99 2504.7 -vt 0.0103907 0.196714 -o mesh429 -s off -f 2218/2218/2218 2219/2219/2219 2220/2220/2220 -g charts -o chart0000 -s off -f 2218/2218/2218 2219/2219/2219 2220/2220/2220 -v 2747.22 5120.99 2504.7 -vt 0.352868 0.437875 -v 2681.5 5120.99 2594.7 -vt 0.353699 0.437345 -v 3535.79 5120.99 2504.7 -vt 0.352868 0.444235 -v 3601.5 5120.99 2594.7 -vt 0.353699 0.444765 -o mesh430 -s off -f 2221/2221/2221 2222/2222/2222 2223/2223/2223 -f 2224/2224/2224 2223/2223/2223 2222/2222/2222 -g charts -o chart0000 -s off -f 2221/2221/2221 2222/2222/2222 2223/2223/2223 -f 2224/2224/2224 2223/2223/2223 2222/2222/2222 -v 3601.5 5120.99 -285.3 -vt 0.833333 0.926216 -v 3535.79 5120.99 -195.3 -vt 0.832606 0.925392 -v 3601.5 5120.99 2594.7 -vt 0.810058 0.926216 -o mesh431 -s off -f 2225/2225/2225 2226/2226/2226 2227/2227/2227 -g charts -o chart0000 -s off -f 2225/2225/2225 2226/2226/2226 2227/2227/2227 -v 3601.5 5120.99 2594.7 -vt 0.550707 0.531327 -v 3535.79 5120.99 -195.3 -vt 0.57315 0.531327 -v 3535.79 5120.99 2504.7 -vt 0.551443 0.530503 -o mesh432 -s off -f 2228/2228/2228 2229/2229/2229 2230/2230/2230 -g charts -o chart0000 -s off -f 2228/2228/2228 2229/2229/2229 2230/2230/2230 -v 3601.5 4955.99 -285.3 -vt 0.810889 0.537098 -v 3579.6 4955.99 -255.3 -vt 0.810711 0.536274 -v 2681.5 4955.99 -285.3 -vt 0.803408 0.537098 -v 2703.41 4955.99 -255.3 -vt 0.803586 0.536274 -o mesh433 -s off -f 2231/2231/2231 2232/2232/2232 2233/2233/2233 -f 2234/2234/2234 2233/2233/2233 2232/2232/2232 -g charts -o chart0000 -s off -f 2231/2231/2231 2232/2232/2232 2233/2233/2233 -f 2234/2234/2234 2233/2233/2233 2232/2232/2232 -v 3579.6 4955.99 -255.3 -vt 0.874065 0.141625 -v 3601.5 4955.99 -285.3 -vt 0.874896 0.141385 -v 3601.5 4955.99 1874.7 -vt 0.874896 0.158697 -o mesh434 -s off -f 2235/2235/2235 2236/2236/2236 2237/2237/2237 -g charts -o chart0000 -s off -f 2235/2235/2235 2236/2236/2236 2237/2237/2237 -v 3579.6 4955.99 -255.3 -vt 0.00789684 0.674773 -v 3601.5 4955.99 1874.7 -vt 0.00706567 0.657961 -v 3579.6 4955.99 2564.7 -vt 0.00789684 0.652514 -o mesh435 -s off -f 2238/2238/2238 2239/2239/2239 2240/2240/2240 -g charts -o chart0000 -s off -f 2238/2238/2238 2239/2239/2239 2240/2240/2240 -v 3579.6 4955.99 2564.7 -vt 0.570657 0.935044 -v 3601.5 4955.99 1874.7 -vt 0.571488 0.929514 -v 3601.5 4955.99 2594.7 -vt 0.571488 0.935284 -o mesh436 -s off -f 2241/2241/2241 2242/2242/2242 2243/2243/2243 -g charts -o chart0000 -s off -f 2241/2241/2241 2242/2242/2242 2243/2243/2243 -v 3579.6 4955.99 2564.7 -vt 0.84313 0.926216 -v 3601.5 4955.99 2594.7 -vt 0.843308 0.925392 -v 2703.41 4955.99 2564.7 -vt 0.836005 0.926216 -v 2681.5 4955.99 2594.7 -vt 0.835827 0.925392 -o mesh437 -s off -f 2244/2244/2244 2245/2245/2245 2246/2246/2246 -f 2247/2247/2247 2246/2246/2246 2245/2245/2245 -g charts -o chart0000 -s off -f 2244/2244/2244 2245/2245/2245 2246/2246/2246 -f 2247/2247/2247 2246/2246/2246 2245/2245/2245 -v 2681.5 4955.99 -285.3 -vt 0.164173 0.562654 -v 2703.41 4955.99 -255.3 -vt 0.163342 0.562414 -v 2681.5 4955.99 2594.7 -vt 0.164173 0.539571 -o mesh438 -s off -f 2248/2248/2248 2249/2249/2249 2250/2250/2250 -g charts -o chart0000 -s off -f 2248/2248/2248 2249/2249/2249 2250/2250/2250 -v 2681.5 4955.99 2594.7 -vt 0.106816 0.99629 -v 2703.41 4955.99 -255.3 -vt 0.12926 0.99629 -v 2703.41 4955.99 2564.7 -vt 0.107054 0.995466 -o mesh439 -s off -f 2251/2251/2251 2252/2252/2252 2253/2253/2253 -g charts -o chart0000 -s off -f 2251/2251/2251 2252/2252/2252 2253/2253/2253 -v 2681.5 5120.99 -285.3 -vt 0.0860348 0.748145 -v 3601.5 5120.99 -285.3 -vt 0.0785536 0.748145 -v 3601.5 4955.99 -285.3 -vt 0.0785536 0.746496 -v 2681.5 4955.99 -285.3 -vt 0.0860348 0.746496 -o mesh440 -s off -f 2254/2254/2254 2255/2255/2255 2256/2256/2256 -f 2254/2254/2254 2256/2256/2256 2257/2257/2257 -g charts -o chart0000 -s off -f 2254/2254/2254 2255/2255/2255 2256/2256/2256 -f 2254/2254/2254 2256/2256/2256 2257/2257/2257 -v 3601.5 5120.99 -285.3 -vt 0.238155 0.999588 -v 3601.5 5120.99 2594.7 -vt 0.214879 0.999588 -v 3601.5 4955.99 2594.7 -vt 0.214879 0.997939 -v 3601.5 4955.99 1874.7 -vt 0.220698 0.997939 -v 3601.5 4955.99 -285.3 -vt 0.238155 0.997939 -o mesh441 -s off -f 2258/2258/2258 2259/2259/2259 2260/2260/2260 -f 2258/2258/2258 2260/2260/2260 2261/2261/2261 -f 2258/2258/2258 2261/2261/2261 2262/2262/2262 -g charts -o chart0000 -s off -f 2258/2258/2258 2259/2259/2259 2260/2260/2260 -f 2258/2258/2258 2260/2260/2260 2261/2261/2261 -f 2258/2258/2258 2261/2261/2261 2262/2262/2262 -v 2681.5 5120.99 2594.7 -vt 0.871571 0.429101 -v 2681.5 5120.99 -285.3 -vt 0.871571 0.452185 -v 2681.5 4955.99 -285.3 -vt 0.873233 0.452185 -v 2681.5 4955.99 2594.7 -vt 0.873233 0.429101 -o mesh442 -s off -f 2263/2263/2263 2264/2264/2264 2265/2265/2265 -f 2263/2263/2263 2265/2265/2265 2266/2266/2266 -g charts -o chart0000 -s off -f 2263/2263/2263 2264/2264/2264 2265/2265/2265 -f 2263/2263/2263 2265/2265/2265 2266/2266/2266 -v 3601.5 5120.99 2594.7 -vt 0.155029 0.814097 -v 2681.5 5120.99 2594.7 -vt 0.16251 0.814097 -v 2681.5 4955.99 2594.7 -vt 0.16251 0.815746 -v 3601.5 4955.99 2594.7 -vt 0.155029 0.815746 -o mesh443 -s off -f 2267/2267/2267 2268/2268/2268 2269/2269/2269 -f 2267/2267/2267 2269/2269/2269 2270/2270/2270 -g charts -o chart0000 -s off -f 2267/2267/2267 2268/2268/2268 2269/2269/2269 -f 2267/2267/2267 2269/2269/2269 2270/2270/2270 -v 3535.79 5120.99 2504.7 -vt 0.907315 0.781121 -v 3535.79 4985.99 2504.7 -vt 0.907315 0.779472 -v 2747.22 4985.99 2504.7 -vt 0.900665 0.779472 -v 2747.22 5120.99 2504.7 -vt 0.900665 0.781121 -o mesh444 -s off -f 2271/2271/2271 2272/2272/2272 2273/2273/2273 -f 2271/2271/2271 2273/2273/2273 2274/2274/2274 -g charts -o chart0000 -s off -f 2271/2271/2271 2272/2272/2272 2273/2273/2273 -f 2271/2271/2271 2273/2273/2273 2274/2274/2274 -v 2747.22 5120.99 2504.7 -vt 0.125935 0.362325 -v 2747.22 4985.99 2504.7 -vt 0.125935 0.360676 -v 2747.22 4985.99 -195.3 -vt 0.104323 0.360676 -v 2747.22 5120.99 -195.3 -vt 0.104323 0.362325 -o mesh445 -s off -f 2275/2275/2275 2276/2276/2276 2277/2277/2277 -f 2275/2275/2275 2277/2277/2277 2278/2278/2278 -g charts -o chart0000 -s off -f 2275/2275/2275 2276/2276/2276 2277/2277/2277 -f 2275/2275/2275 2277/2277/2277 2278/2278/2278 -v 2747.22 5120.99 -195.3 -vt 0.0527846 0.14798 -v 2747.22 4985.99 -195.3 -vt 0.0527846 0.149629 -v 3535.79 4985.99 -195.3 -vt 0.0461347 0.149629 -v 3535.79 5120.99 -195.3 -vt 0.0461347 0.14798 -o mesh446 -s off -f 2279/2279/2279 2280/2280/2280 2281/2281/2281 -f 2279/2279/2279 2281/2281/2281 2282/2282/2282 -g charts -o chart0000 -s off -f 2279/2279/2279 2280/2280/2280 2281/2281/2281 -f 2279/2279/2279 2281/2281/2281 2282/2282/2282 -v 3535.79 4985.99 2504.7 -vt 0.969659 0.748145 -v 3535.79 5045.99 1947.82 -vt 0.965202 0.747412 -v 3535.79 4985.99 -195.3 -vt 0.948047 0.748145 -v 3535.79 5120.99 2504.7 -vt 0.969659 0.746496 -v 3535.79 5060.99 1947.82 -vt 0.965202 0.747229 -v 3535.79 5060.99 1921.57 -vt 0.964991 0.747229 -v 3535.79 5045.99 1921.57 -vt 0.964991 0.747412 -v 3535.79 5120.99 -195.3 -vt 0.948047 0.746496 -o mesh447 -s off -f 2283/2283/2283 2284/2284/2284 2285/2285/2285 -f 2284/2284/2284 2283/2283/2283 2286/2286/2286 -f 2284/2284/2284 2286/2286/2286 2287/2287/2287 -f 2287/2287/2287 2286/2286/2286 2288/2288/2288 -f 2285/2285/2285 2289/2289/2289 2290/2290/2290 -f 2289/2289/2289 2285/2285/2285 2284/2284/2284 -f 2290/2290/2290 2289/2289/2289 2288/2288/2288 -f 2290/2290/2290 2288/2288/2288 2286/2286/2286 -g charts -o chart0000 -s off -f 2283/2283/2283 2284/2284/2284 2285/2285/2285 -f 2284/2284/2284 2283/2283/2283 2286/2286/2286 -f 2284/2284/2284 2286/2286/2286 2287/2287/2287 -f 2287/2287/2287 2286/2286/2286 2288/2288/2288 -f 2285/2285/2285 2289/2289/2289 2290/2290/2290 -f 2289/2289/2289 2285/2285/2285 2284/2284/2284 -f 2290/2290/2290 2289/2289/2289 2288/2288/2288 -f 2290/2290/2290 2288/2288/2288 2286/2286/2286 -v 3579.6 4985.99 -255.3 -vt 0.820864 0.999588 -v 3535.79 4985.99 -195.3 -vt 0.82049 0.998763 -v 2703.41 4985.99 -255.3 -vt 0.813383 0.999588 -v 2747.22 4985.99 -195.3 -vt 0.813757 0.998763 -o mesh448 -s off -f 2291/2291/2291 2292/2292/2292 2293/2293/2293 -f 2294/2294/2294 2293/2293/2293 2292/2292/2292 -g charts -o chart0000 -s off -f 2291/2291/2291 2292/2292/2292 2293/2293/2293 -f 2294/2294/2294 2293/2293/2293 2292/2292/2292 -v 3535.79 4985.99 -195.3 -vt 0.181629 0.791488 -v 3579.6 4985.99 -255.3 -vt 0.18246 0.791014 -v 3579.6 4985.99 2564.7 -vt 0.18246 0.813273 -o mesh449 -s off -f 2295/2295/2295 2296/2296/2296 2297/2297/2297 -g charts -o chart0000 -s off -f 2295/2295/2295 2296/2296/2296 2297/2297/2297 -v 3535.79 4985.99 -195.3 -vt 0.571488 0.767931 -v 3579.6 4985.99 2564.7 -vt 0.593932 0.767931 -v 3535.79 4985.99 2504.7 -vt 0.593438 0.767106 -o mesh450 -s off -f 2298/2298/2298 2299/2299/2299 2300/2300/2300 -g charts -o chart0000 -s off -f 2298/2298/2298 2299/2299/2299 2300/2300/2300 -v 3535.79 4985.99 2504.7 -vt 0.994223 0.149629 -v 3579.6 4985.99 2564.7 -vt 0.994597 0.148805 -v 2747.22 4985.99 2504.7 -vt 0.987489 0.149629 -v 2703.41 4985.99 2564.7 -vt 0.987116 0.148805 -o mesh451 -s off -f 2301/2301/2301 2302/2302/2302 2303/2303/2303 -f 2304/2304/2304 2303/2303/2303 2302/2302/2302 -g charts -o chart0000 -s off -f 2301/2301/2301 2302/2302/2302 2303/2303/2303 -f 2304/2304/2304 2303/2303/2303 2302/2302/2302 -v 2703.41 4985.99 -255.3 -vt 0.834996 0.0729595 -v 2747.22 4985.99 -195.3 -vt 0.834165 0.0724859 -v 2703.41 4985.99 2564.7 -vt 0.834996 0.0507007 -o mesh452 -s off -f 2305/2305/2305 2306/2306/2306 2307/2307/2307 -g charts -o chart0000 -s off -f 2305/2305/2305 2306/2306/2306 2307/2307/2307 -v 2703.41 4985.99 2564.7 -vt 0.750208 0.715169 -v 2747.22 4985.99 -195.3 -vt 0.772652 0.715169 -v 2747.22 4985.99 2504.7 -vt 0.750701 0.714345 -o mesh453 -s off -f 2308/2308/2308 2309/2309/2309 2310/2310/2310 -g charts -o chart0000 -s off -f 2308/2308/2308 2309/2309/2309 2310/2310/2310 -v 2703.41 4955.99 2564.7 -vt 0.0802161 0.898186 -v 2703.41 4955.99 -255.3 -vt 0.10266 0.898186 -v 2703.41 4985.99 -255.3 -vt 0.10266 0.899011 -v 2703.41 4985.99 2564.7 -vt 0.0802161 0.899011 -o mesh454 -s off -f 2311/2311/2311 2312/2312/2312 2313/2313/2313 -f 2311/2311/2311 2313/2313/2313 2314/2314/2314 -g charts -o chart0000 -s off -f 2311/2311/2311 2312/2312/2312 2313/2313/2313 -f 2311/2311/2311 2313/2313/2313 2314/2314/2314 -v 2703.41 4955.99 -255.3 -vt 0.874896 0.194971 -v 3579.6 4955.99 -255.3 -vt 0.867415 0.194971 -v 3579.6 4985.99 -255.3 -vt 0.867415 0.194147 -v 2703.41 4985.99 -255.3 -vt 0.874896 0.194147 -o mesh455 -s off -f 2315/2315/2315 2316/2316/2316 2317/2317/2317 -f 2315/2315/2315 2317/2317/2317 2318/2318/2318 -g charts -o chart0000 -s off -f 2315/2315/2315 2316/2316/2316 2317/2317/2317 -f 2315/2315/2315 2317/2317/2317 2318/2318/2318 -v 3579.6 4955.99 -255.3 -vt 0.165004 0.574196 -v 3579.6 4955.99 2564.7 -vt 0.14256 0.574196 -v 3579.6 4985.99 2564.7 -vt 0.14256 0.573372 -v 3579.6 4985.99 -255.3 -vt 0.165004 0.573372 -o mesh456 -s off -f 2319/2319/2319 2320/2320/2320 2321/2321/2321 -f 2319/2319/2319 2321/2321/2321 2322/2322/2322 -g charts -o chart0000 -s off -f 2319/2319/2319 2320/2320/2320 2321/2321/2321 -f 2319/2319/2319 2321/2321/2321 2322/2322/2322 -v 3579.6 4955.99 2564.7 -vt 0.908978 0.542869 -v 2703.41 4955.99 2564.7 -vt 0.908978 0.550288 -v 2703.41 4985.99 2564.7 -vt 0.909809 0.550288 -v 3579.6 4985.99 2564.7 -vt 0.909809 0.542869 -o mesh457 -s off -f 2323/2323/2323 2324/2324/2324 2325/2325/2325 -f 2323/2323/2323 2325/2325/2325 2326/2326/2326 -g charts -o chart0000 -s off -f 2323/2323/2323 2324/2324/2324 2325/2325/2325 -f 2323/2323/2323 2325/2325/2325 2326/2326/2326 -v -6588.5 8726.62 2594.7 -vt 0.409393 0.849546 -v 10691.5 8726.62 2594.7 -vt 0.5532 0.849546 -v 10691.5 5855.99 2594.7 -vt 0.5532 0.825697 -v 4741.5 5855.99 2594.7 -vt 0.503683 0.825697 -v 4741.5 4955.99 2594.7 -vt 0.503683 0.818219 -v -638.499 4955.99 2594.7 -vt 0.45891 0.818219 -v -638.499 5855.99 2594.7 -vt 0.45891 0.825697 -v -6588.5 8726.62 2594.7 -vt 0.376143 0.767931 -v -638.499 5855.99 2594.7 -vt 0.328761 0.744847 -v -6588.5 5855.99 2594.7 -vt 0.376143 0.744847 -o mesh458 -s off -f 2327/2327/2327 2328/2328/2328 2329/2329/2329 -f 2327/2327/2327 2329/2329/2329 2330/2330/2330 -f 2327/2327/2327 2330/2330/2330 2331/2331/2331 -f 2327/2327/2327 2331/2331/2331 2332/2332/2332 -f 2327/2327/2327 2332/2332/2332 2333/2333/2333 -f 2334/2334/2334 2335/2335/2335 2336/2336/2336 -g charts -o chart0000 -s off -f 2327/2327/2327 2328/2328/2328 2329/2329/2329 -f 2327/2327/2327 2329/2329/2329 2330/2330/2330 -f 2327/2327/2327 2330/2330/2330 2331/2331/2331 -f 2327/2327/2327 2331/2331/2331 2332/2332/2332 -f 2327/2327/2327 2332/2332/2332 2333/2333/2333 -o chart0001 -s off -f 2334/2334/2334 2335/2335/2335 2336/2336/2336 -v 10691.5 8726.62 2594.7 -vt 0.245636 0.298846 -v -6588.5 8726.62 2594.7 -vt 0.381962 0.298846 -v -6588.5 8726.62 2954.7 -vt 0.381962 0.302143 -v 10691.5 8726.62 2954.7 -vt 0.245636 0.302143 -o mesh459 -s off -f 2337/2337/2337 2338/2338/2338 2339/2339/2339 -f 2337/2337/2337 2339/2339/2339 2340/2340/2340 -g charts -o chart0000 -s off -f 2337/2337/2337 2338/2338/2338 2339/2339/2339 -f 2337/2337/2337 2339/2339/2339 2340/2340/2340 -v -6588.5 8726.62 2594.7 -vt 0.270574 0.671476 -v -6588.5 5855.99 2594.7 -vt 0.293849 0.671476 -v -6588.5 5855.99 2954.7 -vt 0.293849 0.674773 -v -6588.5 8726.62 2954.7 -vt 0.270574 0.674773 -o mesh460 -s off -f 2341/2341/2341 2342/2342/2342 2343/2343/2343 -f 2341/2341/2341 2343/2343/2343 2344/2344/2344 -g charts -o chart0000 -s off -f 2341/2341/2341 2342/2342/2342 2343/2343/2343 -f 2341/2341/2341 2343/2343/2343 2344/2344/2344 -v -6588.5 5855.99 2594.7 -vt 0.746883 0.317807 -v -638.499 5855.99 2594.7 -vt 0.699501 0.317807 -v -638.499 5855.99 2954.7 -vt 0.699501 0.314509 -v -6588.5 5855.99 2954.7 -vt 0.746883 0.314509 -o mesh461 -s off -f 2345/2345/2345 2346/2346/2346 2347/2347/2347 -f 2345/2345/2345 2347/2347/2347 2348/2348/2348 -g charts -o chart0000 -s off -f 2345/2345/2345 2346/2346/2346 2347/2347/2347 -f 2345/2345/2345 2347/2347/2347 2348/2348/2348 -v 10691.5 5855.99 2594.7 -vt 0.167498 0.654988 -v 10691.5 8726.62 2594.7 -vt 0.167498 0.631904 -v 10691.5 8726.62 2954.7 -vt 0.164173 0.631904 -v 10691.5 5855.99 2954.7 -vt 0.164173 0.654988 -o mesh462 -s off -f 2349/2349/2349 2350/2350/2350 2351/2351/2351 -f 2349/2349/2349 2351/2351/2351 2352/2352/2352 -g charts -o chart0000 -s off -f 2349/2349/2349 2350/2350/2350 2351/2351/2351 -f 2349/2349/2349 2351/2351/2351 2352/2352/2352 -v 10691.5 8726.62 2954.7 -vt 0.800083 0.800082 -v -6588.5 8726.62 2954.7 -vt 0.656276 0.800082 -v -6588.5 5855.99 2954.7 -vt 0.656276 0.823932 -v -638.499 5855.99 2954.7 -vt 0.705793 0.823932 -v -638.499 4955.99 2954.7 -vt 0.705793 0.83141 -v 4741.5 4955.99 2954.7 -vt 0.750566 0.83141 -v 4741.5 5855.99 2954.7 -vt 0.750566 0.823932 -v 10691.5 8726.62 2954.7 -vt 0.776808 0.56925 -v 4741.5 5855.99 2954.7 -vt 0.800083 0.522259 -v 10691.5 5855.99 2954.7 -vt 0.800083 0.56925 -o mesh463 -s off -f 2353/2353/2353 2354/2354/2354 2355/2355/2355 -f 2353/2353/2353 2355/2355/2355 2356/2356/2356 -f 2353/2353/2353 2356/2356/2356 2357/2357/2357 -f 2353/2353/2353 2357/2357/2357 2358/2358/2358 -f 2353/2353/2353 2358/2358/2358 2359/2359/2359 -f 2360/2360/2360 2361/2361/2361 2362/2362/2362 -g charts -o chart0000 -s off -f 2353/2353/2353 2354/2354/2354 2355/2355/2355 -f 2353/2353/2353 2355/2355/2355 2356/2356/2356 -f 2353/2353/2353 2356/2356/2356 2357/2357/2357 -f 2353/2353/2353 2357/2357/2357 2358/2358/2358 -f 2353/2353/2353 2358/2358/2358 2359/2359/2359 -o chart0001 -s off -f 2360/2360/2360 2361/2361/2361 2362/2362/2362 -v 10691.5 5855.99 2954.7 -vt 0.422693 0.964963 -v 4741.5 5855.99 2954.7 -vt 0.470075 0.964963 -v 4741.5 5855.99 2594.7 -vt 0.470075 0.96826 -v 10691.5 5855.99 2594.7 -vt 0.422693 0.96826 -o mesh464 -s off -f 2363/2363/2363 2364/2364/2364 2365/2365/2365 -f 2363/2363/2363 2365/2365/2365 2366/2366/2366 -g charts -o chart0000 -s off -f 2363/2363/2363 2364/2364/2364 2365/2365/2365 -f 2363/2363/2363 2365/2365/2365 2366/2366/2366 -v 4741.5 4955.99 2954.7 -vt 0.27473 0.599753 -v -638.499 4955.99 2954.7 -vt 0.317124 0.599753 -v -638.499 4955.99 2594.7 -vt 0.317124 0.60305 -v 4741.5 4955.99 2594.7 -vt 0.27473 0.60305 -o mesh465 -s off -f 2367/2367/2367 2368/2368/2368 2369/2369/2369 -f 2367/2367/2367 2369/2369/2369 2370/2370/2370 -g charts -o chart0000 -s off -f 2367/2367/2367 2368/2368/2368 2369/2369/2369 -f 2367/2367/2367 2369/2369/2369 2370/2370/2370 -v -638.499 5855.99 2954.7 -vt 0.0187032 0.495878 -v -638.499 5855.99 2594.7 -vt 0.0187032 0.49258 -v -638.499 4955.99 2594.7 -vt 0.0112219 0.49258 -v -638.499 4955.99 2954.7 -vt 0.0112219 0.495878 -o mesh466 -s off -f 2371/2371/2371 2372/2372/2372 2373/2373/2373 -f 2371/2371/2371 2373/2373/2373 2374/2374/2374 -g charts -o chart0000 -s off -f 2371/2371/2371 2372/2372/2372 2373/2373/2373 -f 2371/2371/2371 2373/2373/2373 2374/2374/2374 -v 4741.5 5855.99 2594.7 -vt 0.746883 0.963314 -v 4741.5 5855.99 2954.7 -vt 0.746883 0.960016 -v 4741.5 4955.99 2954.7 -vt 0.739402 0.960016 -v 4741.5 4955.99 2594.7 -vt 0.739402 0.963314 -o mesh467 -s off -f 2375/2375/2375 2376/2376/2376 2377/2377/2377 -f 2375/2375/2375 2377/2377/2377 2378/2378/2378 -g charts -o chart0000 -s off -f 2375/2375/2375 2376/2376/2376 2377/2377/2377 -f 2375/2375/2375 2377/2377/2377 2378/2378/2378 -v -13616 21932.5 2411.4 -vt 0.92394 0.964139 -v -13616 21932.5 2575.5 -vt 0.92394 0.965787 -v -8576 21932.5 2575.5 -vt 0.88404 0.965787 -v -8576 21932.5 2411.4 -vt 0.88404 0.964139 -o mesh468 -s off -f 2379/2379/2379 2380/2380/2380 2381/2381/2381 -f 2379/2379/2379 2381/2381/2381 2382/2382/2382 -g charts -o chart0000 -s off -f 2379/2379/2379 2380/2380/2380 2381/2381/2381 -f 2379/2379/2379 2381/2381/2381 2382/2382/2382 -v -13616 21771.3 2411.4 -vt 0.776808 0.412613 -v -13616 21771.3 2575.5 -vt 0.775145 0.412613 -v -13616 21932.5 2575.5 -vt 0.775145 0.410965 -v -13616 21932.5 2411.4 -vt 0.776808 0.410965 -o mesh469 -s off -f 2383/2383/2383 2384/2384/2384 2385/2385/2385 -f 2383/2383/2383 2385/2385/2385 2386/2386/2386 -g charts -o chart0000 -s off -f 2383/2383/2383 2384/2384/2384 2385/2385/2385 -f 2383/2383/2383 2385/2385/2385 2386/2386/2386 -v -8576 21771.3 2411.4 -vt 0.326268 0.973207 -v -13616 21771.3 2411.4 -vt 0.366168 0.973207 -v -13616 21932.5 2411.4 -vt 0.366168 0.974856 -v -8576 21932.5 2411.4 -vt 0.326268 0.974856 -o mesh470 -s off -f 2387/2387/2387 2388/2388/2388 2389/2389/2389 -f 2387/2387/2387 2389/2389/2389 2390/2390/2390 -g charts -o chart0000 -s off -f 2387/2387/2387 2388/2388/2388 2389/2389/2389 -f 2387/2387/2387 2389/2389/2389 2390/2390/2390 -v -8576 21771.3 2575.5 -vt 0.900665 0.399423 -v -8576 21771.3 2411.4 -vt 0.900665 0.401072 -v -8576 21932.5 2411.4 -vt 0.902327 0.401072 -v -8576 21932.5 2575.5 -vt 0.902327 0.399423 -o mesh471 -s off -f 2391/2391/2391 2392/2392/2392 2393/2393/2393 -f 2391/2391/2391 2393/2393/2393 2394/2394/2394 -g charts -o chart0000 -s off -f 2391/2391/2391 2392/2392/2392 2393/2393/2393 -f 2391/2391/2391 2393/2393/2393 2394/2394/2394 -v -13616 21771.3 2575.5 -vt 0.494181 0.814097 -v -13616 21771.3 2411.4 -vt 0.494181 0.815746 -v -8576 21771.3 2411.4 -vt 0.454281 0.815746 -v -8576 21771.3 2575.5 -vt 0.454281 0.814097 -o mesh472 -s off -f 2395/2395/2395 2396/2396/2396 2397/2397/2397 -f 2395/2395/2395 2397/2397/2397 2398/2398/2398 -g charts -o chart0000 -s off -f 2395/2395/2395 2396/2396/2396 2397/2397/2397 -f 2395/2395/2395 2397/2397/2397 2398/2398/2398 -v -13616 21771.3 2575.5 -vt 0.280549 0.793487 -v -8576 21771.3 2575.5 -vt 0.240648 0.793487 -v -8576 21932.5 2575.5 -vt 0.240648 0.791838 -v -13616 21932.5 2575.5 -vt 0.280549 0.791838 -o mesh473 -s off -f 2399/2399/2399 2400/2400/2400 2401/2401/2401 -f 2399/2399/2399 2401/2401/2401 2402/2402/2402 -g charts -o chart0000 -s off -f 2399/2399/2399 2400/2400/2400 2401/2401/2401 -f 2399/2399/2399 2401/2401/2401 2402/2402/2402 -v -8576 17123.9 3376.95 -vt 0.809227 0.746496 -v -8576 17151 3539.7 -vt 0.807564 0.746496 -v -13616 17151 3539.7 -vt 0.807564 0.706925 -v -13616 17123.9 3376.95 -vt 0.809227 0.706925 -o mesh474 -s off -f 2403/2403/2403 2404/2404/2404 2405/2405/2405 -f 2403/2403/2403 2405/2405/2405 2406/2406/2406 -g charts -o chart0000 -s off -f 2403/2403/2403 2404/2404/2404 2405/2405/2405 -f 2403/2403/2403 2405/2405/2405 2406/2406/2406 -v -8576 17151 3539.7 -vt 0.0569409 0.79019 -v -8576 21959.7 2738.25 -vt 0.0569409 0.751443 -v -13616 21959.7 2738.25 -vt 0.0170407 0.751443 -v -13616 17151 3539.7 -vt 0.0170407 0.79019 -o mesh475 -s off -f 2407/2407/2407 2408/2408/2408 2409/2409/2409 -f 2407/2407/2407 2409/2409/2409 2410/2410/2410 -g charts -o chart0000 -s off -f 2407/2407/2407 2408/2408/2408 2409/2409/2409 -f 2407/2407/2407 2409/2409/2409 2410/2410/2410 -v -8576 21959.7 2738.25 -vt 0.00457182 0.696208 -v -8576 21932.5 2575.5 -vt 0.00290939 0.696208 -v -13616 21932.5 2575.5 -vt 0.00290939 0.656636 -v -13616 21959.7 2738.25 -vt 0.00457182 0.656636 -o mesh476 -s off -f 2411/2411/2411 2412/2412/2412 2413/2413/2413 -f 2411/2411/2411 2413/2413/2413 2414/2414/2414 -g charts -o chart0000 -s off -f 2411/2411/2411 2412/2412/2412 2413/2413/2413 -f 2411/2411/2411 2413/2413/2413 2414/2414/2414 -v -8576 21932.5 2575.5 -vt 0.148379 0.338417 -v -8576 17123.9 3376.95 -vt 0.10931 0.338417 -v -13616 17123.9 3376.95 -vt 0.10931 0.298846 -v -13616 21932.5 2575.5 -vt 0.148379 0.298846 -o mesh477 -s off -f 2415/2415/2415 2416/2416/2416 2417/2417/2417 -f 2415/2415/2415 2417/2417/2417 2418/2418/2418 -g charts -o chart0000 -s off -f 2415/2415/2415 2416/2416/2416 2417/2417/2417 -f 2415/2415/2415 2417/2417/2417 2418/2418/2418 -v -13616 21959.7 2738.25 -vt 0.717789 0.986397 -v -13616 21932.5 2575.5 -vt 0.716126 0.986397 -v -13616 17123.9 3376.95 -vt 0.716126 0.94765 -v -13616 17151 3539.7 -vt 0.717789 0.947651 -o mesh478 -s off -f 2419/2419/2419 2420/2420/2420 2421/2421/2421 -f 2419/2419/2419 2421/2421/2421 2422/2422/2422 -g charts -o chart0000 -s off -f 2419/2419/2419 2420/2420/2420 2421/2421/2421 -f 2419/2419/2419 2421/2421/2421 2422/2422/2422 -v -8576 21932.5 2575.5 -vt 0.411887 0.443116 -v -8576 21959.7 2738.25 -vt 0.411887 0.441467 -v -8576 17151 3539.7 -vt 0.372818 0.441467 -v -8576 17123.9 3376.95 -vt 0.372818 0.443116 -o mesh479 -s off -f 2423/2423/2423 2424/2424/2424 2425/2425/2425 -f 2423/2423/2423 2425/2425/2425 2426/2426/2426 -g charts -o chart0000 -s off -f 2423/2423/2423 2424/2424/2424 2425/2425/2425 -f 2423/2423/2423 2425/2425/2425 2426/2426/2426 -v 17389 13843.5 4854.82 -vt 0.490856 0.976505 -v 17389 13843.5 4844.7 -vt 0.490856 0.976917 -v 17389 13873.5 4844.7 -vt 0.491687 0.976917 -v 17389 13873.5 4854.82 -vt 0.491687 0.976505 -v 17389 13873.5 4834.58 -vt 0.491687 0.977329 -v 17389 13843.5 4834.58 -vt 0.490856 0.977329 -o mesh480 -s off -f 2427/2427/2427 2428/2428/2428 2429/2429/2429 -f 2427/2427/2427 2429/2429/2429 2430/2430/2430 -f 2431/2431/2431 2429/2429/2429 2428/2428/2428 -f 2431/2431/2431 2428/2428/2428 2432/2432/2432 -g charts -o chart0000 -s off -f 2427/2427/2427 2428/2428/2428 2429/2429/2429 -f 2427/2427/2427 2429/2429/2429 2430/2430/2430 -f 2431/2431/2431 2429/2429/2429 2428/2428/2428 -f 2431/2431/2431 2428/2428/2428 2432/2432/2432 -v 17389 13821 1254.82 -vt 0.786783 0.34089 -v 17389 13821 1244.7 -vt 0.786783 0.341303 -v 17389 13851 1244.7 -vt 0.787614 0.341303 -v 17389 13851 1254.82 -vt 0.787614 0.34089 -v 17389 13851 1234.58 -vt 0.787614 0.341715 -v 17389 13821 1234.58 -vt 0.786783 0.341715 -o mesh481 -s off -f 2433/2433/2433 2434/2434/2434 2435/2435/2435 -f 2433/2433/2433 2435/2435/2435 2436/2436/2436 -f 2437/2437/2437 2435/2435/2435 2434/2434/2434 -f 2437/2437/2437 2434/2434/2434 2438/2438/2438 -g charts -o chart0000 -s off -f 2433/2433/2433 2434/2434/2434 2435/2435/2435 -f 2433/2433/2433 2435/2435/2435 2436/2436/2436 -f 2437/2437/2437 2435/2435/2435 2434/2434/2434 -f 2437/2437/2437 2434/2434/2434 2438/2438/2438 -v 12146.5 24861 -285.3 -vt 0.999584 0.646744 -v 12110 24861 -247.8 -vt 0.998753 0.64644 -v 10856.5 24861 -285.3 -vt 0.999584 0.636026 -v 10893 24861 -247.8 -vt 0.998753 0.63633 -o mesh482 -s off -f 2439/2439/2439 2440/2440/2440 2441/2441/2441 -f 2442/2442/2442 2441/2441/2441 2440/2440/2440 -g charts -o chart0000 -s off -f 2439/2439/2439 2440/2440/2440 2441/2441/2441 -f 2442/2442/2442 2441/2441/2441 2440/2440/2440 -v 12110 24861 -247.8 -vt 0.873234 0.079031 -v 12146.5 24861 -285.3 -vt 0.874065 0.0787304 -v 12146.5 24861 2594.7 -vt 0.874065 0.101814 -o mesh483 -s off -f 2443/2443/2443 2444/2444/2444 2445/2445/2445 -g charts -o chart0000 -s off -f 2443/2443/2443 2444/2444/2444 2445/2445/2445 -v 12110 24861 -247.8 -vt 0.292186 0.993817 -v 12146.5 24861 2594.7 -vt 0.31463 0.993817 -v 12110 24861 2557.2 -vt 0.31433 0.992993 -o mesh484 -s off -f 2446/2446/2446 2447/2447/2447 2448/2448/2448 -g charts -o chart0000 -s off -f 2446/2446/2446 2447/2447/2447 2448/2448/2448 -v 12110 24861 2557.2 -vt 0.880258 0.413438 -v 12146.5 24861 2594.7 -vt 0.879884 0.414262 -v 11708.9 24861 2557.2 -vt 0.88404 0.414262 -o mesh485 -s off -f 2449/2449/2449 2450/2450/2450 2451/2451/2451 -g charts -o chart0000 -s off -f 2449/2449/2449 2450/2450/2450 2451/2451/2451 -v 11708.9 24861 2557.2 -vt 0.0765503 0.681368 -v 12146.5 24861 2594.7 -vt 0.080216 0.680544 -v 11683.3 24861 2557.2 -vt 0.076336 0.681368 -v 11319.7 24861 2557.2 -vt 0.07329 0.681368 -v 11294.1 24861 2557.2 -vt 0.0730757 0.681368 -v 10893 24861 2557.2 -vt 0.069716 0.681368 -v 10856.5 24861 2594.7 -vt 0.0694098 0.680544 -o mesh486 -s off -f 2452/2452/2452 2453/2453/2453 2454/2454/2454 -f 2454/2454/2454 2453/2453/2453 2455/2455/2455 -f 2455/2455/2455 2453/2453/2453 2456/2456/2456 -f 2456/2456/2456 2453/2453/2453 2457/2457/2457 -f 2458/2458/2458 2457/2457/2457 2453/2453/2453 -g charts -o chart0000 -s off -f 2452/2452/2452 2453/2453/2453 2454/2454/2454 -f 2454/2454/2454 2453/2453/2453 2455/2455/2455 -f 2455/2455/2455 2453/2453/2453 2456/2456/2456 -f 2456/2456/2456 2453/2453/2453 2457/2457/2457 -f 2458/2458/2458 2457/2457/2457 2453/2453/2453 -v 10856.5 24861 -285.3 -vt 0.401081 0.669002 -v 10893 24861 -247.8 -vt 0.400778 0.668178 -v 10856.5 24861 2594.7 -vt 0.377805 0.669002 -o mesh487 -s off -f 2459/2459/2459 2460/2460/2460 2461/2461/2461 -g charts -o chart0000 -s off -f 2459/2459/2459 2460/2460/2460 2461/2461/2461 -v 10856.5 24861 2594.7 -vt 0.337905 0.484336 -v 10893 24861 -247.8 -vt 0.360349 0.484336 -v 10893 24861 1934.7 -vt 0.343119 0.483695 -v 10893 24861 1960.95 -vt 0.342912 0.483687 -v 10893 24861 2557.2 -vt 0.338205 0.483512 -o mesh488 -s off -f 2462/2462/2462 2463/2463/2463 2464/2464/2464 -f 2462/2462/2462 2464/2464/2464 2465/2465/2465 -f 2462/2462/2462 2465/2465/2465 2466/2466/2466 -g charts -o chart0000 -s off -f 2462/2462/2462 2463/2463/2463 2464/2464/2464 -f 2462/2462/2462 2464/2464/2464 2465/2465/2465 -f 2462/2462/2462 2465/2465/2465 2466/2466/2466 -v 10856.5 25026 -285.3 -vt 0.23483 0.695383 -v 10893 25026 -247.8 -vt 0.235136 0.696208 -v 12146.5 25026 -285.3 -vt 0.245636 0.695383 -v 12110 25026 -247.8 -vt 0.24533 0.696208 -o mesh489 -s off -f 2467/2467/2467 2468/2468/2468 2469/2469/2469 -f 2470/2470/2470 2469/2469/2469 2468/2468/2468 -g charts -o chart0000 -s off -f 2467/2467/2467 2468/2468/2468 2469/2469/2469 -f 2470/2470/2470 2469/2469/2469 2468/2468/2468 -v 10893 25026 -247.8 -vt 0.984622 0.858314 -v 10856.5 25026 -285.3 -vt 0.983791 0.858615 -v 10856.5 25026 2594.7 -vt 0.983791 0.835532 -v 10893 25026 1934.7 -vt 0.984622 0.840822 -o mesh490 -s off -f 2471/2471/2471 2472/2472/2472 2473/2473/2473 -f 2471/2471/2471 2473/2473/2473 2474/2474/2474 -g charts -o chart0000 -s off -f 2471/2471/2471 2472/2472/2472 2473/2473/2473 -f 2471/2471/2471 2473/2473/2473 2474/2474/2474 -v 10893 25026 1934.7 -vt 0.692851 0.890767 -v 10856.5 25026 2594.7 -vt 0.69867 0.890767 -v 10893 25026 1960.95 -vt 0.693082 0.890732 -v 10893 25026 2557.2 -vt 0.698323 0.889942 -o mesh491 -s off -f 2475/2475/2475 2476/2476/2476 2477/2477/2477 -f 2477/2477/2477 2476/2476/2476 2478/2478/2478 -g charts -o chart0000 -s off -f 2475/2475/2475 2476/2476/2476 2477/2477/2477 -f 2477/2477/2477 2476/2476/2476 2478/2478/2478 -v 10893 25026 2557.2 -vt 0.633376 0.711047 -v 10856.5 25026 2594.7 -vt 0.633001 0.711871 -v 11294.1 25026 2557.2 -vt 0.637157 0.711871 -o mesh492 -s off -f 2479/2479/2479 2480/2480/2480 2481/2481/2481 -g charts -o chart0000 -s off -f 2479/2479/2479 2480/2480/2480 2481/2481/2481 -v 11294.1 25026 2557.2 -vt 0.615544 0.777161 -v 10856.5 25026 2594.7 -vt 0.616376 0.773702 -v 11319.7 25026 2557.2 -vt 0.61557 0.777363 -v 11683.3 25026 2557.2 -vt 0.615941 0.78023 -v 11708.9 25026 2557.2 -vt 0.615967 0.780432 -v 12110 25026 2557.2 -vt 0.616376 0.783594 -o mesh493 -s off -f 2482/2482/2482 2483/2483/2483 2484/2484/2484 -f 2484/2484/2484 2483/2483/2483 2485/2485/2485 -f 2485/2485/2485 2483/2483/2483 2486/2486/2486 -f 2486/2486/2486 2483/2483/2483 2487/2487/2487 -g charts -o chart0000 -s off -f 2482/2482/2482 2483/2483/2483 2484/2484/2484 -f 2484/2484/2484 2483/2483/2483 2485/2485/2485 -f 2485/2485/2485 2483/2483/2483 2486/2486/2486 -f 2486/2486/2486 2483/2483/2483 2487/2487/2487 -v 12146.5 25026 -285.3 -vt 0.700332 0.896537 -v 12110 25026 -247.8 -vt 0.700029 0.895713 -v 12146.5 25026 2594.7 -vt 0.677057 0.896537 -o mesh494 -s off -f 2488/2488/2488 2489/2489/2489 2490/2490/2490 -g charts -o chart0000 -s off -f 2488/2488/2488 2489/2489/2489 2490/2490/2490 -v 12146.5 25026 2594.7 -vt 0.650457 0.521434 -v 12110 25026 -247.8 -vt 0.672901 0.521434 -v 12110 25026 2557.2 -vt 0.650757 0.52061 -o mesh495 -s off -f 2491/2491/2491 2492/2492/2492 2493/2493/2493 -g charts -o chart0000 -s off -f 2491/2491/2491 2492/2492/2492 2493/2493/2493 -v 12146.5 25026 2594.7 -vt 0.923109 0.203215 -v 12110 25026 2557.2 -vt 0.922278 0.202911 -v 10856.5 25026 2594.7 -vt 0.923109 0.192498 -o mesh496 -s off -f 2494/2494/2494 2495/2495/2495 2496/2496/2496 -g charts -o chart0000 -s off -f 2494/2494/2494 2495/2495/2495 2496/2496/2496 -v 10856.5 24861 2594.7 -vt 0.445968 0.538747 -v 12146.5 24861 2594.7 -vt 0.445968 0.52803 -v 12146.5 25026 2594.7 -vt 0.444306 0.52803 -v 10856.5 25026 2594.7 -vt 0.444306 0.538747 -o mesh497 -s off -f 2497/2497/2497 2498/2498/2498 2499/2499/2499 -f 2497/2497/2497 2499/2499/2499 2500/2500/2500 -g charts -o chart0000 -s off -f 2497/2497/2497 2498/2498/2498 2499/2499/2499 -f 2497/2497/2497 2499/2499/2499 2500/2500/2500 -v 12146.5 24861 2594.7 -vt 0.389443 0.833059 -v 12146.5 24861 -285.3 -vt 0.412718 0.833059 -v 12146.5 24943.5 -285.3 -vt 0.412718 0.833883 -v 12146.5 25026 -285.3 -vt 0.412718 0.834707 -v 12146.5 25026 2594.7 -vt 0.389443 0.834707 -o mesh498 -s off -f 2501/2501/2501 2502/2502/2502 2503/2503/2503 -f 2501/2501/2501 2503/2503/2503 2504/2504/2504 -f 2501/2501/2501 2504/2504/2504 2505/2505/2505 -g charts -o chart0000 -s off -f 2501/2501/2501 2502/2502/2502 2503/2503/2503 -f 2501/2501/2501 2503/2503/2503 2504/2504/2504 -f 2501/2501/2501 2504/2504/2504 2505/2505/2505 -v 12146.5 24861 -285.3 -vt 0.820864 0.36892 -v 10856.5 24861 -285.3 -vt 0.820864 0.379637 -v 10856.5 25026 -285.3 -vt 0.822527 0.379637 -v 12146.5 25026 -285.3 -vt 0.822527 0.36892 -v 12146.5 24943.5 -285.3 -vt 0.821696 0.36892 -o mesh499 -s off -f 2506/2506/2506 2507/2507/2507 2508/2508/2508 -f 2506/2506/2506 2508/2508/2508 2509/2509/2509 -f 2506/2506/2506 2509/2509/2509 2510/2510/2510 -g charts -o chart0000 -s off -f 2506/2506/2506 2507/2507/2507 2508/2508/2508 -f 2506/2506/2506 2508/2508/2508 2509/2509/2509 -f 2506/2506/2506 2509/2509/2509 2510/2510/2510 -v 10856.5 24861 -285.3 -vt 0.519119 0.446414 -v 10856.5 24861 2594.7 -vt 0.495844 0.446414 -v 10856.5 25026 2594.7 -vt 0.495844 0.444765 -v 10856.5 25026 -285.3 -vt 0.519119 0.444765 -o mesh500 -s off -f 2511/2511/2511 2512/2512/2512 2513/2513/2513 -f 2511/2511/2511 2513/2513/2513 2514/2514/2514 -g charts -o chart0000 -s off -f 2511/2511/2511 2512/2512/2512 2513/2513/2513 -f 2511/2511/2511 2513/2513/2513 2514/2514/2514 -v 12110 25026 -247.8 -vt 0.417706 0.661583 -v 12110 24996 1934.7 -vt 0.418008 0.644264 -v 12110 25026 2557.2 -vt 0.417706 0.639324 -v 12110 24861 -247.8 -vt 0.419368 0.661583 -v 12110 24951 1934.7 -vt 0.418461 0.644264 -v 12110 24951 1960.95 -vt 0.418461 0.644055 -v 12110 24861 2557.2 -vt 0.419368 0.639324 -v 12110 24996 1960.95 -vt 0.418008 0.644055 -o mesh501 -s off -f 2515/2515/2515 2516/2516/2516 2517/2517/2517 -f 2516/2516/2516 2515/2515/2515 2518/2518/2518 -f 2516/2516/2516 2518/2518/2518 2519/2519/2519 -f 2519/2519/2519 2518/2518/2518 2520/2520/2520 -f 2520/2520/2520 2518/2518/2518 2521/2521/2521 -f 2517/2517/2517 2522/2522/2522 2521/2521/2521 -f 2522/2522/2522 2517/2517/2517 2516/2516/2516 -f 2521/2521/2521 2522/2522/2522 2520/2520/2520 -g charts -o chart0000 -s off -f 2515/2515/2515 2516/2516/2516 2517/2517/2517 -f 2516/2516/2516 2515/2515/2515 2518/2518/2518 -f 2516/2516/2516 2518/2518/2518 2519/2519/2519 -f 2519/2519/2519 2518/2518/2518 2520/2520/2520 -f 2520/2520/2520 2518/2518/2518 2521/2521/2521 -f 2517/2517/2517 2522/2522/2522 2521/2521/2521 -f 2522/2522/2522 2517/2517/2517 2516/2516/2516 -f 2521/2521/2521 2522/2522/2522 2520/2520/2520 -v 12110 24861 2557.2 -vt 0.445968 0.336768 -v 11708.9 24861 2557.2 -vt 0.449293 0.336768 -v 11708.9 24951 2557.2 -vt 0.449293 0.337668 -v 11708.9 24996 2557.2 -vt 0.449293 0.338117 -v 11708.9 25026 2557.2 -vt 0.449293 0.338417 -v 12110 25026 2557.2 -vt 0.445968 0.338417 -o mesh502 -s off -f 2523/2523/2523 2524/2524/2524 2525/2525/2525 -f 2523/2523/2523 2525/2525/2525 2526/2526/2526 -f 2523/2523/2523 2526/2526/2526 2527/2527/2527 -f 2523/2523/2523 2527/2527/2527 2528/2528/2528 -g charts -o chart0000 -s off -f 2523/2523/2523 2524/2524/2524 2525/2525/2525 -f 2523/2523/2523 2525/2525/2525 2526/2526/2526 -f 2523/2523/2523 2526/2526/2526 2527/2527/2527 -f 2523/2523/2523 2527/2527/2527 2528/2528/2528 -v 11708.9 25026 2557.2 -vt 0.00623441 0.609645 -v 11708.9 24996 2557.2 -vt 0.00623441 0.61047 -v 11683.3 24996 2557.2 -vt 0.00706559 0.61047 -v 11683.3 25026 2557.2 -vt 0.00706559 0.609645 -o mesh503 -s off -f 2529/2529/2529 2530/2530/2530 2531/2531/2531 -f 2529/2529/2529 2531/2531/2531 2532/2532/2532 -g charts -o chart0000 -s off -f 2529/2529/2529 2530/2530/2530 2531/2531/2531 -f 2529/2529/2529 2531/2531/2531 2532/2532/2532 -v 11683.3 24861 2557.2 -vt 0.267248 0.601401 -v 11319.7 24861 2557.2 -vt 0.263924 0.601401 -v 11319.7 24951 2557.2 -vt 0.263924 0.600502 -v 11319.7 24996 2557.2 -vt 0.263924 0.600052 -v 11319.7 25026 2557.2 -vt 0.263924 0.599753 -v 11683.3 25026 2557.2 -vt 0.267248 0.599753 -v 11683.3 24996 2557.2 -vt 0.267248 0.600052 -v 11683.3 24951 2557.2 -vt 0.267248 0.600502 -o mesh504 -s off -f 2533/2533/2533 2534/2534/2534 2535/2535/2535 -f 2533/2533/2533 2535/2535/2535 2536/2536/2536 -f 2533/2533/2533 2536/2536/2536 2537/2537/2537 -f 2533/2533/2533 2537/2537/2537 2538/2538/2538 -f 2533/2533/2533 2538/2538/2538 2539/2539/2539 -f 2533/2533/2533 2539/2539/2539 2540/2540/2540 -g charts -o chart0000 -s off -f 2533/2533/2533 2534/2534/2534 2535/2535/2535 -f 2533/2533/2533 2535/2535/2535 2536/2536/2536 -f 2533/2533/2533 2536/2536/2536 2537/2537/2537 -f 2533/2533/2533 2537/2537/2537 2538/2538/2538 -f 2533/2533/2533 2538/2538/2538 2539/2539/2539 -f 2533/2533/2533 2539/2539/2539 2540/2540/2540 -v 11319.7 25026 2557.2 -vt 0.277224 0.977329 -v 11319.7 24996 2557.2 -vt 0.277224 0.978153 -v 11294.1 24996 2557.2 -vt 0.278055 0.978153 -v 11294.1 25026 2557.2 -vt 0.278055 0.977329 -o mesh505 -s off -f 2541/2541/2541 2542/2542/2542 2543/2543/2543 -f 2541/2541/2541 2543/2543/2543 2544/2544/2544 -g charts -o chart0000 -s off -f 2541/2541/2541 2542/2542/2542 2543/2543/2543 -f 2541/2541/2541 2543/2543/2543 2544/2544/2544 -v 11294.1 24861 2557.2 -vt 0.185786 0.439819 -v 10893 24861 2557.2 -vt 0.185786 0.443116 -v 10893 25026 2557.2 -vt 0.187448 0.443116 -v 11294.1 25026 2557.2 -vt 0.187448 0.439819 -v 11294.1 24996 2557.2 -vt 0.187146 0.439819 -v 11294.1 24951 2557.2 -vt 0.186692 0.439819 -o mesh506 -s off -f 2545/2545/2545 2546/2546/2546 2547/2547/2547 -f 2545/2545/2545 2547/2547/2547 2548/2548/2548 -f 2545/2545/2545 2548/2548/2548 2549/2549/2549 -f 2545/2545/2545 2549/2549/2549 2550/2550/2550 -g charts -o chart0000 -s off -f 2545/2545/2545 2546/2546/2546 2547/2547/2547 -f 2545/2545/2545 2547/2547/2547 2548/2548/2548 -f 2545/2545/2545 2548/2548/2548 2549/2549/2549 -f 2545/2545/2545 2549/2549/2549 2550/2550/2550 -v 10893 24861 2557.2 -vt 0.462593 0.715169 -v 10893 24861 1960.95 -vt 0.462593 0.710437 -v 10893 24951 1960.95 -vt 0.461687 0.710437 -v 10893 24996 1960.95 -vt 0.461233 0.710437 -v 10893 25026 1960.95 -vt 0.460931 0.710437 -v 10893 25026 2557.2 -vt 0.460931 0.715169 -v 10893 24996 1934.7 -vt 0.461233 0.710229 -v 10893 25026 1934.7 -vt 0.460931 0.710229 -v 10893 24861 1934.7 -vt 0.462593 0.710229 -v 10893 24861 -247.8 -vt 0.462593 0.69291 -v 10893 25026 -247.8 -vt 0.460931 0.69291 -v 10893 24951 1934.7 -vt 0.461687 0.710229 -o mesh507 -s off -f 2551/2551/2551 2552/2552/2552 2553/2553/2553 -f 2551/2551/2551 2553/2553/2553 2554/2554/2554 -f 2551/2551/2551 2554/2554/2554 2555/2555/2555 -f 2551/2551/2551 2555/2555/2555 2556/2556/2556 -f 2555/2555/2555 2554/2554/2554 2557/2557/2557 -f 2555/2555/2555 2557/2557/2557 2558/2558/2558 -f 2559/2559/2559 2560/2560/2560 2561/2561/2561 -f 2559/2559/2559 2561/2561/2561 2558/2558/2558 -f 2559/2559/2559 2558/2558/2558 2557/2557/2557 -f 2559/2559/2559 2557/2557/2557 2562/2562/2562 -f 2554/2554/2554 2553/2553/2553 2562/2562/2562 -f 2554/2554/2554 2562/2562/2562 2557/2557/2557 -g charts -o chart0000 -s off -f 2551/2551/2551 2552/2552/2552 2553/2553/2553 -f 2551/2551/2551 2553/2553/2553 2554/2554/2554 -f 2551/2551/2551 2554/2554/2554 2555/2555/2555 -f 2551/2551/2551 2555/2555/2555 2556/2556/2556 -f 2555/2555/2555 2554/2554/2554 2557/2557/2557 -f 2555/2555/2555 2557/2557/2557 2558/2558/2558 -f 2559/2559/2559 2560/2560/2560 2561/2561/2561 -f 2559/2559/2559 2561/2561/2561 2558/2558/2558 -f 2559/2559/2559 2558/2558/2558 2557/2557/2557 -f 2559/2559/2559 2557/2557/2557 2562/2562/2562 -f 2554/2554/2554 2553/2553/2553 2562/2562/2562 -f 2554/2554/2554 2562/2562/2562 2557/2557/2557 -v 10893 24861 -247.8 -vt 0.588944 0.892415 -v 12110 24861 -247.8 -vt 0.578969 0.892415 -v 12110 25026 -247.8 -vt 0.578969 0.890767 -v 10893 25026 -247.8 -vt 0.588944 0.890767 -o mesh508 -s off -f 2563/2563/2563 2564/2564/2564 2565/2565/2565 -f 2563/2563/2563 2565/2565/2565 2566/2566/2566 -g charts -o chart0000 -s off -f 2563/2563/2563 2564/2564/2564 2565/2565/2565 -f 2563/2563/2563 2565/2565/2565 2566/2566/2566 -v 11708.9 24996 2557.2 -vt 0.242311 0.50742 -v 11708.9 24996 1960.95 -vt 0.242311 0.502473 -v 12110 24996 1960.95 -vt 0.238986 0.502473 -v 11708.9 24996 2557.2 -vt 0.967997 0.739114 -v 12110 24996 1960.95 -vt 0.972774 0.742374 -v 12110 24996 1934.7 -vt 0.972984 0.742374 -v 10893 24996 1934.7 -vt 0.972984 0.732481 -v 10893 24996 1960.95 -vt 0.972774 0.732481 -v 11708.9 24996 2557.2 -vt 0.135079 0.973207 -v 10893 24996 1960.95 -vt 0.135079 0.964963 -v 11294.1 24996 1960.95 -vt 0.132585 0.967605 -v 11708.9 24996 2557.2 -vt 0.976309 0.41014 -v 11294.1 24996 1960.95 -vt 0.976309 0.415911 -v 11294.1 24996 2557.2 -vt 0.972984 0.412022 -v 11319.7 24996 2557.2 -vt 0.973189 0.411906 -v 11708.9 24996 2557.2 -vt 0.847465 0.0556471 -v 11319.7 24996 2557.2 -vt 0.84414 0.0556471 -v 11319.7 24996 1960.95 -vt 0.84414 0.0507007 -v 11683.3 24996 1960.95 -vt 0.847246 0.0507007 -v 11708.9 24996 2557.2 -vt 0.351205 0.343363 -v 11683.3 24996 1960.95 -vt 0.346218 0.342539 -v 11683.3 24996 2557.2 -vt 0.351205 0.342539 -o mesh509 -s off -f 2567/2567/2567 2568/2568/2568 2569/2569/2569 -f 2570/2570/2570 2571/2571/2571 2572/2572/2572 -f 2570/2570/2570 2572/2572/2572 2573/2573/2573 -f 2570/2570/2570 2573/2573/2573 2574/2574/2574 -f 2575/2575/2575 2576/2576/2576 2577/2577/2577 -f 2578/2578/2578 2579/2579/2579 2580/2580/2580 -f 2578/2578/2578 2580/2580/2580 2581/2581/2581 -f 2582/2582/2582 2583/2583/2583 2584/2584/2584 -f 2582/2582/2582 2584/2584/2584 2585/2585/2585 -f 2586/2586/2586 2587/2587/2587 2588/2588/2588 -g charts -o chart0000 -s off -f 2567/2567/2567 2568/2568/2568 2569/2569/2569 -o chart0001 -s off -f 2570/2570/2570 2571/2571/2571 2572/2572/2572 -f 2570/2570/2570 2572/2572/2572 2573/2573/2573 -f 2570/2570/2570 2573/2573/2573 2574/2574/2574 -o chart0002 -s off -f 2575/2575/2575 2576/2576/2576 2577/2577/2577 -o chart0003 -s off -f 2578/2578/2578 2579/2579/2579 2580/2580/2580 -f 2578/2578/2578 2580/2580/2580 2581/2581/2581 -o chart0004 -s off -f 2582/2582/2582 2583/2583/2583 2584/2584/2584 -f 2582/2582/2582 2584/2584/2584 2585/2585/2585 -o chart0005 -s off -f 2586/2586/2586 2587/2587/2587 2588/2588/2588 -v 11708.9 24996 1960.95 -vt 0.898171 0.34089 -v 11708.9 24996 2557.2 -vt 0.898171 0.335944 -v 11708.9 24951 2557.2 -vt 0.89734 0.335944 -v 11708.9 24951 1960.95 -vt 0.89734 0.34089 -o mesh510 -s off -f 2589/2589/2589 2590/2590/2590 2591/2591/2591 -f 2589/2589/2589 2591/2591/2591 2592/2592/2592 -g charts -o chart0000 -s off -f 2589/2589/2589 2590/2590/2590 2591/2591/2591 -f 2589/2589/2589 2591/2591/2591 2592/2592/2592 -v 11708.9 24996 1960.95 -vt 0.216542 0.946826 -v 11708.9 24951 1960.95 -vt 0.216542 0.94765 -v 12110 24951 1960.95 -vt 0.213217 0.94765 -v 12110 24996 1960.95 -vt 0.213217 0.946826 -o mesh511 -s off -f 2593/2593/2593 2594/2594/2594 2595/2595/2595 -f 2593/2593/2593 2595/2595/2595 2596/2596/2596 -g charts -o chart0000 -s off -f 2593/2593/2593 2594/2594/2594 2595/2595/2595 -f 2593/2593/2593 2595/2595/2595 2596/2596/2596 -v 12110 24996 1934.7 -vt 0.984622 0.645095 -v 12110 24951 1934.7 -vt 0.984622 0.645919 -v 12110 24951 1960.95 -vt 0.985453 0.645919 -v 12110 24996 1960.95 -vt 0.985453 0.645095 -o mesh512 -s off -f 2597/2597/2597 2598/2598/2598 2599/2599/2599 -f 2597/2597/2597 2599/2599/2599 2600/2600/2600 -g charts -o chart0000 -s off -f 2597/2597/2597 2598/2598/2598 2599/2599/2599 -f 2597/2597/2597 2599/2599/2599 2600/2600/2600 -v 12110 24996 1934.7 -vt 0.0394845 0.397774 -v 12110 24951 1934.7 -vt 0.0386534 0.397774 -v 10893 24951 1934.7 -vt 0.0386534 0.387881 -v 10893 24996 1934.7 -vt 0.0394845 0.387881 -o mesh513 -s off -f 2601/2601/2601 2602/2602/2602 2603/2603/2603 -f 2601/2601/2601 2603/2603/2603 2604/2604/2604 -g charts -o chart0000 -s off -f 2601/2601/2601 2602/2602/2602 2603/2603/2603 -f 2601/2601/2601 2603/2603/2603 2604/2604/2604 -v 10893 24996 1960.95 -vt 0.982128 0.528854 -v 10893 24951 1960.95 -vt 0.982959 0.528854 -v 11294.1 24951 1960.95 -vt 0.982959 0.525556 -v 11294.1 24996 1960.95 -vt 0.982128 0.525556 -o mesh514 -s off -f 2605/2605/2605 2606/2606/2606 2607/2607/2607 -f 2605/2605/2605 2607/2607/2607 2608/2608/2608 -g charts -o chart0000 -s off -f 2605/2605/2605 2606/2606/2606 2607/2607/2607 -f 2605/2605/2605 2607/2607/2607 2608/2608/2608 -v 11294.1 24996 1960.95 -vt 0.879052 0.675598 -v 11294.1 24951 1960.95 -vt 0.879052 0.676422 -v 11294.1 24951 2557.2 -vt 0.874065 0.676422 -v 11294.1 24996 2557.2 -vt 0.874065 0.675598 -o mesh515 -s off -f 2609/2609/2609 2610/2610/2610 2611/2611/2611 -f 2609/2609/2609 2611/2611/2611 2612/2612/2612 -g charts -o chart0000 -s off -f 2609/2609/2609 2610/2610/2610 2611/2611/2611 -f 2609/2609/2609 2611/2611/2611 2612/2612/2612 -v 11319.7 24996 2557.2 -vt 0.405237 0.490107 -v 11319.7 24951 2557.2 -vt 0.405237 0.490931 -v 11294.1 24951 2557.2 -vt 0.406068 0.490931 -v 11294.1 24996 2557.2 -vt 0.406068 0.490107 -o mesh516 -s off -f 2613/2613/2613 2614/2614/2614 2615/2615/2615 -f 2613/2613/2613 2615/2615/2615 2616/2616/2616 -g charts -o chart0000 -s off -f 2613/2613/2613 2614/2614/2614 2615/2615/2615 -f 2613/2613/2613 2615/2615/2615 2616/2616/2616 -v 11319.7 24996 2557.2 -vt 0.933915 0.896537 -v 11319.7 24951 2557.2 -vt 0.933084 0.896537 -v 11319.7 24951 1960.95 -vt 0.933084 0.891591 -v 11319.7 24996 1960.95 -vt 0.933915 0.891591 -o mesh517 -s off -f 2617/2617/2617 2618/2618/2618 2619/2619/2619 -f 2617/2617/2617 2619/2619/2619 2620/2620/2620 -g charts -o chart0000 -s off -f 2617/2617/2617 2618/2618/2618 2619/2619/2619 -f 2617/2617/2617 2619/2619/2619 2620/2620/2620 -v 11319.7 24996 1960.95 -vt 0.931421 0.968261 -v 11319.7 24951 1960.95 -vt 0.931421 0.969085 -v 11683.3 24951 1960.95 -vt 0.928096 0.969085 -v 11683.3 24996 1960.95 -vt 0.928096 0.968261 -o mesh518 -s off -f 2621/2621/2621 2622/2622/2622 2623/2623/2623 -f 2621/2621/2621 2623/2623/2623 2624/2624/2624 -g charts -o chart0000 -s off -f 2621/2621/2621 2622/2622/2622 2623/2623/2623 -f 2621/2621/2621 2623/2623/2623 2624/2624/2624 -v 11683.3 24951 1960.95 -vt 0.979634 0.748145 -v 11683.3 24951 2557.2 -vt 0.974647 0.748145 -v 11683.3 24996 2557.2 -vt 0.974647 0.747321 -v 11683.3 24996 1960.95 -vt 0.979634 0.747321 -o mesh519 -s off -f 2625/2625/2625 2626/2626/2626 2627/2627/2627 -f 2625/2625/2625 2627/2627/2627 2628/2628/2628 -g charts -o chart0000 -s off -f 2625/2625/2625 2626/2626/2626 2627/2627/2627 -f 2625/2625/2625 2627/2627/2627 2628/2628/2628 -v 11708.9 24996 2557.2 -vt 0.273067 0.706925 -v 11708.9 24951 2557.2 -vt 0.273067 0.707749 -v 11683.3 24951 2557.2 -vt 0.273899 0.707749 -v 11683.3 24996 2557.2 -vt 0.273899 0.706925 -o mesh520 -s off -f 2629/2629/2629 2630/2630/2630 2631/2631/2631 -f 2629/2629/2629 2631/2631/2631 2632/2632/2632 -g charts -o chart0000 -s off -f 2629/2629/2629 2630/2630/2630 2631/2631/2631 -f 2629/2629/2629 2631/2631/2631 2632/2632/2632 -v 12110 24951 1934.7 -vt 0.500831 0.428277 -v 12110 24951 1960.95 -vt 0.501662 0.428277 -v 11708.9 24951 1960.95 -vt 0.501662 0.424979 -v 12110 24951 1934.7 -vt 0.538238 0.372218 -v 11708.9 24951 1960.95 -vt 0.540387 0.36892 -v 11708.9 24951 2557.2 -vt 0.544888 0.372218 -v 12110 24951 1934.7 -vt 0.660432 0.878401 -v 11708.9 24951 2557.2 -vt 0.655445 0.874885 -v 11683.3 24951 2557.2 -vt 0.655452 0.874671 -v 11683.3 24951 1960.95 -vt 0.660333 0.874837 -v 11319.7 24951 1960.95 -vt 0.660432 0.871805 -v 12110 24951 1934.7 -vt 0.29468 0.986397 -v 11319.7 24951 1960.95 -vt 0.299944 0.982275 -v 11319.7 24951 2557.2 -vt 0.302992 0.986397 -v 12110 24951 1934.7 -vt 0.563175 0.98887 -v 11319.7 24951 2557.2 -vt 0.558188 0.982446 -v 11294.1 24951 2557.2 -vt 0.558188 0.982238 -v 11294.1 24951 1960.95 -vt 0.562965 0.982238 -v 10893 24951 1960.95 -vt 0.562965 0.978978 -v 10893 24951 1934.7 -vt 0.563175 0.978978 -o mesh521 -s off -f 2633/2633/2633 2634/2634/2634 2635/2635/2635 -f 2636/2636/2636 2637/2637/2637 2638/2638/2638 -f 2639/2639/2639 2640/2640/2640 2641/2641/2641 -f 2639/2639/2639 2641/2641/2641 2642/2642/2642 -f 2639/2639/2639 2642/2642/2642 2643/2643/2643 -f 2644/2644/2644 2645/2645/2645 2646/2646/2646 -f 2647/2647/2647 2648/2648/2648 2649/2649/2649 -f 2647/2647/2647 2649/2649/2649 2650/2650/2650 -f 2647/2647/2647 2650/2650/2650 2651/2651/2651 -f 2647/2647/2647 2651/2651/2651 2652/2652/2652 -g charts -o chart0000 -s off -f 2633/2633/2633 2634/2634/2634 2635/2635/2635 -o chart0001 -s off -f 2636/2636/2636 2637/2637/2637 2638/2638/2638 -o chart0002 -s off -f 2639/2639/2639 2640/2640/2640 2641/2641/2641 -f 2639/2639/2639 2641/2641/2641 2642/2642/2642 -f 2639/2639/2639 2642/2642/2642 2643/2643/2643 -o chart0003 -s off -f 2644/2644/2644 2645/2645/2645 2646/2646/2646 -o chart0004 -s off -f 2647/2647/2647 2648/2648/2648 2649/2649/2649 -f 2647/2647/2647 2649/2649/2649 2650/2650/2650 -f 2647/2647/2647 2650/2650/2650 2651/2651/2651 -f 2647/2647/2647 2651/2651/2651 2652/2652/2652 -v 11708.9 24861 2557.2 -vt 0.356193 0.485985 -v 11683.3 24861 2557.2 -vt 0.357024 0.485985 -v 11683.3 24951 2557.2 -vt 0.357024 0.485161 -v 11708.9 24951 2557.2 -vt 0.356193 0.485161 -o mesh522 -s off -f 2653/2653/2653 2654/2654/2654 2655/2655/2655 -f 2653/2653/2653 2655/2655/2655 2656/2656/2656 -g charts -o chart0000 -s off -f 2653/2653/2653 2654/2654/2654 2655/2655/2655 -f 2653/2653/2653 2655/2655/2655 2656/2656/2656 -v 11319.7 24861 2557.2 -vt 0.16916 0.926216 -v 11294.1 24861 2557.2 -vt 0.169992 0.926216 -v 11294.1 24951 2557.2 -vt 0.169992 0.925392 -v 11319.7 24951 2557.2 -vt 0.16916 0.925392 -o mesh523 -s off -f 2657/2657/2657 2658/2658/2658 2659/2659/2659 -f 2657/2657/2657 2659/2659/2659 2660/2660/2660 -g charts -o chart0000 -s off -f 2657/2657/2657 2658/2658/2658 2659/2659/2659 -f 2657/2657/2657 2659/2659/2659 2660/2660/2660 -v 10893 24861 1960.95 -vt 0.253117 0.795136 -v 10893 24861 1934.7 -vt 0.253117 0.79596 -v 10893 24951 1934.7 -vt 0.252286 0.79596 -v 10893 24951 1960.95 -vt 0.252286 0.795136 -o mesh524 -s off -f 2661/2661/2661 2662/2662/2662 2663/2663/2663 -f 2661/2661/2661 2663/2663/2663 2664/2664/2664 -g charts -o chart0000 -s off -f 2661/2661/2661 2662/2662/2662 2663/2663/2663 -f 2661/2661/2661 2663/2663/2663 2664/2664/2664 -v 13526.5 24861 -285.3 -vt 0.807564 0.791014 -v 13490 24861 -247.8 -vt 0.806733 0.79071 -v 12236.5 24861 -285.3 -vt 0.807564 0.780297 -v 12273 24861 -247.8 -vt 0.806733 0.7806 -o mesh525 -s off -f 2665/2665/2665 2666/2666/2666 2667/2667/2667 -f 2668/2668/2668 2667/2667/2667 2666/2666/2666 -g charts -o chart0000 -s off -f 2665/2665/2665 2666/2666/2666 2667/2667/2667 -f 2668/2668/2668 2667/2667/2667 2666/2666/2666 -v 13490 24861 -247.8 -vt 0.45209 0.628607 -v 13526.5 24861 -285.3 -vt 0.451787 0.629431 -v 13526.5 24861 2594.7 -vt 0.475062 0.629431 -o mesh526 -s off -f 2669/2669/2669 2670/2670/2670 2671/2671/2671 -g charts -o chart0000 -s off -f 2669/2669/2669 2670/2670/2670 2671/2671/2671 -v 13490 24861 -247.8 -vt 0.724439 0.464551 -v 13526.5 24861 2594.7 -vt 0.746883 0.464551 -v 13490 24861 2557.2 -vt 0.746583 0.463726 -o mesh527 -s off -f 2672/2672/2672 2673/2673/2673 2674/2674/2674 -g charts -o chart0000 -s off -f 2672/2672/2672 2673/2673/2673 2674/2674/2674 -v 13490 24861 2557.2 -vt 0.69572 0.894064 -v 13526.5 24861 2594.7 -vt 0.695345 0.894889 -v 13088.9 24861 2557.2 -vt 0.699501 0.894889 -o mesh528 -s off -f 2675/2675/2675 2676/2676/2676 2677/2677/2677 -g charts -o chart0000 -s off -f 2675/2675/2675 2676/2676/2676 2677/2677/2677 -v 13088.9 24861 2557.2 -vt 0.0715627 0.595631 -v 13526.5 24861 2594.7 -vt 0.0752285 0.594806 -v 13063.3 24861 2557.2 -vt 0.0713484 0.595631 -v 12699.7 24861 2557.2 -vt 0.0683025 0.595631 -v 12674.1 24861 2557.2 -vt 0.0680882 0.595631 -v 12273 24861 2557.2 -vt 0.0647285 0.595631 -v 12236.5 24861 2594.7 -vt 0.0644223 0.594806 -o mesh529 -s off -f 2678/2678/2678 2679/2679/2679 2680/2680/2680 -f 2680/2680/2680 2679/2679/2679 2681/2681/2681 -f 2681/2681/2681 2679/2679/2679 2682/2682/2682 -f 2682/2682/2682 2679/2679/2679 2683/2683/2683 -f 2684/2684/2684 2683/2683/2683 2679/2679/2679 -g charts -o chart0000 -s off -f 2678/2678/2678 2679/2679/2679 2680/2680/2680 -f 2680/2680/2680 2679/2679/2679 2681/2681/2681 -f 2681/2681/2681 2679/2679/2679 2682/2682/2682 -f 2682/2682/2682 2679/2679/2679 2683/2683/2683 -f 2684/2684/2684 2683/2683/2683 2679/2679/2679 -v 12236.5 24861 -285.3 -vt 0.445137 0.969909 -v 12273 24861 -247.8 -vt 0.444834 0.969085 -v 12236.5 24861 2594.7 -vt 0.421862 0.969909 -o mesh530 -s off -f 2685/2685/2685 2686/2686/2686 2687/2687/2687 -g charts -o chart0000 -s off -f 2685/2685/2685 2686/2686/2686 2687/2687/2687 -v 12236.5 24861 2594.7 -vt 0.901496 0.678895 -v 12273 24861 -247.8 -vt 0.901496 0.701154 -v 12273 24861 1934.7 -vt 0.900849 0.684066 -v 12273 24861 1960.95 -vt 0.900842 0.683861 -v 12273 24861 2557.2 -vt 0.900665 0.679193 -o mesh531 -s off -f 2688/2688/2688 2689/2689/2689 2690/2690/2690 -f 2688/2688/2688 2690/2690/2690 2691/2691/2691 -f 2688/2688/2688 2691/2691/2691 2692/2692/2692 -g charts -o chart0000 -s off -f 2688/2688/2688 2689/2689/2689 2690/2690/2690 -f 2688/2688/2688 2690/2690/2690 2691/2691/2691 -f 2688/2688/2688 2691/2691/2691 2692/2692/2692 -v 12236.5 25026 -285.3 -vt 0.893184 0.293899 -v 12273 25026 -247.8 -vt 0.894015 0.294203 -v 13526.5 25026 -285.3 -vt 0.893184 0.304617 -v 13490 25026 -247.8 -vt 0.894015 0.304313 -o mesh532 -s off -f 2693/2693/2693 2694/2694/2694 2695/2695/2695 -f 2696/2696/2696 2695/2695/2695 2694/2694/2694 -g charts -o chart0000 -s off -f 2693/2693/2693 2694/2694/2694 2695/2695/2695 -f 2696/2696/2696 2695/2695/2695 2694/2694/2694 -v 12273 25026 -247.8 -vt 0.971322 0.416435 -v 12236.5 25026 -285.3 -vt 0.970491 0.416735 -v 12236.5 25026 2594.7 -vt 0.97049 0.393652 -v 12273 25026 1934.7 -vt 0.971322 0.398942 -o mesh533 -s off -f 2697/2697/2697 2698/2698/2698 2699/2699/2699 -f 2697/2697/2697 2699/2699/2699 2700/2700/2700 -g charts -o chart0000 -s off -f 2697/2697/2697 2698/2698/2698 2699/2699/2699 -f 2697/2697/2697 2699/2699/2699 2700/2700/2700 -v 12273 25026 1934.7 -vt 0.878221 0.0169002 -v 12236.5 25026 2594.7 -vt 0.878221 0.022671 -v 12273 25026 1960.95 -vt 0.878186 0.017129 -v 12273 25026 2557.2 -vt 0.87739 0.0223265 -o mesh534 -s off -f 2701/2701/2701 2702/2702/2702 2703/2703/2703 -f 2703/2703/2703 2702/2702/2702 2704/2704/2704 -g charts -o chart0000 -s off -f 2701/2701/2701 2702/2702/2702 2703/2703/2703 -f 2703/2703/2703 2702/2702/2702 2704/2704/2704 -v 12273 25026 2557.2 -vt 0.110973 0.958739 -v 12236.5 25026 2594.7 -vt 0.111804 0.958368 -v 12674.1 25026 2557.2 -vt 0.111803 0.96249 -o mesh535 -s off -f 2705/2705/2705 2706/2706/2706 2707/2707/2707 -g charts -o chart0000 -s off -f 2705/2705/2705 2706/2706/2706 2707/2707/2707 -v 12674.1 25026 2557.2 -vt 0.642976 0.31632 -v 12236.5 25026 2594.7 -vt 0.643807 0.312861 -v 12699.7 25026 2557.2 -vt 0.643002 0.316522 -v 13063.3 25026 2557.2 -vt 0.643372 0.319389 -v 13088.9 25026 2557.2 -vt 0.643399 0.319591 -v 13490 25026 2557.2 -vt 0.643807 0.322753 -o mesh536 -s off -f 2708/2708/2708 2709/2709/2709 2710/2710/2710 -f 2710/2710/2710 2709/2709/2709 2711/2711/2711 -f 2711/2711/2711 2709/2709/2709 2712/2712/2712 -f 2712/2712/2712 2709/2709/2709 2713/2713/2713 -g charts -o chart0000 -s off -f 2708/2708/2708 2709/2709/2709 2710/2710/2710 -f 2710/2710/2710 2709/2709/2709 2711/2711/2711 -f 2711/2711/2711 2709/2709/2709 2712/2712/2712 -f 2712/2712/2712 2709/2709/2709 2713/2713/2713 -v 13526.5 25026 -285.3 -vt 0.00623433 0.681368 -v 13490 25026 -247.8 -vt 0.00540316 0.681068 -v 13526.5 25026 2594.7 -vt 0.00623433 0.658285 -o mesh537 -s off -f 2714/2714/2714 2715/2715/2715 2716/2716/2716 -g charts -o chart0000 -s off -f 2714/2714/2714 2715/2715/2715 2716/2716/2716 -v 13526.5 25026 2594.7 -vt 0.165835 0.588211 -v 13490 25026 -247.8 -vt 0.188279 0.588211 -v 13490 25026 2557.2 -vt 0.166135 0.587387 -o mesh538 -s off -f 2717/2717/2717 2718/2718/2718 2719/2719/2719 -g charts -o chart0000 -s off -f 2717/2717/2717 2718/2718/2718 2719/2719/2719 -v 13526.5 25026 2594.7 -vt 0.871571 0.260099 -v 13490 25026 2557.2 -vt 0.87074 0.259795 -v 12236.5 25026 2594.7 -vt 0.871571 0.249382 -o mesh539 -s off -f 2720/2720/2720 2721/2721/2721 2722/2722/2722 -g charts -o chart0000 -s off -f 2720/2720/2720 2721/2721/2721 2722/2722/2722 -v 12236.5 24861 2594.7 -vt 0.0087281 0.269167 -v 13526.5 24861 2594.7 -vt 0.0087281 0.25845 -v 13526.5 25026 2594.7 -vt 0.00706567 0.25845 -v 12236.5 25026 2594.7 -vt 0.00706567 0.269167 -o mesh540 -s off -f 2723/2723/2723 2724/2724/2724 2725/2725/2725 -f 2723/2723/2723 2725/2725/2725 2726/2726/2726 -g charts -o chart0000 -s off -f 2723/2723/2723 2724/2724/2724 2725/2725/2725 -f 2723/2723/2723 2725/2725/2725 2726/2726/2726 -v 13526.5 24861 2594.7 -vt 0.293849 0.791014 -v 13526.5 24861 -285.3 -vt 0.317124 0.791014 -v 13526.5 24943.5 -285.3 -vt 0.317124 0.791838 -v 13526.5 25026 -285.3 -vt 0.317124 0.792663 -v 13526.5 25026 2594.7 -vt 0.293849 0.792663 -o mesh541 -s off -f 2727/2727/2727 2728/2728/2728 2729/2729/2729 -f 2727/2727/2727 2729/2729/2729 2730/2730/2730 -f 2727/2727/2727 2730/2730/2730 2731/2731/2731 -g charts -o chart0000 -s off -f 2727/2727/2727 2728/2728/2728 2729/2729/2729 -f 2727/2727/2727 2729/2729/2729 2730/2730/2730 -f 2727/2727/2727 2730/2730/2730 2731/2731/2731 -v 13526.5 24861 -285.3 -vt 0.191604 0.637675 -v 12236.5 24861 -285.3 -vt 0.191604 0.648392 -v 12236.5 25026 -285.3 -vt 0.193267 0.648392 -v 13526.5 25026 -285.3 -vt 0.193267 0.637675 -v 13526.5 24943.5 -285.3 -vt 0.192436 0.637675 -o mesh542 -s off -f 2732/2732/2732 2733/2733/2733 2734/2734/2734 -f 2732/2732/2732 2734/2734/2734 2735/2735/2735 -f 2732/2732/2732 2735/2735/2735 2736/2736/2736 -g charts -o chart0000 -s off -f 2732/2732/2732 2733/2733/2733 2734/2734/2734 -f 2732/2732/2732 2734/2734/2734 2735/2735/2735 -f 2732/2732/2732 2735/2735/2735 2736/2736/2736 -v 12236.5 24861 -285.3 -vt 0.295511 0.967436 -v 12236.5 24861 2594.7 -vt 0.272236 0.967436 -v 12236.5 25026 2594.7 -vt 0.272236 0.965787 -v 12236.5 25026 -285.3 -vt 0.295511 0.965787 -o mesh543 -s off -f 2737/2737/2737 2738/2738/2738 2739/2739/2739 -f 2737/2737/2737 2739/2739/2739 2740/2740/2740 -g charts -o chart0000 -s off -f 2737/2737/2737 2738/2738/2738 2739/2739/2739 -f 2737/2737/2737 2739/2739/2739 2740/2740/2740 -v 13490 25026 -247.8 -vt 0.782627 0.38953 -v 13490 24996 1934.7 -vt 0.782929 0.372211 -v 13490 25026 2557.2 -vt 0.782627 0.367271 -v 13490 24861 -247.8 -vt 0.784289 0.38953 -v 13490 24951 1934.7 -vt 0.783382 0.372211 -v 13490 24951 1960.95 -vt 0.783382 0.372003 -v 13490 24861 2557.2 -vt 0.784289 0.367271 -v 13490 24996 1960.95 -vt 0.782929 0.372003 -o mesh544 -s off -f 2741/2741/2741 2742/2742/2742 2743/2743/2743 -f 2742/2742/2742 2741/2741/2741 2744/2744/2744 -f 2742/2742/2742 2744/2744/2744 2745/2745/2745 -f 2745/2745/2745 2744/2744/2744 2746/2746/2746 -f 2746/2746/2746 2744/2744/2744 2747/2747/2747 -f 2743/2743/2743 2748/2748/2748 2747/2747/2747 -f 2748/2748/2748 2743/2743/2743 2742/2742/2742 -f 2747/2747/2747 2748/2748/2748 2746/2746/2746 -g charts -o chart0000 -s off -f 2741/2741/2741 2742/2742/2742 2743/2743/2743 -f 2742/2742/2742 2741/2741/2741 2744/2744/2744 -f 2742/2742/2742 2744/2744/2744 2745/2745/2745 -f 2745/2745/2745 2744/2744/2744 2746/2746/2746 -f 2746/2746/2746 2744/2744/2744 2747/2747/2747 -f 2743/2743/2743 2748/2748/2748 2747/2747/2747 -f 2748/2748/2748 2743/2743/2743 2742/2742/2742 -f 2747/2747/2747 2748/2748/2748 2746/2746/2746 -v 13490 24861 2557.2 -vt 0.338737 0.992168 -v 13088.9 24861 2557.2 -vt 0.342061 0.992168 -v 13088.9 24951 2557.2 -vt 0.342061 0.993067 -v 13088.9 24996 2557.2 -vt 0.342061 0.993517 -v 13088.9 25026 2557.2 -vt 0.342061 0.993817 -v 13490 25026 2557.2 -vt 0.338737 0.993817 -o mesh545 -s off -f 2749/2749/2749 2750/2750/2750 2751/2751/2751 -f 2749/2749/2749 2751/2751/2751 2752/2752/2752 -f 2749/2749/2749 2752/2752/2752 2753/2753/2753 -f 2749/2749/2749 2753/2753/2753 2754/2754/2754 -g charts -o chart0000 -s off -f 2749/2749/2749 2750/2750/2750 2751/2751/2751 -f 2749/2749/2749 2751/2751/2751 2752/2752/2752 -f 2749/2749/2749 2752/2752/2752 2753/2753/2753 -f 2749/2749/2749 2753/2753/2753 2754/2754/2754 -v 13088.9 25026 2557.2 -vt 0.938071 0.920445 -v 13088.9 24996 2557.2 -vt 0.938071 0.921269 -v 13063.3 24996 2557.2 -vt 0.938903 0.921269 -v 13063.3 25026 2557.2 -vt 0.938903 0.920445 -o mesh546 -s off -f 2755/2755/2755 2756/2756/2756 2757/2757/2757 -f 2755/2755/2755 2757/2757/2757 2758/2758/2758 -g charts -o chart0000 -s off -f 2755/2755/2755 2756/2756/2756 2757/2757/2757 -f 2755/2755/2755 2757/2757/2757 2758/2758/2758 -v 13063.3 24861 2557.2 -vt 0.871571 0.994641 -v 12699.7 24861 2557.2 -vt 0.868246 0.994641 -v 12699.7 24951 2557.2 -vt 0.868246 0.993742 -v 12699.7 24996 2557.2 -vt 0.868246 0.993292 -v 12699.7 25026 2557.2 -vt 0.868246 0.992993 -v 13063.3 25026 2557.2 -vt 0.871571 0.992993 -v 13063.3 24996 2557.2 -vt 0.871571 0.993292 -v 13063.3 24951 2557.2 -vt 0.871571 0.993742 -o mesh547 -s off -f 2759/2759/2759 2760/2760/2760 2761/2761/2761 -f 2759/2759/2759 2761/2761/2761 2762/2762/2762 -f 2759/2759/2759 2762/2762/2762 2763/2763/2763 -f 2759/2759/2759 2763/2763/2763 2764/2764/2764 -f 2759/2759/2759 2764/2764/2764 2765/2765/2765 -f 2759/2759/2759 2765/2765/2765 2766/2766/2766 -g charts -o chart0000 -s off -f 2759/2759/2759 2760/2760/2760 2761/2761/2761 -f 2759/2759/2759 2761/2761/2761 2762/2762/2762 -f 2759/2759/2759 2762/2762/2762 2763/2763/2763 -f 2759/2759/2759 2763/2763/2763 2764/2764/2764 -f 2759/2759/2759 2764/2764/2764 2765/2765/2765 -f 2759/2759/2759 2765/2765/2765 2766/2766/2766 -v 12699.7 25026 2557.2 -vt 0.258105 0.415087 -v 12699.7 24996 2557.2 -vt 0.258936 0.415087 -v 12674.1 24996 2557.2 -vt 0.258936 0.415911 -v 12674.1 25026 2557.2 -vt 0.258105 0.415911 -o mesh548 -s off -f 2767/2767/2767 2768/2768/2768 2769/2769/2769 -f 2767/2767/2767 2769/2769/2769 2770/2770/2770 -g charts -o chart0000 -s off -f 2767/2767/2767 2768/2768/2768 2769/2769/2769 -f 2767/2767/2767 2769/2769/2769 2770/2770/2770 -v 12674.1 24861 2557.2 -vt 0.875727 0.838005 -v 12273 24861 2557.2 -vt 0.875727 0.841302 -v 12273 25026 2557.2 -vt 0.87739 0.841302 -v 12674.1 25026 2557.2 -vt 0.87739 0.838005 -v 12674.1 24996 2557.2 -vt 0.877087 0.838005 -v 12674.1 24951 2557.2 -vt 0.876634 0.838005 -o mesh549 -s off -f 2771/2771/2771 2772/2772/2772 2773/2773/2773 -f 2771/2771/2771 2773/2773/2773 2774/2774/2774 -f 2771/2771/2771 2774/2774/2774 2775/2775/2775 -f 2771/2771/2771 2775/2775/2775 2776/2776/2776 -g charts -o chart0000 -s off -f 2771/2771/2771 2772/2772/2772 2773/2773/2773 -f 2771/2771/2771 2773/2773/2773 2774/2774/2774 -f 2771/2771/2771 2774/2774/2774 2775/2775/2775 -f 2771/2771/2771 2775/2775/2775 2776/2776/2776 -v 12273 24861 2557.2 -vt 0.887365 0.308739 -v 12273 24861 1960.95 -vt 0.887365 0.304007 -v 12273 24951 1960.95 -vt 0.886458 0.304007 -v 12273 24996 1960.95 -vt 0.886005 0.304007 -v 12273 25026 1960.95 -vt 0.885702 0.304007 -v 12273 25026 2557.2 -vt 0.885702 0.308739 -v 12273 24996 1934.7 -vt 0.886005 0.303799 -v 12273 25026 1934.7 -vt 0.885702 0.303799 -v 12273 24861 1934.7 -vt 0.887365 0.303799 -v 12273 24861 -247.8 -vt 0.887365 0.28648 -v 12273 25026 -247.8 -vt 0.885702 0.28648 -v 12273 24951 1934.7 -vt 0.886458 0.303799 -o mesh550 -s off -f 2777/2777/2777 2778/2778/2778 2779/2779/2779 -f 2777/2777/2777 2779/2779/2779 2780/2780/2780 -f 2777/2777/2777 2780/2780/2780 2781/2781/2781 -f 2777/2777/2777 2781/2781/2781 2782/2782/2782 -f 2781/2781/2781 2780/2780/2780 2783/2783/2783 -f 2781/2781/2781 2783/2783/2783 2784/2784/2784 -f 2785/2785/2785 2786/2786/2786 2787/2787/2787 -f 2785/2785/2785 2787/2787/2787 2784/2784/2784 -f 2785/2785/2785 2784/2784/2784 2783/2783/2783 -f 2785/2785/2785 2783/2783/2783 2788/2788/2788 -f 2780/2780/2780 2779/2779/2779 2788/2788/2788 -f 2780/2780/2780 2788/2788/2788 2783/2783/2783 -g charts -o chart0000 -s off -f 2777/2777/2777 2778/2778/2778 2779/2779/2779 -f 2777/2777/2777 2779/2779/2779 2780/2780/2780 -f 2777/2777/2777 2780/2780/2780 2781/2781/2781 -f 2777/2777/2777 2781/2781/2781 2782/2782/2782 -f 2781/2781/2781 2780/2780/2780 2783/2783/2783 -f 2781/2781/2781 2783/2783/2783 2784/2784/2784 -f 2785/2785/2785 2786/2786/2786 2787/2787/2787 -f 2785/2785/2785 2787/2787/2787 2784/2784/2784 -f 2785/2785/2785 2784/2784/2784 2783/2783/2783 -f 2785/2785/2785 2783/2783/2783 2788/2788/2788 -f 2780/2780/2780 2779/2779/2779 2788/2788/2788 -f 2780/2780/2780 2788/2788/2788 2783/2783/2783 -v 12273 24861 -247.8 -vt 0.112635 0.942704 -v 13490 24861 -247.8 -vt 0.112635 0.932811 -v 13490 25026 -247.8 -vt 0.110973 0.932811 -v 12273 25026 -247.8 -vt 0.110973 0.942704 -o mesh551 -s off -f 2789/2789/2789 2790/2790/2790 2791/2791/2791 -f 2789/2789/2789 2791/2791/2791 2792/2792/2792 -g charts -o chart0000 -s off -f 2789/2789/2789 2790/2790/2790 2791/2791/2791 -f 2789/2789/2789 2791/2791/2791 2792/2792/2792 -v 13088.9 24996 2557.2 -vt 0.117623 0.354081 -v 13088.9 24996 1960.95 -vt 0.112635 0.354081 -v 13490 24996 1960.95 -vt 0.112635 0.350783 -v 13088.9 24996 2557.2 -vt 0.323774 0.755602 -v 13490 24996 1960.95 -vt 0.328551 0.758862 -v 13490 24996 1934.7 -vt 0.328761 0.758862 -v 12273 24996 1934.7 -vt 0.328761 0.748969 -v 12273 24996 1960.95 -vt 0.328551 0.748969 -v 13088.9 24996 2557.2 -vt 0.709476 0.796785 -v 12273 24996 1960.95 -vt 0.701164 0.796785 -v 12674.1 24996 1960.95 -vt 0.703827 0.794312 -v 13088.9 24996 2557.2 -vt 0.297174 0.473619 -v 12674.1 24996 1960.95 -vt 0.297174 0.47939 -v 12674.1 24996 2557.2 -vt 0.293849 0.475501 -v 12699.7 24996 2557.2 -vt 0.294054 0.475385 -v 13088.9 24996 2557.2 -vt 0.386118 0.301319 -v 12699.7 24996 2557.2 -vt 0.382793 0.301319 -v 12699.7 24996 1960.95 -vt 0.382793 0.296373 -v 13063.3 24996 1960.95 -vt 0.385899 0.296373 -v 13088.9 24996 2557.2 -vt 0.881546 0.697032 -v 13063.3 24996 1960.95 -vt 0.880715 0.692086 -v 13063.3 24996 2557.2 -vt 0.880715 0.697032 -o mesh552 -s off -f 2793/2793/2793 2794/2794/2794 2795/2795/2795 -f 2796/2796/2796 2797/2797/2797 2798/2798/2798 -f 2796/2796/2796 2798/2798/2798 2799/2799/2799 -f 2796/2796/2796 2799/2799/2799 2800/2800/2800 -f 2801/2801/2801 2802/2802/2802 2803/2803/2803 -f 2804/2804/2804 2805/2805/2805 2806/2806/2806 -f 2804/2804/2804 2806/2806/2806 2807/2807/2807 -f 2808/2808/2808 2809/2809/2809 2810/2810/2810 -f 2808/2808/2808 2810/2810/2810 2811/2811/2811 -f 2812/2812/2812 2813/2813/2813 2814/2814/2814 -g charts -o chart0000 -s off -f 2793/2793/2793 2794/2794/2794 2795/2795/2795 -o chart0001 -s off -f 2796/2796/2796 2797/2797/2797 2798/2798/2798 -f 2796/2796/2796 2798/2798/2798 2799/2799/2799 -f 2796/2796/2796 2799/2799/2799 2800/2800/2800 -o chart0002 -s off -f 2801/2801/2801 2802/2802/2802 2803/2803/2803 -o chart0003 -s off -f 2804/2804/2804 2805/2805/2805 2806/2806/2806 -f 2804/2804/2804 2806/2806/2806 2807/2807/2807 -o chart0004 -s off -f 2808/2808/2808 2809/2809/2809 2810/2810/2810 -f 2808/2808/2808 2810/2810/2810 2811/2811/2811 -o chart0005 -s off -f 2812/2812/2812 2813/2813/2813 2814/2814/2814 -v 13088.9 24996 1960.95 -vt 0.369493 0.850371 -v 13088.9 24996 2557.2 -vt 0.364505 0.850371 -v 13088.9 24951 2557.2 -vt 0.364505 0.849547 -v 13088.9 24951 1960.95 -vt 0.369493 0.849547 -o mesh553 -s off -f 2815/2815/2815 2816/2816/2816 2817/2817/2817 -f 2815/2815/2815 2817/2817/2817 2818/2818/2818 -g charts -o chart0000 -s off -f 2815/2815/2815 2816/2816/2816 2817/2817/2817 -f 2815/2815/2815 2817/2817/2817 2818/2818/2818 -v 13088.9 24996 1960.95 -vt 0.969659 0.305441 -v 13088.9 24951 1960.95 -vt 0.969659 0.306265 -v 13490 24951 1960.95 -vt 0.966334 0.306265 -v 13490 24996 1960.95 -vt 0.966334 0.305441 -o mesh554 -s off -f 2819/2819/2819 2820/2820/2820 2821/2821/2821 -f 2819/2819/2819 2821/2821/2821 2822/2822/2822 -g charts -o chart0000 -s off -f 2819/2819/2819 2820/2820/2820 2821/2821/2821 -f 2819/2819/2819 2821/2821/2821 2822/2822/2822 -v 13490 24996 1934.7 -vt 0.423525 0.834707 -v 13490 24951 1934.7 -vt 0.424356 0.834707 -v 13490 24951 1960.95 -vt 0.424356 0.835532 -v 13490 24996 1960.95 -vt 0.423525 0.835532 -o mesh555 -s off -f 2823/2823/2823 2824/2824/2824 2825/2825/2825 -f 2823/2823/2823 2825/2825/2825 2826/2826/2826 -g charts -o chart0000 -s off -f 2823/2823/2823 2824/2824/2824 2825/2825/2825 -f 2823/2823/2823 2825/2825/2825 2826/2826/2826 -v 13490 24996 1934.7 -vt 0.112635 0.398598 -v 13490 24951 1934.7 -vt 0.111804 0.398598 -v 12273 24951 1934.7 -vt 0.111804 0.388706 -v 12273 24996 1934.7 -vt 0.112635 0.388706 -o mesh556 -s off -f 2827/2827/2827 2828/2828/2828 2829/2829/2829 -f 2827/2827/2827 2829/2829/2829 2830/2830/2830 -g charts -o chart0000 -s off -f 2827/2827/2827 2828/2828/2828 2829/2829/2829 -f 2827/2827/2827 2829/2829/2829 2830/2830/2830 -v 12273 24996 1960.95 -vt 0.998753 0.625309 -v 12273 24951 1960.95 -vt 0.999584 0.625309 -v 12674.1 24951 1960.95 -vt 0.999584 0.622012 -v 12674.1 24996 1960.95 -vt 0.998753 0.622012 -o mesh557 -s off -f 2831/2831/2831 2832/2832/2832 2833/2833/2833 -f 2831/2831/2831 2833/2833/2833 2834/2834/2834 -g charts -o chart0000 -s off -f 2831/2831/2831 2832/2832/2832 2833/2833/2833 -f 2831/2831/2831 2833/2833/2833 2834/2834/2834 -v 12674.1 24996 1960.95 -vt 0.87074 0.936109 -v 12674.1 24951 1960.95 -vt 0.871571 0.936109 -v 12674.1 24951 2557.2 -vt 0.871571 0.931162 -v 12674.1 24996 2557.2 -vt 0.87074 0.931162 -o mesh558 -s off -f 2835/2835/2835 2836/2836/2836 2837/2837/2837 -f 2835/2835/2835 2837/2837/2837 2838/2838/2838 -g charts -o chart0000 -s off -f 2835/2835/2835 2836/2836/2836 2837/2837/2837 -f 2835/2835/2835 2837/2837/2837 2838/2838/2838 -v 12699.7 24996 2557.2 -vt 0.629676 0.912201 -v 12699.7 24951 2557.2 -vt 0.630507 0.912201 -v 12674.1 24951 2557.2 -vt 0.630507 0.913025 -v 12674.1 24996 2557.2 -vt 0.629676 0.913025 -o mesh559 -s off -f 2839/2839/2839 2840/2840/2840 2841/2841/2841 -f 2839/2839/2839 2841/2841/2841 2842/2842/2842 -g charts -o chart0000 -s off -f 2839/2839/2839 2840/2840/2840 2841/2841/2841 -f 2839/2839/2839 2841/2841/2841 2842/2842/2842 -v 12699.7 24996 2557.2 -vt 0.229011 0.487634 -v 12699.7 24951 2557.2 -vt 0.229011 0.48681 -v 12699.7 24951 1960.95 -vt 0.224023 0.48681 -v 12699.7 24996 1960.95 -vt 0.224023 0.487634 -o mesh560 -s off -f 2843/2843/2843 2844/2844/2844 2845/2845/2845 -f 2843/2843/2843 2845/2845/2845 2846/2846/2846 -g charts -o chart0000 -s off -f 2843/2843/2843 2844/2844/2844 2845/2845/2845 -f 2843/2843/2843 2845/2845/2845 2846/2846/2846 -v 12699.7 24996 1960.95 -vt 0.359518 0.342539 -v 12699.7 24951 1960.95 -vt 0.359518 0.343363 -v 13063.3 24951 1960.95 -vt 0.356193 0.343363 -v 13063.3 24996 1960.95 -vt 0.356193 0.342539 -o mesh561 -s off -f 2847/2847/2847 2848/2848/2848 2849/2849/2849 -f 2847/2847/2847 2849/2849/2849 2850/2850/2850 -g charts -o chart0000 -s off -f 2847/2847/2847 2848/2848/2848 2849/2849/2849 -f 2847/2847/2847 2849/2849/2849 2850/2850/2850 -v 13063.3 24951 1960.95 -vt 0.0453033 0.231245 -v 13063.3 24951 2557.2 -vt 0.0453033 0.226298 -v 13063.3 24996 2557.2 -vt 0.0444722 0.226298 -v 13063.3 24996 1960.95 -vt 0.0444722 0.231245 -o mesh562 -s off -f 2851/2851/2851 2852/2852/2852 2853/2853/2853 -f 2851/2851/2851 2853/2853/2853 2854/2854/2854 -g charts -o chart0000 -s off -f 2851/2851/2851 2852/2852/2852 2853/2853/2853 -f 2851/2851/2851 2853/2853/2853 2854/2854/2854 -v 13088.9 24996 2557.2 -vt 0.91064 0.534625 -v 13088.9 24951 2557.2 -vt 0.91064 0.535449 -v 13063.3 24951 2557.2 -vt 0.911471 0.535449 -v 13063.3 24996 2557.2 -vt 0.911471 0.534625 -o mesh563 -s off -f 2855/2855/2855 2856/2856/2856 2857/2857/2857 -f 2855/2855/2855 2857/2857/2857 2858/2858/2858 -g charts -o chart0000 -s off -f 2855/2855/2855 2856/2856/2856 2857/2857/2857 -f 2855/2855/2855 2857/2857/2857 2858/2858/2858 -v 13490 24951 1934.7 -vt 0.987947 0.174361 -v 13490 24951 1960.95 -vt 0.987947 0.175185 -v 13088.9 24951 1960.95 -vt 0.984622 0.175185 -v 13490 24951 1934.7 -vt 0.767664 0.575845 -v 13088.9 24951 1960.95 -vt 0.764339 0.577976 -v 13088.9 24951 2557.2 -vt 0.767664 0.58244 -v 13490 24951 1934.7 -vt 0.640482 0.759687 -v 13088.9 24951 2557.2 -vt 0.635495 0.756171 -v 13063.3 24951 2557.2 -vt 0.635502 0.755958 -v 13063.3 24951 1960.95 -vt 0.640383 0.756123 -v 12699.7 24951 1960.95 -vt 0.640482 0.753092 -v 13490 24951 1934.7 -vt 0.956359 0.658285 -v 12699.7 24951 1960.95 -vt 0.952203 0.663506 -v 12699.7 24951 2557.2 -vt 0.956359 0.666529 -v 13490 24951 1934.7 -vt 0.928928 0.904781 -v 12699.7 24951 2557.2 -vt 0.92394 0.898357 -v 12674.1 24951 2557.2 -vt 0.92394 0.898149 -v 12674.1 24951 1960.95 -vt 0.928717 0.898149 -v 12273 24951 1960.95 -vt 0.928717 0.894889 -v 12273 24951 1934.7 -vt 0.928928 0.894889 -o mesh564 -s off -f 2859/2859/2859 2860/2860/2860 2861/2861/2861 -f 2862/2862/2862 2863/2863/2863 2864/2864/2864 -f 2865/2865/2865 2866/2866/2866 2867/2867/2867 -f 2865/2865/2865 2867/2867/2867 2868/2868/2868 -f 2865/2865/2865 2868/2868/2868 2869/2869/2869 -f 2870/2870/2870 2871/2871/2871 2872/2872/2872 -f 2873/2873/2873 2874/2874/2874 2875/2875/2875 -f 2873/2873/2873 2875/2875/2875 2876/2876/2876 -f 2873/2873/2873 2876/2876/2876 2877/2877/2877 -f 2873/2873/2873 2877/2877/2877 2878/2878/2878 -g charts -o chart0000 -s off -f 2859/2859/2859 2860/2860/2860 2861/2861/2861 -o chart0001 -s off -f 2862/2862/2862 2863/2863/2863 2864/2864/2864 -o chart0002 -s off -f 2865/2865/2865 2866/2866/2866 2867/2867/2867 -f 2865/2865/2865 2867/2867/2867 2868/2868/2868 -f 2865/2865/2865 2868/2868/2868 2869/2869/2869 -o chart0003 -s off -f 2870/2870/2870 2871/2871/2871 2872/2872/2872 -o chart0004 -s off -f 2873/2873/2873 2874/2874/2874 2875/2875/2875 -f 2873/2873/2873 2875/2875/2875 2876/2876/2876 -f 2873/2873/2873 2876/2876/2876 2877/2877/2877 -f 2873/2873/2873 2877/2877/2877 2878/2878/2878 -v 13088.9 24861 2557.2 -vt 0.278886 0.3277 -v 13063.3 24861 2557.2 -vt 0.279717 0.3277 -v 13063.3 24951 2557.2 -vt 0.279717 0.326876 -v 13088.9 24951 2557.2 -vt 0.278886 0.326876 -o mesh565 -s off -f 2879/2879/2879 2880/2880/2880 2881/2881/2881 -f 2879/2879/2879 2881/2881/2881 2882/2882/2882 -g charts -o chart0000 -s off -f 2879/2879/2879 2880/2880/2880 2881/2881/2881 -f 2879/2879/2879 2881/2881/2881 2882/2882/2882 -v 12699.7 24861 2557.2 -vt 0.657938 0.982275 -v 12674.1 24861 2557.2 -vt 0.65877 0.982275 -v 12674.1 24951 2557.2 -vt 0.65877 0.981451 -v 12699.7 24951 2557.2 -vt 0.657938 0.981451 -o mesh566 -s off -f 2883/2883/2883 2884/2884/2884 2885/2885/2885 -f 2883/2883/2883 2885/2885/2885 2886/2886/2886 -g charts -o chart0000 -s off -f 2883/2883/2883 2884/2884/2884 2885/2885/2885 -f 2883/2883/2883 2885/2885/2885 2886/2886/2886 -v 12273 24861 1960.95 -vt 0.323774 0.435697 -v 12273 24861 1934.7 -vt 0.323774 0.436521 -v 12273 24951 1934.7 -vt 0.322943 0.436521 -v 12273 24951 1960.95 -vt 0.322943 0.435697 -o mesh567 -s off -f 2887/2887/2887 2888/2888/2888 2889/2889/2889 -f 2887/2887/2887 2889/2889/2889 2890/2890/2890 -g charts -o chart0000 -s off -f 2887/2887/2887 2888/2888/2888 2889/2889/2889 -f 2887/2887/2887 2889/2889/2889 2890/2890/2890 -v 14906.5 24861 -285.3 -vt 0.864921 0.998763 -v 14870 24861 -247.8 -vt 0.86409 0.99846 -v 13616.5 24861 -285.3 -vt 0.864921 0.988046 -v 13653 24861 -247.8 -vt 0.86409 0.98835 -o mesh568 -s off -f 2891/2891/2891 2892/2892/2892 2893/2893/2893 -f 2894/2894/2894 2893/2893/2893 2892/2892/2892 -g charts -o chart0000 -s off -f 2891/2891/2891 2892/2892/2892 2893/2893/2893 -f 2894/2894/2894 2893/2893/2893 2892/2892/2892 -v 14870 24861 -247.8 -vt 0.746355 0.655812 -v 14906.5 24861 -285.3 -vt 0.746052 0.656636 -v 14906.5 24861 2594.7 -vt 0.769327 0.656636 -o mesh569 -s off -f 2895/2895/2895 2896/2896/2896 2897/2897/2897 -g charts -o chart0000 -s off -f 2895/2895/2895 2896/2896/2896 2897/2897/2897 -v 14870 24861 -247.8 -vt 0.516625 0.52803 -v 14906.5 24861 2594.7 -vt 0.539069 0.528029 -v 14870 24861 2557.2 -vt 0.538769 0.527205 -o mesh570 -s off -f 2898/2898/2898 2899/2899/2899 2900/2900/2900 -g charts -o chart0000 -s off -f 2898/2898/2898 2899/2899/2899 2900/2900/2900 -v 14870 24861 2557.2 -vt 0.338737 0.995013 -v 14906.5 24861 2594.7 -vt 0.339568 0.994641 -v 14468.9 24861 2557.2 -vt 0.339568 0.998763 -o mesh571 -s off -f 2901/2901/2901 2902/2902/2902 2903/2903/2903 -g charts -o chart0000 -s off -f 2901/2901/2901 2902/2902/2902 2903/2903/2903 -v 14468.9 24861 2557.2 -vt 0.0680881 0.852844 -v 14906.5 24861 2594.7 -vt 0.0644223 0.853669 -v 14443.3 24861 2557.2 -vt 0.0683024 0.852844 -v 14079.7 24861 2557.2 -vt 0.0713483 0.852844 -v 14054.1 24861 2557.2 -vt 0.0715627 0.852844 -v 13653 24861 2557.2 -vt 0.0749224 0.852844 -v 13616.5 24861 2594.7 -vt 0.0752285 0.853669 -o mesh572 -s off -f 2904/2904/2904 2905/2905/2905 2906/2906/2906 -f 2906/2906/2906 2905/2905/2905 2907/2907/2907 -f 2907/2907/2907 2905/2905/2905 2908/2908/2908 -f 2908/2908/2908 2905/2905/2905 2909/2909/2909 -f 2910/2910/2910 2909/2909/2909 2905/2905/2905 -g charts -o chart0000 -s off -f 2904/2904/2904 2905/2905/2905 2906/2906/2906 -f 2906/2906/2906 2905/2905/2905 2907/2907/2907 -f 2907/2907/2907 2905/2905/2905 2908/2908/2908 -f 2908/2908/2908 2905/2905/2905 2909/2909/2909 -f 2910/2910/2910 2909/2909/2909 2905/2905/2905 -v 13616.5 24861 -285.3 -vt 0.0261845 0.914674 -v 13653 24861 -247.8 -vt 0.0258814 0.91385 -v 13616.5 24861 2594.7 -vt 0.00290939 0.914674 -o mesh573 -s off -f 2911/2911/2911 2912/2912/2912 2913/2913/2913 -g charts -o chart0000 -s off -f 2911/2911/2911 2912/2912/2912 2913/2913/2913 -v 13616.5 24861 2594.7 -vt 0.185785 0.400247 -v 13653 24861 -247.8 -vt 0.185785 0.422506 -v 13653 24861 1934.7 -vt 0.185139 0.405418 -v 13653 24861 1960.95 -vt 0.185131 0.405213 -v 13653 24861 2557.2 -vt 0.184954 0.400545 -o mesh574 -s off -f 2914/2914/2914 2915/2915/2915 2916/2916/2916 -f 2914/2914/2914 2916/2916/2916 2917/2917/2917 -f 2914/2914/2914 2917/2917/2917 2918/2918/2918 -g charts -o chart0000 -s off -f 2914/2914/2914 2915/2915/2915 2916/2916/2916 -f 2914/2914/2914 2916/2916/2916 2917/2917/2917 -f 2914/2914/2914 2917/2917/2917 2918/2918/2918 -v 13616.5 25026 -285.3 -vt 0.328761 0.570074 -v 13653 25026 -247.8 -vt 0.329593 0.570378 -v 14906.5 25026 -285.3 -vt 0.328761 0.580791 -v 14870 25026 -247.8 -vt 0.329593 0.580488 -o mesh575 -s off -f 2919/2919/2919 2920/2920/2920 2921/2921/2921 -f 2922/2922/2922 2921/2921/2921 2920/2920/2920 -g charts -o chart0000 -s off -f 2919/2919/2919 2920/2920/2920 2921/2921/2921 -f 2922/2922/2922 2921/2921/2921 2920/2920/2920 -v 13653 25026 -247.8 -vt 0.433803 0.595631 -v 13616.5 25026 -285.3 -vt 0.4335 0.596455 -v 13616.5 25026 2594.7 -vt 0.456775 0.596455 -v 13653 25026 1934.7 -vt 0.451441 0.595631 -o mesh576 -s off -f 2923/2923/2923 2924/2924/2924 2925/2925/2925 -f 2923/2923/2923 2925/2925/2925 2926/2926/2926 -g charts -o chart0000 -s off -f 2923/2923/2923 2924/2924/2924 2925/2925/2925 -f 2923/2923/2923 2925/2925/2925 2926/2926/2926 -v 13653 25026 1934.7 -vt 0.143392 0.420857 -v 13616.5 25026 2594.7 -vt 0.14921 0.420857 -v 13653 25026 1960.95 -vt 0.143622 0.420823 -v 13653 25026 2557.2 -vt 0.148863 0.420033 -o mesh577 -s off -f 2927/2927/2927 2928/2928/2928 2929/2929/2929 -f 2929/2929/2929 2928/2928/2928 2930/2930/2930 -g charts -o chart0000 -s off -f 2927/2927/2927 2928/2928/2928 2929/2929/2929 -f 2929/2929/2929 2928/2928/2928 2930/2930/2930 -v 13653 25026 2557.2 -vt 0.911015 0.00948063 -v 13616.5 25026 2594.7 -vt 0.91064 0.0103046 -v 14054.1 25026 2557.2 -vt 0.914796 0.0103049 -o mesh578 -s off -f 2931/2931/2931 2932/2932/2932 2933/2933/2933 -g charts -o chart0000 -s off -f 2931/2931/2931 2932/2932/2932 2933/2933/2933 -v 14054.1 25026 2557.2 -vt 0.0153782 0.215743 -v 13616.5 25026 2594.7 -vt 0.0162094 0.212284 -v 14079.7 25026 2557.2 -vt 0.0154043 0.215945 -v 14443.3 25026 2557.2 -vt 0.0157747 0.218812 -v 14468.9 25026 2557.2 -vt 0.0158008 0.219014 -v 14870 25026 2557.2 -vt 0.0162094 0.222176 -o mesh579 -s off -f 2934/2934/2934 2935/2935/2935 2936/2936/2936 -f 2936/2936/2936 2935/2935/2935 2937/2937/2937 -f 2937/2937/2937 2935/2935/2935 2938/2938/2938 -f 2938/2938/2938 2935/2935/2935 2939/2939/2939 -g charts -o chart0000 -s off -f 2934/2934/2934 2935/2935/2935 2936/2936/2936 -f 2936/2936/2936 2935/2935/2935 2937/2937/2937 -f 2937/2937/2937 2935/2935/2935 2938/2938/2938 -f 2938/2938/2938 2935/2935/2935 2939/2939/2939 -v 14906.5 25026 -285.3 -vt 0.0153781 0.363149 -v 14870 25026 -247.8 -vt 0.014547 0.362849 -v 14906.5 25026 2594.7 -vt 0.0153781 0.340066 -o mesh580 -s off -f 2940/2940/2940 2941/2941/2941 2942/2942/2942 -g charts -o chart0000 -s off -f 2940/2940/2940 2941/2941/2941 2942/2942/2942 -v 14906.5 25026 2594.7 -vt 0.298836 0.997114 -v 14870 25026 -247.8 -vt 0.32128 0.997114 -v 14870 25026 2557.2 -vt 0.299136 0.99629 -o mesh581 -s off -f 2943/2943/2943 2944/2944/2944 2945/2945/2945 -g charts -o chart0000 -s off -f 2943/2943/2943 2944/2944/2944 2945/2945/2945 -v 14906.5 25026 2594.7 -vt 0.340399 0.758862 -v 14870 25026 2557.2 -vt 0.340093 0.758038 -v 13616.5 25026 2594.7 -vt 0.329593 0.758862 -o mesh582 -s off -f 2946/2946/2946 2947/2947/2947 2948/2948/2948 -g charts -o chart0000 -s off -f 2946/2946/2946 2947/2947/2947 2948/2948/2948 -v 13616.5 24861 2594.7 -vt 0.796758 0.324402 -v 14906.5 24861 2594.7 -vt 0.785952 0.324402 -v 14906.5 25026 2594.7 -vt 0.785952 0.322753 -v 13616.5 25026 2594.7 -vt 0.796758 0.322753 -o mesh583 -s off -f 2949/2949/2949 2950/2950/2950 2951/2951/2951 -f 2949/2949/2949 2951/2951/2951 2952/2952/2952 -g charts -o chart0000 -s off -f 2949/2949/2949 2950/2950/2950 2951/2951/2951 -f 2949/2949/2949 2951/2951/2951 2952/2952/2952 -v 14906.5 24861 2594.7 -vt 0.145885 0.964963 -v 14906.5 24861 -285.3 -vt 0.16916 0.964963 -v 14906.5 24943.5 -285.3 -vt 0.16916 0.965787 -v 14906.5 25026 -285.3 -vt 0.16916 0.966612 -v 14906.5 25026 2594.7 -vt 0.145885 0.966612 -o mesh584 -s off -f 2953/2953/2953 2954/2954/2954 2955/2955/2955 -f 2953/2953/2953 2955/2955/2955 2956/2956/2956 -f 2953/2953/2953 2956/2956/2956 2957/2957/2957 -g charts -o chart0000 -s off -f 2953/2953/2953 2954/2954/2954 2955/2955/2955 -f 2953/2953/2953 2955/2955/2955 2956/2956/2956 -f 2953/2953/2953 2956/2956/2956 2957/2957/2957 -v 14906.5 24861 -285.3 -vt 0.218204 0.511542 -v 13616.5 24861 -285.3 -vt 0.229011 0.511542 -v 13616.5 25026 -285.3 -vt 0.229011 0.51319 -v 14906.5 25026 -285.3 -vt 0.218204 0.51319 -v 14906.5 24943.5 -285.3 -vt 0.218204 0.512366 -o mesh585 -s off -f 2958/2958/2958 2959/2959/2959 2960/2960/2960 -f 2958/2958/2958 2960/2960/2960 2961/2961/2961 -f 2958/2958/2958 2961/2961/2961 2962/2962/2962 -g charts -o chart0000 -s off -f 2958/2958/2958 2959/2959/2959 2960/2960/2960 -f 2958/2958/2958 2960/2960/2960 2961/2961/2961 -f 2958/2958/2958 2961/2961/2961 2962/2962/2962 -v 13616.5 24861 -285.3 -vt 0.0777223 0.875103 -v 13616.5 24861 2594.7 -vt 0.0777223 0.85202 -v 13616.5 25026 2594.7 -vt 0.0760598 0.85202 -v 13616.5 25026 -285.3 -vt 0.0760598 0.875103 -o mesh586 -s off -f 2963/2963/2963 2964/2964/2964 2965/2965/2965 -f 2963/2963/2963 2965/2965/2965 2966/2966/2966 -g charts -o chart0000 -s off -f 2963/2963/2963 2964/2964/2964 2965/2965/2965 -f 2963/2963/2963 2965/2965/2965 2966/2966/2966 -v 14870 25026 -247.8 -vt 0.901496 0.00370981 -v 14870 24996 1934.7 -vt 0.884033 0.00400959 -v 14870 25026 2557.2 -vt 0.879052 0.00370981 -v 14870 24861 -247.8 -vt 0.901496 0.00535853 -v 14870 24951 1934.7 -vt 0.884033 0.00445923 -v 14870 24951 1960.95 -vt 0.883823 0.00445923 -v 14870 24861 2557.2 -vt 0.879052 0.00535853 -v 14870 24996 1960.95 -vt 0.883823 0.00400959 -o mesh587 -s off -f 2967/2967/2967 2968/2968/2968 2969/2969/2969 -f 2968/2968/2968 2967/2967/2967 2970/2970/2970 -f 2968/2968/2968 2970/2970/2970 2971/2971/2971 -f 2971/2971/2971 2970/2970/2970 2972/2972/2972 -f 2972/2972/2972 2970/2970/2970 2973/2973/2973 -f 2969/2969/2969 2974/2974/2974 2973/2973/2973 -f 2974/2974/2974 2969/2969/2969 2968/2968/2968 -f 2973/2973/2973 2974/2974/2974 2972/2972/2972 -g charts -o chart0000 -s off -f 2967/2967/2967 2968/2968/2968 2969/2969/2969 -f 2968/2968/2968 2967/2967/2967 2970/2970/2970 -f 2968/2968/2968 2970/2970/2970 2971/2971/2971 -f 2971/2971/2971 2970/2970/2970 2972/2972/2972 -f 2972/2972/2972 2970/2970/2970 2973/2973/2973 -f 2969/2969/2969 2974/2974/2974 2973/2973/2973 -f 2974/2974/2974 2969/2969/2969 2968/2968/2968 -f 2973/2973/2973 2974/2974/2974 2972/2972/2972 -v 14870 24861 2557.2 -vt 0.126766 0.410965 -v 14468.9 24861 2557.2 -vt 0.130091 0.410965 -v 14468.9 24951 2557.2 -vt 0.130091 0.411864 -v 14468.9 24996 2557.2 -vt 0.130091 0.412313 -v 14468.9 25026 2557.2 -vt 0.130091 0.412613 -v 14870 25026 2557.2 -vt 0.126766 0.412613 -o mesh588 -s off -f 2975/2975/2975 2976/2976/2976 2977/2977/2977 -f 2975/2975/2975 2977/2977/2977 2978/2978/2978 -f 2975/2975/2975 2978/2978/2978 2979/2979/2979 -f 2975/2975/2975 2979/2979/2979 2980/2980/2980 -g charts -o chart0000 -s off -f 2975/2975/2975 2976/2976/2976 2977/2977/2977 -f 2975/2975/2975 2977/2977/2977 2978/2978/2978 -f 2975/2975/2975 2978/2978/2978 2979/2979/2979 -f 2975/2975/2975 2979/2979/2979 2980/2980/2980 -v 14468.9 25026 2557.2 -vt 0.913965 0.12737 -v 14468.9 24996 2557.2 -vt 0.914796 0.12737 -v 14443.3 24996 2557.2 -vt 0.914796 0.128194 -v 14443.3 25026 2557.2 -vt 0.913965 0.128194 -o mesh589 -s off -f 2981/2981/2981 2982/2982/2982 2983/2983/2983 -f 2981/2981/2981 2983/2983/2983 2984/2984/2984 -g charts -o chart0000 -s off -f 2981/2981/2981 2982/2982/2982 2983/2983/2983 -f 2981/2981/2981 2983/2983/2983 2984/2984/2984 -v 14443.3 24861 2557.2 -vt 0.494181 0.310387 -v 14079.7 24861 2557.2 -vt 0.490856 0.310387 -v 14079.7 24951 2557.2 -vt 0.490856 0.309488 -v 14079.7 24996 2557.2 -vt 0.490856 0.309038 -v 14079.7 25026 2557.2 -vt 0.490856 0.308739 -v 14443.3 25026 2557.2 -vt 0.494181 0.308739 -v 14443.3 24996 2557.2 -vt 0.494181 0.309038 -v 14443.3 24951 2557.2 -vt 0.494181 0.309488 -o mesh590 -s off -f 2985/2985/2985 2986/2986/2986 2987/2987/2987 -f 2985/2985/2985 2987/2987/2987 2988/2988/2988 -f 2985/2985/2985 2988/2988/2988 2989/2989/2989 -f 2985/2985/2985 2989/2989/2989 2990/2990/2990 -f 2985/2985/2985 2990/2990/2990 2991/2991/2991 -f 2985/2985/2985 2991/2991/2991 2992/2992/2992 -g charts -o chart0000 -s off -f 2985/2985/2985 2986/2986/2986 2987/2987/2987 -f 2985/2985/2985 2987/2987/2987 2988/2988/2988 -f 2985/2985/2985 2988/2988/2988 2989/2989/2989 -f 2985/2985/2985 2989/2989/2989 2990/2990/2990 -f 2985/2985/2985 2990/2990/2990 2991/2991/2991 -f 2985/2985/2985 2991/2991/2991 2992/2992/2992 -v 14079.7 25026 2557.2 -vt 0.369493 0.666529 -v 14079.7 24996 2557.2 -vt 0.370324 0.666529 -v 14054.1 24996 2557.2 -vt 0.370324 0.667354 -v 14054.1 25026 2557.2 -vt 0.369493 0.667354 -o mesh591 -s off -f 2993/2993/2993 2994/2994/2994 2995/2995/2995 -f 2993/2993/2993 2995/2995/2995 2996/2996/2996 -g charts -o chart0000 -s off -f 2993/2993/2993 2994/2994/2994 2995/2995/2995 -f 2993/2993/2993 2995/2995/2995 2996/2996/2996 -v 14054.1 24861 2557.2 -vt 0.755195 0.529678 -v 13653 24861 2557.2 -vt 0.755195 0.532976 -v 13653 25026 2557.2 -vt 0.756858 0.532976 -v 14054.1 25026 2557.2 -vt 0.756858 0.529678 -v 14054.1 24996 2557.2 -vt 0.756555 0.529678 -v 14054.1 24951 2557.2 -vt 0.756102 0.529678 -o mesh592 -s off -f 2997/2997/2997 2998/2998/2998 2999/2999/2999 -f 2997/2997/2997 2999/2999/2999 3000/3000/3000 -f 2997/2997/2997 3000/3000/3000 3001/3001/3001 -f 2997/2997/2997 3001/3001/3001 3002/3002/3002 -g charts -o chart0000 -s off -f 2997/2997/2997 2998/2998/2998 2999/2999/2999 -f 2997/2997/2997 2999/2999/2999 3000/3000/3000 -f 2997/2997/2997 3000/3000/3000 3001/3001/3001 -f 2997/2997/2997 3001/3001/3001 3002/3002/3002 -v 13653 24861 2557.2 -vt 0.715295 0.964963 -v 13653 24861 1960.95 -vt 0.715295 0.960231 -v 13653 24951 1960.95 -vt 0.714388 0.960231 -v 13653 24996 1960.95 -vt 0.713935 0.960231 -v 13653 25026 1960.95 -vt 0.713633 0.960231 -v 13653 25026 2557.2 -vt 0.713633 0.964963 -v 13653 24996 1934.7 -vt 0.713935 0.960023 -v 13653 25026 1934.7 -vt 0.713633 0.960023 -v 13653 24861 1934.7 -vt 0.715295 0.960023 -v 13653 24861 -247.8 -vt 0.715295 0.942704 -v 13653 25026 -247.8 -vt 0.713633 0.942704 -v 13653 24951 1934.7 -vt 0.714388 0.960023 -o mesh593 -s off -f 3003/3003/3003 3004/3004/3004 3005/3005/3005 -f 3003/3003/3003 3005/3005/3005 3006/3006/3006 -f 3003/3003/3003 3006/3006/3006 3007/3007/3007 -f 3003/3003/3003 3007/3007/3007 3008/3008/3008 -f 3007/3007/3007 3006/3006/3006 3009/3009/3009 -f 3007/3007/3007 3009/3009/3009 3010/3010/3010 -f 3011/3011/3011 3012/3012/3012 3013/3013/3013 -f 3011/3011/3011 3013/3013/3013 3010/3010/3010 -f 3011/3011/3011 3010/3010/3010 3009/3009/3009 -f 3011/3011/3011 3009/3009/3009 3014/3014/3014 -f 3006/3006/3006 3005/3005/3005 3014/3014/3014 -f 3006/3006/3006 3014/3014/3014 3009/3009/3009 -g charts -o chart0000 -s off -f 3003/3003/3003 3004/3004/3004 3005/3005/3005 -f 3003/3003/3003 3005/3005/3005 3006/3006/3006 -f 3003/3003/3003 3006/3006/3006 3007/3007/3007 -f 3003/3003/3003 3007/3007/3007 3008/3008/3008 -f 3007/3007/3007 3006/3006/3006 3009/3009/3009 -f 3007/3007/3007 3009/3009/3009 3010/3010/3010 -f 3011/3011/3011 3012/3012/3012 3013/3013/3013 -f 3011/3011/3011 3013/3013/3013 3010/3010/3010 -f 3011/3011/3011 3010/3010/3010 3009/3009/3009 -f 3011/3011/3011 3009/3009/3009 3014/3014/3014 -f 3006/3006/3006 3005/3005/3005 3014/3014/3014 -f 3006/3006/3006 3014/3014/3014 3009/3009/3009 -v 13653 24861 -247.8 -vt 0.268911 0.413438 -v 14870 24861 -247.8 -vt 0.258936 0.413438 -v 14870 25026 -247.8 -vt 0.258936 0.411789 -v 13653 25026 -247.8 -vt 0.268911 0.411789 -o mesh594 -s off -f 3015/3015/3015 3016/3016/3016 3017/3017/3017 -f 3015/3015/3015 3017/3017/3017 3018/3018/3018 -g charts -o chart0000 -s off -f 3015/3015/3015 3016/3016/3016 3017/3017/3017 -f 3015/3015/3015 3017/3017/3017 3018/3018/3018 -v 14468.9 24996 2557.2 -vt 0.700332 0.306265 -v 14468.9 24996 1960.95 -vt 0.700332 0.301319 -v 14870 24996 1960.95 -vt 0.697007 0.301319 -v 14468.9 24996 2557.2 -vt 0.258936 0.421719 -v 14870 24996 1960.95 -vt 0.263713 0.424979 -v 14870 24996 1934.7 -vt 0.263923 0.424979 -v 13653 24996 1934.7 -vt 0.263923 0.415087 -v 13653 24996 1960.95 -vt 0.263713 0.415087 -v 14468.9 24996 2557.2 -vt 0.487531 0.997114 -v 13653 24996 1960.95 -vt 0.479219 0.997114 -v 14054.1 24996 1960.95 -vt 0.481882 0.994641 -v 14468.9 24996 2557.2 -vt 0.978803 0.152927 -v 14054.1 24996 1960.95 -vt 0.984622 0.152927 -v 14054.1 24996 2557.2 -vt 0.9807 0.149629 -v 14079.7 24996 2557.2 -vt 0.980583 0.149832 -v 14468.9 24996 2557.2 -vt 0.767664 0.979802 -v 14079.7 24996 2557.2 -vt 0.767664 0.976505 -v 14079.7 24996 1960.95 -vt 0.762677 0.976505 -v 14443.3 24996 1960.95 -vt 0.762677 0.979585 -v 14468.9 24996 2557.2 -vt 0.588944 0.769579 -v 14443.3 24996 1960.95 -vt 0.593932 0.769579 -v 14443.3 24996 2557.2 -vt 0.588953 0.768755 -o mesh595 -s off -f 3019/3019/3019 3020/3020/3020 3021/3021/3021 -f 3022/3022/3022 3023/3023/3023 3024/3024/3024 -f 3022/3022/3022 3024/3024/3024 3025/3025/3025 -f 3022/3022/3022 3025/3025/3025 3026/3026/3026 -f 3027/3027/3027 3028/3028/3028 3029/3029/3029 -f 3030/3030/3030 3031/3031/3031 3032/3032/3032 -f 3030/3030/3030 3032/3032/3032 3033/3033/3033 -f 3034/3034/3034 3035/3035/3035 3036/3036/3036 -f 3034/3034/3034 3036/3036/3036 3037/3037/3037 -f 3038/3038/3038 3039/3039/3039 3040/3040/3040 -g charts -o chart0000 -s off -f 3019/3019/3019 3020/3020/3020 3021/3021/3021 -o chart0001 -s off -f 3022/3022/3022 3023/3023/3023 3024/3024/3024 -f 3022/3022/3022 3024/3024/3024 3025/3025/3025 -f 3022/3022/3022 3025/3025/3025 3026/3026/3026 -o chart0002 -s off -f 3027/3027/3027 3028/3028/3028 3029/3029/3029 -o chart0003 -s off -f 3030/3030/3030 3031/3031/3031 3032/3032/3032 -f 3030/3030/3030 3032/3032/3032 3033/3033/3033 -o chart0004 -s off -f 3034/3034/3034 3035/3035/3035 3036/3036/3036 -f 3034/3034/3034 3036/3036/3036 3037/3037/3037 -o chart0005 -s off -f 3038/3038/3038 3039/3039/3039 3040/3040/3040 -v 14468.9 24996 1960.95 -vt 0.773483 0.551113 -v 14468.9 24996 2557.2 -vt 0.773483 0.546167 -v 14468.9 24951 2557.2 -vt 0.772652 0.546167 -v 14468.9 24951 1960.95 -vt 0.772652 0.551113 -o mesh596 -s off -f 3041/3041/3041 3042/3042/3042 3043/3043/3043 -f 3041/3041/3041 3043/3043/3043 3044/3044/3044 -g charts -o chart0000 -s off -f 3041/3041/3041 3042/3042/3042 3043/3043/3043 -f 3041/3041/3041 3043/3043/3043 3044/3044/3044 -v 14468.9 24996 1960.95 -vt 0.601413 0.995466 -v 14468.9 24951 1960.95 -vt 0.601413 0.99629 -v 14870 24951 1960.95 -vt 0.598088 0.99629 -v 14870 24996 1960.95 -vt 0.598088 0.995466 -o mesh597 -s off -f 3045/3045/3045 3046/3046/3046 3047/3047/3047 -f 3045/3045/3045 3047/3047/3047 3048/3048/3048 -g charts -o chart0000 -s off -f 3045/3045/3045 3046/3046/3046 3047/3047/3047 -f 3045/3045/3045 3047/3047/3047 3048/3048/3048 -v 14870 24996 1934.7 -vt 0.0777224 0.971558 -v 14870 24951 1934.7 -vt 0.0785535 0.971558 -v 14870 24951 1960.95 -vt 0.0785535 0.972382 -v 14870 24996 1960.95 -vt 0.0777224 0.972382 -o mesh598 -s off -f 3049/3049/3049 3050/3050/3050 3051/3051/3051 -f 3049/3049/3049 3051/3051/3051 3052/3052/3052 -g charts -o chart0000 -s off -f 3049/3049/3049 3050/3050/3050 3051/3051/3051 -f 3049/3049/3049 3051/3051/3051 3052/3052/3052 -v 14870 24996 1934.7 -vt 0.851621 0.901484 -v 14870 24951 1934.7 -vt 0.851621 0.90066 -v 13653 24951 1934.7 -vt 0.841646 0.90066 -v 13653 24996 1934.7 -vt 0.841646 0.901484 -o mesh599 -s off -f 3053/3053/3053 3054/3054/3054 3055/3055/3055 -f 3053/3053/3053 3055/3055/3055 3056/3056/3056 -g charts -o chart0000 -s off -f 3053/3053/3053 3054/3054/3054 3055/3055/3055 -f 3053/3053/3053 3055/3055/3055 3056/3056/3056 -v 13653 24996 1960.95 -vt 0.804239 0.3277 -v 13653 24951 1960.95 -vt 0.805071 0.3277 -v 14054.1 24951 1960.95 -vt 0.805071 0.324402 -v 14054.1 24996 1960.95 -vt 0.804239 0.324402 -o mesh600 -s off -f 3057/3057/3057 3058/3058/3058 3059/3059/3059 -f 3057/3057/3057 3059/3059/3059 3060/3060/3060 -g charts -o chart0000 -s off -f 3057/3057/3057 3058/3058/3058 3059/3059/3059 -f 3057/3057/3057 3059/3059/3059 3060/3060/3060 -v 14054.1 24996 1960.95 -vt 0.984622 0.612943 -v 14054.1 24951 1960.95 -vt 0.985453 0.612943 -v 14054.1 24951 2557.2 -vt 0.985453 0.607997 -v 14054.1 24996 2557.2 -vt 0.984622 0.607997 -o mesh601 -s off -f 3061/3061/3061 3062/3062/3062 3063/3063/3063 -f 3061/3061/3061 3063/3063/3063 3064/3064/3064 -g charts -o chart0000 -s off -f 3061/3061/3061 3062/3062/3062 3063/3063/3063 -f 3061/3061/3061 3063/3063/3063 3064/3064/3064 -v 14079.7 24996 2557.2 -vt 0.455943 0.267519 -v 14079.7 24951 2557.2 -vt 0.455943 0.268343 -v 14054.1 24951 2557.2 -vt 0.456775 0.268343 -v 14054.1 24996 2557.2 -vt 0.456775 0.267519 -o mesh602 -s off -f 3065/3065/3065 3066/3066/3066 3067/3067/3067 -f 3065/3065/3065 3067/3067/3067 3068/3068/3068 -g charts -o chart0000 -s off -f 3065/3065/3065 3066/3066/3066 3067/3067/3067 -f 3065/3065/3065 3067/3067/3067 3068/3068/3068 -v 14079.7 24996 2557.2 -vt 0.246467 0.642622 -v 14079.7 24951 2557.2 -vt 0.246467 0.641797 -v 14079.7 24951 1960.95 -vt 0.24148 0.641797 -v 14079.7 24996 1960.95 -vt 0.24148 0.642622 -o mesh603 -s off -f 3069/3069/3069 3070/3070/3070 3071/3071/3071 -f 3069/3069/3069 3071/3071/3071 3072/3072/3072 -g charts -o chart0000 -s off -f 3069/3069/3069 3070/3070/3070 3071/3071/3071 -f 3069/3069/3069 3071/3071/3071 3072/3072/3072 -v 14079.7 24996 1960.95 -vt 0.933084 0.903133 -v 14079.7 24951 1960.95 -vt 0.933084 0.903957 -v 14443.3 24951 1960.95 -vt 0.929759 0.903957 -v 14443.3 24996 1960.95 -vt 0.929759 0.903133 -o mesh604 -s off -f 3073/3073/3073 3074/3074/3074 3075/3075/3075 -f 3073/3073/3073 3075/3075/3075 3076/3076/3076 -g charts -o chart0000 -s off -f 3073/3073/3073 3074/3074/3074 3075/3075/3075 -f 3073/3073/3073 3075/3075/3075 3076/3076/3076 -v 14443.3 24951 1960.95 -vt 0.58645 0.344188 -v 14443.3 24951 2557.2 -vt 0.581463 0.344188 -v 14443.3 24996 2557.2 -vt 0.581463 0.343364 -v 14443.3 24996 1960.95 -vt 0.58645 0.343364 -o mesh605 -s off -f 3077/3077/3077 3078/3078/3078 3079/3079/3079 -f 3077/3077/3077 3079/3079/3079 3080/3080/3080 -g charts -o chart0000 -s off -f 3077/3077/3077 3078/3078/3078 3079/3079/3079 -f 3077/3077/3077 3079/3079/3079 3080/3080/3080 -v 14468.9 24996 2557.2 -vt 0.669576 0.91385 -v 14468.9 24951 2557.2 -vt 0.670407 0.91385 -v 14443.3 24951 2557.2 -vt 0.670407 0.914674 -v 14443.3 24996 2557.2 -vt 0.669576 0.914674 -o mesh606 -s off -f 3081/3081/3081 3082/3082/3082 3083/3083/3083 -f 3081/3081/3081 3083/3083/3083 3084/3084/3084 -g charts -o chart0000 -s off -f 3081/3081/3081 3082/3082/3082 3083/3083/3083 -f 3081/3081/3081 3083/3083/3083 3084/3084/3084 -v 14870 24951 1934.7 -vt 0.94389 0.677246 -v 14870 24951 1960.95 -vt 0.944721 0.677246 -v 14468.9 24951 1960.95 -vt 0.944721 0.673949 -v 14870 24951 1934.7 -vt 0.973815 0.123248 -v 14468.9 24951 1960.95 -vt 0.97049 0.125379 -v 14468.9 24951 2557.2 -vt 0.973815 0.129843 -v 14870 24951 1934.7 -vt 0.44015 0.260099 -v 14468.9 24951 2557.2 -vt 0.436604 0.255153 -v 14443.3 24951 2557.2 -vt 0.436389 0.255159 -v 14443.3 24951 1960.95 -vt 0.436556 0.260001 -v 14079.7 24951 1960.95 -vt 0.4335 0.260099 -v 14870 24951 1934.7 -vt 0.504988 0.618714 -v 14079.7 24951 1960.95 -vt 0.510251 0.614592 -v 14079.7 24951 2557.2 -vt 0.5133 0.618714 -v 14870 24951 1934.7 -vt 0.867415 0.923743 -v 14079.7 24951 2557.2 -vt 0.862427 0.917318 -v 14054.1 24951 2557.2 -vt 0.862427 0.91711 -v 14054.1 24951 1960.95 -vt 0.867204 0.91711 -v 13653 24951 1960.95 -vt 0.867204 0.91385 -v 13653 24951 1934.7 -vt 0.867415 0.91385 -o mesh607 -s off -f 3085/3085/3085 3086/3086/3086 3087/3087/3087 -f 3088/3088/3088 3089/3089/3089 3090/3090/3090 -f 3091/3091/3091 3092/3092/3092 3093/3093/3093 -f 3091/3091/3091 3093/3093/3093 3094/3094/3094 -f 3091/3091/3091 3094/3094/3094 3095/3095/3095 -f 3096/3096/3096 3097/3097/3097 3098/3098/3098 -f 3099/3099/3099 3100/3100/3100 3101/3101/3101 -f 3099/3099/3099 3101/3101/3101 3102/3102/3102 -f 3099/3099/3099 3102/3102/3102 3103/3103/3103 -f 3099/3099/3099 3103/3103/3103 3104/3104/3104 -g charts -o chart0000 -s off -f 3085/3085/3085 3086/3086/3086 3087/3087/3087 -o chart0001 -s off -f 3088/3088/3088 3089/3089/3089 3090/3090/3090 -o chart0002 -s off -f 3091/3091/3091 3092/3092/3092 3093/3093/3093 -f 3091/3091/3091 3093/3093/3093 3094/3094/3094 -f 3091/3091/3091 3094/3094/3094 3095/3095/3095 -o chart0003 -s off -f 3096/3096/3096 3097/3097/3097 3098/3098/3098 -o chart0004 -s off -f 3099/3099/3099 3100/3100/3100 3101/3101/3101 -f 3099/3099/3099 3101/3101/3101 3102/3102/3102 -f 3099/3099/3099 3102/3102/3102 3103/3103/3103 -f 3099/3099/3099 3103/3103/3103 3104/3104/3104 -v 14468.9 24861 2557.2 -vt 0.848296 0.405194 -v 14443.3 24861 2557.2 -vt 0.849127 0.405194 -v 14443.3 24951 2557.2 -vt 0.849127 0.404369 -v 14468.9 24951 2557.2 -vt 0.848296 0.404369 -o mesh608 -s off -f 3105/3105/3105 3106/3106/3106 3107/3107/3107 -f 3105/3105/3105 3107/3107/3107 3108/3108/3108 -g charts -o chart0000 -s off -f 3105/3105/3105 3106/3106/3106 3107/3107/3107 -f 3105/3105/3105 3107/3107/3107 3108/3108/3108 -v 14079.7 24861 2557.2 -vt 0.4734 0.71352 -v 14054.1 24861 2557.2 -vt 0.474231 0.71352 -v 14054.1 24951 2557.2 -vt 0.474231 0.712696 -v 14079.7 24951 2557.2 -vt 0.4734 0.712696 -o mesh609 -s off -f 3109/3109/3109 3110/3110/3110 3111/3111/3111 -f 3109/3109/3109 3111/3111/3111 3112/3112/3112 -g charts -o chart0000 -s off -f 3109/3109/3109 3110/3110/3110 3111/3111/3111 -f 3109/3109/3109 3111/3111/3111 3112/3112/3112 -v 13653 24861 1960.95 -vt 0.845802 0.671476 -v 13653 24861 1934.7 -vt 0.846633 0.671476 -v 13653 24951 1934.7 -vt 0.846633 0.670651 -v 13653 24951 1960.95 -vt 0.845802 0.670651 -o mesh610 -s off -f 3113/3113/3113 3114/3114/3114 3115/3115/3115 -f 3113/3113/3113 3115/3115/3115 3116/3116/3116 -g charts -o chart0000 -s off -f 3113/3113/3113 3114/3114/3114 3115/3115/3115 -f 3113/3113/3113 3115/3115/3115 3116/3116/3116 -v 16286.5 24861 -285.3 -vt 0.258105 0.969085 -v 16250 24861 -247.8 -vt 0.257799 0.968261 -v 14996.5 24861 -285.3 -vt 0.247298 0.969085 -v 15033 24861 -247.8 -vt 0.247605 0.968261 -o mesh611 -s off -f 3117/3117/3117 3118/3118/3118 3119/3119/3119 -f 3120/3120/3120 3119/3119/3119 3118/3118/3118 -g charts -o chart0000 -s off -f 3117/3117/3117 3118/3118/3118 3119/3119/3119 -f 3120/3120/3120 3119/3119/3119 3118/3118/3118 -v 16250 24861 -247.8 -vt 0.974647 0.158174 -v 16286.5 24861 -285.3 -vt 0.975478 0.157873 -v 16286.5 24861 2594.7 -vt 0.975478 0.180956 -o mesh612 -s off -f 3121/3121/3121 3122/3122/3122 3123/3123/3123 -g charts -o chart0000 -s off -f 3121/3121/3121 3122/3122/3122 3123/3123/3123 -v 16250 24861 -247.8 -vt 0.409393 0.600577 -v 16286.5 24861 2594.7 -vt 0.431837 0.600577 -v 16250 24861 2557.2 -vt 0.431537 0.599753 -o mesh613 -s off -f 3124/3124/3124 3125/3125/3125 3126/3126/3126 -g charts -o chart0000 -s off -f 3124/3124/3124 3125/3125/3125 3126/3126/3126 -v 16250 24861 2557.2 -vt 0.687032 0.888665 -v 16286.5 24861 2594.7 -vt 0.687864 0.888294 -v 15848.9 24861 2557.2 -vt 0.687864 0.892415 -o mesh614 -s off -f 3127/3127/3127 3128/3128/3128 3129/3129/3129 -g charts -o chart0000 -s off -f 3127/3127/3127 3128/3128/3128 3129/3129/3129 -v 15848.9 24861 2557.2 -vt 0.0162098 0.369258 -v 16286.5 24861 2594.7 -vt 0.0170406 0.365622 -v 15823.3 24861 2557.2 -vt 0.0162098 0.369471 -v 15459.7 24861 2557.2 -vt 0.0162098 0.372491 -v 15434.1 24861 2557.2 -vt 0.0162095 0.372704 -v 15033 24861 2557.2 -vt 0.0162098 0.376036 -v 14996.5 24861 2594.7 -vt 0.0170406 0.37634 -o mesh615 -s off -f 3130/3130/3130 3131/3131/3131 3132/3132/3132 -f 3132/3132/3132 3131/3131/3131 3133/3133/3133 -f 3133/3133/3133 3131/3131/3131 3134/3134/3134 -f 3134/3134/3134 3131/3131/3131 3135/3135/3135 -f 3136/3136/3136 3135/3135/3135 3131/3131/3131 -g charts -o chart0000 -s off -f 3130/3130/3130 3131/3131/3131 3132/3132/3132 -f 3132/3132/3132 3131/3131/3131 3133/3133/3133 -f 3133/3133/3133 3131/3131/3131 3134/3134/3134 -f 3134/3134/3134 3131/3131/3131 3135/3135/3135 -f 3136/3136/3136 3135/3135/3135 3131/3131/3131 -v 14996.5 24861 -285.3 -vt 0.997091 0.551937 -v 15033 24861 -247.8 -vt 0.996259 0.551637 -v 14996.5 24861 2594.7 -vt 0.997091 0.528854 -o mesh616 -s off -f 3137/3137/3137 3138/3138/3138 3139/3139/3139 -g charts -o chart0000 -s off -f 3137/3137/3137 3138/3138/3138 3139/3139/3139 -v 14996.5 24861 2594.7 -vt 0.411056 0.891591 -v 15033 24861 -247.8 -vt 0.433499 0.891591 -v 15033 24861 1934.7 -vt 0.41627 0.89095 -v 15033 24861 1960.95 -vt 0.416063 0.890942 -v 15033 24861 2557.2 -vt 0.411355 0.890767 -o mesh617 -s off -f 3140/3140/3140 3141/3141/3141 3142/3142/3142 -f 3140/3140/3140 3142/3142/3142 3143/3143/3143 -f 3140/3140/3140 3143/3143/3143 3144/3144/3144 -g charts -o chart0000 -s off -f 3140/3140/3140 3141/3141/3141 3142/3142/3142 -f 3140/3140/3140 3142/3142/3142 3143/3143/3143 -f 3140/3140/3140 3143/3143/3143 3144/3144/3144 -v 14996.5 25026 -285.3 -vt 0.87074 0.275763 -v 15033 25026 -247.8 -vt 0.871571 0.276066 -v 16286.5 25026 -285.3 -vt 0.87074 0.28648 -v 16250 25026 -247.8 -vt 0.871571 0.286176 -o mesh618 -s off -f 3145/3145/3145 3146/3146/3146 3147/3147/3147 -f 3148/3148/3148 3147/3147/3147 3146/3146/3146 -g charts -o chart0000 -s off -f 3145/3145/3145 3146/3146/3146 3147/3147/3147 -f 3148/3148/3148 3147/3147/3147 3146/3146/3146 -v 15033 25026 -247.8 -vt 0.391409 0.303792 -v 14996.5 25026 -285.3 -vt 0.391106 0.304617 -v 14996.5 25026 2594.7 -vt 0.414381 0.304617 -v 15033 25026 1934.7 -vt 0.409047 0.303792 -o mesh619 -s off -f 3149/3149/3149 3150/3150/3150 3151/3151/3151 -f 3149/3149/3149 3151/3151/3151 3152/3152/3152 -g charts -o chart0000 -s off -f 3149/3149/3149 3150/3150/3150 3151/3151/3151 -f 3149/3149/3149 3151/3151/3151 3152/3152/3152 -v 15033 25026 1934.7 -vt 0.661264 0.712696 -v 14996.5 25026 2594.7 -vt 0.667082 0.712696 -v 15033 25026 1960.95 -vt 0.661494 0.712661 -v 15033 25026 2557.2 -vt 0.666735 0.711871 -o mesh620 -s off -f 3153/3153/3153 3154/3154/3154 3155/3155/3155 -f 3155/3155/3155 3154/3154/3154 3156/3156/3156 -g charts -o chart0000 -s off -f 3153/3153/3153 3154/3154/3154 3155/3155/3155 -f 3155/3155/3155 3154/3154/3154 3156/3156/3156 -v 15033 25026 2557.2 -vt 0.826227 0.818219 -v 14996.5 25026 2594.7 -vt 0.825852 0.819044 -v 15434.1 25026 2557.2 -vt 0.830008 0.819043 -o mesh621 -s off -f 3157/3157/3157 3158/3158/3158 3159/3159/3159 -g charts -o chart0000 -s off -f 3157/3157/3157 3158/3158/3158 3159/3159/3159 -v 15434.1 25026 2557.2 -vt 0.934746 0.847235 -v 14996.5 25026 2594.7 -vt 0.935578 0.843776 -v 15459.7 25026 2557.2 -vt 0.934773 0.847437 -v 15823.3 25026 2557.2 -vt 0.935143 0.850304 -v 15848.9 25026 2557.2 -vt 0.935169 0.850506 -v 16250 25026 2557.2 -vt 0.935578 0.853669 -o mesh622 -s off -f 3160/3160/3160 3161/3161/3161 3162/3162/3162 -f 3162/3162/3162 3161/3161/3161 3163/3163/3163 -f 3163/3163/3163 3161/3161/3161 3164/3164/3164 -f 3164/3164/3164 3161/3161/3161 3165/3165/3165 -g charts -o chart0000 -s off -f 3160/3160/3160 3161/3161/3161 3162/3162/3162 -f 3162/3162/3162 3161/3161/3161 3163/3163/3163 -f 3163/3163/3163 3161/3161/3161 3164/3164/3164 -f 3164/3164/3164 3161/3161/3161 3165/3165/3165 -v 16286.5 25026 -285.3 -vt 0.967165 0.765457 -v 16250 25026 -247.8 -vt 0.966862 0.764633 -v 16286.5 25026 2594.7 -vt 0.94389 0.765457 -o mesh623 -s off -f 3166/3166/3166 3167/3167/3167 3168/3168/3168 -g charts -o chart0000 -s off -f 3166/3166/3166 3167/3167/3167 3168/3168/3168 -v 16286.5 25026 2594.7 -vt 0.246467 0.650041 -v 16250 25026 -247.8 -vt 0.246467 0.6723 -v 16250 25026 2557.2 -vt 0.245636 0.650339 -o mesh624 -s off -f 3169/3169/3169 3170/3170/3170 3171/3171/3171 -g charts -o chart0000 -s off -f 3169/3169/3169 3170/3170/3170 3171/3171/3171 -v 16286.5 25026 2594.7 -vt 0.900665 0.636851 -v 16250 25026 2557.2 -vt 0.900359 0.636026 -v 14996.5 25026 2594.7 -vt 0.889859 0.636851 -o mesh625 -s off -f 3172/3172/3172 3173/3173/3173 3174/3174/3174 -g charts -o chart0000 -s off -f 3172/3172/3172 3173/3173/3173 3174/3174/3174 -v 14996.5 24861 2594.7 -vt 0.447631 0.766282 -v 16286.5 24861 2594.7 -vt 0.436825 0.766282 -v 16286.5 25026 2594.7 -vt 0.436825 0.764633 -v 14996.5 25026 2594.7 -vt 0.447631 0.764633 -o mesh626 -s off -f 3175/3175/3175 3176/3176/3176 3177/3177/3177 -f 3175/3175/3175 3177/3177/3177 3178/3178/3178 -g charts -o chart0000 -s off -f 3175/3175/3175 3176/3176/3176 3177/3177/3177 -f 3175/3175/3175 3177/3177/3177 3178/3178/3178 -v 16286.5 24861 2594.7 -vt 0.879884 0.181781 -v 16286.5 24861 -285.3 -vt 0.879884 0.204864 -v 16286.5 24943.5 -285.3 -vt 0.880715 0.204864 -v 16286.5 25026 -285.3 -vt 0.881546 0.204864 -v 16286.5 25026 2594.7 -vt 0.881546 0.181781 -o mesh627 -s off -f 3179/3179/3179 3180/3180/3180 3181/3181/3181 -f 3179/3179/3179 3181/3181/3181 3182/3182/3182 -f 3179/3179/3179 3182/3182/3182 3183/3183/3183 -g charts -o chart0000 -s off -f 3179/3179/3179 3180/3180/3180 3181/3181/3181 -f 3179/3179/3179 3181/3181/3181 3182/3182/3182 -f 3179/3179/3179 3182/3182/3182 3183/3183/3183 -v 16286.5 24861 -285.3 -vt 0.454281 0.163644 -v 14996.5 24861 -285.3 -vt 0.454281 0.174361 -v 14996.5 25026 -285.3 -vt 0.455943 0.174361 -v 16286.5 25026 -285.3 -vt 0.455943 0.163644 -v 16286.5 24943.5 -285.3 -vt 0.455112 0.163644 -o mesh628 -s off -f 3184/3184/3184 3185/3185/3185 3186/3186/3186 -f 3184/3184/3184 3186/3186/3186 3187/3187/3187 -f 3184/3184/3184 3187/3187/3187 3188/3188/3188 -g charts -o chart0000 -s off -f 3184/3184/3184 3185/3185/3185 3186/3186/3186 -f 3184/3184/3184 3186/3186/3186 3187/3187/3187 -f 3184/3184/3184 3187/3187/3187 3188/3188/3188 -v 14996.5 24861 -285.3 -vt 0.97714 0.8108 -v 14996.5 24861 2594.7 -vt 0.97714 0.787716 -v 14996.5 25026 2594.7 -vt 0.975478 0.787716 -v 14996.5 25026 -285.3 -vt 0.975478 0.8108 -o mesh629 -s off -f 3189/3189/3189 3190/3190/3190 3191/3191/3191 -f 3189/3189/3189 3191/3191/3191 3192/3192/3192 -g charts -o chart0000 -s off -f 3189/3189/3189 3190/3190/3190 3191/3191/3191 -f 3189/3189/3189 3191/3191/3191 3192/3192/3192 -v 16250 25026 -247.8 -vt 0.593932 0.908904 -v 16250 24996 1934.7 -vt 0.576469 0.909203 -v 16250 25026 2557.2 -vt 0.571488 0.908904 -v 16250 24861 -247.8 -vt 0.593932 0.910552 -v 16250 24951 1934.7 -vt 0.576469 0.909653 -v 16250 24951 1960.95 -vt 0.576259 0.909653 -v 16250 24861 2557.2 -vt 0.571488 0.910552 -v 16250 24996 1960.95 -vt 0.576259 0.909203 -o mesh630 -s off -f 3193/3193/3193 3194/3194/3194 3195/3195/3195 -f 3194/3194/3194 3193/3193/3193 3196/3196/3196 -f 3194/3194/3194 3196/3196/3196 3197/3197/3197 -f 3197/3197/3197 3196/3196/3196 3198/3198/3198 -f 3198/3198/3198 3196/3196/3196 3199/3199/3199 -f 3195/3195/3195 3200/3200/3200 3199/3199/3199 -f 3200/3200/3200 3195/3195/3195 3194/3194/3194 -f 3199/3199/3199 3200/3200/3200 3198/3198/3198 -g charts -o chart0000 -s off -f 3193/3193/3193 3194/3194/3194 3195/3195/3195 -f 3194/3194/3194 3193/3193/3193 3196/3196/3196 -f 3194/3194/3194 3196/3196/3196 3197/3197/3197 -f 3197/3197/3197 3196/3196/3196 3198/3198/3198 -f 3198/3198/3198 3196/3196/3196 3199/3199/3199 -f 3195/3195/3195 3200/3200/3200 3199/3199/3199 -f 3200/3200/3200 3195/3195/3195 3194/3194/3194 -f 3199/3199/3199 3200/3200/3200 3198/3198/3198 -v 16250 24861 2557.2 -vt 0.723608 0.922094 -v 15848.9 24861 2557.2 -vt 0.726933 0.922094 -v 15848.9 24951 2557.2 -vt 0.726933 0.922993 -v 15848.9 24996 2557.2 -vt 0.726933 0.923443 -v 15848.9 25026 2557.2 -vt 0.726933 0.923743 -v 16250 25026 2557.2 -vt 0.723608 0.923743 -o mesh631 -s off -f 3201/3201/3201 3202/3202/3202 3203/3203/3203 -f 3201/3201/3201 3203/3203/3203 3204/3204/3204 -f 3201/3201/3201 3204/3204/3204 3205/3205/3205 -f 3201/3201/3201 3205/3205/3205 3206/3206/3206 -g charts -o chart0000 -s off -f 3201/3201/3201 3202/3202/3202 3203/3203/3203 -f 3201/3201/3201 3203/3203/3203 3204/3204/3204 -f 3201/3201/3201 3204/3204/3204 3205/3205/3205 -f 3201/3201/3201 3205/3205/3205 3206/3206/3206 -v 15848.9 25026 2557.2 -vt 0.948878 0.732481 -v 15848.9 24996 2557.2 -vt 0.948878 0.733306 -v 15823.3 24996 2557.2 -vt 0.949709 0.733306 -v 15823.3 25026 2557.2 -vt 0.949709 0.732481 -o mesh632 -s off -f 3207/3207/3207 3208/3208/3208 3209/3209/3209 -f 3207/3207/3207 3209/3209/3209 3210/3210/3210 -g charts -o chart0000 -s off -f 3207/3207/3207 3208/3208/3208 3209/3209/3209 -f 3207/3207/3207 3209/3209/3209 3210/3210/3210 -v 15823.3 24861 2557.2 -vt 0.736908 0.900659 -v 15459.7 24861 2557.2 -vt 0.733583 0.900659 -v 15459.7 24951 2557.2 -vt 0.733583 0.89976 -v 15459.7 24996 2557.2 -vt 0.733583 0.899311 -v 15459.7 25026 2557.2 -vt 0.733583 0.899011 -v 15823.3 25026 2557.2 -vt 0.736908 0.899011 -v 15823.3 24996 2557.2 -vt 0.736908 0.899311 -v 15823.3 24951 2557.2 -vt 0.736908 0.89976 -o mesh633 -s off -f 3211/3211/3211 3212/3212/3212 3213/3213/3213 -f 3211/3211/3211 3213/3213/3213 3214/3214/3214 -f 3211/3211/3211 3214/3214/3214 3215/3215/3215 -f 3211/3211/3211 3215/3215/3215 3216/3216/3216 -f 3211/3211/3211 3216/3216/3216 3217/3217/3217 -f 3211/3211/3211 3217/3217/3217 3218/3218/3218 -g charts -o chart0000 -s off -f 3211/3211/3211 3212/3212/3212 3213/3213/3213 -f 3211/3211/3211 3213/3213/3213 3214/3214/3214 -f 3211/3211/3211 3214/3214/3214 3215/3215/3215 -f 3211/3211/3211 3215/3215/3215 3216/3216/3216 -f 3211/3211/3211 3216/3216/3216 3217/3217/3217 -f 3211/3211/3211 3217/3217/3217 3218/3218/3218 -v 15459.7 25026 2557.2 -vt 0.959684 0.576669 -v 15459.7 24996 2557.2 -vt 0.959684 0.577494 -v 15434.1 24996 2557.2 -vt 0.960515 0.577494 -v 15434.1 25026 2557.2 -vt 0.960515 0.576669 -o mesh634 -s off -f 3219/3219/3219 3220/3220/3220 3221/3221/3221 -f 3219/3219/3219 3221/3221/3221 3222/3222/3222 -g charts -o chart0000 -s off -f 3219/3219/3219 3220/3220/3220 3221/3221/3221 -f 3219/3219/3219 3221/3221/3221 3222/3222/3222 -v 15434.1 24861 2557.2 -vt 0.193267 0.795136 -v 15033 24861 2557.2 -vt 0.196592 0.795136 -v 15033 25026 2557.2 -vt 0.196592 0.796785 -v 15434.1 25026 2557.2 -vt 0.193267 0.796785 -v 15434.1 24996 2557.2 -vt 0.193267 0.796485 -v 15434.1 24951 2557.2 -vt 0.193267 0.796035 -o mesh635 -s off -f 3223/3223/3223 3224/3224/3224 3225/3225/3225 -f 3223/3223/3223 3225/3225/3225 3226/3226/3226 -f 3223/3223/3223 3226/3226/3226 3227/3227/3227 -f 3223/3223/3223 3227/3227/3227 3228/3228/3228 -g charts -o chart0000 -s off -f 3223/3223/3223 3224/3224/3224 3225/3225/3225 -f 3223/3223/3223 3225/3225/3225 3226/3226/3226 -f 3223/3223/3223 3226/3226/3226 3227/3227/3227 -f 3223/3223/3223 3227/3227/3227 3228/3228/3228 -v 15033 24861 2557.2 -vt 0.176642 0.931162 -v 15033 24861 1960.95 -vt 0.176642 0.926431 -v 15033 24951 1960.95 -vt 0.175735 0.926431 -v 15033 24996 1960.95 -vt 0.175281 0.926431 -v 15033 25026 1960.95 -vt 0.174979 0.926431 -v 15033 25026 2557.2 -vt 0.174979 0.931162 -v 15033 24996 1934.7 -vt 0.175281 0.926223 -v 15033 25026 1934.7 -vt 0.174979 0.926223 -v 15033 24861 1934.7 -vt 0.176642 0.926223 -v 15033 24861 -247.8 -vt 0.176642 0.908904 -v 15033 25026 -247.8 -vt 0.174979 0.908904 -v 15033 24951 1934.7 -vt 0.175735 0.926223 -o mesh636 -s off -f 3229/3229/3229 3230/3230/3230 3231/3231/3231 -f 3229/3229/3229 3231/3231/3231 3232/3232/3232 -f 3229/3229/3229 3232/3232/3232 3233/3233/3233 -f 3229/3229/3229 3233/3233/3233 3234/3234/3234 -f 3233/3233/3233 3232/3232/3232 3235/3235/3235 -f 3233/3233/3233 3235/3235/3235 3236/3236/3236 -f 3237/3237/3237 3238/3238/3238 3239/3239/3239 -f 3237/3237/3237 3239/3239/3239 3236/3236/3236 -f 3237/3237/3237 3236/3236/3236 3235/3235/3235 -f 3237/3237/3237 3235/3235/3235 3240/3240/3240 -f 3232/3232/3232 3231/3231/3231 3240/3240/3240 -f 3232/3232/3232 3240/3240/3240 3235/3235/3235 -g charts -o chart0000 -s off -f 3229/3229/3229 3230/3230/3230 3231/3231/3231 -f 3229/3229/3229 3231/3231/3231 3232/3232/3232 -f 3229/3229/3229 3232/3232/3232 3233/3233/3233 -f 3229/3229/3229 3233/3233/3233 3234/3234/3234 -f 3233/3233/3233 3232/3232/3232 3235/3235/3235 -f 3233/3233/3233 3235/3235/3235 3236/3236/3236 -f 3237/3237/3237 3238/3238/3238 3239/3239/3239 -f 3237/3237/3237 3239/3239/3239 3236/3236/3236 -f 3237/3237/3237 3236/3236/3236 3235/3235/3235 -f 3237/3237/3237 3235/3235/3235 3240/3240/3240 -f 3232/3232/3232 3231/3231/3231 3240/3240/3240 -f 3232/3232/3232 3240/3240/3240 3235/3235/3235 -v 15033 24861 -247.8 -vt 0.766833 0.877576 -v 16250 24861 -247.8 -vt 0.766833 0.867683 -v 16250 25026 -247.8 -vt 0.76517 0.867683 -v 15033 25026 -247.8 -vt 0.76517 0.877576 -o mesh637 -s off -f 3241/3241/3241 3242/3242/3242 3243/3243/3243 -f 3241/3241/3241 3243/3243/3243 3244/3244/3244 -g charts -o chart0000 -s off -f 3241/3241/3241 3242/3242/3242 3243/3243/3243 -f 3241/3241/3241 3243/3243/3243 3244/3244/3244 -v 15848.9 24996 2557.2 -vt 0.204904 0.657461 -v 15848.9 24996 1960.95 -vt 0.199917 0.657461 -v 16250 24996 1960.95 -vt 0.199917 0.654163 -v 15848.9 24996 2557.2 -vt 0.470906 0.679757 -v 16250 24996 1960.95 -vt 0.475683 0.683017 -v 16250 24996 1934.7 -vt 0.475893 0.683017 -v 15033 24996 1934.7 -vt 0.475893 0.673124 -v 15033 24996 1960.95 -vt 0.475683 0.673124 -v 15848.9 24996 2557.2 -vt 0.766833 0.537098 -v 15033 24996 1960.95 -vt 0.766833 0.528854 -v 15434.1 24996 1960.95 -vt 0.764339 0.531496 -v 15848.9 24996 2557.2 -vt 0.976309 0.51319 -v 15434.1 24996 1960.95 -vt 0.976309 0.518961 -v 15434.1 24996 2557.2 -vt 0.972984 0.515072 -v 15459.7 24996 2557.2 -vt 0.973189 0.514956 -v 15848.9 24996 2557.2 -vt 0.45345 0.342539 -v 15459.7 24996 2557.2 -vt 0.450125 0.342539 -v 15459.7 24996 1960.95 -vt 0.450125 0.337593 -v 15823.3 24996 1960.95 -vt 0.453231 0.337593 -v 15848.9 24996 2557.2 -vt 0.633832 0.437345 -v 15823.3 24996 1960.95 -vt 0.633001 0.432399 -v 15823.3 24996 2557.2 -vt 0.633001 0.437345 -o mesh638 -s off -f 3245/3245/3245 3246/3246/3246 3247/3247/3247 -f 3248/3248/3248 3249/3249/3249 3250/3250/3250 -f 3248/3248/3248 3250/3250/3250 3251/3251/3251 -f 3248/3248/3248 3251/3251/3251 3252/3252/3252 -f 3253/3253/3253 3254/3254/3254 3255/3255/3255 -f 3256/3256/3256 3257/3257/3257 3258/3258/3258 -f 3256/3256/3256 3258/3258/3258 3259/3259/3259 -f 3260/3260/3260 3261/3261/3261 3262/3262/3262 -f 3260/3260/3260 3262/3262/3262 3263/3263/3263 -f 3264/3264/3264 3265/3265/3265 3266/3266/3266 -g charts -o chart0000 -s off -f 3245/3245/3245 3246/3246/3246 3247/3247/3247 -o chart0001 -s off -f 3248/3248/3248 3249/3249/3249 3250/3250/3250 -f 3248/3248/3248 3250/3250/3250 3251/3251/3251 -f 3248/3248/3248 3251/3251/3251 3252/3252/3252 -o chart0002 -s off -f 3253/3253/3253 3254/3254/3254 3255/3255/3255 -o chart0003 -s off -f 3256/3256/3256 3257/3257/3257 3258/3258/3258 -f 3256/3256/3256 3258/3258/3258 3259/3259/3259 -o chart0004 -s off -f 3260/3260/3260 3261/3261/3261 3262/3262/3262 -f 3260/3260/3260 3262/3262/3262 3263/3263/3263 -o chart0005 -s off -f 3264/3264/3264 3265/3265/3265 3266/3266/3266 -v 15848.9 24996 1960.95 -vt 0.894846 0.251855 -v 15848.9 24996 2557.2 -vt 0.894846 0.246908 -v 15848.9 24951 2557.2 -vt 0.894015 0.246908 -v 15848.9 24951 1960.95 -vt 0.894015 0.251855 -o mesh639 -s off -f 3267/3267/3267 3268/3268/3268 3269/3269/3269 -f 3267/3267/3267 3269/3269/3269 3270/3270/3270 -g charts -o chart0000 -s off -f 3267/3267/3267 3268/3268/3268 3269/3269/3269 -f 3267/3267/3267 3269/3269/3269 3270/3270/3270 -v 15848.9 24996 1960.95 -vt 0.403574 0.297197 -v 15848.9 24951 1960.95 -vt 0.403574 0.298021 -v 16250 24951 1960.95 -vt 0.400249 0.298021 -v 16250 24996 1960.95 -vt 0.400249 0.297197 -o mesh640 -s off -f 3271/3271/3271 3272/3272/3272 3273/3273/3273 -f 3271/3271/3271 3273/3273/3273 3274/3274/3274 -g charts -o chart0000 -s off -f 3271/3271/3271 3272/3272/3272 3273/3273/3273 -f 3271/3271/3271 3273/3273/3273 3274/3274/3274 -v 16250 24996 1934.7 -vt 0.00374065 0.204864 -v 16250 24951 1934.7 -vt 0.00457182 0.204864 -v 16250 24951 1960.95 -vt 0.00457182 0.205688 -v 16250 24996 1960.95 -vt 0.00374065 0.205688 -o mesh641 -s off -f 3275/3275/3275 3276/3276/3276 3277/3277/3277 -f 3275/3275/3275 3277/3277/3277 3278/3278/3278 -g charts -o chart0000 -s off -f 3275/3275/3275 3276/3276/3276 3277/3277/3277 -f 3275/3275/3275 3277/3277/3277 3278/3278/3278 -v 16250 24996 1934.7 -vt 0.0644222 0.873454 -v 16250 24951 1934.7 -vt 0.063591 0.873454 -v 15033 24951 1934.7 -vt 0.063591 0.863561 -v 15033 24996 1934.7 -vt 0.0644222 0.863561 -o mesh642 -s off -f 3279/3279/3279 3280/3280/3280 3281/3281/3281 -f 3279/3279/3279 3281/3281/3281 3282/3282/3282 -g charts -o chart0000 -s off -f 3279/3279/3279 3280/3280/3280 3281/3281/3281 -f 3279/3279/3279 3281/3281/3281 3282/3282/3282 -v 15033 24996 1960.95 -vt 0.351205 0.448063 -v 15033 24951 1960.95 -vt 0.351205 0.448887 -v 15434.1 24951 1960.95 -vt 0.34788 0.448887 -v 15434.1 24996 1960.95 -vt 0.34788 0.448063 -o mesh643 -s off -f 3283/3283/3283 3284/3284/3284 3285/3285/3285 -f 3283/3283/3283 3285/3285/3285 3286/3286/3286 -g charts -o chart0000 -s off -f 3283/3283/3283 3284/3284/3284 3285/3285/3285 -f 3283/3283/3283 3285/3285/3285 3286/3286/3286 -v 15434.1 24996 1960.95 -vt 0.564838 0.563479 -v 15434.1 24951 1960.95 -vt 0.564838 0.564303 -v 15434.1 24951 2557.2 -vt 0.55985 0.564303 -v 15434.1 24996 2557.2 -vt 0.55985 0.563479 -o mesh644 -s off -f 3287/3287/3287 3288/3288/3288 3289/3289/3289 -f 3287/3287/3287 3289/3289/3289 3290/3290/3290 -g charts -o chart0000 -s off -f 3287/3287/3287 3288/3288/3288 3289/3289/3289 -f 3287/3287/3287 3289/3289/3289 3290/3290/3290 -v 15459.7 24996 2557.2 -vt 0.200748 0.899011 -v 15459.7 24951 2557.2 -vt 0.200748 0.899835 -v 15434.1 24951 2557.2 -vt 0.201579 0.899835 -v 15434.1 24996 2557.2 -vt 0.201579 0.899011 -o mesh645 -s off -f 3291/3291/3291 3292/3292/3292 3293/3293/3293 -f 3291/3291/3291 3293/3293/3293 3294/3294/3294 -g charts -o chart0000 -s off -f 3291/3291/3291 3292/3292/3292 3293/3293/3293 -f 3291/3291/3291 3293/3293/3293 3294/3294/3294 -v 15459.7 24996 2557.2 -vt 0.346218 0.979802 -v 15459.7 24951 2557.2 -vt 0.346218 0.978978 -v 15459.7 24951 1960.95 -vt 0.34123 0.978978 -v 15459.7 24996 1960.95 -vt 0.34123 0.979802 -o mesh646 -s off -f 3295/3295/3295 3296/3296/3296 3297/3297/3297 -f 3295/3295/3295 3297/3297/3297 3298/3298/3298 -g charts -o chart0000 -s off -f 3295/3295/3295 3296/3296/3296 3297/3297/3297 -f 3295/3295/3295 3297/3297/3297 3298/3298/3298 -v 15459.7 24996 1960.95 -vt 0.174979 0.985573 -v 15459.7 24951 1960.95 -vt 0.17581 0.985573 -v 15823.3 24951 1960.95 -vt 0.17581 0.982275 -v 15823.3 24996 1960.95 -vt 0.174979 0.982275 -o mesh647 -s off -f 3299/3299/3299 3300/3300/3300 3301/3301/3301 -f 3299/3299/3299 3301/3301/3301 3302/3302/3302 -g charts -o chart0000 -s off -f 3299/3299/3299 3300/3300/3300 3301/3301/3301 -f 3299/3299/3299 3301/3301/3301 3302/3302/3302 -v 15823.3 24951 1960.95 -vt 0.0685785 0.876752 -v 15823.3 24951 2557.2 -vt 0.0685785 0.871805 -v 15823.3 24996 2557.2 -vt 0.0677473 0.871805 -v 15823.3 24996 1960.95 -vt 0.0677473 0.876752 -o mesh648 -s off -f 3303/3303/3303 3304/3304/3304 3305/3305/3305 -f 3303/3303/3303 3305/3305/3305 3306/3306/3306 -g charts -o chart0000 -s off -f 3303/3303/3303 3304/3304/3304 3305/3305/3305 -f 3303/3303/3303 3305/3305/3305 3306/3306/3306 -v 15848.9 24996 2557.2 -vt 0.76517 0.855317 -v 15848.9 24951 2557.2 -vt 0.766002 0.855317 -v 15823.3 24951 2557.2 -vt 0.766002 0.856142 -v 15823.3 24996 2557.2 -vt 0.76517 0.856142 -o mesh649 -s off -f 3307/3307/3307 3308/3308/3308 3309/3309/3309 -f 3307/3307/3307 3309/3309/3309 3310/3310/3310 -g charts -o chart0000 -s off -f 3307/3307/3307 3308/3308/3308 3309/3309/3309 -f 3307/3307/3307 3309/3309/3309 3310/3310/3310 -v 16250 24951 1934.7 -vt 0.177473 0.986397 -v 16250 24951 1960.95 -vt 0.178304 0.986397 -v 15848.9 24951 1960.95 -vt 0.178304 0.9831 -v 16250 24951 1934.7 -vt 0.976309 0.655812 -v 15848.9 24951 1960.95 -vt 0.972984 0.657943 -v 15848.9 24951 2557.2 -vt 0.976309 0.662407 -v 16250 24951 1934.7 -vt 0.4601 0.894064 -v 15848.9 24951 2557.2 -vt 0.456555 0.889118 -v 15823.3 24951 2557.2 -vt 0.45634 0.889125 -v 15823.3 24951 1960.95 -vt 0.456506 0.893966 -v 15459.7 24951 1960.95 -vt 0.45345 0.894064 -v 16250 24951 1934.7 -vt 0.564007 0.899011 -v 15459.7 24951 1960.95 -vt 0.56927 0.894889 -v 15459.7 24951 2557.2 -vt 0.572319 0.899011 -v 16250 24951 1934.7 -vt 0.806733 0.535449 -v 15459.7 24951 2557.2 -vt 0.801746 0.529025 -v 15434.1 24951 2557.2 -vt 0.801746 0.528817 -v 15434.1 24951 1960.95 -vt 0.806523 0.528817 -v 15033 24951 1960.95 -vt 0.806523 0.525556 -v 15033 24951 1934.7 -vt 0.806733 0.525556 -o mesh650 -s off -f 3311/3311/3311 3312/3312/3312 3313/3313/3313 -f 3314/3314/3314 3315/3315/3315 3316/3316/3316 -f 3317/3317/3317 3318/3318/3318 3319/3319/3319 -f 3317/3317/3317 3319/3319/3319 3320/3320/3320 -f 3317/3317/3317 3320/3320/3320 3321/3321/3321 -f 3322/3322/3322 3323/3323/3323 3324/3324/3324 -f 3325/3325/3325 3326/3326/3326 3327/3327/3327 -f 3325/3325/3325 3327/3327/3327 3328/3328/3328 -f 3325/3325/3325 3328/3328/3328 3329/3329/3329 -f 3325/3325/3325 3329/3329/3329 3330/3330/3330 -g charts -o chart0000 -s off -f 3311/3311/3311 3312/3312/3312 3313/3313/3313 -o chart0001 -s off -f 3314/3314/3314 3315/3315/3315 3316/3316/3316 -o chart0002 -s off -f 3317/3317/3317 3318/3318/3318 3319/3319/3319 -f 3317/3317/3317 3319/3319/3319 3320/3320/3320 -f 3317/3317/3317 3320/3320/3320 3321/3321/3321 -o chart0003 -s off -f 3322/3322/3322 3323/3323/3323 3324/3324/3324 -o chart0004 -s off -f 3325/3325/3325 3326/3326/3326 3327/3327/3327 -f 3325/3325/3325 3327/3327/3327 3328/3328/3328 -f 3325/3325/3325 3328/3328/3328 3329/3329/3329 -f 3325/3325/3325 3329/3329/3329 3330/3330/3330 -v 15848.9 24861 2557.2 -vt 0.677889 0.390354 -v 15823.3 24861 2557.2 -vt 0.677889 0.391179 -v 15823.3 24951 2557.2 -vt 0.677057 0.391179 -v 15848.9 24951 2557.2 -vt 0.677057 0.390354 -o mesh651 -s off -f 3331/3331/3331 3332/3332/3332 3333/3333/3333 -f 3331/3331/3331 3333/3333/3333 3334/3334/3334 -g charts -o chart0000 -s off -f 3331/3331/3331 3332/3332/3332 3333/3333/3333 -f 3331/3331/3331 3333/3333/3333 3334/3334/3334 -v 15459.7 24861 2557.2 -vt 0.721114 0.596455 -v 15434.1 24861 2557.2 -vt 0.721114 0.597279 -v 15434.1 24951 2557.2 -vt 0.720283 0.597279 -v 15459.7 24951 2557.2 -vt 0.720283 0.596455 -o mesh652 -s off -f 3335/3335/3335 3336/3336/3336 3337/3337/3337 -f 3335/3335/3335 3337/3337/3337 3338/3338/3338 -g charts -o chart0000 -s off -f 3335/3335/3335 3336/3336/3336 3337/3337/3337 -f 3335/3335/3335 3337/3337/3337 3338/3338/3338 -v 15033 24861 1960.95 -vt 0.642976 0.328524 -v 15033 24861 1934.7 -vt 0.643807 0.328524 -v 15033 24951 1934.7 -vt 0.643807 0.3277 -v 15033 24951 1960.95 -vt 0.642976 0.3277 -o mesh653 -s off -f 3339/3339/3339 3340/3340/3340 3341/3341/3341 -f 3339/3339/3339 3341/3341/3341 3342/3342/3342 -g charts -o chart0000 -s off -f 3339/3339/3339 3340/3340/3340 3341/3341/3341 -f 3339/3339/3339 3341/3341/3341 3342/3342/3342 -v 16286.5 23706 -285.3 -vt 0.54655 0.997939 -v 16286.5 23738.7 -247.8 -vt 0.546809 0.998763 -v 16286.5 24861 -285.3 -vt 0.555694 0.997939 -v 16286.5 24828.3 -247.8 -vt 0.555435 0.998763 -o mesh654 -s off -f 3343/3343/3343 3344/3344/3344 3345/3345/3345 -f 3346/3346/3346 3345/3345/3345 3344/3344/3344 -g charts -o chart0000 -s off -f 3343/3343/3343 3344/3344/3344 3345/3345/3345 -f 3346/3346/3346 3345/3345/3345 3344/3344/3344 -v 16286.5 23738.7 -247.8 -vt 0.968828 0.906731 -v 16286.5 23706 -285.3 -vt 0.969659 0.90643 -v 16286.5 23706 2594.7 -vt 0.969659 0.929514 -o mesh655 -s off -f 3347/3347/3347 3348/3348/3348 3349/3349/3349 -g charts -o chart0000 -s off -f 3347/3347/3347 3348/3348/3348 3349/3349/3349 -v 16286.5 23738.7 -247.8 -vt 0.471737 0.326051 -v 16286.5 23706 2594.7 -vt 0.494181 0.326051 -v 16286.5 23738.7 2557.2 -vt 0.493882 0.325227 -o mesh656 -s off -f 3350/3350/3350 3351/3351/3351 3352/3352/3352 -g charts -o chart0000 -s off -f 3350/3350/3350 3351/3351/3351 3352/3352/3352 -v 16286.5 23738.7 2557.2 -vt 0.376448 0.296373 -v 16286.5 23706 2594.7 -vt 0.376143 0.297197 -v 16286.5 24097.8 2557.2 -vt 0.379468 0.297197 -o mesh657 -s off -f 3353/3353/3353 3354/3354/3354 3355/3355/3355 -g charts -o chart0000 -s off -f 3353/3353/3353 3354/3354/3354 3355/3355/3355 -v 16286.5 24097.8 2557.2 -vt 0.392768 0.725187 -v 16286.5 23706 2594.7 -vt 0.393599 0.728359 -v 16286.5 24120.7 2557.2 -vt 0.392794 0.725002 -v 16286.5 24446.3 2557.2 -vt 0.393164 0.722374 -v 16286.5 24469.2 2557.2 -vt 0.393191 0.722189 -v 16286.5 24828.3 2557.2 -vt 0.393599 0.719291 -o mesh658 -s off -f 3356/3356/3356 3357/3357/3357 3358/3358/3358 -f 3358/3358/3358 3357/3357/3357 3359/3359/3359 -f 3359/3359/3359 3357/3357/3357 3360/3360/3360 -f 3360/3360/3360 3357/3357/3357 3361/3361/3361 -g charts -o chart0000 -s off -f 3356/3356/3356 3357/3357/3357 3358/3358/3358 -f 3358/3358/3358 3357/3357/3357 3359/3359/3359 -f 3359/3359/3359 3357/3357/3357 3360/3360/3360 -f 3360/3360/3360 3357/3357/3357 3361/3361/3361 -v 16286.5 24861 -285.3 -vt 0.628844 0.801731 -v 16286.5 24828.3 -247.8 -vt 0.628013 0.801431 -v 16286.5 24861 2594.7 -vt 0.628844 0.778648 -o mesh659 -s off -f 3362/3362/3362 3363/3363/3363 3364/3364/3364 -g charts -o chart0000 -s off -f 3362/3362/3362 3363/3363/3363 3364/3364/3364 -v 16286.5 24861 2594.7 -vt 0.560682 0.894064 -v 16286.5 24828.3 -247.8 -vt 0.583125 0.894064 -v 16286.5 24828.3 1934.7 -vt 0.565895 0.89325 -v 16286.5 24828.3 1960.95 -vt 0.565688 0.89324 -o mesh660 -s off -f 3365/3365/3365 3366/3366/3366 3367/3367/3367 -f 3365/3365/3365 3367/3367/3367 3368/3368/3368 -g charts -o chart0000 -s off -f 3365/3365/3365 3366/3366/3366 3367/3367/3367 -f 3365/3365/3365 3367/3367/3367 3368/3368/3368 -v 16286.5 24861 2594.7 -vt 0.414381 0.93446 -v 16286.5 24828.3 1960.95 -vt 0.420199 0.93446 -v 16286.5 24828.3 2557.2 -vt 0.41474 0.933636 -o mesh661 -s off -f 3369/3369/3369 3370/3370/3370 3371/3371/3371 -g charts -o chart0000 -s off -f 3369/3369/3369 3370/3370/3370 3371/3371/3371 -v 16286.5 24861 2594.7 -vt 0.391106 0.847898 -v 16286.5 24828.3 2557.2 -vt 0.390847 0.847073 -v 16286.5 23706 2594.7 -vt 0.381962 0.847898 -o mesh662 -s off -f 3372/3372/3372 3373/3373/3373 3374/3374/3374 -g charts -o chart0000 -s off -f 3372/3372/3372 3373/3373/3373 3374/3374/3374 -v 16451.5 24861 -285.3 -vt 0.37448 0.665705 -v 16451.5 24828.3 -247.8 -vt 0.373649 0.665448 -v 16451.5 23706 -285.3 -vt 0.37448 0.656636 -v 16451.5 23738.7 -247.8 -vt 0.373649 0.656893 -o mesh663 -s off -f 3375/3375/3375 3376/3376/3376 3377/3377/3377 -f 3378/3378/3378 3377/3377/3377 3376/3376/3376 -g charts -o chart0000 -s off -f 3375/3375/3375 3376/3376/3376 3377/3377/3377 -f 3378/3378/3378 3377/3377/3377 3376/3376/3376 -v 16451.5 24828.3 -247.8 -vt 0.89734 0.349435 -v 16451.5 24861 -285.3 -vt 0.898171 0.349134 -v 16451.5 24861 2594.7 -vt 0.898171 0.372218 -v 16451.5 24828.3 1934.7 -vt 0.89734 0.366928 -o mesh664 -s off -f 3379/3379/3379 3380/3380/3380 3381/3381/3381 -f 3379/3379/3379 3381/3381/3381 3382/3382/3382 -g charts -o chart0000 -s off -f 3379/3379/3379 3380/3380/3380 3381/3381/3381 -f 3379/3379/3379 3381/3381/3381 3382/3382/3382 -v 16451.5 24828.3 1934.7 -vt 0.0627597 0.18343 -v 16451.5 24861 2594.7 -vt 0.0627597 0.1892 -v 16451.5 24828.3 1960.95 -vt 0.0627246 0.183658 -v 16451.5 24828.3 2557.2 -vt 0.0619285 0.188859 -o mesh665 -s off -f 3383/3383/3383 3384/3384/3384 3385/3385/3385 -f 3385/3385/3385 3384/3384/3384 3386/3386/3386 -g charts -o chart0000 -s off -f 3383/3383/3383 3384/3384/3384 3385/3385/3385 -f 3385/3385/3385 3384/3384/3384 3386/3386/3386 -v 16451.5 24828.3 2557.2 -vt 0.166141 0.920445 -v 16451.5 24861 2594.7 -vt 0.165835 0.921269 -v 16451.5 24469.2 2557.2 -vt 0.16916 0.921269 -o mesh666 -s off -f 3387/3387/3387 3388/3388/3388 3389/3389/3389 -g charts -o chart0000 -s off -f 3387/3387/3387 3388/3388/3388 3389/3389/3389 -v 16451.5 24469.2 2557.2 -vt 0.630507 0.435572 -v 16451.5 24861 2594.7 -vt 0.631338 0.432399 -v 16451.5 24446.3 2557.2 -vt 0.630533 0.435756 -v 16451.5 24120.7 2557.2 -vt 0.630904 0.438384 -v 16451.5 24097.8 2557.2 -vt 0.63093 0.438569 -v 16451.5 23738.7 2557.2 -vt 0.631338 0.441467 -o mesh667 -s off -f 3390/3390/3390 3391/3391/3391 3392/3392/3392 -f 3392/3392/3392 3391/3391/3391 3393/3393/3393 -f 3393/3393/3393 3391/3391/3391 3394/3394/3394 -f 3394/3394/3394 3391/3391/3391 3395/3395/3395 -g charts -o chart0000 -s off -f 3390/3390/3390 3391/3391/3391 3392/3392/3392 -f 3392/3392/3392 3391/3391/3391 3393/3393/3393 -f 3393/3393/3393 3391/3391/3391 3394/3394/3394 -f 3394/3394/3394 3391/3391/3391 3395/3395/3395 -v 16451.5 23706 -285.3 -vt 0.377805 0.613767 -v 16451.5 23738.7 -247.8 -vt 0.377502 0.612943 -v 16451.5 23706 2594.7 -vt 0.35453 0.613767 -o mesh668 -s off -f 3396/3396/3396 3397/3397/3397 3398/3398/3398 -g charts -o chart0000 -s off -f 3396/3396/3396 3397/3397/3397 3398/3398/3398 -v 16451.5 23706 2594.7 -vt 0.159185 0.489283 -v 16451.5 23738.7 -247.8 -vt 0.181629 0.489283 -v 16451.5 23738.7 2557.2 -vt 0.159484 0.488458 -o mesh669 -s off -f 3399/3399/3399 3400/3400/3400 3401/3401/3401 -g charts -o chart0000 -s off -f 3399/3399/3399 3400/3400/3400 3401/3401/3401 -v 16451.5 23706 2594.7 -vt 0.637157 0.940231 -v 16451.5 23738.7 2557.2 -vt 0.636898 0.939406 -v 16451.5 24861 2594.7 -vt 0.628013 0.940231 -o mesh670 -s off -f 3402/3402/3402 3403/3403/3403 3404/3404/3404 -g charts -o chart0000 -s off -f 3402/3402/3402 3403/3403/3403 3404/3404/3404 -v 16286.5 24861 2594.7 -vt 0.598919 0.845425 -v 16286.5 23706 2594.7 -vt 0.608063 0.845425 -v 16451.5 23706 2594.7 -vt 0.608063 0.847073 -v 16451.5 24861 2594.7 -vt 0.598919 0.847073 -o mesh671 -s off -f 3405/3405/3405 3406/3406/3406 3407/3407/3407 -f 3405/3405/3405 3407/3407/3407 3408/3408/3408 -g charts -o chart0000 -s off -f 3405/3405/3405 3406/3406/3406 3407/3407/3407 -f 3405/3405/3405 3407/3407/3407 3408/3408/3408 -v 16286.5 23706 2594.7 -vt 0.672901 0.711871 -v 16286.5 23706 -285.3 -vt 0.696176 0.711871 -v 16369 23706 -285.3 -vt 0.696176 0.712696 -v 16451.5 23706 -285.3 -vt 0.696176 0.71352 -v 16451.5 23706 2594.7 -vt 0.672901 0.71352 -o mesh672 -s off -f 3409/3409/3409 3410/3410/3410 3411/3411/3411 -f 3409/3409/3409 3411/3411/3411 3412/3412/3412 -f 3409/3409/3409 3412/3412/3412 3413/3413/3413 -g charts -o chart0000 -s off -f 3409/3409/3409 3410/3410/3410 3411/3411/3411 -f 3409/3409/3409 3411/3411/3411 3412/3412/3412 -f 3409/3409/3409 3412/3412/3412 3413/3413/3413 -v 16286.5 23706 -285.3 -vt 0.456775 0.41014 -v 16286.5 24861 -285.3 -vt 0.456775 0.401072 -v 16451.5 24861 -285.3 -vt 0.455112 0.401072 -v 16451.5 23706 -285.3 -vt 0.455112 0.41014 -v 16369 23706 -285.3 -vt 0.455943 0.41014 -o mesh673 -s off -f 3414/3414/3414 3415/3415/3415 3416/3416/3416 -f 3414/3414/3414 3416/3416/3416 3417/3417/3417 -f 3414/3414/3414 3417/3417/3417 3418/3418/3418 -g charts -o chart0000 -s off -f 3414/3414/3414 3415/3415/3415 3416/3416/3416 -f 3414/3414/3414 3416/3416/3416 3417/3417/3417 -f 3414/3414/3414 3417/3417/3417 3418/3418/3418 -v 16286.5 24861 -285.3 -vt 0.0087281 0.607997 -v 16286.5 24861 2594.7 -vt 0.0087281 0.584913 -v 16451.5 24861 2594.7 -vt 0.00706567 0.584913 -v 16451.5 24861 -285.3 -vt 0.00706567 0.607997 -o mesh674 -s off -f 3419/3419/3419 3420/3420/3420 3421/3421/3421 -f 3419/3419/3419 3421/3421/3421 3422/3422/3422 -g charts -o chart0000 -s off -f 3419/3419/3419 3420/3420/3420 3421/3421/3421 -f 3419/3419/3419 3421/3421/3421 3422/3422/3422 -v 16451.5 23738.7 -247.8 -vt 0.0760598 0.180956 -v 16421.5 23738.7 1934.7 -vt 0.0585968 0.181256 -v 16451.5 23738.7 2557.2 -vt 0.053616 0.180956 -v 16286.5 23738.7 -247.8 -vt 0.0760598 0.182605 -v 16376.5 23738.7 1934.7 -vt 0.0585968 0.181706 -v 16376.5 23738.7 1960.95 -vt 0.0583868 0.181706 -v 16286.5 23738.7 2557.2 -vt 0.053616 0.182605 -v 16421.5 23738.7 1960.95 -vt 0.0583868 0.181256 -o mesh675 -s off -f 3423/3423/3423 3424/3424/3424 3425/3425/3425 -f 3424/3424/3424 3423/3423/3423 3426/3426/3426 -f 3424/3424/3424 3426/3426/3426 3427/3427/3427 -f 3427/3427/3427 3426/3426/3426 3428/3428/3428 -f 3428/3428/3428 3426/3426/3426 3429/3429/3429 -f 3425/3425/3425 3430/3430/3430 3429/3429/3429 -f 3430/3430/3430 3425/3425/3425 3424/3424/3424 -f 3429/3429/3429 3430/3430/3430 3428/3428/3428 -g charts -o chart0000 -s off -f 3423/3423/3423 3424/3424/3424 3425/3425/3425 -f 3424/3424/3424 3423/3423/3423 3426/3426/3426 -f 3424/3424/3424 3426/3426/3426 3427/3427/3427 -f 3427/3427/3427 3426/3426/3426 3428/3428/3428 -f 3428/3428/3428 3426/3426/3426 3429/3429/3429 -f 3425/3425/3425 3430/3430/3430 3429/3429/3429 -f 3430/3430/3430 3425/3425/3425 3424/3424/3424 -f 3429/3429/3429 3430/3430/3430 3428/3428/3428 -v 16286.5 23738.7 2557.2 -vt 0.780964 0.179307 -v 16286.5 24097.8 2557.2 -vt 0.780964 0.17601 -v 16376.5 24097.8 2557.2 -vt 0.780057 0.17601 -v 16421.5 24097.8 2557.2 -vt 0.779604 0.17601 -v 16451.5 24097.8 2557.2 -vt 0.779302 0.17601 -v 16451.5 23738.7 2557.2 -vt 0.779302 0.179307 -o mesh676 -s off -f 3431/3431/3431 3432/3432/3432 3433/3433/3433 -f 3431/3431/3431 3433/3433/3433 3434/3434/3434 -f 3431/3431/3431 3434/3434/3434 3435/3435/3435 -f 3431/3431/3431 3435/3435/3435 3436/3436/3436 -g charts -o chart0000 -s off -f 3431/3431/3431 3432/3432/3432 3433/3433/3433 -f 3431/3431/3431 3433/3433/3433 3434/3434/3434 -f 3431/3431/3431 3434/3434/3434 3435/3435/3435 -f 3431/3431/3431 3435/3435/3435 3436/3436/3436 -v 16451.5 24097.8 2557.2 -vt 0.244805 0.586562 -v 16421.5 24097.8 2557.2 -vt 0.245636 0.586562 -v 16421.5 24120.7 2557.2 -vt 0.245636 0.587387 -v 16451.5 24120.7 2557.2 -vt 0.244805 0.587387 -o mesh677 -s off -f 3437/3437/3437 3438/3438/3438 3439/3439/3439 -f 3437/3437/3437 3439/3439/3439 3440/3440/3440 -g charts -o chart0000 -s off -f 3437/3437/3437 3438/3438/3438 3439/3439/3439 -f 3437/3437/3437 3439/3439/3439 3440/3440/3440 -v 16286.5 24120.7 2557.2 -vt 0.00207805 0.781121 -v 16286.5 24446.3 2557.2 -vt 0.00207805 0.777824 -v 16376.5 24446.3 2557.2 -vt 0.00117128 0.777824 -v 16421.5 24446.3 2557.2 -vt 0.000717887 0.777824 -v 16451.5 24446.3 2557.2 -vt 0.000415628 0.777824 -v 16451.5 24120.7 2557.2 -vt 0.000415628 0.781121 -v 16421.5 24120.7 2557.2 -vt 0.000717887 0.781121 -v 16376.5 24120.7 2557.2 -vt 0.00117128 0.781121 -o mesh678 -s off -f 3441/3441/3441 3442/3442/3442 3443/3443/3443 -f 3441/3441/3441 3443/3443/3443 3444/3444/3444 -f 3441/3441/3441 3444/3444/3444 3445/3445/3445 -f 3441/3441/3441 3445/3445/3445 3446/3446/3446 -f 3441/3441/3441 3446/3446/3446 3447/3447/3447 -f 3441/3441/3441 3447/3447/3447 3448/3448/3448 -g charts -o chart0000 -s off -f 3441/3441/3441 3442/3442/3442 3443/3443/3443 -f 3441/3441/3441 3443/3443/3443 3444/3444/3444 -f 3441/3441/3441 3444/3444/3444 3445/3445/3445 -f 3441/3441/3441 3445/3445/3445 3446/3446/3446 -f 3441/3441/3441 3446/3446/3446 3447/3447/3447 -f 3441/3441/3441 3447/3447/3447 3448/3448/3448 -v 16451.5 24446.3 2557.2 -vt 0.651288 0.976505 -v 16421.5 24446.3 2557.2 -vt 0.651288 0.977329 -v 16421.5 24469.2 2557.2 -vt 0.65212 0.977329 -v 16451.5 24469.2 2557.2 -vt 0.65212 0.976505 -o mesh679 -s off -f 3449/3449/3449 3450/3450/3450 3451/3451/3451 -f 3449/3449/3449 3451/3451/3451 3452/3452/3452 -g charts -o chart0000 -s off -f 3449/3449/3449 3450/3450/3450 3451/3451/3451 -f 3449/3449/3449 3451/3451/3451 3452/3452/3452 -v 16286.5 24469.2 2557.2 -vt 0.994597 0.514015 -v 16286.5 24828.3 2557.2 -vt 0.994597 0.510717 -v 16451.5 24828.3 2557.2 -vt 0.992934 0.510717 -v 16451.5 24469.2 2557.2 -vt 0.992934 0.514015 -v 16421.5 24469.2 2557.2 -vt 0.993237 0.514015 -v 16376.5 24469.2 2557.2 -vt 0.99369 0.514015 -o mesh680 -s off -f 3453/3453/3453 3454/3454/3454 3455/3455/3455 -f 3453/3453/3453 3455/3455/3455 3456/3456/3456 -f 3453/3453/3453 3456/3456/3456 3457/3457/3457 -f 3453/3453/3453 3457/3457/3457 3458/3458/3458 -g charts -o chart0000 -s off -f 3453/3453/3453 3454/3454/3454 3455/3455/3455 -f 3453/3453/3453 3455/3455/3455 3456/3456/3456 -f 3453/3453/3453 3456/3456/3456 3457/3457/3457 -f 3453/3453/3453 3457/3457/3457 3458/3458/3458 -v 16286.5 24828.3 2557.2 -vt 0.0561096 0.175185 -v 16286.5 24828.3 1960.95 -vt 0.0561096 0.170454 -v 16376.5 24828.3 1960.95 -vt 0.0552029 0.170454 -v 16421.5 24828.3 1960.95 -vt 0.0547495 0.170454 -v 16451.5 24828.3 1960.95 -vt 0.0544472 0.170454 -v 16451.5 24828.3 2557.2 -vt 0.0544472 0.175185 -v 16421.5 24828.3 1934.7 -vt 0.0547495 0.170246 -v 16451.5 24828.3 1934.7 -vt 0.0544472 0.170246 -v 16286.5 24828.3 1934.7 -vt 0.0561096 0.170246 -v 16286.5 24828.3 -247.8 -vt 0.0561096 0.152927 -v 16451.5 24828.3 -247.8 -vt 0.0544472 0.152927 -v 16376.5 24828.3 1934.7 -vt 0.0552029 0.170246 -o mesh681 -s off -f 3459/3459/3459 3460/3460/3460 3461/3461/3461 -f 3459/3459/3459 3461/3461/3461 3462/3462/3462 -f 3459/3459/3459 3462/3462/3462 3463/3463/3463 -f 3459/3459/3459 3463/3463/3463 3464/3464/3464 -f 3463/3463/3463 3462/3462/3462 3465/3465/3465 -f 3463/3463/3463 3465/3465/3465 3466/3466/3466 -f 3467/3467/3467 3468/3468/3468 3469/3469/3469 -f 3467/3467/3467 3469/3469/3469 3466/3466/3466 -f 3467/3467/3467 3466/3466/3466 3465/3465/3465 -f 3467/3467/3467 3465/3465/3465 3470/3470/3470 -f 3462/3462/3462 3461/3461/3461 3470/3470/3470 -f 3462/3462/3462 3470/3470/3470 3465/3465/3465 -g charts -o chart0000 -s off -f 3459/3459/3459 3460/3460/3460 3461/3461/3461 -f 3459/3459/3459 3461/3461/3461 3462/3462/3462 -f 3459/3459/3459 3462/3462/3462 3463/3463/3463 -f 3459/3459/3459 3463/3463/3463 3464/3464/3464 -f 3463/3463/3463 3462/3462/3462 3465/3465/3465 -f 3463/3463/3463 3465/3465/3465 3466/3466/3466 -f 3467/3467/3467 3468/3468/3468 3469/3469/3469 -f 3467/3467/3467 3469/3469/3469 3466/3466/3466 -f 3467/3467/3467 3466/3466/3466 3465/3465/3465 -f 3467/3467/3467 3465/3465/3465 3470/3470/3470 -f 3462/3462/3462 3461/3461/3461 3470/3470/3470 -f 3462/3462/3462 3470/3470/3470 3465/3465/3465 -v 16286.5 24828.3 -247.8 -vt 0.89734 0.529678 -v 16286.5 23738.7 -247.8 -vt 0.89734 0.538747 -v 16451.5 23738.7 -247.8 -vt 0.899002 0.538747 -v 16451.5 24828.3 -247.8 -vt 0.899002 0.529678 -o mesh682 -s off -f 3471/3471/3471 3472/3472/3472 3473/3473/3473 -f 3471/3471/3471 3473/3473/3473 3474/3474/3474 -g charts -o chart0000 -s off -f 3471/3471/3471 3472/3472/3472 3473/3473/3473 -f 3471/3471/3471 3473/3473/3473 3474/3474/3474 -v 16421.5 24097.8 2557.2 -vt 0.0677472 0.190849 -v 16421.5 24097.8 1960.95 -vt 0.0652535 0.195084 -v 16421.5 23738.7 1960.95 -vt 0.0677472 0.19662 -v 16421.5 24097.8 2557.2 -vt 0.711139 0.647052 -v 16421.5 23738.7 1960.95 -vt 0.715916 0.650041 -v 16421.5 23738.7 1934.7 -vt 0.716126 0.650041 -v 16421.5 24828.3 1934.7 -vt 0.716126 0.640973 -v 16421.5 24828.3 1960.95 -vt 0.715916 0.640973 -v 16421.5 24097.8 2557.2 -vt 0.379468 0.387057 -v 16421.5 24828.3 1960.95 -vt 0.379468 0.379637 -v 16421.5 24469.2 1960.95 -vt 0.376974 0.381826 -v 16421.5 24097.8 2557.2 -vt 0.443475 0.530503 -v 16421.5 24469.2 1960.95 -vt 0.438487 0.5338 -v 16421.5 24469.2 2557.2 -vt 0.443475 0.5338 -v 16421.5 24446.3 2557.2 -vt 0.443475 0.533597 -v 16421.5 24097.8 2557.2 -vt 0.69202 0.830585 -v 16421.5 24446.3 2557.2 -vt 0.695345 0.830585 -v 16421.5 24446.3 1960.95 -vt 0.695345 0.835532 -v 16421.5 24120.7 1960.95 -vt 0.692238 0.835532 -v 16421.5 24097.8 2557.2 -vt 0.662095 0.657461 -v 16421.5 24120.7 1960.95 -vt 0.662095 0.662407 -v 16421.5 24120.7 2557.2 -vt 0.661264 0.657468 -o mesh683 -s off -f 3475/3475/3475 3476/3476/3476 3477/3477/3477 -f 3478/3478/3478 3479/3479/3479 3480/3480/3480 -f 3478/3478/3478 3480/3480/3480 3481/3481/3481 -f 3478/3478/3478 3481/3481/3481 3482/3482/3482 -f 3483/3483/3483 3484/3484/3484 3485/3485/3485 -f 3486/3486/3486 3487/3487/3487 3488/3488/3488 -f 3486/3486/3486 3488/3488/3488 3489/3489/3489 -f 3490/3490/3490 3491/3491/3491 3492/3492/3492 -f 3490/3490/3490 3492/3492/3492 3493/3493/3493 -f 3494/3494/3494 3495/3495/3495 3496/3496/3496 -g charts -o chart0000 -s off -f 3475/3475/3475 3476/3476/3476 3477/3477/3477 -o chart0001 -s off -f 3478/3478/3478 3479/3479/3479 3480/3480/3480 -f 3478/3478/3478 3480/3480/3480 3481/3481/3481 -f 3478/3478/3478 3481/3481/3481 3482/3482/3482 -o chart0002 -s off -f 3483/3483/3483 3484/3484/3484 3485/3485/3485 -o chart0003 -s off -f 3486/3486/3486 3487/3487/3487 3488/3488/3488 -f 3486/3486/3486 3488/3488/3488 3489/3489/3489 -o chart0004 -s off -f 3490/3490/3490 3491/3491/3491 3492/3492/3492 -f 3490/3490/3490 3492/3492/3492 3493/3493/3493 -o chart0005 -s off -f 3494/3494/3494 3495/3495/3495 3496/3496/3496 -v 16421.5 24097.8 1960.95 -vt 0.066916 0.909728 -v 16421.5 24097.8 2557.2 -vt 0.066916 0.904782 -v 16376.5 24097.8 2557.2 -vt 0.0660848 0.904782 -v 16376.5 24097.8 1960.95 -vt 0.0660848 0.909728 -o mesh684 -s off -f 3497/3497/3497 3498/3498/3498 3499/3499/3499 -f 3497/3497/3497 3499/3499/3499 3500/3500/3500 -g charts -o chart0000 -s off -f 3497/3497/3497 3498/3498/3498 3499/3499/3499 -f 3497/3497/3497 3499/3499/3499 3500/3500/3500 -v 16421.5 24097.8 1960.95 -vt 0.184123 0.798434 -v 16376.5 24097.8 1960.95 -vt 0.183292 0.798434 -v 16376.5 23738.7 1960.95 -vt 0.183292 0.795136 -v 16421.5 23738.7 1960.95 -vt 0.184123 0.795136 -o mesh685 -s off -f 3501/3501/3501 3502/3502/3502 3503/3503/3503 -f 3501/3501/3501 3503/3503/3503 3504/3504/3504 -g charts -o chart0000 -s off -f 3501/3501/3501 3502/3502/3502 3503/3503/3503 -f 3501/3501/3501 3503/3503/3503 3504/3504/3504 -v 16421.5 23738.7 1934.7 -vt 0.24813 0.673124 -v 16376.5 23738.7 1934.7 -vt 0.248961 0.673124 -v 16376.5 23738.7 1960.95 -vt 0.248961 0.673949 -v 16421.5 23738.7 1960.95 -vt 0.24813 0.673949 -o mesh686 -s off -f 3505/3505/3505 3506/3506/3506 3507/3507/3507 -f 3505/3505/3505 3507/3507/3507 3508/3508/3508 -g charts -o chart0000 -s off -f 3505/3505/3505 3506/3506/3506 3507/3507/3507 -f 3505/3505/3505 3507/3507/3507 3508/3508/3508 -v 16421.5 23738.7 1934.7 -vt 0.716958 0.998763 -v 16376.5 23738.7 1934.7 -vt 0.717789 0.998763 -v 16376.5 24828.3 1934.7 -vt 0.717789 0.989695 -v 16421.5 24828.3 1934.7 -vt 0.716958 0.989695 -o mesh687 -s off -f 3509/3509/3509 3510/3510/3510 3511/3511/3511 -f 3509/3509/3509 3511/3511/3511 3512/3512/3512 -g charts -o chart0000 -s off -f 3509/3509/3509 3510/3510/3510 3511/3511/3511 -f 3509/3509/3509 3511/3511/3511 3512/3512/3512 -v 16421.5 24828.3 1960.95 -vt 0.634663 0.643446 -v 16376.5 24828.3 1960.95 -vt 0.634663 0.642622 -v 16376.5 24469.2 1960.95 -vt 0.631338 0.642622 -v 16421.5 24469.2 1960.95 -vt 0.631338 0.643446 -o mesh688 -s off -f 3513/3513/3513 3514/3514/3514 3515/3515/3515 -f 3513/3513/3513 3515/3515/3515 3516/3516/3516 -g charts -o chart0000 -s off -f 3513/3513/3513 3514/3514/3514 3515/3515/3515 -f 3513/3513/3513 3515/3515/3515 3516/3516/3516 -v 16421.5 24469.2 1960.95 -vt 0.0536159 0.917972 -v 16376.5 24469.2 1960.95 -vt 0.0536159 0.918796 -v 16376.5 24469.2 2557.2 -vt 0.0486284 0.918796 -v 16421.5 24469.2 2557.2 -vt 0.0486284 0.917972 -o mesh689 -s off -f 3517/3517/3517 3518/3518/3518 3519/3519/3519 -f 3517/3517/3517 3519/3519/3519 3520/3520/3520 -g charts -o chart0000 -s off -f 3517/3517/3517 3518/3518/3518 3519/3519/3519 -f 3517/3517/3517 3519/3519/3519 3520/3520/3520 -v 16421.5 24446.3 2557.2 -vt 0.676226 0.6723 -v 16376.5 24446.3 2557.2 -vt 0.677057 0.6723 -v 16376.5 24469.2 2557.2 -vt 0.677057 0.673124 -v 16421.5 24469.2 2557.2 -vt 0.676226 0.673124 -o mesh690 -s off -f 3521/3521/3521 3522/3522/3522 3523/3523/3523 -f 3521/3521/3521 3523/3523/3523 3524/3524/3524 -g charts -o chart0000 -s off -f 3521/3521/3521 3522/3522/3522 3523/3523/3523 -f 3521/3521/3521 3523/3523/3523 3524/3524/3524 -v 16421.5 24446.3 2557.2 -vt 0.775145 0.572547 -v 16376.5 24446.3 2557.2 -vt 0.774314 0.572547 -v 16376.5 24446.3 1960.95 -vt 0.774314 0.567601 -v 16421.5 24446.3 1960.95 -vt 0.775145 0.567601 -o mesh691 -s off -f 3525/3525/3525 3526/3526/3526 3527/3527/3527 -f 3525/3525/3525 3527/3527/3527 3528/3528/3528 -g charts -o chart0000 -s off -f 3525/3525/3525 3526/3526/3526 3527/3527/3527 -f 3525/3525/3525 3527/3527/3527 3528/3528/3528 -v 16421.5 24446.3 1960.95 -vt 0.995428 0.296373 -v 16376.5 24446.3 1960.95 -vt 0.994597 0.296373 -v 16376.5 24120.7 1960.95 -vt 0.994597 0.293075 -v 16421.5 24120.7 1960.95 -vt 0.995428 0.293075 -o mesh692 -s off -f 3529/3529/3529 3530/3530/3530 3531/3531/3531 -f 3529/3529/3529 3531/3531/3531 3532/3532/3532 -g charts -o chart0000 -s off -f 3529/3529/3529 3530/3530/3530 3531/3531/3531 -f 3529/3529/3529 3531/3531/3531 3532/3532/3532 -v 16376.5 24120.7 1960.95 -vt 0.0752285 0.645095 -v 16376.5 24120.7 2557.2 -vt 0.0702411 0.645095 -v 16421.5 24120.7 2557.2 -vt 0.0702411 0.64427 -v 16421.5 24120.7 1960.95 -vt 0.0752285 0.64427 -o mesh693 -s off -f 3533/3533/3533 3534/3534/3534 3535/3535/3535 -f 3533/3533/3533 3535/3535/3535 3536/3536/3536 -g charts -o chart0000 -s off -f 3533/3533/3533 3534/3534/3534 3535/3535/3535 -f 3533/3533/3533 3535/3535/3535 3536/3536/3536 -v 16421.5 24097.8 2557.2 -vt 0.644638 0.600577 -v 16376.5 24097.8 2557.2 -vt 0.64547 0.600577 -v 16376.5 24120.7 2557.2 -vt 0.64547 0.601401 -v 16421.5 24120.7 2557.2 -vt 0.644638 0.601401 -o mesh694 -s off -f 3537/3537/3537 3538/3538/3538 3539/3539/3539 -f 3537/3537/3537 3539/3539/3539 3540/3540/3540 -g charts -o chart0000 -s off -f 3537/3537/3537 3538/3538/3538 3539/3539/3539 -f 3537/3537/3537 3539/3539/3539 3540/3540/3540 -v 16376.5 23738.7 1934.7 -vt 0.130091 0.832234 -v 16376.5 23738.7 1960.95 -vt 0.130074 0.83141 -v 16376.5 24097.8 1960.95 -vt 0.126766 0.832234 -v 16376.5 23738.7 1934.7 -vt 0.293849 0.982275 -v 16376.5 24097.8 1960.95 -vt 0.291355 0.983899 -v 16376.5 24097.8 2557.2 -vt 0.293849 0.988046 -v 16376.5 23738.7 1934.7 -vt 0.369493 0.66488 -v 16376.5 24097.8 2557.2 -vt 0.364505 0.661768 -v 16376.5 24120.7 2557.2 -vt 0.364512 0.661581 -v 16376.5 24120.7 1960.95 -vt 0.369394 0.661761 -v 16376.5 24446.3 1960.95 -vt 0.369493 0.65911 -v 16376.5 23738.7 1934.7 -vt 0.0203658 0.241138 -v 16376.5 24446.3 1960.95 -vt 0.0247205 0.237016 -v 16376.5 24446.3 2557.2 -vt 0.027847 0.241138 -v 16376.5 23738.7 1934.7 -vt 0.63882 0.663232 -v 16376.5 24446.3 2557.2 -vt 0.643807 0.669121 -v 16376.5 24469.2 2557.2 -vt 0.643807 0.669311 -v 16376.5 24469.2 1960.95 -vt 0.63903 0.669311 -v 16376.5 24828.3 1960.95 -vt 0.63903 0.6723 -v 16376.5 24828.3 1934.7 -vt 0.63882 0.6723 -o mesh695 -s off -f 3541/3541/3541 3542/3542/3542 3543/3543/3543 -f 3544/3544/3544 3545/3545/3545 3546/3546/3546 -f 3547/3547/3547 3548/3548/3548 3549/3549/3549 -f 3547/3547/3547 3549/3549/3549 3550/3550/3550 -f 3547/3547/3547 3550/3550/3550 3551/3551/3551 -f 3552/3552/3552 3553/3553/3553 3554/3554/3554 -f 3555/3555/3555 3556/3556/3556 3557/3557/3557 -f 3555/3555/3555 3557/3557/3557 3558/3558/3558 -f 3555/3555/3555 3558/3558/3558 3559/3559/3559 -f 3555/3555/3555 3559/3559/3559 3560/3560/3560 -g charts -o chart0000 -s off -f 3541/3541/3541 3542/3542/3542 3543/3543/3543 -o chart0001 -s off -f 3544/3544/3544 3545/3545/3545 3546/3546/3546 -o chart0002 -s off -f 3547/3547/3547 3548/3548/3548 3549/3549/3549 -f 3547/3547/3547 3549/3549/3549 3550/3550/3550 -f 3547/3547/3547 3550/3550/3550 3551/3551/3551 -o chart0003 -s off -f 3552/3552/3552 3553/3553/3553 3554/3554/3554 -o chart0004 -s off -f 3555/3555/3555 3556/3556/3556 3557/3557/3557 -f 3555/3555/3555 3557/3557/3557 3558/3558/3558 -f 3555/3555/3555 3558/3558/3558 3559/3559/3559 -f 3555/3555/3555 3559/3559/3559 3560/3560/3560 -v 16286.5 24097.8 2557.2 -vt 0.226517 0.746496 -v 16286.5 24120.7 2557.2 -vt 0.227348 0.746496 -v 16376.5 24120.7 2557.2 -vt 0.227348 0.745672 -v 16376.5 24097.8 2557.2 -vt 0.226517 0.745672 -o mesh696 -s off -f 3561/3561/3561 3562/3562/3562 3563/3563/3563 -f 3561/3561/3561 3563/3563/3563 3564/3564/3564 -g charts -o chart0000 -s off -f 3561/3561/3561 3562/3562/3562 3563/3563/3563 -f 3561/3561/3561 3563/3563/3563 3564/3564/3564 -v 16286.5 24446.3 2557.2 -vt 0.00207814 0.17601 -v 16286.5 24469.2 2557.2 -vt 0.00290931 0.17601 -v 16376.5 24469.2 2557.2 -vt 0.00290931 0.175185 -v 16376.5 24446.3 2557.2 -vt 0.00207814 0.175185 -o mesh697 -s off -f 3565/3565/3565 3566/3566/3566 3567/3567/3567 -f 3565/3565/3565 3567/3567/3567 3568/3568/3568 -g charts -o chart0000 -s off -f 3565/3565/3565 3566/3566/3566 3567/3567/3567 -f 3565/3565/3565 3567/3567/3567 3568/3568/3568 -v 16286.5 24828.3 1960.95 -vt 0.219867 0.448887 -v 16286.5 24828.3 1934.7 -vt 0.219867 0.449711 -v 16376.5 24828.3 1934.7 -vt 0.219036 0.449711 -v 16376.5 24828.3 1960.95 -vt 0.219036 0.448887 -o mesh698 -s off -f 3569/3569/3569 3570/3570/3570 3571/3571/3571 -f 3569/3569/3569 3571/3571/3571 3572/3572/3572 -g charts -o chart0000 -s off -f 3569/3569/3569 3570/3570/3570 3571/3571/3571 -f 3569/3569/3569 3571/3571/3571 3572/3572/3572 -v 16286.5 22461 -285.3 -vt 0.683707 0.886645 -v 16286.5 22493.7 -247.8 -vt 0.683966 0.887469 -v 16286.5 23616 -285.3 -vt 0.692851 0.886645 -v 16286.5 23583.3 -247.8 -vt 0.692592 0.887469 -o mesh699 -s off -f 3573/3573/3573 3574/3574/3574 3575/3575/3575 -f 3576/3576/3576 3575/3575/3575 3574/3574/3574 -g charts -o chart0000 -s off -f 3573/3573/3573 3574/3574/3574 3575/3575/3575 -f 3576/3576/3576 3575/3575/3575 3574/3574/3574 -v 16286.5 22493.7 -247.8 -vt 0.063591 0.875404 -v 16286.5 22461 -285.3 -vt 0.0644222 0.875103 -v 16286.5 22461 2594.7 -vt 0.0644222 0.898186 -o mesh700 -s off -f 3577/3577/3577 3578/3578/3578 3579/3579/3579 -g charts -o chart0000 -s off -f 3577/3577/3577 3578/3578/3578 3579/3579/3579 -v 16286.5 22493.7 -247.8 -vt 0.609726 0.501649 -v 16286.5 22461 2594.7 -vt 0.609726 0.523908 -v 16286.5 22493.7 2557.2 -vt 0.608894 0.523611 -o mesh701 -s off -f 3580/3580/3580 3581/3581/3581 3582/3582/3582 -g charts -o chart0000 -s off -f 3580/3580/3580 3581/3581/3581 3582/3582/3582 -v 16286.5 22493.7 2557.2 -vt 0.670713 0.796785 -v 16286.5 22461 2594.7 -vt 0.670407 0.797609 -v 16286.5 22852.8 2557.2 -vt 0.673732 0.797609 -o mesh702 -s off -f 3583/3583/3583 3584/3584/3584 3585/3585/3585 -g charts -o chart0000 -s off -f 3583/3583/3583 3584/3584/3584 3585/3585/3585 -v 16286.5 22852.8 2557.2 -vt 0.416874 0.538872 -v 16286.5 22461 2594.7 -vt 0.417706 0.542044 -v 16286.5 22875.7 2557.2 -vt 0.416901 0.538687 -v 16286.5 23201.3 2557.2 -vt 0.417271 0.536059 -v 16286.5 23224.2 2557.2 -vt 0.417297 0.535875 -v 16286.5 23583.3 2557.2 -vt 0.417706 0.532976 -o mesh703 -s off -f 3586/3586/3586 3587/3587/3587 3588/3588/3588 -f 3588/3588/3588 3587/3587/3587 3589/3589/3589 -f 3589/3589/3589 3587/3587/3587 3590/3590/3590 -f 3590/3590/3590 3587/3587/3587 3591/3591/3591 -g charts -o chart0000 -s off -f 3586/3586/3586 3587/3587/3587 3588/3588/3588 -f 3588/3588/3588 3587/3587/3587 3589/3589/3589 -f 3589/3589/3589 3587/3587/3587 3590/3590/3590 -f 3590/3590/3590 3587/3587/3587 3591/3591/3591 -v 16286.5 23616 -285.3 -vt 0.63882 0.967436 -v 16286.5 23583.3 -247.8 -vt 0.637988 0.967135 -v 16286.5 23616 2594.7 -vt 0.63882 0.944353 -o mesh704 -s off -f 3592/3592/3592 3593/3593/3593 3594/3594/3594 -g charts -o chart0000 -s off -f 3592/3592/3592 3593/3593/3593 3594/3594/3594 -v 16286.5 23616 2594.7 -vt 0.730258 0.95507 -v 16286.5 23583.3 -247.8 -vt 0.730258 0.977329 -v 16286.5 23583.3 1934.7 -vt 0.729436 0.960241 -v 16286.5 23583.3 1960.95 -vt 0.729426 0.960035 -o mesh705 -s off -f 3595/3595/3595 3596/3596/3596 3597/3597/3597 -f 3595/3595/3595 3597/3597/3597 3598/3598/3598 -g charts -o chart0000 -s off -f 3595/3595/3595 3596/3596/3596 3597/3597/3597 -f 3595/3595/3595 3597/3597/3597 3598/3598/3598 -v 16286.5 23616 2594.7 -vt 0.229842 0.839654 -v 16286.5 23583.3 1960.95 -vt 0.235661 0.839654 -v 16286.5 23583.3 2557.2 -vt 0.230201 0.838829 -o mesh706 -s off -f 3599/3599/3599 3600/3600/3600 3601/3601/3601 -g charts -o chart0000 -s off -f 3599/3599/3599 3600/3600/3600 3601/3601/3601 -v 16286.5 23616 2594.7 -vt 0.38778 0.839654 -v 16286.5 23583.3 2557.2 -vt 0.387521 0.838829 -v 16286.5 22461 2594.7 -vt 0.378637 0.839654 -o mesh707 -s off -f 3602/3602/3602 3603/3603/3603 3604/3604/3604 -g charts -o chart0000 -s off -f 3602/3602/3602 3603/3603/3603 3604/3604/3604 -v 16451.5 23616 -285.3 -vt 0.809227 0.657461 -v 16451.5 23583.3 -247.8 -vt 0.808396 0.657204 -v 16451.5 22461 -285.3 -vt 0.809227 0.648392 -v 16451.5 22493.7 -247.8 -vt 0.808396 0.648649 -o mesh708 -s off -f 3605/3605/3605 3606/3606/3606 3607/3607/3607 -f 3608/3608/3608 3607/3607/3607 3606/3606/3606 -g charts -o chart0000 -s off -f 3605/3605/3605 3606/3606/3606 3607/3607/3607 -f 3608/3608/3608 3607/3607/3607 3606/3606/3606 -v 16451.5 23583.3 -247.8 -vt 0.714464 0.909204 -v 16451.5 23616 -285.3 -vt 0.715295 0.908904 -v 16451.5 23616 2594.7 -vt 0.715295 0.931987 -v 16451.5 23583.3 1934.7 -vt 0.714464 0.926697 -o mesh709 -s off -f 3609/3609/3609 3610/3610/3610 3611/3611/3611 -f 3609/3609/3609 3611/3611/3611 3612/3612/3612 -g charts -o chart0000 -s off -f 3609/3609/3609 3610/3610/3610 3611/3611/3611 -f 3609/3609/3609 3611/3611/3611 3612/3612/3612 -v 16451.5 23583.3 1934.7 -vt 0.748545 0.586562 -v 16451.5 23616 2594.7 -vt 0.748545 0.592333 -v 16451.5 23583.3 1960.95 -vt 0.74851 0.586791 -v 16451.5 23583.3 2557.2 -vt 0.747714 0.591992 -o mesh710 -s off -f 3613/3613/3613 3614/3614/3614 3615/3615/3615 -f 3615/3615/3615 3614/3614/3614 3616/3616/3616 -g charts -o chart0000 -s off -f 3613/3613/3613 3614/3614/3614 3615/3615/3615 -f 3615/3615/3615 3614/3614/3614 3616/3616/3616 -v 16451.5 23583.3 2557.2 -vt 0.504462 0.456307 -v 16451.5 23616 2594.7 -vt 0.504156 0.457131 -v 16451.5 23224.2 2557.2 -vt 0.507481 0.457131 -o mesh711 -s off -f 3617/3617/3617 3618/3618/3618 3619/3619/3619 -g charts -o chart0000 -s off -f 3617/3617/3617 3618/3618/3618 3619/3619/3619 -v 16451.5 23224.2 2557.2 -vt 0.415086 0.612119 -v 16451.5 23616 2594.7 -vt 0.411887 0.612943 -v 16451.5 23201.3 2557.2 -vt 0.415272 0.612145 -v 16451.5 22875.7 2557.2 -vt 0.417922 0.612512 -v 16451.5 22852.8 2557.2 -vt 0.418108 0.612538 -v 16451.5 22493.7 2557.2 -vt 0.421031 0.612943 -o mesh712 -s off -f 3620/3620/3620 3621/3621/3621 3622/3622/3622 -f 3622/3622/3622 3621/3621/3621 3623/3623/3623 -f 3623/3623/3623 3621/3621/3621 3624/3624/3624 -f 3624/3624/3624 3621/3621/3621 3625/3625/3625 -g charts -o chart0000 -s off -f 3620/3620/3620 3621/3621/3621 3622/3622/3622 -f 3622/3622/3622 3621/3621/3621 3623/3623/3623 -f 3623/3623/3623 3621/3621/3621 3624/3624/3624 -f 3624/3624/3624 3621/3621/3621 3625/3625/3625 -v 16451.5 22461 -285.3 -vt 0.901496 0.438994 -v 16451.5 22493.7 -247.8 -vt 0.900665 0.438694 -v 16451.5 22461 2594.7 -vt 0.901496 0.415911 -o mesh713 -s off -f 3626/3626/3626 3627/3627/3627 3628/3628/3628 -g charts -o chart0000 -s off -f 3626/3626/3626 3627/3627/3627 3628/3628/3628 -v 16451.5 22461 2594.7 -vt 0.940565 0.997114 -v 16451.5 22493.7 -247.8 -vt 0.963009 0.997114 -v 16451.5 22493.7 2557.2 -vt 0.940864 0.99629 -o mesh714 -s off -f 3629/3629/3629 3630/3630/3630 3631/3631/3631 -g charts -o chart0000 -s off -f 3629/3629/3629 3630/3630/3630 3631/3631/3631 -v 16451.5 22461 2594.7 -vt 0.500831 0.332646 -v 16451.5 22493.7 2557.2 -vt 0.5 0.332389 -v 16451.5 23616 2594.7 -vt 0.500831 0.323578 -o mesh715 -s off -f 3632/3632/3632 3633/3633/3633 3634/3634/3634 -g charts -o chart0000 -s off -f 3632/3632/3632 3633/3633/3633 3634/3634/3634 -v 16286.5 23616 2594.7 -vt 0.0610973 0.977329 -v 16286.5 22461 2594.7 -vt 0.0610973 0.986397 -v 16451.5 22461 2594.7 -vt 0.0627597 0.986397 -v 16451.5 23616 2594.7 -vt 0.0627597 0.977329 -o mesh716 -s off -f 3635/3635/3635 3636/3636/3636 3637/3637/3637 -f 3635/3635/3635 3637/3637/3637 3638/3638/3638 -g charts -o chart0000 -s off -f 3635/3635/3635 3636/3636/3636 3637/3637/3637 -f 3635/3635/3635 3637/3637/3637 3638/3638/3638 -v 16286.5 22461 2594.7 -vt 0.63882 0.77535 -v 16286.5 22461 -285.3 -vt 0.63882 0.798434 -v 16369 22461 -285.3 -vt 0.639651 0.798434 -v 16451.5 22461 -285.3 -vt 0.640482 0.798434 -v 16451.5 22461 2594.7 -vt 0.640482 0.77535 -o mesh717 -s off -f 3639/3639/3639 3640/3640/3640 3641/3641/3641 -f 3639/3639/3639 3641/3641/3641 3642/3642/3642 -f 3639/3639/3639 3642/3642/3642 3643/3643/3643 -g charts -o chart0000 -s off -f 3639/3639/3639 3640/3640/3640 3641/3641/3641 -f 3639/3639/3639 3641/3641/3641 3642/3642/3642 -f 3639/3639/3639 3642/3642/3642 3643/3643/3643 -v 16286.5 22461 -285.3 -vt 0.948046 0.711871 -v 16286.5 23616 -285.3 -vt 0.948046 0.702803 -v 16451.5 23616 -285.3 -vt 0.946384 0.702803 -v 16451.5 22461 -285.3 -vt 0.946384 0.711871 -v 16369 22461 -285.3 -vt 0.947215 0.711871 -o mesh718 -s off -f 3644/3644/3644 3645/3645/3645 3646/3646/3646 -f 3644/3644/3644 3646/3646/3646 3647/3647/3647 -f 3644/3644/3644 3647/3647/3647 3648/3648/3648 -g charts -o chart0000 -s off -f 3644/3644/3644 3645/3645/3645 3646/3646/3646 -f 3644/3644/3644 3646/3646/3646 3647/3647/3647 -f 3644/3644/3644 3647/3647/3647 3648/3648/3648 -v 16286.5 23616 -285.3 -vt 0.87739 0.835532 -v 16286.5 23616 2594.7 -vt 0.87739 0.812449 -v 16451.5 23616 2594.7 -vt 0.875727 0.812449 -v 16451.5 23616 -285.3 -vt 0.875727 0.835532 -o mesh719 -s off -f 3649/3649/3649 3650/3650/3650 3651/3651/3651 -f 3649/3649/3649 3651/3651/3651 3652/3652/3652 -g charts -o chart0000 -s off -f 3649/3649/3649 3650/3650/3650 3651/3651/3651 -f 3649/3649/3649 3651/3651/3651 3652/3652/3652 -v 16451.5 22493.7 -247.8 -vt 0.407731 0.887469 -v 16421.5 22493.7 1934.7 -vt 0.390268 0.887769 -v 16451.5 22493.7 2557.2 -vt 0.385287 0.887469 -v 16286.5 22493.7 -247.8 -vt 0.407731 0.889118 -v 16376.5 22493.7 1934.7 -vt 0.390268 0.888219 -v 16376.5 22493.7 1960.95 -vt 0.390058 0.888219 -v 16286.5 22493.7 2557.2 -vt 0.385287 0.889118 -v 16421.5 22493.7 1960.95 -vt 0.390058 0.887769 -o mesh720 -s off -f 3653/3653/3653 3654/3654/3654 3655/3655/3655 -f 3654/3654/3654 3653/3653/3653 3656/3656/3656 -f 3654/3654/3654 3656/3656/3656 3657/3657/3657 -f 3657/3657/3657 3656/3656/3656 3658/3658/3658 -f 3658/3658/3658 3656/3656/3656 3659/3659/3659 -f 3655/3655/3655 3660/3660/3660 3659/3659/3659 -f 3660/3660/3660 3655/3655/3655 3654/3654/3654 -f 3659/3659/3659 3660/3660/3660 3658/3658/3658 -g charts -o chart0000 -s off -f 3653/3653/3653 3654/3654/3654 3655/3655/3655 -f 3654/3654/3654 3653/3653/3653 3656/3656/3656 -f 3654/3654/3654 3656/3656/3656 3657/3657/3657 -f 3657/3657/3657 3656/3656/3656 3658/3658/3658 -f 3658/3658/3658 3656/3656/3656 3659/3659/3659 -f 3655/3655/3655 3660/3660/3660 3659/3659/3659 -f 3660/3660/3660 3655/3655/3655 3654/3654/3654 -f 3659/3659/3659 3660/3660/3660 3658/3658/3658 -v 16286.5 22493.7 2557.2 -vt 0.974647 0.992168 -v 16286.5 22852.8 2557.2 -vt 0.971322 0.992168 -v 16376.5 22852.8 2557.2 -vt 0.971322 0.991269 -v 16421.5 22852.8 2557.2 -vt 0.971322 0.990819 -v 16451.5 22852.8 2557.2 -vt 0.971322 0.990519 -v 16451.5 22493.7 2557.2 -vt 0.974647 0.990519 -o mesh721 -s off -f 3661/3661/3661 3662/3662/3662 3663/3663/3663 -f 3661/3661/3661 3663/3663/3663 3664/3664/3664 -f 3661/3661/3661 3664/3664/3664 3665/3665/3665 -f 3661/3661/3661 3665/3665/3665 3666/3666/3666 -g charts -o chart0000 -s off -f 3661/3661/3661 3662/3662/3662 3663/3663/3663 -f 3661/3661/3661 3663/3663/3663 3664/3664/3664 -f 3661/3661/3661 3664/3664/3664 3665/3665/3665 -f 3661/3661/3661 3665/3665/3665 3666/3666/3666 -v 16451.5 22852.8 2557.2 -vt 0.781796 0.683017 -v 16421.5 22852.8 2557.2 -vt 0.781796 0.683842 -v 16421.5 22875.7 2557.2 -vt 0.782627 0.683842 -v 16451.5 22875.7 2557.2 -vt 0.782627 0.683017 -o mesh722 -s off -f 3667/3667/3667 3668/3668/3668 3669/3669/3669 -f 3667/3667/3667 3669/3669/3669 3670/3670/3670 -g charts -o chart0000 -s off -f 3667/3667/3667 3668/3668/3668 3669/3669/3669 -f 3667/3667/3667 3669/3669/3669 3670/3670/3670 -v 16286.5 22875.7 2557.2 -vt 0.721114 0.67972 -v 16286.5 23201.3 2557.2 -vt 0.717789 0.67972 -v 16376.5 23201.3 2557.2 -vt 0.717789 0.67882 -v 16421.5 23201.3 2557.2 -vt 0.717789 0.678371 -v 16451.5 23201.3 2557.2 -vt 0.717789 0.678071 -v 16451.5 22875.7 2557.2 -vt 0.721114 0.678071 -v 16421.5 22875.7 2557.2 -vt 0.721114 0.678371 -v 16376.5 22875.7 2557.2 -vt 0.721114 0.67882 -o mesh723 -s off -f 3671/3671/3671 3672/3672/3672 3673/3673/3673 -f 3671/3671/3671 3673/3673/3673 3674/3674/3674 -f 3671/3671/3671 3674/3674/3674 3675/3675/3675 -f 3671/3671/3671 3675/3675/3675 3676/3676/3676 -f 3671/3671/3671 3676/3676/3676 3677/3677/3677 -f 3671/3671/3671 3677/3677/3677 3678/3678/3678 -g charts -o chart0000 -s off -f 3671/3671/3671 3672/3672/3672 3673/3673/3673 -f 3671/3671/3671 3673/3673/3673 3674/3674/3674 -f 3671/3671/3671 3674/3674/3674 3675/3675/3675 -f 3671/3671/3671 3675/3675/3675 3676/3676/3676 -f 3671/3671/3671 3676/3676/3676 3677/3677/3677 -f 3671/3671/3671 3677/3677/3677 3678/3678/3678 -v 16451.5 23201.3 2557.2 -vt 0.192436 0.926216 -v 16421.5 23201.3 2557.2 -vt 0.193267 0.926216 -v 16421.5 23224.2 2557.2 -vt 0.193267 0.92704 -v 16451.5 23224.2 2557.2 -vt 0.192436 0.92704 -o mesh724 -s off -f 3679/3679/3679 3680/3680/3680 3681/3681/3681 -f 3679/3679/3679 3681/3681/3681 3682/3682/3682 -g charts -o chart0000 -s off -f 3679/3679/3679 3680/3680/3680 3681/3681/3681 -f 3679/3679/3679 3681/3681/3681 3682/3682/3682 -v 16286.5 23224.2 2557.2 -vt 0.027847 0.201566 -v 16286.5 23583.3 2557.2 -vt 0.024522 0.201566 -v 16451.5 23583.3 2557.2 -vt 0.024522 0.199918 -v 16451.5 23224.2 2557.2 -vt 0.027847 0.199918 -v 16421.5 23224.2 2557.2 -vt 0.027847 0.200217 -v 16376.5 23224.2 2557.2 -vt 0.027847 0.200667 -o mesh725 -s off -f 3683/3683/3683 3684/3684/3684 3685/3685/3685 -f 3683/3683/3683 3685/3685/3685 3686/3686/3686 -f 3683/3683/3683 3686/3686/3686 3687/3687/3687 -f 3683/3683/3683 3687/3687/3687 3688/3688/3688 -g charts -o chart0000 -s off -f 3683/3683/3683 3684/3684/3684 3685/3685/3685 -f 3683/3683/3683 3685/3685/3685 3686/3686/3686 -f 3683/3683/3683 3686/3686/3686 3687/3687/3687 -f 3683/3683/3683 3687/3687/3687 3688/3688/3688 -v 16286.5 23583.3 2557.2 -vt 0.108479 0.525556 -v 16286.5 23583.3 1960.95 -vt 0.108479 0.520825 -v 16376.5 23583.3 1960.95 -vt 0.107572 0.520825 -v 16421.5 23583.3 1960.95 -vt 0.107119 0.520825 -v 16451.5 23583.3 1960.95 -vt 0.106816 0.520825 -v 16451.5 23583.3 2557.2 -vt 0.106816 0.525556 -v 16421.5 23583.3 1934.7 -vt 0.107119 0.520617 -v 16451.5 23583.3 1934.7 -vt 0.106816 0.520617 -v 16286.5 23583.3 1934.7 -vt 0.108479 0.520617 -v 16286.5 23583.3 -247.8 -vt 0.108479 0.503298 -v 16451.5 23583.3 -247.8 -vt 0.106816 0.503298 -v 16376.5 23583.3 1934.7 -vt 0.107572 0.520617 -o mesh726 -s off -f 3689/3689/3689 3690/3690/3690 3691/3691/3691 -f 3689/3689/3689 3691/3691/3691 3692/3692/3692 -f 3689/3689/3689 3692/3692/3692 3693/3693/3693 -f 3689/3689/3689 3693/3693/3693 3694/3694/3694 -f 3693/3693/3693 3692/3692/3692 3695/3695/3695 -f 3693/3693/3693 3695/3695/3695 3696/3696/3696 -f 3697/3697/3697 3698/3698/3698 3699/3699/3699 -f 3697/3697/3697 3699/3699/3699 3696/3696/3696 -f 3697/3697/3697 3696/3696/3696 3695/3695/3695 -f 3697/3697/3697 3695/3695/3695 3700/3700/3700 -f 3692/3692/3692 3691/3691/3691 3700/3700/3700 -f 3692/3692/3692 3700/3700/3700 3695/3695/3695 -g charts -o chart0000 -s off -f 3689/3689/3689 3690/3690/3690 3691/3691/3691 -f 3689/3689/3689 3691/3691/3691 3692/3692/3692 -f 3689/3689/3689 3692/3692/3692 3693/3693/3693 -f 3689/3689/3689 3693/3693/3693 3694/3694/3694 -f 3693/3693/3693 3692/3692/3692 3695/3695/3695 -f 3693/3693/3693 3695/3695/3695 3696/3696/3696 -f 3697/3697/3697 3698/3698/3698 3699/3699/3699 -f 3697/3697/3697 3699/3699/3699 3696/3696/3696 -f 3697/3697/3697 3696/3696/3696 3695/3695/3695 -f 3697/3697/3697 3695/3695/3695 3700/3700/3700 -f 3692/3692/3692 3691/3691/3691 3700/3700/3700 -f 3692/3692/3692 3700/3700/3700 3695/3695/3695 -v 16286.5 23583.3 -247.8 -vt 0.475062 0.997939 -v 16286.5 22493.7 -247.8 -vt 0.484206 0.997939 -v 16451.5 22493.7 -247.8 -vt 0.484206 0.999588 -v 16451.5 23583.3 -247.8 -vt 0.475062 0.999588 -o mesh727 -s off -f 3701/3701/3701 3702/3702/3702 3703/3703/3703 -f 3701/3701/3701 3703/3703/3703 3704/3704/3704 -g charts -o chart0000 -s off -f 3701/3701/3701 3702/3702/3702 3703/3703/3703 -f 3701/3701/3701 3703/3703/3703 3704/3704/3704 -v 16421.5 22852.8 2557.2 -vt 0.0943475 0.683017 -v 16421.5 22852.8 1960.95 -vt 0.0993349 0.683017 -v 16421.5 22493.7 1960.95 -vt 0.0993349 0.67972 -v 16421.5 22852.8 2557.2 -vt 0.190773 0.904266 -v 16421.5 22493.7 1960.95 -vt 0.19555 0.907255 -v 16421.5 22493.7 1934.7 -vt 0.195761 0.907255 -v 16421.5 23583.3 1934.7 -vt 0.195761 0.898186 -v 16421.5 23583.3 1960.95 -vt 0.19555 0.898186 -v 16421.5 22852.8 2557.2 -vt 0.879052 0.443116 -v 16421.5 23583.3 1960.95 -vt 0.879052 0.435697 -v 16421.5 23224.2 1960.95 -vt 0.876559 0.437886 -v 16421.5 22852.8 2557.2 -vt 0.0203657 0.904782 -v 16421.5 23224.2 1960.95 -vt 0.0203657 0.910552 -v 16421.5 23224.2 2557.2 -vt 0.017872 0.906394 -v 16421.5 23201.3 2557.2 -vt 0.0180258 0.906295 -v 16421.5 22852.8 2557.2 -vt 0.504988 0.71352 -v 16421.5 23201.3 2557.2 -vt 0.508312 0.71352 -v 16421.5 23201.3 1960.95 -vt 0.508312 0.718467 -v 16421.5 22875.7 1960.95 -vt 0.505206 0.718467 -v 16421.5 22852.8 2557.2 -vt 0.330424 0.52061 -v 16421.5 22875.7 1960.95 -vt 0.325436 0.521434 -v 16421.5 22875.7 2557.2 -vt 0.330424 0.521434 -o mesh728 -s off -f 3705/3705/3705 3706/3706/3706 3707/3707/3707 -f 3708/3708/3708 3709/3709/3709 3710/3710/3710 -f 3708/3708/3708 3710/3710/3710 3711/3711/3711 -f 3708/3708/3708 3711/3711/3711 3712/3712/3712 -f 3713/3713/3713 3714/3714/3714 3715/3715/3715 -f 3716/3716/3716 3717/3717/3717 3718/3718/3718 -f 3716/3716/3716 3718/3718/3718 3719/3719/3719 -f 3720/3720/3720 3721/3721/3721 3722/3722/3722 -f 3720/3720/3720 3722/3722/3722 3723/3723/3723 -f 3724/3724/3724 3725/3725/3725 3726/3726/3726 -g charts -o chart0000 -s off -f 3705/3705/3705 3706/3706/3706 3707/3707/3707 -o chart0001 -s off -f 3708/3708/3708 3709/3709/3709 3710/3710/3710 -f 3708/3708/3708 3710/3710/3710 3711/3711/3711 -f 3708/3708/3708 3711/3711/3711 3712/3712/3712 -o chart0002 -s off -f 3713/3713/3713 3714/3714/3714 3715/3715/3715 -o chart0003 -s off -f 3716/3716/3716 3717/3717/3717 3718/3718/3718 -f 3716/3716/3716 3718/3718/3718 3719/3719/3719 -o chart0004 -s off -f 3720/3720/3720 3721/3721/3721 3722/3722/3722 -f 3720/3720/3720 3722/3722/3722 3723/3723/3723 -o chart0005 -s off -f 3724/3724/3724 3725/3725/3725 3726/3726/3726 -v 16421.5 22852.8 1960.95 -vt 0.595594 0.914674 -v 16421.5 22852.8 2557.2 -vt 0.590607 0.914674 -v 16376.5 22852.8 2557.2 -vt 0.590607 0.91385 -v 16376.5 22852.8 1960.95 -vt 0.595594 0.91385 -o mesh729 -s off -f 3727/3727/3727 3728/3728/3728 3729/3729/3729 -f 3727/3727/3727 3729/3729/3729 3730/3730/3730 -g charts -o chart0000 -s off -f 3727/3727/3727 3728/3728/3728 3729/3729/3729 -f 3727/3727/3727 3729/3729/3729 3730/3730/3730 -v 16421.5 22852.8 1960.95 -vt 0.746883 0.712696 -v 16376.5 22852.8 1960.95 -vt 0.746883 0.711871 -v 16376.5 22493.7 1960.95 -vt 0.743558 0.711871 -v 16421.5 22493.7 1960.95 -vt 0.743558 0.712696 -o mesh730 -s off -f 3731/3731/3731 3732/3732/3732 3733/3733/3733 -f 3731/3731/3731 3733/3733/3733 3734/3734/3734 -g charts -o chart0000 -s off -f 3731/3731/3731 3732/3732/3732 3733/3733/3733 -f 3731/3731/3731 3733/3733/3733 3734/3734/3734 -v 16421.5 22493.7 1934.7 -vt 0.105985 0.904782 -v 16376.5 22493.7 1934.7 -vt 0.106816 0.904782 -v 16376.5 22493.7 1960.95 -vt 0.106816 0.905606 -v 16421.5 22493.7 1960.95 -vt 0.105985 0.905606 -o mesh731 -s off -f 3735/3735/3735 3736/3736/3736 3737/3737/3737 -f 3735/3735/3735 3737/3737/3737 3738/3738/3738 -g charts -o chart0000 -s off -f 3735/3735/3735 3736/3736/3736 3737/3737/3737 -f 3735/3735/3735 3737/3737/3737 3738/3738/3738 -v 16421.5 22493.7 1934.7 -vt 0.403574 0.546167 -v 16376.5 22493.7 1934.7 -vt 0.403574 0.546991 -v 16376.5 23583.3 1934.7 -vt 0.394431 0.546991 -v 16421.5 23583.3 1934.7 -vt 0.394431 0.546167 -o mesh732 -s off -f 3739/3739/3739 3740/3740/3740 3741/3741/3741 -f 3739/3739/3739 3741/3741/3741 3742/3742/3742 -g charts -o chart0000 -s off -f 3739/3739/3739 3740/3740/3740 3741/3741/3741 -f 3739/3739/3739 3741/3741/3741 3742/3742/3742 -v 16421.5 23583.3 1960.95 -vt 0.392768 0.606348 -v 16376.5 23583.3 1960.95 -vt 0.392768 0.605523 -v 16376.5 23224.2 1960.95 -vt 0.389443 0.605523 -v 16421.5 23224.2 1960.95 -vt 0.389443 0.606348 -o mesh733 -s off -f 3743/3743/3743 3744/3744/3744 3745/3745/3745 -f 3743/3743/3743 3745/3745/3745 3746/3746/3746 -g charts -o chart0000 -s off -f 3743/3743/3743 3744/3744/3744 3745/3745/3745 -f 3743/3743/3743 3745/3745/3745 3746/3746/3746 -v 16421.5 23224.2 1960.95 -vt 0.340399 0.445589 -v 16376.5 23224.2 1960.95 -vt 0.340399 0.446414 -v 16376.5 23224.2 2557.2 -vt 0.335411 0.446414 -v 16421.5 23224.2 2557.2 -vt 0.335411 0.445589 -o mesh734 -s off -f 3747/3747/3747 3748/3748/3748 3749/3749/3749 -f 3747/3747/3747 3749/3749/3749 3750/3750/3750 -g charts -o chart0000 -s off -f 3747/3747/3747 3748/3748/3748 3749/3749/3749 -f 3747/3747/3747 3749/3749/3749 3750/3750/3750 -v 16421.5 23201.3 2557.2 -vt 0.640482 0.525556 -v 16376.5 23201.3 2557.2 -vt 0.640482 0.526381 -v 16376.5 23224.2 2557.2 -vt 0.641313 0.526381 -v 16421.5 23224.2 2557.2 -vt 0.641313 0.525556 -o mesh735 -s off -f 3751/3751/3751 3752/3752/3752 3753/3753/3753 -f 3751/3751/3751 3753/3753/3753 3754/3754/3754 -g charts -o chart0000 -s off -f 3751/3751/3751 3752/3752/3752 3753/3753/3753 -f 3751/3751/3751 3753/3753/3753 3754/3754/3754 -v 16421.5 23201.3 2557.2 -vt 0.209892 0.649217 -v 16376.5 23201.3 2557.2 -vt 0.209892 0.648392 -v 16376.5 23201.3 1960.95 -vt 0.204904 0.648392 -v 16421.5 23201.3 1960.95 -vt 0.204904 0.649217 -o mesh736 -s off -f 3755/3755/3755 3756/3756/3756 3757/3757/3757 -f 3755/3755/3755 3757/3757/3757 3758/3758/3758 -g charts -o chart0000 -s off -f 3755/3755/3755 3756/3756/3756 3757/3757/3757 -f 3755/3755/3755 3757/3757/3757 3758/3758/3758 -v 16421.5 23201.3 1960.95 -vt 0.874065 0.987222 -v 16376.5 23201.3 1960.95 -vt 0.874065 0.986397 -v 16376.5 22875.7 1960.95 -vt 0.87074 0.986397 -v 16421.5 22875.7 1960.95 -vt 0.87074 0.987222 -o mesh737 -s off -f 3759/3759/3759 3760/3760/3760 3761/3761/3761 -f 3759/3759/3759 3761/3761/3761 3762/3762/3762 -g charts -o chart0000 -s off -f 3759/3759/3759 3760/3760/3760 3761/3761/3761 -f 3759/3759/3759 3761/3761/3761 3762/3762/3762 -v 16376.5 22875.7 1960.95 -vt 0.112635 0.908903 -v 16376.5 22875.7 2557.2 -vt 0.107648 0.908903 -v 16421.5 22875.7 2557.2 -vt 0.107648 0.908079 -v 16421.5 22875.7 1960.95 -vt 0.112635 0.908079 -o mesh738 -s off -f 3763/3763/3763 3764/3764/3764 3765/3765/3765 -f 3763/3763/3763 3765/3765/3765 3766/3766/3766 -g charts -o chart0000 -s off -f 3763/3763/3763 3764/3764/3764 3765/3765/3765 -f 3763/3763/3763 3765/3765/3765 3766/3766/3766 -v 16421.5 22852.8 2557.2 -vt 0.913134 0.542045 -v 16376.5 22852.8 2557.2 -vt 0.913134 0.542869 -v 16376.5 22875.7 2557.2 -vt 0.913965 0.542869 -v 16421.5 22875.7 2557.2 -vt 0.913965 0.542045 -o mesh739 -s off -f 3767/3767/3767 3768/3768/3768 3769/3769/3769 -f 3767/3767/3767 3769/3769/3769 3770/3770/3770 -g charts -o chart0000 -s off -f 3767/3767/3767 3768/3768/3768 3769/3769/3769 -f 3767/3767/3767 3769/3769/3769 3770/3770/3770 -v 16376.5 22493.7 1934.7 -vt 0.00207805 0.172712 -v 16376.5 22493.7 1960.95 -vt 0.00124688 0.172695 -v 16376.5 22852.8 1960.95 -vt 0.00207805 0.169415 -v 16376.5 22493.7 1934.7 -vt 0.825021 0.670651 -v 16376.5 22852.8 1960.95 -vt 0.822527 0.672275 -v 16376.5 22852.8 2557.2 -vt 0.825021 0.676422 -v 16376.5 22493.7 1934.7 -vt 0.0727348 0.978153 -v 16376.5 22852.8 2557.2 -vt 0.0695961 0.973207 -v 16376.5 22875.7 2557.2 -vt 0.069408 0.973214 -v 16376.5 22875.7 1960.95 -vt 0.0695896 0.978055 -v 16376.5 23201.3 1960.95 -vt 0.066916 0.978153 -v 16376.5 22493.7 1934.7 -vt 0.991272 0.180132 -v 16376.5 23201.3 1960.95 -vt 0.987116 0.184451 -v 16376.5 23201.3 2557.2 -vt 0.991272 0.187551 -v 16376.5 22493.7 1934.7 -vt 0.871571 0.774526 -v 16376.5 23201.3 2557.2 -vt 0.877509 0.779472 -v 16376.5 23224.2 2557.2 -vt 0.877701 0.779472 -v 16376.5 23224.2 1960.95 -vt 0.877701 0.774735 -v 16376.5 23583.3 1960.95 -vt 0.880715 0.774735 -v 16376.5 23583.3 1934.7 -vt 0.880715 0.774526 -o mesh740 -s off -f 3771/3771/3771 3772/3772/3772 3773/3773/3773 -f 3774/3774/3774 3775/3775/3775 3776/3776/3776 -f 3777/3777/3777 3778/3778/3778 3779/3779/3779 -f 3777/3777/3777 3779/3779/3779 3780/3780/3780 -f 3777/3777/3777 3780/3780/3780 3781/3781/3781 -f 3782/3782/3782 3783/3783/3783 3784/3784/3784 -f 3785/3785/3785 3786/3786/3786 3787/3787/3787 -f 3785/3785/3785 3787/3787/3787 3788/3788/3788 -f 3785/3785/3785 3788/3788/3788 3789/3789/3789 -f 3785/3785/3785 3789/3789/3789 3790/3790/3790 -g charts -o chart0000 -s off -f 3771/3771/3771 3772/3772/3772 3773/3773/3773 -o chart0001 -s off -f 3774/3774/3774 3775/3775/3775 3776/3776/3776 -o chart0002 -s off -f 3777/3777/3777 3778/3778/3778 3779/3779/3779 -f 3777/3777/3777 3779/3779/3779 3780/3780/3780 -f 3777/3777/3777 3780/3780/3780 3781/3781/3781 -o chart0003 -s off -f 3782/3782/3782 3783/3783/3783 3784/3784/3784 -o chart0004 -s off -f 3785/3785/3785 3786/3786/3786 3787/3787/3787 -f 3785/3785/3785 3787/3787/3787 3788/3788/3788 -f 3785/3785/3785 3788/3788/3788 3789/3789/3789 -f 3785/3785/3785 3789/3789/3789 3790/3790/3790 -v 16286.5 22852.8 2557.2 -vt 0.323774 0.43075 -v 16286.5 22875.7 2557.2 -vt 0.323774 0.431574 -v 16376.5 22875.7 2557.2 -vt 0.322943 0.431574 -v 16376.5 22852.8 2557.2 -vt 0.322943 0.43075 -o mesh741 -s off -f 3791/3791/3791 3792/3792/3792 3793/3793/3793 -f 3791/3791/3791 3793/3793/3793 3794/3794/3794 -g charts -o chart0000 -s off -f 3791/3791/3791 3792/3792/3792 3793/3793/3793 -f 3791/3791/3791 3793/3793/3793 3794/3794/3794 -v 16286.5 23201.3 2557.2 -vt 0.828346 0.0638912 -v 16286.5 23224.2 2557.2 -vt 0.828346 0.0647155 -v 16376.5 23224.2 2557.2 -vt 0.827515 0.0647155 -v 16376.5 23201.3 2557.2 -vt 0.827515 0.0638912 -o mesh742 -s off -f 3795/3795/3795 3796/3796/3796 3797/3797/3797 -f 3795/3795/3795 3797/3797/3797 3798/3798/3798 -g charts -o chart0000 -s off -f 3795/3795/3795 3796/3796/3796 3797/3797/3797 -f 3795/3795/3795 3797/3797/3797 3798/3798/3798 -v 16286.5 23583.3 1960.95 -vt 0.697007 0.625309 -v 16286.5 23583.3 1934.7 -vt 0.697007 0.626133 -v 16376.5 23583.3 1934.7 -vt 0.696176 0.626133 -v 16376.5 23583.3 1960.95 -vt 0.696176 0.625309 -o mesh743 -s off -f 3799/3799/3799 3800/3800/3800 3801/3801/3801 -f 3799/3799/3799 3801/3801/3801 3802/3802/3802 -g charts -o chart0000 -s off -f 3799/3799/3799 3800/3800/3800 3801/3801/3801 -f 3799/3799/3799 3801/3801/3801 3802/3802/3802 -v 10691.5 23706 -285.3 -vt 0.108479 0.365622 -v 10691.5 23738.7 -247.8 -vt 0.10931 0.365879 -v 10691.5 24861 -285.3 -vt 0.108479 0.374691 -v 10691.5 24828.3 -247.8 -vt 0.10931 0.374434 -o mesh744 -s off -f 3803/3803/3803 3804/3804/3804 3805/3805/3805 -f 3806/3806/3806 3805/3805/3805 3804/3804/3804 -g charts -o chart0000 -s off -f 3803/3803/3803 3804/3804/3804 3805/3805/3805 -f 3806/3806/3806 3805/3805/3805 3804/3804/3804 -v 10691.5 23738.7 -247.8 -vt 0.655445 0.755865 -v 10691.5 23706 -285.3 -vt 0.656276 0.755565 -v 10691.5 23706 2594.7 -vt 0.656276 0.778648 -o mesh745 -s off -f 3807/3807/3807 3808/3808/3808 3809/3809/3809 -g charts -o chart0000 -s off -f 3807/3807/3807 3808/3808/3808 3809/3809/3809 -v 10691.5 23738.7 -247.8 -vt 0.600582 0.914674 -v 10691.5 23706 2594.7 -vt 0.623026 0.914674 -v 10691.5 23738.7 2557.2 -vt 0.622727 0.91385 -o mesh746 -s off -f 3810/3810/3810 3811/3811/3811 3812/3812/3812 -g charts -o chart0000 -s off -f 3810/3810/3810 3811/3811/3811 3812/3812/3812 -v 10691.5 23738.7 2557.2 -vt 0.839458 0.817395 -v 10691.5 23706 2594.7 -vt 0.839152 0.818219 -v 10691.5 24097.8 2557.2 -vt 0.842477 0.818219 -o mesh747 -s off -f 3813/3813/3813 3814/3814/3814 3815/3815/3815 -g charts -o chart0000 -s off -f 3813/3813/3813 3814/3814/3814 3815/3815/3815 -v 10691.5 24097.8 2557.2 -vt 0.229842 0.750743 -v 10691.5 23706 2594.7 -vt 0.230673 0.753916 -v 10691.5 24120.7 2557.2 -vt 0.229869 0.750558 -v 10691.5 24446.3 2557.2 -vt 0.230238 0.747931 -v 10691.5 24469.2 2557.2 -vt 0.230265 0.747746 -v 10691.5 24828.3 2557.2 -vt 0.230673 0.744847 -o mesh748 -s off -f 3816/3816/3816 3817/3817/3817 3818/3818/3818 -f 3818/3818/3818 3817/3817/3817 3819/3819/3819 -f 3819/3819/3819 3817/3817/3817 3820/3820/3820 -f 3820/3820/3820 3817/3817/3817 3821/3821/3821 -g charts -o chart0000 -s off -f 3816/3816/3816 3817/3817/3817 3818/3818/3818 -f 3818/3818/3818 3817/3817/3817 3819/3819/3819 -f 3819/3819/3819 3817/3817/3817 3820/3820/3820 -f 3820/3820/3820 3817/3817/3817 3821/3821/3821 -v 10691.5 24861 -285.3 -vt 0.921446 0.234542 -v 10691.5 24828.3 -247.8 -vt 0.920615 0.234242 -v 10691.5 24861 2594.7 -vt 0.921446 0.211459 -o mesh749 -s off -f 3822/3822/3822 3823/3823/3823 3824/3824/3824 -g charts -o chart0000 -s off -f 3822/3822/3822 3823/3823/3823 3824/3824/3824 -v 10691.5 24861 2594.7 -vt 0.593932 0.998763 -v 10691.5 24828.3 -247.8 -vt 0.616376 0.998763 -v 10691.5 24828.3 1934.7 -vt 0.599145 0.997949 -v 10691.5 24828.3 1960.95 -vt 0.598938 0.997939 -o mesh750 -s off -f 3825/3825/3825 3826/3826/3826 3827/3827/3827 -f 3825/3825/3825 3827/3827/3827 3828/3828/3828 -g charts -o chart0000 -s off -f 3825/3825/3825 3826/3826/3826 3827/3827/3827 -f 3825/3825/3825 3827/3827/3827 3828/3828/3828 -v 10691.5 24861 2594.7 -vt 0.784289 0.960016 -v 10691.5 24828.3 1960.95 -vt 0.790108 0.960016 -v 10691.5 24828.3 2557.2 -vt 0.784648 0.959192 -o mesh751 -s off -f 3829/3829/3829 3830/3830/3830 3831/3831/3831 -g charts -o chart0000 -s off -f 3829/3829/3829 3830/3830/3830 3831/3831/3831 -v 10691.5 24861 2594.7 -vt 0.976309 0.776999 -v 10691.5 24828.3 2557.2 -vt 0.975478 0.776742 -v 10691.5 23706 2594.7 -vt 0.976309 0.767931 -o mesh752 -s off -f 3832/3832/3832 3833/3833/3833 3834/3834/3834 -g charts -o chart0000 -s off -f 3832/3832/3832 3833/3833/3833 3834/3834/3834 -v 10856.5 24861 -285.3 -vt 0.0893598 0.9831 -v 10856.5 24828.3 -247.8 -vt 0.0891008 0.982275 -v 10856.5 23706 -285.3 -vt 0.0802161 0.9831 -v 10856.5 23738.7 -247.8 -vt 0.0804752 0.982275 -o mesh753 -s off -f 3835/3835/3835 3836/3836/3836 3837/3837/3837 -f 3838/3838/3838 3837/3837/3837 3836/3836/3836 -g charts -o chart0000 -s off -f 3835/3835/3835 3836/3836/3836 3837/3837/3837 -f 3838/3838/3838 3837/3837/3837 3836/3836/3836 -v 10856.5 24828.3 -247.8 -vt 0.964975 0.752267 -v 10856.5 24861 -285.3 -vt 0.964672 0.753091 -v 10856.5 24861 2594.7 -vt 0.987947 0.753091 -v 10856.5 24828.3 1934.7 -vt 0.982613 0.752267 -o mesh754 -s off -f 3839/3839/3839 3840/3840/3840 3841/3841/3841 -f 3839/3839/3839 3841/3841/3841 3842/3842/3842 -g charts -o chart0000 -s off -f 3839/3839/3839 3840/3840/3840 3841/3841/3841 -f 3839/3839/3839 3841/3841/3841 3842/3842/3842 -v 10856.5 24828.3 1934.7 -vt 0.908146 0.0581204 -v 10856.5 24861 2594.7 -vt 0.908146 0.0638911 -v 10856.5 24828.3 1960.95 -vt 0.908111 0.0583492 -v 10856.5 24828.3 2557.2 -vt 0.907315 0.0635498 -o mesh755 -s off -f 3843/3843/3843 3844/3844/3844 3845/3845/3845 -f 3845/3845/3845 3844/3844/3844 3846/3846/3846 -g charts -o chart0000 -s off -f 3843/3843/3843 3844/3844/3844 3845/3845/3845 -f 3845/3845/3845 3844/3844/3844 3846/3846/3846 -v 10856.5 24828.3 2557.2 -vt 0.790939 0.686618 -v 10856.5 24861 2594.7 -vt 0.79177 0.686315 -v 10856.5 24469.2 2557.2 -vt 0.79177 0.689612 -o mesh756 -s off -f 3847/3847/3847 3848/3848/3848 3849/3849/3849 -g charts -o chart0000 -s off -f 3847/3847/3847 3848/3848/3848 3849/3849/3849 -v 10856.5 24469.2 2557.2 -vt 0.000415628 0.769455 -v 10856.5 24861 2594.7 -vt 0.0012468 0.766282 -v 10856.5 24446.3 2557.2 -vt 0.00044165 0.769639 -v 10856.5 24120.7 2557.2 -vt 0.00081208 0.772267 -v 10856.5 24097.8 2557.2 -vt 0.000838102 0.772452 -v 10856.5 23738.7 2557.2 -vt 0.0012468 0.77535 -o mesh757 -s off -f 3850/3850/3850 3851/3851/3851 3852/3852/3852 -f 3852/3852/3852 3851/3851/3851 3853/3853/3853 -f 3853/3853/3853 3851/3851/3851 3854/3854/3854 -f 3854/3854/3854 3851/3851/3851 3855/3855/3855 -g charts -o chart0000 -s off -f 3850/3850/3850 3851/3851/3851 3852/3852/3852 -f 3852/3852/3852 3851/3851/3851 3853/3853/3853 -f 3853/3853/3853 3851/3851/3851 3854/3854/3854 -f 3854/3854/3854 3851/3851/3851 3855/3855/3855 -v 10856.5 23706 -285.3 -vt 0.606401 0.411789 -v 10856.5 23738.7 -247.8 -vt 0.605569 0.411488 -v 10856.5 23706 2594.7 -vt 0.606401 0.388706 -o mesh758 -s off -f 3856/3856/3856 3857/3857/3857 3858/3858/3858 -g charts -o chart0000 -s off -f 3856/3856/3856 3857/3857/3857 3858/3858/3858 -v 10856.5 23706 2594.7 -vt 0.815046 0.322753 -v 10856.5 23738.7 -247.8 -vt 0.837489 0.322753 -v 10856.5 23738.7 2557.2 -vt 0.815345 0.321929 -o mesh759 -s off -f 3859/3859/3859 3860/3860/3860 3861/3861/3861 -g charts -o chart0000 -s off -f 3859/3859/3859 3860/3860/3860 3861/3861/3861 -v 10856.5 23706 2594.7 -vt 0.397756 0.5 -v 10856.5 23738.7 2557.2 -vt 0.397496 0.499176 -v 10856.5 24861 2594.7 -vt 0.388612 0.5 -o mesh760 -s off -f 3862/3862/3862 3863/3863/3863 3864/3864/3864 -g charts -o chart0000 -s off -f 3862/3862/3862 3863/3863/3863 3864/3864/3864 -v 10691.5 24861 2594.7 -vt 0.613882 0.465375 -v 10691.5 23706 2594.7 -vt 0.613882 0.474443 -v 10856.5 23706 2594.7 -vt 0.615544 0.474443 -v 10856.5 24861 2594.7 -vt 0.615544 0.465375 -o mesh761 -s off -f 3865/3865/3865 3866/3866/3866 3867/3867/3867 -f 3865/3865/3865 3867/3867/3867 3868/3868/3868 -g charts -o chart0000 -s off -f 3865/3865/3865 3866/3866/3866 3867/3867/3867 -f 3865/3865/3865 3867/3867/3867 3868/3868/3868 -v 10691.5 23706 2594.7 -vt 0.416043 0.544518 -v 10691.5 23706 -285.3 -vt 0.439318 0.544518 -v 10774 23706 -285.3 -vt 0.439318 0.545342 -v 10856.5 23706 -285.3 -vt 0.439318 0.546166 -v 10856.5 23706 2594.7 -vt 0.416043 0.546166 -o mesh762 -s off -f 3869/3869/3869 3870/3870/3870 3871/3871/3871 -f 3869/3869/3869 3871/3871/3871 3872/3872/3872 -f 3869/3869/3869 3872/3872/3872 3873/3873/3873 -g charts -o chart0000 -s off -f 3869/3869/3869 3870/3870/3870 3871/3871/3871 -f 3869/3869/3869 3871/3871/3871 3872/3872/3872 -f 3869/3869/3869 3872/3872/3872 3873/3873/3873 -v 10691.5 23706 -285.3 -vt 0.0918536 0.992992 -v 10691.5 24861 -285.3 -vt 0.0827099 0.992992 -v 10856.5 24861 -285.3 -vt 0.0827099 0.991344 -v 10856.5 23706 -285.3 -vt 0.0918536 0.991344 -v 10774 23706 -285.3 -vt 0.0918536 0.992168 -o mesh763 -s off -f 3874/3874/3874 3875/3875/3875 3876/3876/3876 -f 3874/3874/3874 3876/3876/3876 3877/3877/3877 -f 3874/3874/3874 3877/3877/3877 3878/3878/3878 -g charts -o chart0000 -s off -f 3874/3874/3874 3875/3875/3875 3876/3876/3876 -f 3874/3874/3874 3876/3876/3876 3877/3877/3877 -f 3874/3874/3874 3877/3877/3877 3878/3878/3878 -v 10691.5 24861 -285.3 -vt 0.651288 0.876752 -v 10691.5 24861 2594.7 -vt 0.651288 0.853669 -v 10856.5 24861 2594.7 -vt 0.649626 0.853669 -v 10856.5 24861 -285.3 -vt 0.649626 0.876752 -o mesh764 -s off -f 3879/3879/3879 3880/3880/3880 3881/3881/3881 -f 3879/3879/3879 3881/3881/3881 3882/3882/3882 -g charts -o chart0000 -s off -f 3879/3879/3879 3880/3880/3880 3881/3881/3881 -f 3879/3879/3879 3881/3881/3881 3882/3882/3882 -v 10856.5 23738.7 -247.8 -vt 0.927265 0.414262 -v 10826.5 23738.7 1934.7 -vt 0.909802 0.414562 -v 10856.5 23738.7 2557.2 -vt 0.904821 0.414262 -v 10691.5 23738.7 -247.8 -vt 0.927265 0.415911 -v 10781.5 23738.7 1934.7 -vt 0.909802 0.415012 -v 10781.5 23738.7 1960.95 -vt 0.909592 0.415012 -v 10691.5 23738.7 2557.2 -vt 0.904821 0.415911 -v 10826.5 23738.7 1960.95 -vt 0.909592 0.414562 -o mesh765 -s off -f 3883/3883/3883 3884/3884/3884 3885/3885/3885 -f 3884/3884/3884 3883/3883/3883 3886/3886/3886 -f 3884/3884/3884 3886/3886/3886 3887/3887/3887 -f 3887/3887/3887 3886/3886/3886 3888/3888/3888 -f 3888/3888/3888 3886/3886/3886 3889/3889/3889 -f 3885/3885/3885 3890/3890/3890 3889/3889/3889 -f 3890/3890/3890 3885/3885/3885 3884/3884/3884 -f 3889/3889/3889 3890/3890/3890 3888/3888/3888 -g charts -o chart0000 -s off -f 3883/3883/3883 3884/3884/3884 3885/3885/3885 -f 3884/3884/3884 3883/3883/3883 3886/3886/3886 -f 3884/3884/3884 3886/3886/3886 3887/3887/3887 -f 3887/3887/3887 3886/3886/3886 3888/3888/3888 -f 3888/3888/3888 3886/3886/3886 3889/3889/3889 -f 3885/3885/3885 3890/3890/3890 3889/3889/3889 -f 3890/3890/3890 3885/3885/3885 3884/3884/3884 -f 3889/3889/3889 3890/3890/3890 3888/3888/3888 -v 10691.5 23738.7 2557.2 -vt 0.432668 0.204039 -v 10691.5 24097.8 2557.2 -vt 0.432668 0.200742 -v 10781.5 24097.8 2557.2 -vt 0.431761 0.200742 -v 10826.5 24097.8 2557.2 -vt 0.431308 0.200742 -v 10856.5 24097.8 2557.2 -vt 0.431006 0.200742 -v 10856.5 23738.7 2557.2 -vt 0.431006 0.204039 -o mesh766 -s off -f 3891/3891/3891 3892/3892/3892 3893/3893/3893 -f 3891/3891/3891 3893/3893/3893 3894/3894/3894 -f 3891/3891/3891 3894/3894/3894 3895/3895/3895 -f 3891/3891/3891 3895/3895/3895 3896/3896/3896 -g charts -o chart0000 -s off -f 3891/3891/3891 3892/3892/3892 3893/3893/3893 -f 3891/3891/3891 3893/3893/3893 3894/3894/3894 -f 3891/3891/3891 3894/3894/3894 3895/3895/3895 -f 3891/3891/3891 3895/3895/3895 3896/3896/3896 -v 10856.5 24097.8 2557.2 -vt 0.801746 0.756389 -v 10826.5 24097.8 2557.2 -vt 0.801746 0.757213 -v 10826.5 24120.7 2557.2 -vt 0.802577 0.757213 -v 10856.5 24120.7 2557.2 -vt 0.802577 0.756389 -o mesh767 -s off -f 3897/3897/3897 3898/3898/3898 3899/3899/3899 -f 3897/3897/3897 3899/3899/3899 3900/3900/3900 -g charts -o chart0000 -s off -f 3897/3897/3897 3898/3898/3898 3899/3899/3899 -f 3897/3897/3897 3899/3899/3899 3900/3900/3900 -v 10691.5 24120.7 2557.2 -vt 0.32793 0.99629 -v 10691.5 24446.3 2557.2 -vt 0.32793 0.992993 -v 10781.5 24446.3 2557.2 -vt 0.327023 0.992993 -v 10826.5 24446.3 2557.2 -vt 0.32657 0.992993 -v 10856.5 24446.3 2557.2 -vt 0.326268 0.992993 -v 10856.5 24120.7 2557.2 -vt 0.326268 0.99629 -v 10826.5 24120.7 2557.2 -vt 0.32657 0.99629 -v 10781.5 24120.7 2557.2 -vt 0.327023 0.99629 -o mesh768 -s off -f 3901/3901/3901 3902/3902/3902 3903/3903/3903 -f 3901/3901/3901 3903/3903/3903 3904/3904/3904 -f 3901/3901/3901 3904/3904/3904 3905/3905/3905 -f 3901/3901/3901 3905/3905/3905 3906/3906/3906 -f 3901/3901/3901 3906/3906/3906 3907/3907/3907 -f 3901/3901/3901 3907/3907/3907 3908/3908/3908 -g charts -o chart0000 -s off -f 3901/3901/3901 3902/3902/3902 3903/3903/3903 -f 3901/3901/3901 3903/3903/3903 3904/3904/3904 -f 3901/3901/3901 3904/3904/3904 3905/3905/3905 -f 3901/3901/3901 3905/3905/3905 3906/3906/3906 -f 3901/3901/3901 3906/3906/3906 3907/3907/3907 -f 3901/3901/3901 3907/3907/3907 3908/3908/3908 -v 10856.5 24446.3 2557.2 -vt 0.391937 0.772053 -v 10826.5 24446.3 2557.2 -vt 0.392768 0.772053 -v 10826.5 24469.2 2557.2 -vt 0.392768 0.772877 -v 10856.5 24469.2 2557.2 -vt 0.391937 0.772877 -o mesh769 -s off -f 3909/3909/3909 3910/3910/3910 3911/3911/3911 -f 3909/3909/3909 3911/3911/3911 3912/3912/3912 -g charts -o chart0000 -s off -f 3909/3909/3909 3910/3910/3910 3911/3911/3911 -f 3909/3909/3909 3911/3911/3911 3912/3912/3912 -v 10691.5 24469.2 2557.2 -vt 0.997091 0.845424 -v 10691.5 24828.3 2557.2 -vt 0.997091 0.842127 -v 10856.5 24828.3 2557.2 -vt 0.995428 0.842127 -v 10856.5 24469.2 2557.2 -vt 0.995428 0.845424 -v 10826.5 24469.2 2557.2 -vt 0.99573 0.845424 -v 10781.5 24469.2 2557.2 -vt 0.996184 0.845424 -o mesh770 -s off -f 3913/3913/3913 3914/3914/3914 3915/3915/3915 -f 3913/3913/3913 3915/3915/3915 3916/3916/3916 -f 3913/3913/3913 3916/3916/3916 3917/3917/3917 -f 3913/3913/3913 3917/3917/3917 3918/3918/3918 -g charts -o chart0000 -s off -f 3913/3913/3913 3914/3914/3914 3915/3915/3915 -f 3913/3913/3913 3915/3915/3915 3916/3916/3916 -f 3913/3913/3913 3916/3916/3916 3917/3917/3917 -f 3913/3913/3913 3917/3917/3917 3918/3918/3918 -v 10691.5 24828.3 2557.2 -vt 0.766833 0.65911 -v 10691.5 24828.3 1960.95 -vt 0.762062 0.65911 -v 10781.5 24828.3 1960.95 -vt 0.762062 0.65821 -v 10826.5 24828.3 1960.95 -vt 0.762062 0.657761 -v 10856.5 24828.3 1960.95 -vt 0.762062 0.657461 -v 10856.5 24828.3 2557.2 -vt 0.766833 0.657461 -v 10826.5 24828.3 1934.7 -vt 0.761852 0.657761 -v 10856.5 24828.3 1934.7 -vt 0.761852 0.657461 -v 10691.5 24828.3 1934.7 -vt 0.761852 0.65911 -v 10691.5 24828.3 -247.8 -vt 0.744389 0.65911 -v 10856.5 24828.3 -247.8 -vt 0.744389 0.657461 -v 10781.5 24828.3 1934.7 -vt 0.761852 0.65821 -o mesh771 -s off -f 3919/3919/3919 3920/3920/3920 3921/3921/3921 -f 3919/3919/3919 3921/3921/3921 3922/3922/3922 -f 3919/3919/3919 3922/3922/3922 3923/3923/3923 -f 3919/3919/3919 3923/3923/3923 3924/3924/3924 -f 3923/3923/3923 3922/3922/3922 3925/3925/3925 -f 3923/3923/3923 3925/3925/3925 3926/3926/3926 -f 3927/3927/3927 3928/3928/3928 3929/3929/3929 -f 3927/3927/3927 3929/3929/3929 3926/3926/3926 -f 3927/3927/3927 3926/3926/3926 3925/3925/3925 -f 3927/3927/3927 3925/3925/3925 3930/3930/3930 -f 3922/3922/3922 3921/3921/3921 3930/3930/3930 -f 3922/3922/3922 3930/3930/3930 3925/3925/3925 -g charts -o chart0000 -s off -f 3919/3919/3919 3920/3920/3920 3921/3921/3921 -f 3919/3919/3919 3921/3921/3921 3922/3922/3922 -f 3919/3919/3919 3922/3922/3922 3923/3923/3923 -f 3919/3919/3919 3923/3923/3923 3924/3924/3924 -f 3923/3923/3923 3922/3922/3922 3925/3925/3925 -f 3923/3923/3923 3925/3925/3925 3926/3926/3926 -f 3927/3927/3927 3928/3928/3928 3929/3929/3929 -f 3927/3927/3927 3929/3929/3929 3926/3926/3926 -f 3927/3927/3927 3926/3926/3926 3925/3925/3925 -f 3927/3927/3927 3925/3925/3925 3930/3930/3930 -f 3922/3922/3922 3921/3921/3921 3930/3930/3930 -f 3922/3922/3922 3930/3930/3930 3925/3925/3925 -v 10691.5 24828.3 -247.8 -vt 0.166667 0.997939 -v 10691.5 23738.7 -247.8 -vt 0.17581 0.997939 -v 10856.5 23738.7 -247.8 -vt 0.17581 0.999588 -v 10856.5 24828.3 -247.8 -vt 0.166667 0.999588 -o mesh772 -s off -f 3931/3931/3931 3932/3932/3932 3933/3933/3933 -f 3931/3931/3931 3933/3933/3933 3934/3934/3934 -g charts -o chart0000 -s off -f 3931/3931/3931 3932/3932/3932 3933/3933/3933 -f 3931/3931/3931 3933/3933/3933 3934/3934/3934 -v 10826.5 24097.8 2557.2 -vt 0.485037 0.698681 -v 10826.5 24097.8 1960.95 -vt 0.485037 0.703627 -v 10826.5 23738.7 1960.95 -vt 0.481712 0.703627 -v 10826.5 24097.8 2557.2 -vt 0.405548 0.838005 -v 10826.5 23738.7 1960.95 -vt 0.408562 0.842743 -v 10826.5 23738.7 1934.7 -vt 0.408562 0.842951 -v 10826.5 24828.3 1934.7 -vt 0.399418 0.842951 -v 10826.5 24828.3 1960.95 -vt 0.399418 0.842743 -v 10826.5 24097.8 2557.2 -vt 0.206567 0.436521 -v 10826.5 24828.3 1960.95 -vt 0.199086 0.436521 -v 10826.5 24469.2 1960.95 -vt 0.201293 0.434048 -v 10826.5 24097.8 2557.2 -vt 0.886534 0.915499 -v 10826.5 24469.2 1960.95 -vt 0.892352 0.915499 -v 10826.5 24469.2 2557.2 -vt 0.88816 0.913026 -v 10826.5 24446.3 2557.2 -vt 0.88806 0.913178 -v 10826.5 24097.8 2557.2 -vt 0.196592 0.937758 -v 10826.5 24446.3 2557.2 -vt 0.199917 0.937758 -v 10826.5 24446.3 1960.95 -vt 0.199917 0.942704 -v 10826.5 24120.7 1960.95 -vt 0.19681 0.942704 -v 10826.5 24097.8 2557.2 -vt 0.893184 0.903133 -v 10826.5 24120.7 1960.95 -vt 0.893184 0.908079 -v 10826.5 24120.7 2557.2 -vt 0.892352 0.90314 -o mesh773 -s off -f 3935/3935/3935 3936/3936/3936 3937/3937/3937 -f 3938/3938/3938 3939/3939/3939 3940/3940/3940 -f 3938/3938/3938 3940/3940/3940 3941/3941/3941 -f 3938/3938/3938 3941/3941/3941 3942/3942/3942 -f 3943/3943/3943 3944/3944/3944 3945/3945/3945 -f 3946/3946/3946 3947/3947/3947 3948/3948/3948 -f 3946/3946/3946 3948/3948/3948 3949/3949/3949 -f 3950/3950/3950 3951/3951/3951 3952/3952/3952 -f 3950/3950/3950 3952/3952/3952 3953/3953/3953 -f 3954/3954/3954 3955/3955/3955 3956/3956/3956 -g charts -o chart0000 -s off -f 3935/3935/3935 3936/3936/3936 3937/3937/3937 -o chart0001 -s off -f 3938/3938/3938 3939/3939/3939 3940/3940/3940 -f 3938/3938/3938 3940/3940/3940 3941/3941/3941 -f 3938/3938/3938 3941/3941/3941 3942/3942/3942 -o chart0002 -s off -f 3943/3943/3943 3944/3944/3944 3945/3945/3945 -o chart0003 -s off -f 3946/3946/3946 3947/3947/3947 3948/3948/3948 -f 3946/3946/3946 3948/3948/3948 3949/3949/3949 -o chart0004 -s off -f 3950/3950/3950 3951/3951/3951 3952/3952/3952 -f 3950/3950/3950 3952/3952/3952 3953/3953/3953 -o chart0005 -s off -f 3954/3954/3954 3955/3955/3955 3956/3956/3956 -v 10826.5 24097.8 1960.95 -vt 0.195761 0.637675 -v 10826.5 24097.8 2557.2 -vt 0.195761 0.632729 -v 10781.5 24097.8 2557.2 -vt 0.194929 0.632729 -v 10781.5 24097.8 1960.95 -vt 0.194929 0.637675 -o mesh774 -s off -f 3957/3957/3957 3958/3958/3958 3959/3959/3959 -f 3957/3957/3957 3959/3959/3959 3960/3960/3960 -g charts -o chart0000 -s off -f 3957/3957/3957 3958/3958/3958 3959/3959/3959 -f 3957/3957/3957 3959/3959/3959 3960/3960/3960 -v 10826.5 24097.8 1960.95 -vt 0.998753 0.77535 -v 10781.5 24097.8 1960.95 -vt 0.997922 0.77535 -v 10781.5 23738.7 1960.95 -vt 0.997922 0.772053 -v 10826.5 23738.7 1960.95 -vt 0.998753 0.772053 -o mesh775 -s off -f 3961/3961/3961 3962/3962/3962 3963/3963/3963 -f 3961/3961/3961 3963/3963/3963 3964/3964/3964 -g charts -o chart0000 -s off -f 3961/3961/3961 3962/3962/3962 3963/3963/3963 -f 3961/3961/3961 3963/3963/3963 3964/3964/3964 -v 10826.5 23738.7 1934.7 -vt 0.779302 0.159522 -v 10781.5 23738.7 1934.7 -vt 0.780133 0.159522 -v 10781.5 23738.7 1960.95 -vt 0.780133 0.160346 -v 10826.5 23738.7 1960.95 -vt 0.779302 0.160346 -o mesh776 -s off -f 3965/3965/3965 3966/3966/3966 3967/3967/3967 -f 3965/3965/3965 3967/3967/3967 3968/3968/3968 -g charts -o chart0000 -s off -f 3965/3965/3965 3966/3966/3966 3967/3967/3967 -f 3965/3965/3965 3967/3967/3967 3968/3968/3968 -v 10826.5 23738.7 1934.7 -vt 0.997091 0.617065 -v 10781.5 23738.7 1934.7 -vt 0.997922 0.617065 -v 10781.5 24828.3 1934.7 -vt 0.997922 0.607997 -v 10826.5 24828.3 1934.7 -vt 0.997091 0.607997 -o mesh777 -s off -f 3969/3969/3969 3970/3970/3970 3971/3971/3971 -f 3969/3969/3969 3971/3971/3971 3972/3972/3972 -g charts -o chart0000 -s off -f 3969/3969/3969 3970/3970/3970 3971/3971/3971 -f 3969/3969/3969 3971/3971/3971 3972/3972/3972 -v 10826.5 24828.3 1960.95 -vt 0.00955935 0.14798 -v 10781.5 24828.3 1960.95 -vt 0.00955935 0.147156 -v 10781.5 24469.2 1960.95 -vt 0.00623441 0.147156 -v 10826.5 24469.2 1960.95 -vt 0.00623441 0.14798 -o mesh778 -s off -f 3973/3973/3973 3974/3974/3974 3975/3975/3975 -f 3973/3973/3973 3975/3975/3975 3976/3976/3976 -g charts -o chart0000 -s off -f 3973/3973/3973 3974/3974/3974 3975/3975/3975 -f 3973/3973/3973 3975/3975/3975 3976/3976/3976 -v 10826.5 24469.2 1960.95 -vt 0.027847 0.49258 -v 10781.5 24469.2 1960.95 -vt 0.027847 0.493405 -v 10781.5 24469.2 2557.2 -vt 0.0228595 0.493405 -v 10826.5 24469.2 2557.2 -vt 0.0228595 0.49258 -o mesh779 -s off -f 3977/3977/3977 3978/3978/3978 3979/3979/3979 -f 3977/3977/3977 3979/3979/3979 3980/3980/3980 -g charts -o chart0000 -s off -f 3977/3977/3977 3978/3978/3978 3979/3979/3979 -f 3977/3977/3977 3979/3979/3979 3980/3980/3980 -v 10826.5 24446.3 2557.2 -vt 0.593101 0.970734 -v 10781.5 24446.3 2557.2 -vt 0.593101 0.971558 -v 10781.5 24469.2 2557.2 -vt 0.593932 0.971558 -v 10826.5 24469.2 2557.2 -vt 0.593932 0.970734 -o mesh780 -s off -f 3981/3981/3981 3982/3982/3982 3983/3983/3983 -f 3981/3981/3981 3983/3983/3983 3984/3984/3984 -g charts -o chart0000 -s off -f 3981/3981/3981 3982/3982/3982 3983/3983/3983 -f 3981/3981/3981 3983/3983/3983 3984/3984/3984 -v 10826.5 24446.3 2557.2 -vt 0.883209 0.612943 -v 10781.5 24446.3 2557.2 -vt 0.883209 0.612119 -v 10781.5 24446.3 1960.95 -vt 0.878221 0.612119 -v 10826.5 24446.3 1960.95 -vt 0.878221 0.612943 -o mesh781 -s off -f 3985/3985/3985 3986/3986/3986 3987/3987/3987 -f 3985/3985/3985 3987/3987/3987 3988/3988/3988 -g charts -o chart0000 -s off -f 3985/3985/3985 3986/3986/3986 3987/3987/3987 -f 3985/3985/3985 3987/3987/3987 3988/3988/3988 -v 10826.5 24446.3 1960.95 -vt 0.309642 0.523083 -v 10781.5 24446.3 1960.95 -vt 0.308811 0.523083 -v 10781.5 24120.7 1960.95 -vt 0.308811 0.519786 -v 10826.5 24120.7 1960.95 -vt 0.309642 0.519786 -o mesh782 -s off -f 3989/3989/3989 3990/3990/3990 3991/3991/3991 -f 3989/3989/3989 3991/3991/3991 3992/3992/3992 -g charts -o chart0000 -s off -f 3989/3989/3989 3990/3990/3990 3991/3991/3991 -f 3989/3989/3989 3991/3991/3991 3992/3992/3992 -v 10781.5 24120.7 1960.95 -vt 0.353699 0.924567 -v 10781.5 24120.7 2557.2 -vt 0.348712 0.924567 -v 10826.5 24120.7 2557.2 -vt 0.348712 0.923743 -v 10826.5 24120.7 1960.95 -vt 0.353699 0.923743 -o mesh783 -s off -f 3993/3993/3993 3994/3994/3994 3995/3995/3995 -f 3993/3993/3993 3995/3995/3995 3996/3996/3996 -g charts -o chart0000 -s off -f 3993/3993/3993 3994/3994/3994 3995/3995/3995 -f 3993/3993/3993 3995/3995/3995 3996/3996/3996 -v 10826.5 24097.8 2557.2 -vt 0.653782 0.990519 -v 10781.5 24097.8 2557.2 -vt 0.653782 0.991344 -v 10781.5 24120.7 2557.2 -vt 0.654613 0.991344 -v 10826.5 24120.7 2557.2 -vt 0.654613 0.990519 -o mesh784 -s off -f 3997/3997/3997 3998/3998/3998 3999/3999/3999 -f 3997/3997/3997 3999/3999/3999 4000/4000/4000 -g charts -o chart0000 -s off -f 3997/3997/3997 3998/3998/3998 3999/3999/3999 -f 3997/3997/3997 3999/3999/3999 4000/4000/4000 -v 10781.5 23738.7 1934.7 -vt 0.943059 0.336768 -v 10781.5 23738.7 1960.95 -vt 0.942228 0.336751 -v 10781.5 24097.8 1960.95 -vt 0.943059 0.333471 -v 10781.5 23738.7 1934.7 -vt 0.634663 0.607997 -v 10781.5 24097.8 1960.95 -vt 0.63217 0.60962 -v 10781.5 24097.8 2557.2 -vt 0.634663 0.613767 -v 10781.5 23738.7 1934.7 -vt 0.397755 0.832234 -v 10781.5 24097.8 2557.2 -vt 0.392768 0.829121 -v 10781.5 24120.7 2557.2 -vt 0.392775 0.828935 -v 10781.5 24120.7 1960.95 -vt 0.397657 0.829115 -v 10781.5 24446.3 1960.95 -vt 0.397756 0.826463 -v 10781.5 23738.7 1934.7 -vt 0.643807 0.800907 -v 10781.5 24446.3 1960.95 -vt 0.639651 0.805226 -v 10781.5 24446.3 2557.2 -vt 0.643807 0.808326 -v 10781.5 23738.7 1934.7 -vt 0.634663 0.431575 -v 10781.5 24446.3 2557.2 -vt 0.640601 0.436521 -v 10781.5 24469.2 2557.2 -vt 0.640793 0.436521 -v 10781.5 24469.2 1960.95 -vt 0.640793 0.431783 -v 10781.5 24828.3 1960.95 -vt 0.643807 0.431783 -v 10781.5 24828.3 1934.7 -vt 0.643807 0.431575 -o mesh785 -s off -f 4001/4001/4001 4002/4002/4002 4003/4003/4003 -f 4004/4004/4004 4005/4005/4005 4006/4006/4006 -f 4007/4007/4007 4008/4008/4008 4009/4009/4009 -f 4007/4007/4007 4009/4009/4009 4010/4010/4010 -f 4007/4007/4007 4010/4010/4010 4011/4011/4011 -f 4012/4012/4012 4013/4013/4013 4014/4014/4014 -f 4015/4015/4015 4016/4016/4016 4017/4017/4017 -f 4015/4015/4015 4017/4017/4017 4018/4018/4018 -f 4015/4015/4015 4018/4018/4018 4019/4019/4019 -f 4015/4015/4015 4019/4019/4019 4020/4020/4020 -g charts -o chart0000 -s off -f 4001/4001/4001 4002/4002/4002 4003/4003/4003 -o chart0001 -s off -f 4004/4004/4004 4005/4005/4005 4006/4006/4006 -o chart0002 -s off -f 4007/4007/4007 4008/4008/4008 4009/4009/4009 -f 4007/4007/4007 4009/4009/4009 4010/4010/4010 -f 4007/4007/4007 4010/4010/4010 4011/4011/4011 -o chart0003 -s off -f 4012/4012/4012 4013/4013/4013 4014/4014/4014 -o chart0004 -s off -f 4015/4015/4015 4016/4016/4016 4017/4017/4017 -f 4015/4015/4015 4017/4017/4017 4018/4018/4018 -f 4015/4015/4015 4018/4018/4018 4019/4019/4019 -f 4015/4015/4015 4019/4019/4019 4020/4020/4020 -v 10691.5 24097.8 2557.2 -vt 0.168329 0.820692 -v 10691.5 24120.7 2557.2 -vt 0.168329 0.821517 -v 10781.5 24120.7 2557.2 -vt 0.167498 0.821517 -v 10781.5 24097.8 2557.2 -vt 0.167498 0.820692 -o mesh786 -s off -f 4021/4021/4021 4022/4022/4022 4023/4023/4023 -f 4021/4021/4021 4023/4023/4023 4024/4024/4024 -g charts -o chart0000 -s off -f 4021/4021/4021 4022/4022/4022 4023/4023/4023 -f 4021/4021/4021 4023/4023/4023 4024/4024/4024 -v 10691.5 24446.3 2557.2 -vt 0.405237 0.666529 -v 10691.5 24469.2 2557.2 -vt 0.406068 0.666529 -v 10781.5 24469.2 2557.2 -vt 0.406068 0.665705 -v 10781.5 24446.3 2557.2 -vt 0.405237 0.665705 -o mesh787 -s off -f 4025/4025/4025 4026/4026/4026 4027/4027/4027 -f 4025/4025/4025 4027/4027/4027 4028/4028/4028 -g charts -o chart0000 -s off -f 4025/4025/4025 4026/4026/4026 4027/4027/4027 -f 4025/4025/4025 4027/4027/4027 4028/4028/4028 -v 10691.5 24828.3 1960.95 -vt 0.0793848 0.370569 -v 10691.5 24828.3 1934.7 -vt 0.0793848 0.371393 -v 10781.5 24828.3 1934.7 -vt 0.0785536 0.371393 -v 10781.5 24828.3 1960.95 -vt 0.0785536 0.370569 -o mesh788 -s off -f 4029/4029/4029 4030/4030/4030 4031/4031/4031 -f 4029/4029/4029 4031/4031/4031 4032/4032/4032 -g charts -o chart0000 -s off -f 4029/4029/4029 4030/4030/4030 4031/4031/4031 -f 4029/4029/4029 4031/4031/4031 4032/4032/4032 -v 10691.5 18433.5 -285.3 -vt 0.959684 0.129019 -v 10691.5 18464.1 -247.8 -vt 0.959943 0.129843 -v 10691.5 19513.5 -285.3 -vt 0.968828 0.129019 -v 10691.5 19482.9 -247.8 -vt 0.968569 0.129843 -o mesh789 -s off -f 4033/4033/4033 4034/4034/4034 4035/4035/4035 -f 4036/4036/4036 4035/4035/4035 4034/4034/4034 -g charts -o chart0000 -s off -f 4033/4033/4033 4034/4034/4034 4035/4035/4035 -f 4036/4036/4036 4035/4035/4035 4034/4034/4034 -v 10691.5 18464.1 -247.8 -vt 0.106816 0.951249 -v 10691.5 18433.5 -285.3 -vt 0.107647 0.950948 -v 10691.5 18433.5 2594.7 -vt 0.107647 0.974031 -o mesh790 -s off -f 4037/4037/4037 4038/4038/4038 4039/4039/4039 -g charts -o chart0000 -s off -f 4037/4037/4037 4038/4038/4038 4039/4039/4039 -v 10691.5 18464.1 -247.8 -vt 0.835827 0.3277 -v 10691.5 18433.5 2594.7 -vt 0.835827 0.349959 -v 10691.5 18464.1 2557.2 -vt 0.834996 0.349663 -o mesh791 -s off -f 4040/4040/4040 4041/4041/4041 4042/4042/4042 -g charts -o chart0000 -s off -f 4040/4040/4040 4041/4041/4041 4042/4042/4042 -v 10691.5 18464.1 2557.2 -vt 0.458437 0.86057 -v 10691.5 18433.5 2594.7 -vt 0.459268 0.860264 -v 10691.5 18799.9 2557.2 -vt 0.459268 0.863561 -o mesh792 -s off -f 4043/4043/4043 4044/4044/4044 4045/4045/4045 -g charts -o chart0000 -s off -f 4043/4043/4043 4044/4044/4044 4045/4045/4045 -v 10691.5 18799.9 2557.2 -vt 0.0532 0.411789 -v 10691.5 18433.5 2594.7 -vt 0.0502909 0.412613 -v 10691.5 18821.3 2557.2 -vt 0.0533695 0.411815 -v 10691.5 19125.7 2557.2 -vt 0.0557778 0.412182 -v 10691.5 19147.1 2557.2 -vt 0.0559472 0.412208 -v 10691.5 19482.9 2557.2 -vt 0.0586034 0.412613 -o mesh793 -s off -f 4046/4046/4046 4047/4047/4047 4048/4048/4048 -f 4048/4048/4048 4047/4047/4047 4049/4049/4049 -f 4049/4049/4049 4047/4047/4047 4050/4050/4050 -f 4050/4050/4050 4047/4047/4047 4051/4051/4051 -g charts -o chart0000 -s off -f 4046/4046/4046 4047/4047/4047 4048/4048/4048 -f 4048/4048/4048 4047/4047/4047 4049/4049/4049 -f 4049/4049/4049 4047/4047/4047 4050/4050/4050 -f 4050/4050/4050 4047/4047/4047 4051/4051/4051 -v 10691.5 19513.5 -285.3 -vt 0.225686 0.762984 -v 10691.5 19482.9 -247.8 -vt 0.225383 0.76216 -v 10691.5 19513.5 2594.7 -vt 0.202411 0.762984 -o mesh794 -s off -f 4052/4052/4052 4053/4053/4053 4054/4054/4054 -g charts -o chart0000 -s off -f 4052/4052/4052 4053/4053/4053 4054/4054/4054 -v 10691.5 19513.5 2594.7 -vt 0.565669 0.944353 -v 10691.5 19482.9 -247.8 -vt 0.565669 0.966612 -v 10691.5 19482.9 1934.7 -vt 0.564848 0.949523 -v 10691.5 19482.9 1960.95 -vt 0.564838 0.949318 -o mesh795 -s off -f 4055/4055/4055 4056/4056/4056 4057/4057/4057 -f 4055/4055/4055 4057/4057/4057 4058/4058/4058 -g charts -o chart0000 -s off -f 4055/4055/4055 4056/4056/4056 4057/4057/4057 -f 4055/4055/4055 4057/4057/4057 4058/4058/4058 -v 10691.5 19513.5 2594.7 -vt 0.894015 0.283182 -v 10691.5 19482.9 1960.95 -vt 0.894015 0.288953 -v 10691.5 19482.9 2557.2 -vt 0.893184 0.283536 -o mesh796 -s off -f 4059/4059/4059 4060/4060/4060 4061/4061/4061 -g charts -o chart0000 -s off -f 4059/4059/4059 4060/4060/4060 4061/4061/4061 -v 10691.5 19513.5 2594.7 -vt 0.164173 0.487634 -v 10691.5 19482.9 2557.2 -vt 0.163914 0.48681 -v 10691.5 18433.5 2594.7 -vt 0.155029 0.487634 -o mesh797 -s off -f 4062/4062/4062 4063/4063/4063 4064/4064/4064 -g charts -o chart0000 -s off -f 4062/4062/4062 4063/4063/4063 4064/4064/4064 -v 10856.5 19513.5 -285.3 -vt 0.383624 0.347485 -v 10856.5 19482.9 -247.8 -vt 0.383365 0.346661 -v 10856.5 18433.5 -285.3 -vt 0.37448 0.347485 -v 10856.5 18464.1 -247.8 -vt 0.37474 0.346661 -o mesh798 -s off -f 4065/4065/4065 4066/4066/4066 4067/4067/4067 -f 4068/4068/4068 4067/4067/4067 4066/4066/4066 -g charts -o chart0000 -s off -f 4065/4065/4065 4066/4066/4066 4067/4067/4067 -f 4068/4068/4068 4067/4067/4067 4066/4066/4066 -v 10856.5 19482.9 -247.8 -vt 0.0128845 0.849847 -v 10856.5 19513.5 -285.3 -vt 0.0137156 0.849547 -v 10856.5 19513.5 2594.7 -vt 0.0137156 0.87263 -o mesh799 -s off -f 4069/4069/4069 4070/4070/4070 4071/4071/4071 -g charts -o chart0000 -s off -f 4069/4069/4069 4070/4070/4070 4071/4071/4071 -v 10856.5 19482.9 -247.8 -vt 0.835827 0.974856 -v 10856.5 19513.5 2594.7 -vt 0.858271 0.974856 -v 10856.5 19482.9 1934.7 -vt 0.853058 0.974041 -v 10856.5 19482.9 1960.95 -vt 0.853265 0.974031 -o mesh800 -s off -f 4072/4072/4072 4073/4073/4073 4074/4074/4074 -f 4074/4074/4074 4073/4073/4073 4075/4075/4075 -g charts -o chart0000 -s off -f 4072/4072/4072 4073/4073/4073 4074/4074/4074 -f 4074/4074/4074 4073/4073/4073 4075/4075/4075 -v 10856.5 19482.9 1960.95 -vt 0.761014 0.531327 -v 10856.5 19513.5 2594.7 -vt 0.761014 0.537098 -v 10856.5 19482.9 2557.2 -vt 0.760183 0.536744 -o mesh801 -s off -f 4076/4076/4076 4077/4077/4077 4078/4078/4078 -g charts -o chart0000 -s off -f 4076/4076/4076 4077/4077/4077 4078/4078/4078 -v 10856.5 19482.9 2557.2 -vt 0.97714 0.202679 -v 10856.5 19513.5 2594.7 -vt 0.977972 0.202391 -v 10856.5 19147.1 2557.2 -vt 0.977922 0.205508 -v 10856.5 19125.7 2557.2 -vt 0.977972 0.205688 -o mesh802 -s off -f 4079/4079/4079 4080/4080/4080 4081/4081/4081 -f 4081/4081/4081 4080/4080/4080 4082/4082/4082 -g charts -o chart0000 -s off -f 4079/4079/4079 4080/4080/4080 4081/4081/4081 -f 4081/4081/4081 4080/4080/4080 4082/4082/4082 -v 10856.5 19125.7 2557.2 -vt 0.169992 0.338459 -v 10856.5 19513.5 2594.7 -vt 0.16916 0.341715 -v 10856.5 18821.3 2557.2 -vt 0.169992 0.335903 -v 10856.5 18799.9 2557.2 -vt 0.169991 0.335723 -v 10856.5 18464.1 2557.2 -vt 0.169992 0.332903 -v 10856.5 18433.5 2594.7 -vt 0.16916 0.332646 -o mesh803 -s off -f 4083/4083/4083 4084/4084/4084 4085/4085/4085 -f 4085/4085/4085 4084/4084/4084 4086/4086/4086 -f 4086/4086/4086 4084/4084/4084 4087/4087/4087 -f 4088/4088/4088 4087/4087/4087 4084/4084/4084 -g charts -o chart0000 -s off -f 4083/4083/4083 4084/4084/4084 4085/4085/4085 -f 4085/4085/4085 4084/4084/4084 4086/4086/4086 -f 4086/4086/4086 4084/4084/4084 4087/4087/4087 -f 4088/4088/4088 4087/4087/4087 4084/4084/4084 -v 10856.5 18433.5 -285.3 -vt 0.114298 0.954246 -v 10856.5 18464.1 -247.8 -vt 0.113466 0.953945 -v 10856.5 18433.5 2594.7 -vt 0.114298 0.931162 -o mesh804 -s off -f 4089/4089/4089 4090/4090/4090 4091/4091/4091 -g charts -o chart0000 -s off -f 4089/4089/4089 4090/4090/4090 4091/4091/4091 -v 10856.5 18433.5 2594.7 -vt 0.257273 0.846249 -v 10856.5 18464.1 -247.8 -vt 0.279717 0.846249 -v 10856.5 18464.1 2557.2 -vt 0.257572 0.845425 -o mesh805 -s off -f 4092/4092/4092 4093/4093/4093 4094/4094/4094 -g charts -o chart0000 -s off -f 4092/4092/4092 4093/4093/4093 4094/4094/4094 -v 10691.5 19513.5 2594.7 -vt 0.488362 0.989695 -v 10691.5 18433.5 2594.7 -vt 0.497506 0.989695 -v 10856.5 18433.5 2594.7 -vt 0.497506 0.991344 -v 10856.5 19513.5 2594.7 -vt 0.488362 0.991344 -o mesh806 -s off -f 4095/4095/4095 4096/4096/4096 4097/4097/4097 -f 4095/4095/4095 4097/4097/4097 4098/4098/4098 -g charts -o chart0000 -s off -f 4095/4095/4095 4096/4096/4096 4097/4097/4097 -f 4095/4095/4095 4097/4097/4097 4098/4098/4098 -v 10691.5 18433.5 2594.7 -vt 0.972153 0.444765 -v 10691.5 18433.5 -285.3 -vt 0.972153 0.467848 -v 10774 18433.5 -285.3 -vt 0.972984 0.467848 -v 10856.5 18433.5 -285.3 -vt 0.973815 0.467848 -v 10856.5 18433.5 2594.7 -vt 0.973815 0.444765 -o mesh807 -s off -f 4099/4099/4099 4100/4100/4100 4101/4101/4101 -f 4099/4099/4099 4101/4101/4101 4102/4102/4102 -f 4099/4099/4099 4102/4102/4102 4103/4103/4103 -g charts -o chart0000 -s off -f 4099/4099/4099 4100/4100/4100 4101/4101/4101 -f 4099/4099/4099 4101/4101/4101 4102/4102/4102 -f 4099/4099/4099 4102/4102/4102 4103/4103/4103 -v 10691.5 18433.5 -285.3 -vt 0.170823 0.924567 -v 10691.5 19513.5 -285.3 -vt 0.161679 0.924567 -v 10856.5 19513.5 -285.3 -vt 0.161679 0.922918 -v 10856.5 18433.5 -285.3 -vt 0.170823 0.922918 -v 10774 18433.5 -285.3 -vt 0.170823 0.923743 -o mesh808 -s off -f 4104/4104/4104 4105/4105/4105 4106/4106/4106 -f 4104/4104/4104 4106/4106/4106 4107/4107/4107 -f 4104/4104/4104 4107/4107/4107 4108/4108/4108 -g charts -o chart0000 -s off -f 4104/4104/4104 4105/4105/4105 4106/4106/4106 -f 4104/4104/4104 4106/4106/4106 4107/4107/4107 -f 4104/4104/4104 4107/4107/4107 4108/4108/4108 -v 10691.5 19513.5 -285.3 -vt 0.529094 0.974856 -v 10691.5 19513.5 2594.7 -vt 0.505819 0.974856 -v 10856.5 19513.5 2594.7 -vt 0.505819 0.973207 -v 10856.5 19513.5 -285.3 -vt 0.529094 0.973207 -o mesh809 -s off -f 4109/4109/4109 4110/4110/4110 4111/4111/4111 -f 4109/4109/4109 4111/4111/4111 4112/4112/4112 -g charts -o chart0000 -s off -f 4109/4109/4109 4110/4110/4110 4111/4111/4111 -f 4109/4109/4109 4111/4111/4111 4112/4112/4112 -v 10856.5 18464.1 -247.8 -vt 0.342893 0.602226 -v 10826.5 18464.1 1934.7 -vt 0.32543 0.602526 -v 10856.5 18464.1 2557.2 -vt 0.320449 0.602226 -v 10691.5 18464.1 -247.8 -vt 0.342893 0.603875 -v 10781.5 18464.1 1934.7 -vt 0.32543 0.602975 -v 10781.5 18464.1 1960.95 -vt 0.32522 0.602975 -v 10691.5 18464.1 2557.2 -vt 0.320449 0.603875 -v 10826.5 18464.1 1960.95 -vt 0.32522 0.602526 -o mesh810 -s off -f 4113/4113/4113 4114/4114/4114 4115/4115/4115 -f 4114/4114/4114 4113/4113/4113 4116/4116/4116 -f 4114/4114/4114 4116/4116/4116 4117/4117/4117 -f 4117/4117/4117 4116/4116/4116 4118/4118/4118 -f 4118/4118/4118 4116/4116/4116 4119/4119/4119 -f 4115/4115/4115 4120/4120/4120 4119/4119/4119 -f 4120/4120/4120 4115/4115/4115 4114/4114/4114 -f 4119/4119/4119 4120/4120/4120 4118/4118/4118 -g charts -o chart0000 -s off -f 4113/4113/4113 4114/4114/4114 4115/4115/4115 -f 4114/4114/4114 4113/4113/4113 4116/4116/4116 -f 4114/4114/4114 4116/4116/4116 4117/4117/4117 -f 4117/4117/4117 4116/4116/4116 4118/4118/4118 -f 4118/4118/4118 4116/4116/4116 4119/4119/4119 -f 4115/4115/4115 4120/4120/4120 4119/4119/4119 -f 4120/4120/4120 4115/4115/4115 4114/4114/4114 -f 4119/4119/4119 4120/4120/4120 4118/4118/4118 -v 10691.5 18464.1 2557.2 -vt 0.807564 0.678071 -v 10691.5 18799.9 2557.2 -vt 0.807564 0.674773 -v 10781.5 18799.9 2557.2 -vt 0.806658 0.674773 -v 10826.5 18799.9 2557.2 -vt 0.806204 0.674773 -v 10856.5 18799.9 2557.2 -vt 0.805902 0.674773 -v 10856.5 18464.1 2557.2 -vt 0.805902 0.678071 -o mesh811 -s off -f 4121/4121/4121 4122/4122/4122 4123/4123/4123 -f 4121/4121/4121 4123/4123/4123 4124/4124/4124 -f 4121/4121/4121 4124/4124/4124 4125/4125/4125 -f 4121/4121/4121 4125/4125/4125 4126/4126/4126 -g charts -o chart0000 -s off -f 4121/4121/4121 4122/4122/4122 4123/4123/4123 -f 4121/4121/4121 4123/4123/4123 4124/4124/4124 -f 4121/4121/4121 4124/4124/4124 4125/4125/4125 -f 4121/4121/4121 4125/4125/4125 4126/4126/4126 -v 10856.5 18799.9 2557.2 -vt 0.654613 0.903957 -v 10826.5 18799.9 2557.2 -vt 0.655445 0.903957 -v 10826.5 18821.3 2557.2 -vt 0.655445 0.904781 -v 10856.5 18821.3 2557.2 -vt 0.654613 0.904781 -o mesh812 -s off -f 4127/4127/4127 4128/4128/4128 4129/4129/4129 -f 4127/4127/4127 4129/4129/4129 4130/4130/4130 -g charts -o chart0000 -s off -f 4127/4127/4127 4128/4128/4128 4129/4129/4129 -f 4127/4127/4127 4129/4129/4129 4130/4130/4130 -v 10691.5 18821.3 2557.2 -vt 0.641313 0.76216 -v 10691.5 19125.7 2557.2 -vt 0.63882 0.76216 -v 10781.5 19125.7 2557.2 -vt 0.63882 0.761261 -v 10826.5 19125.7 2557.2 -vt 0.63882 0.760811 -v 10856.5 19125.7 2557.2 -vt 0.63882 0.760511 -v 10856.5 18821.3 2557.2 -vt 0.641313 0.760511 -v 10826.5 18821.3 2557.2 -vt 0.641313 0.760811 -v 10781.5 18821.3 2557.2 -vt 0.641313 0.761261 -o mesh813 -s off -f 4131/4131/4131 4132/4132/4132 4133/4133/4133 -f 4131/4131/4131 4133/4133/4133 4134/4134/4134 -f 4131/4131/4131 4134/4134/4134 4135/4135/4135 -f 4131/4131/4131 4135/4135/4135 4136/4136/4136 -f 4131/4131/4131 4136/4136/4136 4137/4137/4137 -f 4131/4131/4131 4137/4137/4137 4138/4138/4138 -g charts -o chart0000 -s off -f 4131/4131/4131 4132/4132/4132 4133/4133/4133 -f 4131/4131/4131 4133/4133/4133 4134/4134/4134 -f 4131/4131/4131 4134/4134/4134 4135/4135/4135 -f 4131/4131/4131 4135/4135/4135 4136/4136/4136 -f 4131/4131/4131 4136/4136/4136 4137/4137/4137 -f 4131/4131/4131 4137/4137/4137 4138/4138/4138 -v 10856.5 19125.7 2557.2 -vt 0.606401 0.50742 -v 10826.5 19125.7 2557.2 -vt 0.606401 0.508244 -v 10826.5 19147.1 2557.2 -vt 0.607232 0.508244 -v 10856.5 19147.1 2557.2 -vt 0.607232 0.50742 -o mesh814 -s off -f 4139/4139/4139 4140/4140/4140 4141/4141/4141 -f 4139/4139/4139 4141/4141/4141 4142/4142/4142 -g charts -o chart0000 -s off -f 4139/4139/4139 4140/4140/4140 4141/4141/4141 -f 4139/4139/4139 4141/4141/4141 4142/4142/4142 -v 10691.5 19147.1 2557.2 -vt 0.880715 0.434872 -v 10691.5 19482.9 2557.2 -vt 0.880715 0.431575 -v 10856.5 19482.9 2557.2 -vt 0.879052 0.431575 -v 10856.5 19147.1 2557.2 -vt 0.879052 0.434872 -v 10826.5 19147.1 2557.2 -vt 0.879355 0.434872 -v 10781.5 19147.1 2557.2 -vt 0.879808 0.434872 -o mesh815 -s off -f 4143/4143/4143 4144/4144/4144 4145/4145/4145 -f 4143/4143/4143 4145/4145/4145 4146/4146/4146 -f 4143/4143/4143 4146/4146/4146 4147/4147/4147 -f 4143/4143/4143 4147/4147/4147 4148/4148/4148 -g charts -o chart0000 -s off -f 4143/4143/4143 4144/4144/4144 4145/4145/4145 -f 4143/4143/4143 4145/4145/4145 4146/4146/4146 -f 4143/4143/4143 4146/4146/4146 4147/4147/4147 -f 4143/4143/4143 4147/4147/4147 4148/4148/4148 -v 10691.5 19482.9 2557.2 -vt 0.0627597 0.419208 -v 10691.5 19482.9 1960.95 -vt 0.0579889 0.419208 -v 10781.5 19482.9 1960.95 -vt 0.0579889 0.418309 -v 10826.5 19482.9 1960.95 -vt 0.0579889 0.41786 -v 10856.5 19482.9 1960.95 -vt 0.0579889 0.41756 -v 10856.5 19482.9 2557.2 -vt 0.0627597 0.41756 -v 10826.5 19482.9 1934.7 -vt 0.0577789 0.41786 -v 10856.5 19482.9 1934.7 -vt 0.0577789 0.41756 -v 10691.5 19482.9 1934.7 -vt 0.0577789 0.419208 -v 10691.5 19482.9 -247.8 -vt 0.0403159 0.419208 -v 10856.5 19482.9 -247.8 -vt 0.0403159 0.41756 -v 10781.5 19482.9 1934.7 -vt 0.0577789 0.418309 -o mesh816 -s off -f 4149/4149/4149 4150/4150/4150 4151/4151/4151 -f 4149/4149/4149 4151/4151/4151 4152/4152/4152 -f 4149/4149/4149 4152/4152/4152 4153/4153/4153 -f 4149/4149/4149 4153/4153/4153 4154/4154/4154 -f 4153/4153/4153 4152/4152/4152 4155/4155/4155 -f 4153/4153/4153 4155/4155/4155 4156/4156/4156 -f 4157/4157/4157 4158/4158/4158 4159/4159/4159 -f 4157/4157/4157 4159/4159/4159 4156/4156/4156 -f 4157/4157/4157 4156/4156/4156 4155/4155/4155 -f 4157/4157/4157 4155/4155/4155 4160/4160/4160 -f 4152/4152/4152 4151/4151/4151 4160/4160/4160 -f 4152/4152/4152 4160/4160/4160 4155/4155/4155 -g charts -o chart0000 -s off -f 4149/4149/4149 4150/4150/4150 4151/4151/4151 -f 4149/4149/4149 4151/4151/4151 4152/4152/4152 -f 4149/4149/4149 4152/4152/4152 4153/4153/4153 -f 4149/4149/4149 4153/4153/4153 4154/4154/4154 -f 4153/4153/4153 4152/4152/4152 4155/4155/4155 -f 4153/4153/4153 4155/4155/4155 4156/4156/4156 -f 4157/4157/4157 4158/4158/4158 4159/4159/4159 -f 4157/4157/4157 4159/4159/4159 4156/4156/4156 -f 4157/4157/4157 4156/4156/4156 4155/4155/4155 -f 4157/4157/4157 4155/4155/4155 4160/4160/4160 -f 4152/4152/4152 4151/4151/4151 4160/4160/4160 -f 4152/4152/4152 4160/4160/4160 4155/4155/4155 -v 10691.5 19482.9 -247.8 -vt 0.991272 0.732481 -v 10691.5 18464.1 -247.8 -vt 0.991272 0.740725 -v 10856.5 18464.1 -247.8 -vt 0.992934 0.740725 -v 10856.5 19482.9 -247.8 -vt 0.992934 0.732481 -o mesh817 -s off -f 4161/4161/4161 4162/4162/4162 4163/4163/4163 -f 4161/4161/4161 4163/4163/4163 4164/4164/4164 -g charts -o chart0000 -s off -f 4161/4161/4161 4162/4162/4162 4163/4163/4163 -f 4161/4161/4161 4163/4163/4163 4164/4164/4164 -v 10826.5 18799.9 2557.2 -vt 0.931421 0.205688 -v 10826.5 18799.9 1960.95 -vt 0.931421 0.210635 -v 10826.5 18464.1 1960.95 -vt 0.928096 0.210635 -v 10826.5 18799.9 2557.2 -vt 0.0965953 0.50742 -v 10826.5 18464.1 1960.95 -vt 0.0993349 0.512157 -v 10826.5 18464.1 1934.7 -vt 0.0993349 0.512366 -v 10826.5 19482.9 1934.7 -vt 0.0910224 0.512366 -v 10826.5 19482.9 1960.95 -vt 0.0910224 0.512157 -v 10826.5 18799.9 2557.2 -vt 0.900665 0.863561 -v 10826.5 19482.9 1960.95 -vt 0.893184 0.863561 -v 10826.5 19147.1 1960.95 -vt 0.895271 0.861088 -v 10826.5 18799.9 2557.2 -vt 0.148379 0.680544 -v 10826.5 19147.1 1960.95 -vt 0.154198 0.680544 -v 10826.5 19147.1 2557.2 -vt 0.149853 0.678071 -v 10826.5 19125.7 2557.2 -vt 0.149762 0.678223 -v 10826.5 18799.9 2557.2 -vt 0.430174 0.304617 -v 10826.5 19125.7 2557.2 -vt 0.42685 0.304617 -v 10826.5 19125.7 1960.95 -vt 0.42685 0.29967 -v 10826.5 18821.3 1960.95 -vt 0.429956 0.29967 -v 10826.5 18799.9 2557.2 -vt 0.0569409 0.619538 -v 10826.5 18821.3 1960.95 -vt 0.0561097 0.614592 -v 10826.5 18821.3 2557.2 -vt 0.0561097 0.619538 -o mesh818 -s off -f 4165/4165/4165 4166/4166/4166 4167/4167/4167 -f 4168/4168/4168 4169/4169/4169 4170/4170/4170 -f 4168/4168/4168 4170/4170/4170 4171/4171/4171 -f 4168/4168/4168 4171/4171/4171 4172/4172/4172 -f 4173/4173/4173 4174/4174/4174 4175/4175/4175 -f 4176/4176/4176 4177/4177/4177 4178/4178/4178 -f 4176/4176/4176 4178/4178/4178 4179/4179/4179 -f 4180/4180/4180 4181/4181/4181 4182/4182/4182 -f 4180/4180/4180 4182/4182/4182 4183/4183/4183 -f 4184/4184/4184 4185/4185/4185 4186/4186/4186 -g charts -o chart0000 -s off -f 4165/4165/4165 4166/4166/4166 4167/4167/4167 -o chart0001 -s off -f 4168/4168/4168 4169/4169/4169 4170/4170/4170 -f 4168/4168/4168 4170/4170/4170 4171/4171/4171 -f 4168/4168/4168 4171/4171/4171 4172/4172/4172 -o chart0002 -s off -f 4173/4173/4173 4174/4174/4174 4175/4175/4175 -o chart0003 -s off -f 4176/4176/4176 4177/4177/4177 4178/4178/4178 -f 4176/4176/4176 4178/4178/4178 4179/4179/4179 -o chart0004 -s off -f 4180/4180/4180 4181/4181/4181 4182/4182/4182 -f 4180/4180/4180 4182/4182/4182 4183/4183/4183 -o chart0005 -s off -f 4184/4184/4184 4185/4185/4185 4186/4186/4186 -v 10826.5 18799.9 1960.95 -vt 0.238986 0.805853 -v 10826.5 18799.9 2557.2 -vt 0.238986 0.800907 -v 10781.5 18799.9 2557.2 -vt 0.238155 0.800907 -v 10781.5 18799.9 1960.95 -vt 0.238155 0.805853 -o mesh819 -s off -f 4187/4187/4187 4188/4188/4188 4189/4189/4189 -f 4187/4187/4187 4189/4189/4189 4190/4190/4190 -g charts -o chart0000 -s off -f 4187/4187/4187 4188/4188/4188 4189/4189/4189 -f 4187/4187/4187 4189/4189/4189 4190/4190/4190 -v 10826.5 18799.9 1960.95 -vt 0.588113 0.894889 -v 10781.5 18799.9 1960.95 -vt 0.588113 0.894064 -v 10781.5 18464.1 1960.95 -vt 0.584788 0.894064 -v 10826.5 18464.1 1960.95 -vt 0.584788 0.894889 -o mesh820 -s off -f 4191/4191/4191 4192/4192/4192 4193/4193/4193 -f 4191/4191/4191 4193/4193/4193 4194/4194/4194 -g charts -o chart0000 -s off -f 4191/4191/4191 4192/4192/4192 4193/4193/4193 -f 4191/4191/4191 4193/4193/4193 4194/4194/4194 -v 10826.5 18464.1 1934.7 -vt 0.178304 0.370569 -v 10781.5 18464.1 1934.7 -vt 0.179135 0.370569 -v 10781.5 18464.1 1960.95 -vt 0.179135 0.371393 -v 10826.5 18464.1 1960.95 -vt 0.178304 0.371393 -o mesh821 -s off -f 4195/4195/4195 4196/4196/4196 4197/4197/4197 -f 4195/4195/4195 4197/4197/4197 4198/4198/4198 -g charts -o chart0000 -s off -f 4195/4195/4195 4196/4196/4196 4197/4197/4197 -f 4195/4195/4195 4197/4197/4197 4198/4198/4198 -v 10826.5 18464.1 1934.7 -vt 0.900665 0.45136 -v 10781.5 18464.1 1934.7 -vt 0.901496 0.45136 -v 10781.5 19482.9 1934.7 -vt 0.901496 0.443116 -v 10826.5 19482.9 1934.7 -vt 0.900665 0.443116 -o mesh822 -s off -f 4199/4199/4199 4200/4200/4200 4201/4201/4201 -f 4199/4199/4199 4201/4201/4201 4202/4202/4202 -g charts -o chart0000 -s off -f 4199/4199/4199 4200/4200/4200 4201/4201/4201 -f 4199/4199/4199 4201/4201/4201 4202/4202/4202 -v 10826.5 19482.9 1960.95 -vt 0.79842 0.905606 -v 10781.5 19482.9 1960.95 -vt 0.79842 0.904782 -v 10781.5 19147.1 1960.95 -vt 0.795096 0.904782 -v 10826.5 19147.1 1960.95 -vt 0.795096 0.905606 -o mesh823 -s off -f 4203/4203/4203 4204/4204/4204 4205/4205/4205 -f 4203/4203/4203 4205/4205/4205 4206/4206/4206 -g charts -o chart0000 -s off -f 4203/4203/4203 4204/4204/4204 4205/4205/4205 -f 4203/4203/4203 4205/4205/4205 4206/4206/4206 -v 10826.5 19147.1 1960.95 -vt 0.609726 0.440643 -v 10781.5 19147.1 1960.95 -vt 0.609726 0.441467 -v 10781.5 19147.1 2557.2 -vt 0.604738 0.441467 -v 10826.5 19147.1 2557.2 -vt 0.604738 0.440643 -o mesh824 -s off -f 4207/4207/4207 4208/4208/4208 4209/4209/4209 -f 4207/4207/4207 4209/4209/4209 4210/4210/4210 -g charts -o chart0000 -s off -f 4207/4207/4207 4208/4208/4208 4209/4209/4209 -f 4207/4207/4207 4209/4209/4209 4210/4210/4210 -v 10826.5 19125.7 2557.2 -vt 0.852452 0.30709 -v 10781.5 19125.7 2557.2 -vt 0.853283 0.30709 -v 10781.5 19147.1 2557.2 -vt 0.853283 0.307914 -v 10826.5 19147.1 2557.2 -vt 0.852452 0.307914 -o mesh825 -s off -f 4211/4211/4211 4212/4212/4212 4213/4213/4213 -f 4211/4211/4211 4213/4213/4213 4214/4214/4214 -g charts -o chart0000 -s off -f 4211/4211/4211 4212/4212/4212 4213/4213/4213 -f 4211/4211/4211 4213/4213/4213 4214/4214/4214 -v 10826.5 19125.7 2557.2 -vt 0.363674 0.910552 -v 10781.5 19125.7 2557.2 -vt 0.363674 0.909728 -v 10781.5 19125.7 1960.95 -vt 0.358687 0.909728 -v 10826.5 19125.7 1960.95 -vt 0.358687 0.910552 -o mesh826 -s off -f 4215/4215/4215 4216/4216/4216 4217/4217/4217 -f 4215/4215/4215 4217/4217/4217 4218/4218/4218 -g charts -o chart0000 -s off -f 4215/4215/4215 4216/4216/4216 4217/4217/4217 -f 4215/4215/4215 4217/4217/4217 4218/4218/4218 -v 10826.5 19125.7 1960.95 -vt 0.467581 0.52803 -v 10781.5 19125.7 1960.95 -vt 0.467581 0.527205 -v 10781.5 18821.3 1960.95 -vt 0.465087 0.527205 -v 10826.5 18821.3 1960.95 -vt 0.465087 0.52803 -o mesh827 -s off -f 4219/4219/4219 4220/4220/4220 4221/4221/4221 -f 4219/4219/4219 4221/4221/4221 4222/4222/4222 -g charts -o chart0000 -s off -f 4219/4219/4219 4220/4220/4220 4221/4221/4221 -f 4219/4219/4219 4221/4221/4221 4222/4222/4222 -v 10781.5 18821.3 1960.95 -vt 0.672901 0.697032 -v 10781.5 18821.3 2557.2 -vt 0.672901 0.692086 -v 10826.5 18821.3 2557.2 -vt 0.67207 0.692086 -v 10826.5 18821.3 1960.95 -vt 0.67207 0.697032 -o mesh828 -s off -f 4223/4223/4223 4224/4224/4224 4225/4225/4225 -f 4223/4223/4223 4225/4225/4225 4226/4226/4226 -g charts -o chart0000 -s off -f 4223/4223/4223 4224/4224/4224 4225/4225/4225 -f 4223/4223/4223 4225/4225/4225 4226/4226/4226 -v 10826.5 18799.9 2557.2 -vt 0.635495 0.811624 -v 10781.5 18799.9 2557.2 -vt 0.636326 0.811624 -v 10781.5 18821.3 2557.2 -vt 0.636326 0.812448 -v 10826.5 18821.3 2557.2 -vt 0.635495 0.812448 -o mesh829 -s off -f 4227/4227/4227 4228/4228/4228 4229/4229/4229 -f 4227/4227/4227 4229/4229/4229 4230/4230/4230 -g charts -o chart0000 -s off -f 4227/4227/4227 4228/4228/4228 4229/4229/4229 -f 4227/4227/4227 4229/4229/4229 4230/4230/4230 -v 10781.5 18464.1 1934.7 -vt 0.00540316 0.175185 -v 10781.5 18464.1 1960.95 -vt 0.00540316 0.17601 -v 10781.5 18799.9 1960.95 -vt 0.0087281 0.17601 -v 10781.5 18464.1 1934.7 -vt 0.85744 0.991344 -v 10781.5 18799.9 1960.95 -vt 0.854946 0.992833 -v 10781.5 18799.9 2557.2 -vt 0.85744 0.997114 -v 10781.5 18464.1 1934.7 -vt 0.726101 0.792663 -v 10781.5 18799.9 2557.2 -vt 0.721114 0.789524 -v 10781.5 18821.3 2557.2 -vt 0.721121 0.789337 -v 10781.5 18821.3 1960.95 -vt 0.726002 0.789543 -v 10781.5 19125.7 1960.95 -vt 0.726101 0.786892 -v 10781.5 18464.1 1934.7 -vt 0.789277 0.465375 -v 10781.5 19125.7 1960.95 -vt 0.793393 0.461253 -v 10781.5 19125.7 2557.2 -vt 0.796758 0.465375 -v 10781.5 18464.1 1934.7 -vt 0.487531 0.982275 -v 10781.5 19125.7 2557.2 -vt 0.482544 0.976922 -v 10781.5 19147.1 2557.2 -vt 0.482544 0.976748 -v 10781.5 19147.1 1960.95 -vt 0.487321 0.976748 -v 10781.5 19482.9 1960.95 -vt 0.487321 0.974031 -v 10781.5 19482.9 1934.7 -vt 0.487531 0.974031 -o mesh830 -s off -f 4231/4231/4231 4232/4232/4232 4233/4233/4233 -f 4234/4234/4234 4235/4235/4235 4236/4236/4236 -f 4237/4237/4237 4238/4238/4238 4239/4239/4239 -f 4237/4237/4237 4239/4239/4239 4240/4240/4240 -f 4237/4237/4237 4240/4240/4240 4241/4241/4241 -f 4242/4242/4242 4243/4243/4243 4244/4244/4244 -f 4245/4245/4245 4246/4246/4246 4247/4247/4247 -f 4245/4245/4245 4247/4247/4247 4248/4248/4248 -f 4245/4245/4245 4248/4248/4248 4249/4249/4249 -f 4245/4245/4245 4249/4249/4249 4250/4250/4250 -g charts -o chart0000 -s off -f 4231/4231/4231 4232/4232/4232 4233/4233/4233 -o chart0001 -s off -f 4234/4234/4234 4235/4235/4235 4236/4236/4236 -o chart0002 -s off -f 4237/4237/4237 4238/4238/4238 4239/4239/4239 -f 4237/4237/4237 4239/4239/4239 4240/4240/4240 -f 4237/4237/4237 4240/4240/4240 4241/4241/4241 -o chart0003 -s off -f 4242/4242/4242 4243/4243/4243 4244/4244/4244 -o chart0004 -s off -f 4245/4245/4245 4246/4246/4246 4247/4247/4247 -f 4245/4245/4245 4247/4247/4247 4248/4248/4248 -f 4245/4245/4245 4248/4248/4248 4249/4249/4249 -f 4245/4245/4245 4249/4249/4249 4250/4250/4250 -v 10691.5 18799.9 2557.2 -vt 0.0885286 0.382935 -v 10691.5 18821.3 2557.2 -vt 0.0885286 0.383759 -v 10781.5 18821.3 2557.2 -vt 0.0876974 0.383759 -v 10781.5 18799.9 2557.2 -vt 0.0876974 0.382935 -o mesh831 -s off -f 4251/4251/4251 4252/4252/4252 4253/4253/4253 -f 4251/4251/4251 4253/4253/4253 4254/4254/4254 -g charts -o chart0000 -s off -f 4251/4251/4251 4252/4252/4252 4253/4253/4253 -f 4251/4251/4251 4253/4253/4253 4254/4254/4254 -v 10691.5 19125.7 2557.2 -vt 0.0087281 0.992168 -v 10691.5 19147.1 2557.2 -vt 0.0087281 0.992992 -v 10781.5 19147.1 2557.2 -vt 0.00789692 0.992992 -v 10781.5 19125.7 2557.2 -vt 0.00789692 0.992168 -o mesh832 -s off -f 4255/4255/4255 4256/4256/4256 4257/4257/4257 -f 4255/4255/4255 4257/4257/4257 4258/4258/4258 -g charts -o chart0000 -s off -f 4255/4255/4255 4256/4256/4256 4257/4257/4257 -f 4255/4255/4255 4257/4257/4257 4258/4258/4258 -v 10691.5 19482.9 1960.95 -vt 0.182461 0.949299 -v 10691.5 19482.9 1934.7 -vt 0.183292 0.949299 -v 10781.5 19482.9 1934.7 -vt 0.183292 0.948475 -v 10781.5 19482.9 1960.95 -vt 0.182461 0.948475 -o mesh833 -s off -f 4259/4259/4259 4260/4260/4260 4261/4261/4261 -f 4259/4259/4259 4261/4261/4261 4262/4262/4262 -g charts -o chart0000 -s off -f 4259/4259/4259 4260/4260/4260 4261/4261/4261 -f 4259/4259/4259 4261/4261/4261 4262/4262/4262 -v 10691.5 19513.5 -285.3 -vt 0.856608 0.00783182 -v 10691.5 19544.1 -247.8 -vt 0.856867 0.00865614 -v 10691.5 20593.5 -285.3 -vt 0.865752 0.00783182 -v 10691.5 20562.9 -247.8 -vt 0.865493 0.00865614 -o mesh834 -s off -f 4263/4263/4263 4264/4264/4264 4265/4265/4265 -f 4266/4266/4266 4265/4265/4265 4264/4264/4264 -g charts -o chart0000 -s off -f 4263/4263/4263 4264/4264/4264 4265/4265/4265 -f 4266/4266/4266 4265/4265/4265 4264/4264/4264 -v 10691.5 19544.1 -247.8 -vt 0.387781 0.946302 -v 10691.5 19513.5 -285.3 -vt 0.388612 0.946002 -v 10691.5 19513.5 2594.7 -vt 0.388612 0.969085 -o mesh835 -s off -f 4267/4267/4267 4268/4268/4268 4269/4269/4269 -g charts -o chart0000 -s off -f 4267/4267/4267 4268/4268/4268 4269/4269/4269 -v 10691.5 19544.1 -247.8 -vt 0.869077 0.0721352 -v 10691.5 19513.5 2594.7 -vt 0.869077 0.094394 -v 10691.5 19544.1 2557.2 -vt 0.868246 0.0940977 -o mesh836 -s off -f 4270/4270/4270 4271/4271/4271 4272/4272/4272 -g charts -o chart0000 -s off -f 4270/4270/4270 4271/4271/4271 4272/4272/4272 -v 10691.5 19544.1 2557.2 -vt 0.26257 0.606348 -v 10691.5 19513.5 2594.7 -vt 0.262261 0.607172 -v 10691.5 19879.9 2557.2 -vt 0.265586 0.607172 -o mesh837 -s off -f 4273/4273/4273 4274/4274/4274 4275/4275/4275 -g charts -o chart0000 -s off -f 4273/4273/4273 4274/4274/4274 4275/4275/4275 -v 10691.5 19879.9 2557.2 -vt 0.180382 0.954246 -v 10691.5 19513.5 2594.7 -vt 0.177473 0.95507 -v 10691.5 19901.3 2557.2 -vt 0.180551 0.954272 -v 10691.5 20205.7 2557.2 -vt 0.18296 0.954639 -v 10691.5 20227.1 2557.2 -vt 0.183129 0.954665 -v 10691.5 20562.9 2557.2 -vt 0.185785 0.95507 -o mesh838 -s off -f 4276/4276/4276 4277/4277/4277 4278/4278/4278 -f 4278/4278/4278 4277/4277/4277 4279/4279/4279 -f 4279/4279/4279 4277/4277/4277 4280/4280/4280 -f 4280/4280/4280 4277/4277/4277 4281/4281/4281 -g charts -o chart0000 -s off -f 4276/4276/4276 4277/4277/4277 4278/4278/4278 -f 4278/4278/4278 4277/4277/4277 4279/4279/4279 -f 4279/4279/4279 4277/4277/4277 4280/4280/4280 -f 4280/4280/4280 4277/4277/4277 4281/4281/4281 -v 10691.5 20593.5 -285.3 -vt 0.935578 0.627782 -v 10691.5 20562.9 -247.8 -vt 0.935275 0.626958 -v 10691.5 20593.5 2594.7 -vt 0.912303 0.627782 -o mesh839 -s off -f 4282/4282/4282 4283/4283/4283 4284/4284/4284 -g charts -o chart0000 -s off -f 4282/4282/4282 4283/4283/4283 4284/4284/4284 -v 10691.5 20593.5 2594.7 -vt 0.205736 0.711047 -v 10691.5 20562.9 -247.8 -vt 0.228179 0.711047 -v 10691.5 20562.9 1934.7 -vt 0.210949 0.710232 -v 10691.5 20562.9 1960.95 -vt 0.210742 0.710223 -o mesh840 -s off -f 4285/4285/4285 4286/4286/4286 4287/4287/4287 -f 4285/4285/4285 4287/4287/4287 4288/4288/4288 -g charts -o chart0000 -s off -f 4285/4285/4285 4286/4286/4286 4287/4287/4287 -f 4285/4285/4285 4287/4287/4287 4288/4288/4288 -v 10691.5 20593.5 2594.7 -vt 0.617207 0.439819 -v 10691.5 20562.9 1960.95 -vt 0.617207 0.445589 -v 10691.5 20562.9 2557.2 -vt 0.616376 0.440173 -o mesh841 -s off -f 4289/4289/4289 4290/4290/4290 4291/4291/4291 -g charts -o chart0000 -s off -f 4289/4289/4289 4290/4290/4290 4291/4291/4291 -v 10691.5 20593.5 2594.7 -vt 0.928928 0.204039 -v 10691.5 20562.9 2557.2 -vt 0.928096 0.203782 -v 10691.5 19513.5 2594.7 -vt 0.928928 0.194971 -o mesh842 -s off -f 4292/4292/4292 4293/4293/4293 4294/4294/4294 -g charts -o chart0000 -s off -f 4292/4292/4292 4293/4293/4293 4294/4294/4294 -v 10856.5 20593.5 -285.3 -vt 0.635494 0.665705 -v 10856.5 20562.9 -247.8 -vt 0.634663 0.665448 -v 10856.5 19513.5 -285.3 -vt 0.635494 0.656636 -v 10856.5 19544.1 -247.8 -vt 0.634663 0.656893 -o mesh843 -s off -f 4295/4295/4295 4296/4296/4296 4297/4297/4297 -f 4298/4298/4298 4297/4297/4297 4296/4296/4296 -g charts -o chart0000 -s off -f 4295/4295/4295 4296/4296/4296 4297/4297/4297 -f 4298/4298/4298 4297/4297/4297 4296/4296/4296 -v 10856.5 20562.9 -247.8 -vt 0.212689 0.457131 -v 10856.5 20593.5 -285.3 -vt 0.212386 0.457955 -v 10856.5 20593.5 2594.7 -vt 0.235661 0.457955 -o mesh844 -s off -f 4299/4299/4299 4300/4300/4300 4301/4301/4301 -g charts -o chart0000 -s off -f 4299/4299/4299 4300/4300/4300 4301/4301/4301 -v 10856.5 20562.9 -247.8 -vt 0.263924 0.476917 -v 10856.5 20593.5 2594.7 -vt 0.286367 0.476917 -v 10856.5 20562.9 1934.7 -vt 0.281154 0.476102 -v 10856.5 20562.9 1960.95 -vt 0.281361 0.476092 -o mesh845 -s off -f 4302/4302/4302 4303/4303/4303 4304/4304/4304 -f 4304/4304/4304 4303/4303/4303 4305/4305/4305 -g charts -o chart0000 -s off -f 4302/4302/4302 4303/4303/4303 4304/4304/4304 -f 4304/4304/4304 4303/4303/4303 4305/4305/4305 -v 10856.5 20562.9 1960.95 -vt 0.0943472 0.792663 -v 10856.5 20593.5 2594.7 -vt 0.0943474 0.798434 -v 10856.5 20562.9 2557.2 -vt 0.0935162 0.79808 -o mesh846 -s off -f 4306/4306/4306 4307/4307/4307 4308/4308/4308 -g charts -o chart0000 -s off -f 4306/4306/4306 4307/4307/4307 4308/4308/4308 -v 10856.5 20562.9 2557.2 -vt 0.866874 0.236191 -v 10856.5 20593.5 2594.7 -vt 0.866584 0.237015 -v 10856.5 20227.1 2557.2 -vt 0.869726 0.236966 -v 10856.5 20205.7 2557.2 -vt 0.869908 0.237016 -o mesh847 -s off -f 4309/4309/4309 4310/4310/4310 4311/4311/4311 -f 4311/4311/4311 4310/4310/4310 4312/4312/4312 -g charts -o chart0000 -s off -f 4309/4309/4309 4310/4310/4310 4311/4311/4311 -f 4311/4311/4311 4310/4310/4310 4312/4312/4312 -v 10856.5 20205.7 2557.2 -vt 0.170865 0.88582 -v 10856.5 20593.5 2594.7 -vt 0.174148 0.884996 -v 10856.5 19901.3 2557.2 -vt 0.168287 0.88582 -v 10856.5 19879.9 2557.2 -vt 0.168106 0.88582 -v 10856.5 19544.1 2557.2 -vt 0.165263 0.88582 -v 10856.5 19513.5 2594.7 -vt 0.165004 0.884996 -o mesh848 -s off -f 4313/4313/4313 4314/4314/4314 4315/4315/4315 -f 4315/4315/4315 4314/4314/4314 4316/4316/4316 -f 4316/4316/4316 4314/4314/4314 4317/4317/4317 -f 4318/4318/4318 4317/4317/4317 4314/4314/4314 -g charts -o chart0000 -s off -f 4313/4313/4313 4314/4314/4314 4315/4315/4315 -f 4315/4315/4315 4314/4314/4314 4316/4316/4316 -f 4316/4316/4316 4314/4314/4314 4317/4317/4317 -f 4318/4318/4318 4317/4317/4317 4314/4314/4314 -v 10856.5 19513.5 -285.3 -vt 0.00207805 0.711047 -v 10856.5 19544.1 -247.8 -vt 0.00124688 0.710746 -v 10856.5 19513.5 2594.7 -vt 0.00207805 0.687964 -o mesh849 -s off -f 4319/4319/4319 4320/4320/4320 4321/4321/4321 -g charts -o chart0000 -s off -f 4319/4319/4319 4320/4320/4320 4321/4321/4321 -v 10856.5 19513.5 2594.7 -vt 0.125104 0.884996 -v 10856.5 19544.1 -247.8 -vt 0.147548 0.884996 -v 10856.5 19544.1 2557.2 -vt 0.125403 0.884171 -o mesh850 -s off -f 4322/4322/4322 4323/4323/4323 4324/4324/4324 -g charts -o chart0000 -s off -f 4322/4322/4322 4323/4323/4323 4324/4324/4324 -v 10691.5 20593.5 2594.7 -vt 0.10931 0.35573 -v 10691.5 19513.5 2594.7 -vt 0.118454 0.35573 -v 10856.5 19513.5 2594.7 -vt 0.118454 0.357378 -v 10856.5 20593.5 2594.7 -vt 0.10931 0.357378 -o mesh851 -s off -f 4325/4325/4325 4326/4326/4326 4327/4327/4327 -f 4325/4325/4325 4327/4327/4327 4328/4328/4328 -g charts -o chart0000 -s off -f 4325/4325/4325 4326/4326/4326 4327/4327/4327 -f 4325/4325/4325 4327/4327/4327 4328/4328/4328 -v 10691.5 19513.5 2594.7 -vt 0.550707 0.555235 -v 10691.5 19513.5 -285.3 -vt 0.573982 0.555235 -v 10774 19513.5 -285.3 -vt 0.573982 0.556059 -v 10856.5 19513.5 -285.3 -vt 0.573982 0.556884 -v 10856.5 19513.5 2594.7 -vt 0.550707 0.556884 -o mesh852 -s off -f 4329/4329/4329 4330/4330/4330 4331/4331/4331 -f 4329/4329/4329 4331/4331/4331 4332/4332/4332 -f 4329/4329/4329 4332/4332/4332 4333/4333/4333 -g charts -o chart0000 -s off -f 4329/4329/4329 4330/4330/4330 4331/4331/4331 -f 4329/4329/4329 4331/4331/4331 4332/4332/4332 -f 4329/4329/4329 4332/4332/4332 4333/4333/4333 -v 10691.5 19513.5 -285.3 -vt 0.352037 0.446414 -v 10691.5 20593.5 -285.3 -vt 0.342893 0.446414 -v 10856.5 20593.5 -285.3 -vt 0.342893 0.444765 -v 10856.5 19513.5 -285.3 -vt 0.352037 0.444765 -v 10774 19513.5 -285.3 -vt 0.352037 0.445589 -o mesh853 -s off -f 4334/4334/4334 4335/4335/4335 4336/4336/4336 -f 4334/4334/4334 4336/4336/4336 4337/4337/4337 -f 4334/4334/4334 4337/4337/4337 4338/4338/4338 -g charts -o chart0000 -s off -f 4334/4334/4334 4335/4335/4335 4336/4336/4336 -f 4334/4334/4334 4336/4336/4336 4337/4337/4337 -f 4334/4334/4334 4337/4337/4337 4338/4338/4338 -v 10691.5 20593.5 -285.3 -vt 0.737739 0.798434 -v 10691.5 20593.5 2594.7 -vt 0.714464 0.798434 -v 10856.5 20593.5 2594.7 -vt 0.714464 0.796785 -v 10856.5 20593.5 -285.3 -vt 0.737739 0.796785 -o mesh854 -s off -f 4339/4339/4339 4340/4340/4340 4341/4341/4341 -f 4339/4339/4339 4341/4341/4341 4342/4342/4342 -g charts -o chart0000 -s off -f 4339/4339/4339 4340/4340/4340 4341/4341/4341 -f 4339/4339/4339 4341/4341/4341 4342/4342/4342 -v 10856.5 19544.1 -247.8 -vt 0.982959 0.607172 -v 10826.5 19544.1 1934.7 -vt 0.983262 0.589853 -v 10856.5 19544.1 2557.2 -vt 0.982959 0.584913 -v 10691.5 19544.1 -247.8 -vt 0.984622 0.607172 -v 10781.5 19544.1 1934.7 -vt 0.983715 0.589853 -v 10781.5 19544.1 1960.95 -vt 0.983715 0.589645 -v 10691.5 19544.1 2557.2 -vt 0.984622 0.584913 -v 10826.5 19544.1 1960.95 -vt 0.983262 0.589645 -o mesh855 -s off -f 4343/4343/4343 4344/4344/4344 4345/4345/4345 -f 4344/4344/4344 4343/4343/4343 4346/4346/4346 -f 4344/4344/4344 4346/4346/4346 4347/4347/4347 -f 4347/4347/4347 4346/4346/4346 4348/4348/4348 -f 4348/4348/4348 4346/4346/4346 4349/4349/4349 -f 4345/4345/4345 4350/4350/4350 4349/4349/4349 -f 4350/4350/4350 4345/4345/4345 4344/4344/4344 -f 4349/4349/4349 4350/4350/4350 4348/4348/4348 -g charts -o chart0000 -s off -f 4343/4343/4343 4344/4344/4344 4345/4345/4345 -f 4344/4344/4344 4343/4343/4343 4346/4346/4346 -f 4344/4344/4344 4346/4346/4346 4347/4347/4347 -f 4347/4347/4347 4346/4346/4346 4348/4348/4348 -f 4348/4348/4348 4346/4346/4346 4349/4349/4349 -f 4345/4345/4345 4350/4350/4350 4349/4349/4349 -f 4350/4350/4350 4345/4345/4345 4344/4344/4344 -f 4349/4349/4349 4350/4350/4350 4348/4348/4348 -v 10691.5 19544.1 2557.2 -vt 0.938903 0.860264 -v 10691.5 19879.9 2557.2 -vt 0.935578 0.860264 -v 10781.5 19879.9 2557.2 -vt 0.935578 0.859364 -v 10826.5 19879.9 2557.2 -vt 0.935578 0.858915 -v 10856.5 19879.9 2557.2 -vt 0.935578 0.858615 -v 10856.5 19544.1 2557.2 -vt 0.938903 0.858615 -o mesh856 -s off -f 4351/4351/4351 4352/4352/4352 4353/4353/4353 -f 4351/4351/4351 4353/4353/4353 4354/4354/4354 -f 4351/4351/4351 4354/4354/4354 4355/4355/4355 -f 4351/4351/4351 4355/4355/4355 4356/4356/4356 -g charts -o chart0000 -s off -f 4351/4351/4351 4352/4352/4352 4353/4353/4353 -f 4351/4351/4351 4353/4353/4353 4354/4354/4354 -f 4351/4351/4351 4354/4354/4354 4355/4355/4355 -f 4351/4351/4351 4355/4355/4355 4356/4356/4356 -v 10856.5 19879.9 2557.2 -vt 0.959684 0.498351 -v 10826.5 19879.9 2557.2 -vt 0.960515 0.498351 -v 10826.5 19901.3 2557.2 -vt 0.960515 0.499175 -v 10856.5 19901.3 2557.2 -vt 0.959684 0.499175 -o mesh857 -s off -f 4357/4357/4357 4358/4358/4358 4359/4359/4359 -f 4357/4357/4357 4359/4359/4359 4360/4360/4360 -g charts -o chart0000 -s off -f 4357/4357/4357 4358/4358/4358 4359/4359/4359 -f 4357/4357/4357 4359/4359/4359 4360/4360/4360 -v 10691.5 19901.3 2557.2 -vt 0.106816 0.676422 -v 10691.5 20205.7 2557.2 -vt 0.104323 0.676422 -v 10781.5 20205.7 2557.2 -vt 0.104323 0.675523 -v 10826.5 20205.7 2557.2 -vt 0.104323 0.675073 -v 10856.5 20205.7 2557.2 -vt 0.104323 0.674773 -v 10856.5 19901.3 2557.2 -vt 0.106816 0.674773 -v 10826.5 19901.3 2557.2 -vt 0.106816 0.675073 -v 10781.5 19901.3 2557.2 -vt 0.106816 0.675523 -o mesh858 -s off -f 4361/4361/4361 4362/4362/4362 4363/4363/4363 -f 4361/4361/4361 4363/4363/4363 4364/4364/4364 -f 4361/4361/4361 4364/4364/4364 4365/4365/4365 -f 4361/4361/4361 4365/4365/4365 4366/4366/4366 -f 4361/4361/4361 4366/4366/4366 4367/4367/4367 -f 4361/4361/4361 4367/4367/4367 4368/4368/4368 -g charts -o chart0000 -s off -f 4361/4361/4361 4362/4362/4362 4363/4363/4363 -f 4361/4361/4361 4363/4363/4363 4364/4364/4364 -f 4361/4361/4361 4364/4364/4364 4365/4365/4365 -f 4361/4361/4361 4365/4365/4365 4366/4366/4366 -f 4361/4361/4361 4366/4366/4366 4367/4367/4367 -f 4361/4361/4361 4367/4367/4367 4368/4368/4368 -v 10856.5 20205.7 2557.2 -vt 0.431837 0.171063 -v 10826.5 20205.7 2557.2 -vt 0.432668 0.171063 -v 10826.5 20227.1 2557.2 -vt 0.432668 0.171888 -v 10856.5 20227.1 2557.2 -vt 0.431837 0.171888 -o mesh859 -s off -f 4369/4369/4369 4370/4370/4370 4371/4371/4371 -f 4369/4369/4369 4371/4371/4371 4372/4372/4372 -g charts -o chart0000 -s off -f 4369/4369/4369 4370/4370/4370 4371/4371/4371 -f 4369/4369/4369 4371/4371/4371 4372/4372/4372 -v 10691.5 20227.1 2557.2 -vt 0.567332 0.901484 -v 10691.5 20562.9 2557.2 -vt 0.564007 0.901484 -v 10856.5 20562.9 2557.2 -vt 0.564007 0.899835 -v 10856.5 20227.1 2557.2 -vt 0.567332 0.899835 -v 10826.5 20227.1 2557.2 -vt 0.567332 0.900135 -v 10781.5 20227.1 2557.2 -vt 0.567332 0.900585 -o mesh860 -s off -f 4373/4373/4373 4374/4374/4374 4375/4375/4375 -f 4373/4373/4373 4375/4375/4375 4376/4376/4376 -f 4373/4373/4373 4376/4376/4376 4377/4377/4377 -f 4373/4373/4373 4377/4377/4377 4378/4378/4378 -g charts -o chart0000 -s off -f 4373/4373/4373 4374/4374/4374 4375/4375/4375 -f 4373/4373/4373 4375/4375/4375 4376/4376/4376 -f 4373/4373/4373 4376/4376/4376 4377/4377/4377 -f 4373/4373/4373 4377/4377/4377 4378/4378/4378 -v 10691.5 20562.9 2557.2 -vt 0.134248 0.564303 -v 10691.5 20562.9 1960.95 -vt 0.134248 0.559572 -v 10781.5 20562.9 1960.95 -vt 0.133341 0.559572 -v 10826.5 20562.9 1960.95 -vt 0.132887 0.559572 -v 10856.5 20562.9 1960.95 -vt 0.132585 0.559572 -v 10856.5 20562.9 2557.2 -vt 0.132585 0.564303 -v 10826.5 20562.9 1934.7 -vt 0.132887 0.559363 -v 10856.5 20562.9 1934.7 -vt 0.132585 0.559363 -v 10691.5 20562.9 1934.7 -vt 0.134248 0.559363 -v 10691.5 20562.9 -247.8 -vt 0.134248 0.542045 -v 10856.5 20562.9 -247.8 -vt 0.132585 0.542045 -v 10781.5 20562.9 1934.7 -vt 0.133341 0.559363 -o mesh861 -s off -f 4379/4379/4379 4380/4380/4380 4381/4381/4381 -f 4379/4379/4379 4381/4381/4381 4382/4382/4382 -f 4379/4379/4379 4382/4382/4382 4383/4383/4383 -f 4379/4379/4379 4383/4383/4383 4384/4384/4384 -f 4383/4383/4383 4382/4382/4382 4385/4385/4385 -f 4383/4383/4383 4385/4385/4385 4386/4386/4386 -f 4387/4387/4387 4388/4388/4388 4389/4389/4389 -f 4387/4387/4387 4389/4389/4389 4386/4386/4386 -f 4387/4387/4387 4386/4386/4386 4385/4385/4385 -f 4387/4387/4387 4385/4385/4385 4390/4390/4390 -f 4382/4382/4382 4381/4381/4381 4390/4390/4390 -f 4382/4382/4382 4390/4390/4390 4385/4385/4385 -g charts -o chart0000 -s off -f 4379/4379/4379 4380/4380/4380 4381/4381/4381 -f 4379/4379/4379 4381/4381/4381 4382/4382/4382 -f 4379/4379/4379 4382/4382/4382 4383/4383/4383 -f 4379/4379/4379 4383/4383/4383 4384/4384/4384 -f 4383/4383/4383 4382/4382/4382 4385/4385/4385 -f 4383/4383/4383 4385/4385/4385 4386/4386/4386 -f 4387/4387/4387 4388/4388/4388 4389/4389/4389 -f 4387/4387/4387 4389/4389/4389 4386/4386/4386 -f 4387/4387/4387 4386/4386/4386 4385/4385/4385 -f 4387/4387/4387 4385/4385/4385 4390/4390/4390 -f 4382/4382/4382 4381/4381/4381 4390/4390/4390 -f 4382/4382/4382 4390/4390/4390 4385/4385/4385 -v 10691.5 20562.9 -247.8 -vt 0.76517 0.312861 -v 10691.5 19544.1 -247.8 -vt 0.773483 0.312861 -v 10856.5 19544.1 -247.8 -vt 0.773483 0.314509 -v 10856.5 20562.9 -247.8 -vt 0.76517 0.314509 -o mesh862 -s off -f 4391/4391/4391 4392/4392/4392 4393/4393/4393 -f 4391/4391/4391 4393/4393/4393 4394/4394/4394 -g charts -o chart0000 -s off -f 4391/4391/4391 4392/4392/4392 4393/4393/4393 -f 4391/4391/4391 4393/4393/4393 4394/4394/4394 -v 10826.5 19879.9 2557.2 -vt 0.986284 0.00700742 -v 10826.5 19879.9 1960.95 -vt 0.986284 0.0119538 -v 10826.5 19544.1 1960.95 -vt 0.982959 0.0119538 -v 10826.5 19879.9 2557.2 -vt 0.125689 0.542045 -v 10826.5 19544.1 1960.95 -vt 0.128429 0.546782 -v 10826.5 19544.1 1934.7 -vt 0.128429 0.546991 -v 10826.5 20562.9 1934.7 -vt 0.120116 0.546991 -v 10826.5 20562.9 1960.95 -vt 0.120116 0.546782 -v 10826.5 19879.9 2557.2 -vt 0.564007 0.343363 -v 10826.5 20562.9 1960.95 -vt 0.556525 0.343363 -v 10826.5 20227.1 1960.95 -vt 0.558613 0.34089 -v 10826.5 19879.9 2557.2 -vt 0.479219 0.957543 -v 10826.5 20227.1 1960.95 -vt 0.479219 0.963314 -v 10826.5 20227.1 2557.2 -vt 0.476725 0.959005 -v 10826.5 20205.7 2557.2 -vt 0.476879 0.958915 -v 10826.5 19879.9 2557.2 -vt 0.786783 0.819044 -v 10826.5 20205.7 2557.2 -vt 0.783458 0.819044 -v 10826.5 20205.7 1960.95 -vt 0.783458 0.814097 -v 10826.5 19901.3 1960.95 -vt 0.786564 0.814097 -v 10826.5 19879.9 2557.2 -vt 0.406899 0.846249 -v 10826.5 19901.3 1960.95 -vt 0.406899 0.851195 -v 10826.5 19901.3 2557.2 -vt 0.406068 0.846255 -o mesh863 -s off -f 4395/4395/4395 4396/4396/4396 4397/4397/4397 -f 4398/4398/4398 4399/4399/4399 4400/4400/4400 -f 4398/4398/4398 4400/4400/4400 4401/4401/4401 -f 4398/4398/4398 4401/4401/4401 4402/4402/4402 -f 4403/4403/4403 4404/4404/4404 4405/4405/4405 -f 4406/4406/4406 4407/4407/4407 4408/4408/4408 -f 4406/4406/4406 4408/4408/4408 4409/4409/4409 -f 4410/4410/4410 4411/4411/4411 4412/4412/4412 -f 4410/4410/4410 4412/4412/4412 4413/4413/4413 -f 4414/4414/4414 4415/4415/4415 4416/4416/4416 -g charts -o chart0000 -s off -f 4395/4395/4395 4396/4396/4396 4397/4397/4397 -o chart0001 -s off -f 4398/4398/4398 4399/4399/4399 4400/4400/4400 -f 4398/4398/4398 4400/4400/4400 4401/4401/4401 -f 4398/4398/4398 4401/4401/4401 4402/4402/4402 -o chart0002 -s off -f 4403/4403/4403 4404/4404/4404 4405/4405/4405 -o chart0003 -s off -f 4406/4406/4406 4407/4407/4407 4408/4408/4408 -f 4406/4406/4406 4408/4408/4408 4409/4409/4409 -o chart0004 -s off -f 4410/4410/4410 4411/4411/4411 4412/4412/4412 -f 4410/4410/4410 4412/4412/4412 4413/4413/4413 -o chart0005 -s off -f 4414/4414/4414 4415/4415/4415 4416/4416/4416 -v 10826.5 19879.9 1960.95 -vt 0.987115 0.83141 -v 10826.5 19879.9 2557.2 -vt 0.987115 0.826463 -v 10781.5 19879.9 2557.2 -vt 0.986284 0.826463 -v 10781.5 19879.9 1960.95 -vt 0.986284 0.83141 -o mesh864 -s off -f 4417/4417/4417 4418/4418/4418 4419/4419/4419 -f 4417/4417/4417 4419/4419/4419 4420/4420/4420 -g charts -o chart0000 -s off -f 4417/4417/4417 4418/4418/4418 4419/4419/4419 -f 4417/4417/4417 4419/4419/4419 4420/4420/4420 -v 10826.5 19879.9 1960.95 -vt 0.690357 0.751443 -v 10781.5 19879.9 1960.95 -vt 0.689526 0.751443 -v 10781.5 19544.1 1960.95 -vt 0.689526 0.748145 -v 10826.5 19544.1 1960.95 -vt 0.690357 0.748145 -o mesh865 -s off -f 4421/4421/4421 4422/4422/4422 4423/4423/4423 -f 4421/4421/4421 4423/4423/4423 4424/4424/4424 -g charts -o chart0000 -s off -f 4421/4421/4421 4422/4422/4422 4423/4423/4423 -f 4421/4421/4421 4423/4423/4423 4424/4424/4424 -v 10826.5 19544.1 1934.7 -vt 0.193267 0.832234 -v 10781.5 19544.1 1934.7 -vt 0.194098 0.832234 -v 10781.5 19544.1 1960.95 -vt 0.194098 0.833058 -v 10826.5 19544.1 1960.95 -vt 0.193267 0.833058 -o mesh866 -s off -f 4425/4425/4425 4426/4426/4426 4427/4427/4427 -f 4425/4425/4425 4427/4427/4427 4428/4428/4428 -g charts -o chart0000 -s off -f 4425/4425/4425 4426/4426/4426 4427/4427/4427 -f 4425/4425/4425 4427/4427/4427 4428/4428/4428 -v 10826.5 19544.1 1934.7 -vt 0.853283 0.537098 -v 10781.5 19544.1 1934.7 -vt 0.853283 0.537922 -v 10781.5 20562.9 1934.7 -vt 0.844971 0.537922 -v 10826.5 20562.9 1934.7 -vt 0.844971 0.537098 -o mesh867 -s off -f 4429/4429/4429 4430/4430/4430 4431/4431/4431 -f 4429/4429/4429 4431/4431/4431 4432/4432/4432 -g charts -o chart0000 -s off -f 4429/4429/4429 4430/4430/4430 4431/4431/4431 -f 4429/4429/4429 4431/4431/4431 4432/4432/4432 -v 10826.5 20562.9 1960.95 -vt 0.604738 0.456307 -v 10781.5 20562.9 1960.95 -vt 0.603907 0.456307 -v 10781.5 20227.1 1960.95 -vt 0.603907 0.453009 -v 10826.5 20227.1 1960.95 -vt 0.604738 0.453009 -o mesh868 -s off -f 4433/4433/4433 4434/4434/4434 4435/4435/4435 -f 4433/4433/4433 4435/4435/4435 4436/4436/4436 -g charts -o chart0000 -s off -f 4433/4433/4433 4434/4434/4434 4435/4435/4435 -f 4433/4433/4433 4435/4435/4435 4436/4436/4436 -v 10826.5 20227.1 1960.95 -vt 0.0843723 0.891591 -v 10781.5 20227.1 1960.95 -vt 0.0843723 0.892415 -v 10781.5 20227.1 2557.2 -vt 0.0793849 0.892415 -v 10826.5 20227.1 2557.2 -vt 0.0793849 0.891591 -o mesh869 -s off -f 4437/4437/4437 4438/4438/4438 4439/4439/4439 -f 4437/4437/4437 4439/4439/4439 4440/4440/4440 -g charts -o chart0000 -s off -f 4437/4437/4437 4438/4438/4438 4439/4439/4439 -f 4437/4437/4437 4439/4439/4439 4440/4440/4440 -v 10826.5 20205.7 2557.2 -vt 0.216542 0.45878 -v 10781.5 20205.7 2557.2 -vt 0.216542 0.459604 -v 10781.5 20227.1 2557.2 -vt 0.217373 0.459604 -v 10826.5 20227.1 2557.2 -vt 0.217373 0.45878 -o mesh870 -s off -f 4441/4441/4441 4442/4442/4442 4443/4443/4443 -f 4441/4441/4441 4443/4443/4443 4444/4444/4444 -g charts -o chart0000 -s off -f 4441/4441/4441 4442/4442/4442 4443/4443/4443 -f 4441/4441/4441 4443/4443/4443 4444/4444/4444 -v 10826.5 20205.7 2557.2 -vt 0.371155 0.662407 -v 10781.5 20205.7 2557.2 -vt 0.370324 0.662407 -v 10781.5 20205.7 1960.95 -vt 0.370324 0.657461 -v 10826.5 20205.7 1960.95 -vt 0.371155 0.657461 -o mesh871 -s off -f 4445/4445/4445 4446/4446/4446 4447/4447/4447 -f 4445/4445/4445 4447/4447/4447 4448/4448/4448 -g charts -o chart0000 -s off -f 4445/4445/4445 4446/4446/4446 4447/4447/4447 -f 4445/4445/4445 4447/4447/4447 4448/4448/4448 -v 10826.5 20205.7 1960.95 -vt 0.966334 0.094394 -v 10781.5 20205.7 1960.95 -vt 0.965503 0.094394 -v 10781.5 19901.3 1960.95 -vt 0.965503 0.0919209 -v 10826.5 19901.3 1960.95 -vt 0.966334 0.0919209 -o mesh872 -s off -f 4449/4449/4449 4450/4450/4450 4451/4451/4451 -f 4449/4449/4449 4451/4451/4451 4452/4452/4452 -g charts -o chart0000 -s off -f 4449/4449/4449 4450/4450/4450 4451/4451/4451 -f 4449/4449/4449 4451/4451/4451 4452/4452/4452 -v 10781.5 19901.3 1960.95 -vt 0.186617 0.625309 -v 10781.5 19901.3 2557.2 -vt 0.181629 0.625309 -v 10826.5 19901.3 2557.2 -vt 0.181629 0.624485 -v 10826.5 19901.3 1960.95 -vt 0.186617 0.624485 -o mesh873 -s off -f 4453/4453/4453 4454/4454/4454 4455/4455/4455 -f 4453/4453/4453 4455/4455/4455 4456/4456/4456 -g charts -o chart0000 -s off -f 4453/4453/4453 4454/4454/4454 4455/4455/4455 -f 4453/4453/4453 4455/4455/4455 4456/4456/4456 -v 10826.5 19879.9 2557.2 -vt 0.795927 0.748145 -v 10781.5 19879.9 2557.2 -vt 0.796758 0.748145 -v 10781.5 19901.3 2557.2 -vt 0.796758 0.748969 -v 10826.5 19901.3 2557.2 -vt 0.795927 0.748969 -o mesh874 -s off -f 4457/4457/4457 4458/4458/4458 4459/4459/4459 -f 4457/4457/4457 4459/4459/4459 4460/4460/4460 -g charts -o chart0000 -s off -f 4457/4457/4457 4458/4458/4458 4459/4459/4459 -f 4457/4457/4457 4459/4459/4459 4460/4460/4460 -v 10781.5 19544.1 1934.7 -vt 0.794264 0.353256 -v 10781.5 19544.1 1960.95 -vt 0.794264 0.354081 -v 10781.5 19879.9 1960.95 -vt 0.790939 0.354081 -v 10781.5 19544.1 1934.7 -vt 0.585619 0.580791 -v 10781.5 19879.9 1960.95 -vt 0.587121 0.578318 -v 10781.5 19879.9 2557.2 -vt 0.591438 0.580791 -v 10781.5 19544.1 1934.7 -vt 0.531588 0.565952 -v 10781.5 19879.9 2557.2 -vt 0.5266 0.562813 -v 10781.5 19901.3 2557.2 -vt 0.526607 0.562626 -v 10781.5 19901.3 1960.95 -vt 0.531489 0.562832 -v 10781.5 20205.7 1960.95 -vt 0.531588 0.560181 -v 10781.5 19544.1 1934.7 -vt 0.932253 0.563479 -v 10781.5 20205.7 1960.95 -vt 0.928096 0.567562 -v 10781.5 20205.7 2557.2 -vt 0.932253 0.570898 -v 10781.5 19544.1 1934.7 -vt 0.915627 0.531327 -v 10781.5 20205.7 2557.2 -vt 0.910229 0.526381 -v 10781.5 20227.1 2557.2 -vt 0.910055 0.526381 -v 10781.5 20227.1 1960.95 -vt 0.910055 0.531119 -v 10781.5 20562.9 1960.95 -vt 0.907315 0.531119 -v 10781.5 20562.9 1934.7 -vt 0.907315 0.531327 -o mesh875 -s off -f 4461/4461/4461 4462/4462/4462 4463/4463/4463 -f 4464/4464/4464 4465/4465/4465 4466/4466/4466 -f 4467/4467/4467 4468/4468/4468 4469/4469/4469 -f 4467/4467/4467 4469/4469/4469 4470/4470/4470 -f 4467/4467/4467 4470/4470/4470 4471/4471/4471 -f 4472/4472/4472 4473/4473/4473 4474/4474/4474 -f 4475/4475/4475 4476/4476/4476 4477/4477/4477 -f 4475/4475/4475 4477/4477/4477 4478/4478/4478 -f 4475/4475/4475 4478/4478/4478 4479/4479/4479 -f 4475/4475/4475 4479/4479/4479 4480/4480/4480 -g charts -o chart0000 -s off -f 4461/4461/4461 4462/4462/4462 4463/4463/4463 -o chart0001 -s off -f 4464/4464/4464 4465/4465/4465 4466/4466/4466 -o chart0002 -s off -f 4467/4467/4467 4468/4468/4468 4469/4469/4469 -f 4467/4467/4467 4469/4469/4469 4470/4470/4470 -f 4467/4467/4467 4470/4470/4470 4471/4471/4471 -o chart0003 -s off -f 4472/4472/4472 4473/4473/4473 4474/4474/4474 -o chart0004 -s off -f 4475/4475/4475 4476/4476/4476 4477/4477/4477 -f 4475/4475/4475 4477/4477/4477 4478/4478/4478 -f 4475/4475/4475 4478/4478/4478 4479/4479/4479 -f 4475/4475/4475 4479/4479/4479 4480/4480/4480 -v 10691.5 19879.9 2557.2 -vt 0.523275 0.994641 -v 10691.5 19901.3 2557.2 -vt 0.523275 0.995466 -v 10781.5 19901.3 2557.2 -vt 0.522444 0.995466 -v 10781.5 19879.9 2557.2 -vt 0.522444 0.994641 -o mesh876 -s off -f 4481/4481/4481 4482/4482/4482 4483/4483/4483 -f 4481/4481/4481 4483/4483/4483 4484/4484/4484 -g charts -o chart0000 -s off -f 4481/4481/4481 4482/4482/4482 4483/4483/4483 -f 4481/4481/4481 4483/4483/4483 4484/4484/4484 -v 10691.5 20205.7 2557.2 -vt 0.562344 0.553586 -v 10691.5 20227.1 2557.2 -vt 0.562344 0.55441 -v 10781.5 20227.1 2557.2 -vt 0.561513 0.55441 -v 10781.5 20205.7 2557.2 -vt 0.561513 0.553586 -o mesh877 -s off -f 4485/4485/4485 4486/4486/4486 4487/4487/4487 -f 4485/4485/4485 4487/4487/4487 4488/4488/4488 -g charts -o chart0000 -s off -f 4485/4485/4485 4486/4486/4486 4487/4487/4487 -f 4485/4485/4485 4487/4487/4487 4488/4488/4488 -v 10691.5 20562.9 1960.95 -vt 0.401081 0.30709 -v 10691.5 20562.9 1934.7 -vt 0.401081 0.307914 -v 10781.5 20562.9 1934.7 -vt 0.400249 0.307914 -v 10781.5 20562.9 1960.95 -vt 0.400249 0.30709 -o mesh878 -s off -f 4489/4489/4489 4490/4490/4490 4491/4491/4491 -f 4489/4489/4489 4491/4491/4491 4492/4492/4492 -g charts -o chart0000 -s off -f 4489/4489/4489 4490/4490/4490 4491/4491/4491 -f 4489/4489/4489 4491/4491/4491 4492/4492/4492 -v 10691.5 22461 -285.3 -vt 0.063591 0.905606 -v 10691.5 22493.7 -247.8 -vt 0.0644222 0.905863 -v 10691.5 23616 -285.3 -vt 0.063591 0.914674 -v 10691.5 23583.3 -247.8 -vt 0.0644222 0.914417 -o mesh879 -s off -f 4493/4493/4493 4494/4494/4494 4495/4495/4495 -f 4496/4496/4496 4495/4495/4495 4494/4494/4494 -g charts -o chart0000 -s off -f 4493/4493/4493 4494/4494/4494 4495/4495/4495 -f 4496/4496/4496 4495/4495/4495 4494/4494/4494 -v 10691.5 22493.7 -247.8 -vt 0.0045719 0.534925 -v 10691.5 22461 -285.3 -vt 0.00540308 0.534625 -v 10691.5 22461 2594.7 -vt 0.00540308 0.557708 -o mesh880 -s off -f 4497/4497/4497 4498/4498/4498 4499/4499/4499 -g charts -o chart0000 -s off -f 4497/4497/4497 4498/4498/4498 4499/4499/4499 -v 10691.5 22493.7 -247.8 -vt 0.196592 0.588211 -v 10691.5 22461 2594.7 -vt 0.219036 0.588211 -v 10691.5 22493.7 2557.2 -vt 0.218737 0.587387 -o mesh881 -s off -f 4500/4500/4500 4501/4501/4501 4502/4502/4502 -g charts -o chart0000 -s off -f 4500/4500/4500 4501/4501/4501 4502/4502/4502 -v 10691.5 22493.7 2557.2 -vt 0.666556 0.901484 -v 10691.5 22461 2594.7 -vt 0.666251 0.902308 -v 10691.5 22852.8 2557.2 -vt 0.669576 0.902308 -o mesh882 -s off -f 4503/4503/4503 4504/4504/4504 4505/4505/4505 -g charts -o chart0000 -s off -f 4503/4503/4503 4504/4504/4504 4505/4505/4505 -v 10691.5 22852.8 2557.2 -vt 0.389569 0.903957 -v 10691.5 22461 2594.7 -vt 0.392768 0.904781 -v 10691.5 22875.7 2557.2 -vt 0.389383 0.903983 -v 10691.5 23201.3 2557.2 -vt 0.386733 0.90435 -v 10691.5 23224.2 2557.2 -vt 0.386547 0.904376 -v 10691.5 23583.3 2557.2 -vt 0.383624 0.904781 -o mesh883 -s off -f 4506/4506/4506 4507/4507/4507 4508/4508/4508 -f 4508/4508/4508 4507/4507/4507 4509/4509/4509 -f 4509/4509/4509 4507/4507/4507 4510/4510/4510 -f 4510/4510/4510 4507/4507/4507 4511/4511/4511 -g charts -o chart0000 -s off -f 4506/4506/4506 4507/4507/4507 4508/4508/4508 -f 4508/4508/4508 4507/4507/4507 4509/4509/4509 -f 4509/4509/4509 4507/4507/4507 4510/4510/4510 -f 4510/4510/4510 4507/4507/4507 4511/4511/4511 -v 10691.5 23616 -285.3 -vt 0.885702 0.538747 -v 10691.5 23583.3 -247.8 -vt 0.884871 0.538446 -v 10691.5 23616 2594.7 -vt 0.885702 0.515664 -o mesh884 -s off -f 4512/4512/4512 4513/4513/4513 4514/4514/4514 -g charts -o chart0000 -s off -f 4512/4512/4512 4513/4513/4513 4514/4514/4514 -v 10691.5 23616 2594.7 -vt 0.401912 0.543693 -v 10691.5 23583.3 -247.8 -vt 0.424356 0.543693 -v 10691.5 23583.3 1934.7 -vt 0.407125 0.542879 -v 10691.5 23583.3 1960.95 -vt 0.406918 0.542869 -o mesh885 -s off -f 4515/4515/4515 4516/4516/4516 4517/4517/4517 -f 4515/4515/4515 4517/4517/4517 4518/4518/4518 -g charts -o chart0000 -s off -f 4515/4515/4515 4516/4516/4516 4517/4517/4517 -f 4515/4515/4515 4517/4517/4517 4518/4518/4518 -v 10691.5 23616 2594.7 -vt 0.888196 0.26587 -v 10691.5 23583.3 1960.95 -vt 0.888196 0.27164 -v 10691.5 23583.3 2557.2 -vt 0.887365 0.266226 -o mesh886 -s off -f 4519/4519/4519 4520/4520/4520 4521/4521/4521 -g charts -o chart0000 -s off -f 4519/4519/4519 4520/4520/4520 4521/4521/4521 -v 10691.5 23616 2594.7 -vt 0.809227 0.576669 -v 10691.5 23583.3 2557.2 -vt 0.808396 0.576412 -v 10691.5 22461 2594.7 -vt 0.809227 0.567601 -o mesh887 -s off -f 4522/4522/4522 4523/4523/4523 4524/4524/4524 -g charts -o chart0000 -s off -f 4522/4522/4522 4523/4523/4523 4524/4524/4524 -v 10856.5 23616 -285.3 -vt 0.0843723 0.678071 -v 10856.5 23583.3 -247.8 -vt 0.0841132 0.677247 -v 10856.5 22461 -285.3 -vt 0.0752286 0.678071 -v 10856.5 22493.7 -247.8 -vt 0.0754876 0.677247 -o mesh888 -s off -f 4525/4525/4525 4526/4526/4526 4527/4527/4527 -f 4528/4528/4528 4527/4527/4527 4526/4526/4526 -g charts -o chart0000 -s off -f 4525/4525/4525 4526/4526/4526 4527/4527/4527 -f 4528/4528/4528 4527/4527/4527 4526/4526/4526 -v 10856.5 23583.3 -247.8 -vt 0.11596 0.970433 -v 10856.5 23616 -285.3 -vt 0.115129 0.970734 -v 10856.5 23616 2594.7 -vt 0.115129 0.94765 -v 10856.5 23583.3 1934.7 -vt 0.11596 0.95294 -o mesh889 -s off -f 4529/4529/4529 4530/4530/4530 4531/4531/4531 -f 4529/4529/4529 4531/4531/4531 4532/4532/4532 -g charts -o chart0000 -s off -f 4529/4529/4529 4530/4530/4530 4531/4531/4531 -f 4529/4529/4529 4531/4531/4531 4532/4532/4532 -v 10856.5 23583.3 1934.7 -vt 0.828346 0.669827 -v 10856.5 23616 2594.7 -vt 0.828346 0.675598 -v 10856.5 23583.3 1960.95 -vt 0.828311 0.670056 -v 10856.5 23583.3 2557.2 -vt 0.827515 0.675256 -o mesh890 -s off -f 4533/4533/4533 4534/4534/4534 4535/4535/4535 -f 4535/4535/4535 4534/4534/4534 4536/4536/4536 -g charts -o chart0000 -s off -f 4533/4533/4533 4534/4534/4534 4535/4535/4535 -f 4535/4535/4535 4534/4534/4534 4536/4536/4536 -v 10856.5 23583.3 2557.2 -vt 0.668219 0.794312 -v 10856.5 23616 2594.7 -vt 0.667914 0.795136 -v 10856.5 23224.2 2557.2 -vt 0.671238 0.795136 -o mesh891 -s off -f 4537/4537/4537 4538/4538/4538 4539/4539/4539 -g charts -o chart0000 -s off -f 4537/4537/4537 4538/4538/4538 4539/4539/4539 -v 10856.5 23224.2 2557.2 -vt 0.0102647 0.880049 -v 10856.5 23616 2594.7 -vt 0.00706567 0.880874 -v 10856.5 23201.3 2557.2 -vt 0.010451 0.880076 -v 10856.5 22875.7 2557.2 -vt 0.0131006 0.880444 -v 10856.5 22852.8 2557.2 -vt 0.013287 0.880469 -v 10856.5 22493.7 2557.2 -vt 0.0162094 0.880874 -o mesh892 -s off -f 4540/4540/4540 4541/4541/4541 4542/4542/4542 -f 4542/4542/4542 4541/4541/4541 4543/4543/4543 -f 4543/4543/4543 4541/4541/4541 4544/4544/4544 -f 4544/4544/4544 4541/4541/4541 4545/4545/4545 -g charts -o chart0000 -s off -f 4540/4540/4540 4541/4541/4541 4542/4542/4542 -f 4542/4542/4542 4541/4541/4541 4543/4543/4543 -f 4543/4543/4543 4541/4541/4541 4544/4544/4544 -f 4544/4544/4544 4541/4541/4541 4545/4545/4545 -v 10856.5 22461 -285.3 -vt 0.0494596 0.622011 -v 10856.5 22493.7 -247.8 -vt 0.0486284 0.621711 -v 10856.5 22461 2594.7 -vt 0.0494596 0.598928 -o mesh893 -s off -f 4546/4546/4546 4547/4547/4547 4548/4548/4548 -g charts -o chart0000 -s off -f 4546/4546/4546 4547/4547/4547 4548/4548/4548 -v 10856.5 22461 2594.7 -vt 0.754364 0.297197 -v 10856.5 22493.7 -247.8 -vt 0.754364 0.319456 -v 10856.5 22493.7 2557.2 -vt 0.753533 0.297493 -o mesh894 -s off -f 4549/4549/4549 4550/4550/4550 4551/4551/4551 -g charts -o chart0000 -s off -f 4549/4549/4549 4550/4550/4550 4551/4551/4551 -v 10856.5 22461 2594.7 -vt 0.883209 0.308739 -v 10856.5 22493.7 2557.2 -vt 0.88295 0.307914 -v 10856.5 23616 2594.7 -vt 0.874065 0.308739 -o mesh895 -s off -f 4552/4552/4552 4553/4553/4553 4554/4554/4554 -g charts -o chart0000 -s off -f 4552/4552/4552 4553/4553/4553 4554/4554/4554 -v 10691.5 23616 2594.7 -vt 0.983791 0.221352 -v 10691.5 22461 2594.7 -vt 0.983791 0.23042 -v 10856.5 22461 2594.7 -vt 0.985453 0.23042 -v 10856.5 23616 2594.7 -vt 0.985453 0.221352 -o mesh896 -s off -f 4555/4555/4555 4556/4556/4556 4557/4557/4557 -f 4555/4555/4555 4557/4557/4557 4558/4558/4558 -g charts -o chart0000 -s off -f 4555/4555/4555 4556/4556/4556 4557/4557/4557 -f 4555/4555/4555 4557/4557/4557 4558/4558/4558 -v 10691.5 22461 2594.7 -vt 0.0852037 0.153751 -v 10691.5 22461 -285.3 -vt 0.0852037 0.176834 -v 10774 22461 -285.3 -vt 0.0860348 0.176834 -v 10856.5 22461 -285.3 -vt 0.0868661 0.176834 -v 10856.5 22461 2594.7 -vt 0.0868661 0.153751 -o mesh897 -s off -f 4559/4559/4559 4560/4560/4560 4561/4561/4561 -f 4559/4559/4559 4561/4561/4561 4562/4562/4562 -f 4559/4559/4559 4562/4562/4562 4563/4563/4563 -g charts -o chart0000 -s off -f 4559/4559/4559 4560/4560/4560 4561/4561/4561 -f 4559/4559/4559 4561/4561/4561 4562/4562/4562 -f 4559/4559/4559 4562/4562/4562 4563/4563/4563 -v 10691.5 22461 -285.3 -vt 0.975478 0.764633 -v 10691.5 23616 -285.3 -vt 0.975478 0.755565 -v 10856.5 23616 -285.3 -vt 0.973815 0.755565 -v 10856.5 22461 -285.3 -vt 0.973815 0.764633 -v 10774 22461 -285.3 -vt 0.974647 0.764633 -o mesh898 -s off -f 4564/4564/4564 4565/4565/4565 4566/4566/4566 -f 4564/4564/4564 4566/4566/4566 4567/4567/4567 -f 4564/4564/4564 4567/4567/4567 4568/4568/4568 -g charts -o chart0000 -s off -f 4564/4564/4564 4565/4565/4565 4566/4566/4566 -f 4564/4564/4564 4566/4566/4566 4567/4567/4567 -f 4564/4564/4564 4567/4567/4567 4568/4568/4568 -v 10691.5 23616 -285.3 -vt 0.899002 0.908079 -v 10691.5 23616 2594.7 -vt 0.899002 0.884996 -v 10856.5 23616 2594.7 -vt 0.89734 0.884996 -v 10856.5 23616 -285.3 -vt 0.89734 0.908079 -o mesh899 -s off -f 4569/4569/4569 4570/4570/4570 4571/4571/4571 -f 4569/4569/4569 4571/4571/4571 4572/4572/4572 -g charts -o chart0000 -s off -f 4569/4569/4569 4570/4570/4570 4571/4571/4571 -f 4569/4569/4569 4571/4571/4571 4572/4572/4572 -v 10856.5 22493.7 -247.8 -vt 0.881546 0.781121 -v 10826.5 22493.7 1934.7 -vt 0.864083 0.781421 -v 10856.5 22493.7 2557.2 -vt 0.859102 0.781121 -v 10691.5 22493.7 -247.8 -vt 0.881546 0.78277 -v 10781.5 22493.7 1934.7 -vt 0.864083 0.781871 -v 10781.5 22493.7 1960.95 -vt 0.863873 0.781871 -v 10691.5 22493.7 2557.2 -vt 0.859102 0.78277 -v 10826.5 22493.7 1960.95 -vt 0.863873 0.781421 -o mesh900 -s off -f 4573/4573/4573 4574/4574/4574 4575/4575/4575 -f 4574/4574/4574 4573/4573/4573 4576/4576/4576 -f 4574/4574/4574 4576/4576/4576 4577/4577/4577 -f 4577/4577/4577 4576/4576/4576 4578/4578/4578 -f 4578/4578/4578 4576/4576/4576 4579/4579/4579 -f 4575/4575/4575 4580/4580/4580 4579/4579/4579 -f 4580/4580/4580 4575/4575/4575 4574/4574/4574 -f 4579/4579/4579 4580/4580/4580 4578/4578/4578 -g charts -o chart0000 -s off -f 4573/4573/4573 4574/4574/4574 4575/4575/4575 -f 4574/4574/4574 4573/4573/4573 4576/4576/4576 -f 4574/4574/4574 4576/4576/4576 4577/4577/4577 -f 4577/4577/4577 4576/4576/4576 4578/4578/4578 -f 4578/4578/4578 4576/4576/4576 4579/4579/4579 -f 4575/4575/4575 4580/4580/4580 4579/4579/4579 -f 4580/4580/4580 4575/4575/4575 4574/4574/4574 -f 4579/4579/4579 4580/4580/4580 4578/4578/4578 -v 10691.5 22493.7 2557.2 -vt 0.819202 0.993817 -v 10691.5 22852.8 2557.2 -vt 0.815877 0.993817 -v 10781.5 22852.8 2557.2 -vt 0.815877 0.992918 -v 10826.5 22852.8 2557.2 -vt 0.815877 0.992468 -v 10856.5 22852.8 2557.2 -vt 0.815877 0.992168 -v 10856.5 22493.7 2557.2 -vt 0.819202 0.992168 -o mesh901 -s off -f 4581/4581/4581 4582/4582/4582 4583/4583/4583 -f 4581/4581/4581 4583/4583/4583 4584/4584/4584 -f 4581/4581/4581 4584/4584/4584 4585/4585/4585 -f 4581/4581/4581 4585/4585/4585 4586/4586/4586 -g charts -o chart0000 -s off -f 4581/4581/4581 4582/4582/4582 4583/4583/4583 -f 4581/4581/4581 4583/4583/4583 4584/4584/4584 -f 4581/4581/4581 4584/4584/4584 4585/4585/4585 -f 4581/4581/4581 4585/4585/4585 4586/4586/4586 -v 10856.5 22852.8 2557.2 -vt 0.511638 0.528854 -v 10826.5 22852.8 2557.2 -vt 0.512469 0.528854 -v 10826.5 22875.7 2557.2 -vt 0.512469 0.529678 -v 10856.5 22875.7 2557.2 -vt 0.511638 0.529678 -o mesh902 -s off -f 4587/4587/4587 4588/4588/4588 4589/4589/4589 -f 4587/4587/4587 4589/4589/4589 4590/4590/4590 -g charts -o chart0000 -s off -f 4587/4587/4587 4588/4588/4588 4589/4589/4589 -f 4587/4587/4587 4589/4589/4589 4590/4590/4590 -v 10691.5 22875.7 2557.2 -vt 0.415212 0.434872 -v 10691.5 23201.3 2557.2 -vt 0.415212 0.431575 -v 10781.5 23201.3 2557.2 -vt 0.414305 0.431575 -v 10826.5 23201.3 2557.2 -vt 0.413852 0.431575 -v 10856.5 23201.3 2557.2 -vt 0.413549 0.431575 -v 10856.5 22875.7 2557.2 -vt 0.413549 0.434872 -v 10826.5 22875.7 2557.2 -vt 0.413852 0.434872 -v 10781.5 22875.7 2557.2 -vt 0.414305 0.434872 -o mesh903 -s off -f 4591/4591/4591 4592/4592/4592 4593/4593/4593 -f 4591/4591/4591 4593/4593/4593 4594/4594/4594 -f 4591/4591/4591 4594/4594/4594 4595/4595/4595 -f 4591/4591/4591 4595/4595/4595 4596/4596/4596 -f 4591/4591/4591 4596/4596/4596 4597/4597/4597 -f 4591/4591/4591 4597/4597/4597 4598/4598/4598 -g charts -o chart0000 -s off -f 4591/4591/4591 4592/4592/4592 4593/4593/4593 -f 4591/4591/4591 4593/4593/4593 4594/4594/4594 -f 4591/4591/4591 4594/4594/4594 4595/4595/4595 -f 4591/4591/4591 4595/4595/4595 4596/4596/4596 -f 4591/4591/4591 4596/4596/4596 4597/4597/4597 -f 4591/4591/4591 4597/4597/4597 4598/4598/4598 -v 10856.5 23201.3 2557.2 -vt 0.0610973 0.913026 -v 10826.5 23201.3 2557.2 -vt 0.0619284 0.913026 -v 10826.5 23224.2 2557.2 -vt 0.0619284 0.91385 -v 10856.5 23224.2 2557.2 -vt 0.0610973 0.91385 -o mesh904 -s off -f 4599/4599/4599 4600/4600/4600 4601/4601/4601 -f 4599/4599/4599 4601/4601/4601 4602/4602/4602 -g charts -o chart0000 -s off -f 4599/4599/4599 4600/4600/4600 4601/4601/4601 -f 4599/4599/4599 4601/4601/4601 4602/4602/4602 -v 10691.5 23224.2 2557.2 -vt 0.256442 0.480214 -v 10691.5 23583.3 2557.2 -vt 0.256442 0.476917 -v 10856.5 23583.3 2557.2 -vt 0.25478 0.476917 -v 10856.5 23224.2 2557.2 -vt 0.25478 0.480214 -v 10826.5 23224.2 2557.2 -vt 0.255082 0.480214 -v 10781.5 23224.2 2557.2 -vt 0.255535 0.480214 -o mesh905 -s off -f 4603/4603/4603 4604/4604/4604 4605/4605/4605 -f 4603/4603/4603 4605/4605/4605 4606/4606/4606 -f 4603/4603/4603 4606/4606/4606 4607/4607/4607 -f 4603/4603/4603 4607/4607/4607 4608/4608/4608 -g charts -o chart0000 -s off -f 4603/4603/4603 4604/4604/4604 4605/4605/4605 -f 4603/4603/4603 4605/4605/4605 4606/4606/4606 -f 4603/4603/4603 4606/4606/4606 4607/4607/4607 -f 4603/4603/4603 4607/4607/4607 4608/4608/4608 -v 10691.5 23583.3 2557.2 -vt 0.26808 0.997939 -v 10691.5 23583.3 1960.95 -vt 0.26808 0.993207 -v 10781.5 23583.3 1960.95 -vt 0.267173 0.993207 -v 10826.5 23583.3 1960.95 -vt 0.26672 0.993207 -v 10856.5 23583.3 1960.95 -vt 0.266417 0.993207 -v 10856.5 23583.3 2557.2 -vt 0.266417 0.997939 -v 10826.5 23583.3 1934.7 -vt 0.26672 0.992999 -v 10856.5 23583.3 1934.7 -vt 0.266417 0.992999 -v 10691.5 23583.3 1934.7 -vt 0.26808 0.992999 -v 10691.5 23583.3 -247.8 -vt 0.26808 0.97568 -v 10856.5 23583.3 -247.8 -vt 0.266417 0.97568 -v 10781.5 23583.3 1934.7 -vt 0.267173 0.992999 -o mesh906 -s off -f 4609/4609/4609 4610/4610/4610 4611/4611/4611 -f 4609/4609/4609 4611/4611/4611 4612/4612/4612 -f 4609/4609/4609 4612/4612/4612 4613/4613/4613 -f 4609/4609/4609 4613/4613/4613 4614/4614/4614 -f 4613/4613/4613 4612/4612/4612 4615/4615/4615 -f 4613/4613/4613 4615/4615/4615 4616/4616/4616 -f 4617/4617/4617 4618/4618/4618 4619/4619/4619 -f 4617/4617/4617 4619/4619/4619 4616/4616/4616 -f 4617/4617/4617 4616/4616/4616 4615/4615/4615 -f 4617/4617/4617 4615/4615/4615 4620/4620/4620 -f 4612/4612/4612 4611/4611/4611 4620/4620/4620 -f 4612/4612/4612 4620/4620/4620 4615/4615/4615 -g charts -o chart0000 -s off -f 4609/4609/4609 4610/4610/4610 4611/4611/4611 -f 4609/4609/4609 4611/4611/4611 4612/4612/4612 -f 4609/4609/4609 4612/4612/4612 4613/4613/4613 -f 4609/4609/4609 4613/4613/4613 4614/4614/4614 -f 4613/4613/4613 4612/4612/4612 4615/4615/4615 -f 4613/4613/4613 4615/4615/4615 4616/4616/4616 -f 4617/4617/4617 4618/4618/4618 4619/4619/4619 -f 4617/4617/4617 4619/4619/4619 4616/4616/4616 -f 4617/4617/4617 4616/4616/4616 4615/4615/4615 -f 4617/4617/4617 4615/4615/4615 4620/4620/4620 -f 4612/4612/4612 4611/4611/4611 4620/4620/4620 -f 4612/4612/4612 4620/4620/4620 4615/4615/4615 -v 10691.5 23583.3 -247.8 -vt 0.157523 0.312861 -v 10691.5 22493.7 -247.8 -vt 0.157523 0.321929 -v 10856.5 22493.7 -247.8 -vt 0.159185 0.321929 -v 10856.5 23583.3 -247.8 -vt 0.159185 0.312861 -o mesh907 -s off -f 4621/4621/4621 4622/4622/4622 4623/4623/4623 -f 4621/4621/4621 4623/4623/4623 4624/4624/4624 -g charts -o chart0000 -s off -f 4621/4621/4621 4622/4622/4622 4623/4623/4623 -f 4621/4621/4621 4623/4623/4623 4624/4624/4624 -v 10826.5 22852.8 2557.2 -vt 0.322943 0.671476 -v 10826.5 22852.8 1960.95 -vt 0.32793 0.671476 -v 10826.5 22493.7 1960.95 -vt 0.32793 0.668178 -v 10826.5 22852.8 2557.2 -vt 0.0522648 0.636851 -v 10826.5 22493.7 1960.95 -vt 0.0552784 0.641589 -v 10826.5 22493.7 1934.7 -vt 0.0552784 0.641797 -v 10826.5 23583.3 1934.7 -vt 0.0461347 0.641797 -v 10826.5 23583.3 1960.95 -vt 0.0461347 0.641589 -v 10826.5 22852.8 2557.2 -vt 0.953865 0.96249 -v 10826.5 23583.3 1960.95 -vt 0.946384 0.96249 -v 10826.5 23224.2 1960.95 -vt 0.948591 0.960016 -v 10826.5 22852.8 2557.2 -vt 0.0876974 0.656636 -v 10826.5 23224.2 1960.95 -vt 0.0935161 0.656636 -v 10826.5 23224.2 2557.2 -vt 0.0893237 0.654163 -v 10826.5 23201.3 2557.2 -vt 0.0892234 0.654316 -v 10826.5 22852.8 2557.2 -vt 0.0802161 0.493405 -v 10826.5 23201.3 2557.2 -vt 0.0835411 0.493405 -v 10826.5 23201.3 1960.95 -vt 0.0835411 0.498351 -v 10826.5 22875.7 1960.95 -vt 0.0804346 0.498351 -v 10826.5 22852.8 2557.2 -vt 0.872402 0.223001 -v 10826.5 22875.7 1960.95 -vt 0.873233 0.218054 -v 10826.5 22875.7 2557.2 -vt 0.873233 0.223001 -o mesh908 -s off -f 4625/4625/4625 4626/4626/4626 4627/4627/4627 -f 4628/4628/4628 4629/4629/4629 4630/4630/4630 -f 4628/4628/4628 4630/4630/4630 4631/4631/4631 -f 4628/4628/4628 4631/4631/4631 4632/4632/4632 -f 4633/4633/4633 4634/4634/4634 4635/4635/4635 -f 4636/4636/4636 4637/4637/4637 4638/4638/4638 -f 4636/4636/4636 4638/4638/4638 4639/4639/4639 -f 4640/4640/4640 4641/4641/4641 4642/4642/4642 -f 4640/4640/4640 4642/4642/4642 4643/4643/4643 -f 4644/4644/4644 4645/4645/4645 4646/4646/4646 -g charts -o chart0000 -s off -f 4625/4625/4625 4626/4626/4626 4627/4627/4627 -o chart0001 -s off -f 4628/4628/4628 4629/4629/4629 4630/4630/4630 -f 4628/4628/4628 4630/4630/4630 4631/4631/4631 -f 4628/4628/4628 4631/4631/4631 4632/4632/4632 -o chart0002 -s off -f 4633/4633/4633 4634/4634/4634 4635/4635/4635 -o chart0003 -s off -f 4636/4636/4636 4637/4637/4637 4638/4638/4638 -f 4636/4636/4636 4638/4638/4638 4639/4639/4639 -o chart0004 -s off -f 4640/4640/4640 4641/4641/4641 4642/4642/4642 -f 4640/4640/4640 4642/4642/4642 4643/4643/4643 -o chart0005 -s off -f 4644/4644/4644 4645/4645/4645 4646/4646/4646 -v 10826.5 22852.8 1960.95 -vt 0.272236 0.474443 -v 10826.5 22852.8 2557.2 -vt 0.267249 0.474443 -v 10781.5 22852.8 2557.2 -vt 0.267249 0.473619 -v 10781.5 22852.8 1960.95 -vt 0.272236 0.473619 -o mesh909 -s off -f 4647/4647/4647 4648/4648/4648 4649/4649/4649 -f 4647/4647/4647 4649/4649/4649 4650/4650/4650 -g charts -o chart0000 -s off -f 4647/4647/4647 4648/4648/4648 4649/4649/4649 -f 4647/4647/4647 4649/4649/4649 4650/4650/4650 -v 10826.5 22852.8 1960.95 -vt 0.4734 0.426628 -v 10781.5 22852.8 1960.95 -vt 0.472569 0.426628 -v 10781.5 22493.7 1960.95 -vt 0.472569 0.423331 -v 10826.5 22493.7 1960.95 -vt 0.4734 0.423331 -o mesh910 -s off -f 4651/4651/4651 4652/4652/4652 4653/4653/4653 -f 4651/4651/4651 4653/4653/4653 4654/4654/4654 -g charts -o chart0000 -s off -f 4651/4651/4651 4652/4652/4652 4653/4653/4653 -f 4651/4651/4651 4653/4653/4653 4654/4654/4654 -v 10826.5 22493.7 1934.7 -vt 0.874065 0.407667 -v 10781.5 22493.7 1934.7 -vt 0.874896 0.407667 -v 10781.5 22493.7 1960.95 -vt 0.874896 0.408491 -v 10826.5 22493.7 1960.95 -vt 0.874065 0.408491 -o mesh911 -s off -f 4655/4655/4655 4656/4656/4656 4657/4657/4657 -f 4655/4655/4655 4657/4657/4657 4658/4658/4658 -g charts -o chart0000 -s off -f 4655/4655/4655 4656/4656/4656 4657/4657/4657 -f 4655/4655/4655 4657/4657/4657 4658/4658/4658 -v 10826.5 22493.7 1934.7 -vt 0.415212 0.841302 -v 10781.5 22493.7 1934.7 -vt 0.416043 0.841302 -v 10781.5 23583.3 1934.7 -vt 0.416043 0.832234 -v 10826.5 23583.3 1934.7 -vt 0.415212 0.832234 -o mesh912 -s off -f 4659/4659/4659 4660/4660/4660 4661/4661/4661 -f 4659/4659/4659 4661/4661/4661 4662/4662/4662 -g charts -o chart0000 -s off -f 4659/4659/4659 4660/4660/4660 4661/4661/4661 -f 4659/4659/4659 4661/4661/4661 4662/4662/4662 -v 10826.5 23583.3 1960.95 -vt 0.832502 0.784419 -v 10781.5 23583.3 1960.95 -vt 0.832502 0.783594 -v 10781.5 23224.2 1960.95 -vt 0.829177 0.783594 -v 10826.5 23224.2 1960.95 -vt 0.829177 0.784419 -o mesh913 -s off -f 4663/4663/4663 4664/4664/4664 4665/4665/4665 -f 4663/4663/4663 4665/4665/4665 4666/4666/4666 -g charts -o chart0000 -s off -f 4663/4663/4663 4664/4664/4664 4665/4665/4665 -f 4663/4663/4663 4665/4665/4665 4666/4666/4666 -v 10826.5 23224.2 1960.95 -vt 0.103491 0.995466 -v 10781.5 23224.2 1960.95 -vt 0.103491 0.99629 -v 10781.5 23224.2 2557.2 -vt 0.0985037 0.99629 -v 10826.5 23224.2 2557.2 -vt 0.0985037 0.995466 -o mesh914 -s off -f 4667/4667/4667 4668/4668/4668 4669/4669/4669 -f 4667/4667/4667 4669/4669/4669 4670/4670/4670 -g charts -o chart0000 -s off -f 4667/4667/4667 4668/4668/4668 4669/4669/4669 -f 4667/4667/4667 4669/4669/4669 4670/4670/4670 -v 10826.5 23201.3 2557.2 -vt 0.230673 0.586562 -v 10781.5 23201.3 2557.2 -vt 0.231504 0.586562 -v 10781.5 23224.2 2557.2 -vt 0.231504 0.587387 -v 10826.5 23224.2 2557.2 -vt 0.230673 0.587387 -o mesh915 -s off -f 4671/4671/4671 4672/4672/4672 4673/4673/4673 -f 4671/4671/4671 4673/4673/4673 4674/4674/4674 -g charts -o chart0000 -s off -f 4671/4671/4671 4672/4672/4672 4673/4673/4673 -f 4671/4671/4671 4673/4673/4673 4674/4674/4674 -v 10826.5 23201.3 2557.2 -vt 0.834165 0.311212 -v 10781.5 23201.3 2557.2 -vt 0.834165 0.310387 -v 10781.5 23201.3 1960.95 -vt 0.829177 0.310387 -v 10826.5 23201.3 1960.95 -vt 0.829177 0.311212 -o mesh916 -s off -f 4675/4675/4675 4676/4676/4676 4677/4677/4677 -f 4675/4675/4675 4677/4677/4677 4678/4678/4678 -g charts -o chart0000 -s off -f 4675/4675/4675 4676/4676/4676 4677/4677/4677 -f 4675/4675/4675 4677/4677/4677 4678/4678/4678 -v 10826.5 23201.3 1960.95 -vt 0.412718 0.433223 -v 10781.5 23201.3 1960.95 -vt 0.411887 0.433223 -v 10781.5 22875.7 1960.95 -vt 0.411887 0.429926 -v 10826.5 22875.7 1960.95 -vt 0.412718 0.429926 -o mesh917 -s off -f 4679/4679/4679 4680/4680/4680 4681/4681/4681 -f 4679/4679/4679 4681/4681/4681 4682/4682/4682 -g charts -o chart0000 -s off -f 4679/4679/4679 4680/4680/4680 4681/4681/4681 -f 4679/4679/4679 4681/4681/4681 4682/4682/4682 -v 10781.5 22875.7 1960.95 -vt 0.0976724 0.99629 -v 10781.5 22875.7 2557.2 -vt 0.0976724 0.991344 -v 10826.5 22875.7 2557.2 -vt 0.0968412 0.991344 -v 10826.5 22875.7 1960.95 -vt 0.0968412 0.99629 -o mesh918 -s off -f 4683/4683/4683 4684/4684/4684 4685/4685/4685 -f 4683/4683/4683 4685/4685/4685 4686/4686/4686 -g charts -o chart0000 -s off -f 4683/4683/4683 4684/4684/4684 4685/4685/4685 -f 4683/4683/4683 4685/4685/4685 4686/4686/4686 -v 10826.5 22852.8 2557.2 -vt 0.164173 0.630256 -v 10781.5 22852.8 2557.2 -vt 0.165004 0.630256 -v 10781.5 22875.7 2557.2 -vt 0.165004 0.63108 -v 10826.5 22875.7 2557.2 -vt 0.164173 0.63108 -o mesh919 -s off -f 4687/4687/4687 4688/4688/4688 4689/4689/4689 -f 4687/4687/4687 4689/4689/4689 4690/4690/4690 -g charts -o chart0000 -s off -f 4687/4687/4687 4688/4688/4688 4689/4689/4689 -f 4687/4687/4687 4689/4689/4689 4690/4690/4690 -v 10781.5 22493.7 1934.7 -vt 0.972984 0.764633 -v 10781.5 22493.7 1960.95 -vt 0.972153 0.764616 -v 10781.5 22852.8 1960.95 -vt 0.972984 0.761336 -v 10781.5 22493.7 1934.7 -vt 0.67872 0.383759 -v 10781.5 22852.8 1960.95 -vt 0.676226 0.385383 -v 10781.5 22852.8 2557.2 -vt 0.67872 0.38953 -v 10781.5 22493.7 1934.7 -vt 0.912302 0.681368 -v 10781.5 22852.8 2557.2 -vt 0.909164 0.676422 -v 10781.5 22875.7 2557.2 -vt 0.908976 0.676429 -v 10781.5 22875.7 1960.95 -vt 0.909157 0.68127 -v 10781.5 23201.3 1960.95 -vt 0.906484 0.681368 -v 10781.5 22493.7 1934.7 -vt 0.16916 0.377988 -v 10781.5 23201.3 1960.95 -vt 0.173515 0.373866 -v 10781.5 23201.3 2557.2 -vt 0.176642 0.377988 -v 10781.5 22493.7 1934.7 -vt 0.91064 0.932811 -v 10781.5 23201.3 2557.2 -vt 0.916578 0.937758 -v 10781.5 23224.2 2557.2 -vt 0.91677 0.937758 -v 10781.5 23224.2 1960.95 -vt 0.91677 0.93302 -v 10781.5 23583.3 1960.95 -vt 0.919784 0.93302 -v 10781.5 23583.3 1934.7 -vt 0.919784 0.932811 -o mesh920 -s off -f 4691/4691/4691 4692/4692/4692 4693/4693/4693 -f 4694/4694/4694 4695/4695/4695 4696/4696/4696 -f 4697/4697/4697 4698/4698/4698 4699/4699/4699 -f 4697/4697/4697 4699/4699/4699 4700/4700/4700 -f 4697/4697/4697 4700/4700/4700 4701/4701/4701 -f 4702/4702/4702 4703/4703/4703 4704/4704/4704 -f 4705/4705/4705 4706/4706/4706 4707/4707/4707 -f 4705/4705/4705 4707/4707/4707 4708/4708/4708 -f 4705/4705/4705 4708/4708/4708 4709/4709/4709 -f 4705/4705/4705 4709/4709/4709 4710/4710/4710 -g charts -o chart0000 -s off -f 4691/4691/4691 4692/4692/4692 4693/4693/4693 -o chart0001 -s off -f 4694/4694/4694 4695/4695/4695 4696/4696/4696 -o chart0002 -s off -f 4697/4697/4697 4698/4698/4698 4699/4699/4699 -f 4697/4697/4697 4699/4699/4699 4700/4700/4700 -f 4697/4697/4697 4700/4700/4700 4701/4701/4701 -o chart0003 -s off -f 4702/4702/4702 4703/4703/4703 4704/4704/4704 -o chart0004 -s off -f 4705/4705/4705 4706/4706/4706 4707/4707/4707 -f 4705/4705/4705 4707/4707/4707 4708/4708/4708 -f 4705/4705/4705 4708/4708/4708 4709/4709/4709 -f 4705/4705/4705 4709/4709/4709 4710/4710/4710 -v 10691.5 22852.8 2557.2 -vt 0.894846 0.998763 -v 10691.5 22875.7 2557.2 -vt 0.895677 0.998763 -v 10781.5 22875.7 2557.2 -vt 0.895677 0.997939 -v 10781.5 22852.8 2557.2 -vt 0.894846 0.997939 -o mesh921 -s off -f 4711/4711/4711 4712/4712/4712 4713/4713/4713 -f 4711/4711/4711 4713/4713/4713 4714/4714/4714 -g charts -o chart0000 -s off -f 4711/4711/4711 4712/4712/4712 4713/4713/4713 -f 4711/4711/4711 4713/4713/4713 4714/4714/4714 -v 10691.5 23201.3 2557.2 -vt 0.204073 0.647568 -v 10691.5 23224.2 2557.2 -vt 0.204904 0.647568 -v 10781.5 23224.2 2557.2 -vt 0.204904 0.646744 -v 10781.5 23201.3 2557.2 -vt 0.204073 0.646744 -o mesh922 -s off -f 4715/4715/4715 4716/4716/4716 4717/4717/4717 -f 4715/4715/4715 4717/4717/4717 4718/4718/4718 -g charts -o chart0000 -s off -f 4715/4715/4715 4716/4716/4716 4717/4717/4717 -f 4715/4715/4715 4717/4717/4717 4718/4718/4718 -v 10691.5 23583.3 1960.95 -vt 0.627182 0.995466 -v 10691.5 23583.3 1934.7 -vt 0.628013 0.995466 -v 10781.5 23583.3 1934.7 -vt 0.628013 0.994641 -v 10781.5 23583.3 1960.95 -vt 0.627182 0.994641 -o mesh923 -s off -f 4719/4719/4719 4720/4720/4720 4721/4721/4721 -f 4719/4719/4719 4721/4721/4721 4722/4722/4722 -g charts -o chart0000 -s off -f 4719/4719/4719 4720/4720/4720 4721/4721/4721 -f 4719/4719/4719 4721/4721/4721 4722/4722/4722 -v -14771 -8439.01 1254.82 -vt 0.93059 0.888293 -v -14771 -8439.01 1244.7 -vt 0.93059 0.887881 -v -14771 -8469.01 1244.7 -vt 0.929759 0.887881 -v -14771 -8469.01 1254.82 -vt 0.929759 0.888293 -v -14771 -8469.01 1234.58 -vt 0.929759 0.887469 -v -14771 -8439.01 1234.58 -vt 0.93059 0.887469 -o mesh924 -s off -f 4723/4723/4723 4724/4724/4724 4725/4725/4725 -f 4723/4723/4723 4725/4725/4725 4726/4726/4726 -f 4727/4727/4727 4725/4725/4725 4724/4724/4724 -f 4727/4727/4727 4724/4724/4724 4728/4728/4728 -g charts -o chart0000 -s off -f 4723/4723/4723 4724/4724/4724 4725/4725/4725 -f 4723/4723/4723 4725/4725/4725 4726/4726/4726 -f 4727/4727/4727 4725/4725/4725 4724/4724/4724 -f 4727/4727/4727 4724/4724/4724 4728/4728/4728 -v -9371 -8439.01 1254.82 -vt 0.443475 0.52803 -v -9371 -8439.01 1244.7 -vt 0.443475 0.527617 -v -9371 -8469.01 1244.7 -vt 0.442643 0.527617 -v -9371 -8469.01 1254.82 -vt 0.442643 0.52803 -v -9371 -8469.01 1234.58 -vt 0.442643 0.527205 -v -9371 -8439.01 1234.58 -vt 0.443475 0.527205 -o mesh925 -s off -f 4729/4729/4729 4730/4730/4730 4731/4731/4731 -f 4729/4729/4729 4731/4731/4731 4732/4732/4732 -f 4733/4733/4733 4731/4731/4731 4730/4730/4730 -f 4733/4733/4733 4730/4730/4730 4734/4734/4734 -g charts -o chart0000 -s off -f 4729/4729/4729 4730/4730/4730 4731/4731/4731 -f 4729/4729/4729 4731/4731/4731 4732/4732/4732 -f 4733/4733/4733 4731/4731/4731 4730/4730/4730 -f 4733/4733/4733 4730/4730/4730 4734/4734/4734 -v -13451 21932.5 2411.4 -vt 0.467581 0.960841 -v -13451 21767.5 2411.4 -vt 0.465919 0.960841 -v -13451 21767.5 -1615.65 -vt 0.465919 0.928689 -v -13451 21932.5 -1615.65 -vt 0.467581 0.928689 -o mesh926 -s off -f 4735/4735/4735 4736/4736/4736 4737/4737/4737 -f 4735/4735/4735 4737/4737/4737 4738/4738/4738 -g charts -o chart0000 -s off -f 4735/4735/4735 4736/4736/4736 4737/4737/4737 -f 4735/4735/4735 4737/4737/4737 4738/4738/4738 -v -13616 21932.5 2411.4 -vt 0.928928 0.998763 -v -13451 21932.5 2411.4 -vt 0.928928 0.997115 -v -13451 21932.5 -1615.65 -vt 0.896509 0.997115 -v -13616 21932.5 -1615.65 -vt 0.896509 0.998763 -o mesh927 -s off -f 4739/4739/4739 4740/4740/4740 4741/4741/4741 -f 4739/4739/4739 4741/4741/4741 4742/4742/4742 -g charts -o chart0000 -s off -f 4739/4739/4739 4740/4740/4740 4741/4741/4741 -f 4739/4739/4739 4741/4741/4741 4742/4742/4742 -v -13616 21767.5 2411.4 -vt 0.245636 0.456307 -v -13616 21932.5 2411.4 -vt 0.245636 0.454658 -v -13616 21932.5 -1615.65 -vt 0.213217 0.454658 -v -13616 21767.5 -1615.65 -vt 0.213217 0.456307 -o mesh928 -s off -f 4743/4743/4743 4744/4744/4744 4745/4745/4745 -f 4743/4743/4743 4745/4745/4745 4746/4746/4746 -g charts -o chart0000 -s off -f 4743/4743/4743 4744/4744/4744 4745/4745/4745 -f 4743/4743/4743 4745/4745/4745 4746/4746/4746 -v -13451 21767.5 2411.4 -vt 0.988778 0.349134 -v -13616 21767.5 2411.4 -vt 0.988778 0.347486 -v -13616 21767.5 -1615.65 -vt 0.956359 0.347486 -v -13451 21767.5 -1615.65 -vt 0.956359 0.349134 -o mesh929 -s off -f 4747/4747/4747 4748/4748/4748 4749/4749/4749 -f 4747/4747/4747 4749/4749/4749 4750/4750/4750 -g charts -o chart0000 -s off -f 4747/4747/4747 4748/4748/4748 4749/4749/4749 -f 4747/4747/4747 4749/4749/4749 4750/4750/4750 -v -13451 21767.5 -1615.65 -vt 0.0785536 0.922918 -v -13616 21767.5 -1615.65 -vt 0.080216 0.922918 -v -13616 21932.5 -1615.65 -vt 0.080216 0.92127 -v -13451 21932.5 -1615.65 -vt 0.0785536 0.92127 -o mesh930 -s off -f 4751/4751/4751 4752/4752/4752 4753/4753/4753 -f 4751/4751/4751 4753/4753/4753 4754/4754/4754 -g charts -o chart0000 -s off -f 4751/4751/4751 4752/4752/4752 4753/4753/4753 -f 4751/4751/4751 4753/4753/4753 4754/4754/4754 -v -13616 21767.5 2411.4 -vt 0.794264 0.522259 -v -13451 21767.5 2411.4 -vt 0.794264 0.523908 -v -13451 21932.5 2411.4 -vt 0.792602 0.523908 -v -13616 21932.5 2411.4 -vt 0.792602 0.522259 -o mesh931 -s off -f 4755/4755/4755 4756/4756/4756 4757/4757/4757 -f 4755/4755/4755 4757/4757/4757 4758/4758/4758 -g charts -o chart0000 -s off -f 4755/4755/4755 4756/4756/4756 4757/4757/4757 -f 4755/4755/4755 4757/4757/4757 4758/4758/4758 -v -13241 21932.5 2411.4 -vt 0.604738 0.591509 -v -13241 21767.5 2411.4 -vt 0.603076 0.591509 -v -13241 21767.5 -1615.65 -vt 0.603076 0.559357 -v -13241 21932.5 -1615.65 -vt 0.604738 0.559357 -o mesh932 -s off -f 4759/4759/4759 4760/4760/4760 4761/4761/4761 -f 4759/4759/4759 4761/4761/4761 4762/4762/4762 -g charts -o chart0000 -s off -f 4759/4759/4759 4760/4760/4760 4761/4761/4761 -f 4759/4759/4759 4761/4761/4761 4762/4762/4762 -v -13406 21932.5 2411.4 -vt 0.936409 0.696208 -v -13241 21932.5 2411.4 -vt 0.936409 0.694559 -v -13241 21932.5 -1615.65 -vt 0.90399 0.694559 -v -13406 21932.5 -1615.65 -vt 0.90399 0.696208 -o mesh933 -s off -f 4763/4763/4763 4764/4764/4764 4765/4765/4765 -f 4763/4763/4763 4765/4765/4765 4766/4766/4766 -g charts -o chart0000 -s off -f 4763/4763/4763 4764/4764/4764 4765/4765/4765 -f 4763/4763/4763 4765/4765/4765 4766/4766/4766 -v -13406 21767.5 2411.4 -vt 0.170823 0.964138 -v -13406 21932.5 2411.4 -vt 0.170823 0.96249 -v -13406 21932.5 -1615.65 -vt 0.138404 0.96249 -v -13406 21767.5 -1615.65 -vt 0.138404 0.964138 -o mesh934 -s off -f 4767/4767/4767 4768/4768/4768 4769/4769/4769 -f 4767/4767/4767 4769/4769/4769 4770/4770/4770 -g charts -o chart0000 -s off -f 4767/4767/4767 4768/4768/4768 4769/4769/4769 -f 4767/4767/4767 4769/4769/4769 4770/4770/4770 -v -13241 21767.5 2411.4 -vt 0.066916 0.903133 -v -13406 21767.5 2411.4 -vt 0.0652535 0.903133 -v -13406 21767.5 -1615.65 -vt 0.0652535 0.870981 -v -13241 21767.5 -1615.65 -vt 0.066916 0.870981 -o mesh935 -s off -f 4771/4771/4771 4772/4772/4772 4773/4773/4773 -f 4771/4771/4771 4773/4773/4773 4774/4774/4774 -g charts -o chart0000 -s off -f 4771/4771/4771 4772/4772/4772 4773/4773/4773 -f 4771/4771/4771 4773/4773/4773 4774/4774/4774 -v -13241 21767.5 -1615.65 -vt 0.132585 0.748145 -v -13406 21767.5 -1615.65 -vt 0.134248 0.748145 -v -13406 21932.5 -1615.65 -vt 0.134248 0.746496 -v -13241 21932.5 -1615.65 -vt 0.132585 0.746496 -o mesh936 -s off -f 4775/4775/4775 4776/4776/4776 4777/4777/4777 -f 4775/4775/4775 4777/4777/4777 4778/4778/4778 -g charts -o chart0000 -s off -f 4775/4775/4775 4776/4776/4776 4777/4777/4777 -f 4775/4775/4775 4777/4777/4777 4778/4778/4778 -v -13406 21767.5 2411.4 -vt 0.201579 0.715993 -v -13241 21767.5 2411.4 -vt 0.203242 0.715993 -v -13241 21932.5 2411.4 -vt 0.203242 0.714345 -v -13406 21932.5 2411.4 -vt 0.201579 0.714345 -o mesh937 -s off -f 4779/4779/4779 4780/4780/4780 4781/4781/4781 -f 4779/4779/4779 4781/4781/4781 4782/4782/4782 -g charts -o chart0000 -s off -f 4779/4779/4779 4780/4780/4780 4781/4781/4781 -f 4779/4779/4779 4781/4781/4781 4782/4782/4782 -v -8576 21932.5 2411.4 -vt 0.987115 0.515664 -v -8576 21767.5 2411.4 -vt 0.985453 0.515664 -v -8576 21767.5 -1615.65 -vt 0.985453 0.483512 -v -8576 21932.5 -1615.65 -vt 0.987115 0.483512 -o mesh938 -s off -f 4783/4783/4783 4784/4784/4784 4785/4785/4785 -f 4783/4783/4783 4785/4785/4785 4786/4786/4786 -g charts -o chart0000 -s off -f 4783/4783/4783 4784/4784/4784 4785/4785/4785 -f 4783/4783/4783 4785/4785/4785 4786/4786/4786 -v -8741 21932.5 2411.4 -vt 0.266417 0.488458 -v -8576 21932.5 2411.4 -vt 0.266417 0.48681 -v -8576 21932.5 -1615.65 -vt 0.233998 0.48681 -v -8741 21932.5 -1615.65 -vt 0.233998 0.488458 -o mesh939 -s off -f 4787/4787/4787 4788/4788/4788 4789/4789/4789 -f 4787/4787/4787 4789/4789/4789 4790/4790/4790 -g charts -o chart0000 -s off -f 4787/4787/4787 4788/4788/4788 4789/4789/4789 -f 4787/4787/4787 4789/4789/4789 4790/4790/4790 -v -8741 21767.5 2411.4 -vt 0.157523 0.994641 -v -8741 21932.5 2411.4 -vt 0.157523 0.992993 -v -8741 21932.5 -1615.65 -vt 0.125104 0.992993 -v -8741 21767.5 -1615.65 -vt 0.125104 0.994641 -o mesh940 -s off -f 4791/4791/4791 4792/4792/4792 4793/4793/4793 -f 4791/4791/4791 4793/4793/4793 4794/4794/4794 -g charts -o chart0000 -s off -f 4791/4791/4791 4792/4792/4792 4793/4793/4793 -f 4791/4791/4791 4793/4793/4793 4794/4794/4794 -v -8576 21767.5 2411.4 -vt 0.398587 0.748969 -v -8741 21767.5 2411.4 -vt 0.396924 0.748969 -v -8741 21767.5 -1615.65 -vt 0.396924 0.716818 -v -8576 21767.5 -1615.65 -vt 0.398587 0.716818 -o mesh941 -s off -f 4795/4795/4795 4796/4796/4796 4797/4797/4797 -f 4795/4795/4795 4797/4797/4797 4798/4798/4798 -g charts -o chart0000 -s off -f 4795/4795/4795 4796/4796/4796 4797/4797/4797 -f 4795/4795/4795 4797/4797/4797 4798/4798/4798 -v -8576 21767.5 -1615.65 -vt 0.572319 0.772877 -v -8741 21767.5 -1615.65 -vt 0.573982 0.772877 -v -8741 21932.5 -1615.65 -vt 0.573982 0.771228 -v -8576 21932.5 -1615.65 -vt 0.572319 0.771228 -o mesh942 -s off -f 4799/4799/4799 4800/4800/4800 4801/4801/4801 -f 4799/4799/4799 4801/4801/4801 4802/4802/4802 -g charts -o chart0000 -s off -f 4799/4799/4799 4800/4800/4800 4801/4801/4801 -f 4799/4799/4799 4801/4801/4801 4802/4802/4802 -v -8741 21767.5 2411.4 -vt 0.763508 0.528854 -v -8576 21767.5 2411.4 -vt 0.761845 0.528854 -v -8576 21932.5 2411.4 -vt 0.761845 0.530503 -v -8741 21932.5 2411.4 -vt 0.763508 0.530503 -o mesh943 -s off -f 4803/4803/4803 4804/4804/4804 4805/4805/4805 -f 4803/4803/4803 4805/4805/4805 4806/4806/4806 -g charts -o chart0000 -s off -f 4803/4803/4803 4804/4804/4804 4805/4805/4805 -f 4803/4803/4803 4805/4805/4805 4806/4806/4806 -v -8786 21932.5 2411.4 -vt 0.996259 0.488458 -v -8786 21767.5 2411.4 -vt 0.994597 0.488458 -v -8786 21767.5 -1615.65 -vt 0.994597 0.456307 -v -8786 21932.5 -1615.65 -vt 0.996259 0.456307 -o mesh944 -s off -f 4807/4807/4807 4808/4808/4808 4809/4809/4809 -f 4807/4807/4807 4809/4809/4809 4810/4810/4810 -g charts -o chart0000 -s off -f 4807/4807/4807 4808/4808/4808 4809/4809/4809 -f 4807/4807/4807 4809/4809/4809 4810/4810/4810 -v -8951 21932.5 2411.4 -vt 0.612219 0.472795 -v -8786 21932.5 2411.4 -vt 0.610557 0.472795 -v -8786 21932.5 -1615.65 -vt 0.610557 0.440643 -v -8951 21932.5 -1615.65 -vt 0.612219 0.440643 -o mesh945 -s off -f 4811/4811/4811 4812/4812/4812 4813/4813/4813 -f 4811/4811/4811 4813/4813/4813 4814/4814/4814 -g charts -o chart0000 -s off -f 4811/4811/4811 4812/4812/4812 4813/4813/4813 -f 4811/4811/4811 4813/4813/4813 4814/4814/4814 -v -8951 21767.5 2411.4 -vt 0.773483 0.889942 -v -8951 21932.5 2411.4 -vt 0.773483 0.888294 -v -8951 21932.5 -1615.65 -vt 0.741064 0.888294 -v -8951 21767.5 -1615.65 -vt 0.741064 0.889942 -o mesh946 -s off -f 4815/4815/4815 4816/4816/4816 4817/4817/4817 -f 4815/4815/4815 4817/4817/4817 4818/4818/4818 -g charts -o chart0000 -s off -f 4815/4815/4815 4816/4816/4816 4817/4817/4817 -f 4815/4815/4815 4817/4817/4817 4818/4818/4818 -v -8786 21767.5 2411.4 -vt 0.251455 0.814922 -v -8951 21767.5 2411.4 -vt 0.251455 0.813273 -v -8951 21767.5 -1615.65 -vt 0.219036 0.813273 -v -8786 21767.5 -1615.65 -vt 0.219036 0.814922 -o mesh947 -s off -f 4819/4819/4819 4820/4820/4820 4821/4821/4821 -f 4819/4819/4819 4821/4821/4821 4822/4822/4822 -g charts -o chart0000 -s off -f 4819/4819/4819 4820/4820/4820 4821/4821/4821 -f 4819/4819/4819 4821/4821/4821 4822/4822/4822 -v -8786 21767.5 -1615.65 -vt 0.222361 0.950948 -v -8951 21767.5 -1615.65 -vt 0.222361 0.952597 -v -8951 21932.5 -1615.65 -vt 0.220698 0.952597 -v -8786 21932.5 -1615.65 -vt 0.220698 0.950948 -o mesh948 -s off -f 4823/4823/4823 4824/4824/4824 4825/4825/4825 -f 4823/4823/4823 4825/4825/4825 4826/4826/4826 -g charts -o chart0000 -s off -f 4823/4823/4823 4824/4824/4824 4825/4825/4825 -f 4823/4823/4823 4825/4825/4825 4826/4826/4826 -v -8951 21767.5 2411.4 -vt 0.749377 0.524732 -v -8786 21767.5 2411.4 -vt 0.749377 0.526381 -v -8786 21932.5 2411.4 -vt 0.751039 0.526381 -v -8951 21932.5 2411.4 -vt 0.751039 0.524732 -o mesh949 -s off -f 4827/4827/4827 4828/4828/4828 4829/4829/4829 -f 4827/4827/4827 4829/4829/4829 4830/4830/4830 -g charts -o chart0000 -s off -f 4827/4827/4827 4828/4828/4828 4829/4829/4829 -f 4827/4827/4827 4829/4829/4829 4830/4830/4830 -v 19151.5 9478.49 247.2 -vt 0.887365 0.222176 -v 19151.5 9485.99 254.7 -vt 0.888196 0.222236 -v 19151.5 12808.5 247.2 -vt 0.887365 0.248557 -v 19151.5 12801 254.7 -vt 0.888196 0.248498 -o mesh950 -s off -f 4831/4831/4831 4832/4832/4832 4833/4833/4833 -f 4834/4834/4834 4833/4833/4833 4832/4832/4832 -g charts -o chart0000 -s off -f 4831/4831/4831 4832/4832/4832 4833/4833/4833 -f 4834/4834/4834 4833/4833/4833 4832/4832/4832 -v 19151.5 9485.99 254.7 -vt 0.780133 0.264282 -v 19151.5 9478.49 247.2 -vt 0.780964 0.264221 -v 19151.5 9478.49 2167.2 -vt 0.780964 0.279885 -v 19151.5 9485.99 2159.7 -vt 0.780133 0.279823 -o mesh951 -s off -f 4835/4835/4835 4836/4836/4836 4837/4837/4837 -f 4835/4835/4835 4837/4837/4837 4838/4838/4838 -g charts -o chart0000 -s off -f 4835/4835/4835 4836/4836/4836 4837/4837/4837 -f 4835/4835/4835 4837/4837/4837 4838/4838/4838 -v 19151.5 9485.99 2159.7 -vt 0.724499 0.311212 -v 19151.5 9478.49 2167.2 -vt 0.724439 0.312036 -v 19151.5 12801 2159.7 -vt 0.750979 0.311212 -v 19151.5 12808.5 2167.2 -vt 0.751039 0.312036 -o mesh952 -s off -f 4839/4839/4839 4840/4840/4840 4841/4841/4841 -f 4842/4842/4842 4841/4841/4841 4840/4840/4840 -g charts -o chart0000 -s off -f 4839/4839/4839 4840/4840/4840 4841/4841/4841 -f 4842/4842/4842 4841/4841/4841 4840/4840/4840 -v 19151.5 12808.5 247.2 -vt 0.0943475 0.658285 -v 19151.5 12801 254.7 -vt 0.0944092 0.65911 -v 19151.5 12808.5 2167.2 -vt 0.110141 0.658285 -v 19151.5 12801 2159.7 -vt 0.11008 0.65911 -o mesh953 -s off -f 4843/4843/4843 4844/4844/4844 4845/4845/4845 -f 4845/4845/4845 4844/4844/4844 4846/4846/4846 -g charts -o chart0000 -s off -f 4843/4843/4843 4844/4844/4844 4845/4845/4845 -f 4845/4845/4845 4844/4844/4844 4846/4846/4846 -v 19129 9313.49 2332.2 -vt 0.996259 0.452185 -v 19174 9313.49 2332.2 -vt 0.997091 0.452185 -v 19174 12973.5 2332.2 -vt 0.997091 0.423331 -v 19129 12973.5 2332.2 -vt 0.996259 0.423331 -o mesh954 -s off -f 4847/4847/4847 4848/4848/4848 4849/4849/4849 -f 4847/4847/4847 4849/4849/4849 4850/4850/4850 -g charts -o chart0000 -s off -f 4847/4847/4847 4848/4848/4848 4849/4849/4849 -f 4847/4847/4847 4849/4849/4849 4850/4850/4850 -v 19129 9313.49 82.1997 -vt 0.590607 0.883347 -v 19129 9478.49 247.2 -vt 0.591918 0.884996 -v 19129 12973.5 82.1997 -vt 0.619701 0.883347 -v 19129 12808.5 247.2 -vt 0.618389 0.884996 -o mesh955 -s off -f 4851/4851/4851 4852/4852/4852 4853/4853/4853 -f 4854/4854/4854 4853/4853/4853 4852/4852/4852 -g charts -o chart0000 -s off -f 4851/4851/4851 4852/4852/4852 4853/4853/4853 -f 4854/4854/4854 4853/4853/4853 4852/4852/4852 -v 19129 9478.49 247.2 -vt 0.236171 0.8446 -v 19129 9313.49 82.1997 -vt 0.23483 0.846249 -v 19129 9313.49 2332.2 -vt 0.253117 0.846249 -v 19129 9478.49 2167.2 -vt 0.251776 0.8446 -o mesh956 -s off -f 4855/4855/4855 4856/4856/4856 4857/4857/4857 -f 4855/4855/4855 4857/4857/4857 4858/4858/4858 -g charts -o chart0000 -s off -f 4855/4855/4855 4856/4856/4856 4857/4857/4857 -f 4855/4855/4855 4857/4857/4857 4858/4858/4858 -v 19129 9478.49 2167.2 -vt 0.490505 0.439819 -v 19129 9313.49 2332.2 -vt 0.489194 0.441467 -v 19129 12808.5 2167.2 -vt 0.516976 0.439819 -v 19129 12973.5 2332.2 -vt 0.518288 0.441467 -o mesh957 -s off -f 4859/4859/4859 4860/4860/4860 4861/4861/4861 -f 4862/4862/4862 4861/4861/4861 4860/4860/4860 -g charts -o chart0000 -s off -f 4859/4859/4859 4860/4860/4860 4861/4861/4861 -f 4862/4862/4862 4861/4861/4861 4860/4860/4860 -v 19129 12973.5 82.1997 -vt 0.823358 0.904782 -v 19129 12808.5 247.2 -vt 0.824699 0.90643 -v 19129 12973.5 2332.2 -vt 0.841646 0.904782 -v 19129 12808.5 2167.2 -vt 0.840305 0.90643 -o mesh958 -s off -f 4863/4863/4863 4864/4864/4864 4865/4865/4865 -f 4865/4865/4865 4864/4864/4864 4866/4866/4866 -g charts -o chart0000 -s off -f 4863/4863/4863 4864/4864/4864 4865/4865/4865 -f 4865/4865/4865 4864/4864/4864 4866/4866/4866 -v 19151.5 9478.49 247.2 -vt 0.00498749 0.5338 -v 19151.5 12808.5 247.2 -vt 0.00498749 0.50742 -v 19129 12808.5 247.2 -vt 0.0045719 0.50742 -v 19129 9478.49 247.2 -vt 0.0045719 0.5338 -v 19174 9478.49 247.2 -vt 0.00540308 0.5338 -v 19174 12808.5 247.2 -vt 0.00540308 0.50742 -o mesh959 -s off -f 4867/4867/4867 4868/4868/4868 4869/4869/4869 -f 4867/4867/4867 4869/4869/4869 4870/4870/4870 -f 4868/4868/4868 4867/4867/4867 4871/4871/4871 -f 4868/4868/4868 4871/4871/4871 4872/4872/4872 -g charts -o chart0000 -s off -f 4867/4867/4867 4868/4868/4868 4869/4869/4869 -f 4867/4867/4867 4869/4869/4869 4870/4870/4870 -f 4868/4868/4868 4867/4867/4867 4871/4871/4871 -f 4868/4868/4868 4871/4871/4871 4872/4872/4872 -v 19151.5 12808.5 247.2 -vt 0.934746 0.858203 -v 19151.5 12808.5 2167.2 -vt 0.918953 0.858203 -v 19129 12808.5 2167.2 -vt 0.918953 0.857791 -v 19129 12808.5 247.2 -vt 0.934746 0.857791 -v 19174 12808.5 247.2 -vt 0.934746 0.858615 -v 19174 12808.5 2167.2 -vt 0.918953 0.858615 -o mesh960 -s off -f 4873/4873/4873 4874/4874/4874 4875/4875/4875 -f 4873/4873/4873 4875/4875/4875 4876/4876/4876 -f 4874/4874/4874 4873/4873/4873 4877/4877/4877 -f 4874/4874/4874 4877/4877/4877 4878/4878/4878 -g charts -o chart0000 -s off -f 4873/4873/4873 4874/4874/4874 4875/4875/4875 -f 4873/4873/4873 4875/4875/4875 4876/4876/4876 -f 4874/4874/4874 4873/4873/4873 4877/4877/4877 -f 4874/4874/4874 4877/4877/4877 4878/4878/4878 -v 19151.5 12808.5 2167.2 -vt 0.79468 0.325227 -v 19151.5 9478.49 2167.2 -vt 0.79468 0.351608 -v 19129 9478.49 2167.2 -vt 0.795096 0.351608 -v 19129 12808.5 2167.2 -vt 0.795096 0.325227 -v 19174 12808.5 2167.2 -vt 0.794264 0.325227 -v 19174 9478.49 2167.2 -vt 0.794264 0.351608 -o mesh961 -s off -f 4879/4879/4879 4880/4880/4880 4881/4881/4881 -f 4879/4879/4879 4881/4881/4881 4882/4882/4882 -f 4880/4880/4880 4879/4879/4879 4883/4883/4883 -f 4880/4880/4880 4883/4883/4883 4884/4884/4884 -g charts -o chart0000 -s off -f 4879/4879/4879 4880/4880/4880 4881/4881/4881 -f 4879/4879/4879 4881/4881/4881 4882/4882/4882 -f 4880/4880/4880 4879/4879/4879 4883/4883/4883 -f 4880/4880/4880 4883/4883/4883 4884/4884/4884 -v 19151.5 9478.49 2167.2 -vt 0.0120532 0.739489 -v 19151.5 9478.49 247.2 -vt 0.027847 0.739489 -v 19129 9478.49 247.2 -vt 0.027847 0.739901 -v 19129 9478.49 2167.2 -vt 0.0120532 0.739901 -v 19174 9478.49 2167.2 -vt 0.0120532 0.739077 -v 19174 9478.49 247.2 -vt 0.027847 0.739077 -o mesh962 -s off -f 4885/4885/4885 4886/4886/4886 4887/4887/4887 -f 4885/4885/4885 4887/4887/4887 4888/4888/4888 -f 4886/4886/4886 4885/4885/4885 4889/4889/4889 -f 4886/4886/4886 4889/4889/4889 4890/4890/4890 -g charts -o chart0000 -s off -f 4885/4885/4885 4886/4886/4886 4887/4887/4887 -f 4885/4885/4885 4887/4887/4887 4888/4888/4888 -f 4886/4886/4886 4885/4885/4885 4889/4889/4889 -f 4886/4886/4886 4889/4889/4889 4890/4890/4890 -v 19129 9313.49 82.1997 -vt 0.219867 0.786892 -v 19174 9313.49 82.1997 -vt 0.220698 0.786892 -v 19174 9313.49 2332.2 -vt 0.220698 0.768755 -v 19129 9313.49 2332.2 -vt 0.219867 0.768755 -o mesh963 -s off -f 4891/4891/4891 4892/4892/4892 4893/4893/4893 -f 4891/4891/4891 4893/4893/4893 4894/4894/4894 -g charts -o chart0000 -s off -f 4891/4891/4891 4892/4892/4892 4893/4893/4893 -f 4891/4891/4891 4893/4893/4893 4894/4894/4894 -v 19129 12973.5 82.1997 -vt 0.893184 0.179307 -v 19174 12973.5 82.1997 -vt 0.892352 0.179307 -v 19174 9313.49 82.1997 -vt 0.892352 0.150453 -v 19129 9313.49 82.1997 -vt 0.893184 0.150453 -o mesh964 -s off -f 4895/4895/4895 4896/4896/4896 4897/4897/4897 -f 4895/4895/4895 4897/4897/4897 4898/4898/4898 -g charts -o chart0000 -s off -f 4895/4895/4895 4896/4896/4896 4897/4897/4897 -f 4895/4895/4895 4897/4897/4897 4898/4898/4898 -v 19129 12973.5 2332.2 -vt 0.713632 0.751443 -v 19174 12973.5 2332.2 -vt 0.713632 0.750618 -v 19174 12973.5 82.1997 -vt 0.695345 0.750618 -v 19129 12973.5 82.1997 -vt 0.695345 0.751443 -o mesh965 -s off -f 4899/4899/4899 4900/4900/4900 4901/4901/4901 -f 4899/4899/4899 4901/4901/4901 4902/4902/4902 -g charts -o chart0000 -s off -f 4899/4899/4899 4900/4900/4900 4901/4901/4901 -f 4899/4899/4899 4901/4901/4901 4902/4902/4902 -v 19174 12973.5 82.1997 -vt 0.906484 0.409316 -v 19174 12808.5 247.2 -vt 0.905172 0.407667 -v 19174 9313.49 82.1997 -vt 0.87739 0.409316 -v 19174 9478.49 247.2 -vt 0.878702 0.407667 -o mesh966 -s off -f 4903/4903/4903 4904/4904/4904 4905/4905/4905 -f 4906/4906/4906 4905/4905/4905 4904/4904/4904 -g charts -o chart0000 -s off -f 4903/4903/4903 4904/4904/4904 4905/4905/4905 -f 4906/4906/4906 4905/4905/4905 4904/4904/4904 -v 19174 12808.5 247.2 -vt 0.956869 0.650866 -v 19174 12973.5 82.1997 -vt 0.955528 0.652514 -v 19174 12973.5 2332.2 -vt 0.973815 0.652514 -v 19174 12808.5 2167.2 -vt 0.972474 0.650866 -o mesh967 -s off -f 4907/4907/4907 4908/4908/4908 4909/4909/4909 -f 4907/4907/4907 4909/4909/4909 4910/4910/4910 -g charts -o chart0000 -s off -f 4907/4907/4907 4908/4908/4908 4909/4909/4909 -f 4907/4907/4907 4909/4909/4909 4910/4910/4910 -v 19174 12808.5 2167.2 -vt 0.647483 0.428277 -v 19174 12973.5 2332.2 -vt 0.648795 0.426628 -v 19174 9478.49 2167.2 -vt 0.621012 0.428277 -v 19174 9313.49 2332.2 -vt 0.619701 0.426628 -o mesh968 -s off -f 4911/4911/4911 4912/4912/4912 4913/4913/4913 -f 4914/4914/4914 4913/4913/4913 4912/4912/4912 -g charts -o chart0000 -s off -f 4911/4911/4911 4912/4912/4912 4913/4913/4913 -f 4914/4914/4914 4913/4913/4913 4912/4912/4912 -v 19174 9313.49 82.1997 -vt 0.568163 0.968261 -v 19174 9478.49 247.2 -vt 0.569825 0.96959 -v 19174 9313.49 2332.2 -vt 0.568163 0.986397 -v 19174 9478.49 2167.2 -vt 0.569825 0.985067 -o mesh969 -s off -f 4915/4915/4915 4916/4916/4916 4917/4917/4917 -f 4917/4917/4917 4916/4916/4916 4918/4918/4918 -g charts -o chart0000 -s off -f 4915/4915/4915 4916/4916/4916 4917/4917/4917 -f 4917/4917/4917 4916/4916/4916 4918/4918/4918 -v 19151.5 9478.49 3847.2 -vt 0.779302 0.214757 -v 19151.5 9485.99 3854.7 -vt 0.780133 0.214816 -v 19151.5 12808.5 3847.2 -vt 0.779302 0.241138 -v 19151.5 12801 3854.7 -vt 0.780133 0.241078 -o mesh970 -s off -f 4919/4919/4919 4920/4920/4920 4921/4921/4921 -f 4922/4922/4922 4921/4921/4921 4920/4920/4920 -g charts -o chart0000 -s off -f 4919/4919/4919 4920/4920/4920 4921/4921/4921 -f 4922/4922/4922 4921/4921/4921 4920/4920/4920 -v 19151.5 9485.99 3854.7 -vt 0.965503 0.248618 -v 19151.5 9478.49 3847.2 -vt 0.966334 0.248557 -v 19151.5 9478.49 5767.2 -vt 0.966334 0.264221 -v 19151.5 9485.99 5759.7 -vt 0.965503 0.26416 -o mesh971 -s off -f 4923/4923/4923 4924/4924/4924 4925/4925/4925 -f 4923/4923/4923 4925/4925/4925 4926/4926/4926 -g charts -o chart0000 -s off -f 4923/4923/4923 4924/4924/4924 4925/4925/4925 -f 4923/4923/4923 4925/4925/4925 4926/4926/4926 -v 19151.5 9485.99 5759.7 -vt 0.707814 0.9271 -v 19151.5 9478.49 5767.2 -vt 0.708645 0.92704 -v 19151.5 12801 5759.7 -vt 0.707814 0.953362 -v 19151.5 12808.5 5767.2 -vt 0.708645 0.953421 -o mesh972 -s off -f 4927/4927/4927 4928/4928/4928 4929/4929/4929 -f 4930/4930/4930 4929/4929/4929 4928/4928/4928 -g charts -o chart0000 -s off -f 4927/4927/4927 4928/4928/4928 4929/4929/4929 -f 4930/4930/4930 4929/4929/4929 4928/4928/4928 -v 19151.5 12808.5 3847.2 -vt 0.0910224 0.154575 -v 19151.5 12801 3854.7 -vt 0.0918536 0.154637 -v 19151.5 12808.5 5767.2 -vt 0.0910224 0.170239 -v 19151.5 12801 5759.7 -vt 0.0918536 0.170178 -o mesh973 -s off -f 4931/4931/4931 4932/4932/4932 4933/4933/4933 -f 4933/4933/4933 4932/4932/4932 4934/4934/4934 -g charts -o chart0000 -s off -f 4931/4931/4931 4932/4932/4932 4933/4933/4933 -f 4933/4933/4933 4932/4932/4932 4934/4934/4934 -v 19129 9313.49 5932.2 -vt 0.998753 0.336768 -v 19174 9313.49 5932.2 -vt 0.999584 0.336768 -v 19174 12973.5 5932.2 -vt 0.999584 0.307914 -v 19129 12973.5 5932.2 -vt 0.998753 0.307914 -o mesh974 -s off -f 4935/4935/4935 4936/4936/4936 4937/4937/4937 -f 4935/4935/4935 4937/4937/4937 4938/4938/4938 -g charts -o chart0000 -s off -f 4935/4935/4935 4936/4936/4936 4937/4937/4937 -f 4935/4935/4935 4937/4937/4937 4938/4938/4938 -v 19129 9313.49 3682.2 -vt 0.419368 0.994641 -v 19129 9478.49 3847.2 -vt 0.42068 0.99629 -v 19129 12973.5 3682.2 -vt 0.448462 0.994641 -v 19129 12808.5 3847.2 -vt 0.44715 0.99629 -o mesh975 -s off -f 4939/4939/4939 4940/4940/4940 4941/4941/4941 -f 4942/4942/4942 4941/4941/4941 4940/4940/4940 -g charts -o chart0000 -s off -f 4939/4939/4939 4940/4940/4940 4941/4941/4941 -f 4942/4942/4942 4941/4941/4941 4940/4940/4940 -v 19129 9478.49 3847.2 -vt 0.766512 0.878401 -v 19129 9313.49 3682.2 -vt 0.76517 0.880049 -v 19129 9313.49 5932.2 -vt 0.783458 0.880049 -v 19129 9478.49 5767.2 -vt 0.782117 0.878401 -o mesh976 -s off -f 4943/4943/4943 4944/4944/4944 4945/4945/4945 -f 4943/4943/4943 4945/4945/4945 4946/4946/4946 -g charts -o chart0000 -s off -f 4943/4943/4943 4944/4944/4944 4945/4945/4945 -f 4943/4943/4943 4945/4945/4945 4946/4946/4946 -v 19129 9478.49 5767.2 -vt 0.458918 0.63108 -v 19129 9313.49 5932.2 -vt 0.457606 0.632729 -v 19129 12808.5 5767.2 -vt 0.485388 0.63108 -v 19129 12973.5 5932.2 -vt 0.4867 0.632729 -o mesh977 -s off -f 4947/4947/4947 4948/4948/4948 4949/4949/4949 -f 4950/4950/4950 4949/4949/4949 4948/4948/4948 -g charts -o chart0000 -s off -f 4947/4947/4947 4948/4948/4948 4949/4949/4949 -f 4950/4950/4950 4949/4949/4949 4948/4948/4948 -v 19129 12973.5 3682.2 -vt 0.483375 0.455482 -v 19129 12808.5 3847.2 -vt 0.484716 0.457131 -v 19129 12973.5 5932.2 -vt 0.501662 0.455482 -v 19129 12808.5 5767.2 -vt 0.500321 0.457131 -o mesh978 -s off -f 4951/4951/4951 4952/4952/4952 4953/4953/4953 -f 4953/4953/4953 4952/4952/4952 4954/4954/4954 -g charts -o chart0000 -s off -f 4951/4951/4951 4952/4952/4952 4953/4953/4953 -f 4953/4953/4953 4952/4952/4952 4954/4954/4954 -v 19151.5 9478.49 3847.2 -vt 0.780548 0.213108 -v 19151.5 12808.5 3847.2 -vt 0.780548 0.186727 -v 19129 12808.5 3847.2 -vt 0.780133 0.186727 -v 19129 9478.49 3847.2 -vt 0.780133 0.213108 -v 19174 9478.49 3847.2 -vt 0.780964 0.213108 -v 19174 12808.5 3847.2 -vt 0.780964 0.186727 -o mesh979 -s off -f 4955/4955/4955 4956/4956/4956 4957/4957/4957 -f 4955/4955/4955 4957/4957/4957 4958/4958/4958 -f 4956/4956/4956 4955/4955/4955 4959/4959/4959 -f 4956/4956/4956 4959/4959/4959 4960/4960/4960 -g charts -o chart0000 -s off -f 4955/4955/4955 4956/4956/4956 4957/4957/4957 -f 4955/4955/4955 4957/4957/4957 4958/4958/4958 -f 4956/4956/4956 4955/4955/4955 4959/4959/4959 -f 4956/4956/4956 4959/4959/4959 4960/4960/4960 -v 19151.5 12808.5 3847.2 -vt 0.878637 0.842951 -v 19151.5 12808.5 5767.2 -vt 0.878637 0.827288 -v 19129 12808.5 5767.2 -vt 0.878221 0.827288 -v 19129 12808.5 3847.2 -vt 0.878221 0.842951 -v 19174 12808.5 3847.2 -vt 0.879052 0.842951 -v 19174 12808.5 5767.2 -vt 0.879052 0.827288 -o mesh980 -s off -f 4961/4961/4961 4962/4962/4962 4963/4963/4963 -f 4961/4961/4961 4963/4963/4963 4964/4964/4964 -f 4962/4962/4962 4961/4961/4961 4965/4965/4965 -f 4962/4962/4962 4965/4965/4965 4966/4966/4966 -g charts -o chart0000 -s off -f 4961/4961/4961 4962/4962/4962 4963/4963/4963 -f 4961/4961/4961 4963/4963/4963 4964/4964/4964 -f 4962/4962/4962 4961/4961/4961 4965/4965/4965 -f 4962/4962/4962 4965/4965/4965 4966/4966/4966 -v 19151.5 12808.5 5767.2 -vt 0.366999 0.775762 -v 19151.5 9478.49 5767.2 -vt 0.393599 0.775762 -v 19129 9478.49 5767.2 -vt 0.393599 0.776175 -v 19129 12808.5 5767.2 -vt 0.366999 0.776175 -v 19174 12808.5 5767.2 -vt 0.366999 0.77535 -v 19174 9478.49 5767.2 -vt 0.393599 0.77535 -o mesh981 -s off -f 4967/4967/4967 4968/4968/4968 4969/4969/4969 -f 4967/4967/4967 4969/4969/4969 4970/4970/4970 -f 4968/4968/4968 4967/4967/4967 4971/4971/4971 -f 4968/4968/4968 4971/4971/4971 4972/4972/4972 -g charts -o chart0000 -s off -f 4967/4967/4967 4968/4968/4968 4969/4969/4969 -f 4967/4967/4967 4969/4969/4969 4970/4970/4970 -f 4968/4968/4968 4967/4967/4967 4971/4971/4971 -f 4968/4968/4968 4971/4971/4971 4972/4972/4972 -v 19151.5 9478.49 5767.2 -vt 0.0827099 0.885408 -v 19151.5 9478.49 3847.2 -vt 0.0985037 0.885408 -v 19129 9478.49 3847.2 -vt 0.0985037 0.88582 -v 19129 9478.49 5767.2 -vt 0.0827099 0.88582 -v 19174 9478.49 5767.2 -vt 0.0827099 0.884996 -v 19174 9478.49 3847.2 -vt 0.0985037 0.884996 -o mesh982 -s off -f 4973/4973/4973 4974/4974/4974 4975/4975/4975 -f 4973/4973/4973 4975/4975/4975 4976/4976/4976 -f 4974/4974/4974 4973/4973/4973 4977/4977/4977 -f 4974/4974/4974 4977/4977/4977 4978/4978/4978 -g charts -o chart0000 -s off -f 4973/4973/4973 4974/4974/4974 4975/4975/4975 -f 4973/4973/4973 4975/4975/4975 4976/4976/4976 -f 4974/4974/4974 4973/4973/4973 4977/4977/4977 -f 4974/4974/4974 4977/4977/4977 4978/4978/4978 -v 19129 9313.49 3682.2 -vt 0.899002 0.469497 -v 19174 9313.49 3682.2 -vt 0.899834 0.469497 -v 19174 9313.49 5932.2 -vt 0.899834 0.45136 -v 19129 9313.49 5932.2 -vt 0.899002 0.45136 -o mesh983 -s off -f 4979/4979/4979 4980/4980/4980 4981/4981/4981 -f 4979/4979/4979 4981/4981/4981 4982/4982/4982 -g charts -o chart0000 -s off -f 4979/4979/4979 4980/4980/4980 4981/4981/4981 -f 4979/4979/4979 4981/4981/4981 4982/4982/4982 -v 19129 12973.5 3682.2 -vt 0.79842 0.981451 -v 19174 12973.5 3682.2 -vt 0.79842 0.980627 -v 19174 9313.49 3682.2 -vt 0.769327 0.980627 -v 19129 9313.49 3682.2 -vt 0.769327 0.981451 -o mesh984 -s off -f 4983/4983/4983 4984/4984/4984 4985/4985/4985 -f 4983/4983/4983 4985/4985/4985 4986/4986/4986 -g charts -o chart0000 -s off -f 4983/4983/4983 4984/4984/4984 4985/4985/4985 -f 4983/4983/4983 4985/4985/4985 4986/4986/4986 -v 19129 12973.5 5932.2 -vt 0.999584 0.509068 -v 19174 12973.5 5932.2 -vt 0.998753 0.509068 -v 19174 12973.5 3682.2 -vt 0.998753 0.490932 -v 19129 12973.5 3682.2 -vt 0.999584 0.490932 -o mesh985 -s off -f 4987/4987/4987 4988/4988/4988 4989/4989/4989 -f 4987/4987/4987 4989/4989/4989 4990/4990/4990 -g charts -o chart0000 -s off -f 4987/4987/4987 4988/4988/4988 4989/4989/4989 -f 4987/4987/4987 4989/4989/4989 4990/4990/4990 -v 19174 12973.5 3682.2 -vt 0.716126 0.997939 -v 19174 12808.5 3847.2 -vt 0.714815 0.99629 -v 19174 9313.49 3682.2 -vt 0.687032 0.997939 -v 19174 9478.49 3847.2 -vt 0.688344 0.99629 -o mesh986 -s off -f 4991/4991/4991 4992/4992/4992 4993/4993/4993 -f 4994/4994/4994 4993/4993/4993 4992/4992/4992 -g charts -o chart0000 -s off -f 4991/4991/4991 4992/4992/4992 4993/4993/4993 -f 4994/4994/4994 4993/4993/4993 4992/4992/4992 -v 19174 12808.5 3847.2 -vt 0.230673 0.671157 -v 19174 12973.5 3682.2 -vt 0.232336 0.669827 -v 19174 12973.5 5932.2 -vt 0.232336 0.687964 -v 19174 12808.5 5767.2 -vt 0.230673 0.686634 -o mesh987 -s off -f 4995/4995/4995 4996/4996/4996 4997/4997/4997 -f 4995/4995/4995 4997/4997/4997 4998/4998/4998 -g charts -o chart0000 -s off -f 4995/4995/4995 4996/4996/4996 4997/4997/4997 -f 4995/4995/4995 4997/4997/4997 4998/4998/4998 -v 19174 12808.5 5767.2 -vt 0.0253532 0.403069 -v 19174 12973.5 5932.2 -vt 0.0236908 0.404369 -v 19174 9478.49 5767.2 -vt 0.0253532 0.376816 -v 19174 9313.49 5932.2 -vt 0.0236908 0.375515 -o mesh988 -s off -f 4999/4999/4999 5000/5000/5000 5001/5001/5001 -f 5002/5002/5002 5001/5001/5001 5000/5000/5000 -g charts -o chart0000 -s off -f 4999/4999/4999 5000/5000/5000 5001/5001/5001 -f 5002/5002/5002 5001/5001/5001 5000/5000/5000 -v 19174 9313.49 3682.2 -vt 0.0893599 0.490932 -v 19174 9478.49 3847.2 -vt 0.090701 0.49258 -v 19174 9313.49 5932.2 -vt 0.107647 0.490932 -v 19174 9478.49 5767.2 -vt 0.106306 0.49258 -o mesh989 -s off -f 5003/5003/5003 5004/5004/5004 5005/5005/5005 -f 5005/5005/5005 5004/5004/5004 5006/5006/5006 -g charts -o chart0000 -s off -f 5003/5003/5003 5004/5004/5004 5005/5005/5005 -f 5005/5005/5005 5004/5004/5004 5006/5006/5006 -v 10811.5 23781 4854.82 -vt 0.820864 0.78277 -v 10811.5 23781 4844.7 -vt 0.820864 0.782358 -v 10781.5 23781 4844.7 -vt 0.820033 0.782358 -v 10781.5 23781 4854.82 -vt 0.820033 0.78277 -v 10781.5 23781 4834.58 -vt 0.820033 0.781946 -v 10811.5 23781 4834.58 -vt 0.820864 0.781946 -o mesh990 -s off -f 5007/5007/5007 5008/5008/5008 5009/5009/5009 -f 5007/5007/5007 5009/5009/5009 5010/5010/5010 -f 5011/5011/5011 5009/5009/5009 5008/5008/5008 -f 5011/5011/5011 5008/5008/5008 5012/5012/5012 -g charts -o chart0000 -s off -f 5007/5007/5007 5008/5008/5008 5009/5009/5009 -f 5007/5007/5007 5009/5009/5009 5010/5010/5010 -f 5011/5011/5011 5009/5009/5009 5008/5008/5008 -f 5011/5011/5011 5008/5008/5008 5012/5012/5012 -v 10811.5 22656 4854.82 -vt 0.236492 0.697856 -v 10811.5 22656 4844.7 -vt 0.236492 0.697444 -v 10781.5 22656 4844.7 -vt 0.235661 0.697444 -v 10781.5 22656 4854.82 -vt 0.235661 0.697856 -v 10781.5 22656 4834.58 -vt 0.235661 0.697032 -v 10811.5 22656 4834.58 -vt 0.236492 0.697032 -o mesh991 -s off -f 5013/5013/5013 5014/5014/5014 5015/5015/5015 -f 5013/5013/5013 5015/5015/5015 5016/5016/5016 -f 5017/5017/5017 5015/5015/5015 5014/5014/5014 -f 5017/5017/5017 5014/5014/5014 5018/5018/5018 -g charts -o chart0000 -s off -f 5013/5013/5013 5014/5014/5014 5015/5015/5015 -f 5013/5013/5013 5015/5015/5015 5016/5016/5016 -f 5017/5017/5017 5015/5015/5015 5014/5014/5014 -f 5017/5017/5017 5014/5014/5014 5018/5018/5018 -v 16331.5 23541 4854.82 -vt 0.360349 0.935284 -v 16331.5 23541 4844.7 -vt 0.360765 0.935284 -v 16361.5 23541 4844.7 -vt 0.360765 0.936109 -v 16361.5 23541 4854.82 -vt 0.360349 0.936109 -v 16361.5 23541 4834.58 -vt 0.36118 0.936109 -v 16331.5 23541 4834.58 -vt 0.36118 0.935284 -o mesh992 -s off -f 5019/5019/5019 5020/5020/5020 5021/5021/5021 -f 5019/5019/5019 5021/5021/5021 5022/5022/5022 -f 5023/5023/5023 5021/5021/5021 5020/5020/5020 -f 5023/5023/5023 5020/5020/5020 5024/5024/5024 -g charts -o chart0000 -s off -f 5019/5019/5019 5020/5020/5020 5021/5021/5021 -f 5019/5019/5019 5021/5021/5021 5022/5022/5022 -f 5023/5023/5023 5021/5021/5021 5020/5020/5020 -f 5023/5023/5023 5020/5020/5020 5024/5024/5024 -v 16331.5 24666 4854.82 -vt 0.674564 0.899011 -v 16331.5 24666 4844.7 -vt 0.674564 0.899423 -v 16361.5 24666 4844.7 -vt 0.675395 0.899423 -v 16361.5 24666 4854.82 -vt 0.675395 0.899011 -v 16361.5 24666 4834.58 -vt 0.675395 0.899835 -v 16331.5 24666 4834.58 -vt 0.674564 0.899835 -o mesh993 -s off -f 5025/5025/5025 5026/5026/5026 5027/5027/5027 -f 5025/5025/5025 5027/5027/5027 5028/5028/5028 -f 5029/5029/5029 5027/5027/5027 5026/5026/5026 -f 5029/5029/5029 5026/5026/5026 5030/5030/5030 -g charts -o chart0000 -s off -f 5025/5025/5025 5026/5026/5026 5027/5027/5027 -f 5025/5025/5025 5027/5027/5027 5028/5028/5028 -f 5029/5029/5029 5027/5027/5027 5026/5026/5026 -f 5029/5029/5029 5026/5026/5026 5030/5030/5030 -v 10691.5 12403.5 5968.5 -vt 0.163342 0.654163 -v 10691.5 8089.46 3451.99 -vt 0.161679 0.613338 -v 10691.5 7881.48 3313.33 -vt 0.161741 0.611294 -v 10691.5 7973 3176.04 -vt 0.163342 0.611329 -v 10691.5 8180.99 3314.7 -vt 0.163279 0.613373 -v 10691.5 12403.5 5968.5 -vt 0.838321 0.311212 -v 10691.5 8180.99 3314.7 -vt 0.878221 0.311212 -v 10691.5 12403.5 5777.83 -vt 0.839133 0.309563 -o mesh994 -s off -f 5031/5031/5031 5032/5032/5032 5033/5033/5033 -f 5031/5031/5031 5033/5033/5033 5034/5034/5034 -f 5031/5031/5031 5034/5034/5034 5035/5035/5035 -f 5036/5036/5036 5037/5037/5037 5038/5038/5038 -g charts -o chart0000 -s off -f 5031/5031/5031 5032/5032/5032 5033/5033/5033 -f 5031/5031/5031 5033/5033/5033 5034/5034/5034 -f 5031/5031/5031 5034/5034/5034 5035/5035/5035 -o chart0001 -s off -f 5036/5036/5036 5037/5037/5037 5038/5038/5038 -v -6588.5 8089.47 3451.99 -vt 0.976309 0.189712 -v -6588.5 12403.5 5968.5 -vt 0.976444 0.150453 -v -6588.5 12403.5 5777.82 -vt 0.977972 0.151212 -v -6588.5 8180.99 3314.7 -vt 0.977839 0.189638 -v -6588.5 7973 3176.04 -vt 0.977972 0.1916 -v -6588.5 7881.48 3313.33 -vt 0.976442 0.191673 -o mesh995 -s off -f 5039/5039/5039 5040/5040/5040 5041/5041/5041 -f 5039/5039/5039 5041/5041/5041 5042/5042/5042 -f 5039/5039/5039 5042/5042/5042 5043/5043/5043 -f 5039/5039/5039 5043/5043/5043 5044/5044/5044 -g charts -o chart0000 -s off -f 5039/5039/5039 5040/5040/5040 5041/5041/5041 -f 5039/5039/5039 5041/5041/5041 5042/5042/5042 -f 5039/5039/5039 5042/5042/5042 5043/5043/5043 -f 5039/5039/5039 5043/5043/5043 5044/5044/5044 -v 10691.5 12403.5 5968.5 -vt 0.46675 0.72094 -v 3850.82 12403.5 5968.5 -vt 0.528286 0.72094 -v 3850.82 10921.4 5103.96 -vt 0.528286 0.736234 -v 265.817 10921.4 5103.96 -vt 0.560535 0.736234 -v 265.819 12403.5 5968.5 -vt 0.560535 0.72094 -v -6588.5 12403.5 5968.5 -vt 0.622194 0.72094 -v -6588.5 8089.47 3451.99 -vt 0.622194 0.765457 -v 10691.5 8089.46 3451.99 -vt 0.46675 0.765457 -o mesh996 -s off -f 5045/5045/5045 5046/5046/5046 5047/5047/5047 -f 5045/5045/5045 5047/5047/5047 5048/5048/5048 -f 5045/5045/5045 5048/5048/5048 5049/5049/5049 -f 5045/5045/5045 5049/5049/5049 5050/5050/5050 -f 5045/5045/5045 5050/5050/5050 5051/5051/5051 -f 5045/5045/5045 5051/5051/5051 5052/5052/5052 -g charts -o chart0000 -s off -f 5045/5045/5045 5046/5046/5046 5047/5047/5047 -f 5045/5045/5045 5047/5047/5047 5048/5048/5048 -f 5045/5045/5045 5048/5048/5048 5049/5049/5049 -f 5045/5045/5045 5049/5049/5049 5050/5050/5050 -f 5045/5045/5045 5050/5050/5050 5051/5051/5051 -f 5045/5045/5045 5051/5051/5051 5052/5052/5052 -v 265.819 12403.5 5968.5 -vt 0.796758 0.805029 -v 265.817 10921.4 5103.96 -vt 0.796758 0.819044 -v 265.817 11684.8 3795.34 -vt 0.809227 0.819044 -v 265.819 13166.9 4659.88 -vt 0.809227 0.805029 -o mesh997 -s off -f 5053/5053/5053 5054/5054/5054 5055/5055/5055 -f 5053/5053/5053 5055/5055/5055 5056/5056/5056 -g charts -o chart0000 -s off -f 5053/5053/5053 5054/5054/5054 5055/5055/5055 -f 5053/5053/5053 5055/5055/5055 5056/5056/5056 -v 10691.5 7973 3176.04 -vt 0.475893 0.611294 -v 10691.5 7881.48 3313.33 -vt 0.475893 0.609645 -v -6588.5 7881.48 3313.33 -vt 0.339568 0.609645 -v -6588.5 7973 3176.04 -vt 0.339568 0.611294 -o mesh998 -s off -f 5057/5057/5057 5058/5058/5058 5059/5059/5059 -f 5057/5057/5057 5059/5059/5059 5060/5060/5060 -g charts -o chart0000 -s off -f 5057/5057/5057 5058/5058/5058 5059/5059/5059 -f 5057/5057/5057 5059/5059/5059 5060/5060/5060 -v 10691.5 8089.46 3451.99 -vt 0.889027 0.157873 -v -6588.5 8089.47 3451.99 -vt 0.889027 0.293075 -v -6588.5 7881.48 3313.33 -vt 0.891521 0.293075 -v 10691.5 7881.48 3313.33 -vt 0.891521 0.157873 -o mesh999 -s off -f 5061/5061/5061 5062/5062/5062 5063/5063/5063 -f 5061/5061/5061 5063/5063/5063 5064/5064/5064 -g charts -o chart0000 -s off -f 5061/5061/5061 5062/5062/5062 5063/5063/5063 -f 5061/5061/5061 5063/5063/5063 5064/5064/5064 -v -6588.5 8180.99 3314.7 -vt 0.00374057 0.619538 -v 10691.5 8180.99 3314.7 -vt 0.00374057 0.484336 -v 10691.5 7973 3176.04 -vt 0.00124688 0.484336 -v -6588.5 7973 3176.04 -vt 0.00124688 0.619538 -o mesh1000 -s off -f 5065/5065/5065 5066/5066/5066 5067/5067/5067 -f 5065/5065/5065 5067/5067/5067 5068/5068/5068 -g charts -o chart0000 -s off -f 5065/5065/5065 5066/5066/5066 5067/5067/5067 -f 5065/5065/5065 5067/5067/5067 5068/5068/5068 -v 10691.5 12403.5 5777.83 -vt 0.998753 0.716007 -v 10691.5 16626 3314.7 -vt 0.998322 0.758127 -v 10691.5 17168.1 2953.28 -vt 0.998753 0.763733 -v 10691.5 17259.7 3090.57 -vt 0.99669 0.763809 -v 10691.5 16717.5 3451.99 -vt 0.996259 0.758202 -v 10691.5 12403.5 5968.5 -vt 0.9967 0.715169 -o mesh1001 -s off -f 5069/5069/5069 5070/5070/5070 5071/5071/5071 -f 5069/5069/5069 5071/5071/5071 5072/5072/5072 -f 5069/5069/5069 5072/5072/5072 5073/5073/5073 -f 5069/5069/5069 5073/5073/5073 5074/5074/5074 -g charts -o chart0000 -s off -f 5069/5069/5069 5070/5070/5070 5071/5071/5071 -f 5069/5069/5069 5071/5071/5071 5072/5072/5072 -f 5069/5069/5069 5072/5072/5072 5073/5073/5073 -f 5069/5069/5069 5073/5073/5073 5074/5074/5074 -v 3850.82 13802.6 4961.69 -vt 0.0982556 0.804125 -v 265.817 13802.6 4961.69 -vt 0.068938 0.804125 -v 265.819 12403.5 5777.82 -vt 0.068938 0.791014 -v -6588.5 12403.5 5777.82 -vt 0.0128845 0.791014 -v -6588.5 16626 3314.7 -vt 0.0128845 0.830585 -v 10691.5 16626 3314.7 -vt 0.154198 0.830585 -v 10691.5 12403.5 5777.83 -vt 0.154198 0.791014 -v 3850.82 12403.5 5777.82 -vt 0.0982556 0.791014 -o mesh1002 -s off -f 5075/5075/5075 5076/5076/5076 5077/5077/5077 -f 5075/5075/5075 5077/5077/5077 5078/5078/5078 -f 5075/5075/5075 5078/5078/5078 5079/5079/5079 -f 5075/5075/5075 5079/5079/5079 5080/5080/5080 -f 5075/5075/5075 5080/5080/5080 5081/5081/5081 -f 5075/5075/5075 5081/5081/5081 5082/5082/5082 -g charts -o chart0000 -s off -f 5075/5075/5075 5076/5076/5076 5077/5077/5077 -f 5075/5075/5075 5077/5077/5077 5078/5078/5078 -f 5075/5075/5075 5078/5078/5078 5079/5079/5079 -f 5075/5075/5075 5079/5079/5079 5080/5080/5080 -f 5075/5075/5075 5080/5080/5080 5081/5081/5081 -f 5075/5075/5075 5081/5081/5081 5082/5082/5082 -v -6588.5 17259.7 3090.56 -vt 0.503325 0.815207 -v -6588.5 17168.1 2953.28 -vt 0.503394 0.81657 -v -6588.5 16626 3314.7 -vt 0.508568 0.816285 -v -6588.5 12403.5 5777.82 -vt 0.54744 0.81657 -v -6588.5 12403.5 5968.5 -vt 0.548213 0.815213 -v -6588.5 16717.5 3451.99 -vt 0.508499 0.814922 -o mesh1003 -s off -f 5083/5083/5083 5084/5084/5084 5085/5085/5085 -f 5083/5083/5083 5085/5085/5085 5086/5086/5086 -f 5083/5083/5083 5086/5086/5086 5087/5087/5087 -f 5083/5083/5083 5087/5087/5087 5088/5088/5088 -g charts -o chart0000 -s off -f 5083/5083/5083 5084/5084/5084 5085/5085/5085 -f 5083/5083/5083 5085/5085/5085 5086/5086/5086 -f 5083/5083/5083 5086/5086/5086 5087/5087/5087 -f 5083/5083/5083 5087/5087/5087 5088/5088/5088 -v 3850.82 13802.6 4961.69 -vt 0.0710723 0.658285 -v 3850.82 12403.5 5777.82 -vt 0.0710723 0.671515 -v 3850.82 12320.5 5826.23 -vt 0.0710723 0.6723 -v 3850.82 12403.5 5968.5 -vt 0.0727348 0.6723 -v 3850.82 13885.6 5103.96 -vt 0.0727348 0.658285 -o mesh1004 -s off -f 5089/5089/5089 5090/5090/5090 5091/5091/5091 -f 5089/5089/5089 5091/5091/5091 5092/5092/5092 -f 5089/5089/5089 5092/5092/5092 5093/5093/5093 -g charts -o chart0000 -s off -f 5089/5089/5089 5090/5090/5090 5091/5091/5091 -f 5089/5089/5089 5091/5091/5091 5092/5092/5092 -f 5089/5089/5089 5092/5092/5092 5093/5093/5093 -v 265.817 13802.6 4961.69 -vt 0.919784 0.149629 -v 3850.82 13802.6 4961.69 -vt 0.919784 0.121599 -v 3850.82 13885.6 5103.96 -vt 0.918121 0.121599 -v 265.817 13885.6 5103.96 -vt 0.918121 0.149629 -o mesh1005 -s off -f 5094/5094/5094 5095/5095/5095 5096/5096/5096 -f 5094/5094/5094 5096/5096/5096 5097/5097/5097 -g charts -o chart0000 -s off -f 5094/5094/5094 5095/5095/5095 5096/5096/5096 -f 5094/5094/5094 5096/5096/5096 5097/5097/5097 -v 265.819 12320.5 5826.23 -vt 0.577307 0.787716 -v 265.819 12403.5 5777.82 -vt 0.577307 0.788501 -v 265.817 13802.6 4961.69 -vt 0.577307 0.801731 -v 265.817 13885.6 5103.96 -vt 0.575644 0.801731 -v 265.819 12403.5 5968.5 -vt 0.575644 0.787716 -o mesh1006 -s off -f 5098/5098/5098 5099/5099/5099 5100/5100/5100 -f 5098/5098/5098 5100/5100/5100 5101/5101/5101 -f 5098/5098/5098 5101/5101/5101 5102/5102/5102 -g charts -o chart0000 -s off -f 5098/5098/5098 5099/5099/5099 5100/5100/5100 -f 5098/5098/5098 5100/5100/5100 5101/5101/5101 -f 5098/5098/5098 5101/5101/5101 5102/5102/5102 -v 265.817 13885.6 5103.96 -vt 0.715655 0.779326 -v 3850.82 13885.6 5103.96 -vt 0.744972 0.779326 -v 3850.82 12403.5 5968.5 -vt 0.744972 0.793487 -v 10691.5 12403.5 5968.5 -vt 0.800914 0.793487 -v 10691.5 16717.5 3451.99 -vt 0.800914 0.752267 -v -6588.5 16717.5 3451.99 -vt 0.659601 0.752267 -v -6588.5 12403.5 5968.5 -vt 0.659601 0.793487 -v 265.819 12403.5 5968.5 -vt 0.715655 0.793487 -o mesh1007 -s off -f 5103/5103/5103 5104/5104/5104 5105/5105/5105 -f 5103/5103/5103 5105/5105/5105 5106/5106/5106 -f 5103/5103/5103 5106/5106/5106 5107/5107/5107 -f 5103/5103/5103 5107/5107/5107 5108/5108/5108 -f 5103/5103/5103 5108/5108/5108 5109/5109/5109 -f 5103/5103/5103 5109/5109/5109 5110/5110/5110 -g charts -o chart0000 -s off -f 5103/5103/5103 5104/5104/5104 5105/5105/5105 -f 5103/5103/5103 5105/5105/5105 5106/5106/5106 -f 5103/5103/5103 5106/5106/5106 5107/5107/5107 -f 5103/5103/5103 5107/5107/5107 5108/5108/5108 -f 5103/5103/5103 5108/5108/5108 5109/5109/5109 -f 5103/5103/5103 5109/5109/5109 5110/5110/5110 -v -6588.5 17168.1 2953.28 -vt 0.460931 0.637675 -v -6588.5 17259.7 3090.56 -vt 0.460931 0.636026 -v 10691.5 17259.7 3090.57 -vt 0.597257 0.636026 -v 10691.5 17168.1 2953.28 -vt 0.597257 0.637675 -o mesh1008 -s off -f 5111/5111/5111 5112/5112/5112 5113/5113/5113 -f 5111/5111/5111 5113/5113/5113 5114/5114/5114 -g charts -o chart0000 -s off -f 5111/5111/5111 5112/5112/5112 5113/5113/5113 -f 5111/5111/5111 5113/5113/5113 5114/5114/5114 -v -6588.5 17168.1 2953.28 -vt 0.0112219 0.870157 -v 10691.5 17168.1 2953.28 -vt 0.0112219 0.734955 -v 10691.5 16626 3314.7 -vt 0.00540316 0.734955 -v -6588.5 16626 3314.7 -vt 0.00540316 0.870157 -o mesh1009 -s off -f 5115/5115/5115 5116/5116/5116 5117/5117/5117 -f 5115/5115/5115 5117/5117/5117 5118/5118/5118 -g charts -o chart0000 -s off -f 5115/5115/5115 5116/5116/5116 5117/5117/5117 -f 5115/5115/5115 5117/5117/5117 5118/5118/5118 -v 10691.5 17259.7 3090.57 -vt 0.0644223 0.8446 -v -6588.5 17259.7 3090.56 -vt 0.200748 0.8446 -v -6588.5 16717.5 3451.99 -vt 0.200748 0.850371 -v 10691.5 16717.5 3451.99 -vt 0.0644223 0.850371 -o mesh1010 -s off -f 5119/5119/5119 5120/5120/5120 5121/5121/5121 -f 5119/5119/5119 5121/5121/5121 5122/5122/5122 -g charts -o chart0000 -s off -f 5119/5119/5119 5120/5120/5120 5121/5121/5121 -f 5119/5119/5119 5121/5121/5121 5122/5122/5122 -v -8193.5 -6939.01 -285.3 -vt 0.0187032 0.970734 -v -8193.5 -6819.01 -165.3 -vt 0.0196577 0.972382 -v -8193.5 -3699.01 -285.3 -vt 0.0444721 0.970734 -v -8193.5 -3819.01 -165.3 -vt 0.0435177 0.972382 -o mesh1011 -s off -f 5123/5123/5123 5124/5124/5124 5125/5125/5125 -f 5125/5125/5125 5124/5124/5124 5126/5126/5126 -g charts -o chart0000 -s off -f 5123/5123/5123 5124/5124/5124 5125/5125/5125 -f 5125/5125/5125 5124/5124/5124 5126/5126/5126 -v -8193.5 -6819.01 -165.3 -vt 0.864228 0.90066 -v -8193.5 -6939.01 -285.3 -vt 0.863259 0.902308 -v -8193.5 -6939.01 2594.7 -vt 0.886534 0.902308 -o mesh1012 -s off -f 5127/5127/5127 5128/5128/5128 5129/5129/5129 -g charts -o chart0000 -s off -f 5127/5127/5127 5128/5128/5128 5129/5129/5129 -v -8193.5 -6819.01 -165.3 -vt 0.222361 0.838005 -v -8193.5 -6939.01 2594.7 -vt 0.244805 0.838005 -v -8193.5 -6819.01 1694.7 -vt 0.237457 0.836843 -v -8193.5 -6819.01 1814.7 -vt 0.238431 0.836768 -v -8193.5 -6819.01 2474.7 -vt 0.243788 0.836356 -o mesh1013 -s off -f 5130/5130/5130 5131/5131/5131 5132/5132/5132 -f 5132/5132/5132 5131/5131/5131 5133/5133/5133 -f 5133/5133/5133 5131/5131/5131 5134/5134/5134 -g charts -o chart0000 -s off -f 5130/5130/5130 5131/5131/5131 5132/5132/5132 -f 5132/5132/5132 5131/5131/5131 5133/5133/5133 -f 5133/5133/5133 5131/5131/5131 5134/5134/5134 -v -8193.5 -6819.01 2474.7 -vt 0.27319 0.969909 -v -8193.5 -6939.01 2594.7 -vt 0.272236 0.971558 -v -8193.5 -3819.01 2474.7 -vt 0.29705 0.969909 -v -8193.5 -3699.01 2594.7 -vt 0.298005 0.971558 -o mesh1014 -s off -f 5135/5135/5135 5136/5136/5136 5137/5137/5137 -f 5138/5138/5138 5137/5137/5137 5136/5136/5136 -g charts -o chart0000 -s off -f 5135/5135/5135 5136/5136/5136 5137/5137/5137 -f 5138/5138/5138 5137/5137/5137 5136/5136/5136 -v -8193.5 -3819.01 -165.3 -vt 0.253256 0.456307 -v -8193.5 -3699.01 2594.7 -vt 0.275561 0.454658 -v -8193.5 -3699.01 -285.3 -vt 0.252286 0.454658 -v -8193.5 -3819.01 1694.7 -vt 0.268288 0.456307 -v -8193.5 -3819.01 1814.7 -vt 0.269257 0.456307 -v -8193.5 -3819.01 2474.7 -vt 0.274591 0.456307 -o mesh1015 -s off -f 5139/5139/5139 5140/5140/5140 5141/5141/5141 -f 5140/5140/5140 5139/5139/5139 5142/5142/5142 -f 5140/5140/5140 5142/5142/5142 5143/5143/5143 -f 5140/5140/5140 5143/5143/5143 5144/5144/5144 -g charts -o chart0000 -s off -f 5139/5139/5139 5140/5140/5140 5141/5141/5141 -f 5140/5140/5140 5139/5139/5139 5142/5142/5142 -f 5140/5140/5140 5142/5142/5142 5143/5143/5143 -f 5140/5140/5140 5143/5143/5143 5144/5144/5144 -v -8141 -3699.01 -285.3 -vt 0.803408 0.696208 -v -8141 -3819.01 -165.3 -vt 0.801746 0.695261 -v -8141 -6939.01 -285.3 -vt 0.803408 0.670651 -v -8141 -6819.01 -165.3 -vt 0.801746 0.671598 -o mesh1016 -s off -f 5145/5145/5145 5146/5146/5146 5147/5147/5147 -f 5148/5148/5148 5147/5147/5147 5146/5146/5146 -g charts -o chart0000 -s off -f 5145/5145/5145 5146/5146/5146 5147/5147/5147 -f 5148/5148/5148 5147/5147/5147 5146/5146/5146 -v -8141 -3819.01 -165.3 -vt 0.438487 0.463039 -v -8141 -3699.01 -285.3 -vt 0.44015 0.462077 -v -8141 -3699.01 2594.7 -vt 0.44015 0.485161 -o mesh1017 -s off -f 5149/5149/5149 5150/5150/5150 5151/5151/5151 -g charts -o chart0000 -s off -f 5149/5149/5149 5150/5150/5150 5151/5151/5151 -v -8141 -3819.01 -165.3 -vt 0.938071 0.572547 -v -8141 -3699.01 2594.7 -vt 0.960515 0.572547 -v -8141 -3819.01 1694.7 -vt 0.953168 0.571386 -v -8141 -3819.01 1814.7 -vt 0.954142 0.571311 -v -8141 -3819.01 2474.7 -vt 0.959499 0.570899 -o mesh1018 -s off -f 5152/5152/5152 5153/5153/5153 5154/5154/5154 -f 5154/5154/5154 5153/5153/5153 5155/5155/5155 -f 5155/5155/5155 5153/5153/5153 5156/5156/5156 -g charts -o chart0000 -s off -f 5152/5152/5152 5153/5153/5153 5154/5154/5154 -f 5154/5154/5154 5153/5153/5153 5155/5155/5155 -f 5155/5155/5155 5153/5153/5153 5156/5156/5156 -v -8141 -3819.01 2474.7 -vt 0.160017 0.569128 -v -8141 -3699.01 2594.7 -vt 0.158354 0.570074 -v -8141 -6819.01 2474.7 -vt 0.160017 0.545464 -v -8141 -6939.01 2594.7 -vt 0.158354 0.544518 -o mesh1019 -s off -f 5157/5157/5157 5158/5158/5158 5159/5159/5159 -f 5160/5160/5160 5159/5159/5159 5158/5158/5158 -g charts -o chart0000 -s off -f 5157/5157/5157 5158/5158/5158 5159/5159/5159 -f 5160/5160/5160 5159/5159/5159 5158/5158/5158 -v -8141 -6939.01 -285.3 -vt 0.0785536 0.595631 -v -8141 -6819.01 -165.3 -vt 0.0795234 0.597279 -v -8141 -6939.01 2594.7 -vt 0.101829 0.595631 -v -8141 -6819.01 1694.7 -vt 0.0945552 0.597279 -v -8141 -6819.01 1814.7 -vt 0.095525 0.597279 -v -8141 -6819.01 2474.7 -vt 0.100859 0.597279 -o mesh1020 -s off -f 5161/5161/5161 5162/5162/5162 5163/5163/5163 -f 5163/5163/5163 5162/5162/5162 5164/5164/5164 -f 5163/5163/5163 5164/5164/5164 5165/5165/5165 -f 5163/5163/5163 5165/5165/5165 5166/5166/5166 -g charts -o chart0000 -s off -f 5161/5161/5161 5162/5162/5162 5163/5163/5163 -f 5163/5163/5163 5162/5162/5162 5164/5164/5164 -f 5163/5163/5163 5164/5164/5164 5165/5165/5165 -f 5163/5163/5163 5165/5165/5165 5166/5166/5166 -v -8193.5 -6939.01 -285.3 -vt 0.997922 0.29967 -v -8193.5 -3699.01 -285.3 -vt 0.997922 0.274114 -v -8141 -3699.01 -285.3 -vt 0.997091 0.274114 -v -8141 -6939.01 -285.3 -vt 0.997091 0.29967 -o mesh1021 -s off -f 5167/5167/5167 5168/5168/5168 5169/5169/5169 -f 5167/5167/5167 5169/5169/5169 5170/5170/5170 -g charts -o chart0000 -s off -f 5167/5167/5167 5168/5168/5168 5169/5169/5169 -f 5167/5167/5167 5169/5169/5169 5170/5170/5170 -v -8193.5 -6939.01 2594.7 -vt 0.994597 0.317807 -v -8193.5 -6939.01 -285.3 -vt 0.994597 0.34089 -v -8141 -6939.01 -285.3 -vt 0.995428 0.34089 -v -8141 -6939.01 2594.7 -vt 0.995428 0.317807 -o mesh1022 -s off -f 5171/5171/5171 5172/5172/5172 5173/5173/5173 -f 5171/5171/5171 5173/5173/5173 5174/5174/5174 -g charts -o chart0000 -s off -f 5171/5171/5171 5172/5172/5172 5173/5173/5173 -f 5171/5171/5171 5173/5173/5173 5174/5174/5174 -v -8193.5 -3699.01 2594.7 -vt 0.112635 0.960016 -v -8193.5 -6939.01 2594.7 -vt 0.112635 0.985573 -v -8141 -6939.01 2594.7 -vt 0.113466 0.985573 -v -8141 -3699.01 2594.7 -vt 0.113466 0.960016 -o mesh1023 -s off -f 5175/5175/5175 5176/5176/5176 5177/5177/5177 -f 5175/5175/5175 5177/5177/5177 5178/5178/5178 -g charts -o chart0000 -s off -f 5175/5175/5175 5176/5176/5176 5177/5177/5177 -f 5175/5175/5175 5177/5177/5177 5178/5178/5178 -v -8193.5 -3699.01 -285.3 -vt 0.0494596 0.749794 -v -8193.5 -3699.01 2594.7 -vt 0.0261845 0.749794 -v -8141 -3699.01 2594.7 -vt 0.0261845 0.748969 -v -8141 -3699.01 -285.3 -vt 0.0494596 0.748969 -o mesh1024 -s off -f 5179/5179/5179 5180/5180/5180 5181/5181/5181 -f 5179/5179/5179 5181/5181/5181 5182/5182/5182 -g charts -o chart0000 -s off -f 5179/5179/5179 5180/5180/5180 5181/5181/5181 -f 5179/5179/5179 5181/5181/5181 5182/5182/5182 -v -8141 -6819.01 2474.7 -vt 0.371155 0.546991 -v -8141 -6819.01 1814.7 -vt 0.376974 0.546991 -v -8193.5 -6819.01 1814.7 -vt 0.376974 0.547815 -v -8193.5 -6819.01 2474.7 -vt 0.371155 0.547815 -o mesh1025 -s off -f 5183/5183/5183 5184/5184/5184 5185/5185/5185 -f 5183/5183/5183 5185/5185/5185 5186/5186/5186 -g charts -o chart0000 -s off -f 5183/5183/5183 5184/5184/5184 5185/5185/5185 -f 5183/5183/5183 5185/5185/5185 5186/5186/5186 -v -8141 -3819.01 2474.7 -vt 0.0519534 0.414262 -v -8141 -6819.01 2474.7 -vt 0.0760598 0.414262 -v -8193.5 -6819.01 2474.7 -vt 0.0760598 0.415086 -v -8193.5 -3819.01 2474.7 -vt 0.0519534 0.415086 -o mesh1026 -s off -f 5187/5187/5187 5188/5188/5188 5189/5189/5189 -f 5187/5187/5187 5189/5189/5189 5190/5190/5190 -g charts -o chart0000 -s off -f 5187/5187/5187 5188/5188/5188 5189/5189/5189 -f 5187/5187/5187 5189/5189/5189 5190/5190/5190 -v -8193.5 -6819.01 1814.7 -vt 0.805902 0.705276 -v -8193.5 -6819.01 1694.7 -vt 0.807564 0.705276 -v -8193.5 -3819.01 1694.7 -vt 0.807564 0.681369 -v -8193.5 -3819.01 1814.7 -vt 0.805902 0.681369 -o mesh1027 -s off -f 5191/5191/5191 5192/5192/5192 5193/5193/5193 -f 5191/5191/5191 5193/5193/5193 5194/5194/5194 -g charts -o chart0000 -s off -f 5191/5191/5191 5192/5192/5192 5193/5193/5193 -f 5191/5191/5191 5193/5193/5193 5194/5194/5194 -v -8141 -6819.01 1814.7 -vt 0.855777 0.0490519 -v -8141 -6819.01 1694.7 -vt 0.85744 0.0490519 -v -8193.5 -6819.01 1694.7 -vt 0.85744 0.0498763 -v -8193.5 -6819.01 1814.7 -vt 0.855777 0.0498763 -o mesh1028 -s off -f 5195/5195/5195 5196/5196/5196 5197/5197/5197 -f 5195/5195/5195 5197/5197/5197 5198/5198/5198 -g charts -o chart0000 -s off -f 5195/5195/5195 5196/5196/5196 5197/5197/5197 -f 5195/5195/5195 5197/5197/5197 5198/5198/5198 -v -8141 -3819.01 1694.7 -vt 0.95719 0.752267 -v -8141 -3819.01 1814.7 -vt 0.955528 0.752267 -v -8193.5 -3819.01 1814.7 -vt 0.955528 0.751443 -v -8193.5 -3819.01 1694.7 -vt 0.95719 0.751443 -o mesh1029 -s off -f 5199/5199/5199 5200/5200/5200 5201/5201/5201 -f 5199/5199/5199 5201/5201/5201 5202/5202/5202 -g charts -o chart0000 -s off -f 5199/5199/5199 5200/5200/5200 5201/5201/5201 -f 5199/5199/5199 5201/5201/5201 5202/5202/5202 -v -8141 -3819.01 1814.7 -vt 0.972984 0.915499 -v -8141 -6819.01 1814.7 -vt 0.997091 0.915499 -v -8193.5 -6819.01 1814.7 -vt 0.997091 0.916323 -v -8193.5 -3819.01 1814.7 -vt 0.972984 0.916323 -o mesh1030 -s off -f 5203/5203/5203 5204/5204/5204 5205/5205/5205 -f 5203/5203/5203 5205/5205/5205 5206/5206/5206 -g charts -o chart0000 -s off -f 5203/5203/5203 5204/5204/5204 5205/5205/5205 -f 5203/5203/5203 5205/5205/5205 5206/5206/5206 -v -8141 -3819.01 1814.7 -vt 0.642976 0.538747 -v -8141 -6819.01 1814.7 -vt 0.667082 0.538747 -v -8141 -6819.01 1694.7 -vt 0.667082 0.540396 -v -8141 -3819.01 1694.7 -vt 0.642976 0.540396 -o mesh1031 -s off -f 5207/5207/5207 5208/5208/5208 5209/5209/5209 -f 5207/5207/5207 5209/5209/5209 5210/5210/5210 -g charts -o chart0000 -s off -f 5207/5207/5207 5208/5208/5208 5209/5209/5209 -f 5207/5207/5207 5209/5209/5209 5210/5210/5210 -v -8193.5 -3819.01 1694.7 -vt 0.15586 0.789365 -v -8193.5 -6819.01 1694.7 -vt 0.15586 0.813273 -v -8193.5 -6819.01 -165.3 -vt 0.170823 0.813273 -v -8193.5 -3819.01 -165.3 -vt 0.170823 0.789365 -o mesh1032 -s off -f 5211/5211/5211 5212/5212/5212 5213/5213/5213 -f 5211/5211/5211 5213/5213/5213 5214/5214/5214 -g charts -o chart0000 -s off -f 5211/5211/5211 5212/5212/5212 5213/5213/5213 -f 5211/5211/5211 5213/5213/5213 5214/5214/5214 -v -8141 -6819.01 1694.7 -vt 0.290524 0.79596 -v -8141 -3819.01 1694.7 -vt 0.266417 0.79596 -v -8193.5 -3819.01 1694.7 -vt 0.266417 0.795136 -v -8193.5 -6819.01 1694.7 -vt 0.290524 0.795136 -o mesh1033 -s off -f 5215/5215/5215 5216/5216/5216 5217/5217/5217 -f 5215/5215/5215 5217/5217/5217 5218/5218/5218 -g charts -o chart0000 -s off -f 5215/5215/5215 5216/5216/5216 5217/5217/5217 -f 5215/5215/5215 5217/5217/5217 5218/5218/5218 -v -8141 -6819.01 1694.7 -vt 0.811721 0.641797 -v -8141 -6819.01 -165.3 -vt 0.811721 0.656636 -v -8193.5 -6819.01 -165.3 -vt 0.812552 0.656636 -v -8193.5 -6819.01 1694.7 -vt 0.812552 0.641797 -o mesh1034 -s off -f 5219/5219/5219 5220/5220/5220 5221/5221/5221 -f 5219/5219/5219 5221/5221/5221 5222/5222/5222 -g charts -o chart0000 -s off -f 5219/5219/5219 5220/5220/5220 5221/5221/5221 -f 5219/5219/5219 5221/5221/5221 5222/5222/5222 -v -8141 -6819.01 -165.3 -vt 0.999584 0.998763 -v -8141 -3819.01 -165.3 -vt 0.999584 0.974856 -v -8193.5 -3819.01 -165.3 -vt 0.998753 0.974856 -v -8193.5 -6819.01 -165.3 -vt 0.998753 0.998763 -o mesh1035 -s off -f 5223/5223/5223 5224/5224/5224 5225/5225/5225 -f 5223/5223/5223 5225/5225/5225 5226/5226/5226 -g charts -o chart0000 -s off -f 5223/5223/5223 5224/5224/5224 5225/5225/5225 -f 5223/5223/5223 5225/5225/5225 5226/5226/5226 -v -8141 -3819.01 -165.3 -vt 0.949709 0.267518 -v -8141 -3819.01 1694.7 -vt 0.934746 0.267518 -v -8193.5 -3819.01 1694.7 -vt 0.934746 0.266694 -v -8193.5 -3819.01 -165.3 -vt 0.949709 0.266694 -o mesh1036 -s off -f 5227/5227/5227 5228/5228/5228 5229/5229/5229 -f 5227/5227/5227 5229/5229/5229 5230/5230/5230 -g charts -o chart0000 -s off -f 5227/5227/5227 5228/5228/5228 5229/5229/5229 -f 5227/5227/5227 5229/5229/5229 5230/5230/5230 -v -8193.5 -3819.01 2474.7 -vt 0.484206 0.609645 -v -8193.5 -3819.01 1814.7 -vt 0.490025 0.609645 -v -8141 -3819.01 1814.7 -vt 0.490025 0.61047 -v -8141 -3819.01 2474.7 -vt 0.484206 0.61047 -o mesh1037 -s off -f 5231/5231/5231 5232/5232/5232 5233/5233/5233 -f 5231/5231/5231 5233/5233/5233 5234/5234/5234 -g charts -o chart0000 -s off -f 5231/5231/5231 5232/5232/5232 5233/5233/5233 -f 5231/5231/5231 5233/5233/5233 5234/5234/5234 -v -8167.25 -5002.14 2474.7 -vt 0.938071 0.670651 -v -8167.25 -5028.39 2474.7 -vt 0.93724 0.670651 -v -8141 -5028.39 2474.7 -vt 0.93724 0.669827 -v -8141 -5002.14 2474.7 -vt 0.938071 0.669827 -o mesh1038 -s off -f 5235/5235/5235 5236/5236/5236 5237/5237/5237 -f 5235/5235/5235 5237/5237/5237 5238/5238/5238 -g charts -o chart0000 -s off -f 5235/5235/5235 5236/5236/5236 5237/5237/5237 -f 5235/5235/5235 5237/5237/5237 5238/5238/5238 -v -8167.25 -5028.39 1814.7 -vt 0.780964 0.260923 -v -8167.25 -5002.14 1814.7 -vt 0.780133 0.260923 -v -8141 -5002.14 1814.7 -vt 0.780133 0.260099 -v -8141 -5028.39 1814.7 -vt 0.780964 0.260099 -o mesh1039 -s off -f 5239/5239/5239 5240/5240/5240 5241/5241/5241 -f 5239/5239/5239 5241/5241/5241 5242/5242/5242 -g charts -o chart0000 -s off -f 5239/5239/5239 5240/5240/5240 5241/5241/5241 -f 5239/5239/5239 5241/5241/5241 5242/5242/5242 -v -8167.25 -5028.39 2474.7 -vt 0.649626 0.960841 -v -8167.25 -5002.14 2474.7 -vt 0.648795 0.960841 -v -8167.25 -5002.14 1814.7 -vt 0.648795 0.95507 -v -8167.25 -5028.39 1814.7 -vt 0.649626 0.95507 -o mesh1040 -s off -f 5243/5243/5243 5244/5244/5244 5245/5245/5245 -f 5243/5243/5243 5245/5245/5245 5246/5246/5246 -g charts -o chart0000 -s off -f 5243/5243/5243 5244/5244/5244 5245/5245/5245 -f 5243/5243/5243 5245/5245/5245 5246/5246/5246 -v -8141 -5028.39 2474.7 -vt 0.940565 0.62366 -v -8167.25 -5028.39 2474.7 -vt 0.939734 0.62366 -v -8167.25 -5028.39 1814.7 -vt 0.939734 0.61789 -v -8141 -5028.39 1814.7 -vt 0.940565 0.61789 -o mesh1041 -s off -f 5247/5247/5247 5248/5248/5248 5249/5249/5249 -f 5247/5247/5247 5249/5249/5249 5250/5250/5250 -g charts -o chart0000 -s off -f 5247/5247/5247 5248/5248/5248 5249/5249/5249 -f 5247/5247/5247 5249/5249/5249 5250/5250/5250 -v -8141 -5002.14 2474.7 -vt 0.636326 0.636026 -v -8141 -5028.39 2474.7 -vt 0.636326 0.635202 -v -8141 -5028.39 1814.7 -vt 0.630507 0.635202 -v -8141 -5002.14 1814.7 -vt 0.630507 0.636026 -o mesh1042 -s off -f 5251/5251/5251 5252/5252/5252 5253/5253/5253 -f 5251/5251/5251 5253/5253/5253 5254/5254/5254 -g charts -o chart0000 -s off -f 5251/5251/5251 5252/5252/5252 5253/5253/5253 -f 5251/5251/5251 5253/5253/5253 5254/5254/5254 -v -8167.25 -5002.14 2474.7 -vt 0.164173 0.322753 -v -8141 -5002.14 2474.7 -vt 0.163342 0.322753 -v -8141 -5002.14 1814.7 -vt 0.163342 0.316983 -v -8167.25 -5002.14 1814.7 -vt 0.164173 0.316983 -o mesh1043 -s off -f 5255/5255/5255 5256/5256/5256 5257/5257/5257 -f 5255/5255/5255 5257/5257/5257 5258/5258/5258 -g charts -o chart0000 -s off -f 5255/5255/5255 5256/5256/5256 5257/5257/5257 -f 5255/5255/5255 5257/5257/5257 5258/5258/5258 -v -8167.25 -4396.51 2474.7 -vt 0.894015 0.382935 -v -8167.25 -4422.76 2474.7 -vt 0.894015 0.383759 -v -8141 -4422.76 2474.7 -vt 0.894846 0.383759 -v -8141 -4396.51 2474.7 -vt 0.894846 0.382935 -o mesh1044 -s off -f 5259/5259/5259 5260/5260/5260 5261/5261/5261 -f 5259/5259/5259 5261/5261/5261 5262/5262/5262 -g charts -o chart0000 -s off -f 5259/5259/5259 5260/5260/5260 5261/5261/5261 -f 5259/5259/5259 5261/5261/5261 5262/5262/5262 -v -8167.25 -4422.76 1814.7 -vt 0.753533 0.654988 -v -8167.25 -4396.51 1814.7 -vt 0.753533 0.654163 -v -8141 -4396.51 1814.7 -vt 0.752702 0.654163 -v -8141 -4422.76 1814.7 -vt 0.752702 0.654988 -o mesh1045 -s off -f 5263/5263/5263 5264/5264/5264 5265/5265/5265 -f 5263/5263/5263 5265/5265/5265 5266/5266/5266 -g charts -o chart0000 -s off -f 5263/5263/5263 5264/5264/5264 5265/5265/5265 -f 5263/5263/5263 5265/5265/5265 5266/5266/5266 -v -8167.25 -4422.76 2474.7 -vt 0.401081 0.63108 -v -8167.25 -4396.51 2474.7 -vt 0.401081 0.630256 -v -8167.25 -4396.51 1814.7 -vt 0.395262 0.630256 -v -8167.25 -4422.76 1814.7 -vt 0.395262 0.63108 -o mesh1046 -s off -f 5267/5267/5267 5268/5268/5268 5269/5269/5269 -f 5267/5267/5267 5269/5269/5269 5270/5270/5270 -g charts -o chart0000 -s off -f 5267/5267/5267 5268/5268/5268 5269/5269/5269 -f 5267/5267/5267 5269/5269/5269 5270/5270/5270 -v -8141 -4422.76 2474.7 -vt 0.355362 0.441467 -v -8167.25 -4422.76 2474.7 -vt 0.35453 0.441467 -v -8167.25 -4422.76 1814.7 -vt 0.35453 0.435697 -v -8141 -4422.76 1814.7 -vt 0.355362 0.435697 -o mesh1047 -s off -f 5271/5271/5271 5272/5272/5272 5273/5273/5273 -f 5271/5271/5271 5273/5273/5273 5274/5274/5274 -g charts -o chart0000 -s off -f 5271/5271/5271 5272/5272/5272 5273/5273/5273 -f 5271/5271/5271 5273/5273/5273 5274/5274/5274 -v -8141 -4396.51 2474.7 -vt 0.238986 0.658285 -v -8141 -4422.76 2474.7 -vt 0.238155 0.658285 -v -8141 -4422.76 1814.7 -vt 0.238155 0.652514 -v -8141 -4396.51 1814.7 -vt 0.238986 0.652514 -o mesh1048 -s off -f 5275/5275/5275 5276/5276/5276 5277/5277/5277 -f 5275/5275/5275 5277/5277/5277 5278/5278/5278 -g charts -o chart0000 -s off -f 5275/5275/5275 5276/5276/5276 5277/5277/5277 -f 5275/5275/5275 5277/5277/5277 5278/5278/5278 -v -8167.25 -4396.51 2474.7 -vt 0.0843723 0.161171 -v -8141 -4396.51 2474.7 -vt 0.0835411 0.161171 -v -8141 -4396.51 1814.7 -vt 0.0835411 0.1554 -v -8167.25 -4396.51 1814.7 -vt 0.0843723 0.1554 -o mesh1049 -s off -f 5279/5279/5279 5280/5280/5280 5281/5281/5281 -f 5279/5279/5279 5281/5281/5281 5282/5282/5282 -g charts -o chart0000 -s off -f 5279/5279/5279 5280/5280/5280 5281/5281/5281 -f 5279/5279/5279 5281/5281/5281 5282/5282/5282 -v -8167.25 -5607.76 2474.7 -vt 0.509975 0.52803 -v -8167.25 -5634.01 2474.7 -vt 0.509976 0.528854 -v -8141 -5634.01 2474.7 -vt 0.510806 0.528854 -v -8141 -5607.76 2474.7 -vt 0.510806 0.52803 -o mesh1050 -s off -f 5283/5283/5283 5284/5284/5284 5285/5285/5285 -f 5283/5283/5283 5285/5285/5285 5286/5286/5286 -g charts -o chart0000 -s off -f 5283/5283/5283 5284/5284/5284 5285/5285/5285 -f 5283/5283/5283 5285/5285/5285 5286/5286/5286 -v -8167.25 -5634.01 1814.7 -vt 0.97049 0.524732 -v -8167.25 -5607.76 1814.7 -vt 0.969659 0.524732 -v -8141 -5607.76 1814.7 -vt 0.969659 0.523908 -v -8141 -5634.01 1814.7 -vt 0.97049 0.523908 -o mesh1051 -s off -f 5287/5287/5287 5288/5288/5288 5289/5289/5289 -f 5287/5287/5287 5289/5289/5289 5290/5290/5290 -g charts -o chart0000 -s off -f 5287/5287/5287 5288/5288/5288 5289/5289/5289 -f 5287/5287/5287 5289/5289/5289 5290/5290/5290 -v -8167.25 -5634.01 2474.7 -vt 0.0752285 0.999588 -v -8167.25 -5607.76 2474.7 -vt 0.0752285 0.998763 -v -8167.25 -5607.76 1814.7 -vt 0.0694098 0.998763 -v -8167.25 -5634.01 1814.7 -vt 0.0694098 0.999588 -o mesh1052 -s off -f 5291/5291/5291 5292/5292/5292 5293/5293/5293 -f 5291/5291/5291 5293/5293/5293 5294/5294/5294 -g charts -o chart0000 -s off -f 5291/5291/5291 5292/5292/5292 5293/5293/5293 -f 5291/5291/5291 5293/5293/5293 5294/5294/5294 -v -8141 -5634.01 2474.7 -vt 0.981297 0.45136 -v -8167.25 -5634.01 2474.7 -vt 0.980466 0.45136 -v -8167.25 -5634.01 1814.7 -vt 0.980466 0.445589 -v -8141 -5634.01 1814.7 -vt 0.981297 0.445589 -o mesh1053 -s off -f 5295/5295/5295 5296/5296/5296 5297/5297/5297 -f 5295/5295/5295 5297/5297/5297 5298/5298/5298 -g charts -o chart0000 -s off -f 5295/5295/5295 5296/5296/5296 5297/5297/5297 -f 5295/5295/5295 5297/5297/5297 5298/5298/5298 -v -8141 -5607.76 2474.7 -vt 0.997922 0.593982 -v -8141 -5634.01 2474.7 -vt 0.997091 0.593982 -v -8141 -5634.01 1814.7 -vt 0.997091 0.588211 -v -8141 -5607.76 1814.7 -vt 0.997922 0.588211 -o mesh1054 -s off -f 5299/5299/5299 5300/5300/5300 5301/5301/5301 -f 5299/5299/5299 5301/5301/5301 5302/5302/5302 -g charts -o chart0000 -s off -f 5299/5299/5299 5300/5300/5300 5301/5301/5301 -f 5299/5299/5299 5301/5301/5301 5302/5302/5302 -v -8167.25 -5607.76 2474.7 -vt 0.396093 0.727535 -v -8141 -5607.76 2474.7 -vt 0.395262 0.727535 -v -8141 -5607.76 1814.7 -vt 0.395262 0.721764 -v -8167.25 -5607.76 1814.7 -vt 0.396093 0.721764 -o mesh1055 -s off -f 5303/5303/5303 5304/5304/5304 5305/5305/5305 -f 5303/5303/5303 5305/5305/5305 5306/5306/5306 -g charts -o chart0000 -s off -f 5303/5303/5303 5304/5304/5304 5305/5305/5305 -f 5303/5303/5303 5305/5305/5305 5306/5306/5306 -v -8167.25 -6213.39 2474.7 -vt 0.894846 0.995466 -v -8167.25 -6239.64 2474.7 -vt 0.894015 0.995466 -v -8141 -6239.64 2474.7 -vt 0.894015 0.994641 -v -8141 -6213.39 2474.7 -vt 0.894846 0.994642 -o mesh1056 -s off -f 5307/5307/5307 5308/5308/5308 5309/5309/5309 -f 5307/5307/5307 5309/5309/5309 5310/5310/5310 -g charts -o chart0000 -s off -f 5307/5307/5307 5308/5308/5308 5309/5309/5309 -f 5307/5307/5307 5309/5309/5309 5310/5310/5310 -v -8167.25 -6239.64 1814.7 -vt 0.406068 0.306265 -v -8167.25 -6213.39 1814.7 -vt 0.406068 0.305441 -v -8141 -6213.39 1814.7 -vt 0.405237 0.305441 -v -8141 -6239.64 1814.7 -vt 0.405237 0.306265 -o mesh1057 -s off -f 5311/5311/5311 5312/5312/5312 5313/5313/5313 -f 5311/5311/5311 5313/5313/5313 5314/5314/5314 -g charts -o chart0000 -s off -f 5311/5311/5311 5312/5312/5312 5313/5313/5313 -f 5311/5311/5311 5313/5313/5313 5314/5314/5314 -v -8167.25 -6239.64 2474.7 -vt 0.954696 0.0597691 -v -8167.25 -6213.39 2474.7 -vt 0.954696 0.0589448 -v -8167.25 -6213.39 1814.7 -vt 0.948878 0.0589448 -v -8167.25 -6239.64 1814.7 -vt 0.948878 0.0597691 -o mesh1058 -s off -f 5315/5315/5315 5316/5316/5316 5317/5317/5317 -f 5315/5315/5315 5317/5317/5317 5318/5318/5318 -g charts -o chart0000 -s off -f 5315/5315/5315 5316/5316/5316 5317/5317/5317 -f 5315/5315/5315 5317/5317/5317 5318/5318/5318 -v -8141 -6239.64 2474.7 -vt 0.90399 0.577494 -v -8167.25 -6239.64 2474.7 -vt 0.903159 0.577494 -v -8167.25 -6239.64 1814.7 -vt 0.903159 0.571723 -v -8141 -6239.64 1814.7 -vt 0.90399 0.571723 -o mesh1059 -s off -f 5319/5319/5319 5320/5320/5320 5321/5321/5321 -f 5319/5319/5319 5321/5321/5321 5322/5322/5322 -g charts -o chart0000 -s off -f 5319/5319/5319 5320/5320/5320 5321/5321/5321 -f 5319/5319/5319 5321/5321/5321 5322/5322/5322 -v -8141 -6213.39 2474.7 -vt 0.479219 0.52803 -v -8141 -6239.64 2474.7 -vt 0.479219 0.527205 -v -8141 -6239.64 1814.7 -vt 0.4734 0.527205 -v -8141 -6213.39 1814.7 -vt 0.4734 0.52803 -o mesh1060 -s off -f 5323/5323/5323 5324/5324/5324 5325/5325/5325 -f 5323/5323/5323 5325/5325/5325 5326/5326/5326 -g charts -o chart0000 -s off -f 5323/5323/5323 5324/5324/5324 5325/5325/5325 -f 5323/5323/5323 5325/5325/5325 5326/5326/5326 -v -8167.25 -6213.39 2474.7 -vt 0.454281 0.918796 -v -8141 -6213.39 2474.7 -vt 0.45345 0.918796 -v -8141 -6213.39 1814.7 -vt 0.45345 0.913026 -v -8167.25 -6213.39 1814.7 -vt 0.454281 0.913026 -o mesh1061 -s off -f 5327/5327/5327 5328/5328/5328 5329/5329/5329 -f 5327/5327/5327 5329/5329/5329 5330/5330/5330 -g charts -o chart0000 -s off -f 5327/5327/5327 5328/5328/5328 5329/5329/5329 -f 5327/5327/5327 5329/5329/5329 5330/5330/5330 -v -4243.5 6380.99 -285.3 -vt 0.70532 0.628607 -v -4206 6380.99 -229.05 -vt 0.706151 0.628922 -v -3163.5 6380.99 -285.3 -vt 0.70532 0.637675 -v -3201 6380.99 -229.05 -vt 0.706151 0.63736 -o mesh1062 -s off -f 5331/5331/5331 5332/5332/5332 5333/5333/5333 -f 5334/5334/5334 5333/5333/5333 5332/5332/5332 -g charts -o chart0000 -s off -f 5331/5331/5331 5332/5332/5332 5333/5333/5333 -f 5334/5334/5334 5333/5333/5333 5332/5332/5332 -v -4206 6380.99 -229.05 -vt 0.718243 0.302143 -v -4243.5 6380.99 -285.3 -vt 0.717789 0.302968 -v -4243.5 6380.99 2594.7 -vt 0.741064 0.302968 -o mesh1063 -s off -f 5335/5335/5335 5336/5336/5336 5337/5337/5337 -g charts -o chart0000 -s off -f 5335/5335/5335 5336/5336/5336 5337/5337/5337 -v -4206 6380.99 -229.05 -vt 0.10931 0.346661 -v -4243.5 6380.99 2594.7 -vt 0.131754 0.346661 -v -4206 6380.99 2538.45 -vt 0.131303 0.345837 -o mesh1064 -s off -f 5338/5338/5338 5339/5339/5339 5340/5340/5340 -g charts -o chart0000 -s off -f 5338/5338/5338 5339/5339/5339 5340/5340/5340 -v -4206 6380.99 2538.45 -vt 0.299985 0.475268 -v -4243.5 6380.99 2594.7 -vt 0.299668 0.476092 -v -3201 6380.99 2538.45 -vt 0.308494 0.475268 -v -3163.5 6380.99 2594.7 -vt 0.308811 0.476092 -o mesh1065 -s off -f 5341/5341/5341 5342/5342/5342 5343/5343/5343 -f 5344/5344/5344 5343/5343/5343 5342/5342/5342 -g charts -o chart0000 -s off -f 5341/5341/5341 5342/5342/5342 5343/5343/5343 -f 5344/5344/5344 5343/5343/5343 5342/5342/5342 -v -3163.5 6380.99 -285.3 -vt 0.434331 0.284831 -v -3201 6380.99 -229.05 -vt 0.4335 0.28438 -v -3163.5 6380.99 2594.7 -vt 0.434331 0.261748 -o mesh1066 -s off -f 5345/5345/5345 5346/5346/5346 5347/5347/5347 -g charts -o chart0000 -s off -f 5345/5345/5345 5346/5346/5346 5347/5347/5347 -v -3163.5 6380.99 2594.7 -vt 0.227348 0.858615 -v -3201 6380.99 -229.05 -vt 0.227348 0.880874 -v -3201 6380.99 2538.45 -vt 0.226517 0.859062 -o mesh1067 -s off -f 5348/5348/5348 5349/5349/5349 5350/5350/5350 -g charts -o chart0000 -s off -f 5348/5348/5348 5349/5349/5349 5350/5350/5350 -v -3163.5 6215.99 -285.3 -vt 0.776808 0.910552 -v -3201 6215.99 -229.05 -vt 0.777126 0.911377 -v -4243.5 6215.99 -285.3 -vt 0.785952 0.910552 -v -4206 6215.99 -229.05 -vt 0.785634 0.911377 -o mesh1068 -s off -f 5351/5351/5351 5352/5352/5352 5353/5353/5353 -f 5354/5354/5354 5353/5353/5353 5352/5352/5352 -g charts -o chart0000 -s off -f 5351/5351/5351 5352/5352/5352 5353/5353/5353 -f 5354/5354/5354 5353/5353/5353 5352/5352/5352 -v -3201 6215.99 -229.05 -vt 0.00918277 0.58244 -v -3163.5 6215.99 -285.3 -vt 0.00872818 0.583265 -v -3163.5 6215.99 2594.7 -vt 0.0320032 0.583265 -o mesh1069 -s off -f 5355/5355/5355 5356/5356/5356 5357/5357/5357 -g charts -o chart0000 -s off -f 5355/5355/5355 5356/5356/5356 5357/5357/5357 -v -3201 6215.99 -229.05 -vt 0.205736 0.833883 -v -3163.5 6215.99 2594.7 -vt 0.228179 0.833883 -v -3201 6215.99 2538.45 -vt 0.227729 0.833059 -o mesh1070 -s off -f 5358/5358/5358 5359/5359/5359 5360/5360/5360 -g charts -o chart0000 -s off -f 5358/5358/5358 5359/5359/5359 5360/5360/5360 -v -3201 6215.99 2538.45 -vt 0.916459 0.149314 -v -3163.5 6215.99 2594.7 -vt 0.915628 0.149629 -v -4206 6215.99 2538.45 -vt 0.916459 0.140875 -v -4243.5 6215.99 2594.7 -vt 0.915628 0.140561 -o mesh1071 -s off -f 5361/5361/5361 5362/5362/5362 5363/5363/5363 -f 5364/5364/5364 5363/5363/5363 5362/5362/5362 -g charts -o chart0000 -s off -f 5361/5361/5361 5362/5362/5362 5363/5363/5363 -f 5364/5364/5364 5363/5363/5363 5362/5362/5362 -v -4243.5 6215.99 -285.3 -vt 0.363674 0.401896 -v -4206 6215.99 -229.05 -vt 0.362843 0.401445 -v -4243.5 6215.99 2594.7 -vt 0.363674 0.378813 -o mesh1072 -s off -f 5365/5365/5365 5366/5366/5366 5367/5367/5367 -g charts -o chart0000 -s off -f 5365/5365/5365 5366/5366/5366 5367/5367/5367 -v -4243.5 6215.99 2594.7 -vt 0.968828 0.710223 -v -4206 6215.99 -229.05 -vt 0.968828 0.732481 -v -4206 6215.99 2538.45 -vt 0.967997 0.71067 -o mesh1073 -s off -f 5368/5368/5368 5369/5369/5369 5370/5370/5370 -g charts -o chart0000 -s off -f 5368/5368/5368 5369/5369/5369 5370/5370/5370 -v -3163.5 6380.99 2594.7 -vt 0.170823 0.965787 -v -4243.5 6380.99 2594.7 -vt 0.179967 0.965787 -v -4243.5 6215.99 2594.7 -vt 0.179967 0.967436 -v -3163.5 6215.99 2594.7 -vt 0.170823 0.967436 -o mesh1074 -s off -f 5371/5371/5371 5372/5372/5372 5373/5373/5373 -f 5371/5371/5371 5373/5373/5373 5374/5374/5374 -g charts -o chart0000 -s off -f 5371/5371/5371 5372/5372/5372 5373/5373/5373 -f 5371/5371/5371 5373/5373/5373 5374/5374/5374 -v -4243.5 6380.99 2594.7 -vt 0.000415628 0.227947 -v -4243.5 6380.99 -285.3 -vt 0.000415628 0.25103 -v -4243.5 6215.99 -285.3 -vt 0.00207805 0.25103 -v -4243.5 6215.99 2594.7 -vt 0.00207805 0.227947 -o mesh1075 -s off -f 5375/5375/5375 5376/5376/5376 5377/5377/5377 -f 5375/5375/5375 5377/5377/5377 5378/5378/5378 -g charts -o chart0000 -s off -f 5375/5375/5375 5376/5376/5376 5377/5377/5377 -f 5375/5375/5375 5377/5377/5377 5378/5378/5378 -v -4243.5 6380.99 -285.3 -vt 0.633832 0.875103 -v -3163.5 6380.99 -285.3 -vt 0.624688 0.875103 -v -3163.5 6215.99 -285.3 -vt 0.624688 0.873454 -v -4243.5 6215.99 -285.3 -vt 0.633832 0.873454 -o mesh1076 -s off -f 5379/5379/5379 5380/5380/5380 5381/5381/5381 -f 5379/5379/5379 5381/5381/5381 5382/5382/5382 -g charts -o chart0000 -s off -f 5379/5379/5379 5380/5380/5380 5381/5381/5381 -f 5379/5379/5379 5381/5381/5381 5382/5382/5382 -v -3163.5 6380.99 -285.3 -vt 0.331255 0.485161 -v -3163.5 6380.99 2594.7 -vt 0.30798 0.485161 -v -3163.5 6215.99 2594.7 -vt 0.30798 0.483512 -v -3163.5 6215.99 -285.3 -vt 0.331255 0.483512 -o mesh1077 -s off -f 5383/5383/5383 5384/5384/5384 5385/5385/5385 -f 5383/5383/5383 5385/5385/5385 5386/5386/5386 -g charts -o chart0000 -s off -f 5383/5383/5383 5384/5384/5384 5385/5385/5385 -f 5383/5383/5383 5385/5385/5385 5386/5386/5386 -v -3201 6215.99 -229.05 -vt 0.810889 0.693734 -v -3201 6260.99 -229.05 -vt 0.810436 0.693734 -v -4206 6260.99 -229.05 -vt 0.810436 0.685491 -v -4206 6215.99 -229.05 -vt 0.810889 0.685491 -v -3201 6380.99 -229.05 -vt 0.809227 0.693734 -v -4206 6380.99 -229.05 -vt 0.809227 0.685491 -o mesh1078 -s off -f 5387/5387/5387 5388/5388/5388 5389/5389/5389 -f 5387/5387/5387 5389/5389/5389 5390/5390/5390 -f 5391/5391/5391 5392/5392/5392 5389/5389/5389 -f 5391/5391/5391 5389/5389/5389 5388/5388/5388 -g charts -o chart0000 -s off -f 5387/5387/5387 5388/5388/5388 5389/5389/5389 -f 5387/5387/5387 5389/5389/5389 5390/5390/5390 -f 5391/5391/5391 5392/5392/5392 5389/5389/5389 -f 5391/5391/5391 5389/5389/5389 5388/5388/5388 -v -4206 6215.99 -229.05 -vt 0.518288 0.99629 -v -4206 6260.99 -229.05 -vt 0.518288 0.99674 -v -4206 6260.99 2538.45 -vt 0.495844 0.99674 -v -4206 6215.99 2538.45 -vt 0.495844 0.99629 -v -4206 6380.99 -229.05 -vt 0.518288 0.997939 -v -4206 6380.99 2538.45 -vt 0.495844 0.997939 -o mesh1079 -s off -f 5393/5393/5393 5394/5394/5394 5395/5395/5395 -f 5393/5393/5393 5395/5395/5395 5396/5396/5396 -f 5397/5397/5397 5398/5398/5398 5395/5395/5395 -f 5397/5397/5397 5395/5395/5395 5394/5394/5394 -g charts -o chart0000 -s off -f 5393/5393/5393 5394/5394/5394 5395/5395/5395 -f 5393/5393/5393 5395/5395/5395 5396/5396/5396 -f 5397/5397/5397 5398/5398/5398 5395/5395/5395 -f 5397/5397/5397 5395/5395/5395 5394/5394/5394 -v -4206 6215.99 2538.45 -vt 0.591438 0.991344 -v -4206 6260.99 2538.45 -vt 0.591891 0.991344 -v -3201 6260.99 2538.45 -vt 0.591891 0.9831 -v -3201 6215.99 2538.45 -vt 0.591438 0.9831 -v -4206 6380.99 2538.45 -vt 0.5931 0.991344 -v -3201 6380.99 2538.45 -vt 0.5931 0.9831 -o mesh1080 -s off -f 5399/5399/5399 5400/5400/5400 5401/5401/5401 -f 5399/5399/5399 5401/5401/5401 5402/5402/5402 -f 5403/5403/5403 5404/5404/5404 5401/5401/5401 -f 5403/5403/5403 5401/5401/5401 5400/5400/5400 -g charts -o chart0000 -s off -f 5399/5399/5399 5400/5400/5400 5401/5401/5401 -f 5399/5399/5399 5401/5401/5401 5402/5402/5402 -f 5403/5403/5403 5404/5404/5404 5401/5401/5401 -f 5403/5403/5403 5401/5401/5401 5400/5400/5400 -v -3201 6215.99 2538.45 -vt 0.251455 0.894064 -v -3201 6260.99 2538.45 -vt 0.251455 0.893615 -v -3201 6260.99 -229.05 -vt 0.229011 0.893615 -v -3201 6215.99 -229.05 -vt 0.229011 0.894064 -v -3201 6380.99 2538.45 -vt 0.251455 0.892416 -v -3201 6380.99 -229.05 -vt 0.229011 0.892416 -o mesh1081 -s off -f 5405/5405/5405 5406/5406/5406 5407/5407/5407 -f 5405/5405/5405 5407/5407/5407 5408/5408/5408 -f 5409/5409/5409 5410/5410/5410 5407/5407/5407 -f 5409/5409/5409 5407/5407/5407 5406/5406/5406 -g charts -o chart0000 -s off -f 5405/5405/5405 5406/5406/5406 5407/5407/5407 -f 5405/5405/5405 5407/5407/5407 5408/5408/5408 -f 5409/5409/5409 5410/5410/5410 5407/5407/5407 -f 5409/5409/5409 5407/5407/5407 5406/5406/5406 -v -3201 6260.99 -229.05 -vt 0.969659 0.894064 -v -3261 6260.99 -139.05 -vt 0.968828 0.893572 -v -4206 6260.99 -229.05 -vt 0.969659 0.88582 -v -4146 6260.99 -139.05 -vt 0.968828 0.886312 -o mesh1082 -s off -f 5411/5411/5411 5412/5412/5412 5413/5413/5413 -f 5414/5414/5414 5413/5413/5413 5412/5412/5412 -g charts -o chart0000 -s off -f 5411/5411/5411 5412/5412/5412 5413/5413/5413 -f 5414/5414/5414 5413/5413/5413 5412/5412/5412 -v -3261 6260.99 -139.05 -vt 0.131653 0.763809 -v -3201 6260.99 -229.05 -vt 0.130923 0.764633 -v -3201 6260.99 2538.45 -vt 0.153367 0.764633 -o mesh1083 -s off -f 5415/5415/5415 5416/5416/5416 5417/5417/5417 -g charts -o chart0000 -s off -f 5415/5415/5415 5416/5416/5416 5417/5417/5417 -v -3261 6260.99 -139.05 -vt 0.456775 0.23042 -v -3201 6260.99 2538.45 -vt 0.456775 0.251855 -v -3261 6260.99 2448.45 -vt 0.455943 0.251124 -o mesh1084 -s off -f 5418/5418/5418 5419/5419/5419 5420/5420/5420 -g charts -o chart0000 -s off -f 5418/5418/5418 5419/5419/5419 5420/5420/5420 -v -3261 6260.99 2448.45 -vt 0.655445 0.790522 -v -3201 6260.99 2538.45 -vt 0.654613 0.791014 -v -4146 6260.99 2448.45 -vt 0.655445 0.783262 -v -4206 6260.99 2538.45 -vt 0.654613 0.78277 -o mesh1085 -s off -f 5421/5421/5421 5422/5422/5422 5423/5423/5423 -f 5424/5424/5424 5423/5423/5423 5422/5422/5422 -g charts -o chart0000 -s off -f 5421/5421/5421 5422/5422/5422 5423/5423/5423 -f 5424/5424/5424 5423/5423/5423 5422/5422/5422 -v -4206 6260.99 -229.05 -vt 0.906484 0.917972 -v -4146 6260.99 -139.05 -vt 0.905754 0.917148 -v -4206 6260.99 2538.45 -vt 0.88404 0.917972 -o mesh1086 -s off -f 5425/5425/5425 5426/5426/5426 5427/5427/5427 -g charts -o chart0000 -s off -f 5425/5425/5425 5426/5426/5426 5427/5427/5427 -v -4206 6260.99 2538.45 -vt 0.159185 0.581616 -v -4146 6260.99 -139.05 -vt 0.159185 0.60305 -v -4146 6260.99 2448.45 -vt 0.158354 0.582347 -o mesh1087 -s off -f 5428/5428/5428 5429/5429/5429 5430/5430/5430 -g charts -o chart0000 -s off -f 5428/5428/5428 5429/5429/5429 5430/5430/5430 -v -4146 6380.99 2448.45 -vt 0.561513 0.856966 -v -3716.62 6320.99 2448.45 -vt 0.562344 0.853366 -v -4146 6260.99 2448.45 -vt 0.563175 0.856966 -v -3261 6380.99 2448.45 -vt 0.561513 0.849547 -v -3690.37 6320.99 2448.45 -vt 0.562344 0.853146 -v -3690.37 6305.99 2448.45 -vt 0.562552 0.853146 -v -3716.62 6305.99 2448.45 -vt 0.562552 0.853366 -v -3261 6260.99 2448.45 -vt 0.563175 0.849547 -o mesh1088 -s off -f 5431/5431/5431 5432/5432/5432 5433/5433/5433 -f 5432/5432/5432 5431/5431/5431 5434/5434/5434 -f 5432/5432/5432 5434/5434/5434 5435/5435/5435 -f 5435/5435/5435 5434/5434/5434 5436/5436/5436 -f 5433/5433/5433 5437/5437/5437 5438/5438/5438 -f 5437/5437/5437 5433/5433/5433 5432/5432/5432 -f 5438/5438/5438 5437/5437/5437 5436/5436/5436 -f 5438/5438/5438 5436/5436/5436 5434/5434/5434 -g charts -o chart0000 -s off -f 5431/5431/5431 5432/5432/5432 5433/5433/5433 -f 5432/5432/5432 5431/5431/5431 5434/5434/5434 -f 5432/5432/5432 5434/5434/5434 5435/5435/5435 -f 5435/5435/5435 5434/5434/5434 5436/5436/5436 -f 5433/5433/5433 5437/5437/5437 5438/5438/5438 -f 5437/5437/5437 5433/5433/5433 5432/5432/5432 -f 5438/5438/5438 5437/5437/5437 5436/5436/5436 -f 5438/5438/5438 5436/5436/5436 5434/5434/5434 -v -3261 6380.99 -139.05 -vt 0.0045719 0.579967 -v -4146 6380.99 -139.05 -vt 0.0045719 0.587387 -v -4146 6260.99 -139.05 -vt 0.00623433 0.587387 -v -3261 6260.99 -139.05 -vt 0.00623433 0.579967 -o mesh1089 -s off -f 5439/5439/5439 5440/5440/5440 5441/5441/5441 -f 5439/5439/5439 5441/5441/5441 5442/5442/5442 -g charts -o chart0000 -s off -f 5439/5439/5439 5440/5440/5440 5441/5441/5441 -f 5439/5439/5439 5441/5441/5441 5442/5442/5442 -v -4146 6380.99 -139.05 -vt 0.916459 0.48681 -v -4146 6260.99 2448.45 -vt 0.918121 0.50742 -v -4146 6260.99 -139.05 -vt 0.918121 0.48681 -v -4146 6305.99 1861.57 -vt 0.917498 0.502745 -v -4146 6320.99 1861.57 -vt 0.91729 0.502745 -v -4146 6320.99 1874.7 -vt 0.91729 0.50285 -v -4146 6320.99 1887.82 -vt 0.91729 0.502954 -v -4146 6305.99 1887.82 -vt 0.917498 0.502954 -v -4146 6380.99 2448.45 -vt 0.916459 0.50742 -o mesh1090 -s off -f 5443/5443/5443 5444/5444/5444 5445/5445/5445 -f 5444/5444/5444 5443/5443/5443 5446/5446/5446 -f 5446/5446/5446 5443/5443/5443 5447/5447/5447 -f 5447/5447/5447 5443/5443/5443 5448/5448/5448 -f 5448/5448/5448 5443/5443/5443 5449/5449/5449 -f 5444/5444/5444 5450/5450/5450 5451/5451/5451 -f 5450/5450/5450 5444/5444/5444 5446/5446/5446 -f 5451/5451/5451 5450/5450/5450 5449/5449/5449 -f 5451/5451/5451 5449/5449/5449 5443/5443/5443 -g charts -o chart0000 -s off -f 5443/5443/5443 5444/5444/5444 5445/5445/5445 -f 5444/5444/5444 5443/5443/5443 5446/5446/5446 -f 5446/5446/5446 5443/5443/5443 5447/5447/5447 -f 5447/5447/5447 5443/5443/5443 5448/5448/5448 -f 5448/5448/5448 5443/5443/5443 5449/5449/5449 -f 5444/5444/5444 5450/5450/5450 5451/5451/5451 -f 5450/5450/5450 5444/5444/5444 5446/5446/5446 -f 5451/5451/5451 5450/5450/5450 5449/5449/5449 -f 5451/5451/5451 5449/5449/5449 5443/5443/5443 -v -3261 6260.99 2448.45 -vt 0.10266 0.372218 -v -3261 6305.99 1887.82 -vt 0.0981574 0.371599 -v -3261 6260.99 -139.05 -vt 0.0818786 0.372218 -v -3261 6380.99 2448.45 -vt 0.10266 0.370569 -v -3261 6320.99 1887.82 -vt 0.0981574 0.371393 -v -3261 6320.99 1874.7 -vt 0.098052 0.371393 -v -3261 6320.99 1861.57 -vt 0.0979465 0.371393 -v -3261 6305.99 1861.57 -vt 0.0979465 0.371599 -v -3261 6380.99 -139.05 -vt 0.0818786 0.370569 -o mesh1091 -s off -f 5452/5452/5452 5453/5453/5453 5454/5454/5454 -f 5453/5453/5453 5452/5452/5452 5455/5455/5455 -f 5453/5453/5453 5455/5455/5455 5456/5456/5456 -f 5456/5456/5456 5455/5455/5455 5457/5457/5457 -f 5457/5457/5457 5455/5455/5455 5458/5458/5458 -f 5454/5454/5454 5459/5459/5459 5460/5460/5460 -f 5459/5459/5459 5454/5454/5454 5453/5453/5453 -f 5460/5460/5460 5459/5459/5459 5458/5458/5458 -f 5460/5460/5460 5458/5458/5458 5455/5455/5455 -g charts -o chart0000 -s off -f 5452/5452/5452 5453/5453/5453 5454/5454/5454 -f 5453/5453/5453 5452/5452/5452 5455/5455/5455 -f 5453/5453/5453 5455/5455/5455 5456/5456/5456 -f 5456/5456/5456 5455/5455/5455 5457/5457/5457 -f 5457/5457/5457 5455/5455/5455 5458/5458/5458 -f 5454/5454/5454 5459/5459/5459 5460/5460/5460 -f 5459/5459/5459 5454/5454/5454 5453/5453/5453 -f 5460/5460/5460 5459/5459/5459 5458/5458/5458 -f 5460/5460/5460 5458/5458/5458 5455/5455/5455 -v -3261 6320.99 1861.57 -vt 0.953034 0.711047 -v -3261 6305.99 1861.57 -vt 0.952203 0.711047 -v -4146 6305.99 1861.57 -vt 0.952203 0.703627 -v -4146 6320.99 1861.57 -vt 0.953034 0.703627 -o mesh1092 -s off -f 5461/5461/5461 5462/5462/5462 5463/5463/5463 -f 5461/5461/5461 5463/5463/5463 5464/5464/5464 -g charts -o chart0000 -s off -f 5461/5461/5461 5462/5462/5462 5463/5463/5463 -f 5461/5461/5461 5463/5463/5463 5464/5464/5464 -v -4146 6305.99 1861.57 -vt 0.0852037 0.377988 -v -3261 6305.99 1861.57 -vt 0.0926849 0.377988 -v -3261 6305.99 1887.82 -vt 0.0926849 0.377767 -v -3690.37 6305.99 1887.82 -vt 0.0890551 0.377767 -v -3690.37 6305.99 2448.45 -vt 0.0890551 0.373042 -v -3716.62 6305.99 2448.45 -vt 0.0888332 0.373042 -v -4146 6305.99 1861.57 -vt 0.793433 0.332646 -v -3716.62 6305.99 2448.45 -vt 0.793433 0.326876 -v -3716.62 6305.99 1887.82 -vt 0.790108 0.330466 -v -4146 6305.99 1861.57 -vt 0.0461346 0.474443 -v -3716.62 6305.99 1887.82 -vt 0.0453034 0.470322 -v -4146 6305.99 1887.82 -vt 0.0453034 0.474443 -o mesh1093 -s off -f 5465/5465/5465 5466/5466/5466 5467/5467/5467 -f 5465/5465/5465 5467/5467/5467 5468/5468/5468 -f 5465/5465/5465 5468/5468/5468 5469/5469/5469 -f 5465/5465/5465 5469/5469/5469 5470/5470/5470 -f 5471/5471/5471 5472/5472/5472 5473/5473/5473 -f 5474/5474/5474 5475/5475/5475 5476/5476/5476 -g charts -o chart0000 -s off -f 5465/5465/5465 5466/5466/5466 5467/5467/5467 -f 5465/5465/5465 5467/5467/5467 5468/5468/5468 -f 5465/5465/5465 5468/5468/5468 5469/5469/5469 -f 5465/5465/5465 5469/5469/5469 5470/5470/5470 -o chart0001 -s off -f 5471/5471/5471 5472/5472/5472 5473/5473/5473 -o chart0002 -s off -f 5474/5474/5474 5475/5475/5475 5476/5476/5476 -v -4146 6305.99 1887.82 -vt 0.558188 0.814922 -v -3716.62 6305.99 1887.82 -vt 0.554032 0.814922 -v -3716.62 6320.99 1887.82 -vt 0.554032 0.814097 -v -4146 6320.99 1887.82 -vt 0.558188 0.814097 -o mesh1094 -s off -f 5477/5477/5477 5478/5478/5478 5479/5479/5479 -f 5477/5477/5477 5479/5479/5479 5480/5480/5480 -g charts -o chart0000 -s off -f 5477/5477/5477 5478/5478/5478 5479/5479/5479 -f 5477/5477/5477 5479/5479/5479 5480/5480/5480 -v -3261 6320.99 1887.82 -vt 0.697122 0.634377 -v -3261 6320.99 1874.7 -vt 0.697007 0.634377 -v -4146 6320.99 1874.7 -vt 0.697007 0.626958 -v -4146 6320.99 1887.82 -vt 0.697122 0.626958 -v -3716.62 6320.99 1887.82 -vt 0.697122 0.630558 -v -3716.62 6320.99 2448.45 -vt 0.701995 0.630558 -v -3690.37 6320.99 2448.45 -vt 0.701995 0.630778 -v -3261 6320.99 1887.82 -vt 0.255611 0.95507 -v -3690.37 6320.99 2448.45 -vt 0.255611 0.949299 -v -3690.37 6320.99 1887.82 -vt 0.252286 0.952936 -o mesh1095 -s off -f 5481/5481/5481 5482/5482/5482 5483/5483/5483 -f 5481/5481/5481 5483/5483/5483 5484/5484/5484 -f 5481/5481/5481 5484/5484/5484 5485/5485/5485 -f 5481/5481/5481 5485/5485/5485 5486/5486/5486 -f 5481/5481/5481 5486/5486/5486 5487/5487/5487 -f 5488/5488/5488 5489/5489/5489 5490/5490/5490 -g charts -o chart0000 -s off -f 5481/5481/5481 5482/5482/5482 5483/5483/5483 -f 5481/5481/5481 5483/5483/5483 5484/5484/5484 -f 5481/5481/5481 5484/5484/5484 5485/5485/5485 -f 5481/5481/5481 5485/5485/5485 5486/5486/5486 -f 5481/5481/5481 5486/5486/5486 5487/5487/5487 -o chart0001 -s off -f 5488/5488/5488 5489/5489/5489 5490/5490/5490 -v -3261 6320.99 1874.7 -vt 0.524106 0.431574 -v -3261 6320.99 1861.57 -vt 0.524106 0.43075 -v -4146 6320.99 1861.57 -vt 0.516625 0.43075 -v -4146 6320.99 1874.7 -vt 0.516625 0.431574 -o mesh1096 -s off -f 5491/5491/5491 5492/5492/5492 5493/5493/5493 -f 5491/5491/5491 5493/5493/5493 5494/5494/5494 -g charts -o chart0000 -s off -f 5491/5491/5491 5492/5492/5492 5493/5493/5493 -f 5491/5491/5491 5493/5493/5493 5494/5494/5494 -v -3261 6320.99 1887.82 -vt 0.518288 0.616241 -v -3690.37 6320.99 1887.82 -vt 0.518288 0.620363 -v -3690.37 6305.99 1887.82 -vt 0.519119 0.620363 -v -3261 6305.99 1887.82 -vt 0.519119 0.616241 -o mesh1097 -s off -f 5495/5495/5495 5496/5496/5496 5497/5497/5497 -f 5495/5495/5495 5497/5497/5497 5498/5498/5498 -g charts -o chart0000 -s off -f 5495/5495/5495 5496/5496/5496 5497/5497/5497 -f 5495/5495/5495 5497/5497/5497 5498/5498/5498 -v -3690.37 6305.99 1887.82 -vt 0.106816 0.152927 -v -3690.37 6320.99 1887.82 -vt 0.107647 0.152927 -v -3690.37 6320.99 2448.45 -vt 0.107647 0.14798 -v -3690.37 6305.99 2448.45 -vt 0.106816 0.14798 -o mesh1098 -s off -f 5499/5499/5499 5500/5500/5500 5501/5501/5501 -f 5499/5499/5499 5501/5501/5501 5502/5502/5502 -g charts -o chart0000 -s off -f 5499/5499/5499 5500/5500/5500 5501/5501/5501 -f 5499/5499/5499 5501/5501/5501 5502/5502/5502 -v -3716.62 6320.99 1887.82 -vt 0.212386 0.496702 -v -3716.62 6305.99 1887.82 -vt 0.213217 0.496702 -v -3716.62 6305.99 2448.45 -vt 0.213217 0.491756 -v -3716.62 6320.99 2448.45 -vt 0.212386 0.491756 -o mesh1099 -s off -f 5503/5503/5503 5504/5504/5504 5505/5505/5505 -f 5503/5503/5503 5505/5505/5505 5506/5506/5506 -g charts -o chart0000 -s off -f 5503/5503/5503 5504/5504/5504 5505/5505/5505 -f 5503/5503/5503 5505/5505/5505 5506/5506/5506 -v -3163.5 6380.99 -285.3 -vt 0.977972 0.75474 -v -3126 6380.99 -229.05 -vt 0.978289 0.755565 -v -2083.5 6380.99 -285.3 -vt 0.987115 0.75474 -v -2121 6380.99 -229.05 -vt 0.986798 0.755565 -o mesh1100 -s off -f 5507/5507/5507 5508/5508/5508 5509/5509/5509 -f 5510/5510/5510 5509/5509/5509 5508/5508/5508 -g charts -o chart0000 -s off -f 5507/5507/5507 5508/5508/5508 5509/5509/5509 -f 5510/5510/5510 5509/5509/5509 5508/5508/5508 -v -3126 6380.99 -229.05 -vt 0.810889 0.769206 -v -3163.5 6380.99 -285.3 -vt 0.811721 0.768755 -v -3163.5 6380.99 2594.7 -vt 0.811721 0.791838 -o mesh1101 -s off -f 5511/5511/5511 5512/5512/5512 5513/5513/5513 -g charts -o chart0000 -s off -f 5511/5511/5511 5512/5512/5512 5513/5513/5513 -v -3126 6380.99 -229.05 -vt 0.245636 0.675598 -v -3163.5 6380.99 2594.7 -vt 0.26808 0.675598 -v -3126 6380.99 2538.45 -vt 0.267629 0.674773 -o mesh1102 -s off -f 5514/5514/5514 5515/5515/5515 5516/5516/5516 -g charts -o chart0000 -s off -f 5514/5514/5514 5515/5515/5515 5516/5516/5516 -v -3126 6380.99 2538.45 -vt 0.430175 0.160661 -v -3163.5 6380.99 2594.7 -vt 0.431006 0.160346 -v -2121 6380.99 2538.45 -vt 0.430175 0.1691 -v -2083.5 6380.99 2594.7 -vt 0.431006 0.169415 -o mesh1103 -s off -f 5517/5517/5517 5518/5518/5518 5519/5519/5519 -f 5520/5520/5520 5519/5519/5519 5518/5518/5518 -g charts -o chart0000 -s off -f 5517/5517/5517 5518/5518/5518 5519/5519/5519 -f 5520/5520/5520 5519/5519/5519 5518/5518/5518 -v -2083.5 6380.99 -285.3 -vt 0.999584 0.386232 -v -2121 6380.99 -229.05 -vt 0.998753 0.385782 -v -2083.5 6380.99 2594.7 -vt 0.999584 0.363149 -o mesh1104 -s off -f 5521/5521/5521 5522/5522/5522 5523/5523/5523 -g charts -o chart0000 -s off -f 5521/5521/5521 5522/5522/5522 5523/5523/5523 -v -2083.5 6380.99 2594.7 -vt 0.0403159 0.974856 -v -2121 6380.99 -229.05 -vt 0.0627597 0.974856 -v -2121 6380.99 2538.45 -vt 0.0407668 0.974031 -o mesh1105 -s off -f 5524/5524/5524 5525/5525/5525 5526/5526/5526 -g charts -o chart0000 -s off -f 5524/5524/5524 5525/5525/5525 5526/5526/5526 -v -2083.5 6215.99 -285.3 -vt 0.568163 0.345837 -v -2121 6215.99 -229.05 -vt 0.567845 0.345012 -v -3163.5 6215.99 -285.3 -vt 0.559019 0.345837 -v -3126 6215.99 -229.05 -vt 0.559337 0.345012 -o mesh1106 -s off -f 5527/5527/5527 5528/5528/5528 5529/5529/5529 -f 5530/5530/5530 5529/5529/5529 5528/5528/5528 -g charts -o chart0000 -s off -f 5527/5527/5527 5528/5528/5528 5529/5529/5529 -f 5530/5530/5530 5529/5529/5529 5528/5528/5528 -v -2121 6215.99 -229.05 -vt 0.0790082 0.489283 -v -2083.5 6215.99 -285.3 -vt 0.0785536 0.490107 -v -2083.5 6215.99 2594.7 -vt 0.101829 0.490107 -o mesh1107 -s off -f 5531/5531/5531 5532/5532/5532 5533/5533/5533 -g charts -o chart0000 -s off -f 5531/5531/5531 5532/5532/5532 5533/5533/5533 -v -2121 6215.99 -229.05 -vt 0.775145 0.929514 -v -2083.5 6215.99 2594.7 -vt 0.797589 0.929514 -v -2121 6215.99 2538.45 -vt 0.797138 0.928689 -o mesh1108 -s off -f 5534/5534/5534 5535/5535/5535 5536/5536/5536 -g charts -o chart0000 -s off -f 5534/5534/5534 5535/5535/5535 5536/5536/5536 -v -2121 6215.99 2538.45 -vt 0.134761 0.345012 -v -2083.5 6215.99 2594.7 -vt 0.135079 0.344188 -v -3126 6215.99 2538.45 -vt 0.126253 0.345012 -v -3163.5 6215.99 2594.7 -vt 0.125935 0.344188 -o mesh1109 -s off -f 5537/5537/5537 5538/5538/5538 5539/5539/5539 -f 5540/5540/5540 5539/5539/5539 5538/5538/5538 -g charts -o chart0000 -s off -f 5537/5537/5537 5538/5538/5538 5539/5539/5539 -f 5540/5540/5540 5539/5539/5539 5538/5538/5538 -v -3163.5 6215.99 -285.3 -vt 0.360349 0.794312 -v -3126 6215.99 -229.05 -vt 0.359894 0.793487 -v -3163.5 6215.99 2594.7 -vt 0.337074 0.794312 -o mesh1110 -s off -f 5541/5541/5541 5542/5542/5542 5543/5543/5543 -g charts -o chart0000 -s off -f 5541/5541/5541 5542/5542/5542 5543/5543/5543 -v -3163.5 6215.99 2594.7 -vt 0.757689 0.902308 -v -3126 6215.99 -229.05 -vt 0.780133 0.902308 -v -3126 6215.99 2538.45 -vt 0.75814 0.901484 -o mesh1111 -s off -f 5544/5544/5544 5545/5545/5545 5546/5546/5546 -g charts -o chart0000 -s off -f 5544/5544/5544 5545/5545/5545 5546/5546/5546 -v -2083.5 6380.99 2594.7 -vt 0.369493 0.303792 -v -3163.5 6380.99 2594.7 -vt 0.378637 0.303792 -v -3163.5 6215.99 2594.7 -vt 0.378637 0.305441 -v -2083.5 6215.99 2594.7 -vt 0.369493 0.305441 -o mesh1112 -s off -f 5547/5547/5547 5548/5548/5548 5549/5549/5549 -f 5547/5547/5547 5549/5549/5549 5550/5550/5550 -g charts -o chart0000 -s off -f 5547/5547/5547 5548/5548/5548 5549/5549/5549 -f 5547/5547/5547 5549/5549/5549 5550/5550/5550 -v -3163.5 6380.99 2594.7 -vt 0.983791 0.616241 -v -3163.5 6380.99 -285.3 -vt 0.983791 0.639324 -v -3163.5 6215.99 -285.3 -vt 0.985453 0.639324 -v -3163.5 6215.99 2594.7 -vt 0.985453 0.616241 -o mesh1113 -s off -f 5551/5551/5551 5552/5552/5552 5553/5553/5553 -f 5551/5551/5551 5553/5553/5553 5554/5554/5554 -g charts -o chart0000 -s off -f 5551/5551/5551 5552/5552/5552 5553/5553/5553 -f 5551/5551/5551 5553/5553/5553 5554/5554/5554 -v -3163.5 6380.99 -285.3 -vt 0.999584 0.0408078 -v -2083.5 6380.99 -285.3 -vt 0.999584 0.0317395 -v -2083.5 6215.99 -285.3 -vt 0.997922 0.0317395 -v -3163.5 6215.99 -285.3 -vt 0.997922 0.0408078 -o mesh1114 -s off -f 5555/5555/5555 5556/5556/5556 5557/5557/5557 -f 5555/5555/5555 5557/5557/5557 5558/5558/5558 -g charts -o chart0000 -s off -f 5555/5555/5555 5556/5556/5556 5557/5557/5557 -f 5555/5555/5555 5557/5557/5557 5558/5558/5558 -v -2083.5 6380.99 -285.3 -vt 0.220698 0.302968 -v -2083.5 6380.99 2594.7 -vt 0.197423 0.302968 -v -2083.5 6215.99 2594.7 -vt 0.197423 0.301319 -v -2083.5 6215.99 -285.3 -vt 0.220698 0.301319 -o mesh1115 -s off -f 5559/5559/5559 5560/5560/5560 5561/5561/5561 -f 5559/5559/5559 5561/5561/5561 5562/5562/5562 -g charts -o chart0000 -s off -f 5559/5559/5559 5560/5560/5560 5561/5561/5561 -f 5559/5559/5559 5561/5561/5561 5562/5562/5562 -v -2121 6215.99 -229.05 -vt 0.896509 0.882523 -v -2121 6260.99 -229.05 -vt 0.896055 0.882523 -v -3126 6260.99 -229.05 -vt 0.896055 0.874279 -v -3126 6215.99 -229.05 -vt 0.896509 0.874279 -v -2121 6380.99 -229.05 -vt 0.894846 0.882523 -v -3126 6380.99 -229.05 -vt 0.894846 0.874279 -o mesh1116 -s off -f 5563/5563/5563 5564/5564/5564 5565/5565/5565 -f 5563/5563/5563 5565/5565/5565 5566/5566/5566 -f 5567/5567/5567 5568/5568/5568 5565/5565/5565 -f 5567/5567/5567 5565/5565/5565 5564/5564/5564 -g charts -o chart0000 -s off -f 5563/5563/5563 5564/5564/5564 5565/5565/5565 -f 5563/5563/5563 5565/5565/5565 5566/5566/5566 -f 5567/5567/5567 5568/5568/5568 5565/5565/5565 -f 5567/5567/5567 5565/5565/5565 5564/5564/5564 -v -3126 6215.99 -229.05 -vt 0.475893 0.612119 -v -3126 6260.99 -229.05 -vt 0.475893 0.612568 -v -3126 6260.99 2538.45 -vt 0.45345 0.612568 -v -3126 6215.99 2538.45 -vt 0.45345 0.612119 -v -3126 6380.99 -229.05 -vt 0.475893 0.613767 -v -3126 6380.99 2538.45 -vt 0.45345 0.613767 -o mesh1117 -s off -f 5569/5569/5569 5570/5570/5570 5571/5571/5571 -f 5569/5569/5569 5571/5571/5571 5572/5572/5572 -f 5573/5573/5573 5574/5574/5574 5571/5571/5571 -f 5573/5573/5573 5571/5571/5571 5570/5570/5570 -g charts -o chart0000 -s off -f 5569/5569/5569 5570/5570/5570 5571/5571/5571 -f 5569/5569/5569 5571/5571/5571 5572/5572/5572 -f 5573/5573/5573 5574/5574/5574 5571/5571/5571 -f 5573/5573/5573 5571/5571/5571 5570/5570/5570 -v -3126 6215.99 2538.45 -vt 0.600582 0.85202 -v -3126 6260.99 2538.45 -vt 0.600582 0.852469 -v -2121 6260.99 2538.45 -vt 0.592269 0.852469 -v -2121 6215.99 2538.45 -vt 0.592269 0.85202 -v -3126 6380.99 2538.45 -vt 0.600582 0.853669 -v -2121 6380.99 2538.45 -vt 0.592269 0.853669 -o mesh1118 -s off -f 5575/5575/5575 5576/5576/5576 5577/5577/5577 -f 5575/5575/5575 5577/5577/5577 5578/5578/5578 -f 5579/5579/5579 5580/5580/5580 5577/5577/5577 -f 5579/5579/5579 5577/5577/5577 5576/5576/5576 -g charts -o chart0000 -s off -f 5575/5575/5575 5576/5576/5576 5577/5577/5577 -f 5575/5575/5575 5577/5577/5577 5578/5578/5578 -f 5579/5579/5579 5580/5580/5580 5577/5577/5577 -f 5579/5579/5579 5577/5577/5577 5576/5576/5576 -v -2121 6215.99 2538.45 -vt 0.996259 0.281533 -v -2121 6260.99 2538.45 -vt 0.995806 0.281533 -v -2121 6260.99 -229.05 -vt 0.995806 0.259275 -v -2121 6215.99 -229.05 -vt 0.996259 0.259275 -v -2121 6380.99 2538.45 -vt 0.994597 0.281533 -v -2121 6380.99 -229.05 -vt 0.994597 0.259275 -o mesh1119 -s off -f 5581/5581/5581 5582/5582/5582 5583/5583/5583 -f 5581/5581/5581 5583/5583/5583 5584/5584/5584 -f 5585/5585/5585 5586/5586/5586 5583/5583/5583 -f 5585/5585/5585 5583/5583/5583 5582/5582/5582 -g charts -o chart0000 -s off -f 5581/5581/5581 5582/5582/5582 5583/5583/5583 -f 5581/5581/5581 5583/5583/5583 5584/5584/5584 -f 5585/5585/5585 5586/5586/5586 5583/5583/5583 -f 5585/5585/5585 5583/5583/5583 5582/5582/5582 -v -2121 6260.99 -229.05 -vt 0.0162094 0.88582 -v -2181 6260.99 -139.05 -vt 0.0157131 0.884996 -v -3126 6260.99 -229.05 -vt 0.00789692 0.88582 -v -3066 6260.99 -139.05 -vt 0.00839318 0.884996 -o mesh1120 -s off -f 5587/5587/5587 5588/5588/5588 5589/5589/5589 -f 5590/5590/5590 5589/5589/5589 5588/5588/5588 -g charts -o chart0000 -s off -f 5587/5587/5587 5588/5588/5588 5589/5589/5589 -f 5590/5590/5590 5589/5589/5589 5588/5588/5588 -v -2181 6260.99 -139.05 -vt 0.832401 0.203215 -v -2121 6260.99 -229.05 -vt 0.831671 0.204039 -v -2121 6260.99 2538.45 -vt 0.854115 0.204039 -o mesh1121 -s off -f 5591/5591/5591 5592/5592/5592 5593/5593/5593 -g charts -o chart0000 -s off -f 5591/5591/5591 5592/5592/5592 5593/5593/5593 -v -2181 6260.99 -139.05 -vt 0.4202 0.664056 -v -2121 6260.99 2538.45 -vt 0.441812 0.664056 -v -2181 6260.99 2448.45 -vt 0.441075 0.663232 -o mesh1122 -s off -f 5594/5594/5594 5595/5595/5595 5596/5596/5596 -g charts -o chart0000 -s off -f 5594/5594/5594 5595/5595/5595 5596/5596/5596 -v -2181 6260.99 2448.45 -vt 0.381962 0.764141 -v -2121 6260.99 2538.45 -vt 0.381131 0.764633 -v -3066 6260.99 2448.45 -vt 0.381962 0.756881 -v -3126 6260.99 2538.45 -vt 0.381131 0.756389 -o mesh1123 -s off -f 5597/5597/5597 5598/5598/5598 5599/5599/5599 -f 5600/5600/5600 5599/5599/5599 5598/5598/5598 -g charts -o chart0000 -s off -f 5597/5597/5597 5598/5598/5598 5599/5599/5599 -f 5600/5600/5600 5599/5599/5599 5598/5598/5598 -v -3126 6260.99 -229.05 -vt 0.0120531 0.34831 -v -3066 6260.99 -139.05 -vt 0.0112219 0.347586 -v -3126 6260.99 2538.45 -vt 0.0120531 0.326051 -o mesh1124 -s off -f 5601/5601/5601 5602/5602/5602 5603/5603/5603 -g charts -o chart0000 -s off -f 5601/5601/5601 5602/5602/5602 5603/5603/5603 -v -3126 6260.99 2538.45 -vt 0.994597 0.738252 -v -3066 6260.99 -139.05 -vt 0.994597 0.759687 -v -3066 6260.99 2448.45 -vt 0.993766 0.738983 -o mesh1125 -s off -f 5604/5604/5604 5605/5605/5605 5606/5606/5606 -g charts -o chart0000 -s off -f 5604/5604/5604 5605/5605/5605 5606/5606/5606 -v -3066 6380.99 2448.45 -vt 0.984622 0.527205 -v -2636.62 6320.99 2448.45 -vt 0.985453 0.523605 -v -3066 6260.99 2448.45 -vt 0.986284 0.527205 -v -2181 6380.99 2448.45 -vt 0.984622 0.519786 -v -2610.37 6320.99 2448.45 -vt 0.985453 0.523385 -v -2610.37 6305.99 2448.45 -vt 0.985661 0.523385 -v -2636.62 6305.99 2448.45 -vt 0.985661 0.523605 -v -2181 6260.99 2448.45 -vt 0.986284 0.519786 -o mesh1126 -s off -f 5607/5607/5607 5608/5608/5608 5609/5609/5609 -f 5608/5608/5608 5607/5607/5607 5610/5610/5610 -f 5608/5608/5608 5610/5610/5610 5611/5611/5611 -f 5611/5611/5611 5610/5610/5610 5612/5612/5612 -f 5609/5609/5609 5613/5613/5613 5614/5614/5614 -f 5613/5613/5613 5609/5609/5609 5608/5608/5608 -f 5614/5614/5614 5613/5613/5613 5612/5612/5612 -f 5614/5614/5614 5612/5612/5612 5610/5610/5610 -g charts -o chart0000 -s off -f 5607/5607/5607 5608/5608/5608 5609/5609/5609 -f 5608/5608/5608 5607/5607/5607 5610/5610/5610 -f 5608/5608/5608 5610/5610/5610 5611/5611/5611 -f 5611/5611/5611 5610/5610/5610 5612/5612/5612 -f 5609/5609/5609 5613/5613/5613 5614/5614/5614 -f 5613/5613/5613 5609/5609/5609 5608/5608/5608 -f 5614/5614/5614 5613/5613/5613 5612/5612/5612 -f 5614/5614/5614 5612/5612/5612 5610/5610/5610 -v -2181 6380.99 -139.05 -vt 0.0128845 0.331822 -v -3066 6380.99 -139.05 -vt 0.0128845 0.339241 -v -3066 6260.99 -139.05 -vt 0.0145469 0.339241 -v -2181 6260.99 -139.05 -vt 0.0145469 0.331822 -o mesh1127 -s off -f 5615/5615/5615 5616/5616/5616 5617/5617/5617 -f 5615/5615/5615 5617/5617/5617 5618/5618/5618 -g charts -o chart0000 -s off -f 5615/5615/5615 5616/5616/5616 5617/5617/5617 -f 5615/5615/5615 5617/5617/5617 5618/5618/5618 -v -3066 6380.99 -139.05 -vt 0.0810474 0.660758 -v -3066 6260.99 2448.45 -vt 0.101829 0.662407 -v -3066 6260.99 -139.05 -vt 0.0810474 0.662407 -v -3066 6305.99 1861.57 -vt 0.0971152 0.661789 -v -3066 6320.99 1861.57 -vt 0.0971152 0.661583 -v -3066 6320.99 1874.7 -vt 0.0972206 0.661583 -v -3066 6320.99 1887.82 -vt 0.0973261 0.661583 -v -3066 6305.99 1887.82 -vt 0.0973261 0.661789 -v -3066 6380.99 2448.45 -vt 0.101829 0.660758 -o mesh1128 -s off -f 5619/5619/5619 5620/5620/5620 5621/5621/5621 -f 5620/5620/5620 5619/5619/5619 5622/5622/5622 -f 5622/5622/5622 5619/5619/5619 5623/5623/5623 -f 5623/5623/5623 5619/5619/5619 5624/5624/5624 -f 5624/5624/5624 5619/5619/5619 5625/5625/5625 -f 5620/5620/5620 5626/5626/5626 5627/5627/5627 -f 5626/5626/5626 5620/5620/5620 5622/5622/5622 -f 5627/5627/5627 5626/5626/5626 5625/5625/5625 -f 5627/5627/5627 5625/5625/5625 5619/5619/5619 -g charts -o chart0000 -s off -f 5619/5619/5619 5620/5620/5620 5621/5621/5621 -f 5620/5620/5620 5619/5619/5619 5622/5622/5622 -f 5622/5622/5622 5619/5619/5619 5623/5623/5623 -f 5623/5623/5623 5619/5619/5619 5624/5624/5624 -f 5624/5624/5624 5619/5619/5619 5625/5625/5625 -f 5620/5620/5620 5626/5626/5626 5627/5627/5627 -f 5626/5626/5626 5620/5620/5620 5622/5622/5622 -f 5627/5627/5627 5626/5626/5626 5625/5625/5625 -f 5627/5627/5627 5625/5625/5625 5619/5619/5619 -v -2181 6260.99 2448.45 -vt 0.988778 0.241962 -v -2181 6305.99 1887.82 -vt 0.988155 0.237496 -v -2181 6260.99 -139.05 -vt 0.988778 0.221352 -v -2181 6380.99 2448.45 -vt 0.987116 0.241962 -v -2181 6320.99 1887.82 -vt 0.987947 0.237496 -v -2181 6320.99 1874.7 -vt 0.987947 0.237392 -v -2181 6320.99 1861.57 -vt 0.987947 0.237287 -v -2181 6305.99 1861.57 -vt 0.988155 0.237287 -v -2181 6380.99 -139.05 -vt 0.987116 0.221352 -o mesh1129 -s off -f 5628/5628/5628 5629/5629/5629 5630/5630/5630 -f 5629/5629/5629 5628/5628/5628 5631/5631/5631 -f 5629/5629/5629 5631/5631/5631 5632/5632/5632 -f 5632/5632/5632 5631/5631/5631 5633/5633/5633 -f 5633/5633/5633 5631/5631/5631 5634/5634/5634 -f 5630/5630/5630 5635/5635/5635 5636/5636/5636 -f 5635/5635/5635 5630/5630/5630 5629/5629/5629 -f 5636/5636/5636 5635/5635/5635 5634/5634/5634 -f 5636/5636/5636 5634/5634/5634 5631/5631/5631 -g charts -o chart0000 -s off -f 5628/5628/5628 5629/5629/5629 5630/5630/5630 -f 5629/5629/5629 5628/5628/5628 5631/5631/5631 -f 5629/5629/5629 5631/5631/5631 5632/5632/5632 -f 5632/5632/5632 5631/5631/5631 5633/5633/5633 -f 5633/5633/5633 5631/5631/5631 5634/5634/5634 -f 5630/5630/5630 5635/5635/5635 5636/5636/5636 -f 5635/5635/5635 5630/5630/5630 5629/5629/5629 -f 5636/5636/5636 5635/5635/5635 5634/5634/5634 -f 5636/5636/5636 5634/5634/5634 5631/5631/5631 -v -2181 6320.99 1861.57 -vt 0.432668 0.218879 -v -2181 6305.99 1861.57 -vt 0.431837 0.218879 -v -3066 6305.99 1861.57 -vt 0.431837 0.211459 -v -3066 6320.99 1861.57 -vt 0.432668 0.211459 -o mesh1130 -s off -f 5637/5637/5637 5638/5638/5638 5639/5639/5639 -f 5637/5637/5637 5639/5639/5639 5640/5640/5640 -g charts -o chart0000 -s off -f 5637/5637/5637 5638/5638/5638 5639/5639/5639 -f 5637/5637/5637 5639/5639/5639 5640/5640/5640 -v -3066 6305.99 1861.57 -vt 0.488362 0.9831 -v -2181 6305.99 1861.57 -vt 0.495844 0.9831 -v -2181 6305.99 1887.82 -vt 0.495844 0.982878 -v -2610.37 6305.99 1887.82 -vt 0.492214 0.982878 -v -2610.37 6305.99 2448.45 -vt 0.492214 0.978153 -v -2636.62 6305.99 2448.45 -vt 0.491992 0.978153 -v -3066 6305.99 1861.57 -vt 0.829177 0.181781 -v -2636.62 6305.99 2448.45 -vt 0.823358 0.181781 -v -2636.62 6305.99 1887.82 -vt 0.826979 0.178483 -v -3066 6305.99 1861.57 -vt 0.309642 0.607172 -v -2636.62 6305.99 1887.82 -vt 0.305486 0.606348 -v -3066 6305.99 1887.82 -vt 0.309642 0.606348 -o mesh1131 -s off -f 5641/5641/5641 5642/5642/5642 5643/5643/5643 -f 5641/5641/5641 5643/5643/5643 5644/5644/5644 -f 5641/5641/5641 5644/5644/5644 5645/5645/5645 -f 5641/5641/5641 5645/5645/5645 5646/5646/5646 -f 5647/5647/5647 5648/5648/5648 5649/5649/5649 -f 5650/5650/5650 5651/5651/5651 5652/5652/5652 -g charts -o chart0000 -s off -f 5641/5641/5641 5642/5642/5642 5643/5643/5643 -f 5641/5641/5641 5643/5643/5643 5644/5644/5644 -f 5641/5641/5641 5644/5644/5644 5645/5645/5645 -f 5641/5641/5641 5645/5645/5645 5646/5646/5646 -o chart0001 -s off -f 5647/5647/5647 5648/5648/5648 5649/5649/5649 -o chart0002 -s off -f 5650/5650/5650 5651/5651/5651 5652/5652/5652 -v -3066 6305.99 1887.82 -vt 0.919784 0.943528 -v -2636.62 6305.99 1887.82 -vt 0.915628 0.943528 -v -2636.62 6320.99 1887.82 -vt 0.915628 0.942704 -v -3066 6320.99 1887.82 -vt 0.919784 0.942704 -o mesh1132 -s off -f 5653/5653/5653 5654/5654/5654 5655/5655/5655 -f 5653/5653/5653 5655/5655/5655 5656/5656/5656 -g charts -o chart0000 -s off -f 5653/5653/5653 5654/5654/5654 5655/5655/5655 -f 5653/5653/5653 5655/5655/5655 5656/5656/5656 -v -2181 6320.99 1887.82 -vt 0.97714 0.519899 -v -2181 6320.99 1874.7 -vt 0.97714 0.519786 -v -3066 6320.99 1874.7 -vt 0.969659 0.519786 -v -3066 6320.99 1887.82 -vt 0.969659 0.519899 -v -2636.62 6320.99 1887.82 -vt 0.973289 0.519899 -v -2636.62 6320.99 2448.45 -vt 0.973289 0.524732 -v -2610.37 6320.99 2448.45 -vt 0.973511 0.524732 -v -2181 6320.99 1887.82 -vt 0.854115 0.392828 -v -2610.37 6320.99 2448.45 -vt 0.859102 0.39695 -v -2610.37 6320.99 1887.82 -vt 0.854115 0.39695 -o mesh1133 -s off -f 5657/5657/5657 5658/5658/5658 5659/5659/5659 -f 5657/5657/5657 5659/5659/5659 5660/5660/5660 -f 5657/5657/5657 5660/5660/5660 5661/5661/5661 -f 5657/5657/5657 5661/5661/5661 5662/5662/5662 -f 5657/5657/5657 5662/5662/5662 5663/5663/5663 -f 5664/5664/5664 5665/5665/5665 5666/5666/5666 -g charts -o chart0000 -s off -f 5657/5657/5657 5658/5658/5658 5659/5659/5659 -f 5657/5657/5657 5659/5659/5659 5660/5660/5660 -f 5657/5657/5657 5660/5660/5660 5661/5661/5661 -f 5657/5657/5657 5661/5661/5661 5662/5662/5662 -f 5657/5657/5657 5662/5662/5662 5663/5663/5663 -o chart0001 -s off -f 5664/5664/5664 5665/5665/5665 5666/5666/5666 -v -2181 6320.99 1874.7 -vt 0.424356 0.717642 -v -2181 6320.99 1861.57 -vt 0.424356 0.716818 -v -3066 6320.99 1861.57 -vt 0.416874 0.716818 -v -3066 6320.99 1874.7 -vt 0.416874 0.717642 -o mesh1134 -s off -f 5667/5667/5667 5668/5668/5668 5669/5669/5669 -f 5667/5667/5667 5669/5669/5669 5670/5670/5670 -g charts -o chart0000 -s off -f 5667/5667/5667 5668/5668/5668 5669/5669/5669 -f 5667/5667/5667 5669/5669/5669 5670/5670/5670 -v -2181 6320.99 1887.82 -vt 0.881546 0.849547 -v -2610.37 6320.99 1887.82 -vt 0.885702 0.849547 -v -2610.37 6305.99 1887.82 -vt 0.885702 0.850371 -v -2181 6305.99 1887.82 -vt 0.881546 0.850371 -o mesh1135 -s off -f 5671/5671/5671 5672/5672/5672 5673/5673/5673 -f 5671/5671/5671 5673/5673/5673 5674/5674/5674 -g charts -o chart0000 -s off -f 5671/5671/5671 5672/5672/5672 5673/5673/5673 -f 5671/5671/5671 5673/5673/5673 5674/5674/5674 -v -2610.37 6305.99 1887.82 -vt 0.618038 0.79019 -v -2610.37 6320.99 1887.82 -vt 0.618038 0.791014 -v -2610.37 6320.99 2448.45 -vt 0.613051 0.791014 -v -2610.37 6305.99 2448.45 -vt 0.613051 0.79019 -o mesh1136 -s off -f 5675/5675/5675 5676/5676/5676 5677/5677/5677 -f 5675/5675/5675 5677/5677/5677 5678/5678/5678 -g charts -o chart0000 -s off -f 5675/5675/5675 5676/5676/5676 5677/5677/5677 -f 5675/5675/5675 5677/5677/5677 5678/5678/5678 -v -2636.62 6320.99 1887.82 -vt 0.695345 0.36892 -v -2636.62 6305.99 1887.82 -vt 0.696176 0.36892 -v -2636.62 6305.99 2448.45 -vt 0.696176 0.363974 -v -2636.62 6320.99 2448.45 -vt 0.695345 0.363974 -o mesh1137 -s off -f 5679/5679/5679 5680/5680/5680 5681/5681/5681 -f 5679/5679/5679 5681/5681/5681 5682/5682/5682 -g charts -o chart0000 -s off -f 5679/5679/5679 5680/5680/5680 5681/5681/5681 -f 5679/5679/5679 5681/5681/5681 5682/5682/5682 -v -5323.5 6380.99 -285.3 -vt 0.24148 0.643446 -v -5286 6380.99 -229.05 -vt 0.241797 0.64427 -v -4243.5 6380.99 -285.3 -vt 0.250623 0.643446 -v -4281 6380.99 -229.05 -vt 0.250306 0.64427 -o mesh1138 -s off -f 5683/5683/5683 5684/5684/5684 5685/5685/5685 -f 5686/5686/5686 5685/5685/5685 5684/5684/5684 -g charts -o chart0000 -s off -f 5683/5683/5683 5684/5684/5684 5685/5685/5685 -f 5686/5686/5686 5685/5685/5685 5684/5684/5684 -v -5286 6380.99 -229.05 -vt 0.473023 0.633553 -v -5323.5 6380.99 -285.3 -vt 0.472569 0.634377 -v -5323.5 6380.99 2594.7 -vt 0.495844 0.634377 -o mesh1139 -s off -f 5687/5687/5687 5688/5688/5688 5689/5689/5689 -g charts -o chart0000 -s off -f 5687/5687/5687 5688/5688/5688 5689/5689/5689 -v -5286 6380.99 -229.05 -vt 0.00207805 0.622836 -v -5323.5 6380.99 2594.7 -vt 0.00207805 0.645095 -v -5286 6380.99 2538.45 -vt 0.00124688 0.644647 -o mesh1140 -s off -f 5690/5690/5690 5691/5691/5691 5692/5692/5692 -g charts -o chart0000 -s off -f 5690/5690/5690 5691/5691/5691 5692/5692/5692 -v -5286 6380.99 2538.45 -vt 0.609212 0.304617 -v -5323.5 6380.99 2594.7 -vt 0.608894 0.305441 -v -4281 6380.99 2538.45 -vt 0.617721 0.304617 -v -4243.5 6380.99 2594.7 -vt 0.618038 0.305441 -o mesh1141 -s off -f 5693/5693/5693 5694/5694/5694 5695/5695/5695 -f 5696/5696/5696 5695/5695/5695 5694/5694/5694 -g charts -o chart0000 -s off -f 5693/5693/5693 5694/5694/5694 5695/5695/5695 -f 5696/5696/5696 5695/5695/5695 5694/5694/5694 -v -4243.5 6380.99 -285.3 -vt 0.626351 0.78277 -v -4281 6380.99 -229.05 -vt 0.62552 0.782319 -v -4243.5 6380.99 2594.7 -vt 0.626351 0.759687 -o mesh1142 -s off -f 5697/5697/5697 5698/5698/5698 5699/5699/5699 -g charts -o chart0000 -s off -f 5697/5697/5697 5698/5698/5698 5699/5699/5699 -v -4243.5 6380.99 2594.7 -vt 0.945553 0.124897 -v -4281 6380.99 -229.05 -vt 0.967997 0.124897 -v -4281 6380.99 2538.45 -vt 0.946004 0.124073 -o mesh1143 -s off -f 5700/5700/5700 5701/5701/5701 5702/5702/5702 -g charts -o chart0000 -s off -f 5700/5700/5700 5701/5701/5701 5702/5702/5702 -v -4243.5 6215.99 -285.3 -vt 0.71862 0.646744 -v -4281 6215.99 -229.05 -vt 0.717789 0.646429 -v -5323.5 6215.99 -285.3 -vt 0.71862 0.637675 -v -5286 6215.99 -229.05 -vt 0.717789 0.63799 -o mesh1144 -s off -f 5703/5703/5703 5704/5704/5704 5705/5705/5705 -f 5706/5706/5706 5705/5705/5705 5704/5704/5704 -g charts -o chart0000 -s off -f 5703/5703/5703 5704/5704/5704 5705/5705/5705 -f 5706/5706/5706 5705/5705/5705 5704/5704/5704 -v -4281 6215.99 -229.05 -vt 0.72527 0.958819 -v -4243.5 6215.99 -285.3 -vt 0.726101 0.958368 -v -4243.5 6215.99 2594.7 -vt 0.726101 0.981451 -o mesh1145 -s off -f 5707/5707/5707 5708/5708/5708 5709/5709/5709 -g charts -o chart0000 -s off -f 5707/5707/5707 5708/5708/5708 5709/5709/5709 -v -4281 6215.99 -229.05 -vt 0.225686 0.95507 -v -4243.5 6215.99 2594.7 -vt 0.24813 0.95507 -v -4281 6215.99 2538.45 -vt 0.247679 0.954246 -o mesh1146 -s off -f 5710/5710/5710 5711/5711/5711 5712/5712/5712 -g charts -o chart0000 -s off -f 5710/5710/5710 5711/5711/5711 5712/5712/5712 -v -4281 6215.99 2538.45 -vt 0.0660847 0.842636 -v -4243.5 6215.99 2594.7 -vt 0.0652535 0.842951 -v -5286 6215.99 2538.45 -vt 0.0660847 0.834198 -v -5323.5 6215.99 2594.7 -vt 0.0652535 0.833883 -o mesh1147 -s off -f 5713/5713/5713 5714/5714/5714 5715/5715/5715 -f 5716/5716/5716 5715/5715/5715 5714/5714/5714 -g charts -o chart0000 -s off -f 5713/5713/5713 5714/5714/5714 5715/5715/5715 -f 5716/5716/5716 5715/5715/5715 5714/5714/5714 -v -5323.5 6215.99 -285.3 -vt 0.397756 0.841302 -v -5286 6215.99 -229.05 -vt 0.397301 0.840478 -v -5323.5 6215.99 2594.7 -vt 0.37448 0.841302 -o mesh1148 -s off -f 5717/5717/5717 5718/5718/5718 5719/5719/5719 -g charts -o chart0000 -s off -f 5717/5717/5717 5718/5718/5718 5719/5719/5719 -v -5323.5 6215.99 2594.7 -vt 0.896509 0.85202 -v -5286 6215.99 -229.05 -vt 0.918953 0.85202 -v -5286 6215.99 2538.45 -vt 0.89696 0.851195 -o mesh1149 -s off -f 5720/5720/5720 5721/5721/5721 5722/5722/5722 -g charts -o chart0000 -s off -f 5720/5720/5720 5721/5721/5721 5722/5722/5722 -v -4243.5 6380.99 2594.7 -vt 0.0236908 0.405194 -v -5323.5 6380.99 2594.7 -vt 0.0236908 0.414262 -v -5323.5 6215.99 2594.7 -vt 0.0253532 0.414262 -v -4243.5 6215.99 2594.7 -vt 0.0253532 0.405194 -o mesh1150 -s off -f 5723/5723/5723 5724/5724/5724 5725/5725/5725 -f 5723/5723/5723 5725/5725/5725 5726/5726/5726 -g charts -o chart0000 -s off -f 5723/5723/5723 5724/5724/5724 5725/5725/5725 -f 5723/5723/5723 5725/5725/5725 5726/5726/5726 -v -5323.5 6380.99 2594.7 -vt 0.849127 0.675598 -v -5323.5 6380.99 -285.3 -vt 0.872402 0.675598 -v -5323.5 6215.99 -285.3 -vt 0.872402 0.677246 -v -5323.5 6215.99 2594.7 -vt 0.849127 0.677246 -o mesh1151 -s off -f 5727/5727/5727 5728/5728/5728 5729/5729/5729 -f 5727/5727/5727 5729/5729/5729 5730/5730/5730 -g charts -o chart0000 -s off -f 5727/5727/5727 5728/5728/5728 5729/5729/5729 -f 5727/5727/5727 5729/5729/5729 5730/5730/5730 -v -5323.5 6380.99 -285.3 -vt 0.619701 0.599753 -v -4243.5 6380.99 -285.3 -vt 0.610557 0.599753 -v -4243.5 6215.99 -285.3 -vt 0.610557 0.598104 -v -5323.5 6215.99 -285.3 -vt 0.619701 0.598104 -o mesh1152 -s off -f 5731/5731/5731 5732/5732/5732 5733/5733/5733 -f 5731/5731/5731 5733/5733/5733 5734/5734/5734 -g charts -o chart0000 -s off -f 5731/5731/5731 5732/5732/5732 5733/5733/5733 -f 5731/5731/5731 5733/5733/5733 5734/5734/5734 -v -4243.5 6380.99 -285.3 -vt 0.302992 0.605523 -v -4243.5 6380.99 2594.7 -vt 0.279717 0.605523 -v -4243.5 6215.99 2594.7 -vt 0.279717 0.603875 -v -4243.5 6215.99 -285.3 -vt 0.302992 0.603875 -o mesh1153 -s off -f 5735/5735/5735 5736/5736/5736 5737/5737/5737 -f 5735/5735/5735 5737/5737/5737 5738/5738/5738 -g charts -o chart0000 -s off -f 5735/5735/5735 5736/5736/5736 5737/5737/5737 -f 5735/5735/5735 5737/5737/5737 5738/5738/5738 -v -4281 6215.99 -229.05 -vt 0.10266 0.683842 -v -4281 6260.99 -229.05 -vt 0.102207 0.683842 -v -5286 6260.99 -229.05 -vt 0.102207 0.675598 -v -5286 6215.99 -229.05 -vt 0.10266 0.675598 -v -4281 6380.99 -229.05 -vt 0.100998 0.683842 -v -5286 6380.99 -229.05 -vt 0.100998 0.675598 -o mesh1154 -s off -f 5739/5739/5739 5740/5740/5740 5741/5741/5741 -f 5739/5739/5739 5741/5741/5741 5742/5742/5742 -f 5743/5743/5743 5744/5744/5744 5741/5741/5741 -f 5743/5743/5743 5741/5741/5741 5740/5740/5740 -g charts -o chart0000 -s off -f 5739/5739/5739 5740/5740/5740 5741/5741/5741 -f 5739/5739/5739 5741/5741/5741 5742/5742/5742 -f 5743/5743/5743 5744/5744/5744 5741/5741/5741 -f 5743/5743/5743 5741/5741/5741 5740/5740/5740 -v -5286 6215.99 -229.05 -vt 0.947215 0.600577 -v -5286 6260.99 -229.05 -vt 0.947669 0.600577 -v -5286 6260.99 2538.45 -vt 0.947669 0.578318 -v -5286 6215.99 2538.45 -vt 0.947215 0.578318 -v -5286 6380.99 -229.05 -vt 0.948878 0.600577 -v -5286 6380.99 2538.45 -vt 0.948878 0.578318 -o mesh1155 -s off -f 5745/5745/5745 5746/5746/5746 5747/5747/5747 -f 5745/5745/5745 5747/5747/5747 5748/5748/5748 -f 5749/5749/5749 5750/5750/5750 5747/5747/5747 -f 5749/5749/5749 5747/5747/5747 5746/5746/5746 -g charts -o chart0000 -s off -f 5745/5745/5745 5746/5746/5746 5747/5747/5747 -f 5745/5745/5745 5747/5747/5747 5748/5748/5748 -f 5749/5749/5749 5750/5750/5750 5747/5747/5747 -f 5749/5749/5749 5747/5747/5747 5746/5746/5746 -v -5286 6215.99 2538.45 -vt 0.656276 0.993817 -v -5286 6260.99 2538.45 -vt 0.656729 0.993817 -v -4281 6260.99 2538.45 -vt 0.656729 0.985573 -v -4281 6215.99 2538.45 -vt 0.656276 0.985573 -v -5286 6380.99 2538.45 -vt 0.657938 0.993817 -v -4281 6380.99 2538.45 -vt 0.657938 0.985573 -o mesh1156 -s off -f 5751/5751/5751 5752/5752/5752 5753/5753/5753 -f 5751/5751/5751 5753/5753/5753 5754/5754/5754 -f 5755/5755/5755 5756/5756/5756 5753/5753/5753 -f 5755/5755/5755 5753/5753/5753 5752/5752/5752 -g charts -o chart0000 -s off -f 5751/5751/5751 5752/5752/5752 5753/5753/5753 -f 5751/5751/5751 5753/5753/5753 5754/5754/5754 -f 5755/5755/5755 5756/5756/5756 5753/5753/5753 -f 5755/5755/5755 5753/5753/5753 5752/5752/5752 -v -4281 6215.99 2538.45 -vt 0.71197 0.58986 -v -4281 6260.99 2538.45 -vt 0.71197 0.58941 -v -4281 6260.99 -229.05 -vt 0.689526 0.58941 -v -4281 6215.99 -229.05 -vt 0.689526 0.58986 -v -4281 6380.99 2538.45 -vt 0.71197 0.588211 -v -4281 6380.99 -229.05 -vt 0.689526 0.588211 -o mesh1157 -s off -f 5757/5757/5757 5758/5758/5758 5759/5759/5759 -f 5757/5757/5757 5759/5759/5759 5760/5760/5760 -f 5761/5761/5761 5762/5762/5762 5759/5759/5759 -f 5761/5761/5761 5759/5759/5759 5758/5758/5758 -g charts -o chart0000 -s off -f 5757/5757/5757 5758/5758/5758 5759/5759/5759 -f 5757/5757/5757 5759/5759/5759 5760/5760/5760 -f 5761/5761/5761 5762/5762/5762 5759/5759/5759 -f 5761/5761/5761 5759/5759/5759 5758/5758/5758 -v -4281 6260.99 -229.05 -vt 0.0502909 0.704452 -v -4341 6260.99 -139.05 -vt 0.0497946 0.703627 -v -5286 6260.99 -229.05 -vt 0.0419784 0.704452 -v -5226 6260.99 -139.05 -vt 0.0424747 0.703627 -o mesh1158 -s off -f 5763/5763/5763 5764/5764/5764 5765/5765/5765 -f 5766/5766/5766 5765/5765/5765 5764/5764/5764 -g charts -o chart0000 -s off -f 5763/5763/5763 5764/5764/5764 5765/5765/5765 -f 5766/5766/5766 5765/5765/5765 5764/5764/5764 -v -4341 6260.99 -139.05 -vt 0.464256 0.856041 -v -4281 6260.99 -229.05 -vt 0.465087 0.855317 -v -4281 6260.99 2538.45 -vt 0.465087 0.877576 -o mesh1159 -s off -f 5767/5767/5767 5768/5768/5768 5769/5769/5769 -g charts -o chart0000 -s off -f 5767/5767/5767 5768/5768/5768 5769/5769/5769 -v -4341 6260.99 -139.05 -vt 0.785952 0.392828 -v -4281 6260.99 2538.45 -vt 0.785952 0.414262 -v -4341 6260.99 2448.45 -vt 0.785121 0.413531 -o mesh1160 -s off -f 5770/5770/5770 5771/5771/5771 5772/5772/5772 -g charts -o chart0000 -s off -f 5770/5770/5770 5771/5771/5771 5772/5772/5772 -v -4341 6260.99 2448.45 -vt 0.834996 0.361008 -v -4281 6260.99 2538.45 -vt 0.834165 0.3615 -v -5226 6260.99 2448.45 -vt 0.834996 0.353749 -v -5286 6260.99 2538.45 -vt 0.834165 0.353256 -o mesh1161 -s off -f 5773/5773/5773 5774/5774/5774 5775/5775/5775 -f 5776/5776/5776 5775/5775/5775 5774/5774/5774 -g charts -o chart0000 -s off -f 5773/5773/5773 5774/5774/5774 5775/5775/5775 -f 5776/5776/5776 5775/5775/5775 5774/5774/5774 -v -5286 6260.99 -229.05 -vt 0.416874 0.667354 -v -5226 6260.99 -139.05 -vt 0.416043 0.66663 -v -5286 6260.99 2538.45 -vt 0.416874 0.645095 -o mesh1162 -s off -f 5777/5777/5777 5778/5778/5778 5779/5779/5779 -g charts -o chart0000 -s off -f 5777/5777/5777 5778/5778/5778 5779/5779/5779 -v -5286 6260.99 2538.45 -vt 0.00207794 0.743199 -v -5226 6260.99 -139.05 -vt 0.00207805 0.764633 -v -5226 6260.99 2448.45 -vt 0.00124688 0.74393 -o mesh1163 -s off -f 5780/5780/5780 5781/5781/5781 5782/5782/5782 -g charts -o chart0000 -s off -f 5780/5780/5780 5781/5781/5781 5782/5782/5782 -v -5226 6380.99 2448.45 -vt 0.031172 0.974031 -v -4796.62 6320.99 2448.45 -vt 0.0275423 0.974856 -v -5226 6260.99 2448.45 -vt 0.031172 0.97568 -v -4341 6380.99 2448.45 -vt 0.0236908 0.974031 -v -4770.37 6320.99 2448.45 -vt 0.0273204 0.974856 -v -4770.37 6305.99 2448.45 -vt 0.0273204 0.975062 -v -4796.62 6305.99 2448.45 -vt 0.0275423 0.975062 -v -4341 6260.99 2448.45 -vt 0.0236908 0.97568 -o mesh1164 -s off -f 5783/5783/5783 5784/5784/5784 5785/5785/5785 -f 5784/5784/5784 5783/5783/5783 5786/5786/5786 -f 5784/5784/5784 5786/5786/5786 5787/5787/5787 -f 5787/5787/5787 5786/5786/5786 5788/5788/5788 -f 5785/5785/5785 5789/5789/5789 5790/5790/5790 -f 5789/5789/5789 5785/5785/5785 5784/5784/5784 -f 5790/5790/5790 5789/5789/5789 5788/5788/5788 -f 5790/5790/5790 5788/5788/5788 5786/5786/5786 -g charts -o chart0000 -s off -f 5783/5783/5783 5784/5784/5784 5785/5785/5785 -f 5784/5784/5784 5783/5783/5783 5786/5786/5786 -f 5784/5784/5784 5786/5786/5786 5787/5787/5787 -f 5787/5787/5787 5786/5786/5786 5788/5788/5788 -f 5785/5785/5785 5789/5789/5789 5790/5790/5790 -f 5789/5789/5789 5785/5785/5785 5784/5784/5784 -f 5790/5790/5790 5789/5789/5789 5788/5788/5788 -f 5790/5790/5790 5788/5788/5788 5786/5786/5786 -v -4341 6380.99 -139.05 -vt 0.875727 0.964139 -v -5226 6380.99 -139.05 -vt 0.883209 0.964139 -v -5226 6260.99 -139.05 -vt 0.883209 0.965787 -v -4341 6260.99 -139.05 -vt 0.875727 0.965787 -o mesh1165 -s off -f 5791/5791/5791 5792/5792/5792 5793/5793/5793 -f 5791/5791/5791 5793/5793/5793 5794/5794/5794 -g charts -o chart0000 -s off -f 5791/5791/5791 5792/5792/5792 5793/5793/5793 -f 5791/5791/5791 5793/5793/5793 5794/5794/5794 -v -5226 6380.99 -139.05 -vt 0.953034 0.20404 -v -5226 6260.99 2448.45 -vt 0.954696 0.22465 -v -5226 6260.99 -139.05 -vt 0.954696 0.20404 -v -5226 6305.99 1861.57 -vt 0.954073 0.219975 -v -5226 6320.99 1861.57 -vt 0.953865 0.219975 -v -5226 6320.99 1874.7 -vt 0.953865 0.22008 -v -5226 6320.99 1887.82 -vt 0.953865 0.220184 -v -5226 6305.99 1887.82 -vt 0.954073 0.220184 -v -5226 6380.99 2448.45 -vt 0.953034 0.22465 -o mesh1166 -s off -f 5795/5795/5795 5796/5796/5796 5797/5797/5797 -f 5796/5796/5796 5795/5795/5795 5798/5798/5798 -f 5798/5798/5798 5795/5795/5795 5799/5799/5799 -f 5799/5799/5799 5795/5795/5795 5800/5800/5800 -f 5800/5800/5800 5795/5795/5795 5801/5801/5801 -f 5796/5796/5796 5802/5802/5802 5803/5803/5803 -f 5802/5802/5802 5796/5796/5796 5798/5798/5798 -f 5803/5803/5803 5802/5802/5802 5801/5801/5801 -f 5803/5803/5803 5801/5801/5801 5795/5795/5795 -g charts -o chart0000 -s off -f 5795/5795/5795 5796/5796/5796 5797/5797/5797 -f 5796/5796/5796 5795/5795/5795 5798/5798/5798 -f 5798/5798/5798 5795/5795/5795 5799/5799/5799 -f 5799/5799/5799 5795/5795/5795 5800/5800/5800 -f 5800/5800/5800 5795/5795/5795 5801/5801/5801 -f 5796/5796/5796 5802/5802/5802 5803/5803/5803 -f 5802/5802/5802 5796/5796/5796 5798/5798/5798 -f 5803/5803/5803 5802/5802/5802 5801/5801/5801 -f 5803/5803/5803 5801/5801/5801 5795/5795/5795 -v -4341 6260.99 2448.45 -vt 0.898171 0.30709 -v -4341 6305.99 1887.82 -vt 0.897548 0.302624 -v -4341 6260.99 -139.05 -vt 0.898171 0.28648 -v -4341 6380.99 2448.45 -vt 0.896509 0.30709 -v -4341 6320.99 1887.82 -vt 0.89734 0.302624 -v -4341 6320.99 1874.7 -vt 0.89734 0.30252 -v -4341 6320.99 1861.57 -vt 0.89734 0.302415 -v -4341 6305.99 1861.57 -vt 0.897548 0.302415 -v -4341 6380.99 -139.05 -vt 0.896509 0.28648 -o mesh1167 -s off -f 5804/5804/5804 5805/5805/5805 5806/5806/5806 -f 5805/5805/5805 5804/5804/5804 5807/5807/5807 -f 5805/5805/5805 5807/5807/5807 5808/5808/5808 -f 5808/5808/5808 5807/5807/5807 5809/5809/5809 -f 5809/5809/5809 5807/5807/5807 5810/5810/5810 -f 5806/5806/5806 5811/5811/5811 5812/5812/5812 -f 5811/5811/5811 5806/5806/5806 5805/5805/5805 -f 5812/5812/5812 5811/5811/5811 5810/5810/5810 -f 5812/5812/5812 5810/5810/5810 5807/5807/5807 -g charts -o chart0000 -s off -f 5804/5804/5804 5805/5805/5805 5806/5806/5806 -f 5805/5805/5805 5804/5804/5804 5807/5807/5807 -f 5805/5805/5805 5807/5807/5807 5808/5808/5808 -f 5808/5808/5808 5807/5807/5807 5809/5809/5809 -f 5809/5809/5809 5807/5807/5807 5810/5810/5810 -f 5806/5806/5806 5811/5811/5811 5812/5812/5812 -f 5811/5811/5811 5806/5806/5806 5805/5805/5805 -f 5812/5812/5812 5811/5811/5811 5810/5810/5810 -f 5812/5812/5812 5810/5810/5810 5807/5807/5807 -v -4341 6320.99 1861.57 -vt 0.166667 0.834707 -v -4341 6305.99 1861.57 -vt 0.166667 0.833883 -v -5226 6305.99 1861.57 -vt 0.159185 0.833883 -v -5226 6320.99 1861.57 -vt 0.159185 0.834707 -o mesh1168 -s off -f 5813/5813/5813 5814/5814/5814 5815/5815/5815 -f 5813/5813/5813 5815/5815/5815 5816/5816/5816 -g charts -o chart0000 -s off -f 5813/5813/5813 5814/5814/5814 5815/5815/5815 -f 5813/5813/5813 5815/5815/5815 5816/5816/5816 -v -5226 6305.99 1861.57 -vt 0.368662 0.599753 -v -4341 6305.99 1861.57 -vt 0.376143 0.599753 -v -4341 6305.99 1887.82 -vt 0.376143 0.599531 -v -4770.37 6305.99 1887.82 -vt 0.372513 0.599531 -v -4770.37 6305.99 2448.45 -vt 0.372513 0.594806 -v -4796.62 6305.99 2448.45 -vt 0.372291 0.594806 -v -5226 6305.99 1861.57 -vt 0.0112219 0.253504 -v -4796.62 6305.99 2448.45 -vt 0.0112219 0.247733 -v -4796.62 6305.99 1887.82 -vt 0.00789692 0.251323 -v -5226 6305.99 1861.57 -vt 0.209061 0.439819 -v -4796.62 6305.99 1887.82 -vt 0.208229 0.435697 -v -5226 6305.99 1887.82 -vt 0.208229 0.439819 -o mesh1169 -s off -f 5817/5817/5817 5818/5818/5818 5819/5819/5819 -f 5817/5817/5817 5819/5819/5819 5820/5820/5820 -f 5817/5817/5817 5820/5820/5820 5821/5821/5821 -f 5817/5817/5817 5821/5821/5821 5822/5822/5822 -f 5823/5823/5823 5824/5824/5824 5825/5825/5825 -f 5826/5826/5826 5827/5827/5827 5828/5828/5828 -g charts -o chart0000 -s off -f 5817/5817/5817 5818/5818/5818 5819/5819/5819 -f 5817/5817/5817 5819/5819/5819 5820/5820/5820 -f 5817/5817/5817 5820/5820/5820 5821/5821/5821 -f 5817/5817/5817 5821/5821/5821 5822/5822/5822 -o chart0001 -s off -f 5823/5823/5823 5824/5824/5824 5825/5825/5825 -o chart0002 -s off -f 5826/5826/5826 5827/5827/5827 5828/5828/5828 -v -5226 6305.99 1887.82 -vt 0.999584 0.190025 -v -4796.62 6305.99 1887.82 -vt 0.999584 0.185903 -v -4796.62 6320.99 1887.82 -vt 0.998753 0.185903 -v -5226 6320.99 1887.82 -vt 0.998753 0.190025 -o mesh1170 -s off -f 5829/5829/5829 5830/5830/5830 5831/5831/5831 -f 5829/5829/5829 5831/5831/5831 5832/5832/5832 -g charts -o chart0000 -s off -f 5829/5829/5829 5830/5830/5830 5831/5831/5831 -f 5829/5829/5829 5831/5831/5831 5832/5832/5832 -v -4341 6320.99 1887.82 -vt 0.487531 0.929627 -v -4341 6320.99 1874.7 -vt 0.487531 0.929514 -v -5226 6320.99 1874.7 -vt 0.48005 0.929514 -v -5226 6320.99 1887.82 -vt 0.48005 0.929627 -v -4796.62 6320.99 1887.82 -vt 0.48368 0.929627 -v -4796.62 6320.99 2448.45 -vt 0.48368 0.93446 -v -4770.37 6320.99 2448.45 -vt 0.483901 0.93446 -v -4341 6320.99 1887.82 -vt 0.783458 0.412613 -v -4770.37 6320.99 2448.45 -vt 0.783458 0.406843 -v -4770.37 6320.99 1887.82 -vt 0.780133 0.41048 -o mesh1171 -s off -f 5833/5833/5833 5834/5834/5834 5835/5835/5835 -f 5833/5833/5833 5835/5835/5835 5836/5836/5836 -f 5833/5833/5833 5836/5836/5836 5837/5837/5837 -f 5833/5833/5833 5837/5837/5837 5838/5838/5838 -f 5833/5833/5833 5838/5838/5838 5839/5839/5839 -f 5840/5840/5840 5841/5841/5841 5842/5842/5842 -g charts -o chart0000 -s off -f 5833/5833/5833 5834/5834/5834 5835/5835/5835 -f 5833/5833/5833 5835/5835/5835 5836/5836/5836 -f 5833/5833/5833 5836/5836/5836 5837/5837/5837 -f 5833/5833/5833 5837/5837/5837 5838/5838/5838 -f 5833/5833/5833 5838/5838/5838 5839/5839/5839 -o chart0001 -s off -f 5840/5840/5840 5841/5841/5841 5842/5842/5842 -v -4341 6320.99 1874.7 -vt 0.868246 0.108409 -v -4341 6320.99 1861.57 -vt 0.867415 0.108409 -v -5226 6320.99 1861.57 -vt 0.867415 0.100989 -v -5226 6320.99 1874.7 -vt 0.868246 0.100989 -o mesh1172 -s off -f 5843/5843/5843 5844/5844/5844 5845/5845/5845 -f 5843/5843/5843 5845/5845/5845 5846/5846/5846 -g charts -o chart0000 -s off -f 5843/5843/5843 5844/5844/5844 5845/5845/5845 -f 5843/5843/5843 5845/5845/5845 5846/5846/5846 -v -4341 6320.99 1887.82 -vt 0.461762 0.869332 -v -4770.37 6320.99 1887.82 -vt 0.461762 0.873454 -v -4770.37 6305.99 1887.82 -vt 0.462593 0.873454 -v -4341 6305.99 1887.82 -vt 0.462593 0.869332 -o mesh1173 -s off -f 5847/5847/5847 5848/5848/5848 5849/5849/5849 -f 5847/5847/5847 5849/5849/5849 5850/5850/5850 -g charts -o chart0000 -s off -f 5847/5847/5847 5848/5848/5848 5849/5849/5849 -f 5847/5847/5847 5849/5849/5849 5850/5850/5850 -v -4770.37 6305.99 1887.82 -vt 0.235661 0.635202 -v -4770.37 6320.99 1887.82 -vt 0.236492 0.635202 -v -4770.37 6320.99 2448.45 -vt 0.236492 0.630256 -v -4770.37 6305.99 2448.45 -vt 0.235661 0.630256 -o mesh1174 -s off -f 5851/5851/5851 5852/5852/5852 5853/5853/5853 -f 5851/5851/5851 5853/5853/5853 5854/5854/5854 -g charts -o chart0000 -s off -f 5851/5851/5851 5852/5852/5852 5853/5853/5853 -f 5851/5851/5851 5853/5853/5853 5854/5854/5854 -v -4796.62 6320.99 1887.82 -vt 0.0644222 0.606348 -v -4796.62 6305.99 1887.82 -vt 0.0644222 0.607172 -v -4796.62 6305.99 2448.45 -vt 0.0594347 0.607172 -v -4796.62 6320.99 2448.45 -vt 0.0594347 0.606348 -o mesh1175 -s off -f 5855/5855/5855 5856/5856/5856 5857/5857/5857 -f 5855/5855/5855 5857/5857/5857 5858/5858/5858 -g charts -o chart0000 -s off -f 5855/5855/5855 5856/5856/5856 5857/5857/5857 -f 5855/5855/5855 5857/5857/5857 5858/5858/5858 -v -2083.5 6380.99 -285.3 -vt 0.575644 0.97568 -v -2046 6380.99 -229.05 -vt 0.576475 0.975995 -v -1003.5 6380.99 -285.3 -vt 0.575644 0.984748 -v -1041 6380.99 -229.05 -vt 0.576475 0.984434 -o mesh1176 -s off -f 5859/5859/5859 5860/5860/5860 5861/5861/5861 -f 5862/5862/5862 5861/5861/5861 5860/5860/5860 -g charts -o chart0000 -s off -f 5859/5859/5859 5860/5860/5860 5861/5861/5861 -f 5862/5862/5862 5861/5861/5861 5860/5860/5860 -v -2046 6380.99 -229.05 -vt 0.991272 0.683468 -v -2083.5 6380.99 -285.3 -vt 0.992103 0.683017 -v -2083.5 6380.99 2594.7 -vt 0.992103 0.7061 -o mesh1177 -s off -f 5863/5863/5863 5864/5864/5864 5865/5865/5865 -g charts -o chart0000 -s off -f 5863/5863/5863 5864/5864/5864 5865/5865/5865 -v -2046 6380.99 -229.05 -vt 0.230673 0.711047 -v -2083.5 6380.99 2594.7 -vt 0.253117 0.711047 -v -2046 6380.99 2538.45 -vt 0.252666 0.710223 -o mesh1178 -s off -f 5866/5866/5866 5867/5867/5867 5868/5868/5868 -g charts -o chart0000 -s off -f 5866/5866/5866 5867/5867/5867 5868/5868/5868 -v -2046 6380.99 2538.45 -vt 0.191922 0.972383 -v -2083.5 6380.99 2594.7 -vt 0.191604 0.973207 -v -1041 6380.99 2538.45 -vt 0.200431 0.972383 -v -1003.5 6380.99 2594.7 -vt 0.200748 0.973207 -o mesh1179 -s off -f 5869/5869/5869 5870/5870/5870 5871/5871/5871 -f 5872/5872/5872 5871/5871/5871 5870/5870/5870 -g charts -o chart0000 -s off -f 5869/5869/5869 5870/5870/5870 5871/5871/5871 -f 5872/5872/5872 5871/5871/5871 5870/5870/5870 -v -1003.5 6380.99 -285.3 -vt 0.322943 0.412613 -v -1041 6380.99 -229.05 -vt 0.322488 0.411789 -v -1003.5 6380.99 2594.7 -vt 0.299668 0.412613 -o mesh1180 -s off -f 5873/5873/5873 5874/5874/5874 5875/5875/5875 -g charts -o chart0000 -s off -f 5873/5873/5873 5874/5874/5874 5875/5875/5875 -v -1003.5 6380.99 2594.7 -vt 0.484206 0.877576 -v -1041 6380.99 -229.05 -vt 0.50665 0.877576 -v -1041 6380.99 2538.45 -vt 0.484657 0.876752 -o mesh1181 -s off -f 5876/5876/5876 5877/5877/5877 5878/5878/5878 -g charts -o chart0000 -s off -f 5876/5876/5876 5877/5877/5877 5878/5878/5878 -v -1003.5 6215.99 -285.3 -vt 0.996259 0.689612 -v -1041 6215.99 -229.05 -vt 0.995428 0.689298 -v -2083.5 6215.99 -285.3 -vt 0.996259 0.680544 -v -2046 6215.99 -229.05 -vt 0.995428 0.680859 -o mesh1182 -s off -f 5879/5879/5879 5880/5880/5880 5881/5881/5881 -f 5882/5882/5882 5881/5881/5881 5880/5880/5880 -g charts -o chart0000 -s off -f 5879/5879/5879 5880/5880/5880 5881/5881/5881 -f 5882/5882/5882 5881/5881/5881 5880/5880/5880 -v -1041 6215.99 -229.05 -vt 0.886157 0.858615 -v -1003.5 6215.99 -285.3 -vt 0.885702 0.859439 -v -1003.5 6215.99 2594.7 -vt 0.908977 0.859439 -o mesh1183 -s off -f 5883/5883/5883 5884/5884/5884 5885/5885/5885 -g charts -o chart0000 -s off -f 5883/5883/5883 5884/5884/5884 5885/5885/5885 -v -1041 6215.99 -229.05 -vt 0.5399 0.819044 -v -1003.5 6215.99 2594.7 -vt 0.562344 0.819044 -v -1041 6215.99 2538.45 -vt 0.561893 0.818219 -o mesh1184 -s off -f 5886/5886/5886 5887/5887/5887 5888/5888/5888 -g charts -o chart0000 -s off -f 5886/5886/5886 5887/5887/5887 5888/5888/5888 -v -1041 6215.99 2538.45 -vt 0.89734 0.324087 -v -1003.5 6215.99 2594.7 -vt 0.896509 0.324402 -v -2046 6215.99 2538.45 -vt 0.89734 0.315649 -v -2083.5 6215.99 2594.7 -vt 0.896509 0.315334 -o mesh1185 -s off -f 5889/5889/5889 5890/5890/5890 5891/5891/5891 -f 5892/5892/5892 5891/5891/5891 5890/5890/5890 -g charts -o chart0000 -s off -f 5889/5889/5889 5890/5890/5890 5891/5891/5891 -f 5892/5892/5892 5891/5891/5891 5890/5890/5890 -v -2083.5 6215.99 -285.3 -vt 0.707814 0.353256 -v -2046 6215.99 -229.05 -vt 0.706983 0.352805 -v -2083.5 6215.99 2594.7 -vt 0.707814 0.330173 -o mesh1186 -s off -f 5893/5893/5893 5894/5894/5894 5895/5895/5895 -g charts -o chart0000 -s off -f 5893/5893/5893 5894/5894/5894 5895/5895/5895 -v -2083.5 6215.99 2594.7 -vt 0.782627 0.999588 -v -2046 6215.99 -229.05 -vt 0.805071 0.999588 -v -2046 6215.99 2538.45 -vt 0.783078 0.998763 -o mesh1187 -s off -f 5896/5896/5896 5897/5897/5897 5898/5898/5898 -g charts -o chart0000 -s off -f 5896/5896/5896 5897/5897/5897 5898/5898/5898 -v -1003.5 6380.99 2594.7 -vt 0.918121 0.408491 -v -2083.5 6380.99 2594.7 -vt 0.927265 0.408491 -v -2083.5 6215.99 2594.7 -vt 0.927265 0.41014 -v -1003.5 6215.99 2594.7 -vt 0.918121 0.41014 -o mesh1188 -s off -f 5899/5899/5899 5900/5900/5900 5901/5901/5901 -f 5899/5899/5899 5901/5901/5901 5902/5902/5902 -g charts -o chart0000 -s off -f 5899/5899/5899 5900/5900/5900 5901/5901/5901 -f 5899/5899/5899 5901/5901/5901 5902/5902/5902 -v -2083.5 6380.99 2594.7 -vt 0.801746 0.92704 -v -2083.5 6380.99 -285.3 -vt 0.825021 0.92704 -v -2083.5 6215.99 -285.3 -vt 0.825021 0.928689 -v -2083.5 6215.99 2594.7 -vt 0.801746 0.928689 -o mesh1189 -s off -f 5903/5903/5903 5904/5904/5904 5905/5905/5905 -f 5903/5903/5903 5905/5905/5905 5906/5906/5906 -g charts -o chart0000 -s off -f 5903/5903/5903 5904/5904/5904 5905/5905/5905 -f 5903/5903/5903 5905/5905/5905 5906/5906/5906 -v -2083.5 6380.99 -285.3 -vt 0.655445 0.854493 -v -1003.5 6380.99 -285.3 -vt 0.655445 0.845425 -v -1003.5 6215.99 -285.3 -vt 0.653782 0.845425 -v -2083.5 6215.99 -285.3 -vt 0.653782 0.854493 -o mesh1190 -s off -f 5907/5907/5907 5908/5908/5908 5909/5909/5909 -f 5907/5907/5907 5909/5909/5909 5910/5910/5910 -g charts -o chart0000 -s off -f 5907/5907/5907 5908/5908/5908 5909/5909/5909 -f 5907/5907/5907 5909/5909/5909 5910/5910/5910 -v -1003.5 6380.99 -285.3 -vt 0.675395 0.936933 -v -1003.5 6380.99 2594.7 -vt 0.675395 0.91385 -v -1003.5 6215.99 2594.7 -vt 0.673732 0.91385 -v -1003.5 6215.99 -285.3 -vt 0.673732 0.936933 -o mesh1191 -s off -f 5911/5911/5911 5912/5912/5912 5913/5913/5913 -f 5911/5911/5911 5913/5913/5913 5914/5914/5914 -g charts -o chart0000 -s off -f 5911/5911/5911 5912/5912/5912 5913/5913/5913 -f 5911/5911/5911 5913/5913/5913 5914/5914/5914 -v -1041 6215.99 -229.05 -vt 0.879884 0.151278 -v -1041 6260.99 -229.05 -vt 0.87943 0.151278 -v -2046 6260.99 -229.05 -vt 0.87943 0.143034 -v -2046 6215.99 -229.05 -vt 0.879884 0.143034 -v -1041 6380.99 -229.05 -vt 0.878221 0.151278 -v -2046 6380.99 -229.05 -vt 0.878221 0.143034 -o mesh1192 -s off -f 5915/5915/5915 5916/5916/5916 5917/5917/5917 -f 5915/5915/5915 5917/5917/5917 5918/5918/5918 -f 5919/5919/5919 5920/5920/5920 5917/5917/5917 -f 5919/5919/5919 5917/5917/5917 5916/5916/5916 -g charts -o chart0000 -s off -f 5915/5915/5915 5916/5916/5916 5917/5917/5917 -f 5915/5915/5915 5917/5917/5917 5918/5918/5918 -f 5919/5919/5919 5920/5920/5920 5917/5917/5917 -f 5919/5919/5919 5917/5917/5917 5916/5916/5916 -v -2046 6215.99 -229.05 -vt 0.0394846 0.476917 -v -2046 6260.99 -229.05 -vt 0.039938 0.476917 -v -2046 6260.99 2538.45 -vt 0.039938 0.454658 -v -2046 6215.99 2538.45 -vt 0.0394846 0.454658 -v -2046 6380.99 -229.05 -vt 0.041147 0.476917 -v -2046 6380.99 2538.45 -vt 0.041147 0.454658 -o mesh1193 -s off -f 5921/5921/5921 5922/5922/5922 5923/5923/5923 -f 5921/5921/5921 5923/5923/5923 5924/5924/5924 -f 5925/5925/5925 5926/5926/5926 5923/5923/5923 -f 5925/5925/5925 5923/5923/5923 5922/5922/5922 -g charts -o chart0000 -s off -f 5921/5921/5921 5922/5922/5922 5923/5923/5923 -f 5921/5921/5921 5923/5923/5923 5924/5924/5924 -f 5925/5925/5925 5926/5926/5926 5923/5923/5923 -f 5925/5925/5925 5923/5923/5923 5922/5922/5922 -v -2046 6215.99 2538.45 -vt 0.233998 0.506595 -v -2046 6260.99 2538.45 -vt 0.234452 0.506595 -v -1041 6260.99 2538.45 -vt 0.234452 0.498351 -v -1041 6215.99 2538.45 -vt 0.233998 0.498351 -v -2046 6380.99 2538.45 -vt 0.235661 0.506595 -v -1041 6380.99 2538.45 -vt 0.235661 0.498351 -o mesh1194 -s off -f 5927/5927/5927 5928/5928/5928 5929/5929/5929 -f 5927/5927/5927 5929/5929/5929 5930/5930/5930 -f 5931/5931/5931 5932/5932/5932 5929/5929/5929 -f 5931/5931/5931 5929/5929/5929 5928/5928/5928 -g charts -o chart0000 -s off -f 5927/5927/5927 5928/5928/5928 5929/5929/5929 -f 5927/5927/5927 5929/5929/5929 5930/5930/5930 -f 5931/5931/5931 5932/5932/5932 5929/5929/5929 -f 5931/5931/5931 5929/5929/5929 5928/5928/5928 -v -1041 6215.99 2538.45 -vt 0.195761 0.763809 -v -1041 6260.99 2538.45 -vt 0.195761 0.763359 -v -1041 6260.99 -229.05 -vt 0.173317 0.763359 -v -1041 6215.99 -229.05 -vt 0.173317 0.763809 -v -1041 6380.99 2538.45 -vt 0.195761 0.76216 -v -1041 6380.99 -229.05 -vt 0.173317 0.76216 -o mesh1195 -s off -f 5933/5933/5933 5934/5934/5934 5935/5935/5935 -f 5933/5933/5933 5935/5935/5935 5936/5936/5936 -f 5937/5937/5937 5938/5938/5938 5935/5935/5935 -f 5937/5937/5937 5935/5935/5935 5934/5934/5934 -g charts -o chart0000 -s off -f 5933/5933/5933 5934/5934/5934 5935/5935/5935 -f 5933/5933/5933 5935/5935/5935 5936/5936/5936 -f 5937/5937/5937 5938/5938/5938 5935/5935/5935 -f 5937/5937/5937 5935/5935/5935 5934/5934/5934 -v -1041 6260.99 -229.05 -vt 0.652951 0.862737 -v -1101 6260.99 -139.05 -vt 0.65212 0.862245 -v -2046 6260.99 -229.05 -vt 0.652951 0.854493 -v -1986 6260.99 -139.05 -vt 0.65212 0.854985 -o mesh1196 -s off -f 5939/5939/5939 5940/5940/5940 5941/5941/5941 -f 5942/5942/5942 5941/5941/5941 5940/5940/5940 -g charts -o chart0000 -s off -f 5939/5939/5939 5940/5940/5940 5941/5941/5941 -f 5942/5942/5942 5941/5941/5941 5940/5940/5940 -v -1101 6260.99 -139.05 -vt 0.370223 0.30709 -v -1041 6260.99 -229.05 -vt 0.369493 0.307914 -v -1041 6260.99 2538.45 -vt 0.391937 0.307914 -o mesh1197 -s off -f 5943/5943/5943 5944/5944/5944 5945/5945/5945 -g charts -o chart0000 -s off -f 5943/5943/5943 5944/5944/5944 5945/5945/5945 -v -1101 6260.99 -139.05 -vt 0.885702 0.688788 -v -1041 6260.99 2538.45 -vt 0.885702 0.710222 -v -1101 6260.99 2448.45 -vt 0.884871 0.709492 -o mesh1198 -s off -f 5946/5946/5946 5947/5947/5947 5948/5948/5948 -g charts -o chart0000 -s off -f 5946/5946/5946 5947/5947/5947 5948/5948/5948 -v -1101 6260.99 2448.45 -vt 0.647132 0.390687 -v -1041 6260.99 2538.45 -vt 0.646301 0.391179 -v -1986 6260.99 2448.45 -vt 0.647132 0.383427 -v -2046 6260.99 2538.45 -vt 0.646301 0.382935 -o mesh1199 -s off -f 5949/5949/5949 5950/5950/5950 5951/5951/5951 -f 5952/5952/5952 5951/5951/5951 5950/5950/5950 -g charts -o chart0000 -s off -f 5949/5949/5949 5950/5950/5950 5951/5951/5951 -f 5952/5952/5952 5951/5951/5951 5950/5950/5950 -v -2046 6260.99 -229.05 -vt 0.874896 0.457955 -v -1986 6260.99 -139.05 -vt 0.874065 0.457232 -v -2046 6260.99 2538.45 -vt 0.874896 0.435697 -o mesh1200 -s off -f 5953/5953/5953 5954/5954/5954 5955/5955/5955 -g charts -o chart0000 -s off -f 5953/5953/5953 5954/5954/5954 5955/5955/5955 -v -2046 6260.99 2538.45 -vt 0.644638 0.537922 -v -1986 6260.99 -139.05 -vt 0.666251 0.537922 -v -1986 6260.99 2448.45 -vt 0.645375 0.537098 -o mesh1201 -s off -f 5956/5956/5956 5957/5957/5957 5958/5958/5958 -g charts -o chart0000 -s off -f 5956/5956/5956 5957/5957/5957 5958/5958/5958 -v -1986 6380.99 2448.45 -vt 0.93724 0.302968 -v -1556.62 6320.99 2448.45 -vt 0.938071 0.299368 -v -1986 6260.99 2448.45 -vt 0.938903 0.302968 -v -1101 6380.99 2448.45 -vt 0.93724 0.295548 -v -1530.37 6320.99 2448.45 -vt 0.938071 0.299148 -v -1530.37 6305.99 2448.45 -vt 0.938279 0.299148 -v -1556.62 6305.99 2448.45 -vt 0.938279 0.299368 -v -1101 6260.99 2448.45 -vt 0.938903 0.295548 -o mesh1202 -s off -f 5959/5959/5959 5960/5960/5960 5961/5961/5961 -f 5960/5960/5960 5959/5959/5959 5962/5962/5962 -f 5960/5960/5960 5962/5962/5962 5963/5963/5963 -f 5963/5963/5963 5962/5962/5962 5964/5964/5964 -f 5961/5961/5961 5965/5965/5965 5966/5966/5966 -f 5965/5965/5965 5961/5961/5961 5960/5960/5960 -f 5966/5966/5966 5965/5965/5965 5964/5964/5964 -f 5966/5966/5966 5964/5964/5964 5962/5962/5962 -g charts -o chart0000 -s off -f 5959/5959/5959 5960/5960/5960 5961/5961/5961 -f 5960/5960/5960 5959/5959/5959 5962/5962/5962 -f 5960/5960/5960 5962/5962/5962 5963/5963/5963 -f 5963/5963/5963 5962/5962/5962 5964/5964/5964 -f 5961/5961/5961 5965/5965/5965 5966/5966/5966 -f 5965/5965/5965 5961/5961/5961 5960/5960/5960 -f 5966/5966/5966 5965/5965/5965 5964/5964/5964 -f 5966/5966/5966 5964/5964/5964 5962/5962/5962 -v -1101 6380.99 -139.05 -vt 0.441812 0.151278 -v -1986 6380.99 -139.05 -vt 0.449293 0.151278 -v -1986 6260.99 -139.05 -vt 0.449293 0.152927 -v -1101 6260.99 -139.05 -vt 0.441812 0.152927 -o mesh1203 -s off -f 5967/5967/5967 5968/5968/5968 5969/5969/5969 -f 5967/5967/5967 5969/5969/5969 5970/5970/5970 -g charts -o chart0000 -s off -f 5967/5967/5967 5968/5968/5968 5969/5969/5969 -f 5967/5967/5967 5969/5969/5969 5970/5970/5970 -v -1986 6380.99 -139.05 -vt 0.24813 0.611294 -v -1986 6260.99 2448.45 -vt 0.249792 0.631904 -v -1986 6260.99 -139.05 -vt 0.249792 0.611294 -v -1986 6305.99 1861.57 -vt 0.249169 0.62723 -v -1986 6320.99 1861.57 -vt 0.248961 0.62723 -v -1986 6320.99 1874.7 -vt 0.248961 0.627334 -v -1986 6320.99 1887.82 -vt 0.248961 0.627439 -v -1986 6305.99 1887.82 -vt 0.249169 0.627439 -v -1986 6380.99 2448.45 -vt 0.24813 0.631904 -o mesh1204 -s off -f 5971/5971/5971 5972/5972/5972 5973/5973/5973 -f 5972/5972/5972 5971/5971/5971 5974/5974/5974 -f 5974/5974/5974 5971/5971/5971 5975/5975/5975 -f 5975/5975/5975 5971/5971/5971 5976/5976/5976 -f 5976/5976/5976 5971/5971/5971 5977/5977/5977 -f 5972/5972/5972 5978/5978/5978 5979/5979/5979 -f 5978/5978/5978 5972/5972/5972 5974/5974/5974 -f 5979/5979/5979 5978/5978/5978 5977/5977/5977 -f 5979/5979/5979 5977/5977/5977 5971/5971/5971 -g charts -o chart0000 -s off -f 5971/5971/5971 5972/5972/5972 5973/5973/5973 -f 5972/5972/5972 5971/5971/5971 5974/5974/5974 -f 5974/5974/5974 5971/5971/5971 5975/5975/5975 -f 5975/5975/5975 5971/5971/5971 5976/5976/5976 -f 5976/5976/5976 5971/5971/5971 5977/5977/5977 -f 5972/5972/5972 5978/5978/5978 5979/5979/5979 -f 5978/5978/5978 5972/5972/5972 5974/5974/5974 -f 5979/5979/5979 5978/5978/5978 5977/5977/5977 -f 5979/5979/5979 5977/5977/5977 5971/5971/5971 -v -1101 6260.99 2448.45 -vt 0.585619 0.886645 -v -1101 6305.99 1887.82 -vt 0.581117 0.886026 -v -1101 6260.99 -139.05 -vt 0.564838 0.886645 -v -1101 6380.99 2448.45 -vt 0.585619 0.884996 -v -1101 6320.99 1887.82 -vt 0.581117 0.88582 -v -1101 6320.99 1874.7 -vt 0.581011 0.88582 -v -1101 6320.99 1861.57 -vt 0.580906 0.88582 -v -1101 6305.99 1861.57 -vt 0.580906 0.886026 -v -1101 6380.99 -139.05 -vt 0.564838 0.884996 -o mesh1205 -s off -f 5980/5980/5980 5981/5981/5981 5982/5982/5982 -f 5981/5981/5981 5980/5980/5980 5983/5983/5983 -f 5981/5981/5981 5983/5983/5983 5984/5984/5984 -f 5984/5984/5984 5983/5983/5983 5985/5985/5985 -f 5985/5985/5985 5983/5983/5983 5986/5986/5986 -f 5982/5982/5982 5987/5987/5987 5988/5988/5988 -f 5987/5987/5987 5982/5982/5982 5981/5981/5981 -f 5988/5988/5988 5987/5987/5987 5986/5986/5986 -f 5988/5988/5988 5986/5986/5986 5983/5983/5983 -g charts -o chart0000 -s off -f 5980/5980/5980 5981/5981/5981 5982/5982/5982 -f 5981/5981/5981 5980/5980/5980 5983/5983/5983 -f 5981/5981/5981 5983/5983/5983 5984/5984/5984 -f 5984/5984/5984 5983/5983/5983 5985/5985/5985 -f 5985/5985/5985 5983/5983/5983 5986/5986/5986 -f 5982/5982/5982 5987/5987/5987 5988/5988/5988 -f 5987/5987/5987 5982/5982/5982 5981/5981/5981 -f 5988/5988/5988 5987/5987/5987 5986/5986/5986 -f 5988/5988/5988 5986/5986/5986 5983/5983/5983 -v -1101 6320.99 1861.57 -vt 0.297174 0.415086 -v -1101 6305.99 1861.57 -vt 0.297174 0.414262 -v -1986 6305.99 1861.57 -vt 0.289692 0.414262 -v -1986 6320.99 1861.57 -vt 0.289692 0.415086 -o mesh1206 -s off -f 5989/5989/5989 5990/5990/5990 5991/5991/5991 -f 5989/5989/5989 5991/5991/5991 5992/5992/5992 -g charts -o chart0000 -s off -f 5989/5989/5989 5990/5990/5990 5991/5991/5991 -f 5989/5989/5989 5991/5991/5991 5992/5992/5992 -v -1986 6305.99 1861.57 -vt 0.217373 0.676422 -v -1101 6305.99 1861.57 -vt 0.224854 0.676422 -v -1101 6305.99 1887.82 -vt 0.224854 0.676201 -v -1530.37 6305.99 1887.82 -vt 0.221225 0.676201 -v -1530.37 6305.99 2448.45 -vt 0.221225 0.671476 -v -1556.62 6305.99 2448.45 -vt 0.221003 0.671476 -v -1986 6305.99 1861.57 -vt 0.257273 0.89324 -v -1556.62 6305.99 2448.45 -vt 0.257273 0.887469 -v -1556.62 6305.99 1887.82 -vt 0.253948 0.89106 -v -1986 6305.99 1861.57 -vt 0.967997 0.0696618 -v -1556.62 6305.99 1887.82 -vt 0.972153 0.0696619 -v -1986 6305.99 1887.82 -vt 0.968012 0.0688376 -o mesh1207 -s off -f 5993/5993/5993 5994/5994/5994 5995/5995/5995 -f 5993/5993/5993 5995/5995/5995 5996/5996/5996 -f 5993/5993/5993 5996/5996/5996 5997/5997/5997 -f 5993/5993/5993 5997/5997/5997 5998/5998/5998 -f 5999/5999/5999 6000/6000/6000 6001/6001/6001 -f 6002/6002/6002 6003/6003/6003 6004/6004/6004 -g charts -o chart0000 -s off -f 5993/5993/5993 5994/5994/5994 5995/5995/5995 -f 5993/5993/5993 5995/5995/5995 5996/5996/5996 -f 5993/5993/5993 5996/5996/5996 5997/5997/5997 -f 5993/5993/5993 5997/5997/5997 5998/5998/5998 -o chart0001 -s off -f 5999/5999/5999 6000/6000/6000 6001/6001/6001 -o chart0002 -s off -f 6002/6002/6002 6003/6003/6003 6004/6004/6004 -v -1986 6305.99 1887.82 -vt 0.997922 0.691261 -v -1556.62 6305.99 1887.82 -vt 0.997922 0.687139 -v -1556.62 6320.99 1887.82 -vt 0.997091 0.687139 -v -1986 6320.99 1887.82 -vt 0.997091 0.691261 -o mesh1208 -s off -f 6005/6005/6005 6006/6006/6006 6007/6007/6007 -f 6005/6005/6005 6007/6007/6007 6008/6008/6008 -g charts -o chart0000 -s off -f 6005/6005/6005 6006/6006/6006 6007/6007/6007 -f 6005/6005/6005 6007/6007/6007 6008/6008/6008 -v -1101 6320.99 1887.82 -vt 0.911471 0.697145 -v -1101 6320.99 1874.7 -vt 0.911471 0.697032 -v -1986 6320.99 1874.7 -vt 0.90399 0.697032 -v -1986 6320.99 1887.82 -vt 0.90399 0.697145 -v -1556.62 6320.99 1887.82 -vt 0.90762 0.697145 -v -1556.62 6320.99 2448.45 -vt 0.90762 0.701978 -v -1530.37 6320.99 2448.45 -vt 0.907842 0.701978 -v -1101 6320.99 1887.82 -vt 0.168329 0.61047 -v -1530.37 6320.99 2448.45 -vt 0.16251 0.61047 -v -1530.37 6320.99 1887.82 -vt 0.166178 0.607172 -o mesh1209 -s off -f 6009/6009/6009 6010/6010/6010 6011/6011/6011 -f 6009/6009/6009 6011/6011/6011 6012/6012/6012 -f 6009/6009/6009 6012/6012/6012 6013/6013/6013 -f 6009/6009/6009 6013/6013/6013 6014/6014/6014 -f 6009/6009/6009 6014/6014/6014 6015/6015/6015 -f 6016/6016/6016 6017/6017/6017 6018/6018/6018 -g charts -o chart0000 -s off -f 6009/6009/6009 6010/6010/6010 6011/6011/6011 -f 6009/6009/6009 6011/6011/6011 6012/6012/6012 -f 6009/6009/6009 6012/6012/6012 6013/6013/6013 -f 6009/6009/6009 6013/6013/6013 6014/6014/6014 -f 6009/6009/6009 6014/6014/6014 6015/6015/6015 -o chart0001 -s off -f 6016/6016/6016 6017/6017/6017 6018/6018/6018 -v -1101 6320.99 1874.7 -vt 0.689526 0.524732 -v -1101 6320.99 1861.57 -vt 0.689526 0.523908 -v -1986 6320.99 1861.57 -vt 0.682045 0.523908 -v -1986 6320.99 1874.7 -vt 0.682045 0.524732 -o mesh1210 -s off -f 6019/6019/6019 6020/6020/6020 6021/6021/6021 -f 6019/6019/6019 6021/6021/6021 6022/6022/6022 -g charts -o chart0000 -s off -f 6019/6019/6019 6020/6020/6020 6021/6021/6021 -f 6019/6019/6019 6021/6021/6021 6022/6022/6022 -v -1101 6320.99 1887.82 -vt 0.821696 0.952597 -v -1530.37 6320.99 1887.82 -vt 0.821696 0.956719 -v -1530.37 6305.99 1887.82 -vt 0.822527 0.956719 -v -1101 6305.99 1887.82 -vt 0.822527 0.952597 -o mesh1211 -s off -f 6023/6023/6023 6024/6024/6024 6025/6025/6025 -f 6023/6023/6023 6025/6025/6025 6026/6026/6026 -g charts -o chart0000 -s off -f 6023/6023/6023 6024/6024/6024 6025/6025/6025 -f 6023/6023/6023 6025/6025/6025 6026/6026/6026 -v -1530.37 6305.99 1887.82 -vt 0.672901 0.632729 -v -1530.37 6320.99 1887.82 -vt 0.673732 0.632729 -v -1530.37 6320.99 2448.45 -vt 0.673732 0.627782 -v -1530.37 6305.99 2448.45 -vt 0.672901 0.627782 -o mesh1212 -s off -f 6027/6027/6027 6028/6028/6028 6029/6029/6029 -f 6027/6027/6027 6029/6029/6029 6030/6030/6030 -g charts -o chart0000 -s off -f 6027/6027/6027 6028/6028/6028 6029/6029/6029 -f 6027/6027/6027 6029/6029/6029 6030/6030/6030 -v -1556.62 6320.99 1887.82 -vt 0.0860349 0.504946 -v -1556.62 6305.99 1887.82 -vt 0.0868661 0.504946 -v -1556.62 6305.99 2448.45 -vt 0.0868661 0.5 -v -1556.62 6320.99 2448.45 -vt 0.0860349 0.5 -o mesh1213 -s off -f 6031/6031/6031 6032/6032/6032 6033/6033/6033 -f 6031/6031/6031 6033/6033/6033 6034/6034/6034 -g charts -o chart0000 -s off -f 6031/6031/6031 6032/6032/6032 6033/6033/6033 -f 6031/6031/6031 6033/6033/6033 6034/6034/6034 -v 6186.5 6380.99 -285.3 -vt 0.982959 0.658285 -v 6224 6380.99 -229.05 -vt 0.983277 0.65911 -v 7266.5 6380.99 -285.3 -vt 0.992103 0.658285 -v 7229 6380.99 -229.05 -vt 0.991785 0.65911 -o mesh1214 -s off -f 6035/6035/6035 6036/6036/6036 6037/6037/6037 -f 6038/6038/6038 6037/6037/6037 6036/6036/6036 -g charts -o chart0000 -s off -f 6035/6035/6035 6036/6036/6036 6037/6037/6037 -f 6038/6038/6038 6037/6037/6037 6036/6036/6036 -v 6224 6380.99 -229.05 -vt 0.545342 0.551937 -v 6186.5 6380.99 -285.3 -vt 0.544888 0.552762 -v 6186.5 6380.99 2594.7 -vt 0.568163 0.552762 -o mesh1215 -s off -f 6039/6039/6039 6040/6040/6040 6041/6041/6041 -g charts -o chart0000 -s off -f 6039/6039/6039 6040/6040/6040 6041/6041/6041 -v 6224 6380.99 -229.05 -vt 0.644638 0.753092 -v 6186.5 6380.99 2594.7 -vt 0.644638 0.77535 -v 6224 6380.99 2538.45 -vt 0.643807 0.774903 -o mesh1216 -s off -f 6042/6042/6042 6043/6043/6043 6044/6044/6044 -g charts -o chart0000 -s off -f 6042/6042/6042 6043/6043/6043 6044/6044/6044 -v 6224 6380.99 2538.45 -vt 0.961664 0.961665 -v 6186.5 6380.99 2594.7 -vt 0.961347 0.96249 -v 7229 6380.99 2538.45 -vt 0.970173 0.961665 -v 7266.5 6380.99 2594.7 -vt 0.97049 0.96249 -o mesh1217 -s off -f 6045/6045/6045 6046/6046/6046 6047/6047/6047 -f 6048/6048/6048 6047/6047/6047 6046/6046/6046 -g charts -o chart0000 -s off -f 6045/6045/6045 6046/6046/6046 6047/6047/6047 -f 6048/6048/6048 6047/6047/6047 6046/6046/6046 -v 7266.5 6380.99 -285.3 -vt 0.805902 0.750618 -v 7229 6380.99 -229.05 -vt 0.805071 0.750167 -v 7266.5 6380.99 2594.7 -vt 0.805902 0.727535 -o mesh1218 -s off -f 6049/6049/6049 6050/6050/6050 6051/6051/6051 -g charts -o chart0000 -s off -f 6049/6049/6049 6050/6050/6050 6051/6051/6051 -v 7266.5 6380.99 2594.7 -vt 0.465919 0.817395 -v 7229 6380.99 -229.05 -vt 0.488362 0.817395 -v 7229 6380.99 2538.45 -vt 0.46637 0.81657 -o mesh1219 -s off -f 6052/6052/6052 6053/6053/6053 6054/6054/6054 -g charts -o chart0000 -s off -f 6052/6052/6052 6053/6053/6053 6054/6054/6054 -v 7266.5 6215.99 -285.3 -vt 0.445137 0.600577 -v 7229 6215.99 -229.05 -vt 0.44482 0.599753 -v 6186.5 6215.99 -285.3 -vt 0.435993 0.600577 -v 6224 6215.99 -229.05 -vt 0.436311 0.599753 -o mesh1220 -s off -f 6055/6055/6055 6056/6056/6056 6057/6057/6057 -f 6058/6058/6058 6057/6057/6057 6056/6056/6056 -g charts -o chart0000 -s off -f 6055/6055/6055 6056/6056/6056 6057/6057/6057 -f 6058/6058/6058 6057/6057/6057 6056/6056/6056 -v 7229 6215.99 -229.05 -vt 0.719906 0.748145 -v 7266.5 6215.99 -285.3 -vt 0.719451 0.748969 -v 7266.5 6215.99 2594.7 -vt 0.742726 0.748969 -o mesh1221 -s off -f 6059/6059/6059 6060/6060/6060 6061/6061/6061 -g charts -o chart0000 -s off -f 6059/6059/6059 6060/6060/6060 6061/6061/6061 -v 7229 6215.99 -229.05 -vt 0.719451 0.973207 -v 7266.5 6215.99 2594.7 -vt 0.719451 0.995466 -v 7229 6215.99 2538.45 -vt 0.71862 0.995019 -o mesh1222 -s off -f 6062/6062/6062 6063/6063/6063 6064/6064/6064 -g charts -o chart0000 -s off -f 6062/6062/6062 6063/6063/6063 6064/6064/6064 -v 7229 6215.99 2538.45 -vt 0.0557922 0.969909 -v 7266.5 6215.99 2594.7 -vt 0.0561096 0.969085 -v 6224 6215.99 2538.45 -vt 0.0472833 0.969909 -v 6186.5 6215.99 2594.7 -vt 0.0469659 0.969085 -o mesh1223 -s off -f 6065/6065/6065 6066/6066/6066 6067/6067/6067 -f 6068/6068/6068 6067/6067/6067 6066/6066/6066 -g charts -o chart0000 -s off -f 6065/6065/6065 6066/6066/6066 6067/6067/6067 -f 6068/6068/6068 6067/6067/6067 6066/6066/6066 -v 6186.5 6215.99 -285.3 -vt 0.860765 0.784419 -v 6224 6215.99 -229.05 -vt 0.86031 0.783594 -v 6186.5 6215.99 2594.7 -vt 0.83749 0.784419 -o mesh1224 -s off -f 6069/6069/6069 6070/6070/6070 6071/6071/6071 -g charts -o chart0000 -s off -f 6069/6069/6069 6070/6070/6070 6071/6071/6071 -v 6186.5 6215.99 2594.7 -vt 0.115129 0.34831 -v 6224 6215.99 -229.05 -vt 0.137573 0.34831 -v 6224 6215.99 2538.45 -vt 0.11558 0.347486 -o mesh1225 -s off -f 6072/6072/6072 6073/6073/6073 6074/6074/6074 -g charts -o chart0000 -s off -f 6072/6072/6072 6073/6073/6073 6074/6074/6074 -v 7266.5 6380.99 2594.7 -vt 0.641313 0.809975 -v 6186.5 6380.99 2594.7 -vt 0.641313 0.819044 -v 6186.5 6215.99 2594.7 -vt 0.642976 0.819044 -v 7266.5 6215.99 2594.7 -vt 0.642976 0.809975 -o mesh1226 -s off -f 6075/6075/6075 6076/6076/6076 6077/6077/6077 -f 6075/6075/6075 6077/6077/6077 6078/6078/6078 -g charts -o chart0000 -s off -f 6075/6075/6075 6076/6076/6076 6077/6077/6077 -f 6075/6075/6075 6077/6077/6077 6078/6078/6078 -v 6186.5 6380.99 2594.7 -vt 0.436825 0.334295 -v 6186.5 6380.99 -285.3 -vt 0.4601 0.334295 -v 6186.5 6215.99 -285.3 -vt 0.4601 0.335944 -v 6186.5 6215.99 2594.7 -vt 0.436825 0.335944 -o mesh1227 -s off -f 6079/6079/6079 6080/6080/6080 6081/6081/6081 -f 6079/6079/6079 6081/6081/6081 6082/6082/6082 -g charts -o chart0000 -s off -f 6079/6079/6079 6080/6080/6080 6081/6081/6081 -f 6079/6079/6079 6081/6081/6081 6082/6082/6082 -v 6186.5 6380.99 -285.3 -vt 0.732751 0.898186 -v 7266.5 6380.99 -285.3 -vt 0.732751 0.889118 -v 7266.5 6215.99 -285.3 -vt 0.731089 0.889118 -v 6186.5 6215.99 -285.3 -vt 0.731089 0.898186 -o mesh1228 -s off -f 6083/6083/6083 6084/6084/6084 6085/6085/6085 -f 6083/6083/6083 6085/6085/6085 6086/6086/6086 -g charts -o chart0000 -s off -f 6083/6083/6083 6084/6084/6084 6085/6085/6085 -f 6083/6083/6083 6085/6085/6085 6086/6086/6086 -v 7266.5 6380.99 -285.3 -vt 0.820033 0.970734 -v 7266.5 6380.99 2594.7 -vt 0.796758 0.970734 -v 7266.5 6215.99 2594.7 -vt 0.796758 0.969085 -v 7266.5 6215.99 -285.3 -vt 0.820033 0.969085 -o mesh1229 -s off -f 6087/6087/6087 6088/6088/6088 6089/6089/6089 -f 6087/6087/6087 6089/6089/6089 6090/6090/6090 -g charts -o chart0000 -s off -f 6087/6087/6087 6088/6088/6088 6089/6089/6089 -f 6087/6087/6087 6089/6089/6089 6090/6090/6090 -v 7229 6215.99 -229.05 -vt 0.868246 0.12737 -v 7229 6260.99 -229.05 -vt 0.867793 0.12737 -v 6224 6260.99 -229.05 -vt 0.867793 0.119126 -v 6224 6215.99 -229.05 -vt 0.868246 0.119126 -v 7229 6380.99 -229.05 -vt 0.866584 0.12737 -v 6224 6380.99 -229.05 -vt 0.866584 0.119126 -o mesh1230 -s off -f 6091/6091/6091 6092/6092/6092 6093/6093/6093 -f 6091/6091/6091 6093/6093/6093 6094/6094/6094 -f 6095/6095/6095 6096/6096/6096 6093/6093/6093 -f 6095/6095/6095 6093/6093/6093 6092/6092/6092 -g charts -o chart0000 -s off -f 6091/6091/6091 6092/6092/6092 6093/6093/6093 -f 6091/6091/6091 6093/6093/6093 6094/6094/6094 -f 6095/6095/6095 6096/6096/6096 6093/6093/6093 -f 6095/6095/6095 6093/6093/6093 6092/6092/6092 -v 6224 6215.99 -229.05 -vt 0.634663 0.347486 -v 6224 6260.99 -229.05 -vt 0.634663 0.347935 -v 6224 6260.99 2538.45 -vt 0.612219 0.347935 -v 6224 6215.99 2538.45 -vt 0.612219 0.347486 -v 6224 6380.99 -229.05 -vt 0.634663 0.349134 -v 6224 6380.99 2538.45 -vt 0.612219 0.349134 -o mesh1231 -s off -f 6097/6097/6097 6098/6098/6098 6099/6099/6099 -f 6097/6097/6097 6099/6099/6099 6100/6100/6100 -f 6101/6101/6101 6102/6102/6102 6099/6099/6099 -f 6101/6101/6101 6099/6099/6099 6098/6098/6098 -g charts -o chart0000 -s off -f 6097/6097/6097 6098/6098/6098 6099/6099/6099 -f 6097/6097/6097 6099/6099/6099 6100/6100/6100 -f 6101/6101/6101 6102/6102/6102 6099/6099/6099 -f 6101/6101/6101 6099/6099/6099 6098/6098/6098 -v 6224 6215.99 2538.45 -vt 0.942228 0.961665 -v 6224 6260.99 2538.45 -vt 0.942228 0.962115 -v 7229 6260.99 2538.45 -vt 0.933915 0.962115 -v 7229 6215.99 2538.45 -vt 0.933915 0.961665 -v 6224 6380.99 2538.45 -vt 0.942228 0.963314 -v 7229 6380.99 2538.45 -vt 0.933915 0.963314 -o mesh1232 -s off -f 6103/6103/6103 6104/6104/6104 6105/6105/6105 -f 6103/6103/6103 6105/6105/6105 6106/6106/6106 -f 6107/6107/6107 6108/6108/6108 6105/6105/6105 -f 6107/6107/6107 6105/6105/6105 6104/6104/6104 -g charts -o chart0000 -s off -f 6103/6103/6103 6104/6104/6104 6105/6105/6105 -f 6103/6103/6103 6105/6105/6105 6106/6106/6106 -f 6107/6107/6107 6108/6108/6108 6105/6105/6105 -f 6107/6107/6107 6105/6105/6105 6104/6104/6104 -v 7229 6215.99 2538.45 -vt 0.331255 0.95507 -v 7229 6260.99 2538.45 -vt 0.330802 0.95507 -v 7229 6260.99 -229.05 -vt 0.330802 0.932811 -v 7229 6215.99 -229.05 -vt 0.331255 0.932811 -v 7229 6380.99 2538.45 -vt 0.329593 0.95507 -v 7229 6380.99 -229.05 -vt 0.329593 0.932811 -o mesh1233 -s off -f 6109/6109/6109 6110/6110/6110 6111/6111/6111 -f 6109/6109/6109 6111/6111/6111 6112/6112/6112 -f 6113/6113/6113 6114/6114/6114 6111/6111/6111 -f 6113/6113/6113 6111/6111/6111 6110/6110/6110 -g charts -o chart0000 -s off -f 6109/6109/6109 6110/6110/6110 6111/6111/6111 -f 6109/6109/6109 6111/6111/6111 6112/6112/6112 -f 6113/6113/6113 6114/6114/6114 6111/6111/6111 -f 6113/6113/6113 6111/6111/6111 6110/6110/6110 -v 7229 6260.99 -229.05 -vt 0.24813 0.640973 -v 7169 6260.99 -139.05 -vt 0.247633 0.640148 -v 6224 6260.99 -229.05 -vt 0.239817 0.640973 -v 6284 6260.99 -139.05 -vt 0.240313 0.640148 -o mesh1234 -s off -f 6115/6115/6115 6116/6116/6116 6117/6117/6117 -f 6118/6118/6118 6117/6117/6117 6116/6116/6116 -g charts -o chart0000 -s off -f 6115/6115/6115 6116/6116/6116 6117/6117/6117 -f 6118/6118/6118 6117/6117/6117 6116/6116/6116 -v 7169 6260.99 -139.05 -vt 0.00290939 0.231144 -v 7229 6260.99 -229.05 -vt 0.00374057 0.23042 -v 7229 6260.99 2538.45 -vt 0.00374057 0.252679 -o mesh1235 -s off -f 6119/6119/6119 6120/6120/6120 6121/6121/6121 -g charts -o chart0000 -s off -f 6119/6119/6119 6120/6120/6120 6121/6121/6121 -v 7169 6260.99 -139.05 -vt 0.64547 0.325227 -v 7229 6260.99 2538.45 -vt 0.64547 0.346661 -v 7169 6260.99 2448.45 -vt 0.644638 0.34593 -o mesh1236 -s off -f 6122/6122/6122 6123/6123/6123 6124/6124/6124 -g charts -o chart0000 -s off -f 6122/6122/6122 6123/6123/6123 6124/6124/6124 -v 7169 6260.99 2448.45 -vt 0.0976724 0.386565 -v 7229 6260.99 2538.45 -vt 0.0968412 0.387057 -v 6284 6260.99 2448.45 -vt 0.0976724 0.379305 -v 6224 6260.99 2538.45 -vt 0.0968412 0.378813 -o mesh1237 -s off -f 6125/6125/6125 6126/6126/6126 6127/6127/6127 -f 6128/6128/6128 6127/6127/6127 6126/6126/6126 -g charts -o chart0000 -s off -f 6125/6125/6125 6126/6126/6126 6127/6127/6127 -f 6128/6128/6128 6127/6127/6127 6126/6126/6126 -v 6224 6260.99 -229.05 -vt 0.179967 0.641797 -v 6284 6260.99 -139.05 -vt 0.179136 0.641073 -v 6224 6260.99 2538.45 -vt 0.179967 0.619538 -o mesh1238 -s off -f 6129/6129/6129 6130/6130/6130 6131/6131/6131 -g charts -o chart0000 -s off -f 6129/6129/6129 6130/6130/6130 6131/6131/6131 -v 6224 6260.99 2538.45 -vt 0.810058 0.770404 -v 6284 6260.99 -139.05 -vt 0.810058 0.791838 -v 6284 6260.99 2448.45 -vt 0.809227 0.771135 -o mesh1239 -s off -f 6132/6132/6132 6133/6133/6133 6134/6134/6134 -g charts -o chart0000 -s off -f 6132/6132/6132 6133/6133/6133 6134/6134/6134 -v 6284 6380.99 2448.45 -vt 0.971322 0.434872 -v 6713.38 6320.99 2448.45 -vt 0.972153 0.431272 -v 6284 6260.99 2448.45 -vt 0.972984 0.434872 -v 7169 6380.99 2448.45 -vt 0.971322 0.427453 -v 6739.63 6320.99 2448.45 -vt 0.972153 0.431052 -v 6739.63 6305.99 2448.45 -vt 0.972361 0.431052 -v 6713.38 6305.99 2448.45 -vt 0.972361 0.431272 -v 7169 6260.99 2448.45 -vt 0.972984 0.427453 -o mesh1240 -s off -f 6135/6135/6135 6136/6136/6136 6137/6137/6137 -f 6136/6136/6136 6135/6135/6135 6138/6138/6138 -f 6136/6136/6136 6138/6138/6138 6139/6139/6139 -f 6139/6139/6139 6138/6138/6138 6140/6140/6140 -f 6137/6137/6137 6141/6141/6141 6142/6142/6142 -f 6141/6141/6141 6137/6137/6137 6136/6136/6136 -f 6142/6142/6142 6141/6141/6141 6140/6140/6140 -f 6142/6142/6142 6140/6140/6140 6138/6138/6138 -g charts -o chart0000 -s off -f 6135/6135/6135 6136/6136/6136 6137/6137/6137 -f 6136/6136/6136 6135/6135/6135 6138/6138/6138 -f 6136/6136/6136 6138/6138/6138 6139/6139/6139 -f 6139/6139/6139 6138/6138/6138 6140/6140/6140 -f 6137/6137/6137 6141/6141/6141 6142/6142/6142 -f 6141/6141/6141 6137/6137/6137 6136/6136/6136 -f 6142/6142/6142 6141/6141/6141 6140/6140/6140 -f 6142/6142/6142 6140/6140/6140 6138/6138/6138 -v 7169 6380.99 -139.05 -vt 0.263924 0.966612 -v 6284 6380.99 -139.05 -vt 0.271405 0.966612 -v 6284 6260.99 -139.05 -vt 0.271405 0.96826 -v 7169 6260.99 -139.05 -vt 0.263924 0.96826 -o mesh1241 -s off -f 6143/6143/6143 6144/6144/6144 6145/6145/6145 -f 6143/6143/6143 6145/6145/6145 6146/6146/6146 -g charts -o chart0000 -s off -f 6143/6143/6143 6144/6144/6144 6145/6145/6145 -f 6143/6143/6143 6145/6145/6145 6146/6146/6146 -v 6284 6380.99 -139.05 -vt 0.0843724 0.148805 -v 6284 6260.99 2448.45 -vt 0.105154 0.150453 -v 6284 6260.99 -139.05 -vt 0.0843724 0.150453 -v 6284 6305.99 1861.57 -vt 0.10044 0.149835 -v 6284 6320.99 1861.57 -vt 0.10044 0.149629 -v 6284 6320.99 1874.7 -vt 0.100546 0.149629 -v 6284 6320.99 1887.82 -vt 0.100651 0.149629 -v 6284 6305.99 1887.82 -vt 0.100651 0.149835 -v 6284 6380.99 2448.45 -vt 0.105154 0.148805 -o mesh1242 -s off -f 6147/6147/6147 6148/6148/6148 6149/6149/6149 -f 6148/6148/6148 6147/6147/6147 6150/6150/6150 -f 6150/6150/6150 6147/6147/6147 6151/6151/6151 -f 6151/6151/6151 6147/6147/6147 6152/6152/6152 -f 6152/6152/6152 6147/6147/6147 6153/6153/6153 -f 6148/6148/6148 6154/6154/6154 6155/6155/6155 -f 6154/6154/6154 6148/6148/6148 6150/6150/6150 -f 6155/6155/6155 6154/6154/6154 6153/6153/6153 -f 6155/6155/6155 6153/6153/6153 6147/6147/6147 -g charts -o chart0000 -s off -f 6147/6147/6147 6148/6148/6148 6149/6149/6149 -f 6148/6148/6148 6147/6147/6147 6150/6150/6150 -f 6150/6150/6150 6147/6147/6147 6151/6151/6151 -f 6151/6151/6151 6147/6147/6147 6152/6152/6152 -f 6152/6152/6152 6147/6147/6147 6153/6153/6153 -f 6148/6148/6148 6154/6154/6154 6155/6155/6155 -f 6154/6154/6154 6148/6148/6148 6150/6150/6150 -f 6155/6155/6155 6154/6154/6154 6153/6153/6153 -f 6155/6155/6155 6153/6153/6153 6147/6147/6147 -v 7169 6260.99 2448.45 -vt 0.173317 0.636851 -v 7169 6305.99 1887.82 -vt 0.172693 0.632385 -v 7169 6260.99 -139.05 -vt 0.173317 0.616241 -v 7169 6380.99 2448.45 -vt 0.171654 0.636851 -v 7169 6320.99 1887.82 -vt 0.172485 0.632385 -v 7169 6320.99 1874.7 -vt 0.172485 0.632281 -v 7169 6320.99 1861.57 -vt 0.172485 0.632176 -v 7169 6305.99 1861.57 -vt 0.172693 0.632176 -v 7169 6380.99 -139.05 -vt 0.171654 0.616241 -o mesh1243 -s off -f 6156/6156/6156 6157/6157/6157 6158/6158/6158 -f 6157/6157/6157 6156/6156/6156 6159/6159/6159 -f 6157/6157/6157 6159/6159/6159 6160/6160/6160 -f 6160/6160/6160 6159/6159/6159 6161/6161/6161 -f 6161/6161/6161 6159/6159/6159 6162/6162/6162 -f 6158/6158/6158 6163/6163/6163 6164/6164/6164 -f 6163/6163/6163 6158/6158/6158 6157/6157/6157 -f 6164/6164/6164 6163/6163/6163 6162/6162/6162 -f 6164/6164/6164 6162/6162/6162 6159/6159/6159 -g charts -o chart0000 -s off -f 6156/6156/6156 6157/6157/6157 6158/6158/6158 -f 6157/6157/6157 6156/6156/6156 6159/6159/6159 -f 6157/6157/6157 6159/6159/6159 6160/6160/6160 -f 6160/6160/6160 6159/6159/6159 6161/6161/6161 -f 6161/6161/6161 6159/6159/6159 6162/6162/6162 -f 6158/6158/6158 6163/6163/6163 6164/6164/6164 -f 6163/6163/6163 6158/6158/6158 6157/6157/6157 -f 6164/6164/6164 6163/6163/6163 6162/6162/6162 -f 6164/6164/6164 6162/6162/6162 6159/6159/6159 -v 7169 6320.99 1861.57 -vt 0.737739 0.65911 -v 7169 6305.99 1861.57 -vt 0.737739 0.658285 -v 6284 6305.99 1861.57 -vt 0.730258 0.658285 -v 6284 6320.99 1861.57 -vt 0.730258 0.65911 -o mesh1244 -s off -f 6165/6165/6165 6166/6166/6166 6167/6167/6167 -f 6165/6165/6165 6167/6167/6167 6168/6168/6168 -g charts -o chart0000 -s off -f 6165/6165/6165 6166/6166/6166 6167/6167/6167 -f 6165/6165/6165 6167/6167/6167 6168/6168/6168 -v 6284 6305.99 1861.57 -vt 0.101829 0.514839 -v 7169 6305.99 1861.57 -vt 0.101829 0.522259 -v 7169 6305.99 1887.82 -vt 0.101606 0.522259 -v 6739.63 6305.99 1887.82 -vt 0.101606 0.518659 -v 6739.63 6305.99 2448.45 -vt 0.0968412 0.518659 -v 6713.38 6305.99 2448.45 -vt 0.0968412 0.518439 -v 6284 6305.99 1861.57 -vt 0.0112219 0.576669 -v 6713.38 6305.99 2448.45 -vt 0.0112219 0.570899 -v 6713.38 6305.99 1887.82 -vt 0.00789692 0.574489 -v 6284 6305.99 1861.57 -vt 0.338737 0.972382 -v 6713.38 6305.99 1887.82 -vt 0.342893 0.972382 -v 6284 6305.99 1887.82 -vt 0.338752 0.971558 -o mesh1245 -s off -f 6169/6169/6169 6170/6170/6170 6171/6171/6171 -f 6169/6169/6169 6171/6171/6171 6172/6172/6172 -f 6169/6169/6169 6172/6172/6172 6173/6173/6173 -f 6169/6169/6169 6173/6173/6173 6174/6174/6174 -f 6175/6175/6175 6176/6176/6176 6177/6177/6177 -f 6178/6178/6178 6179/6179/6179 6180/6180/6180 -g charts -o chart0000 -s off -f 6169/6169/6169 6170/6170/6170 6171/6171/6171 -f 6169/6169/6169 6171/6171/6171 6172/6172/6172 -f 6169/6169/6169 6172/6172/6172 6173/6173/6173 -f 6169/6169/6169 6173/6173/6173 6174/6174/6174 -o chart0001 -s off -f 6175/6175/6175 6176/6176/6176 6177/6177/6177 -o chart0002 -s off -f 6178/6178/6178 6179/6179/6179 6180/6180/6180 -v 6284 6305.99 1887.82 -vt 0.820864 0.907255 -v 6713.38 6305.99 1887.82 -vt 0.816708 0.907255 -v 6713.38 6320.99 1887.82 -vt 0.816708 0.90643 -v 6284 6320.99 1887.82 -vt 0.820864 0.90643 -o mesh1246 -s off -f 6181/6181/6181 6182/6182/6182 6183/6183/6183 -f 6181/6181/6181 6183/6183/6183 6184/6184/6184 -g charts -o chart0000 -s off -f 6181/6181/6181 6182/6182/6182 6183/6183/6183 -f 6181/6181/6181 6183/6183/6183 6184/6184/6184 -v 7169 6320.99 1887.82 -vt 0.446914 0.924567 -v 7169 6320.99 1874.7 -vt 0.4468 0.924567 -v 6284 6320.99 1874.7 -vt 0.4468 0.917148 -v 6284 6320.99 1887.82 -vt 0.446914 0.917148 -v 6713.38 6320.99 1887.82 -vt 0.446914 0.920747 -v 6713.38 6320.99 2448.45 -vt 0.451787 0.920747 -v 6739.63 6320.99 2448.45 -vt 0.451787 0.920967 -v 7169 6320.99 1887.82 -vt 0.100166 0.158697 -v 6739.63 6320.99 2448.45 -vt 0.0943475 0.158697 -v 6739.63 6320.99 1887.82 -vt 0.0980149 0.1554 -o mesh1247 -s off -f 6185/6185/6185 6186/6186/6186 6187/6187/6187 -f 6185/6185/6185 6187/6187/6187 6188/6188/6188 -f 6185/6185/6185 6188/6188/6188 6189/6189/6189 -f 6185/6185/6185 6189/6189/6189 6190/6190/6190 -f 6185/6185/6185 6190/6190/6190 6191/6191/6191 -f 6192/6192/6192 6193/6193/6193 6194/6194/6194 -g charts -o chart0000 -s off -f 6185/6185/6185 6186/6186/6186 6187/6187/6187 -f 6185/6185/6185 6187/6187/6187 6188/6188/6188 -f 6185/6185/6185 6188/6188/6188 6189/6189/6189 -f 6185/6185/6185 6189/6189/6189 6190/6190/6190 -f 6185/6185/6185 6190/6190/6190 6191/6191/6191 -o chart0001 -s off -f 6192/6192/6192 6193/6193/6193 6194/6194/6194 -v 7169 6320.99 1874.7 -vt 0.0527846 0.421682 -v 7169 6320.99 1861.57 -vt 0.0527846 0.420857 -v 6284 6320.99 1861.57 -vt 0.0453034 0.420857 -v 6284 6320.99 1874.7 -vt 0.0453034 0.421682 -o mesh1248 -s off -f 6195/6195/6195 6196/6196/6196 6197/6197/6197 -f 6195/6195/6195 6197/6197/6197 6198/6198/6198 -g charts -o chart0000 -s off -f 6195/6195/6195 6196/6196/6196 6197/6197/6197 -f 6195/6195/6195 6197/6197/6197 6198/6198/6198 -v 7169 6320.99 1887.82 -vt 0.84414 0.0605936 -v 6739.63 6320.99 1887.82 -vt 0.84414 0.0647155 -v 6739.63 6305.99 1887.82 -vt 0.844971 0.0647155 -v 7169 6305.99 1887.82 -vt 0.844971 0.0605936 -o mesh1249 -s off -f 6199/6199/6199 6200/6200/6200 6201/6201/6201 -f 6199/6199/6199 6201/6201/6201 6202/6202/6202 -g charts -o chart0000 -s off -f 6199/6199/6199 6200/6200/6200 6201/6201/6201 -f 6199/6199/6199 6201/6201/6201 6202/6202/6202 -v 6739.63 6305.99 1887.82 -vt 0.110141 0.949299 -v 6739.63 6320.99 1887.82 -vt 0.110141 0.950124 -v 6739.63 6320.99 2448.45 -vt 0.105154 0.950124 -v 6739.63 6305.99 2448.45 -vt 0.105154 0.949299 -o mesh1250 -s off -f 6203/6203/6203 6204/6204/6204 6205/6205/6205 -f 6203/6203/6203 6205/6205/6205 6206/6206/6206 -g charts -o chart0000 -s off -f 6203/6203/6203 6204/6204/6204 6205/6205/6205 -f 6203/6203/6203 6205/6205/6205 6206/6206/6206 -v 6713.38 6320.99 1887.82 -vt 0.591438 0.997939 -v 6713.38 6305.99 1887.82 -vt 0.591438 0.998763 -v 6713.38 6305.99 2448.45 -vt 0.586451 0.998763 -v 6713.38 6320.99 2448.45 -vt 0.586451 0.997939 -o mesh1251 -s off -f 6207/6207/6207 6208/6208/6208 6209/6209/6209 -f 6207/6207/6207 6209/6209/6209 6210/6210/6210 -g charts -o chart0000 -s off -f 6207/6207/6207 6208/6208/6208 6209/6209/6209 -f 6207/6207/6207 6209/6209/6209 6210/6210/6210 -v 7266.5 6380.99 -285.3 -vt 0.0236908 0.362325 -v 7304 6380.99 -229.05 -vt 0.0245219 0.36264 -v 8346.5 6380.99 -285.3 -vt 0.0236908 0.371393 -v 8309 6380.99 -229.05 -vt 0.0245219 0.371078 -o mesh1252 -s off -f 6211/6211/6211 6212/6212/6212 6213/6213/6213 -f 6214/6214/6214 6213/6213/6213 6212/6212/6212 -g charts -o chart0000 -s off -f 6211/6211/6211 6212/6212/6212 6213/6213/6213 -f 6214/6214/6214 6213/6213/6213 6212/6212/6212 -v 7304 6380.99 -229.05 -vt 0.388235 0.429926 -v 7266.5 6380.99 -285.3 -vt 0.387781 0.43075 -v 7266.5 6380.99 2594.7 -vt 0.411056 0.43075 -o mesh1253 -s off -f 6215/6215/6215 6216/6216/6216 6217/6217/6217 -g charts -o chart0000 -s off -f 6215/6215/6215 6216/6216/6216 6217/6217/6217 -v 7304 6380.99 -229.05 -vt 0.347049 0.495053 -v 7266.5 6380.99 2594.7 -vt 0.369493 0.495053 -v 7304 6380.99 2538.45 -vt 0.369042 0.494229 -o mesh1254 -s off -f 6218/6218/6218 6219/6219/6219 6220/6220/6220 -g charts -o chart0000 -s off -f 6218/6218/6218 6219/6219/6219 6220/6220/6220 -v 7304 6380.99 2538.45 -vt 0.545205 0.853669 -v 7266.5 6380.99 2594.7 -vt 0.544888 0.854493 -v 8309 6380.99 2538.45 -vt 0.553714 0.853669 -v 8346.5 6380.99 2594.7 -vt 0.554031 0.854493 -o mesh1255 -s off -f 6221/6221/6221 6222/6222/6222 6223/6223/6223 -f 6224/6224/6224 6223/6223/6223 6222/6222/6222 -g charts -o chart0000 -s off -f 6221/6221/6221 6222/6222/6222 6223/6223/6223 -f 6224/6224/6224 6223/6223/6223 6222/6222/6222 -v 8346.5 6380.99 -285.3 -vt 0.480881 0.627782 -v 8309 6380.99 -229.05 -vt 0.480427 0.626958 -v 8346.5 6380.99 2594.7 -vt 0.457606 0.627782 -o mesh1256 -s off -f 6225/6225/6225 6226/6226/6226 6227/6227/6227 -g charts -o chart0000 -s off -f 6225/6225/6225 6226/6226/6226 6227/6227/6227 -v 8346.5 6380.99 2594.7 -vt 0.99044 0.0350371 -v 8309 6380.99 -229.05 -vt 0.99044 0.0572959 -v 8309 6380.99 2538.45 -vt 0.989609 0.0354843 -o mesh1257 -s off -f 6228/6228/6228 6229/6229/6229 6230/6230/6230 -g charts -o chart0000 -s off -f 6228/6228/6228 6229/6229/6229 6230/6230/6230 -v 8346.5 6215.99 -285.3 -vt 0.941397 0.919621 -v 8309 6215.99 -229.05 -vt 0.941714 0.920445 -v 7266.5 6215.99 -285.3 -vt 0.95054 0.919621 -v 7304 6215.99 -229.05 -vt 0.950223 0.920445 -o mesh1258 -s off -f 6231/6231/6231 6232/6232/6232 6233/6233/6233 -f 6234/6234/6234 6233/6233/6233 6232/6232/6232 -g charts -o chart0000 -s off -f 6231/6231/6231 6232/6232/6232 6233/6233/6233 -f 6234/6234/6234 6233/6233/6233 6232/6232/6232 -v 8309 6215.99 -229.05 -vt 0.451787 0.884622 -v 8346.5 6215.99 -285.3 -vt 0.452618 0.884171 -v 8346.5 6215.99 2594.7 -vt 0.452618 0.907255 -o mesh1259 -s off -f 6235/6235/6235 6236/6236/6236 6237/6237/6237 -g charts -o chart0000 -s off -f 6235/6235/6235 6236/6236/6236 6237/6237/6237 -v 8309 6215.99 -229.05 -vt 0.822527 0.380462 -v 8346.5 6215.99 2594.7 -vt 0.822527 0.40272 -v 8309 6215.99 2538.45 -vt 0.821696 0.402273 -o mesh1260 -s off -f 6238/6238/6238 6239/6239/6239 6240/6240/6240 -g charts -o chart0000 -s off -f 6238/6238/6238 6239/6239/6239 6240/6240/6240 -v 8309 6215.99 2538.45 -vt 0.957704 0.0539983 -v 8346.5 6215.99 2594.7 -vt 0.958022 0.0531739 -v 7304 6215.99 2538.45 -vt 0.949195 0.0539983 -v 7266.5 6215.99 2594.7 -vt 0.948878 0.0531739 -o mesh1261 -s off -f 6241/6241/6241 6242/6242/6242 6243/6243/6243 -f 6244/6244/6244 6243/6243/6243 6242/6242/6242 -g charts -o chart0000 -s off -f 6241/6241/6241 6242/6242/6242 6243/6243/6243 -f 6244/6244/6244 6243/6243/6243 6242/6242/6242 -v 7266.5 6215.99 -285.3 -vt 0.881546 0.819868 -v 7304 6215.99 -229.05 -vt 0.880715 0.819417 -v 7266.5 6215.99 2594.7 -vt 0.881546 0.796785 -o mesh1262 -s off -f 6245/6245/6245 6246/6246/6246 6247/6247/6247 -g charts -o chart0000 -s off -f 6245/6245/6245 6246/6246/6246 6247/6247/6247 -v 7266.5 6215.99 2594.7 -vt 0.904821 0.25103 -v 7304 6215.99 -229.05 -vt 0.927265 0.25103 -v 7304 6215.99 2538.45 -vt 0.905272 0.250206 -o mesh1263 -s off -f 6248/6248/6248 6249/6249/6249 6250/6250/6250 -g charts -o chart0000 -s off -f 6248/6248/6248 6249/6249/6249 6250/6250/6250 -v 8346.5 6380.99 2594.7 -vt 0.053616 0.584089 -v 7266.5 6380.99 2594.7 -vt 0.053616 0.593157 -v 7266.5 6215.99 2594.7 -vt 0.0552784 0.593157 -v 8346.5 6215.99 2594.7 -vt 0.0552784 0.584089 -o mesh1264 -s off -f 6251/6251/6251 6252/6252/6252 6253/6253/6253 -f 6251/6251/6251 6253/6253/6253 6254/6254/6254 -g charts -o chart0000 -s off -f 6251/6251/6251 6252/6252/6252 6253/6253/6253 -f 6251/6251/6251 6253/6253/6253 6254/6254/6254 -v 7266.5 6380.99 2594.7 -vt 0.701164 0.888294 -v 7266.5 6380.99 -285.3 -vt 0.724439 0.888294 -v 7266.5 6215.99 -285.3 -vt 0.724439 0.889942 -v 7266.5 6215.99 2594.7 -vt 0.701164 0.889942 -o mesh1265 -s off -f 6255/6255/6255 6256/6256/6256 6257/6257/6257 -f 6255/6255/6255 6257/6257/6257 6258/6258/6258 -g charts -o chart0000 -s off -f 6255/6255/6255 6256/6256/6256 6257/6257/6257 -f 6255/6255/6255 6257/6257/6257 6258/6258/6258 -v 7266.5 6380.99 -285.3 -vt 0.961347 0.0523495 -v 8346.5 6380.99 -285.3 -vt 0.952203 0.0523495 -v 8346.5 6215.99 -285.3 -vt 0.952203 0.0507007 -v 7266.5 6215.99 -285.3 -vt 0.961347 0.0507007 -o mesh1266 -s off -f 6259/6259/6259 6260/6260/6260 6261/6261/6261 -f 6259/6259/6259 6261/6261/6261 6262/6262/6262 -g charts -o chart0000 -s off -f 6259/6259/6259 6260/6260/6260 6261/6261/6261 -f 6259/6259/6259 6261/6261/6261 6262/6262/6262 -v 8346.5 6380.99 -285.3 -vt 0.5399 0.532152 -v 8346.5 6380.99 2594.7 -vt 0.516625 0.532152 -v 8346.5 6215.99 2594.7 -vt 0.516625 0.530503 -v 8346.5 6215.99 -285.3 -vt 0.5399 0.530503 -o mesh1267 -s off -f 6263/6263/6263 6264/6264/6264 6265/6265/6265 -f 6263/6263/6263 6265/6265/6265 6266/6266/6266 -g charts -o chart0000 -s off -f 6263/6263/6263 6264/6264/6264 6265/6265/6265 -f 6263/6263/6263 6265/6265/6265 6266/6266/6266 -v 8309 6215.99 -229.05 -vt 0.411056 0.300495 -v 8309 6260.99 -229.05 -vt 0.411056 0.300045 -v 7304 6260.99 -229.05 -vt 0.402743 0.300045 -v 7304 6215.99 -229.05 -vt 0.402743 0.300495 -v 8309 6380.99 -229.05 -vt 0.411056 0.298846 -v 7304 6380.99 -229.05 -vt 0.402743 0.298846 -o mesh1268 -s off -f 6267/6267/6267 6268/6268/6268 6269/6269/6269 -f 6267/6267/6267 6269/6269/6269 6270/6270/6270 -f 6271/6271/6271 6272/6272/6272 6269/6269/6269 -f 6271/6271/6271 6269/6269/6269 6268/6268/6268 -g charts -o chart0000 -s off -f 6267/6267/6267 6268/6268/6268 6269/6269/6269 -f 6267/6267/6267 6269/6269/6269 6270/6270/6270 -f 6271/6271/6271 6272/6272/6272 6269/6269/6269 -f 6271/6271/6271 6269/6269/6269 6268/6268/6268 -v 7304 6215.99 -229.05 -vt 0.854115 0.988046 -v 7304 6260.99 -229.05 -vt 0.854115 0.988496 -v 7304 6260.99 2538.45 -vt 0.831671 0.988496 -v 7304 6215.99 2538.45 -vt 0.831671 0.988046 -v 7304 6380.99 -229.05 -vt 0.854115 0.989695 -v 7304 6380.99 2538.45 -vt 0.831671 0.989695 -o mesh1269 -s off -f 6273/6273/6273 6274/6274/6274 6275/6275/6275 -f 6273/6273/6273 6275/6275/6275 6276/6276/6276 -f 6277/6277/6277 6278/6278/6278 6275/6275/6275 -f 6277/6277/6277 6275/6275/6275 6274/6274/6274 -g charts -o chart0000 -s off -f 6273/6273/6273 6274/6274/6274 6275/6275/6275 -f 6273/6273/6273 6275/6275/6275 6276/6276/6276 -f 6277/6277/6277 6278/6278/6278 6275/6275/6275 -f 6277/6277/6277 6275/6275/6275 6274/6274/6274 -v 7304 6215.99 2538.45 -vt 0.657107 0.748145 -v 7304 6260.99 2538.45 -vt 0.657107 0.748595 -v 8309 6260.99 2538.45 -vt 0.648795 0.748595 -v 8309 6215.99 2538.45 -vt 0.648795 0.748145 -v 7304 6380.99 2538.45 -vt 0.657107 0.749794 -v 8309 6380.99 2538.45 -vt 0.648795 0.749794 -o mesh1270 -s off -f 6279/6279/6279 6280/6280/6280 6281/6281/6281 -f 6279/6279/6279 6281/6281/6281 6282/6282/6282 -f 6283/6283/6283 6284/6284/6284 6281/6281/6281 -f 6283/6283/6283 6281/6281/6281 6280/6280/6280 -g charts -o chart0000 -s off -f 6279/6279/6279 6280/6280/6280 6281/6281/6281 -f 6279/6279/6279 6281/6281/6281 6282/6282/6282 -f 6283/6283/6283 6284/6284/6284 6281/6281/6281 -f 6283/6283/6283 6281/6281/6281 6280/6280/6280 -v 8309 6215.99 2538.45 -vt 0.194929 0.889942 -v 8309 6260.99 2538.45 -vt 0.194476 0.889942 -v 8309 6260.99 -229.05 -vt 0.194476 0.867683 -v 8309 6215.99 -229.05 -vt 0.194929 0.867683 -v 8309 6380.99 2538.45 -vt 0.193267 0.889942 -v 8309 6380.99 -229.05 -vt 0.193267 0.867683 -o mesh1271 -s off -f 6285/6285/6285 6286/6286/6286 6287/6287/6287 -f 6285/6285/6285 6287/6287/6287 6288/6288/6288 -f 6289/6289/6289 6290/6290/6290 6287/6287/6287 -f 6289/6289/6289 6287/6287/6287 6286/6286/6286 -g charts -o chart0000 -s off -f 6285/6285/6285 6286/6286/6286 6287/6287/6287 -f 6285/6285/6285 6287/6287/6287 6288/6288/6288 -f 6289/6289/6289 6290/6290/6290 6287/6287/6287 -f 6289/6289/6289 6287/6287/6287 6286/6286/6286 -v 8309 6260.99 -229.05 -vt 0.859933 0.819044 -v 8249 6260.99 -139.05 -vt 0.859437 0.818219 -v 7304 6260.99 -229.05 -vt 0.851621 0.819044 -v 7364 6260.99 -139.05 -vt 0.852117 0.818219 -o mesh1272 -s off -f 6291/6291/6291 6292/6292/6292 6293/6293/6293 -f 6294/6294/6294 6293/6293/6293 6292/6292/6292 -g charts -o chart0000 -s off -f 6291/6291/6291 6292/6292/6292 6293/6293/6293 -f 6294/6294/6294 6293/6293/6293 6292/6292/6292 -v 8249 6260.99 -139.05 -vt 0.221428 0.52061 -v 8309 6260.99 -229.05 -vt 0.220698 0.521434 -v 8309 6260.99 2538.45 -vt 0.243142 0.521434 -o mesh1273 -s off -f 6295/6295/6295 6296/6296/6296 6297/6297/6297 -g charts -o chart0000 -s off -f 6295/6295/6295 6296/6296/6296 6297/6297/6297 -v 8249 6260.99 -139.05 -vt 0.811721 0.326051 -v 8309 6260.99 2538.45 -vt 0.833333 0.326051 -v 8249 6260.99 2448.45 -vt 0.832596 0.325227 -o mesh1274 -s off -f 6298/6298/6298 6299/6299/6299 6300/6300/6300 -g charts -o chart0000 -s off -f 6298/6298/6298 6299/6299/6299 6300/6300/6300 -v 8249 6260.99 2448.45 -vt 0.190773 0.980959 -v 8309 6260.99 2538.45 -vt 0.189942 0.981451 -v 7364 6260.99 2448.45 -vt 0.190773 0.973699 -v 7304 6260.99 2538.45 -vt 0.189942 0.973207 -o mesh1275 -s off -f 6301/6301/6301 6302/6302/6302 6303/6303/6303 -f 6304/6304/6304 6303/6303/6303 6302/6302/6302 -g charts -o chart0000 -s off -f 6301/6301/6301 6302/6302/6302 6303/6303/6303 -f 6304/6304/6304 6303/6303/6303 6302/6302/6302 -v 7304 6260.99 -229.05 -vt 0.773483 0.578318 -v 7364 6260.99 -139.05 -vt 0.772652 0.577594 -v 7304 6260.99 2538.45 -vt 0.773483 0.556059 -o mesh1276 -s off -f 6305/6305/6305 6306/6306/6306 6307/6307/6307 -g charts -o chart0000 -s off -f 6305/6305/6305 6306/6306/6306 6307/6307/6307 -v 7304 6260.99 2538.45 -vt 0.182461 0.537922 -v 7364 6260.99 -139.05 -vt 0.204073 0.537922 -v 7364 6260.99 2448.45 -vt 0.183197 0.537098 -o mesh1277 -s off -f 6308/6308/6308 6309/6309/6309 6310/6310/6310 -g charts -o chart0000 -s off -f 6308/6308/6308 6309/6309/6309 6310/6310/6310 -v 7364 6380.99 2448.45 -vt 0.128429 0.917148 -v 7793.38 6320.99 2448.45 -vt 0.124799 0.917972 -v 7364 6260.99 2448.45 -vt 0.128429 0.918796 -v 8249 6380.99 2448.45 -vt 0.120948 0.917148 -v 7819.63 6320.99 2448.45 -vt 0.124577 0.917972 -v 7819.63 6305.99 2448.45 -vt 0.124577 0.918178 -v 7793.38 6305.99 2448.45 -vt 0.124799 0.918178 -v 8249 6260.99 2448.45 -vt 0.120948 0.918796 -o mesh1278 -s off -f 6311/6311/6311 6312/6312/6312 6313/6313/6313 -f 6312/6312/6312 6311/6311/6311 6314/6314/6314 -f 6312/6312/6312 6314/6314/6314 6315/6315/6315 -f 6315/6315/6315 6314/6314/6314 6316/6316/6316 -f 6313/6313/6313 6317/6317/6317 6318/6318/6318 -f 6317/6317/6317 6313/6313/6313 6312/6312/6312 -f 6318/6318/6318 6317/6317/6317 6316/6316/6316 -f 6318/6318/6318 6316/6316/6316 6314/6314/6314 -g charts -o chart0000 -s off -f 6311/6311/6311 6312/6312/6312 6313/6313/6313 -f 6312/6312/6312 6311/6311/6311 6314/6314/6314 -f 6312/6312/6312 6314/6314/6314 6315/6315/6315 -f 6315/6315/6315 6314/6314/6314 6316/6316/6316 -f 6313/6313/6313 6317/6317/6317 6318/6318/6318 -f 6317/6317/6317 6313/6313/6313 6312/6312/6312 -f 6318/6318/6318 6317/6317/6317 6316/6316/6316 -f 6318/6318/6318 6316/6316/6316 6314/6314/6314 -v 8249 6380.99 -139.05 -vt 0.15586 0.884171 -v 7364 6380.99 -139.05 -vt 0.163342 0.884171 -v 7364 6260.99 -139.05 -vt 0.163342 0.88582 -v 8249 6260.99 -139.05 -vt 0.15586 0.88582 -o mesh1279 -s off -f 6319/6319/6319 6320/6320/6320 6321/6321/6321 -f 6319/6319/6319 6321/6321/6321 6322/6322/6322 -g charts -o chart0000 -s off -f 6319/6319/6319 6320/6320/6320 6321/6321/6321 -f 6319/6319/6319 6321/6321/6321 6322/6322/6322 -v 7364 6380.99 -139.05 -vt 0.0511222 0.153751 -v 7364 6260.99 2448.45 -vt 0.0527846 0.174361 -v 7364 6260.99 -139.05 -vt 0.0527846 0.153751 -v 7364 6305.99 1861.57 -vt 0.0521612 0.169686 -v 7364 6320.99 1861.57 -vt 0.0519534 0.169686 -v 7364 6320.99 1874.7 -vt 0.0519534 0.169791 -v 7364 6320.99 1887.82 -vt 0.0519534 0.169896 -v 7364 6305.99 1887.82 -vt 0.0521612 0.169896 -v 7364 6380.99 2448.45 -vt 0.0511222 0.174361 -o mesh1280 -s off -f 6323/6323/6323 6324/6324/6324 6325/6325/6325 -f 6324/6324/6324 6323/6323/6323 6326/6326/6326 -f 6326/6326/6326 6323/6323/6323 6327/6327/6327 -f 6327/6327/6327 6323/6323/6323 6328/6328/6328 -f 6328/6328/6328 6323/6323/6323 6329/6329/6329 -f 6324/6324/6324 6330/6330/6330 6331/6331/6331 -f 6330/6330/6330 6324/6324/6324 6326/6326/6326 -f 6331/6331/6331 6330/6330/6330 6329/6329/6329 -f 6331/6331/6331 6329/6329/6329 6323/6323/6323 -g charts -o chart0000 -s off -f 6323/6323/6323 6324/6324/6324 6325/6325/6325 -f 6324/6324/6324 6323/6323/6323 6326/6326/6326 -f 6326/6326/6326 6323/6323/6323 6327/6327/6327 -f 6327/6327/6327 6323/6323/6323 6328/6328/6328 -f 6328/6328/6328 6323/6323/6323 6329/6329/6329 -f 6324/6324/6324 6330/6330/6330 6331/6331/6331 -f 6330/6330/6330 6324/6324/6324 6326/6326/6326 -f 6331/6331/6331 6330/6330/6330 6329/6329/6329 -f 6331/6331/6331 6329/6329/6329 6323/6323/6323 -v 8249 6260.99 2448.45 -vt 0.968828 0.965787 -v 8249 6305.99 1887.82 -vt 0.964325 0.965169 -v 8249 6260.99 -139.05 -vt 0.948047 0.965787 -v 8249 6380.99 2448.45 -vt 0.968828 0.964139 -v 8249 6320.99 1887.82 -vt 0.964325 0.964963 -v 8249 6320.99 1874.7 -vt 0.96422 0.964963 -v 8249 6320.99 1861.57 -vt 0.964114 0.964963 -v 8249 6305.99 1861.57 -vt 0.964114 0.965169 -v 8249 6380.99 -139.05 -vt 0.948047 0.964139 -o mesh1281 -s off -f 6332/6332/6332 6333/6333/6333 6334/6334/6334 -f 6333/6333/6333 6332/6332/6332 6335/6335/6335 -f 6333/6333/6333 6335/6335/6335 6336/6336/6336 -f 6336/6336/6336 6335/6335/6335 6337/6337/6337 -f 6337/6337/6337 6335/6335/6335 6338/6338/6338 -f 6334/6334/6334 6339/6339/6339 6340/6340/6340 -f 6339/6339/6339 6334/6334/6334 6333/6333/6333 -f 6340/6340/6340 6339/6339/6339 6338/6338/6338 -f 6340/6340/6340 6338/6338/6338 6335/6335/6335 -g charts -o chart0000 -s off -f 6332/6332/6332 6333/6333/6333 6334/6334/6334 -f 6333/6333/6333 6332/6332/6332 6335/6335/6335 -f 6333/6333/6333 6335/6335/6335 6336/6336/6336 -f 6336/6336/6336 6335/6335/6335 6337/6337/6337 -f 6337/6337/6337 6335/6335/6335 6338/6338/6338 -f 6334/6334/6334 6339/6339/6339 6340/6340/6340 -f 6339/6339/6339 6334/6334/6334 6333/6333/6333 -f 6340/6340/6340 6339/6339/6339 6338/6338/6338 -f 6340/6340/6340 6338/6338/6338 6335/6335/6335 -v 8249 6320.99 1861.57 -vt 0.935578 0.640973 -v 8249 6305.99 1861.57 -vt 0.935578 0.640148 -v 7364 6305.99 1861.57 -vt 0.928096 0.640148 -v 7364 6320.99 1861.57 -vt 0.928096 0.640973 -o mesh1282 -s off -f 6341/6341/6341 6342/6342/6342 6343/6343/6343 -f 6341/6341/6341 6343/6343/6343 6344/6344/6344 -g charts -o chart0000 -s off -f 6341/6341/6341 6342/6342/6342 6343/6343/6343 -f 6341/6341/6341 6343/6343/6343 6344/6344/6344 -v 7364 6305.99 1861.57 -vt 0.64547 0.422506 -v 8249 6305.99 1861.57 -vt 0.652951 0.422506 -v 8249 6305.99 1887.82 -vt 0.652951 0.422285 -v 7819.63 6305.99 1887.82 -vt 0.649321 0.422285 -v 7819.63 6305.99 2448.45 -vt 0.649321 0.41756 -v 7793.38 6305.99 2448.45 -vt 0.649099 0.41756 -v 7364 6305.99 1861.57 -vt 0.0153781 0.1892 -v 7793.38 6305.99 2448.45 -vt 0.0153781 0.18343 -v 7793.38 6305.99 1887.82 -vt 0.0120532 0.18702 -v 7364 6305.99 1861.57 -vt 0.0619284 0.999588 -v 7793.38 6305.99 1887.82 -vt 0.0577722 0.998763 -v 7364 6305.99 1887.82 -vt 0.0619284 0.998763 -o mesh1283 -s off -f 6345/6345/6345 6346/6346/6346 6347/6347/6347 -f 6345/6345/6345 6347/6347/6347 6348/6348/6348 -f 6345/6345/6345 6348/6348/6348 6349/6349/6349 -f 6345/6345/6345 6349/6349/6349 6350/6350/6350 -f 6351/6351/6351 6352/6352/6352 6353/6353/6353 -f 6354/6354/6354 6355/6355/6355 6356/6356/6356 -g charts -o chart0000 -s off -f 6345/6345/6345 6346/6346/6346 6347/6347/6347 -f 6345/6345/6345 6347/6347/6347 6348/6348/6348 -f 6345/6345/6345 6348/6348/6348 6349/6349/6349 -f 6345/6345/6345 6349/6349/6349 6350/6350/6350 -o chart0001 -s off -f 6351/6351/6351 6352/6352/6352 6353/6353/6353 -o chart0002 -s off -f 6354/6354/6354 6355/6355/6355 6356/6356/6356 -v 7364 6305.99 1887.82 -vt 0.999584 0.226298 -v 7793.38 6305.99 1887.82 -vt 0.995428 0.226298 -v 7793.38 6320.99 1887.82 -vt 0.995428 0.225474 -v 7364 6320.99 1887.82 -vt 0.999584 0.225474 -o mesh1284 -s off -f 6357/6357/6357 6358/6358/6358 6359/6359/6359 -f 6357/6357/6357 6359/6359/6359 6360/6360/6360 -g charts -o chart0000 -s off -f 6357/6357/6357 6358/6358/6358 6359/6359/6359 -f 6357/6357/6357 6359/6359/6359 6360/6360/6360 -v 8249 6320.99 1887.82 -vt 0.125935 0.349248 -v 8249 6320.99 1874.7 -vt 0.125935 0.349134 -v 7364 6320.99 1874.7 -vt 0.118454 0.349134 -v 7364 6320.99 1887.82 -vt 0.118454 0.349248 -v 7793.38 6320.99 1887.82 -vt 0.122084 0.349248 -v 7793.38 6320.99 2448.45 -vt 0.122084 0.354081 -v 7819.63 6320.99 2448.45 -vt 0.122305 0.354081 -v 8249 6320.99 1887.82 -vt 0.0045719 0.236191 -v 7819.63 6320.99 2448.45 -vt 0.00955935 0.240313 -v 7819.63 6320.99 1887.82 -vt 0.0045719 0.240313 -o mesh1285 -s off -f 6361/6361/6361 6362/6362/6362 6363/6363/6363 -f 6361/6361/6361 6363/6363/6363 6364/6364/6364 -f 6361/6361/6361 6364/6364/6364 6365/6365/6365 -f 6361/6361/6361 6365/6365/6365 6366/6366/6366 -f 6361/6361/6361 6366/6366/6366 6367/6367/6367 -f 6368/6368/6368 6369/6369/6369 6370/6370/6370 -g charts -o chart0000 -s off -f 6361/6361/6361 6362/6362/6362 6363/6363/6363 -f 6361/6361/6361 6363/6363/6363 6364/6364/6364 -f 6361/6361/6361 6364/6364/6364 6365/6365/6365 -f 6361/6361/6361 6365/6365/6365 6366/6366/6366 -f 6361/6361/6361 6366/6366/6366 6367/6367/6367 -o chart0001 -s off -f 6368/6368/6368 6369/6369/6369 6370/6370/6370 -v 8249 6320.99 1874.7 -vt 0.396924 0.780297 -v 8249 6320.99 1861.57 -vt 0.396093 0.780297 -v 7364 6320.99 1861.57 -vt 0.396093 0.772877 -v 7364 6320.99 1874.7 -vt 0.396924 0.772877 -o mesh1286 -s off -f 6371/6371/6371 6372/6372/6372 6373/6373/6373 -f 6371/6371/6371 6373/6373/6373 6374/6374/6374 -g charts -o chart0000 -s off -f 6371/6371/6371 6372/6372/6372 6373/6373/6373 -f 6371/6371/6371 6373/6373/6373 6374/6374/6374 -v 8249 6320.99 1887.82 -vt 0.974647 0.825639 -v 7819.63 6320.99 1887.82 -vt 0.978803 0.825639 -v 7819.63 6305.99 1887.82 -vt 0.978803 0.826463 -v 8249 6305.99 1887.82 -vt 0.974647 0.826463 -o mesh1287 -s off -f 6375/6375/6375 6376/6376/6376 6377/6377/6377 -f 6375/6375/6375 6377/6377/6377 6378/6378/6378 -g charts -o chart0000 -s off -f 6375/6375/6375 6376/6376/6376 6377/6377/6377 -f 6375/6375/6375 6377/6377/6377 6378/6378/6378 -v 7819.63 6305.99 1887.82 -vt 0.757689 0.650866 -v 7819.63 6320.99 1887.82 -vt 0.757689 0.65169 -v 7819.63 6320.99 2448.45 -vt 0.752702 0.65169 -v 7819.63 6305.99 2448.45 -vt 0.752702 0.650866 -o mesh1288 -s off -f 6379/6379/6379 6380/6380/6380 6381/6381/6381 -f 6379/6379/6379 6381/6381/6381 6382/6382/6382 -g charts -o chart0000 -s off -f 6379/6379/6379 6380/6380/6380 6381/6381/6381 -f 6379/6379/6379 6381/6381/6381 6382/6382/6382 -v 7793.38 6320.99 1887.82 -vt 0.0311721 0.246908 -v 7793.38 6305.99 1887.82 -vt 0.0320032 0.246908 -v 7793.38 6305.99 2448.45 -vt 0.0320032 0.241962 -v 7793.38 6320.99 2448.45 -vt 0.0311721 0.241962 -o mesh1289 -s off -f 6383/6383/6383 6384/6384/6384 6385/6385/6385 -f 6383/6383/6383 6385/6385/6385 6386/6386/6386 -g charts -o chart0000 -s off -f 6383/6383/6383 6384/6384/6384 6385/6385/6385 -f 6383/6383/6383 6385/6385/6385 6386/6386/6386 -v 5106.5 6380.99 -285.3 -vt 0.549875 0.326051 -v 5144 6380.99 -229.05 -vt 0.550706 0.326366 -v 6186.5 6380.99 -285.3 -vt 0.549875 0.335119 -v 6149 6380.99 -229.05 -vt 0.550706 0.334805 -o mesh1290 -s off -f 6387/6387/6387 6388/6388/6388 6389/6389/6389 -f 6390/6390/6390 6389/6389/6389 6388/6388/6388 -g charts -o chart0000 -s off -f 6387/6387/6387 6388/6388/6388 6389/6389/6389 -f 6390/6390/6390 6389/6389/6389 6388/6388/6388 -v 5144 6380.99 -229.05 -vt 0.646301 0.318258 -v 5106.5 6380.99 -285.3 -vt 0.647132 0.317807 -v 5106.5 6380.99 2594.7 -vt 0.647132 0.34089 -o mesh1291 -s off -f 6391/6391/6391 6392/6392/6392 6393/6393/6393 -g charts -o chart0000 -s off -f 6391/6391/6391 6392/6392/6392 6393/6393/6393 -v 5144 6380.99 -229.05 -vt 0.867415 0.130668 -v 5106.5 6380.99 2594.7 -vt 0.867415 0.152927 -v 5144 6380.99 2538.45 -vt 0.866584 0.152479 -o mesh1292 -s off -f 6394/6394/6394 6395/6395/6395 6396/6396/6396 -g charts -o chart0000 -s off -f 6394/6394/6394 6395/6395/6395 6396/6396/6396 -v 5144 6380.99 2538.45 -vt 0.679551 0.662722 -v 5106.5 6380.99 2594.7 -vt 0.680382 0.662407 -v 6149 6380.99 2538.45 -vt 0.679551 0.671161 -v 6186.5 6380.99 2594.7 -vt 0.680382 0.671476 -o mesh1293 -s off -f 6397/6397/6397 6398/6398/6398 6399/6399/6399 -f 6400/6400/6400 6399/6399/6399 6398/6398/6398 -g charts -o chart0000 -s off -f 6397/6397/6397 6398/6398/6398 6399/6399/6399 -f 6400/6400/6400 6399/6399/6399 6398/6398/6398 -v 6186.5 6380.99 -285.3 -vt 0.805071 0.784419 -v 6149 6380.99 -229.05 -vt 0.804239 0.783968 -v 6186.5 6380.99 2594.7 -vt 0.805071 0.761336 -o mesh1294 -s off -f 6401/6401/6401 6402/6402/6402 6403/6403/6403 -g charts -o chart0000 -s off -f 6401/6401/6401 6402/6402/6402 6403/6403/6403 -v 6186.5 6380.99 2594.7 -vt 0.999584 0.443116 -v 6149 6380.99 -229.05 -vt 0.999584 0.465375 -v 6149 6380.99 2538.45 -vt 0.998753 0.443564 -o mesh1295 -s off -f 6404/6404/6404 6405/6405/6405 6406/6406/6406 -g charts -o chart0000 -s off -f 6404/6404/6404 6405/6405/6405 6406/6406/6406 -v 6186.5 6215.99 -285.3 -vt 0.780964 0.246908 -v 6149 6215.99 -229.05 -vt 0.781795 0.247223 -v 5106.5 6215.99 -285.3 -vt 0.780964 0.255977 -v 5144 6215.99 -229.05 -vt 0.781795 0.255662 -o mesh1296 -s off -f 6407/6407/6407 6408/6408/6408 6409/6409/6409 -f 6410/6410/6410 6409/6409/6409 6408/6408/6408 -g charts -o chart0000 -s off -f 6407/6407/6407 6408/6408/6408 6409/6409/6409 -f 6410/6410/6410 6409/6409/6409 6408/6408/6408 -v 6149 6215.99 -229.05 -vt 0.995428 0.235818 -v 6186.5 6215.99 -285.3 -vt 0.996259 0.235367 -v 6186.5 6215.99 2594.7 -vt 0.996259 0.25845 -o mesh1297 -s off -f 6411/6411/6411 6412/6412/6412 6413/6413/6413 -g charts -o chart0000 -s off -f 6411/6411/6411 6412/6412/6412 6413/6413/6413 -v 6149 6215.99 -229.05 -vt 0.445968 0.201566 -v 6186.5 6215.99 2594.7 -vt 0.445968 0.223825 -v 6149 6215.99 2538.45 -vt 0.445137 0.223378 -o mesh1298 -s off -f 6414/6414/6414 6415/6415/6415 6416/6416/6416 -g charts -o chart0000 -s off -f 6414/6414/6414 6415/6415/6415 6416/6416/6416 -v 6149 6215.99 2538.45 -vt 0.988778 0.0644007 -v 6186.5 6215.99 2594.7 -vt 0.987947 0.0647155 -v 5144 6215.99 2538.45 -vt 0.988778 0.055962 -v 5106.5 6215.99 2594.7 -vt 0.987947 0.0556472 -o mesh1299 -s off -f 6417/6417/6417 6418/6418/6418 6419/6419/6419 -f 6420/6420/6420 6419/6419/6419 6418/6418/6418 -g charts -o chart0000 -s off -f 6417/6417/6417 6418/6418/6418 6419/6419/6419 -f 6420/6420/6420 6419/6419/6419 6418/6418/6418 -v 5106.5 6215.99 -285.3 -vt 0.650457 0.622011 -v 5144 6215.99 -229.05 -vt 0.649626 0.621561 -v 5106.5 6215.99 2594.7 -vt 0.650457 0.598928 -o mesh1300 -s off -f 6421/6421/6421 6422/6422/6422 6423/6423/6423 -g charts -o chart0000 -s off -f 6421/6421/6421 6422/6422/6422 6423/6423/6423 -v 5106.5 6215.99 2594.7 -vt 0.413549 0.298846 -v 5144 6215.99 -229.05 -vt 0.435993 0.298846 -v 5144 6215.99 2538.45 -vt 0.414 0.298021 -o mesh1301 -s off -f 6424/6424/6424 6425/6425/6425 6426/6426/6426 -g charts -o chart0000 -s off -f 6424/6424/6424 6425/6425/6425 6426/6426/6426 -v 6186.5 6380.99 2594.7 -vt 0.852452 0.612943 -v 5106.5 6380.99 2594.7 -vt 0.852452 0.622011 -v 5106.5 6215.99 2594.7 -vt 0.854115 0.622011 -v 6186.5 6215.99 2594.7 -vt 0.854115 0.612943 -o mesh1302 -s off -f 6427/6427/6427 6428/6428/6428 6429/6429/6429 -f 6427/6427/6427 6429/6429/6429 6430/6430/6430 -g charts -o chart0000 -s off -f 6427/6427/6427 6428/6428/6428 6429/6429/6429 -f 6427/6427/6427 6429/6429/6429 6430/6430/6430 -v 5106.5 6380.99 2594.7 -vt 0.820033 0.337593 -v 5106.5 6380.99 -285.3 -vt 0.820033 0.360676 -v 5106.5 6215.99 -285.3 -vt 0.821696 0.360676 -v 5106.5 6215.99 2594.7 -vt 0.821696 0.337593 -o mesh1303 -s off -f 6431/6431/6431 6432/6432/6432 6433/6433/6433 -f 6431/6431/6431 6433/6433/6433 6434/6434/6434 -g charts -o chart0000 -s off -f 6431/6431/6431 6432/6432/6432 6433/6433/6433 -f 6431/6431/6431 6433/6433/6433 6434/6434/6434 -v 5106.5 6380.99 -285.3 -vt 0.337905 0.99629 -v 6186.5 6380.99 -285.3 -vt 0.328761 0.99629 -v 6186.5 6215.99 -285.3 -vt 0.328761 0.994641 -v 5106.5 6215.99 -285.3 -vt 0.337905 0.994641 -o mesh1304 -s off -f 6435/6435/6435 6436/6436/6436 6437/6437/6437 -f 6435/6435/6435 6437/6437/6437 6438/6438/6438 -g charts -o chart0000 -s off -f 6435/6435/6435 6436/6436/6436 6437/6437/6437 -f 6435/6435/6435 6437/6437/6437 6438/6438/6438 -v 6186.5 6380.99 -285.3 -vt 0.32793 0.883347 -v 6186.5 6380.99 2594.7 -vt 0.304655 0.883347 -v 6186.5 6215.99 2594.7 -vt 0.304655 0.881698 -v 6186.5 6215.99 -285.3 -vt 0.32793 0.881698 -o mesh1305 -s off -f 6439/6439/6439 6440/6440/6440 6441/6441/6441 -f 6439/6439/6439 6441/6441/6441 6442/6442/6442 -g charts -o chart0000 -s off -f 6439/6439/6439 6440/6440/6440 6441/6441/6441 -f 6439/6439/6439 6441/6441/6441 6442/6442/6442 -v 6149 6215.99 -229.05 -vt 0.911471 0.567601 -v 6149 6260.99 -229.05 -vt 0.911018 0.567601 -v 5144 6260.99 -229.05 -vt 0.911018 0.559357 -v 5144 6215.99 -229.05 -vt 0.911471 0.559357 -v 6149 6380.99 -229.05 -vt 0.909809 0.567601 -v 5144 6380.99 -229.05 -vt 0.909809 0.559357 -o mesh1306 -s off -f 6443/6443/6443 6444/6444/6444 6445/6445/6445 -f 6443/6443/6443 6445/6445/6445 6446/6446/6446 -f 6447/6447/6447 6448/6448/6448 6445/6445/6445 -f 6447/6447/6447 6445/6445/6445 6444/6444/6444 -g charts -o chart0000 -s off -f 6443/6443/6443 6444/6444/6444 6445/6445/6445 -f 6443/6443/6443 6445/6445/6445 6446/6446/6446 -f 6447/6447/6447 6448/6448/6448 6445/6445/6445 -f 6447/6447/6447 6445/6445/6445 6444/6444/6444 -v 5144 6215.99 -229.05 -vt 0.197423 0.833883 -v 5144 6260.99 -229.05 -vt 0.197423 0.834333 -v 5144 6260.99 2538.45 -vt 0.174979 0.834333 -v 5144 6215.99 2538.45 -vt 0.174979 0.833883 -v 5144 6380.99 -229.05 -vt 0.197423 0.835532 -v 5144 6380.99 2538.45 -vt 0.174979 0.835532 -o mesh1307 -s off -f 6449/6449/6449 6450/6450/6450 6451/6451/6451 -f 6449/6449/6449 6451/6451/6451 6452/6452/6452 -f 6453/6453/6453 6454/6454/6454 6451/6451/6451 -f 6453/6453/6453 6451/6451/6451 6450/6450/6450 -g charts -o chart0000 -s off -f 6449/6449/6449 6450/6450/6450 6451/6451/6451 -f 6449/6449/6449 6451/6451/6451 6452/6452/6452 -f 6453/6453/6453 6454/6454/6454 6451/6451/6451 -f 6453/6453/6453 6451/6451/6451 6450/6450/6450 -v 5144 6215.99 2538.45 -vt 0.346218 0.435697 -v 5144 6260.99 2538.45 -vt 0.346218 0.436146 -v 6149 6260.99 2538.45 -vt 0.337905 0.436146 -v 6149 6215.99 2538.45 -vt 0.337905 0.435697 -v 5144 6380.99 2538.45 -vt 0.346218 0.437345 -v 6149 6380.99 2538.45 -vt 0.337905 0.437345 -o mesh1308 -s off -f 6455/6455/6455 6456/6456/6456 6457/6457/6457 -f 6455/6455/6455 6457/6457/6457 6458/6458/6458 -f 6459/6459/6459 6460/6460/6460 6457/6457/6457 -f 6459/6459/6459 6457/6457/6457 6456/6456/6456 -g charts -o chart0000 -s off -f 6455/6455/6455 6456/6456/6456 6457/6457/6457 -f 6455/6455/6455 6457/6457/6457 6458/6458/6458 -f 6459/6459/6459 6460/6460/6460 6457/6457/6457 -f 6459/6459/6459 6457/6457/6457 6456/6456/6456 -v 6149 6215.99 2538.45 -vt 0.399418 0.779472 -v 6149 6260.99 2538.45 -vt 0.398965 0.779472 -v 6149 6260.99 -229.05 -vt 0.398965 0.757214 -v 6149 6215.99 -229.05 -vt 0.399418 0.757214 -v 6149 6380.99 2538.45 -vt 0.397756 0.779472 -v 6149 6380.99 -229.05 -vt 0.397756 0.757214 -o mesh1309 -s off -f 6461/6461/6461 6462/6462/6462 6463/6463/6463 -f 6461/6461/6461 6463/6463/6463 6464/6464/6464 -f 6465/6465/6465 6466/6466/6466 6463/6463/6463 -f 6465/6465/6465 6463/6463/6463 6462/6462/6462 -g charts -o chart0000 -s off -f 6461/6461/6461 6462/6462/6462 6463/6463/6463 -f 6461/6461/6461 6463/6463/6463 6464/6464/6464 -f 6465/6465/6465 6466/6466/6466 6463/6463/6463 -f 6465/6465/6465 6463/6463/6463 6462/6462/6462 -v 6149 6260.99 -229.05 -vt 0.031172 0.73413 -v 6089 6260.99 -139.05 -vt 0.0306757 0.733306 -v 5144 6260.99 -229.05 -vt 0.0228595 0.73413 -v 5204 6260.99 -139.05 -vt 0.0233557 0.733306 -o mesh1310 -s off -f 6467/6467/6467 6468/6468/6468 6469/6469/6469 -f 6470/6470/6470 6469/6469/6469 6468/6468/6468 -g charts -o chart0000 -s off -f 6467/6467/6467 6468/6468/6468 6469/6469/6469 -f 6470/6470/6470 6469/6469/6469 6468/6468/6468 -v 6089 6260.99 -139.05 -vt 0.880613 0.139736 -v 6149 6260.99 -229.05 -vt 0.879884 0.140561 -v 6149 6260.99 2538.45 -vt 0.902327 0.140561 -o mesh1311 -s off -f 6471/6471/6471 6472/6472/6472 6473/6473/6473 -g charts -o chart0000 -s off -f 6471/6471/6471 6472/6472/6472 6473/6473/6473 -v 6089 6260.99 -139.05 -vt 0.251455 0.608821 -v 6149 6260.99 2538.45 -vt 0.251455 0.630255 -v 6089 6260.99 2448.45 -vt 0.250623 0.629525 -o mesh1312 -s off -f 6474/6474/6474 6475/6475/6475 6476/6476/6476 -g charts -o chart0000 -s off -f 6474/6474/6474 6475/6475/6475 6476/6476/6476 -v 6089 6260.99 2448.45 -vt 0.752205 0.523908 -v 6149 6260.99 2538.45 -vt 0.752701 0.523083 -v 5204 6260.99 2448.45 -vt 0.744885 0.523908 -v 5144 6260.99 2538.45 -vt 0.744389 0.523083 -o mesh1313 -s off -f 6477/6477/6477 6478/6478/6478 6479/6479/6479 -f 6480/6480/6480 6479/6479/6479 6478/6478/6478 -g charts -o chart0000 -s off -f 6477/6477/6477 6478/6478/6478 6479/6479/6479 -f 6480/6480/6480 6479/6479/6479 6478/6478/6478 -v 5144 6260.99 -229.05 -vt 0.372818 0.374691 -v 5204 6260.99 -139.05 -vt 0.371987 0.373967 -v 5144 6260.99 2538.45 -vt 0.372818 0.352432 -o mesh1314 -s off -f 6481/6481/6481 6482/6482/6482 6483/6483/6483 -g charts -o chart0000 -s off -f 6481/6481/6481 6482/6482/6482 6483/6483/6483 -v 5144 6260.99 2538.45 -vt 0.539069 0.85202 -v 5204 6260.99 -139.05 -vt 0.560682 0.85202 -v 5204 6260.99 2448.45 -vt 0.539806 0.851195 -o mesh1315 -s off -f 6484/6484/6484 6485/6485/6485 6486/6486/6486 -g charts -o chart0000 -s off -f 6484/6484/6484 6485/6485/6485 6486/6486/6486 -v 5204 6380.99 2448.45 -vt 0.869077 0.925391 -v 5633.38 6320.99 2448.45 -vt 0.869909 0.921792 -v 5204 6260.99 2448.45 -vt 0.87074 0.925391 -v 6089 6380.99 2448.45 -vt 0.869077 0.917972 -v 5659.63 6320.99 2448.45 -vt 0.869909 0.921572 -v 5659.63 6305.99 2448.45 -vt 0.870116 0.921572 -v 5633.38 6305.99 2448.45 -vt 0.870116 0.921792 -v 6089 6260.99 2448.45 -vt 0.87074 0.917972 -o mesh1316 -s off -f 6487/6487/6487 6488/6488/6488 6489/6489/6489 -f 6488/6488/6488 6487/6487/6487 6490/6490/6490 -f 6488/6488/6488 6490/6490/6490 6491/6491/6491 -f 6491/6491/6491 6490/6490/6490 6492/6492/6492 -f 6489/6489/6489 6493/6493/6493 6494/6494/6494 -f 6493/6493/6493 6489/6489/6489 6488/6488/6488 -f 6494/6494/6494 6493/6493/6493 6492/6492/6492 -f 6494/6494/6494 6492/6492/6492 6490/6490/6490 -g charts -o chart0000 -s off -f 6487/6487/6487 6488/6488/6488 6489/6489/6489 -f 6488/6488/6488 6487/6487/6487 6490/6490/6490 -f 6488/6488/6488 6490/6490/6490 6491/6491/6491 -f 6491/6491/6491 6490/6490/6490 6492/6492/6492 -f 6489/6489/6489 6493/6493/6493 6494/6494/6494 -f 6493/6493/6493 6489/6489/6489 6488/6488/6488 -f 6494/6494/6494 6493/6493/6493 6492/6492/6492 -f 6494/6494/6494 6492/6492/6492 6490/6490/6490 -v 6089 6380.99 -139.05 -vt 0.657107 0.901484 -v 5204 6380.99 -139.05 -vt 0.664588 0.901484 -v 5204 6260.99 -139.05 -vt 0.664588 0.903133 -v 6089 6260.99 -139.05 -vt 0.657107 0.903133 -o mesh1317 -s off -f 6495/6495/6495 6496/6496/6496 6497/6497/6497 -f 6495/6495/6495 6497/6497/6497 6498/6498/6498 -g charts -o chart0000 -s off -f 6495/6495/6495 6496/6496/6496 6497/6497/6497 -f 6495/6495/6495 6497/6497/6497 6498/6498/6498 -v 5204 6380.99 -139.05 -vt 0.732751 0.659934 -v 5204 6260.99 2448.45 -vt 0.753533 0.661583 -v 5204 6260.99 -139.05 -vt 0.732751 0.661583 -v 5204 6305.99 1861.57 -vt 0.748819 0.660964 -v 5204 6320.99 1861.57 -vt 0.748819 0.660758 -v 5204 6320.99 1874.7 -vt 0.748925 0.660758 -v 5204 6320.99 1887.82 -vt 0.74903 0.660758 -v 5204 6305.99 1887.82 -vt 0.74903 0.660964 -v 5204 6380.99 2448.45 -vt 0.753533 0.659934 -o mesh1318 -s off -f 6499/6499/6499 6500/6500/6500 6501/6501/6501 -f 6500/6500/6500 6499/6499/6499 6502/6502/6502 -f 6502/6502/6502 6499/6499/6499 6503/6503/6503 -f 6503/6503/6503 6499/6499/6499 6504/6504/6504 -f 6504/6504/6504 6499/6499/6499 6505/6505/6505 -f 6500/6500/6500 6506/6506/6506 6507/6507/6507 -f 6506/6506/6506 6500/6500/6500 6502/6502/6502 -f 6507/6507/6507 6506/6506/6506 6505/6505/6505 -f 6507/6507/6507 6505/6505/6505 6499/6499/6499 -g charts -o chart0000 -s off -f 6499/6499/6499 6500/6500/6500 6501/6501/6501 -f 6500/6500/6500 6499/6499/6499 6502/6502/6502 -f 6502/6502/6502 6499/6499/6499 6503/6503/6503 -f 6503/6503/6503 6499/6499/6499 6504/6504/6504 -f 6504/6504/6504 6499/6499/6499 6505/6505/6505 -f 6500/6500/6500 6506/6506/6506 6507/6507/6507 -f 6506/6506/6506 6500/6500/6500 6502/6502/6502 -f 6507/6507/6507 6506/6506/6506 6505/6505/6505 -f 6507/6507/6507 6505/6505/6505 6499/6499/6499 -v 6089 6260.99 2448.45 -vt 0.276392 0.711047 -v 6089 6305.99 1887.82 -vt 0.27189 0.710429 -v 6089 6260.99 -139.05 -vt 0.255611 0.711047 -v 6089 6380.99 2448.45 -vt 0.276392 0.709398 -v 6089 6320.99 1887.82 -vt 0.27189 0.710223 -v 6089 6320.99 1874.7 -vt 0.271784 0.710223 -v 6089 6320.99 1861.57 -vt 0.271679 0.710223 -v 6089 6305.99 1861.57 -vt 0.271679 0.710429 -v 6089 6380.99 -139.05 -vt 0.255611 0.709398 -o mesh1319 -s off -f 6508/6508/6508 6509/6509/6509 6510/6510/6510 -f 6509/6509/6509 6508/6508/6508 6511/6511/6511 -f 6509/6509/6509 6511/6511/6511 6512/6512/6512 -f 6512/6512/6512 6511/6511/6511 6513/6513/6513 -f 6513/6513/6513 6511/6511/6511 6514/6514/6514 -f 6510/6510/6510 6515/6515/6515 6516/6516/6516 -f 6515/6515/6515 6510/6510/6510 6509/6509/6509 -f 6516/6516/6516 6515/6515/6515 6514/6514/6514 -f 6516/6516/6516 6514/6514/6514 6511/6511/6511 -g charts -o chart0000 -s off -f 6508/6508/6508 6509/6509/6509 6510/6510/6510 -f 6509/6509/6509 6508/6508/6508 6511/6511/6511 -f 6509/6509/6509 6511/6511/6511 6512/6512/6512 -f 6512/6512/6512 6511/6511/6511 6513/6513/6513 -f 6513/6513/6513 6511/6511/6511 6514/6514/6514 -f 6510/6510/6510 6515/6515/6515 6516/6516/6516 -f 6515/6515/6515 6510/6510/6510 6509/6509/6509 -f 6516/6516/6516 6515/6515/6515 6514/6514/6514 -f 6516/6516/6516 6514/6514/6514 6511/6511/6511 -v 6089 6320.99 1861.57 -vt 0.326268 0.61047 -v 6089 6305.99 1861.57 -vt 0.326268 0.609645 -v 5204 6305.99 1861.57 -vt 0.318786 0.609645 -v 5204 6320.99 1861.57 -vt 0.318786 0.61047 -o mesh1320 -s off -f 6517/6517/6517 6518/6518/6518 6519/6519/6519 -f 6517/6517/6517 6519/6519/6519 6520/6520/6520 -g charts -o chart0000 -s off -f 6517/6517/6517 6518/6518/6518 6519/6519/6519 -f 6517/6517/6517 6519/6519/6519 6520/6520/6520 -v 5204 6305.99 1861.57 -vt 0.934746 0.703627 -v 6089 6305.99 1861.57 -vt 0.942228 0.703627 -v 6089 6305.99 1887.82 -vt 0.942228 0.703406 -v 5659.63 6305.99 1887.82 -vt 0.938598 0.703406 -v 5659.63 6305.99 2448.45 -vt 0.938598 0.698681 -v 5633.38 6305.99 2448.45 -vt 0.938376 0.698681 -v 5204 6305.99 1861.57 -vt 0.0719035 0.83718 -v 5633.38 6305.99 2448.45 -vt 0.0719035 0.83141 -v 5633.38 6305.99 1887.82 -vt 0.0685786 0.835 -v 5204 6305.99 1861.57 -vt 0.633832 0.443941 -v 5633.38 6305.99 1887.82 -vt 0.633001 0.439819 -v 5204 6305.99 1887.82 -vt 0.633001 0.443941 -o mesh1321 -s off -f 6521/6521/6521 6522/6522/6522 6523/6523/6523 -f 6521/6521/6521 6523/6523/6523 6524/6524/6524 -f 6521/6521/6521 6524/6524/6524 6525/6525/6525 -f 6521/6521/6521 6525/6525/6525 6526/6526/6526 -f 6527/6527/6527 6528/6528/6528 6529/6529/6529 -f 6530/6530/6530 6531/6531/6531 6532/6532/6532 -g charts -o chart0000 -s off -f 6521/6521/6521 6522/6522/6522 6523/6523/6523 -f 6521/6521/6521 6523/6523/6523 6524/6524/6524 -f 6521/6521/6521 6524/6524/6524 6525/6525/6525 -f 6521/6521/6521 6525/6525/6525 6526/6526/6526 -o chart0001 -s off -f 6527/6527/6527 6528/6528/6528 6529/6529/6529 -o chart0002 -s off -f 6530/6530/6530 6531/6531/6531 6532/6532/6532 -v 5204 6305.99 1887.82 -vt 0.110972 0.383759 -v 5633.38 6305.99 1887.82 -vt 0.110972 0.379637 -v 5633.38 6320.99 1887.82 -vt 0.110141 0.379637 -v 5204 6320.99 1887.82 -vt 0.110141 0.383759 -o mesh1322 -s off -f 6533/6533/6533 6534/6534/6534 6535/6535/6535 -f 6533/6533/6533 6535/6535/6535 6536/6536/6536 -g charts -o chart0000 -s off -f 6533/6533/6533 6534/6534/6534 6535/6535/6535 -f 6533/6533/6533 6535/6535/6535 6536/6536/6536 -v 6089 6320.99 1887.82 -vt 0.49097 0.467024 -v 6089 6320.99 1874.7 -vt 0.490856 0.467024 -v 5204 6320.99 1874.7 -vt 0.490856 0.459604 -v 5204 6320.99 1887.82 -vt 0.49097 0.459604 -v 5633.38 6320.99 1887.82 -vt 0.49097 0.463204 -v 5633.38 6320.99 2448.45 -vt 0.495844 0.463204 -v 5659.63 6320.99 2448.45 -vt 0.495844 0.463424 -v 6089 6320.99 1887.82 -vt 0.0203657 0.746496 -v 5659.63 6320.99 2448.45 -vt 0.0203657 0.740725 -v 5659.63 6320.99 1887.82 -vt 0.0170407 0.744363 -o mesh1323 -s off -f 6537/6537/6537 6538/6538/6538 6539/6539/6539 -f 6537/6537/6537 6539/6539/6539 6540/6540/6540 -f 6537/6537/6537 6540/6540/6540 6541/6541/6541 -f 6537/6537/6537 6541/6541/6541 6542/6542/6542 -f 6537/6537/6537 6542/6542/6542 6543/6543/6543 -f 6544/6544/6544 6545/6545/6545 6546/6546/6546 -g charts -o chart0000 -s off -f 6537/6537/6537 6538/6538/6538 6539/6539/6539 -f 6537/6537/6537 6539/6539/6539 6540/6540/6540 -f 6537/6537/6537 6540/6540/6540 6541/6541/6541 -f 6537/6537/6537 6541/6541/6541 6542/6542/6542 -f 6537/6537/6537 6542/6542/6542 6543/6543/6543 -o chart0001 -s off -f 6544/6544/6544 6545/6545/6545 6546/6546/6546 -v 6089 6320.99 1874.7 -vt 0.0627597 0.199093 -v 6089 6320.99 1861.57 -vt 0.0619285 0.199093 -v 5204 6320.99 1861.57 -vt 0.0619285 0.191674 -v 5204 6320.99 1874.7 -vt 0.0627597 0.191674 -o mesh1324 -s off -f 6547/6547/6547 6548/6548/6548 6549/6549/6549 -f 6547/6547/6547 6549/6549/6549 6550/6550/6550 -g charts -o chart0000 -s off -f 6547/6547/6547 6548/6548/6548 6549/6549/6549 -f 6547/6547/6547 6549/6549/6549 6550/6550/6550 -v 6089 6320.99 1887.82 -vt 0.511638 0.714345 -v 5659.63 6320.99 1887.82 -vt 0.511638 0.718467 -v 5659.63 6305.99 1887.82 -vt 0.512469 0.718467 -v 6089 6305.99 1887.82 -vt 0.512469 0.714345 -o mesh1325 -s off -f 6551/6551/6551 6552/6552/6552 6553/6553/6553 -f 6551/6551/6551 6553/6553/6553 6554/6554/6554 -g charts -o chart0000 -s off -f 6551/6551/6551 6552/6552/6552 6553/6553/6553 -f 6551/6551/6551 6553/6553/6553 6554/6554/6554 -v 5659.63 6305.99 1887.82 -vt 0.179136 0.407667 -v 5659.63 6320.99 1887.82 -vt 0.179967 0.407667 -v 5659.63 6320.99 2448.45 -vt 0.179967 0.402721 -v 5659.63 6305.99 2448.45 -vt 0.179136 0.402721 -o mesh1326 -s off -f 6555/6555/6555 6556/6556/6556 6557/6557/6557 -f 6555/6555/6555 6557/6557/6557 6558/6558/6558 -g charts -o chart0000 -s off -f 6555/6555/6555 6556/6556/6556 6557/6557/6557 -f 6555/6555/6555 6557/6557/6557 6558/6558/6558 -v 5633.38 6320.99 1887.82 -vt 0.233998 0.6723 -v 5633.38 6305.99 1887.82 -vt 0.23483 0.6723 -v 5633.38 6305.99 2448.45 -vt 0.23483 0.667354 -v 5633.38 6320.99 2448.45 -vt 0.233998 0.667354 -o mesh1327 -s off -f 6559/6559/6559 6560/6560/6560 6561/6561/6561 -f 6559/6559/6559 6561/6561/6561 6562/6562/6562 -g charts -o chart0000 -s off -f 6559/6559/6559 6560/6560/6560 6561/6561/6561 -f 6559/6559/6559 6561/6561/6561 6562/6562/6562 -v 8346.5 6380.99 -285.3 -vt 0.269742 0.882523 -v 8384 6380.99 -229.05 -vt 0.27006 0.883347 -v 9426.5 6380.99 -285.3 -vt 0.278886 0.882523 -v 9389 6380.99 -229.05 -vt 0.278569 0.883347 -o mesh1328 -s off -f 6563/6563/6563 6564/6564/6564 6565/6565/6565 -f 6566/6566/6566 6565/6565/6565 6564/6564/6564 -g charts -o chart0000 -s off -f 6563/6563/6563 6564/6564/6564 6565/6565/6565 -f 6566/6566/6566 6565/6565/6565 6564/6564/6564 -v 8384 6380.99 -229.05 -vt 0.657938 0.848349 -v 8346.5 6380.99 -285.3 -vt 0.65877 0.847898 -v 8346.5 6380.99 2594.7 -vt 0.65877 0.870981 -o mesh1329 -s off -f 6567/6567/6567 6568/6568/6568 6569/6569/6569 -g charts -o chart0000 -s off -f 6567/6567/6567 6568/6568/6568 6569/6569/6569 -v 8384 6380.99 -229.05 -vt 0.171654 0.34831 -v 8346.5 6380.99 2594.7 -vt 0.171654 0.370569 -v 8384 6380.99 2538.45 -vt 0.170823 0.370122 -o mesh1330 -s off -f 6570/6570/6570 6571/6571/6571 6572/6572/6572 -g charts -o chart0000 -s off -f 6570/6570/6570 6571/6571/6571 6572/6572/6572 -v 8384 6380.99 2538.45 -vt 0.87739 0.00732223 -v 8346.5 6380.99 2594.7 -vt 0.878221 0.00700742 -v 9389 6380.99 2538.45 -vt 0.87739 0.0157609 -v 9426.5 6380.99 2594.7 -vt 0.878221 0.0160758 -o mesh1331 -s off -f 6573/6573/6573 6574/6574/6574 6575/6575/6575 -f 6576/6576/6576 6575/6575/6575 6574/6574/6574 -g charts -o chart0000 -s off -f 6573/6573/6573 6574/6574/6574 6575/6575/6575 -f 6576/6576/6576 6575/6575/6575 6574/6574/6574 -v 9426.5 6380.99 -285.3 -vt 0.95719 0.733306 -v 9389 6380.99 -229.05 -vt 0.956359 0.732855 -v 9426.5 6380.99 2594.7 -vt 0.95719 0.710223 -o mesh1332 -s off -f 6577/6577/6577 6578/6578/6578 6579/6579/6579 -g charts -o chart0000 -s off -f 6577/6577/6577 6578/6578/6578 6579/6579/6579 -v 9426.5 6380.99 2594.7 -vt 0.85079 0.535449 -v 9389 6380.99 -229.05 -vt 0.873233 0.535449 -v 9389 6380.99 2538.45 -vt 0.851241 0.534625 -o mesh1333 -s off -f 6580/6580/6580 6581/6581/6581 6582/6582/6582 -g charts -o chart0000 -s off -f 6580/6580/6580 6581/6581/6581 6582/6582/6582 -v 9426.5 6215.99 -285.3 -vt 0.783458 0.180132 -v 9389 6215.99 -229.05 -vt 0.782627 0.179817 -v 8346.5 6215.99 -285.3 -vt 0.783458 0.171063 -v 8384 6215.99 -229.05 -vt 0.782627 0.171378 -o mesh1334 -s off -f 6583/6583/6583 6584/6584/6584 6585/6585/6585 -f 6586/6586/6586 6585/6585/6585 6584/6584/6584 -g charts -o chart0000 -s off -f 6583/6583/6583 6584/6584/6584 6585/6585/6585 -f 6586/6586/6586 6585/6585/6585 6584/6584/6584 -v 9389 6215.99 -229.05 -vt 0.464711 0.323578 -v 9426.5 6215.99 -285.3 -vt 0.464256 0.324402 -v 9426.5 6215.99 2594.7 -vt 0.487531 0.324402 -o mesh1335 -s off -f 6587/6587/6587 6588/6588/6588 6589/6589/6589 -g charts -o chart0000 -s off -f 6587/6587/6587 6588/6588/6588 6589/6589/6589 -v 9389 6215.99 -229.05 -vt 0.398587 0.522259 -v 9426.5 6215.99 2594.7 -vt 0.421031 0.522259 -v 9389 6215.99 2538.45 -vt 0.42058 0.521434 -o mesh1336 -s off -f 6590/6590/6590 6591/6591/6591 6592/6592/6592 -g charts -o chart0000 -s off -f 6590/6590/6590 6591/6591/6591 6592/6592/6592 -v 9389 6215.99 2538.45 -vt 0.327099 0.601086 -v 9426.5 6215.99 2594.7 -vt 0.326268 0.601401 -v 8384 6215.99 2538.45 -vt 0.327099 0.592648 -v 8346.5 6215.99 2594.7 -vt 0.326268 0.592333 -o mesh1337 -s off -f 6593/6593/6593 6594/6594/6594 6595/6595/6595 -f 6596/6596/6596 6595/6595/6595 6594/6594/6594 -g charts -o chart0000 -s off -f 6593/6593/6593 6594/6594/6594 6595/6595/6595 -f 6596/6596/6596 6595/6595/6595 6594/6594/6594 -v 8346.5 6215.99 -285.3 -vt 0.839152 0.900659 -v 8384 6215.99 -229.05 -vt 0.838697 0.899835 -v 8346.5 6215.99 2594.7 -vt 0.815877 0.900659 -o mesh1338 -s off -f 6597/6597/6597 6598/6598/6598 6599/6599/6599 -g charts -o chart0000 -s off -f 6597/6597/6597 6598/6598/6598 6599/6599/6599 -v 8346.5 6215.99 2594.7 -vt 0.224855 0.950948 -v 8384 6215.99 -229.05 -vt 0.247298 0.950948 -v 8384 6215.99 2538.45 -vt 0.225305 0.950124 -o mesh1339 -s off -f 6600/6600/6600 6601/6601/6601 6602/6602/6602 -g charts -o chart0000 -s off -f 6600/6600/6600 6601/6601/6601 6602/6602/6602 -v 9426.5 6380.99 2594.7 -vt 0.278886 0.457131 -v 8346.5 6380.99 2594.7 -vt 0.28803 0.457131 -v 8346.5 6215.99 2594.7 -vt 0.28803 0.45878 -v 9426.5 6215.99 2594.7 -vt 0.278886 0.45878 -o mesh1340 -s off -f 6603/6603/6603 6604/6604/6604 6605/6605/6605 -f 6603/6603/6603 6605/6605/6605 6606/6606/6606 -g charts -o chart0000 -s off -f 6603/6603/6603 6604/6604/6604 6605/6605/6605 -f 6603/6603/6603 6605/6605/6605 6606/6606/6606 -v 8346.5 6380.99 2594.7 -vt 0.720283 0.993817 -v 8346.5 6380.99 -285.3 -vt 0.743558 0.993817 -v 8346.5 6215.99 -285.3 -vt 0.743558 0.995466 -v 8346.5 6215.99 2594.7 -vt 0.720283 0.995466 -o mesh1341 -s off -f 6607/6607/6607 6608/6608/6608 6609/6609/6609 -f 6607/6607/6607 6609/6609/6609 6610/6610/6610 -g charts -o chart0000 -s off -f 6607/6607/6607 6608/6608/6608 6609/6609/6609 -f 6607/6607/6607 6609/6609/6609 6610/6610/6610 -v 8346.5 6380.99 -285.3 -vt 0.398587 0.969909 -v 9426.5 6380.99 -285.3 -vt 0.389443 0.969909 -v 9426.5 6215.99 -285.3 -vt 0.389443 0.968261 -v 8346.5 6215.99 -285.3 -vt 0.398587 0.968261 -o mesh1342 -s off -f 6611/6611/6611 6612/6612/6612 6613/6613/6613 -f 6611/6611/6611 6613/6613/6613 6614/6614/6614 -g charts -o chart0000 -s off -f 6611/6611/6611 6612/6612/6612 6613/6613/6613 -f 6611/6611/6611 6613/6613/6613 6614/6614/6614 -v 9426.5 6380.99 -285.3 -vt 0.165835 0.762984 -v 9426.5 6380.99 2594.7 -vt 0.14256 0.762984 -v 9426.5 6215.99 2594.7 -vt 0.14256 0.761336 -v 9426.5 6215.99 -285.3 -vt 0.165835 0.761336 -o mesh1343 -s off -f 6615/6615/6615 6616/6616/6616 6617/6617/6617 -f 6615/6615/6615 6617/6617/6617 6618/6618/6618 -g charts -o chart0000 -s off -f 6615/6615/6615 6616/6616/6616 6617/6617/6617 -f 6615/6615/6615 6617/6617/6617 6618/6618/6618 -v 9389 6215.99 -229.05 -vt 0.692851 0.354081 -v 9389 6260.99 -229.05 -vt 0.692398 0.354081 -v 8384 6260.99 -229.05 -vt 0.692398 0.345837 -v 8384 6215.99 -229.05 -vt 0.692851 0.345837 -v 9389 6380.99 -229.05 -vt 0.691189 0.354081 -v 8384 6380.99 -229.05 -vt 0.691189 0.345837 -o mesh1344 -s off -f 6619/6619/6619 6620/6620/6620 6621/6621/6621 -f 6619/6619/6619 6621/6621/6621 6622/6622/6622 -f 6623/6623/6623 6624/6624/6624 6621/6621/6621 -f 6623/6623/6623 6621/6621/6621 6620/6620/6620 -g charts -o chart0000 -s off -f 6619/6619/6619 6620/6620/6620 6621/6621/6621 -f 6619/6619/6619 6621/6621/6621 6622/6622/6622 -f 6623/6623/6623 6624/6624/6624 6621/6621/6621 -f 6623/6623/6623 6621/6621/6621 6620/6620/6620 -v 8384 6215.99 -229.05 -vt 0.806733 0.473619 -v 8384 6260.99 -229.05 -vt 0.806733 0.474069 -v 8384 6260.99 2538.45 -vt 0.784289 0.474069 -v 8384 6215.99 2538.45 -vt 0.784289 0.473619 -v 8384 6380.99 -229.05 -vt 0.806733 0.475268 -v 8384 6380.99 2538.45 -vt 0.784289 0.475268 -o mesh1345 -s off -f 6625/6625/6625 6626/6626/6626 6627/6627/6627 -f 6625/6625/6625 6627/6627/6627 6628/6628/6628 -f 6629/6629/6629 6630/6630/6630 6627/6627/6627 -f 6629/6629/6629 6627/6627/6627 6626/6626/6626 -g charts -o chart0000 -s off -f 6625/6625/6625 6626/6626/6626 6627/6627/6627 -f 6625/6625/6625 6627/6627/6627 6628/6628/6628 -f 6629/6629/6629 6630/6630/6630 6627/6627/6627 -f 6629/6629/6629 6627/6627/6627 6626/6626/6626 -v 8384 6215.99 2538.45 -vt 0.825852 0.0746083 -v 8384 6260.99 2538.45 -vt 0.826305 0.0746083 -v 9389 6260.99 2538.45 -vt 0.826305 0.0663644 -v 9389 6215.99 2538.45 -vt 0.825852 0.0663644 -v 8384 6380.99 2538.45 -vt 0.827514 0.0746083 -v 9389 6380.99 2538.45 -vt 0.827514 0.0663644 -o mesh1346 -s off -f 6631/6631/6631 6632/6632/6632 6633/6633/6633 -f 6631/6631/6631 6633/6633/6633 6634/6634/6634 -f 6635/6635/6635 6636/6636/6636 6633/6633/6633 -f 6635/6635/6635 6633/6633/6633 6632/6632/6632 -g charts -o chart0000 -s off -f 6631/6631/6631 6632/6632/6632 6633/6633/6633 -f 6631/6631/6631 6633/6633/6633 6634/6634/6634 -f 6635/6635/6635 6636/6636/6636 6633/6633/6633 -f 6635/6635/6635 6633/6633/6633 6632/6632/6632 -v 9389 6215.99 2538.45 -vt 0.490025 0.880049 -v 9389 6260.99 2538.45 -vt 0.490025 0.8796 -v 9389 6260.99 -229.05 -vt 0.467581 0.8796 -v 9389 6215.99 -229.05 -vt 0.467581 0.880049 -v 9389 6380.99 2538.45 -vt 0.490025 0.878401 -v 9389 6380.99 -229.05 -vt 0.467581 0.878401 -o mesh1347 -s off -f 6637/6637/6637 6638/6638/6638 6639/6639/6639 -f 6637/6637/6637 6639/6639/6639 6640/6640/6640 -f 6641/6641/6641 6642/6642/6642 6639/6639/6639 -f 6641/6641/6641 6639/6639/6639 6638/6638/6638 -g charts -o chart0000 -s off -f 6637/6637/6637 6638/6638/6638 6639/6639/6639 -f 6637/6637/6637 6639/6639/6639 6640/6640/6640 -f 6641/6641/6641 6642/6642/6642 6639/6639/6639 -f 6641/6641/6641 6639/6639/6639 6638/6638/6638 -v 9389 6260.99 -229.05 -vt 0.181629 0.435697 -v 9329 6260.99 -139.05 -vt 0.181133 0.434872 -v 8384 6260.99 -229.05 -vt 0.173317 0.435697 -v 8444 6260.99 -139.05 -vt 0.173813 0.434872 -o mesh1348 -s off -f 6643/6643/6643 6644/6644/6644 6645/6645/6645 -f 6646/6646/6646 6645/6645/6645 6644/6644/6644 -g charts -o chart0000 -s off -f 6643/6643/6643 6644/6644/6644 6645/6645/6645 -f 6646/6646/6646 6645/6645/6645 6644/6644/6644 -v 9329 6260.99 -139.05 -vt 0.31463 0.522983 -v 9389 6260.99 -229.05 -vt 0.315461 0.522259 -v 9389 6260.99 2538.45 -vt 0.315461 0.544518 -o mesh1349 -s off -f 6647/6647/6647 6648/6648/6648 6649/6649/6649 -g charts -o chart0000 -s off -f 6647/6647/6647 6648/6648/6648 6649/6649/6649 -v 9329 6260.99 -139.05 -vt 0.275561 0.998763 -v 9389 6260.99 2538.45 -vt 0.297174 0.998763 -v 9329 6260.99 2448.45 -vt 0.296437 0.997939 -o mesh1350 -s off -f 6650/6650/6650 6651/6651/6651 6652/6652/6652 -g charts -o chart0000 -s off -f 6650/6650/6650 6651/6651/6651 6652/6652/6652 -v 9329 6260.99 2448.45 -vt 0.436328 0.495878 -v 9389 6260.99 2538.45 -vt 0.436825 0.495054 -v 8444 6260.99 2448.45 -vt 0.429008 0.495878 -v 8384 6260.99 2538.45 -vt 0.428512 0.495054 -o mesh1351 -s off -f 6653/6653/6653 6654/6654/6654 6655/6655/6655 -f 6656/6656/6656 6655/6655/6655 6654/6654/6654 -g charts -o chart0000 -s off -f 6653/6653/6653 6654/6654/6654 6655/6655/6655 -f 6656/6656/6656 6655/6655/6655 6654/6654/6654 -v 8384 6260.99 -229.05 -vt 0.365337 0.848722 -v 8444 6260.99 -139.05 -vt 0.364607 0.847898 -v 8384 6260.99 2538.45 -vt 0.342893 0.848722 -o mesh1352 -s off -f 6657/6657/6657 6658/6658/6658 6659/6659/6659 -g charts -o chart0000 -s off -f 6657/6657/6657 6658/6658/6658 6659/6659/6659 -v 8384 6260.99 2538.45 -vt 0.0785536 0.701154 -v 8444 6260.99 -139.05 -vt 0.100166 0.701154 -v 8444 6260.99 2448.45 -vt 0.0792907 0.70033 -o mesh1353 -s off -f 6660/6660/6660 6661/6661/6661 6662/6662/6662 -g charts -o chart0000 -s off -f 6660/6660/6660 6661/6661/6661 6662/6662/6662 -v 8444 6380.99 2448.45 -vt 0.403574 0.890767 -v 8873.38 6320.99 2448.45 -vt 0.399945 0.891591 -v 8444 6260.99 2448.45 -vt 0.403574 0.892415 -v 9329 6380.99 2448.45 -vt 0.396093 0.890767 -v 8899.63 6320.99 2448.45 -vt 0.399723 0.891591 -v 8899.63 6305.99 2448.45 -vt 0.399723 0.891797 -v 8873.38 6305.99 2448.45 -vt 0.399945 0.891797 -v 9329 6260.99 2448.45 -vt 0.396093 0.892415 -o mesh1354 -s off -f 6663/6663/6663 6664/6664/6664 6665/6665/6665 -f 6664/6664/6664 6663/6663/6663 6666/6666/6666 -f 6664/6664/6664 6666/6666/6666 6667/6667/6667 -f 6667/6667/6667 6666/6666/6666 6668/6668/6668 -f 6665/6665/6665 6669/6669/6669 6670/6670/6670 -f 6669/6669/6669 6665/6665/6665 6664/6664/6664 -f 6670/6670/6670 6669/6669/6669 6668/6668/6668 -f 6670/6670/6670 6668/6668/6668 6666/6666/6666 -g charts -o chart0000 -s off -f 6663/6663/6663 6664/6664/6664 6665/6665/6665 -f 6664/6664/6664 6663/6663/6663 6666/6666/6666 -f 6664/6664/6664 6666/6666/6666 6667/6667/6667 -f 6667/6667/6667 6666/6666/6666 6668/6668/6668 -f 6665/6665/6665 6669/6669/6669 6670/6670/6670 -f 6669/6669/6669 6665/6665/6665 6664/6664/6664 -f 6670/6670/6670 6669/6669/6669 6668/6668/6668 -f 6670/6670/6670 6668/6668/6668 6666/6666/6666 -v 9329 6380.99 -139.05 -vt 0.194098 0.746496 -v 8444 6380.99 -139.05 -vt 0.201579 0.746496 -v 8444 6260.99 -139.05 -vt 0.201579 0.748145 -v 9329 6260.99 -139.05 -vt 0.194098 0.748145 -o mesh1355 -s off -f 6671/6671/6671 6672/6672/6672 6673/6673/6673 -f 6671/6671/6671 6673/6673/6673 6674/6674/6674 -g charts -o chart0000 -s off -f 6671/6671/6671 6672/6672/6672 6673/6673/6673 -f 6671/6671/6671 6673/6673/6673 6674/6674/6674 -v 8444 6380.99 -139.05 -vt 0.197423 0.855317 -v 8444 6260.99 2448.45 -vt 0.199086 0.875927 -v 8444 6260.99 -139.05 -vt 0.199086 0.855317 -v 8444 6305.99 1861.57 -vt 0.198462 0.871253 -v 8444 6320.99 1861.57 -vt 0.198254 0.871253 -v 8444 6320.99 1874.7 -vt 0.198254 0.871357 -v 8444 6320.99 1887.82 -vt 0.198254 0.871462 -v 8444 6305.99 1887.82 -vt 0.198462 0.871462 -v 8444 6380.99 2448.45 -vt 0.197423 0.875927 -o mesh1356 -s off -f 6675/6675/6675 6676/6676/6676 6677/6677/6677 -f 6676/6676/6676 6675/6675/6675 6678/6678/6678 -f 6678/6678/6678 6675/6675/6675 6679/6679/6679 -f 6679/6679/6679 6675/6675/6675 6680/6680/6680 -f 6680/6680/6680 6675/6675/6675 6681/6681/6681 -f 6676/6676/6676 6682/6682/6682 6683/6683/6683 -f 6682/6682/6682 6676/6676/6676 6678/6678/6678 -f 6683/6683/6683 6682/6682/6682 6681/6681/6681 -f 6683/6683/6683 6681/6681/6681 6675/6675/6675 -g charts -o chart0000 -s off -f 6675/6675/6675 6676/6676/6676 6677/6677/6677 -f 6676/6676/6676 6675/6675/6675 6678/6678/6678 -f 6678/6678/6678 6675/6675/6675 6679/6679/6679 -f 6679/6679/6679 6675/6675/6675 6680/6680/6680 -f 6680/6680/6680 6675/6675/6675 6681/6681/6681 -f 6676/6676/6676 6682/6682/6682 6683/6683/6683 -f 6682/6682/6682 6676/6676/6676 6678/6678/6678 -f 6683/6683/6683 6682/6682/6682 6681/6681/6681 -f 6683/6683/6683 6681/6681/6681 6675/6675/6675 -v 9329 6260.99 2448.45 -vt 0.790108 0.356554 -v 9329 6305.99 1887.82 -vt 0.789485 0.352088 -v 9329 6260.99 -139.05 -vt 0.790108 0.335944 -v 9329 6380.99 2448.45 -vt 0.788446 0.356554 -v 9329 6320.99 1887.82 -vt 0.789277 0.352088 -v 9329 6320.99 1874.7 -vt 0.789277 0.351984 -v 9329 6320.99 1861.57 -vt 0.789277 0.351879 -v 9329 6305.99 1861.57 -vt 0.789485 0.351879 -v 9329 6380.99 -139.05 -vt 0.788446 0.335944 -o mesh1357 -s off -f 6684/6684/6684 6685/6685/6685 6686/6686/6686 -f 6685/6685/6685 6684/6684/6684 6687/6687/6687 -f 6685/6685/6685 6687/6687/6687 6688/6688/6688 -f 6688/6688/6688 6687/6687/6687 6689/6689/6689 -f 6689/6689/6689 6687/6687/6687 6690/6690/6690 -f 6686/6686/6686 6691/6691/6691 6692/6692/6692 -f 6691/6691/6691 6686/6686/6686 6685/6685/6685 -f 6692/6692/6692 6691/6691/6691 6690/6690/6690 -f 6692/6692/6692 6690/6690/6690 6687/6687/6687 -g charts -o chart0000 -s off -f 6684/6684/6684 6685/6685/6685 6686/6686/6686 -f 6685/6685/6685 6684/6684/6684 6687/6687/6687 -f 6685/6685/6685 6687/6687/6687 6688/6688/6688 -f 6688/6688/6688 6687/6687/6687 6689/6689/6689 -f 6689/6689/6689 6687/6687/6687 6690/6690/6690 -f 6686/6686/6686 6691/6691/6691 6692/6692/6692 -f 6691/6691/6691 6686/6686/6686 6685/6685/6685 -f 6692/6692/6692 6691/6691/6691 6690/6690/6690 -f 6692/6692/6692 6690/6690/6690 6687/6687/6687 -v 9329 6320.99 1861.57 -vt 0.253117 0.956719 -v 9329 6305.99 1861.57 -vt 0.253117 0.955894 -v 8444 6305.99 1861.57 -vt 0.245636 0.955894 -v 8444 6320.99 1861.57 -vt 0.245636 0.956719 -o mesh1358 -s off -f 6693/6693/6693 6694/6694/6694 6695/6695/6695 -f 6693/6693/6693 6695/6695/6695 6696/6696/6696 -g charts -o chart0000 -s off -f 6693/6693/6693 6694/6694/6694 6695/6695/6695 -f 6693/6693/6693 6695/6695/6695 6696/6696/6696 -v 8444 6305.99 1861.57 -vt 0.806733 0.971558 -v 9329 6305.99 1861.57 -vt 0.806733 0.978978 -v 9329 6305.99 1887.82 -vt 0.80651 0.978978 -v 8899.63 6305.99 1887.82 -vt 0.80651 0.975378 -v 8899.63 6305.99 2448.45 -vt 0.801746 0.975378 -v 8873.38 6305.99 2448.45 -vt 0.801746 0.975158 -v 8444 6305.99 1861.57 -vt 0.646301 0.964963 -v 8873.38 6305.99 2448.45 -vt 0.646301 0.959192 -v 8873.38 6305.99 1887.82 -vt 0.642976 0.962783 -v 8444 6305.99 1861.57 -vt 0.805902 0.717642 -v 8873.38 6305.99 1887.82 -vt 0.805071 0.71352 -v 8444 6305.99 1887.82 -vt 0.805071 0.717642 -o mesh1359 -s off -f 6697/6697/6697 6698/6698/6698 6699/6699/6699 -f 6697/6697/6697 6699/6699/6699 6700/6700/6700 -f 6697/6697/6697 6700/6700/6700 6701/6701/6701 -f 6697/6697/6697 6701/6701/6701 6702/6702/6702 -f 6703/6703/6703 6704/6704/6704 6705/6705/6705 -f 6706/6706/6706 6707/6707/6707 6708/6708/6708 -g charts -o chart0000 -s off -f 6697/6697/6697 6698/6698/6698 6699/6699/6699 -f 6697/6697/6697 6699/6699/6699 6700/6700/6700 -f 6697/6697/6697 6700/6700/6700 6701/6701/6701 -f 6697/6697/6697 6701/6701/6701 6702/6702/6702 -o chart0001 -s off -f 6703/6703/6703 6704/6704/6704 6705/6705/6705 -o chart0002 -s off -f 6706/6706/6706 6707/6707/6707 6708/6708/6708 -v 8444 6305.99 1887.82 -vt 0.437656 0.148805 -v 8873.38 6305.99 1887.82 -vt 0.4335 0.148805 -v 8873.38 6320.99 1887.82 -vt 0.4335 0.14798 -v 8444 6320.99 1887.82 -vt 0.437656 0.14798 -o mesh1360 -s off -f 6709/6709/6709 6710/6710/6710 6711/6711/6711 -f 6709/6709/6709 6711/6711/6711 6712/6712/6712 -g charts -o chart0000 -s off -f 6709/6709/6709 6710/6710/6710 6711/6711/6711 -f 6709/6709/6709 6711/6711/6711 6712/6712/6712 -v 9329 6320.99 1887.82 -vt 0.1859 0.432399 -v 9329 6320.99 1874.7 -vt 0.185786 0.432399 -v 8444 6320.99 1874.7 -vt 0.185786 0.424979 -v 8444 6320.99 1887.82 -vt 0.1859 0.424979 -v 8873.38 6320.99 1887.82 -vt 0.1859 0.428579 -v 8873.38 6320.99 2448.45 -vt 0.190773 0.428579 -v 8899.63 6320.99 2448.45 -vt 0.190773 0.428799 -v 9329 6320.99 1887.82 -vt 0.203242 0.448063 -v 8899.63 6320.99 2448.45 -vt 0.207398 0.453009 -v 8899.63 6320.99 1887.82 -vt 0.207398 0.448063 -o mesh1361 -s off -f 6713/6713/6713 6714/6714/6714 6715/6715/6715 -f 6713/6713/6713 6715/6715/6715 6716/6716/6716 -f 6713/6713/6713 6716/6716/6716 6717/6717/6717 -f 6713/6713/6713 6717/6717/6717 6718/6718/6718 -f 6713/6713/6713 6718/6718/6718 6719/6719/6719 -f 6720/6720/6720 6721/6721/6721 6722/6722/6722 -g charts -o chart0000 -s off -f 6713/6713/6713 6714/6714/6714 6715/6715/6715 -f 6713/6713/6713 6715/6715/6715 6716/6716/6716 -f 6713/6713/6713 6716/6716/6716 6717/6717/6717 -f 6713/6713/6713 6717/6717/6717 6718/6718/6718 -f 6713/6713/6713 6718/6718/6718 6719/6719/6719 -o chart0001 -s off -f 6720/6720/6720 6721/6721/6721 6722/6722/6722 -v 9329 6320.99 1874.7 -vt 0.487531 0.622836 -v 9329 6320.99 1861.57 -vt 0.4867 0.622836 -v 8444 6320.99 1861.57 -vt 0.4867 0.615416 -v 8444 6320.99 1874.7 -vt 0.487531 0.615416 -o mesh1362 -s off -f 6723/6723/6723 6724/6724/6724 6725/6725/6725 -f 6723/6723/6723 6725/6725/6725 6726/6726/6726 -g charts -o chart0000 -s off -f 6723/6723/6723 6724/6724/6724 6725/6725/6725 -f 6723/6723/6723 6725/6725/6725 6726/6726/6726 -v 9329 6320.99 1887.82 -vt 0.184123 0.800082 -v 8899.63 6320.99 1887.82 -vt 0.184123 0.804204 -v 8899.63 6305.99 1887.82 -vt 0.184954 0.804204 -v 9329 6305.99 1887.82 -vt 0.184954 0.800082 -o mesh1363 -s off -f 6727/6727/6727 6728/6728/6728 6729/6729/6729 -f 6727/6727/6727 6729/6729/6729 6730/6730/6730 -g charts -o chart0000 -s off -f 6727/6727/6727 6728/6728/6728 6729/6729/6729 -f 6727/6727/6727 6729/6729/6729 6730/6730/6730 -v 8899.63 6305.99 1887.82 -vt 0.0361596 0.443116 -v 8899.63 6320.99 1887.82 -vt 0.0369908 0.443116 -v 8899.63 6320.99 2448.45 -vt 0.0369908 0.43817 -v 8899.63 6305.99 2448.45 -vt 0.0361596 0.43817 -o mesh1364 -s off -f 6731/6731/6731 6732/6732/6732 6733/6733/6733 -f 6731/6731/6731 6733/6733/6733 6734/6734/6734 -g charts -o chart0000 -s off -f 6731/6731/6731 6732/6732/6732 6733/6733/6733 -f 6731/6731/6731 6733/6733/6733 6734/6734/6734 -v 8873.38 6320.99 1887.82 -vt 0.643807 0.821517 -v 8873.38 6305.99 1887.82 -vt 0.644638 0.821517 -v 8873.38 6305.99 2448.45 -vt 0.644638 0.81657 -v 8873.38 6320.99 2448.45 -vt 0.643807 0.81657 -o mesh1365 -s off -f 6735/6735/6735 6736/6736/6736 6737/6737/6737 -f 6735/6735/6735 6737/6737/6737 6738/6738/6738 -g charts -o chart0000 -s off -f 6735/6735/6735 6736/6736/6736 6737/6737/6737 -f 6735/6735/6735 6737/6737/6737 6738/6738/6738 -v -6933.5 275.99 -285.3 -vt 0.976309 0.0276175 -v -6933.5 313.49 -229.05 -vt 0.97714 0.0279324 -v -6933.5 1355.99 -285.3 -vt 0.976309 0.0366858 -v -6933.5 1318.49 -229.05 -vt 0.97714 0.036371 -o mesh1366 -s off -f 6739/6739/6739 6740/6740/6740 6741/6741/6741 -f 6742/6742/6742 6741/6741/6741 6740/6740/6740 -g charts -o chart0000 -s off -f 6739/6739/6739 6740/6740/6740 6741/6741/6741 -f 6742/6742/6742 6741/6741/6741 6740/6740/6740 -v -6933.5 313.49 -229.05 -vt 0.921901 0.419209 -v -6933.5 275.99 -285.3 -vt 0.921446 0.420033 -v -6933.5 275.99 2594.7 -vt 0.944721 0.420033 -o mesh1367 -s off -f 6743/6743/6743 6744/6744/6744 6745/6745/6745 -g charts -o chart0000 -s off -f 6743/6743/6743 6744/6744/6744 6745/6745/6745 -v -6933.5 313.49 -229.05 -vt 0.00457182 0.848722 -v -6933.5 275.99 2594.7 -vt 0.00457182 0.870981 -v -6933.5 313.49 2538.45 -vt 0.00374065 0.870534 -o mesh1368 -s off -f 6746/6746/6746 6747/6747/6747 6748/6748/6748 -g charts -o chart0000 -s off -f 6746/6746/6746 6747/6747/6747 6748/6748/6748 -v -6933.5 313.49 2538.45 -vt 0.27671 0.424979 -v -6933.5 275.99 2594.7 -vt 0.276392 0.425804 -v -6933.5 1318.49 2538.45 -vt 0.285219 0.424979 -v -6933.5 1355.99 2594.7 -vt 0.285536 0.425804 -o mesh1369 -s off -f 6749/6749/6749 6750/6750/6750 6751/6751/6751 -f 6752/6752/6752 6751/6751/6751 6750/6750/6750 -g charts -o chart0000 -s off -f 6749/6749/6749 6750/6750/6750 6751/6751/6751 -f 6752/6752/6752 6751/6751/6751 6750/6750/6750 -v -6933.5 1355.99 -285.3 -vt 0.0220282 0.369744 -v -6933.5 1318.49 -229.05 -vt 0.021197 0.369294 -v -6933.5 1355.99 2594.7 -vt 0.0220282 0.346661 -o mesh1370 -s off -f 6753/6753/6753 6754/6754/6754 6755/6755/6755 -g charts -o chart0000 -s off -f 6753/6753/6753 6754/6754/6754 6755/6755/6755 -v -6933.5 1355.99 2594.7 -vt 0.207398 0.300495 -v -6933.5 1318.49 -229.05 -vt 0.229842 0.300495 -v -6933.5 1318.49 2538.45 -vt 0.207849 0.29967 -o mesh1371 -s off -f 6756/6756/6756 6757/6757/6757 6758/6758/6758 -g charts -o chart0000 -s off -f 6756/6756/6756 6757/6757/6757 6758/6758/6758 -v -6768.5 1355.99 -285.3 -vt 0.898171 0.469497 -v -6768.5 1318.49 -229.05 -vt 0.89734 0.469182 -v -6768.5 275.99 -285.3 -vt 0.898171 0.460429 -v -6768.5 313.49 -229.05 -vt 0.89734 0.460744 -o mesh1372 -s off -f 6759/6759/6759 6760/6760/6760 6761/6761/6761 -f 6762/6762/6762 6761/6761/6761 6760/6760/6760 -g charts -o chart0000 -s off -f 6759/6759/6759 6760/6760/6760 6761/6761/6761 -f 6762/6762/6762 6761/6761/6761 6760/6760/6760 -v -6768.5 1318.49 -229.05 -vt 0.330878 0.488458 -v -6768.5 1355.99 -285.3 -vt 0.330424 0.489283 -v -6768.5 1355.99 2594.7 -vt 0.353699 0.489283 -o mesh1373 -s off -f 6763/6763/6763 6764/6764/6764 6765/6765/6765 -g charts -o chart0000 -s off -f 6763/6763/6763 6764/6764/6764 6765/6765/6765 -v -6768.5 1318.49 -229.05 -vt 0.430175 0.150453 -v -6768.5 1355.99 2594.7 -vt 0.452618 0.150453 -v -6768.5 1318.49 2538.45 -vt 0.452167 0.149629 -o mesh1374 -s off -f 6766/6766/6766 6767/6767/6767 6768/6768/6768 -g charts -o chart0000 -s off -f 6766/6766/6766 6767/6767/6767 6768/6768/6768 -v -6768.5 1318.49 2538.45 -vt 0.64349 0.678895 -v -6768.5 1355.99 2594.7 -vt 0.643807 0.678071 -v -6768.5 313.49 2538.45 -vt 0.634981 0.678895 -v -6768.5 275.99 2594.7 -vt 0.634663 0.678071 -o mesh1375 -s off -f 6769/6769/6769 6770/6770/6770 6771/6771/6771 -f 6772/6772/6772 6771/6771/6771 6770/6770/6770 -g charts -o chart0000 -s off -f 6769/6769/6769 6770/6770/6770 6771/6771/6771 -f 6772/6772/6772 6771/6771/6771 6770/6770/6770 -v -6768.5 275.99 -285.3 -vt 0.236492 0.66488 -v -6768.5 313.49 -229.05 -vt 0.235661 0.66443 -v -6768.5 275.99 2594.7 -vt 0.236492 0.641797 -o mesh1376 -s off -f 6773/6773/6773 6774/6774/6774 6775/6775/6775 -g charts -o chart0000 -s off -f 6773/6773/6773 6774/6774/6774 6775/6775/6775 -v -6768.5 275.99 2594.7 -vt 0.919784 0.184254 -v -6768.5 313.49 -229.05 -vt 0.919784 0.206513 -v -6768.5 313.49 2538.45 -vt 0.918953 0.184701 -o mesh1377 -s off -f 6776/6776/6776 6777/6777/6777 6778/6778/6778 -g charts -o chart0000 -s off -f 6776/6776/6776 6777/6777/6777 6778/6778/6778 -v -6933.5 1355.99 2594.7 -vt 0.504988 0.594806 -v -6933.5 275.99 2594.7 -vt 0.514131 0.594806 -v -6768.5 275.99 2594.7 -vt 0.514131 0.596455 -v -6768.5 1355.99 2594.7 -vt 0.504988 0.596455 -o mesh1378 -s off -f 6779/6779/6779 6780/6780/6780 6781/6781/6781 -f 6779/6779/6779 6781/6781/6781 6782/6782/6782 -g charts -o chart0000 -s off -f 6779/6779/6779 6780/6780/6780 6781/6781/6781 -f 6779/6779/6779 6781/6781/6781 6782/6782/6782 -v -6933.5 275.99 2594.7 -vt 0.726101 0.641797 -v -6933.5 275.99 -285.3 -vt 0.726101 0.66488 -v -6768.5 275.99 -285.3 -vt 0.727764 0.66488 -v -6768.5 275.99 2594.7 -vt 0.727764 0.641797 -o mesh1379 -s off -f 6783/6783/6783 6784/6784/6784 6785/6785/6785 -f 6783/6783/6783 6785/6785/6785 6786/6786/6786 -g charts -o chart0000 -s off -f 6783/6783/6783 6784/6784/6784 6785/6785/6785 -f 6783/6783/6783 6785/6785/6785 6786/6786/6786 -v -6933.5 275.99 -285.3 -vt 0.435993 0.308739 -v -6933.5 1355.99 -285.3 -vt 0.435993 0.29967 -v -6768.5 1355.99 -285.3 -vt 0.434331 0.29967 -v -6768.5 275.99 -285.3 -vt 0.434331 0.308739 -o mesh1380 -s off -f 6787/6787/6787 6788/6788/6788 6789/6789/6789 -f 6787/6787/6787 6789/6789/6789 6790/6790/6790 -g charts -o chart0000 -s off -f 6787/6787/6787 6788/6788/6788 6789/6789/6789 -f 6787/6787/6787 6789/6789/6789 6790/6790/6790 -v -6933.5 1355.99 -285.3 -vt 0.690357 0.626133 -v -6933.5 1355.99 2594.7 -vt 0.690357 0.60305 -v -6768.5 1355.99 2594.7 -vt 0.688695 0.60305 -v -6768.5 1355.99 -285.3 -vt 0.688695 0.626133 -o mesh1381 -s off -f 6791/6791/6791 6792/6792/6792 6793/6793/6793 -f 6791/6791/6791 6793/6793/6793 6794/6794/6794 -g charts -o chart0000 -s off -f 6791/6791/6791 6792/6792/6792 6793/6793/6793 -f 6791/6791/6791 6793/6793/6793 6794/6794/6794 -v -6768.5 1318.49 -229.05 -vt 0.076891 0.377988 -v -6813.5 1318.49 -229.05 -vt 0.076891 0.377539 -v -6813.5 313.49 -229.05 -vt 0.0685786 0.377539 -v -6768.5 313.49 -229.05 -vt 0.0685786 0.377988 -v -6933.5 1318.49 -229.05 -vt 0.076891 0.37634 -v -6933.5 313.49 -229.05 -vt 0.0685786 0.37634 -o mesh1382 -s off -f 6795/6795/6795 6796/6796/6796 6797/6797/6797 -f 6795/6795/6795 6797/6797/6797 6798/6798/6798 -f 6799/6799/6799 6800/6800/6800 6797/6797/6797 -f 6799/6799/6799 6797/6797/6797 6796/6796/6796 -g charts -o chart0000 -s off -f 6795/6795/6795 6796/6796/6796 6797/6797/6797 -f 6795/6795/6795 6797/6797/6797 6798/6798/6798 -f 6799/6799/6799 6800/6800/6800 6797/6797/6797 -f 6799/6799/6799 6797/6797/6797 6796/6796/6796 -v -6768.5 313.49 -229.05 -vt 0.849127 0.0721351 -v -6813.5 313.49 -229.05 -vt 0.849581 0.0721351 -v -6813.5 313.49 2538.45 -vt 0.849581 0.0498763 -v -6768.5 313.49 2538.45 -vt 0.849127 0.0498763 -v -6933.5 313.49 -229.05 -vt 0.85079 0.0721351 -v -6933.5 313.49 2538.45 -vt 0.85079 0.0498763 -o mesh1383 -s off -f 6801/6801/6801 6802/6802/6802 6803/6803/6803 -f 6801/6801/6801 6803/6803/6803 6804/6804/6804 -f 6805/6805/6805 6806/6806/6806 6803/6803/6803 -f 6805/6805/6805 6803/6803/6803 6802/6802/6802 -g charts -o chart0000 -s off -f 6801/6801/6801 6802/6802/6802 6803/6803/6803 -f 6801/6801/6801 6803/6803/6803 6804/6804/6804 -f 6805/6805/6805 6806/6806/6806 6803/6803/6803 -f 6805/6805/6805 6803/6803/6803 6802/6802/6802 -v -6768.5 313.49 2538.45 -vt 0.899002 0.0300907 -v -6813.5 313.49 2538.45 -vt 0.899002 0.0305404 -v -6813.5 1318.49 2538.45 -vt 0.89069 0.0305404 -v -6768.5 1318.49 2538.45 -vt 0.89069 0.0300907 -v -6933.5 313.49 2538.45 -vt 0.899002 0.0317394 -v -6933.5 1318.49 2538.45 -vt 0.89069 0.0317394 -o mesh1384 -s off -f 6807/6807/6807 6808/6808/6808 6809/6809/6809 -f 6807/6807/6807 6809/6809/6809 6810/6810/6810 -f 6811/6811/6811 6812/6812/6812 6809/6809/6809 -f 6811/6811/6811 6809/6809/6809 6808/6808/6808 -g charts -o chart0000 -s off -f 6807/6807/6807 6808/6808/6808 6809/6809/6809 -f 6807/6807/6807 6809/6809/6809 6810/6810/6810 -f 6811/6811/6811 6812/6812/6812 6809/6809/6809 -f 6811/6811/6811 6809/6809/6809 6808/6808/6808 -v -6768.5 1318.49 2538.45 -vt 0.938071 0.424979 -v -6813.5 1318.49 2538.45 -vt 0.938071 0.42453 -v -6813.5 1318.49 -229.05 -vt 0.915628 0.42453 -v -6768.5 1318.49 -229.05 -vt 0.915628 0.424979 -v -6933.5 1318.49 2538.45 -vt 0.938071 0.423331 -v -6933.5 1318.49 -229.05 -vt 0.915628 0.423331 -o mesh1385 -s off -f 6813/6813/6813 6814/6814/6814 6815/6815/6815 -f 6813/6813/6813 6815/6815/6815 6816/6816/6816 -f 6817/6817/6817 6818/6818/6818 6815/6815/6815 -f 6817/6817/6817 6815/6815/6815 6814/6814/6814 -g charts -o chart0000 -s off -f 6813/6813/6813 6814/6814/6814 6815/6815/6815 -f 6813/6813/6813 6815/6815/6815 6816/6816/6816 -f 6817/6817/6817 6818/6818/6818 6815/6815/6815 -f 6817/6817/6817 6815/6815/6815 6814/6814/6814 -v -6813.5 1318.49 -229.05 -vt 0.560682 0.305441 -v -6813.5 1258.49 -139.05 -vt 0.560185 0.304617 -v -6813.5 313.49 -229.05 -vt 0.552369 0.305441 -v -6813.5 373.49 -139.05 -vt 0.552865 0.304617 -o mesh1386 -s off -f 6819/6819/6819 6820/6820/6820 6821/6821/6821 -f 6822/6822/6822 6821/6821/6821 6820/6820/6820 -g charts -o chart0000 -s off -f 6819/6819/6819 6820/6820/6820 6821/6821/6821 -f 6822/6822/6822 6821/6821/6821 6820/6820/6820 -v -6813.5 1258.49 -139.05 -vt 0.00124688 0.784318 -v -6813.5 1318.49 -229.05 -vt 0.00207805 0.783594 -v -6813.5 1318.49 2538.45 -vt 0.00207805 0.805853 -o mesh1387 -s off -f 6823/6823/6823 6824/6824/6824 6825/6825/6825 -g charts -o chart0000 -s off -f 6823/6823/6823 6824/6824/6824 6825/6825/6825 -v -6813.5 1258.49 -139.05 -vt 0.537407 0.821517 -v -6813.5 1318.49 2538.45 -vt 0.559019 0.821517 -v -6813.5 1258.49 2448.45 -vt 0.558282 0.820692 -o mesh1388 -s off -f 6826/6826/6826 6827/6827/6827 6828/6828/6828 -g charts -o chart0000 -s off -f 6826/6826/6826 6827/6827/6827 6828/6828/6828 -v -6813.5 1258.49 2448.45 -vt 0.955863 0.565128 -v -6813.5 1318.49 2538.45 -vt 0.956359 0.564303 -v -6813.5 373.49 2448.45 -vt 0.948543 0.565128 -v -6813.5 313.49 2538.45 -vt 0.948047 0.564303 -o mesh1389 -s off -f 6829/6829/6829 6830/6830/6830 6831/6831/6831 -f 6832/6832/6832 6831/6831/6831 6830/6830/6830 -g charts -o chart0000 -s off -f 6829/6829/6829 6830/6830/6830 6831/6831/6831 -f 6832/6832/6832 6831/6831/6831 6830/6830/6830 -v -6813.5 313.49 -229.05 -vt 0.902327 0.393652 -v -6813.5 373.49 -139.05 -vt 0.901598 0.392828 -v -6813.5 313.49 2538.45 -vt 0.879884 0.393652 -o mesh1390 -s off -f 6833/6833/6833 6834/6834/6834 6835/6835/6835 -g charts -o chart0000 -s off -f 6833/6833/6833 6834/6834/6834 6835/6835/6835 -v -6813.5 313.49 2538.45 -vt 0.363674 0.325227 -v -6813.5 373.49 -139.05 -vt 0.363674 0.346661 -v -6813.5 373.49 2448.45 -vt 0.362843 0.325958 -o mesh1391 -s off -f 6836/6836/6836 6837/6837/6837 6838/6838/6838 -g charts -o chart0000 -s off -f 6836/6836/6836 6837/6837/6837 6838/6838/6838 -v -6933.5 373.49 2448.45 -vt 0.00623433 0.504122 -v -6873.5 802.865 2448.45 -vt 0.00540312 0.500522 -v -6813.5 373.49 2448.45 -vt 0.0045719 0.504122 -v -6933.5 1258.49 2448.45 -vt 0.00623433 0.496702 -v -6873.5 829.115 2448.45 -vt 0.00540312 0.500302 -v -6858.5 829.115 2448.45 -vt 0.00519531 0.500302 -v -6858.5 802.865 2448.45 -vt 0.00519531 0.500522 -v -6813.5 1258.49 2448.45 -vt 0.0045719 0.496702 -o mesh1392 -s off -f 6839/6839/6839 6840/6840/6840 6841/6841/6841 -f 6840/6840/6840 6839/6839/6839 6842/6842/6842 -f 6840/6840/6840 6842/6842/6842 6843/6843/6843 -f 6843/6843/6843 6842/6842/6842 6844/6844/6844 -f 6841/6841/6841 6845/6845/6845 6846/6846/6846 -f 6845/6845/6845 6841/6841/6841 6840/6840/6840 -f 6846/6846/6846 6845/6845/6845 6844/6844/6844 -f 6846/6846/6846 6844/6844/6844 6842/6842/6842 -g charts -o chart0000 -s off -f 6839/6839/6839 6840/6840/6840 6841/6841/6841 -f 6840/6840/6840 6839/6839/6839 6842/6842/6842 -f 6840/6840/6840 6842/6842/6842 6843/6843/6843 -f 6843/6843/6843 6842/6842/6842 6844/6844/6844 -f 6841/6841/6841 6845/6845/6845 6846/6846/6846 -f 6845/6845/6845 6841/6841/6841 6840/6840/6840 -f 6846/6846/6846 6845/6845/6845 6844/6844/6844 -f 6846/6846/6846 6844/6844/6844 6842/6842/6842 -v -6933.5 1258.49 -139.05 -vt 0.925603 0.234542 -v -6933.5 373.49 -139.05 -vt 0.925603 0.241962 -v -6813.5 373.49 -139.05 -vt 0.927265 0.241962 -v -6813.5 1258.49 -139.05 -vt 0.927265 0.234542 -o mesh1393 -s off -f 6847/6847/6847 6848/6848/6848 6849/6849/6849 -f 6847/6847/6847 6849/6849/6849 6850/6850/6850 -g charts -o chart0000 -s off -f 6847/6847/6847 6848/6848/6848 6849/6849/6849 -f 6847/6847/6847 6849/6849/6849 6850/6850/6850 -v -6933.5 373.49 -139.05 -vt 0.794264 0.97568 -v -6813.5 373.49 2448.45 -vt 0.792602 0.95507 -v -6813.5 373.49 -139.05 -vt 0.792602 0.97568 -v -6858.5 373.49 1861.57 -vt 0.793225 0.959745 -v -6873.5 373.49 1861.57 -vt 0.793433 0.959745 -v -6873.5 373.49 1874.7 -vt 0.793433 0.95964 -v -6873.5 373.49 1887.82 -vt 0.793433 0.959536 -v -6858.5 373.49 1887.82 -vt 0.793225 0.959536 -v -6933.5 373.49 2448.45 -vt 0.794264 0.95507 -o mesh1394 -s off -f 6851/6851/6851 6852/6852/6852 6853/6853/6853 -f 6852/6852/6852 6851/6851/6851 6854/6854/6854 -f 6854/6854/6854 6851/6851/6851 6855/6855/6855 -f 6855/6855/6855 6851/6851/6851 6856/6856/6856 -f 6856/6856/6856 6851/6851/6851 6857/6857/6857 -f 6852/6852/6852 6858/6858/6858 6859/6859/6859 -f 6858/6858/6858 6852/6852/6852 6854/6854/6854 -f 6859/6859/6859 6858/6858/6858 6857/6857/6857 -f 6859/6859/6859 6857/6857/6857 6851/6851/6851 -g charts -o chart0000 -s off -f 6851/6851/6851 6852/6852/6852 6853/6853/6853 -f 6852/6852/6852 6851/6851/6851 6854/6854/6854 -f 6854/6854/6854 6851/6851/6851 6855/6855/6855 -f 6855/6855/6855 6851/6851/6851 6856/6856/6856 -f 6856/6856/6856 6851/6851/6851 6857/6857/6857 -f 6852/6852/6852 6858/6858/6858 6859/6859/6859 -f 6858/6858/6858 6852/6852/6852 6854/6854/6854 -f 6859/6859/6859 6858/6858/6858 6857/6857/6857 -f 6859/6859/6859 6857/6857/6857 6851/6851/6851 -v -6813.5 1258.49 2448.45 -vt 0.333749 0.444765 -v -6858.5 1258.49 1887.82 -vt 0.329246 0.445383 -v -6813.5 1258.49 -139.05 -vt 0.312968 0.444765 -v -6933.5 1258.49 2448.45 -vt 0.333749 0.446414 -v -6873.5 1258.49 1887.82 -vt 0.329246 0.445589 -v -6873.5 1258.49 1874.7 -vt 0.329141 0.445589 -v -6873.5 1258.49 1861.57 -vt 0.329035 0.445589 -v -6858.5 1258.49 1861.57 -vt 0.329035 0.445383 -v -6933.5 1258.49 -139.05 -vt 0.312968 0.446414 -o mesh1395 -s off -f 6860/6860/6860 6861/6861/6861 6862/6862/6862 -f 6861/6861/6861 6860/6860/6860 6863/6863/6863 -f 6861/6861/6861 6863/6863/6863 6864/6864/6864 -f 6864/6864/6864 6863/6863/6863 6865/6865/6865 -f 6865/6865/6865 6863/6863/6863 6866/6866/6866 -f 6862/6862/6862 6867/6867/6867 6868/6868/6868 -f 6867/6867/6867 6862/6862/6862 6861/6861/6861 -f 6868/6868/6868 6867/6867/6867 6866/6866/6866 -f 6868/6868/6868 6866/6866/6866 6863/6863/6863 -g charts -o chart0000 -s off -f 6860/6860/6860 6861/6861/6861 6862/6862/6862 -f 6861/6861/6861 6860/6860/6860 6863/6863/6863 -f 6861/6861/6861 6863/6863/6863 6864/6864/6864 -f 6864/6864/6864 6863/6863/6863 6865/6865/6865 -f 6865/6865/6865 6863/6863/6863 6866/6866/6866 -f 6862/6862/6862 6867/6867/6867 6868/6868/6868 -f 6867/6867/6867 6862/6862/6862 6861/6861/6861 -f 6868/6868/6868 6867/6867/6867 6866/6866/6866 -f 6868/6868/6868 6866/6866/6866 6863/6863/6863 -v -6873.5 1258.49 1861.57 -vt 0.612219 0.786067 -v -6858.5 1258.49 1861.57 -vt 0.611388 0.786067 -v -6858.5 373.49 1861.57 -vt 0.611388 0.778648 -v -6873.5 373.49 1861.57 -vt 0.612219 0.778648 -o mesh1396 -s off -f 6869/6869/6869 6870/6870/6870 6871/6871/6871 -f 6869/6869/6869 6871/6871/6871 6872/6872/6872 -g charts -o chart0000 -s off -f 6869/6869/6869 6870/6870/6870 6871/6871/6871 -f 6869/6869/6869 6871/6871/6871 6872/6872/6872 -v -6858.5 373.49 1861.57 -vt 0.195761 0.653339 -v -6858.5 1258.49 1861.57 -vt 0.203242 0.653339 -v -6858.5 1258.49 1887.82 -vt 0.203242 0.653117 -v -6858.5 829.115 1887.82 -vt 0.199612 0.653117 -v -6858.5 829.115 2448.45 -vt 0.199612 0.648392 -v -6858.5 802.865 2448.45 -vt 0.19939 0.648392 -v -6858.5 373.49 1861.57 -vt 0.943059 0.344188 -v -6858.5 802.865 2448.45 -vt 0.943059 0.338417 -v -6858.5 802.865 1887.82 -vt 0.939734 0.342008 -v -6858.5 373.49 1861.57 -vt 0.36783 0.772053 -v -6858.5 802.865 1887.82 -vt 0.371987 0.772053 -v -6858.5 373.49 1887.82 -vt 0.367846 0.771228 -o mesh1397 -s off -f 6873/6873/6873 6874/6874/6874 6875/6875/6875 -f 6873/6873/6873 6875/6875/6875 6876/6876/6876 -f 6873/6873/6873 6876/6876/6876 6877/6877/6877 -f 6873/6873/6873 6877/6877/6877 6878/6878/6878 -f 6879/6879/6879 6880/6880/6880 6881/6881/6881 -f 6882/6882/6882 6883/6883/6883 6884/6884/6884 -g charts -o chart0000 -s off -f 6873/6873/6873 6874/6874/6874 6875/6875/6875 -f 6873/6873/6873 6875/6875/6875 6876/6876/6876 -f 6873/6873/6873 6876/6876/6876 6877/6877/6877 -f 6873/6873/6873 6877/6877/6877 6878/6878/6878 -o chart0001 -s off -f 6879/6879/6879 6880/6880/6880 6881/6881/6881 -o chart0002 -s off -f 6882/6882/6882 6883/6883/6883 6884/6884/6884 -v -6858.5 373.49 1887.82 -vt 0.825021 0.989695 -v -6858.5 802.865 1887.82 -vt 0.825021 0.985573 -v -6873.5 802.865 1887.82 -vt 0.82419 0.985573 -v -6873.5 373.49 1887.82 -vt 0.82419 0.989695 -o mesh1398 -s off -f 6885/6885/6885 6886/6886/6886 6887/6887/6887 -f 6885/6885/6885 6887/6887/6887 6888/6888/6888 -g charts -o chart0000 -s off -f 6885/6885/6885 6886/6886/6886 6887/6887/6887 -f 6885/6885/6885 6887/6887/6887 6888/6888/6888 -v -6873.5 1258.49 1887.82 -vt 0.504156 0.984037 -v -6873.5 1258.49 1874.7 -vt 0.504156 0.983924 -v -6873.5 373.49 1874.7 -vt 0.496675 0.983924 -v -6873.5 373.49 1887.82 -vt 0.496675 0.984037 -v -6873.5 802.865 1887.82 -vt 0.500305 0.984037 -v -6873.5 802.865 2448.45 -vt 0.500305 0.98887 -v -6873.5 829.115 2448.45 -vt 0.500527 0.98887 -v -6873.5 1258.49 1887.82 -vt 0.975478 0.997114 -v -6873.5 829.115 2448.45 -vt 0.969659 0.997114 -v -6873.5 829.115 1887.82 -vt 0.973327 0.993817 -o mesh1399 -s off -f 6889/6889/6889 6890/6890/6890 6891/6891/6891 -f 6889/6889/6889 6891/6891/6891 6892/6892/6892 -f 6889/6889/6889 6892/6892/6892 6893/6893/6893 -f 6889/6889/6889 6893/6893/6893 6894/6894/6894 -f 6889/6889/6889 6894/6894/6894 6895/6895/6895 -f 6896/6896/6896 6897/6897/6897 6898/6898/6898 -g charts -o chart0000 -s off -f 6889/6889/6889 6890/6890/6890 6891/6891/6891 -f 6889/6889/6889 6891/6891/6891 6892/6892/6892 -f 6889/6889/6889 6892/6892/6892 6893/6893/6893 -f 6889/6889/6889 6893/6893/6893 6894/6894/6894 -f 6889/6889/6889 6894/6894/6894 6895/6895/6895 -o chart0001 -s off -f 6896/6896/6896 6897/6897/6897 6898/6898/6898 -v -6873.5 1258.49 1874.7 -vt 0.0270157 0.252679 -v -6873.5 1258.49 1861.57 -vt 0.0261845 0.252679 -v -6873.5 373.49 1861.57 -vt 0.0261845 0.24526 -v -6873.5 373.49 1874.7 -vt 0.0270157 0.24526 -o mesh1400 -s off -f 6899/6899/6899 6900/6900/6900 6901/6901/6901 -f 6899/6899/6899 6901/6901/6901 6902/6902/6902 -g charts -o chart0000 -s off -f 6899/6899/6899 6900/6900/6900 6901/6901/6901 -f 6899/6899/6899 6901/6901/6901 6902/6902/6902 -v -6873.5 1258.49 1887.82 -vt 0.851621 0.905606 -v -6873.5 829.115 1887.82 -vt 0.855777 0.905606 -v -6858.5 829.115 1887.82 -vt 0.855777 0.90643 -v -6858.5 1258.49 1887.82 -vt 0.851621 0.90643 -o mesh1401 -s off -f 6903/6903/6903 6904/6904/6904 6905/6905/6905 -f 6903/6903/6903 6905/6905/6905 6906/6906/6906 -g charts -o chart0000 -s off -f 6903/6903/6903 6904/6904/6904 6905/6905/6905 -f 6903/6903/6903 6905/6905/6905 6906/6906/6906 -v -6858.5 829.115 1887.82 -vt 0.283874 0.974856 -v -6873.5 829.115 1887.82 -vt 0.283874 0.97568 -v -6873.5 829.115 2448.45 -vt 0.278886 0.97568 -v -6858.5 829.115 2448.45 -vt 0.278886 0.974856 -o mesh1402 -s off -f 6907/6907/6907 6908/6908/6908 6909/6909/6909 -f 6907/6907/6907 6909/6909/6909 6910/6910/6910 -g charts -o chart0000 -s off -f 6907/6907/6907 6908/6908/6908 6909/6909/6909 -f 6907/6907/6907 6909/6909/6909 6910/6910/6910 -v -6873.5 802.865 1887.82 -vt 0.0976724 0.487634 -v -6858.5 802.865 1887.82 -vt 0.0976724 0.488458 -v -6858.5 802.865 2448.45 -vt 0.092685 0.488458 -v -6873.5 802.865 2448.45 -vt 0.092685 0.487634 -o mesh1403 -s off -f 6911/6911/6911 6912/6912/6912 6913/6913/6913 -f 6911/6911/6911 6913/6913/6913 6914/6914/6914 -g charts -o chart0000 -s off -f 6911/6911/6911 6912/6912/6912 6913/6913/6913 -f 6911/6911/6911 6913/6913/6913 6914/6914/6914 -v -6933.5 1355.99 -285.3 -vt 0.622195 0.387057 -v -6933.5 1393.49 -229.05 -vt 0.623026 0.387372 -v -6933.5 2435.99 -285.3 -vt 0.622195 0.396125 -v -6933.5 2398.49 -229.05 -vt 0.623026 0.39581 -o mesh1404 -s off -f 6915/6915/6915 6916/6916/6916 6917/6917/6917 -f 6918/6918/6918 6917/6917/6917 6916/6916/6916 -g charts -o chart0000 -s off -f 6915/6915/6915 6916/6916/6916 6917/6917/6917 -f 6918/6918/6918 6917/6917/6917 6916/6916/6916 -v -6933.5 1393.49 -229.05 -vt 0.467581 0.853295 -v -6933.5 1355.99 -285.3 -vt 0.468412 0.852844 -v -6933.5 1355.99 2594.7 -vt 0.468412 0.875927 -o mesh1405 -s off -f 6919/6919/6919 6920/6920/6920 6921/6921/6921 -g charts -o chart0000 -s off -f 6919/6919/6919 6920/6920/6920 6921/6921/6921 -v -6933.5 1393.49 -229.05 -vt 0.620532 0.536274 -v -6933.5 1355.99 2594.7 -vt 0.642976 0.536274 -v -6933.5 1393.49 2538.45 -vt 0.642525 0.535449 -o mesh1406 -s off -f 6922/6922/6922 6923/6923/6923 6924/6924/6924 -g charts -o chart0000 -s off -f 6922/6922/6922 6923/6923/6923 6924/6924/6924 -v -6933.5 1393.49 2538.45 -vt 0.450125 0.90757 -v -6933.5 1355.99 2594.7 -vt 0.450956 0.907255 -v -6933.5 2398.49 2538.45 -vt 0.450125 0.916008 -v -6933.5 2435.99 2594.7 -vt 0.450956 0.916323 -o mesh1407 -s off -f 6925/6925/6925 6926/6926/6926 6927/6927/6927 -f 6928/6928/6928 6927/6927/6927 6926/6926/6926 -g charts -o chart0000 -s off -f 6925/6925/6925 6926/6926/6926 6927/6927/6927 -f 6928/6928/6928 6927/6927/6927 6926/6926/6926 -v -6933.5 2435.99 -285.3 -vt 0.761845 0.835532 -v -6933.5 2398.49 -229.05 -vt 0.761391 0.834707 -v -6933.5 2435.99 2594.7 -vt 0.73857 0.835531 -o mesh1408 -s off -f 6929/6929/6929 6930/6930/6930 6931/6931/6931 -g charts -o chart0000 -s off -f 6929/6929/6929 6930/6930/6930 6931/6931/6931 -v -6933.5 2435.99 2594.7 -vt 0.0627598 0.970734 -v -6933.5 2398.49 -229.05 -vt 0.0852036 0.970734 -v -6933.5 2398.49 2538.45 -vt 0.0632108 0.969909 -o mesh1409 -s off -f 6932/6932/6932 6933/6933/6933 6934/6934/6934 -g charts -o chart0000 -s off -f 6932/6932/6932 6933/6933/6933 6934/6934/6934 -v -6768.5 2435.99 -285.3 -vt 0.907315 0.247733 -v -6768.5 2398.49 -229.05 -vt 0.906997 0.246908 -v -6768.5 1355.99 -285.3 -vt 0.898171 0.247733 -v -6768.5 1393.49 -229.05 -vt 0.898489 0.246908 -o mesh1410 -s off -f 6935/6935/6935 6936/6936/6936 6937/6937/6937 -f 6938/6938/6938 6937/6937/6937 6936/6936/6936 -g charts -o chart0000 -s off -f 6935/6935/6935 6936/6936/6936 6937/6937/6937 -f 6938/6938/6938 6937/6937/6937 6936/6936/6936 -v -6768.5 2398.49 -229.05 -vt 0.71862 0.922545 -v -6768.5 2435.99 -285.3 -vt 0.719451 0.922094 -v -6768.5 2435.99 2594.7 -vt 0.719451 0.945177 -o mesh1411 -s off -f 6939/6939/6939 6940/6940/6940 6941/6941/6941 -g charts -o chart0000 -s off -f 6939/6939/6939 6940/6940/6940 6941/6941/6941 -v -6768.5 2398.49 -229.05 -vt 0.319618 0.52061 -v -6768.5 2435.99 2594.7 -vt 0.319618 0.542869 -v -6768.5 2398.49 2538.45 -vt 0.318786 0.542422 -o mesh1412 -s off -f 6942/6942/6942 6943/6943/6943 6944/6944/6944 -g charts -o chart0000 -s off -f 6942/6942/6942 6943/6943/6943 6944/6944/6944 -v -6768.5 2398.49 2538.45 -vt 0.900665 0.913535 -v -6768.5 2435.99 2594.7 -vt 0.899834 0.91385 -v -6768.5 1393.49 2538.45 -vt 0.900665 0.905096 -v -6768.5 1355.99 2594.7 -vt 0.899834 0.904782 -o mesh1413 -s off -f 6945/6945/6945 6946/6946/6946 6947/6947/6947 -f 6948/6948/6948 6947/6947/6947 6946/6946/6946 -g charts -o chart0000 -s off -f 6945/6945/6945 6946/6946/6946 6947/6947/6947 -f 6948/6948/6948 6947/6947/6947 6946/6946/6946 -v -6768.5 1355.99 -285.3 -vt 0.360349 0.472795 -v -6768.5 1393.49 -229.05 -vt 0.359518 0.472344 -v -6768.5 1355.99 2594.7 -vt 0.360349 0.449711 -o mesh1414 -s off -f 6949/6949/6949 6950/6950/6950 6951/6951/6951 -g charts -o chart0000 -s off -f 6949/6949/6949 6950/6950/6950 6951/6951/6951 -v -6768.5 1355.99 2594.7 -vt 0.333749 0.931987 -v -6768.5 1393.49 -229.05 -vt 0.356193 0.931987 -v -6768.5 1393.49 2538.45 -vt 0.3342 0.931162 -o mesh1415 -s off -f 6952/6952/6952 6953/6953/6953 6954/6954/6954 -g charts -o chart0000 -s off -f 6952/6952/6952 6953/6953/6953 6954/6954/6954 -v -6933.5 2435.99 2594.7 -vt 0.881546 0.677247 -v -6933.5 1355.99 2594.7 -vt 0.881546 0.686315 -v -6768.5 1355.99 2594.7 -vt 0.883209 0.686315 -v -6768.5 2435.99 2594.7 -vt 0.883209 0.677247 -o mesh1416 -s off -f 6955/6955/6955 6956/6956/6956 6957/6957/6957 -f 6955/6955/6955 6957/6957/6957 6958/6958/6958 -g charts -o chart0000 -s off -f 6955/6955/6955 6956/6956/6956 6957/6957/6957 -f 6955/6955/6955 6957/6957/6957 6958/6958/6958 -v -6933.5 1355.99 2594.7 -vt 0.465087 0.695383 -v -6933.5 1355.99 -285.3 -vt 0.465087 0.718467 -v -6768.5 1355.99 -285.3 -vt 0.46675 0.718467 -v -6768.5 1355.99 2594.7 -vt 0.46675 0.695383 -o mesh1417 -s off -f 6959/6959/6959 6960/6960/6960 6961/6961/6961 -f 6959/6959/6959 6961/6961/6961 6962/6962/6962 -g charts -o chart0000 -s off -f 6959/6959/6959 6960/6960/6960 6961/6961/6961 -f 6959/6959/6959 6961/6961/6961 6962/6962/6962 -v -6933.5 1355.99 -285.3 -vt 0.921446 0.903133 -v -6933.5 2435.99 -285.3 -vt 0.921446 0.894064 -v -6768.5 2435.99 -285.3 -vt 0.919784 0.894064 -v -6768.5 1355.99 -285.3 -vt 0.919784 0.903133 -o mesh1418 -s off -f 6963/6963/6963 6964/6964/6964 6965/6965/6965 -f 6963/6963/6963 6965/6965/6965 6966/6966/6966 -g charts -o chart0000 -s off -f 6963/6963/6963 6964/6964/6964 6965/6965/6965 -f 6963/6963/6963 6965/6965/6965 6966/6966/6966 -v -6933.5 2435.99 -285.3 -vt 0.430174 0.54864 -v -6933.5 2435.99 2594.7 -vt 0.406899 0.54864 -v -6768.5 2435.99 2594.7 -vt 0.406899 0.546991 -v -6768.5 2435.99 -285.3 -vt 0.430174 0.546991 -o mesh1419 -s off -f 6967/6967/6967 6968/6968/6968 6969/6969/6969 -f 6967/6967/6967 6969/6969/6969 6970/6970/6970 -g charts -o chart0000 -s off -f 6967/6967/6967 6968/6968/6968 6969/6969/6969 -f 6967/6967/6967 6969/6969/6969 6970/6970/6970 -v -6768.5 2398.49 -229.05 -vt 0.766002 0.799258 -v -6813.5 2398.49 -229.05 -vt 0.766002 0.798808 -v -6813.5 1393.49 -229.05 -vt 0.757689 0.798808 -v -6768.5 1393.49 -229.05 -vt 0.757689 0.799258 -v -6933.5 2398.49 -229.05 -vt 0.766002 0.797609 -v -6933.5 1393.49 -229.05 -vt 0.757689 0.797609 -o mesh1420 -s off -f 6971/6971/6971 6972/6972/6972 6973/6973/6973 -f 6971/6971/6971 6973/6973/6973 6974/6974/6974 -f 6975/6975/6975 6976/6976/6976 6973/6973/6973 -f 6975/6975/6975 6973/6973/6973 6972/6972/6972 -g charts -o chart0000 -s off -f 6971/6971/6971 6972/6972/6972 6973/6973/6973 -f 6971/6971/6971 6973/6973/6973 6974/6974/6974 -f 6975/6975/6975 6976/6976/6976 6973/6973/6973 -f 6975/6975/6975 6973/6973/6973 6972/6972/6972 -v -6768.5 1393.49 -229.05 -vt 0.176642 0.813273 -v -6813.5 1393.49 -229.05 -vt 0.177095 0.813273 -v -6813.5 1393.49 2538.45 -vt 0.177095 0.791014 -v -6768.5 1393.49 2538.45 -vt 0.176642 0.791014 -v -6933.5 1393.49 -229.05 -vt 0.178304 0.813273 -v -6933.5 1393.49 2538.45 -vt 0.178304 0.791014 -o mesh1421 -s off -f 6977/6977/6977 6978/6978/6978 6979/6979/6979 -f 6977/6977/6977 6979/6979/6979 6980/6980/6980 -f 6981/6981/6981 6982/6982/6982 6979/6979/6979 -f 6981/6981/6981 6979/6979/6979 6978/6978/6978 -g charts -o chart0000 -s off -f 6977/6977/6977 6978/6978/6978 6979/6979/6979 -f 6977/6977/6977 6979/6979/6979 6980/6980/6980 -f 6981/6981/6981 6982/6982/6982 6979/6979/6979 -f 6981/6981/6981 6979/6979/6979 6978/6978/6978 -v -6768.5 1393.49 2538.45 -vt 0.434331 0.54122 -v -6813.5 1393.49 2538.45 -vt 0.434331 0.54167 -v -6813.5 2398.49 2538.45 -vt 0.426018 0.54167 -v -6768.5 2398.49 2538.45 -vt 0.426018 0.54122 -v -6933.5 1393.49 2538.45 -vt 0.434331 0.542869 -v -6933.5 2398.49 2538.45 -vt 0.426018 0.542869 -o mesh1422 -s off -f 6983/6983/6983 6984/6984/6984 6985/6985/6985 -f 6983/6983/6983 6985/6985/6985 6986/6986/6986 -f 6987/6987/6987 6988/6988/6988 6985/6985/6985 -f 6987/6987/6987 6985/6985/6985 6984/6984/6984 -g charts -o chart0000 -s off -f 6983/6983/6983 6984/6984/6984 6985/6985/6985 -f 6983/6983/6983 6985/6985/6985 6986/6986/6986 -f 6987/6987/6987 6988/6988/6988 6985/6985/6985 -f 6987/6987/6987 6985/6985/6985 6984/6984/6984 -v -6768.5 2398.49 2538.45 -vt 0.544056 0.398598 -v -6813.5 2398.49 2538.45 -vt 0.543603 0.398598 -v -6813.5 2398.49 -229.05 -vt 0.543603 0.37634 -v -6768.5 2398.49 -229.05 -vt 0.544056 0.37634 -v -6933.5 2398.49 2538.45 -vt 0.542394 0.398598 -v -6933.5 2398.49 -229.05 -vt 0.542394 0.37634 -o mesh1423 -s off -f 6989/6989/6989 6990/6990/6990 6991/6991/6991 -f 6989/6989/6989 6991/6991/6991 6992/6992/6992 -f 6993/6993/6993 6994/6994/6994 6991/6991/6991 -f 6993/6993/6993 6991/6991/6991 6990/6990/6990 -g charts -o chart0000 -s off -f 6989/6989/6989 6990/6990/6990 6991/6991/6991 -f 6989/6989/6989 6991/6991/6991 6992/6992/6992 -f 6993/6993/6993 6994/6994/6994 6991/6991/6991 -f 6993/6993/6993 6991/6991/6991 6990/6990/6990 -v -6813.5 2398.49 -229.05 -vt 0.757689 0.306265 -v -6813.5 2338.49 -139.05 -vt 0.756858 0.305773 -v -6813.5 1393.49 -229.05 -vt 0.757689 0.298021 -v -6813.5 1453.49 -139.05 -vt 0.756858 0.298514 -o mesh1424 -s off -f 6995/6995/6995 6996/6996/6996 6997/6997/6997 -f 6998/6998/6998 6997/6997/6997 6996/6996/6996 -g charts -o chart0000 -s off -f 6995/6995/6995 6996/6996/6996 6997/6997/6997 -f 6998/6998/6998 6997/6997/6997 6996/6996/6996 -v -6813.5 2338.49 -139.05 -vt 0.346116 0.992993 -v -6813.5 2398.49 -229.05 -vt 0.345387 0.993817 -v -6813.5 2398.49 2538.45 -vt 0.36783 0.993817 -o mesh1425 -s off -f 6999/6999/6999 7000/7000/7000 7001/7001/7001 -g charts -o chart0000 -s off -f 6999/6999/6999 7000/7000/7000 7001/7001/7001 -v -6813.5 2338.49 -139.05 -vt 0.303824 0.297197 -v -6813.5 2398.49 2538.45 -vt 0.325436 0.297197 -v -6813.5 2338.49 2448.45 -vt 0.324699 0.296373 -o mesh1426 -s off -f 7002/7002/7002 7003/7003/7003 7004/7004/7004 -g charts -o chart0000 -s off -f 7002/7002/7002 7003/7003/7003 7004/7004/7004 -v -6813.5 2338.49 2448.45 -vt 0.673236 0.474443 -v -6813.5 2398.49 2538.45 -vt 0.673732 0.473619 -v -6813.5 1453.49 2448.45 -vt 0.665916 0.474443 -v -6813.5 1393.49 2538.45 -vt 0.66542 0.473619 -o mesh1427 -s off -f 7005/7005/7005 7006/7006/7006 7007/7007/7007 -f 7008/7008/7008 7007/7007/7007 7006/7006/7006 -g charts -o chart0000 -s off -f 7005/7005/7005 7006/7006/7006 7007/7007/7007 -f 7008/7008/7008 7007/7007/7007 7006/7006/7006 -v -6813.5 1393.49 -229.05 -vt 0.872402 0.509068 -v -6813.5 1453.49 -139.05 -vt 0.871571 0.508345 -v -6813.5 1393.49 2538.45 -vt 0.872402 0.48681 -o mesh1428 -s off -f 7009/7009/7009 7010/7010/7010 7011/7011/7011 -g charts -o chart0000 -s off -f 7009/7009/7009 7010/7010/7010 7011/7011/7011 -v -6813.5 1393.49 2538.45 -vt 0.95719 0.998763 -v -6813.5 1453.49 -139.05 -vt 0.978803 0.998763 -v -6813.5 1453.49 2448.45 -vt 0.957927 0.997939 -o mesh1429 -s off -f 7012/7012/7012 7013/7013/7013 7014/7014/7014 -g charts -o chart0000 -s off -f 7012/7012/7012 7013/7013/7013 7014/7014/7014 -v -6933.5 1453.49 2448.45 -vt 0.941396 0.120775 -v -6873.5 1882.86 2448.45 -vt 0.937767 0.11995 -v -6813.5 1453.49 2448.45 -vt 0.941396 0.119126 -v -6933.5 2338.49 2448.45 -vt 0.933915 0.120775 -v -6873.5 1909.11 2448.45 -vt 0.937545 0.11995 -v -6858.5 1909.11 2448.45 -vt 0.937545 0.119744 -v -6858.5 1882.86 2448.45 -vt 0.937767 0.119744 -v -6813.5 2338.49 2448.45 -vt 0.933915 0.119126 -o mesh1430 -s off -f 7015/7015/7015 7016/7016/7016 7017/7017/7017 -f 7016/7016/7016 7015/7015/7015 7018/7018/7018 -f 7016/7016/7016 7018/7018/7018 7019/7019/7019 -f 7019/7019/7019 7018/7018/7018 7020/7020/7020 -f 7017/7017/7017 7021/7021/7021 7022/7022/7022 -f 7021/7021/7021 7017/7017/7017 7016/7016/7016 -f 7022/7022/7022 7021/7021/7021 7020/7020/7020 -f 7022/7022/7022 7020/7020/7020 7018/7018/7018 -g charts -o chart0000 -s off -f 7015/7015/7015 7016/7016/7016 7017/7017/7017 -f 7016/7016/7016 7015/7015/7015 7018/7018/7018 -f 7016/7016/7016 7018/7018/7018 7019/7019/7019 -f 7019/7019/7019 7018/7018/7018 7020/7020/7020 -f 7017/7017/7017 7021/7021/7021 7022/7022/7022 -f 7021/7021/7021 7017/7017/7017 7016/7016/7016 -f 7022/7022/7022 7021/7021/7021 7020/7020/7020 -f 7022/7022/7022 7020/7020/7020 7018/7018/7018 -v -6933.5 2338.49 -139.05 -vt 0.233998 0.432399 -v -6933.5 1453.49 -139.05 -vt 0.24148 0.432399 -v -6813.5 1453.49 -139.05 -vt 0.24148 0.434048 -v -6813.5 2338.49 -139.05 -vt 0.233998 0.434048 -o mesh1431 -s off -f 7023/7023/7023 7024/7024/7024 7025/7025/7025 -f 7023/7023/7023 7025/7025/7025 7026/7026/7026 -g charts -o chart0000 -s off -f 7023/7023/7023 7024/7024/7024 7025/7025/7025 -f 7023/7023/7023 7025/7025/7025 7026/7026/7026 -v -6933.5 1453.49 -139.05 -vt 0.895677 0.910552 -v -6813.5 1453.49 2448.45 -vt 0.894015 0.889942 -v -6813.5 1453.49 -139.05 -vt 0.894015 0.910552 -v -6858.5 1453.49 1861.57 -vt 0.894638 0.894617 -v -6873.5 1453.49 1861.57 -vt 0.894846 0.894617 -v -6873.5 1453.49 1874.7 -vt 0.894846 0.894512 -v -6873.5 1453.49 1887.82 -vt 0.894846 0.894408 -v -6858.5 1453.49 1887.82 -vt 0.894638 0.894408 -v -6933.5 1453.49 2448.45 -vt 0.895677 0.889942 -o mesh1432 -s off -f 7027/7027/7027 7028/7028/7028 7029/7029/7029 -f 7028/7028/7028 7027/7027/7027 7030/7030/7030 -f 7030/7030/7030 7027/7027/7027 7031/7031/7031 -f 7031/7031/7031 7027/7027/7027 7032/7032/7032 -f 7032/7032/7032 7027/7027/7027 7033/7033/7033 -f 7028/7028/7028 7034/7034/7034 7035/7035/7035 -f 7034/7034/7034 7028/7028/7028 7030/7030/7030 -f 7035/7035/7035 7034/7034/7034 7033/7033/7033 -f 7035/7035/7035 7033/7033/7033 7027/7027/7027 -g charts -o chart0000 -s off -f 7027/7027/7027 7028/7028/7028 7029/7029/7029 -f 7028/7028/7028 7027/7027/7027 7030/7030/7030 -f 7030/7030/7030 7027/7027/7027 7031/7031/7031 -f 7031/7031/7031 7027/7027/7027 7032/7032/7032 -f 7032/7032/7032 7027/7027/7027 7033/7033/7033 -f 7028/7028/7028 7034/7034/7034 7035/7035/7035 -f 7034/7034/7034 7028/7028/7028 7030/7030/7030 -f 7035/7035/7035 7034/7034/7034 7033/7033/7033 -f 7035/7035/7035 7033/7033/7033 7027/7027/7027 -v -6813.5 2338.49 2448.45 -vt 0.717789 0.297197 -v -6858.5 2338.49 1887.82 -vt 0.713286 0.297815 -v -6813.5 2338.49 -139.05 -vt 0.697007 0.297197 -v -6933.5 2338.49 2448.45 -vt 0.717789 0.298846 -v -6873.5 2338.49 1887.82 -vt 0.713286 0.298021 -v -6873.5 2338.49 1874.7 -vt 0.713181 0.298021 -v -6873.5 2338.49 1861.57 -vt 0.713075 0.298021 -v -6858.5 2338.49 1861.57 -vt 0.713075 0.297815 -v -6933.5 2338.49 -139.05 -vt 0.697007 0.298846 -o mesh1433 -s off -f 7036/7036/7036 7037/7037/7037 7038/7038/7038 -f 7037/7037/7037 7036/7036/7036 7039/7039/7039 -f 7037/7037/7037 7039/7039/7039 7040/7040/7040 -f 7040/7040/7040 7039/7039/7039 7041/7041/7041 -f 7041/7041/7041 7039/7039/7039 7042/7042/7042 -f 7038/7038/7038 7043/7043/7043 7044/7044/7044 -f 7043/7043/7043 7038/7038/7038 7037/7037/7037 -f 7044/7044/7044 7043/7043/7043 7042/7042/7042 -f 7044/7044/7044 7042/7042/7042 7039/7039/7039 -g charts -o chart0000 -s off -f 7036/7036/7036 7037/7037/7037 7038/7038/7038 -f 7037/7037/7037 7036/7036/7036 7039/7039/7039 -f 7037/7037/7037 7039/7039/7039 7040/7040/7040 -f 7040/7040/7040 7039/7039/7039 7041/7041/7041 -f 7041/7041/7041 7039/7039/7039 7042/7042/7042 -f 7038/7038/7038 7043/7043/7043 7044/7044/7044 -f 7043/7043/7043 7038/7038/7038 7037/7037/7037 -f 7044/7044/7044 7043/7043/7043 7042/7042/7042 -f 7044/7044/7044 7042/7042/7042 7039/7039/7039 -v -6873.5 2338.49 1861.57 -vt 0.820033 0.509893 -v -6858.5 2338.49 1861.57 -vt 0.819202 0.509893 -v -6858.5 1453.49 1861.57 -vt 0.819202 0.502473 -v -6873.5 1453.49 1861.57 -vt 0.820033 0.502473 -o mesh1434 -s off -f 7045/7045/7045 7046/7046/7046 7047/7047/7047 -f 7045/7045/7045 7047/7047/7047 7048/7048/7048 -g charts -o chart0000 -s off -f 7045/7045/7045 7046/7046/7046 7047/7047/7047 -f 7045/7045/7045 7047/7047/7047 7048/7048/7048 -v -6858.5 1453.49 1861.57 -vt 0.935578 0.295548 -v -6858.5 2338.49 1861.57 -vt 0.935578 0.302968 -v -6858.5 2338.49 1887.82 -vt 0.935355 0.302968 -v -6858.5 1909.11 1887.82 -vt 0.935355 0.299368 -v -6858.5 1909.11 2448.45 -vt 0.93059 0.299368 -v -6858.5 1882.86 2448.45 -vt 0.93059 0.299148 -v -6858.5 1453.49 1861.57 -vt 0.104322 0.951772 -v -6858.5 1882.86 2448.45 -vt 0.0985037 0.951772 -v -6858.5 1882.86 1887.82 -vt 0.102124 0.948475 -v -6858.5 1453.49 1861.57 -vt 0.914796 0.924567 -v -6858.5 1882.86 1887.82 -vt 0.91064 0.923743 -v -6858.5 1453.49 1887.82 -vt 0.914796 0.923743 -o mesh1435 -s off -f 7049/7049/7049 7050/7050/7050 7051/7051/7051 -f 7049/7049/7049 7051/7051/7051 7052/7052/7052 -f 7049/7049/7049 7052/7052/7052 7053/7053/7053 -f 7049/7049/7049 7053/7053/7053 7054/7054/7054 -f 7055/7055/7055 7056/7056/7056 7057/7057/7057 -f 7058/7058/7058 7059/7059/7059 7060/7060/7060 -g charts -o chart0000 -s off -f 7049/7049/7049 7050/7050/7050 7051/7051/7051 -f 7049/7049/7049 7051/7051/7051 7052/7052/7052 -f 7049/7049/7049 7052/7052/7052 7053/7053/7053 -f 7049/7049/7049 7053/7053/7053 7054/7054/7054 -o chart0001 -s off -f 7055/7055/7055 7056/7056/7056 7057/7057/7057 -o chart0002 -s off -f 7058/7058/7058 7059/7059/7059 7060/7060/7060 -v -6858.5 1453.49 1887.82 -vt 0.472568 0.485161 -v -6858.5 1882.86 1887.82 -vt 0.472568 0.481039 -v -6873.5 1882.86 1887.82 -vt 0.471737 0.481039 -v -6873.5 1453.49 1887.82 -vt 0.471737 0.485161 -o mesh1436 -s off -f 7061/7061/7061 7062/7062/7062 7063/7063/7063 -f 7061/7061/7061 7063/7063/7063 7064/7064/7064 -g charts -o chart0000 -s off -f 7061/7061/7061 7062/7062/7062 7063/7063/7063 -f 7061/7061/7061 7063/7063/7063 7064/7064/7064 -v -6873.5 2338.49 1887.82 -vt 0.824189 0.00794497 -v -6873.5 2338.49 1874.7 -vt 0.824189 0.00783182 -v -6873.5 1453.49 1874.7 -vt 0.816708 0.00783182 -v -6873.5 1453.49 1887.82 -vt 0.816708 0.00794497 -v -6873.5 1882.86 1887.82 -vt 0.820338 0.00794497 -v -6873.5 1882.86 2448.45 -vt 0.820338 0.0127782 -v -6873.5 1909.11 2448.45 -vt 0.82056 0.0127782 -v -6873.5 2338.49 1887.82 -vt 0.714464 0.588211 -v -6873.5 1909.11 2448.45 -vt 0.71862 0.593157 -v -6873.5 1909.11 1887.82 -vt 0.71862 0.588211 -o mesh1437 -s off -f 7065/7065/7065 7066/7066/7066 7067/7067/7067 -f 7065/7065/7065 7067/7067/7067 7068/7068/7068 -f 7065/7065/7065 7068/7068/7068 7069/7069/7069 -f 7065/7065/7065 7069/7069/7069 7070/7070/7070 -f 7065/7065/7065 7070/7070/7070 7071/7071/7071 -f 7072/7072/7072 7073/7073/7073 7074/7074/7074 -g charts -o chart0000 -s off -f 7065/7065/7065 7066/7066/7066 7067/7067/7067 -f 7065/7065/7065 7067/7067/7067 7068/7068/7068 -f 7065/7065/7065 7068/7068/7068 7069/7069/7069 -f 7065/7065/7065 7069/7069/7069 7070/7070/7070 -f 7065/7065/7065 7070/7070/7070 7071/7071/7071 -o chart0001 -s off -f 7072/7072/7072 7073/7073/7073 7074/7074/7074 -v -6873.5 2338.49 1874.7 -vt 0.214879 0.527205 -v -6873.5 2338.49 1861.57 -vt 0.214048 0.527205 -v -6873.5 1453.49 1861.57 -vt 0.214048 0.519786 -v -6873.5 1453.49 1874.7 -vt 0.214879 0.519786 -o mesh1438 -s off -f 7075/7075/7075 7076/7076/7076 7077/7077/7077 -f 7075/7075/7075 7077/7077/7077 7078/7078/7078 -g charts -o chart0000 -s off -f 7075/7075/7075 7076/7076/7076 7077/7077/7077 -f 7075/7075/7075 7077/7077/7077 7078/7078/7078 -v -6873.5 2338.49 1887.82 -vt 0.908978 0.524732 -v -6873.5 1909.11 1887.82 -vt 0.913134 0.524732 -v -6858.5 1909.11 1887.82 -vt 0.913134 0.525556 -v -6858.5 2338.49 1887.82 -vt 0.908978 0.525556 -o mesh1439 -s off -f 7079/7079/7079 7080/7080/7080 7081/7081/7081 -f 7079/7079/7079 7081/7081/7081 7082/7082/7082 -g charts -o chart0000 -s off -f 7079/7079/7079 7080/7080/7080 7081/7081/7081 -f 7079/7079/7079 7081/7081/7081 7082/7082/7082 -v -6858.5 1909.11 1887.82 -vt 0.997091 0.585738 -v -6873.5 1909.11 1887.82 -vt 0.997922 0.585738 -v -6873.5 1909.11 2448.45 -vt 0.997922 0.580791 -v -6858.5 1909.11 2448.45 -vt 0.997091 0.580791 -o mesh1440 -s off -f 7083/7083/7083 7084/7084/7084 7085/7085/7085 -f 7083/7083/7083 7085/7085/7085 7086/7086/7086 -g charts -o chart0000 -s off -f 7083/7083/7083 7084/7084/7084 7085/7085/7085 -f 7083/7083/7083 7085/7085/7085 7086/7086/7086 -v -6873.5 1882.86 1887.82 -vt 0.412718 0.933636 -v -6858.5 1882.86 1887.82 -vt 0.412718 0.93446 -v -6858.5 1882.86 2448.45 -vt 0.407731 0.93446 -v -6873.5 1882.86 2448.45 -vt 0.407731 0.933636 -o mesh1441 -s off -f 7087/7087/7087 7088/7088/7088 7089/7089/7089 -f 7087/7087/7087 7089/7089/7089 7090/7090/7090 -g charts -o chart0000 -s off -f 7087/7087/7087 7088/7088/7088 7089/7089/7089 -f 7087/7087/7087 7089/7089/7089 7090/7090/7090 -v -6933.5 -804.01 -285.3 -vt 0.922278 0.487634 -v -6933.5 -766.51 -229.05 -vt 0.922595 0.488458 -v -6933.5 275.99 -285.3 -vt 0.931421 0.487634 -v -6933.5 238.49 -229.05 -vt 0.931104 0.488458 -o mesh1442 -s off -f 7091/7091/7091 7092/7092/7092 7093/7093/7093 -f 7094/7094/7094 7093/7093/7093 7092/7092/7092 -g charts -o chart0000 -s off -f 7091/7091/7091 7092/7092/7092 7093/7093/7093 -f 7094/7094/7094 7093/7093/7093 7092/7092/7092 -v -6933.5 -766.51 -229.05 -vt 0.781796 0.216856 -v -6933.5 -804.01 -285.3 -vt 0.782627 0.216406 -v -6933.5 -804.01 2594.7 -vt 0.782627 0.239489 -o mesh1443 -s off -f 7095/7095/7095 7096/7096/7096 7097/7097/7097 -g charts -o chart0000 -s off -f 7095/7095/7095 7096/7096/7096 7097/7097/7097 -v -6933.5 -766.51 -229.05 -vt 0.88404 0.677246 -v -6933.5 -804.01 2594.7 -vt 0.906484 0.677246 -v -6933.5 -766.51 2538.45 -vt 0.906033 0.676422 -o mesh1444 -s off -f 7098/7098/7098 7099/7099/7099 7100/7100/7100 -g charts -o chart0000 -s off -f 7098/7098/7098 7099/7099/7099 7100/7100/7100 -v -6933.5 -766.51 2538.45 -vt 0.873234 0.00155148 -v -6933.5 -804.01 2594.7 -vt 0.874065 0.0012366 -v -6933.5 238.49 2538.45 -vt 0.873234 0.00999001 -v -6933.5 275.99 2594.7 -vt 0.874065 0.0103049 -o mesh1445 -s off -f 7101/7101/7101 7102/7102/7102 7103/7103/7103 -f 7104/7104/7104 7103/7103/7103 7102/7102/7102 -g charts -o chart0000 -s off -f 7101/7101/7101 7102/7102/7102 7103/7103/7103 -f 7104/7104/7104 7103/7103/7103 7102/7102/7102 -v -6933.5 275.99 -285.3 -vt 0.00955935 0.201566 -v -6933.5 238.49 -229.05 -vt 0.00872818 0.201115 -v -6933.5 275.99 2594.7 -vt 0.00955935 0.178483 -o mesh1446 -s off -f 7105/7105/7105 7106/7106/7106 7107/7107/7107 -g charts -o chart0000 -s off -f 7105/7105/7105 7106/7106/7106 7107/7107/7107 -v -6933.5 275.99 2594.7 -vt 0.667914 0.599753 -v -6933.5 238.49 -229.05 -vt 0.690357 0.599753 -v -6933.5 238.49 2538.45 -vt 0.668364 0.598928 -o mesh1447 -s off -f 7108/7108/7108 7109/7109/7109 7110/7110/7110 -g charts -o chart0000 -s off -f 7108/7108/7108 7109/7109/7109 7110/7110/7110 -v -6768.5 275.99 -285.3 -vt 0.455943 0.476092 -v -6768.5 238.49 -229.05 -vt 0.455626 0.475268 -v -6768.5 -804.01 -285.3 -vt 0.4468 0.476092 -v -6768.5 -766.51 -229.05 -vt 0.447117 0.475268 -o mesh1448 -s off -f 7111/7111/7111 7112/7112/7112 7113/7113/7113 -f 7114/7114/7114 7113/7113/7113 7112/7112/7112 -g charts -o chart0000 -s off -f 7111/7111/7111 7112/7112/7112 7113/7113/7113 -f 7114/7114/7114 7113/7113/7113 7112/7112/7112 -v -6768.5 238.49 -229.05 -vt 0.410679 0.305441 -v -6768.5 275.99 -285.3 -vt 0.410224 0.306265 -v -6768.5 275.99 2594.7 -vt 0.433499 0.306265 -o mesh1449 -s off -f 7115/7115/7115 7116/7116/7116 7117/7117/7117 -g charts -o chart0000 -s off -f 7115/7115/7115 7116/7116/7116 7117/7117/7117 -v -6768.5 238.49 -229.05 -vt 0.85744 0.636851 -v -6768.5 275.99 2594.7 -vt 0.879884 0.636851 -v -6768.5 238.49 2538.45 -vt 0.879433 0.636026 -o mesh1450 -s off -f 7118/7118/7118 7119/7119/7119 7120/7120/7120 -g charts -o chart0000 -s off -f 7118/7118/7118 7119/7119/7119 7120/7120/7120 -v -6768.5 238.49 2538.45 -vt 0.432668 0.990205 -v -6768.5 275.99 2594.7 -vt 0.431837 0.990519 -v -6768.5 -766.51 2538.45 -vt 0.432668 0.981766 -v -6768.5 -804.01 2594.7 -vt 0.431837 0.981451 -o mesh1451 -s off -f 7121/7121/7121 7122/7122/7122 7123/7123/7123 -f 7124/7124/7124 7123/7123/7123 7122/7122/7122 -g charts -o chart0000 -s off -f 7121/7121/7121 7122/7122/7122 7123/7123/7123 -f 7124/7124/7124 7123/7123/7123 7122/7122/7122 -v -6768.5 -804.01 -285.3 -vt 0.357024 0.415086 -v -6768.5 -766.51 -229.05 -vt 0.356569 0.414262 -v -6768.5 -804.01 2594.7 -vt 0.333749 0.415086 -o mesh1452 -s off -f 7125/7125/7125 7126/7126/7126 7127/7127/7127 -g charts -o chart0000 -s off -f 7125/7125/7125 7126/7126/7126 7127/7127/7127 -v -6768.5 -804.01 2594.7 -vt 0.903159 0.77535 -v -6768.5 -766.51 -229.05 -vt 0.925603 0.77535 -v -6768.5 -766.51 2538.45 -vt 0.90361 0.774526 -o mesh1453 -s off -f 7128/7128/7128 7129/7129/7129 7130/7130/7130 -g charts -o chart0000 -s off -f 7128/7128/7128 7129/7129/7129 7130/7130/7130 -v -6933.5 275.99 2594.7 -vt 0.628013 0.433223 -v -6933.5 -804.01 2594.7 -vt 0.628013 0.442292 -v -6768.5 -804.01 2594.7 -vt 0.629676 0.442292 -v -6768.5 275.99 2594.7 -vt 0.629676 0.433223 -o mesh1454 -s off -f 7131/7131/7131 7132/7132/7132 7133/7133/7133 -f 7131/7131/7131 7133/7133/7133 7134/7134/7134 -g charts -o chart0000 -s off -f 7131/7131/7131 7132/7132/7132 7133/7133/7133 -f 7131/7131/7131 7133/7133/7133 7134/7134/7134 -v -6933.5 -804.01 2594.7 -vt 0.30133 0.592333 -v -6933.5 -804.01 -285.3 -vt 0.324605 0.592333 -v -6768.5 -804.01 -285.3 -vt 0.324605 0.593982 -v -6768.5 -804.01 2594.7 -vt 0.30133 0.593982 -o mesh1455 -s off -f 7135/7135/7135 7136/7136/7136 7137/7137/7137 -f 7135/7135/7135 7137/7137/7137 7138/7138/7138 -g charts -o chart0000 -s off -f 7135/7135/7135 7136/7136/7136 7137/7137/7137 -f 7135/7135/7135 7137/7137/7137 7138/7138/7138 -v -6933.5 -804.01 -285.3 -vt 0.0494596 0.226298 -v -6933.5 275.99 -285.3 -vt 0.0494596 0.21723 -v -6768.5 275.99 -285.3 -vt 0.0477972 0.21723 -v -6768.5 -804.01 -285.3 -vt 0.0477972 0.226298 -o mesh1456 -s off -f 7139/7139/7139 7140/7140/7140 7141/7141/7141 -f 7139/7139/7139 7141/7141/7141 7142/7142/7142 -g charts -o chart0000 -s off -f 7139/7139/7139 7140/7140/7140 7141/7141/7141 -f 7139/7139/7139 7141/7141/7141 7142/7142/7142 -v -6933.5 275.99 -285.3 -vt 0.775145 0.909728 -v -6933.5 275.99 2594.7 -vt 0.75187 0.909728 -v -6768.5 275.99 2594.7 -vt 0.75187 0.908079 -v -6768.5 275.99 -285.3 -vt 0.775145 0.908079 -o mesh1457 -s off -f 7143/7143/7143 7144/7144/7144 7145/7145/7145 -f 7143/7143/7143 7145/7145/7145 7146/7146/7146 -g charts -o chart0000 -s off -f 7143/7143/7143 7144/7144/7144 7145/7145/7145 -f 7143/7143/7143 7145/7145/7145 7146/7146/7146 -v -6768.5 238.49 -229.05 -vt 0.192435 0.29967 -v -6813.5 238.49 -229.05 -vt 0.192435 0.299221 -v -6813.5 -766.51 -229.05 -vt 0.184123 0.299221 -v -6768.5 -766.51 -229.05 -vt 0.184123 0.29967 -v -6933.5 238.49 -229.05 -vt 0.192435 0.298021 -v -6933.5 -766.51 -229.05 -vt 0.184123 0.298021 -o mesh1458 -s off -f 7147/7147/7147 7148/7148/7148 7149/7149/7149 -f 7147/7147/7147 7149/7149/7149 7150/7150/7150 -f 7151/7151/7151 7152/7152/7152 7149/7149/7149 -f 7151/7151/7151 7149/7149/7149 7148/7148/7148 -g charts -o chart0000 -s off -f 7147/7147/7147 7148/7148/7148 7149/7149/7149 -f 7147/7147/7147 7149/7149/7149 7150/7150/7150 -f 7151/7151/7151 7152/7152/7152 7149/7149/7149 -f 7151/7151/7151 7149/7149/7149 7148/7148/7148 -v -6768.5 -766.51 -229.05 -vt 0.355362 0.93446 -v -6813.5 -766.51 -229.05 -vt 0.355362 0.93491 -v -6813.5 -766.51 2538.45 -vt 0.332918 0.93491 -v -6768.5 -766.51 2538.45 -vt 0.332918 0.93446 -v -6933.5 -766.51 -229.05 -vt 0.355362 0.936109 -v -6933.5 -766.51 2538.45 -vt 0.332918 0.936109 -o mesh1459 -s off -f 7153/7153/7153 7154/7154/7154 7155/7155/7155 -f 7153/7153/7153 7155/7155/7155 7156/7156/7156 -f 7157/7157/7157 7158/7158/7158 7155/7155/7155 -f 7157/7157/7157 7155/7155/7155 7154/7154/7154 -g charts -o chart0000 -s off -f 7153/7153/7153 7154/7154/7154 7155/7155/7155 -f 7153/7153/7153 7155/7155/7155 7156/7156/7156 -f 7157/7157/7157 7158/7158/7158 7155/7155/7155 -f 7157/7157/7157 7155/7155/7155 7154/7154/7154 -v -6768.5 -766.51 2538.45 -vt 0.370324 0.647568 -v -6813.5 -766.51 2538.45 -vt 0.370324 0.648018 -v -6813.5 238.49 2538.45 -vt 0.362012 0.648018 -v -6768.5 238.49 2538.45 -vt 0.362012 0.647568 -v -6933.5 -766.51 2538.45 -vt 0.370324 0.649217 -v -6933.5 238.49 2538.45 -vt 0.362012 0.649217 -o mesh1460 -s off -f 7159/7159/7159 7160/7160/7160 7161/7161/7161 -f 7159/7159/7159 7161/7161/7161 7162/7162/7162 -f 7163/7163/7163 7164/7164/7164 7161/7161/7161 -f 7163/7163/7163 7161/7161/7161 7160/7160/7160 -g charts -o chart0000 -s off -f 7159/7159/7159 7160/7160/7160 7161/7161/7161 -f 7159/7159/7159 7161/7161/7161 7162/7162/7162 -f 7163/7163/7163 7164/7164/7164 7161/7161/7161 -f 7163/7163/7163 7161/7161/7161 7160/7160/7160 -v -6768.5 238.49 2538.45 -vt 0.845802 0.308739 -v -6813.5 238.49 2538.45 -vt 0.845802 0.308289 -v -6813.5 238.49 -229.05 -vt 0.823358 0.308289 -v -6768.5 238.49 -229.05 -vt 0.823358 0.308739 -v -6933.5 238.49 2538.45 -vt 0.845802 0.30709 -v -6933.5 238.49 -229.05 -vt 0.823358 0.30709 -o mesh1461 -s off -f 7165/7165/7165 7166/7166/7166 7167/7167/7167 -f 7165/7165/7165 7167/7167/7167 7168/7168/7168 -f 7169/7169/7169 7170/7170/7170 7167/7167/7167 -f 7169/7169/7169 7167/7167/7167 7166/7166/7166 -g charts -o chart0000 -s off -f 7165/7165/7165 7166/7166/7166 7167/7167/7167 -f 7165/7165/7165 7167/7167/7167 7168/7168/7168 -f 7169/7169/7169 7170/7170/7170 7167/7167/7167 -f 7169/7169/7169 7167/7167/7167 7166/7166/7166 -v -6813.5 238.49 -229.05 -vt 0.800083 0.715169 -v -6813.5 178.49 -139.05 -vt 0.799587 0.714345 -v -6813.5 -766.51 -229.05 -vt 0.791771 0.715169 -v -6813.5 -706.51 -139.05 -vt 0.792267 0.714345 -o mesh1462 -s off -f 7171/7171/7171 7172/7172/7172 7173/7173/7173 -f 7174/7174/7174 7173/7173/7173 7172/7172/7172 -g charts -o chart0000 -s off -f 7171/7171/7171 7172/7172/7172 7173/7173/7173 -f 7174/7174/7174 7173/7173/7173 7172/7172/7172 -v -6813.5 178.49 -139.05 -vt 0.339466 0.491756 -v -6813.5 238.49 -229.05 -vt 0.338737 0.49258 -v -6813.5 238.49 2538.45 -vt 0.36118 0.49258 -o mesh1463 -s off -f 7175/7175/7175 7176/7176/7176 7177/7177/7177 -g charts -o chart0000 -s off -f 7175/7175/7175 7176/7176/7176 7177/7177/7177 -v -6813.5 178.49 -139.05 -vt 0.868246 0.701979 -v -6813.5 238.49 2538.45 -vt 0.868246 0.723413 -v -6813.5 178.49 2448.45 -vt 0.867415 0.722682 -o mesh1464 -s off -f 7178/7178/7178 7179/7179/7179 7180/7180/7180 -g charts -o chart0000 -s off -f 7178/7178/7178 7179/7179/7179 7180/7180/7180 -v -6813.5 178.49 2448.45 -vt 0.720618 0.79596 -v -6813.5 238.49 2538.45 -vt 0.721114 0.795136 -v -6813.5 -706.51 2448.45 -vt 0.713298 0.79596 -v -6813.5 -766.51 2538.45 -vt 0.712801 0.795136 -o mesh1465 -s off -f 7181/7181/7181 7182/7182/7182 7183/7183/7183 -f 7184/7184/7184 7183/7183/7183 7182/7182/7182 -g charts -o chart0000 -s off -f 7181/7181/7181 7182/7182/7182 7183/7183/7183 -f 7184/7184/7184 7183/7183/7183 7182/7182/7182 -v -6813.5 -766.51 -229.05 -vt 0.87739 0.627782 -v -6813.5 -706.51 -139.05 -vt 0.87666 0.626958 -v -6813.5 -766.51 2538.45 -vt 0.854946 0.627782 -o mesh1466 -s off -f 7185/7185/7185 7186/7186/7186 7187/7187/7187 -g charts -o chart0000 -s off -f 7185/7185/7185 7186/7186/7186 7187/7187/7187 -v -6813.5 -766.51 2538.45 -vt 0.624688 0.737428 -v -6813.5 -706.51 -139.05 -vt 0.624688 0.758862 -v -6813.5 -706.51 2448.45 -vt 0.623857 0.738159 -o mesh1467 -s off -f 7188/7188/7188 7189/7189/7189 7190/7190/7190 -g charts -o chart0000 -s off -f 7188/7188/7188 7189/7189/7189 7190/7190/7190 -v -6933.5 -706.51 2448.45 -vt 0.859933 0.387057 -v -6873.5 -277.135 2448.45 -vt 0.856304 0.386232 -v -6813.5 -706.51 2448.45 -vt 0.859933 0.385408 -v -6933.5 178.49 2448.45 -vt 0.852452 0.387057 -v -6873.5 -250.885 2448.45 -vt 0.856082 0.386232 -v -6858.5 -250.885 2448.45 -vt 0.856082 0.386026 -v -6858.5 -277.135 2448.45 -vt 0.856304 0.386026 -v -6813.5 178.49 2448.45 -vt 0.852452 0.385408 -o mesh1468 -s off -f 7191/7191/7191 7192/7192/7192 7193/7193/7193 -f 7192/7192/7192 7191/7191/7191 7194/7194/7194 -f 7192/7192/7192 7194/7194/7194 7195/7195/7195 -f 7195/7195/7195 7194/7194/7194 7196/7196/7196 -f 7193/7193/7193 7197/7197/7197 7198/7198/7198 -f 7197/7197/7197 7193/7193/7193 7192/7192/7192 -f 7198/7198/7198 7197/7197/7197 7196/7196/7196 -f 7198/7198/7198 7196/7196/7196 7194/7194/7194 -g charts -o chart0000 -s off -f 7191/7191/7191 7192/7192/7192 7193/7193/7193 -f 7192/7192/7192 7191/7191/7191 7194/7194/7194 -f 7192/7192/7192 7194/7194/7194 7195/7195/7195 -f 7195/7195/7195 7194/7194/7194 7196/7196/7196 -f 7193/7193/7193 7197/7197/7197 7198/7198/7198 -f 7197/7197/7197 7193/7193/7193 7192/7192/7192 -f 7198/7198/7198 7197/7197/7197 7196/7196/7196 -f 7198/7198/7198 7196/7196/7196 7194/7194/7194 -v -6933.5 178.49 -139.05 -vt 0.941397 0.575021 -v -6933.5 -706.51 -139.05 -vt 0.948878 0.575021 -v -6813.5 -706.51 -139.05 -vt 0.948878 0.576669 -v -6813.5 178.49 -139.05 -vt 0.941397 0.576669 -o mesh1469 -s off -f 7199/7199/7199 7200/7200/7200 7201/7201/7201 -f 7199/7199/7199 7201/7201/7201 7202/7202/7202 -g charts -o chart0000 -s off -f 7199/7199/7199 7200/7200/7200 7201/7201/7201 -f 7199/7199/7199 7201/7201/7201 7202/7202/7202 -v -6933.5 -706.51 -139.05 -vt 0.953865 0.176834 -v -6813.5 -706.51 2448.45 -vt 0.952203 0.156224 -v -6813.5 -706.51 -139.05 -vt 0.952203 0.176834 -v -6858.5 -706.51 1861.57 -vt 0.952826 0.160899 -v -6873.5 -706.51 1861.57 -vt 0.953034 0.160899 -v -6873.5 -706.51 1874.7 -vt 0.953034 0.160794 -v -6873.5 -706.51 1887.82 -vt 0.953034 0.16069 -v -6858.5 -706.51 1887.82 -vt 0.952826 0.16069 -v -6933.5 -706.51 2448.45 -vt 0.953865 0.156224 -o mesh1470 -s off -f 7203/7203/7203 7204/7204/7204 7205/7205/7205 -f 7204/7204/7204 7203/7203/7203 7206/7206/7206 -f 7206/7206/7206 7203/7203/7203 7207/7207/7207 -f 7207/7207/7207 7203/7203/7203 7208/7208/7208 -f 7208/7208/7208 7203/7203/7203 7209/7209/7209 -f 7204/7204/7204 7210/7210/7210 7211/7211/7211 -f 7210/7210/7210 7204/7204/7204 7206/7206/7206 -f 7211/7211/7211 7210/7210/7210 7209/7209/7209 -f 7211/7211/7211 7209/7209/7209 7203/7203/7203 -g charts -o chart0000 -s off -f 7203/7203/7203 7204/7204/7204 7205/7205/7205 -f 7204/7204/7204 7203/7203/7203 7206/7206/7206 -f 7206/7206/7206 7203/7203/7203 7207/7207/7207 -f 7207/7207/7207 7203/7203/7203 7208/7208/7208 -f 7208/7208/7208 7203/7203/7203 7209/7209/7209 -f 7204/7204/7204 7210/7210/7210 7211/7211/7211 -f 7210/7210/7210 7204/7204/7204 7206/7206/7206 -f 7211/7211/7211 7210/7210/7210 7209/7209/7209 -f 7211/7211/7211 7209/7209/7209 7203/7203/7203 -v -6813.5 178.49 2448.45 -vt 0.329593 0.794312 -v -6858.5 178.49 1887.82 -vt 0.32509 0.79493 -v -6813.5 178.49 -139.05 -vt 0.308811 0.794312 -v -6933.5 178.49 2448.45 -vt 0.329593 0.79596 -v -6873.5 178.49 1887.82 -vt 0.32509 0.795136 -v -6873.5 178.49 1874.7 -vt 0.324985 0.795136 -v -6873.5 178.49 1861.57 -vt 0.324879 0.795136 -v -6858.5 178.49 1861.57 -vt 0.324879 0.79493 -v -6933.5 178.49 -139.05 -vt 0.308811 0.79596 -o mesh1471 -s off -f 7212/7212/7212 7213/7213/7213 7214/7214/7214 -f 7213/7213/7213 7212/7212/7212 7215/7215/7215 -f 7213/7213/7213 7215/7215/7215 7216/7216/7216 -f 7216/7216/7216 7215/7215/7215 7217/7217/7217 -f 7217/7217/7217 7215/7215/7215 7218/7218/7218 -f 7214/7214/7214 7219/7219/7219 7220/7220/7220 -f 7219/7219/7219 7214/7214/7214 7213/7213/7213 -f 7220/7220/7220 7219/7219/7219 7218/7218/7218 -f 7220/7220/7220 7218/7218/7218 7215/7215/7215 -g charts -o chart0000 -s off -f 7212/7212/7212 7213/7213/7213 7214/7214/7214 -f 7213/7213/7213 7212/7212/7212 7215/7215/7215 -f 7213/7213/7213 7215/7215/7215 7216/7216/7216 -f 7216/7216/7216 7215/7215/7215 7217/7217/7217 -f 7217/7217/7217 7215/7215/7215 7218/7218/7218 -f 7214/7214/7214 7219/7219/7219 7220/7220/7220 -f 7219/7219/7219 7214/7214/7214 7213/7213/7213 -f 7220/7220/7220 7219/7219/7219 7218/7218/7218 -f 7220/7220/7220 7218/7218/7218 7215/7215/7215 -v -6873.5 178.49 1861.57 -vt 0.541563 0.390354 -v -6858.5 178.49 1861.57 -vt 0.540731 0.390354 -v -6858.5 -706.51 1861.57 -vt 0.540731 0.382935 -v -6873.5 -706.51 1861.57 -vt 0.541563 0.382935 -o mesh1472 -s off -f 7221/7221/7221 7222/7222/7222 7223/7223/7223 -f 7221/7221/7221 7223/7223/7223 7224/7224/7224 -g charts -o chart0000 -s off -f 7221/7221/7221 7222/7222/7222 7223/7223/7223 -f 7221/7221/7221 7223/7223/7223 7224/7224/7224 -v -6858.5 -706.51 1861.57 -vt 0.362843 0.795136 -v -6858.5 178.49 1861.57 -vt 0.370324 0.795136 -v -6858.5 178.49 1887.82 -vt 0.370324 0.794915 -v -6858.5 -250.885 1887.82 -vt 0.366695 0.794915 -v -6858.5 -250.885 2448.45 -vt 0.366695 0.79019 -v -6858.5 -277.135 2448.45 -vt 0.366473 0.79019 -v -6858.5 -706.51 1861.57 -vt 0.981297 0.830585 -v -6858.5 -277.135 2448.45 -vt 0.975478 0.830585 -v -6858.5 -277.135 1887.82 -vt 0.979098 0.827288 -v -6858.5 -706.51 1861.57 -vt 0.438487 0.717642 -v -6858.5 -277.135 1887.82 -vt 0.442643 0.717642 -v -6858.5 -706.51 1887.82 -vt 0.438502 0.716818 -o mesh1473 -s off -f 7225/7225/7225 7226/7226/7226 7227/7227/7227 -f 7225/7225/7225 7227/7227/7227 7228/7228/7228 -f 7225/7225/7225 7228/7228/7228 7229/7229/7229 -f 7225/7225/7225 7229/7229/7229 7230/7230/7230 -f 7231/7231/7231 7232/7232/7232 7233/7233/7233 -f 7234/7234/7234 7235/7235/7235 7236/7236/7236 -g charts -o chart0000 -s off -f 7225/7225/7225 7226/7226/7226 7227/7227/7227 -f 7225/7225/7225 7227/7227/7227 7228/7228/7228 -f 7225/7225/7225 7228/7228/7228 7229/7229/7229 -f 7225/7225/7225 7229/7229/7229 7230/7230/7230 -o chart0001 -s off -f 7231/7231/7231 7232/7232/7232 7233/7233/7233 -o chart0002 -s off -f 7234/7234/7234 7235/7235/7235 7236/7236/7236 -v -6858.5 -706.51 1887.82 -vt 0.0860348 0.497527 -v -6858.5 -277.135 1887.82 -vt 0.0860348 0.493405 -v -6873.5 -277.135 1887.82 -vt 0.0852037 0.493405 -v -6873.5 -706.51 1887.82 -vt 0.0852037 0.497527 -o mesh1474 -s off -f 7237/7237/7237 7238/7238/7238 7239/7239/7239 -f 7237/7237/7237 7239/7239/7239 7240/7240/7240 -g charts -o chart0000 -s off -f 7237/7237/7237 7238/7238/7238 7239/7239/7239 -f 7237/7237/7237 7239/7239/7239 7240/7240/7240 -v -6873.5 178.49 1887.82 -vt 0.822641 0.0614179 -v -6873.5 178.49 1874.7 -vt 0.822527 0.0614179 -v -6873.5 -706.51 1874.7 -vt 0.822527 0.0539984 -v -6873.5 -706.51 1887.82 -vt 0.822641 0.0539984 -v -6873.5 -277.135 1887.82 -vt 0.822641 0.057598 -v -6873.5 -277.135 2448.45 -vt 0.827514 0.057598 -v -6873.5 -250.885 2448.45 -vt 0.827514 0.0578181 -v -6873.5 178.49 1887.82 -vt 0.927265 0.773701 -v -6873.5 -250.885 2448.45 -vt 0.921446 0.773701 -v -6873.5 -250.885 1887.82 -vt 0.925114 0.770404 -o mesh1475 -s off -f 7241/7241/7241 7242/7242/7242 7243/7243/7243 -f 7241/7241/7241 7243/7243/7243 7244/7244/7244 -f 7241/7241/7241 7244/7244/7244 7245/7245/7245 -f 7241/7241/7241 7245/7245/7245 7246/7246/7246 -f 7241/7241/7241 7246/7246/7246 7247/7247/7247 -f 7248/7248/7248 7249/7249/7249 7250/7250/7250 -g charts -o chart0000 -s off -f 7241/7241/7241 7242/7242/7242 7243/7243/7243 -f 7241/7241/7241 7243/7243/7243 7244/7244/7244 -f 7241/7241/7241 7244/7244/7244 7245/7245/7245 -f 7241/7241/7241 7245/7245/7245 7246/7246/7246 -f 7241/7241/7241 7246/7246/7246 7247/7247/7247 -o chart0001 -s off -f 7248/7248/7248 7249/7249/7249 7250/7250/7250 -v -6873.5 178.49 1874.7 -vt 0.989609 0.66488 -v -6873.5 178.49 1861.57 -vt 0.989609 0.664056 -v -6873.5 -706.51 1861.57 -vt 0.982128 0.664056 -v -6873.5 -706.51 1874.7 -vt 0.982128 0.66488 -o mesh1476 -s off -f 7251/7251/7251 7252/7252/7252 7253/7253/7253 -f 7251/7251/7251 7253/7253/7253 7254/7254/7254 -g charts -o chart0000 -s off -f 7251/7251/7251 7252/7252/7252 7253/7253/7253 -f 7251/7251/7251 7253/7253/7253 7254/7254/7254 -v -6873.5 178.49 1887.82 -vt 0.348712 0.79019 -v -6873.5 -250.885 1887.82 -vt 0.352868 0.79019 -v -6858.5 -250.885 1887.82 -vt 0.352868 0.791014 -v -6858.5 178.49 1887.82 -vt 0.348712 0.791014 -o mesh1477 -s off -f 7255/7255/7255 7256/7256/7256 7257/7257/7257 -f 7255/7255/7255 7257/7257/7257 7258/7258/7258 -g charts -o chart0000 -s off -f 7255/7255/7255 7256/7256/7256 7257/7257/7257 -f 7255/7255/7255 7257/7257/7257 7258/7258/7258 -v -6858.5 -250.885 1887.82 -vt 0.842477 0.0234955 -v -6873.5 -250.885 1887.82 -vt 0.842477 0.0243198 -v -6873.5 -250.885 2448.45 -vt 0.83749 0.0243198 -v -6858.5 -250.885 2448.45 -vt 0.83749 0.0234955 -o mesh1478 -s off -f 7259/7259/7259 7260/7260/7260 7261/7261/7261 -f 7259/7259/7259 7261/7261/7261 7262/7262/7262 -g charts -o chart0000 -s off -f 7259/7259/7259 7260/7260/7260 7261/7261/7261 -f 7259/7259/7259 7261/7261/7261 7262/7262/7262 -v -6873.5 -277.135 1887.82 -vt 0.900665 0.673949 -v -6858.5 -277.135 1887.82 -vt 0.900665 0.674773 -v -6858.5 -277.135 2448.45 -vt 0.895677 0.674773 -v -6873.5 -277.135 2448.45 -vt 0.895677 0.673949 -o mesh1479 -s off -f 7263/7263/7263 7264/7264/7264 7265/7265/7265 -f 7263/7263/7263 7265/7265/7265 7266/7266/7266 -g charts -o chart0000 -s off -f 7263/7263/7263 7264/7264/7264 7265/7265/7265 -f 7263/7263/7263 7265/7265/7265 7266/7266/7266 -v -6933.5 2435.99 -285.3 -vt 0.379468 0.88582 -v -6933.5 2473.49 -229.05 -vt 0.379786 0.886645 -v -6933.5 3515.99 -285.3 -vt 0.388612 0.88582 -v -6933.5 3478.49 -229.05 -vt 0.388294 0.886645 -o mesh1480 -s off -f 7267/7267/7267 7268/7268/7268 7269/7269/7269 -f 7270/7270/7270 7269/7269/7269 7268/7268/7268 -g charts -o chart0000 -s off -f 7267/7267/7267 7268/7268/7268 7269/7269/7269 -f 7270/7270/7270 7269/7269/7269 7268/7268/7268 -v -6933.5 2473.49 -229.05 -vt 0.309266 0.6723 -v -6933.5 2435.99 -285.3 -vt 0.308811 0.673124 -v -6933.5 2435.99 2594.7 -vt 0.332086 0.673124 -o mesh1481 -s off -f 7271/7271/7271 7272/7272/7272 7273/7273/7273 -g charts -o chart0000 -s off -f 7271/7271/7271 7272/7272/7272 7273/7273/7273 -v -6933.5 2473.49 -229.05 -vt 0.229842 0.767931 -v -6933.5 2435.99 2594.7 -vt 0.229842 0.79019 -v -6933.5 2473.49 2538.45 -vt 0.229011 0.789742 -o mesh1482 -s off -f 7274/7274/7274 7275/7275/7275 7276/7276/7276 -g charts -o chart0000 -s off -f 7274/7274/7274 7275/7275/7275 7276/7276/7276 -v -6933.5 2473.49 2538.45 -vt 0.0494597 0.582755 -v -6933.5 2435.99 2594.7 -vt 0.0502909 0.58244 -v -6933.5 3478.49 2538.45 -vt 0.0494597 0.591194 -v -6933.5 3515.99 2594.7 -vt 0.0502909 0.591509 -o mesh1483 -s off -f 7277/7277/7277 7278/7278/7278 7279/7279/7279 -f 7280/7280/7280 7279/7279/7279 7278/7278/7278 -g charts -o chart0000 -s off -f 7277/7277/7277 7278/7278/7278 7279/7279/7279 -f 7280/7280/7280 7279/7279/7279 7278/7278/7278 -v -6933.5 3515.99 -285.3 -vt 0.99044 0.730008 -v -6933.5 3478.49 -229.05 -vt 0.989609 0.729557 -v -6933.5 3515.99 2594.7 -vt 0.99044 0.706925 -o mesh1484 -s off -f 7281/7281/7281 7282/7282/7282 7283/7283/7283 -g charts -o chart0000 -s off -f 7281/7281/7281 7282/7282/7282 7283/7283/7283 -v -6933.5 3515.99 2594.7 -vt 0.628844 0.687139 -v -6933.5 3478.49 -229.05 -vt 0.628844 0.709398 -v -6933.5 3478.49 2538.45 -vt 0.628013 0.687587 -o mesh1485 -s off -f 7284/7284/7284 7285/7285/7285 7286/7286/7286 -g charts -o chart0000 -s off -f 7284/7284/7284 7285/7285/7285 7286/7286/7286 -v -6768.5 3515.99 -285.3 -vt 0.734414 0.474443 -v -6768.5 3478.49 -229.05 -vt 0.734096 0.473619 -v -6768.5 2435.99 -285.3 -vt 0.72527 0.474443 -v -6768.5 2473.49 -229.05 -vt 0.725588 0.473619 -o mesh1486 -s off -f 7287/7287/7287 7288/7288/7288 7289/7289/7289 -f 7290/7290/7290 7289/7289/7289 7288/7288/7288 -g charts -o chart0000 -s off -f 7287/7287/7287 7288/7288/7288 7289/7289/7289 -f 7290/7290/7290 7289/7289/7289 7288/7288/7288 -v -6768.5 3478.49 -229.05 -vt 0.23944 0.491756 -v -6768.5 3515.99 -285.3 -vt 0.238986 0.49258 -v -6768.5 3515.99 2594.7 -vt 0.262261 0.49258 -o mesh1487 -s off -f 7291/7291/7291 7292/7292/7292 7293/7293/7293 -g charts -o chart0000 -s off -f 7291/7291/7291 7292/7292/7292 7293/7293/7293 -v -6768.5 3478.49 -229.05 -vt 0.014547 0.14798 -v -6768.5 3515.99 2594.7 -vt 0.0369908 0.14798 -v -6768.5 3478.49 2538.45 -vt 0.0365398 0.147156 -o mesh1488 -s off -f 7294/7294/7294 7295/7295/7295 7296/7296/7296 -g charts -o chart0000 -s off -f 7294/7294/7294 7295/7295/7295 7296/7296/7296 -v -6768.5 3478.49 2538.45 -vt 0.536258 0.851195 -v -6768.5 3515.99 2594.7 -vt 0.536575 0.850371 -v -6768.5 2473.49 2538.45 -vt 0.527749 0.851195 -v -6768.5 2435.99 2594.7 -vt 0.527431 0.850371 -o mesh1489 -s off -f 7297/7297/7297 7298/7298/7298 7299/7299/7299 -f 7300/7300/7300 7299/7299/7299 7298/7298/7298 -g charts -o chart0000 -s off -f 7297/7297/7297 7298/7298/7298 7299/7299/7299 -f 7300/7300/7300 7299/7299/7299 7298/7298/7298 -v -6768.5 2435.99 -285.3 -vt 0.887365 0.194971 -v -6768.5 2473.49 -229.05 -vt 0.886534 0.19452 -v -6768.5 2435.99 2594.7 -vt 0.887365 0.171888 -o mesh1490 -s off -f 7301/7301/7301 7302/7302/7302 7303/7303/7303 -g charts -o chart0000 -s off -f 7301/7301/7301 7302/7302/7302 7303/7303/7303 -v -6768.5 2435.99 2594.7 -vt 0.30798 0.970734 -v -6768.5 2473.49 -229.05 -vt 0.330424 0.970734 -v -6768.5 2473.49 2538.45 -vt 0.308431 0.969909 -o mesh1491 -s off -f 7304/7304/7304 7305/7305/7305 7306/7306/7306 -g charts -o chart0000 -s off -f 7304/7304/7304 7305/7305/7305 7306/7306/7306 -v -6933.5 3515.99 2594.7 -vt 0.641313 0.472795 -v -6933.5 2435.99 2594.7 -vt 0.650457 0.472795 -v -6768.5 2435.99 2594.7 -vt 0.650457 0.474443 -v -6768.5 3515.99 2594.7 -vt 0.641313 0.474443 -o mesh1492 -s off -f 7307/7307/7307 7308/7308/7308 7309/7309/7309 -f 7307/7307/7307 7309/7309/7309 7310/7310/7310 -g charts -o chart0000 -s off -f 7307/7307/7307 7308/7308/7308 7309/7309/7309 -f 7307/7307/7307 7309/7309/7309 7310/7310/7310 -v -6933.5 2435.99 2594.7 -vt 0.214048 0.943528 -v -6933.5 2435.99 -285.3 -vt 0.237323 0.943528 -v -6768.5 2435.99 -285.3 -vt 0.237323 0.945177 -v -6768.5 2435.99 2594.7 -vt 0.214048 0.945177 -o mesh1493 -s off -f 7311/7311/7311 7312/7312/7312 7313/7313/7313 -f 7311/7311/7311 7313/7313/7313 7314/7314/7314 -g charts -o chart0000 -s off -f 7311/7311/7311 7312/7312/7312 7313/7313/7313 -f 7311/7311/7311 7313/7313/7313 7314/7314/7314 -v -6933.5 2435.99 -285.3 -vt 0.233167 0.887469 -v -6933.5 3515.99 -285.3 -vt 0.224023 0.887469 -v -6768.5 3515.99 -285.3 -vt 0.224023 0.88582 -v -6768.5 2435.99 -285.3 -vt 0.233167 0.88582 -o mesh1494 -s off -f 7315/7315/7315 7316/7316/7316 7317/7317/7317 -f 7315/7315/7315 7317/7317/7317 7318/7318/7318 -g charts -o chart0000 -s off -f 7315/7315/7315 7316/7316/7316 7317/7317/7317 -f 7315/7315/7315 7317/7317/7317 7318/7318/7318 -v -6933.5 3515.99 -285.3 -vt 0.00374057 0.201566 -v -6933.5 3515.99 2594.7 -vt 0.00374057 0.178483 -v -6768.5 3515.99 2594.7 -vt 0.00207814 0.178483 -v -6768.5 3515.99 -285.3 -vt 0.00207814 0.201566 -o mesh1495 -s off -f 7319/7319/7319 7320/7320/7320 7321/7321/7321 -f 7319/7319/7319 7321/7321/7321 7322/7322/7322 -g charts -o chart0000 -s off -f 7319/7319/7319 7320/7320/7320 7321/7321/7321 -f 7319/7319/7319 7321/7321/7321 7322/7322/7322 -v -6768.5 3478.49 -229.05 -vt 0.224023 0.448063 -v -6813.5 3478.49 -229.05 -vt 0.224023 0.447613 -v -6813.5 2473.49 -229.05 -vt 0.215711 0.447613 -v -6768.5 2473.49 -229.05 -vt 0.215711 0.448063 -v -6933.5 3478.49 -229.05 -vt 0.224023 0.446414 -v -6933.5 2473.49 -229.05 -vt 0.215711 0.446414 -o mesh1496 -s off -f 7323/7323/7323 7324/7324/7324 7325/7325/7325 -f 7323/7323/7323 7325/7325/7325 7326/7326/7326 -f 7327/7327/7327 7328/7328/7328 7325/7325/7325 -f 7327/7327/7327 7325/7325/7325 7324/7324/7324 -g charts -o chart0000 -s off -f 7323/7323/7323 7324/7324/7324 7325/7325/7325 -f 7323/7323/7323 7325/7325/7325 7326/7326/7326 -f 7327/7327/7327 7328/7328/7328 7325/7325/7325 -f 7327/7327/7327 7325/7325/7325 7324/7324/7324 -v -6768.5 2473.49 -229.05 -vt 0.614713 0.771228 -v -6813.5 2473.49 -229.05 -vt 0.614713 0.771678 -v -6813.5 2473.49 2538.45 -vt 0.592269 0.771678 -v -6768.5 2473.49 2538.45 -vt 0.592269 0.771228 -v -6933.5 2473.49 -229.05 -vt 0.614713 0.772877 -v -6933.5 2473.49 2538.45 -vt 0.592269 0.772877 -o mesh1497 -s off -f 7329/7329/7329 7330/7330/7330 7331/7331/7331 -f 7329/7329/7329 7331/7331/7331 7332/7332/7332 -f 7333/7333/7333 7334/7334/7334 7331/7331/7331 -f 7333/7333/7333 7331/7331/7331 7330/7330/7330 -g charts -o chart0000 -s off -f 7329/7329/7329 7330/7330/7330 7331/7331/7331 -f 7329/7329/7329 7331/7331/7331 7332/7332/7332 -f 7333/7333/7333 7334/7334/7334 7331/7331/7331 -f 7333/7333/7333 7331/7331/7331 7330/7330/7330 -v -6768.5 2473.49 2538.45 -vt 0.0910224 0.387057 -v -6813.5 2473.49 2538.45 -vt 0.0914759 0.387057 -v -6813.5 3478.49 2538.45 -vt 0.0914759 0.378813 -v -6768.5 3478.49 2538.45 -vt 0.0910224 0.378813 -v -6933.5 2473.49 2538.45 -vt 0.0926849 0.387057 -v -6933.5 3478.49 2538.45 -vt 0.0926849 0.378813 -o mesh1498 -s off -f 7335/7335/7335 7336/7336/7336 7337/7337/7337 -f 7335/7335/7335 7337/7337/7337 7338/7338/7338 -f 7339/7339/7339 7340/7340/7340 7337/7337/7337 -f 7339/7339/7339 7337/7337/7337 7336/7336/7336 -g charts -o chart0000 -s off -f 7335/7335/7335 7336/7336/7336 7337/7337/7337 -f 7335/7335/7335 7337/7337/7337 7338/7338/7338 -f 7339/7339/7339 7340/7340/7340 7337/7337/7337 -f 7339/7339/7339 7337/7337/7337 7336/7336/7336 -v -6768.5 3478.49 2538.45 -vt 0.0120531 0.611294 -v -6813.5 3478.49 2538.45 -vt 0.0115997 0.611294 -v -6813.5 3478.49 -229.05 -vt 0.0115997 0.589035 -v -6768.5 3478.49 -229.05 -vt 0.0120531 0.589035 -v -6933.5 3478.49 2538.45 -vt 0.0103907 0.611294 -v -6933.5 3478.49 -229.05 -vt 0.0103907 0.589035 -o mesh1499 -s off -f 7341/7341/7341 7342/7342/7342 7343/7343/7343 -f 7341/7341/7341 7343/7343/7343 7344/7344/7344 -f 7345/7345/7345 7346/7346/7346 7343/7343/7343 -f 7345/7345/7345 7343/7343/7343 7342/7342/7342 -g charts -o chart0000 -s off -f 7341/7341/7341 7342/7342/7342 7343/7343/7343 -f 7341/7341/7341 7343/7343/7343 7344/7344/7344 -f 7345/7345/7345 7346/7346/7346 7343/7343/7343 -f 7345/7345/7345 7343/7343/7343 7342/7342/7342 -v -6813.5 3478.49 -229.05 -vt 0.565669 0.558532 -v -6813.5 3418.49 -139.05 -vt 0.565173 0.557708 -v -6813.5 2473.49 -229.05 -vt 0.557357 0.558532 -v -6813.5 2533.49 -139.05 -vt 0.557853 0.557708 -o mesh1500 -s off -f 7347/7347/7347 7348/7348/7348 7349/7349/7349 -f 7350/7350/7350 7349/7349/7349 7348/7348/7348 -g charts -o chart0000 -s off -f 7347/7347/7347 7348/7348/7348 7349/7349/7349 -f 7350/7350/7350 7349/7349/7349 7348/7348/7348 -v -6813.5 3418.49 -139.05 -vt 0.57315 0.783494 -v -6813.5 3478.49 -229.05 -vt 0.573982 0.78277 -v -6813.5 3478.49 2538.45 -vt 0.573982 0.805029 -o mesh1501 -s off -f 7351/7351/7351 7352/7352/7352 7353/7353/7353 -g charts -o chart0000 -s off -f 7351/7351/7351 7352/7352/7352 7353/7353/7353 -v -6813.5 3418.49 -139.05 -vt 0.655445 0.794312 -v -6813.5 3478.49 2538.45 -vt 0.655445 0.815746 -v -6813.5 3418.49 2448.45 -vt 0.654613 0.815015 -o mesh1502 -s off -f 7354/7354/7354 7355/7355/7355 7356/7356/7356 -g charts -o chart0000 -s off -f 7354/7354/7354 7355/7355/7355 7356/7356/7356 -v -6813.5 3418.49 2448.45 -vt 0.329928 0.448887 -v -6813.5 3478.49 2538.45 -vt 0.330424 0.448063 -v -6813.5 2533.49 2448.45 -vt 0.322608 0.448887 -v -6813.5 2473.49 2538.45 -vt 0.322111 0.448063 -o mesh1503 -s off -f 7357/7357/7357 7358/7358/7358 7359/7359/7359 -f 7360/7360/7360 7359/7359/7359 7358/7358/7358 -g charts -o chart0000 -s off -f 7357/7357/7357 7358/7358/7358 7359/7359/7359 -f 7360/7360/7360 7359/7359/7359 7358/7358/7358 -v -6813.5 2473.49 -229.05 -vt 0.982959 0.999588 -v -6813.5 2533.49 -139.05 -vt 0.982128 0.998864 -v -6813.5 2473.49 2538.45 -vt 0.982959 0.977329 -o mesh1504 -s off -f 7361/7361/7361 7362/7362/7362 7363/7363/7363 -g charts -o chart0000 -s off -f 7361/7361/7361 7362/7362/7362 7363/7363/7363 -v -6813.5 2473.49 2538.45 -vt 0.352036 0.899835 -v -6813.5 2533.49 -139.05 -vt 0.352037 0.921269 -v -6813.5 2533.49 2448.45 -vt 0.351205 0.900566 -o mesh1505 -s off -f 7364/7364/7364 7365/7365/7365 7366/7366/7366 -g charts -o chart0000 -s off -f 7364/7364/7364 7365/7365/7365 7366/7366/7366 -v -6933.5 2533.49 2448.45 -vt 0.84414 0.669827 -v -6873.5 2962.86 2448.45 -vt 0.84051 0.669002 -v -6813.5 2533.49 2448.45 -vt 0.84414 0.668178 -v -6933.5 3418.49 2448.45 -vt 0.836658 0.669827 -v -6873.5 2989.11 2448.45 -vt 0.840288 0.669002 -v -6858.5 2989.11 2448.45 -vt 0.840288 0.668796 -v -6858.5 2962.86 2448.45 -vt 0.84051 0.668796 -v -6813.5 3418.49 2448.45 -vt 0.836658 0.668178 -o mesh1506 -s off -f 7367/7367/7367 7368/7368/7368 7369/7369/7369 -f 7368/7368/7368 7367/7367/7367 7370/7370/7370 -f 7368/7368/7368 7370/7370/7370 7371/7371/7371 -f 7371/7371/7371 7370/7370/7370 7372/7372/7372 -f 7369/7369/7369 7373/7373/7373 7374/7374/7374 -f 7373/7373/7373 7369/7369/7369 7368/7368/7368 -f 7374/7374/7374 7373/7373/7373 7372/7372/7372 -f 7374/7374/7374 7372/7372/7372 7370/7370/7370 -g charts -o chart0000 -s off -f 7367/7367/7367 7368/7368/7368 7369/7369/7369 -f 7368/7368/7368 7367/7367/7367 7370/7370/7370 -f 7368/7368/7368 7370/7370/7370 7371/7371/7371 -f 7371/7371/7371 7370/7370/7370 7372/7372/7372 -f 7369/7369/7369 7373/7373/7373 7374/7374/7374 -f 7373/7373/7373 7369/7369/7369 7368/7368/7368 -f 7374/7374/7374 7373/7373/7373 7372/7372/7372 -f 7374/7374/7374 7372/7372/7372 7370/7370/7370 -v -6933.5 3418.49 -139.05 -vt 0.0685786 0.18343 -v -6933.5 2533.49 -139.05 -vt 0.0760598 0.18343 -v -6813.5 2533.49 -139.05 -vt 0.0760598 0.185078 -v -6813.5 3418.49 -139.05 -vt 0.0685786 0.185078 -o mesh1507 -s off -f 7375/7375/7375 7376/7376/7376 7377/7377/7377 -f 7375/7375/7375 7377/7377/7377 7378/7378/7378 -g charts -o chart0000 -s off -f 7375/7375/7375 7376/7376/7376 7377/7377/7377 -f 7375/7375/7375 7377/7377/7377 7378/7378/7378 -v -6933.5 2533.49 -139.05 -vt 0.871571 0.0317394 -v -6813.5 2533.49 2448.45 -vt 0.869909 0.0111294 -v -6813.5 2533.49 -139.05 -vt 0.869909 0.0317394 -v -6858.5 2533.49 1861.57 -vt 0.870532 0.015804 -v -6873.5 2533.49 1861.57 -vt 0.87074 0.015804 -v -6873.5 2533.49 1874.7 -vt 0.87074 0.0156995 -v -6873.5 2533.49 1887.82 -vt 0.87074 0.0155949 -v -6858.5 2533.49 1887.82 -vt 0.870532 0.0155949 -v -6933.5 2533.49 2448.45 -vt 0.871571 0.0111294 -o mesh1508 -s off -f 7379/7379/7379 7380/7380/7380 7381/7381/7381 -f 7380/7380/7380 7379/7379/7379 7382/7382/7382 -f 7382/7382/7382 7379/7379/7379 7383/7383/7383 -f 7383/7383/7383 7379/7379/7379 7384/7384/7384 -f 7384/7384/7384 7379/7379/7379 7385/7385/7385 -f 7380/7380/7380 7386/7386/7386 7387/7387/7387 -f 7386/7386/7386 7380/7380/7380 7382/7382/7382 -f 7387/7387/7387 7386/7386/7386 7385/7385/7385 -f 7387/7387/7387 7385/7385/7385 7379/7379/7379 -g charts -o chart0000 -s off -f 7379/7379/7379 7380/7380/7380 7381/7381/7381 -f 7380/7380/7380 7379/7379/7379 7382/7382/7382 -f 7382/7382/7382 7379/7379/7379 7383/7383/7383 -f 7383/7383/7383 7379/7379/7379 7384/7384/7384 -f 7384/7384/7384 7379/7379/7379 7385/7385/7385 -f 7380/7380/7380 7386/7386/7386 7387/7387/7387 -f 7386/7386/7386 7380/7380/7380 7382/7382/7382 -f 7387/7387/7387 7386/7386/7386 7385/7385/7385 -f 7387/7387/7387 7385/7385/7385 7379/7379/7379 -v -6813.5 3418.49 2448.45 -vt 0.433499 0.490932 -v -6858.5 3418.49 1887.82 -vt 0.428997 0.49155 -v -6813.5 3418.49 -139.05 -vt 0.412718 0.490932 -v -6933.5 3418.49 2448.45 -vt 0.433499 0.49258 -v -6873.5 3418.49 1887.82 -vt 0.428997 0.491756 -v -6873.5 3418.49 1874.7 -vt 0.428892 0.491756 -v -6873.5 3418.49 1861.57 -vt 0.428786 0.491756 -v -6858.5 3418.49 1861.57 -vt 0.428786 0.49155 -v -6933.5 3418.49 -139.05 -vt 0.412718 0.49258 -o mesh1509 -s off -f 7388/7388/7388 7389/7389/7389 7390/7390/7390 -f 7389/7389/7389 7388/7388/7388 7391/7391/7391 -f 7389/7389/7389 7391/7391/7391 7392/7392/7392 -f 7392/7392/7392 7391/7391/7391 7393/7393/7393 -f 7393/7393/7393 7391/7391/7391 7394/7394/7394 -f 7390/7390/7390 7395/7395/7395 7396/7396/7396 -f 7395/7395/7395 7390/7390/7390 7389/7389/7389 -f 7396/7396/7396 7395/7395/7395 7394/7394/7394 -f 7396/7396/7396 7394/7394/7394 7391/7391/7391 -g charts -o chart0000 -s off -f 7388/7388/7388 7389/7389/7389 7390/7390/7390 -f 7389/7389/7389 7388/7388/7388 7391/7391/7391 -f 7389/7389/7389 7391/7391/7391 7392/7392/7392 -f 7392/7392/7392 7391/7391/7391 7393/7393/7393 -f 7393/7393/7393 7391/7391/7391 7394/7394/7394 -f 7390/7390/7390 7395/7395/7395 7396/7396/7396 -f 7395/7395/7395 7390/7390/7390 7389/7389/7389 -f 7396/7396/7396 7395/7395/7395 7394/7394/7394 -f 7396/7396/7396 7394/7394/7394 7391/7391/7391 -v -6873.5 3418.49 1861.57 -vt 0.32793 0.608821 -v -6858.5 3418.49 1861.57 -vt 0.32793 0.607997 -v -6858.5 2533.49 1861.57 -vt 0.320449 0.607997 -v -6873.5 2533.49 1861.57 -vt 0.320449 0.608821 -o mesh1510 -s off -f 7397/7397/7397 7398/7398/7398 7399/7399/7399 -f 7397/7397/7397 7399/7399/7399 7400/7400/7400 -g charts -o chart0000 -s off -f 7397/7397/7397 7398/7398/7398 7399/7399/7399 -f 7397/7397/7397 7399/7399/7399 7400/7400/7400 -v -6858.5 2533.49 1861.57 -vt 0.942228 0.654988 -v -6858.5 3418.49 1861.57 -vt 0.942228 0.662407 -v -6858.5 3418.49 1887.82 -vt 0.942005 0.662407 -v -6858.5 2989.11 1887.82 -vt 0.942005 0.658807 -v -6858.5 2989.11 2448.45 -vt 0.93724 0.658807 -v -6858.5 2962.86 2448.45 -vt 0.93724 0.658587 -v -6858.5 2533.49 1861.57 -vt 0.275561 0.702803 -v -6858.5 2962.86 2448.45 -vt 0.269742 0.702803 -v -6858.5 2962.86 1887.82 -vt 0.273363 0.699505 -v -6858.5 2533.49 1861.57 -vt 0.534913 0.379637 -v -6858.5 2962.86 1887.82 -vt 0.534081 0.375515 -v -6858.5 2533.49 1887.82 -vt 0.534081 0.379637 -o mesh1511 -s off -f 7401/7401/7401 7402/7402/7402 7403/7403/7403 -f 7401/7401/7401 7403/7403/7403 7404/7404/7404 -f 7401/7401/7401 7404/7404/7404 7405/7405/7405 -f 7401/7401/7401 7405/7405/7405 7406/7406/7406 -f 7407/7407/7407 7408/7408/7408 7409/7409/7409 -f 7410/7410/7410 7411/7411/7411 7412/7412/7412 -g charts -o chart0000 -s off -f 7401/7401/7401 7402/7402/7402 7403/7403/7403 -f 7401/7401/7401 7403/7403/7403 7404/7404/7404 -f 7401/7401/7401 7404/7404/7404 7405/7405/7405 -f 7401/7401/7401 7405/7405/7405 7406/7406/7406 -o chart0001 -s off -f 7407/7407/7407 7408/7408/7408 7409/7409/7409 -o chart0002 -s off -f 7410/7410/7410 7411/7411/7411 7412/7412/7412 -v -6858.5 2533.49 1887.82 -vt 0.873233 0.994641 -v -6858.5 2962.86 1887.82 -vt 0.873233 0.990519 -v -6873.5 2962.86 1887.82 -vt 0.872402 0.990519 -v -6873.5 2533.49 1887.82 -vt 0.872402 0.994641 -o mesh1512 -s off -f 7413/7413/7413 7414/7414/7414 7415/7415/7415 -f 7413/7413/7413 7415/7415/7415 7416/7416/7416 -g charts -o chart0000 -s off -f 7413/7413/7413 7414/7414/7414 7415/7415/7415 -f 7413/7413/7413 7415/7415/7415 7416/7416/7416 -v -6873.5 3418.49 1887.82 -vt 0.0985037 0.496816 -v -6873.5 3418.49 1874.7 -vt 0.0985037 0.496702 -v -6873.5 2533.49 1874.7 -vt 0.0910224 0.496702 -v -6873.5 2533.49 1887.82 -vt 0.0910224 0.496816 -v -6873.5 2962.86 1887.82 -vt 0.0946521 0.496816 -v -6873.5 2962.86 2448.45 -vt 0.0946521 0.501649 -v -6873.5 2989.11 2448.45 -vt 0.0948741 0.501649 -v -6873.5 3418.49 1887.82 -vt 0.651288 0.415911 -v -6873.5 2989.11 2448.45 -vt 0.656276 0.420033 -v -6873.5 2989.11 1887.82 -vt 0.651288 0.420033 -o mesh1513 -s off -f 7417/7417/7417 7418/7418/7418 7419/7419/7419 -f 7417/7417/7417 7419/7419/7419 7420/7420/7420 -f 7417/7417/7417 7420/7420/7420 7421/7421/7421 -f 7417/7417/7417 7421/7421/7421 7422/7422/7422 -f 7417/7417/7417 7422/7422/7422 7423/7423/7423 -f 7424/7424/7424 7425/7425/7425 7426/7426/7426 -g charts -o chart0000 -s off -f 7417/7417/7417 7418/7418/7418 7419/7419/7419 -f 7417/7417/7417 7419/7419/7419 7420/7420/7420 -f 7417/7417/7417 7420/7420/7420 7421/7421/7421 -f 7417/7417/7417 7421/7421/7421 7422/7422/7422 -f 7417/7417/7417 7422/7422/7422 7423/7423/7423 -o chart0001 -s off -f 7424/7424/7424 7425/7425/7425 7426/7426/7426 -v -6873.5 3418.49 1874.7 -vt 0.992934 0.725062 -v -6873.5 3418.49 1861.57 -vt 0.992103 0.725062 -v -6873.5 2533.49 1861.57 -vt 0.992103 0.717642 -v -6873.5 2533.49 1874.7 -vt 0.992934 0.717642 -o mesh1514 -s off -f 7427/7427/7427 7428/7428/7428 7429/7429/7429 -f 7427/7427/7427 7429/7429/7429 7430/7430/7430 -g charts -o chart0000 -s off -f 7427/7427/7427 7428/7428/7428 7429/7429/7429 -f 7427/7427/7427 7429/7429/7429 7430/7430/7430 -v -6873.5 3418.49 1887.82 -vt 0.138404 0.83141 -v -6873.5 2989.11 1887.82 -vt 0.14256 0.83141 -v -6858.5 2989.11 1887.82 -vt 0.14256 0.832234 -v -6858.5 3418.49 1887.82 -vt 0.138404 0.832234 -o mesh1515 -s off -f 7431/7431/7431 7432/7432/7432 7433/7433/7433 -f 7431/7431/7431 7433/7433/7433 7434/7434/7434 -g charts -o chart0000 -s off -f 7431/7431/7431 7432/7432/7432 7433/7433/7433 -f 7431/7431/7431 7433/7433/7433 7434/7434/7434 -v -6858.5 2989.11 1887.82 -vt 0.916459 0.421682 -v -6873.5 2989.11 1887.82 -vt 0.91729 0.421682 -v -6873.5 2989.11 2448.45 -vt 0.91729 0.416735 -v -6858.5 2989.11 2448.45 -vt 0.916459 0.416735 -o mesh1516 -s off -f 7435/7435/7435 7436/7436/7436 7437/7437/7437 -f 7435/7435/7435 7437/7437/7437 7438/7438/7438 -g charts -o chart0000 -s off -f 7435/7435/7435 7436/7436/7436 7437/7437/7437 -f 7435/7435/7435 7437/7437/7437 7438/7438/7438 -v -6873.5 2962.86 1887.82 -vt 0.893184 0.780297 -v -6858.5 2962.86 1887.82 -vt 0.893184 0.781121 -v -6858.5 2962.86 2448.45 -vt 0.888196 0.781121 -v -6873.5 2962.86 2448.45 -vt 0.888196 0.780297 -o mesh1517 -s off -f 7439/7439/7439 7440/7440/7440 7441/7441/7441 -f 7439/7439/7439 7441/7441/7441 7442/7442/7442 -g charts -o chart0000 -s off -f 7439/7439/7439 7440/7440/7440 7441/7441/7441 -f 7439/7439/7439 7441/7441/7441 7442/7442/7442 -v 1355.79 5045.99 1921.57 -vt 0.977972 0.00948063 -v 1355.79 5060.99 1921.57 -vt 0.977972 0.0103049 -v 1355.79 5060.99 1947.82 -vt 0.97714 0.0103049 -v 1355.79 5045.99 1947.82 -vt 0.97714 0.00948063 -o mesh1518 -s off -f 7443/7443/7443 7444/7444/7444 7445/7445/7445 -f 7443/7443/7443 7445/7445/7445 7446/7446/7446 -g charts -o chart0000 -s off -f 7443/7443/7443 7444/7444/7444 7445/7445/7445 -f 7443/7443/7443 7445/7445/7445 7446/7446/7446 -v 567.216 5060.99 1921.57 -vt 0.648795 0.879225 -v 567.216 5045.99 1921.57 -vt 0.649626 0.879225 -v 567.216 5045.99 1947.82 -vt 0.649626 0.878401 -v 567.216 5060.99 1947.82 -vt 0.648795 0.878401 -o mesh1519 -s off -f 7447/7447/7447 7448/7448/7448 7449/7449/7449 -f 7447/7447/7447 7449/7449/7449 7450/7450/7450 -g charts -o chart0000 -s off -f 7447/7447/7447 7448/7448/7448 7449/7449/7449 -f 7447/7447/7447 7449/7449/7449 7450/7450/7450 -v 1355.79 5060.99 1921.57 -vt 0.141729 0.703627 -v 1355.79 5045.99 1921.57 -vt 0.141729 0.702803 -v 567.216 5045.99 1921.57 -vt 0.135079 0.702803 -v 567.216 5060.99 1921.57 -vt 0.135079 0.703627 -o mesh1520 -s off -f 7451/7451/7451 7452/7452/7452 7453/7453/7453 -f 7451/7451/7451 7453/7453/7453 7454/7454/7454 -g charts -o chart0000 -s off -f 7451/7451/7451 7452/7452/7452 7453/7453/7453 -f 7451/7451/7451 7453/7453/7453 7454/7454/7454 -v 1355.79 5045.99 1921.57 -vt 0.918953 0.313685 -v 1355.79 5045.99 1947.82 -vt 0.918937 0.312861 -v 974.627 5045.99 1947.82 -vt 0.915628 0.313685 -v 1355.79 5045.99 1921.57 -vt 0.401081 0.969085 -v 974.627 5045.99 1947.82 -vt 0.403006 0.966612 -v 974.627 5045.99 2504.7 -vt 0.406899 0.969085 -v 1355.79 5045.99 1921.57 -vt 0.827514 0.99629 -v 974.627 5045.99 2504.7 -vt 0.8243 0.991344 -v 948.377 5045.99 2504.7 -vt 0.824079 0.991344 -v 948.377 5045.99 1947.82 -vt 0.824079 0.996067 -v 567.216 5045.99 1947.82 -vt 0.820864 0.996067 -v 567.216 5045.99 1921.57 -vt 0.820864 0.99629 -o mesh1521 -s off -f 7455/7455/7455 7456/7456/7456 7457/7457/7457 -f 7458/7458/7458 7459/7459/7459 7460/7460/7460 -f 7461/7461/7461 7462/7462/7462 7463/7463/7463 -f 7461/7461/7461 7463/7463/7463 7464/7464/7464 -f 7461/7461/7461 7464/7464/7464 7465/7465/7465 -f 7461/7461/7461 7465/7465/7465 7466/7466/7466 -g charts -o chart0000 -s off -f 7455/7455/7455 7456/7456/7456 7457/7457/7457 -o chart0001 -s off -f 7458/7458/7458 7459/7459/7459 7460/7460/7460 -o chart0002 -s off -f 7461/7461/7461 7462/7462/7462 7463/7463/7463 -f 7461/7461/7461 7463/7463/7463 7464/7464/7464 -f 7461/7461/7461 7464/7464/7464 7465/7465/7465 -f 7461/7461/7461 7465/7465/7465 7466/7466/7466 -v 1355.79 5060.99 1947.82 -vt 0.24148 0.296595 -v 1355.79 5060.99 1921.57 -vt 0.24148 0.296373 -v 567.216 5060.99 1921.57 -vt 0.23483 0.296373 -v 567.216 5060.99 1947.82 -vt 0.23483 0.296595 -v 948.377 5060.99 1947.82 -vt 0.238044 0.296595 -v 948.377 5060.99 2504.7 -vt 0.238044 0.301319 -v 974.627 5060.99 2504.7 -vt 0.238265 0.301319 -v 1355.79 5060.99 1947.82 -vt 0.346218 0.472795 -v 974.627 5060.99 2504.7 -vt 0.351205 0.476092 -v 974.627 5060.99 1947.82 -vt 0.346218 0.476092 -o mesh1522 -s off -f 7467/7467/7467 7468/7468/7468 7469/7469/7469 -f 7467/7467/7467 7469/7469/7469 7470/7470/7470 -f 7467/7467/7467 7470/7470/7470 7471/7471/7471 -f 7467/7467/7467 7471/7471/7471 7472/7472/7472 -f 7467/7467/7467 7472/7472/7472 7473/7473/7473 -f 7474/7474/7474 7475/7475/7475 7476/7476/7476 -g charts -o chart0000 -s off -f 7467/7467/7467 7468/7468/7468 7469/7469/7469 -f 7467/7467/7467 7469/7469/7469 7470/7470/7470 -f 7467/7467/7467 7470/7470/7470 7471/7471/7471 -f 7467/7467/7467 7471/7471/7471 7472/7472/7472 -f 7467/7467/7467 7472/7472/7472 7473/7473/7473 -o chart0001 -s off -f 7474/7474/7474 7475/7475/7475 7476/7476/7476 -v 1355.79 5060.99 1947.82 -vt 0.112635 0.375515 -v 974.627 5060.99 1947.82 -vt 0.11596 0.375515 -v 974.627 5045.99 1947.82 -vt 0.11596 0.37634 -v 1355.79 5045.99 1947.82 -vt 0.112635 0.37634 -o mesh1523 -s off -f 7477/7477/7477 7478/7478/7478 7479/7479/7479 -f 7477/7477/7477 7479/7479/7479 7480/7480/7480 -g charts -o chart0000 -s off -f 7477/7477/7477 7478/7478/7478 7479/7479/7479 -f 7477/7477/7477 7479/7479/7479 7480/7480/7480 -v 567.216 5045.99 1947.82 -vt 0.325436 0.434872 -v 948.377 5045.99 1947.82 -vt 0.325436 0.431575 -v 948.377 5060.99 1947.82 -vt 0.324605 0.431575 -v 567.216 5060.99 1947.82 -vt 0.324605 0.434872 -o mesh1524 -s off -f 7481/7481/7481 7482/7482/7482 7483/7483/7483 -f 7481/7481/7481 7483/7483/7483 7484/7484/7484 -g charts -o chart0000 -s off -f 7481/7481/7481 7482/7482/7482 7483/7483/7483 -f 7481/7481/7481 7483/7483/7483 7484/7484/7484 -v 948.377 5045.99 2504.7 -vt 0.800914 0.696208 -v 974.627 5045.99 2504.7 -vt 0.800914 0.695383 -v 974.627 5060.99 2504.7 -vt 0.800083 0.695383 -v 948.377 5060.99 2504.7 -vt 0.800083 0.696208 -o mesh1525 -s off -f 7485/7485/7485 7486/7486/7486 7487/7487/7487 -f 7485/7485/7485 7487/7487/7487 7488/7488/7488 -g charts -o chart0000 -s off -f 7485/7485/7485 7486/7486/7486 7487/7487/7487 -f 7485/7485/7485 7487/7487/7487 7488/7488/7488 -v 974.627 5045.99 1947.82 -vt 0.38113 0.438994 -v 974.627 5060.99 1947.82 -vt 0.38113 0.439819 -v 974.627 5060.99 2504.7 -vt 0.376143 0.439819 -v 974.627 5045.99 2504.7 -vt 0.376143 0.438994 -o mesh1526 -s off -f 7489/7489/7489 7490/7490/7490 7491/7491/7491 -f 7489/7489/7489 7491/7491/7491 7492/7492/7492 -g charts -o chart0000 -s off -f 7489/7489/7489 7490/7490/7490 7491/7491/7491 -f 7489/7489/7489 7491/7491/7491 7492/7492/7492 -v 948.377 5060.99 1947.82 -vt 0.299667 0.671476 -v 948.377 5045.99 1947.82 -vt 0.299667 0.6723 -v 948.377 5045.99 2504.7 -vt 0.29468 0.6723 -v 948.377 5060.99 2504.7 -vt 0.29468 0.671476 -o mesh1527 -s off -f 7493/7493/7493 7494/7494/7494 7495/7495/7495 -f 7493/7493/7493 7495/7495/7495 7496/7496/7496 -g charts -o chart0000 -s off -f 7493/7493/7493 7494/7494/7494 7495/7495/7495 -f 7493/7493/7493 7495/7495/7495 7496/7496/7496 -v 3535.79 5045.99 1921.57 -vt 0.793433 0.460429 -v 3535.79 5060.99 1921.57 -vt 0.794264 0.460429 -v 3535.79 5060.99 1947.82 -vt 0.794264 0.459604 -v 3535.79 5045.99 1947.82 -vt 0.793433 0.459604 -o mesh1528 -s off -f 7497/7497/7497 7498/7498/7498 7499/7499/7499 -f 7497/7497/7497 7499/7499/7499 7500/7500/7500 -g charts -o chart0000 -s off -f 7497/7497/7497 7498/7498/7498 7499/7499/7499 -f 7497/7497/7497 7499/7499/7499 7500/7500/7500 -v 2747.22 5060.99 1921.57 -vt 0.625519 0.675598 -v 2747.22 5045.99 1921.57 -vt 0.625519 0.676422 -v 2747.22 5045.99 1947.82 -vt 0.624688 0.676422 -v 2747.22 5060.99 1947.82 -vt 0.624688 0.675598 -o mesh1529 -s off -f 7501/7501/7501 7502/7502/7502 7503/7503/7503 -f 7501/7501/7501 7503/7503/7503 7504/7504/7504 -g charts -o chart0000 -s off -f 7501/7501/7501 7502/7502/7502 7503/7503/7503 -f 7501/7501/7501 7503/7503/7503 7504/7504/7504 -v 3535.79 5060.99 1921.57 -vt 0.655445 0.833058 -v 3535.79 5045.99 1921.57 -vt 0.654613 0.833058 -v 2747.22 5045.99 1921.57 -vt 0.654613 0.826463 -v 2747.22 5060.99 1921.57 -vt 0.655445 0.826463 -o mesh1530 -s off -f 7505/7505/7505 7506/7506/7506 7507/7507/7507 -f 7505/7505/7505 7507/7507/7507 7508/7508/7508 -g charts -o chart0000 -s off -f 7505/7505/7505 7506/7506/7506 7507/7507/7507 -f 7505/7505/7505 7507/7507/7507 7508/7508/7508 -v 3535.79 5045.99 1921.57 -vt 0.908977 0.0960428 -v 3535.79 5045.99 1947.82 -vt 0.908146 0.0960271 -v 3154.63 5045.99 1947.82 -vt 0.908977 0.0927453 -v 3535.79 5045.99 1921.57 -vt 0.185785 0.94188 -v 3154.63 5045.99 1947.82 -vt 0.183292 0.943789 -v 3154.63 5045.99 2504.7 -vt 0.185785 0.94765 -v 3535.79 5045.99 1921.57 -vt 0.914796 0.54122 -v 3154.63 5045.99 2504.7 -vt 0.909809 0.538032 -v 3128.38 5045.99 2504.7 -vt 0.909809 0.537813 -v 3128.38 5045.99 1947.82 -vt 0.914572 0.537813 -v 2747.22 5045.99 1947.82 -vt 0.914572 0.534625 -v 2747.22 5045.99 1921.57 -vt 0.914796 0.534625 -o mesh1531 -s off -f 7509/7509/7509 7510/7510/7510 7511/7511/7511 -f 7512/7512/7512 7513/7513/7513 7514/7514/7514 -f 7515/7515/7515 7516/7516/7516 7517/7517/7517 -f 7515/7515/7515 7517/7517/7517 7518/7518/7518 -f 7515/7515/7515 7518/7518/7518 7519/7519/7519 -f 7515/7515/7515 7519/7519/7519 7520/7520/7520 -g charts -o chart0000 -s off -f 7509/7509/7509 7510/7510/7510 7511/7511/7511 -o chart0001 -s off -f 7512/7512/7512 7513/7513/7513 7514/7514/7514 -o chart0002 -s off -f 7515/7515/7515 7516/7516/7516 7517/7517/7517 -f 7515/7515/7515 7517/7517/7517 7518/7518/7518 -f 7515/7515/7515 7518/7518/7518 7519/7519/7519 -f 7515/7515/7515 7519/7519/7519 7520/7520/7520 -v 3535.79 5060.99 1947.82 -vt 0.307149 0.608219 -v 3535.79 5060.99 1921.57 -vt 0.307149 0.607997 -v 2747.22 5060.99 1921.57 -vt 0.300499 0.607997 -v 2747.22 5060.99 1947.82 -vt 0.300499 0.608219 -v 3128.38 5060.99 1947.82 -vt 0.303713 0.608219 -v 3128.38 5060.99 2504.7 -vt 0.303713 0.612943 -v 3154.63 5060.99 2504.7 -vt 0.303934 0.612943 -v 3535.79 5060.99 1947.82 -vt 0.352037 0.456307 -v 3154.63 5060.99 2504.7 -vt 0.357024 0.459604 -v 3154.63 5060.99 1947.82 -vt 0.352037 0.459604 -o mesh1532 -s off -f 7521/7521/7521 7522/7522/7522 7523/7523/7523 -f 7521/7521/7521 7523/7523/7523 7524/7524/7524 -f 7521/7521/7521 7524/7524/7524 7525/7525/7525 -f 7521/7521/7521 7525/7525/7525 7526/7526/7526 -f 7521/7521/7521 7526/7526/7526 7527/7527/7527 -f 7528/7528/7528 7529/7529/7529 7530/7530/7530 -g charts -o chart0000 -s off -f 7521/7521/7521 7522/7522/7522 7523/7523/7523 -f 7521/7521/7521 7523/7523/7523 7524/7524/7524 -f 7521/7521/7521 7524/7524/7524 7525/7525/7525 -f 7521/7521/7521 7525/7525/7525 7526/7526/7526 -f 7521/7521/7521 7526/7526/7526 7527/7527/7527 -o chart0001 -s off -f 7528/7528/7528 7529/7529/7529 7530/7530/7530 -v 3535.79 5060.99 1947.82 -vt 0.271405 0.928689 -v 3154.63 5060.99 1947.82 -vt 0.27473 0.928689 -v 3154.63 5045.99 1947.82 -vt 0.27473 0.929514 -v 3535.79 5045.99 1947.82 -vt 0.271405 0.929514 -o mesh1533 -s off -f 7531/7531/7531 7532/7532/7532 7533/7533/7533 -f 7531/7531/7531 7533/7533/7533 7534/7534/7534 -g charts -o chart0000 -s off -f 7531/7531/7531 7532/7532/7532 7533/7533/7533 -f 7531/7531/7531 7533/7533/7533 7534/7534/7534 -v 2747.22 5045.99 1947.82 -vt 0.871571 0.0869744 -v 3128.38 5045.99 1947.82 -vt 0.871571 0.0836768 -v 3128.38 5060.99 1947.82 -vt 0.87074 0.0836768 -v 2747.22 5060.99 1947.82 -vt 0.87074 0.0869744 -o mesh1534 -s off -f 7535/7535/7535 7536/7536/7536 7537/7537/7537 -f 7535/7535/7535 7537/7537/7537 7538/7538/7538 -g charts -o chart0000 -s off -f 7535/7535/7535 7536/7536/7536 7537/7537/7537 -f 7535/7535/7535 7537/7537/7537 7538/7538/7538 -v 3128.38 5045.99 2504.7 -vt 0.908977 0.705276 -v 3154.63 5045.99 2504.7 -vt 0.908146 0.705276 -v 3154.63 5060.99 2504.7 -vt 0.908146 0.704452 -v 3128.38 5060.99 2504.7 -vt 0.908977 0.704452 -o mesh1535 -s off -f 7539/7539/7539 7540/7540/7540 7541/7541/7541 -f 7539/7539/7539 7541/7541/7541 7542/7542/7542 -g charts -o chart0000 -s off -f 7539/7539/7539 7540/7540/7540 7541/7541/7541 -f 7539/7539/7539 7541/7541/7541 7542/7542/7542 -v 3154.63 5045.99 1947.82 -vt 0.670407 0.662407 -v 3154.63 5060.99 1947.82 -vt 0.670407 0.663232 -v 3154.63 5060.99 2504.7 -vt 0.66542 0.663232 -v 3154.63 5045.99 2504.7 -vt 0.66542 0.662407 -o mesh1536 -s off -f 7543/7543/7543 7544/7544/7544 7545/7545/7545 -f 7543/7543/7543 7545/7545/7545 7546/7546/7546 -g charts -o chart0000 -s off -f 7543/7543/7543 7544/7544/7544 7545/7545/7545 -f 7543/7543/7543 7545/7545/7545 7546/7546/7546 -v 3128.38 5060.99 1947.82 -vt 0.95054 0.274938 -v 3128.38 5045.99 1947.82 -vt 0.95054 0.275762 -v 3128.38 5045.99 2504.7 -vt 0.945553 0.275762 -v 3128.38 5060.99 2504.7 -vt 0.945553 0.274938 -o mesh1537 -s off -f 7547/7547/7547 7548/7548/7548 7549/7549/7549 -f 7547/7547/7547 7549/7549/7549 7550/7550/7550 -g charts -o chart0000 -s off -f 7547/7547/7547 7548/7548/7548 7549/7549/7549 -f 7547/7547/7547 7549/7549/7549 7550/7550/7550 -v -5323.5 16266 -285.3 -vt 0.989609 0.528854 -v -5286 16266 -243.113 -vt 0.99044 0.529187 -v -5323.5 16266 2954.7 -vt 0.989609 0.55441 -v -5286 16266 2912.51 -vt 0.99044 0.554078 -o mesh1538 -s off -f 7551/7551/7551 7552/7552/7552 7553/7553/7553 -f 7554/7554/7554 7553/7553/7553 7552/7552/7552 -g charts -o chart0000 -s off -f 7551/7551/7551 7552/7552/7552 7553/7553/7553 -f 7554/7554/7554 7553/7553/7553 7552/7552/7552 -v -5286 16266 -243.113 -vt 0.436825 0.280178 -v -5323.5 16266 -285.3 -vt 0.437656 0.279885 -v -1003.5 16266 -285.3 -vt 0.437656 0.313685 -o mesh1539 -s off -f 7555/7555/7555 7556/7556/7556 7557/7557/7557 -g charts -o chart0000 -s off -f 7555/7555/7555 7556/7556/7556 7557/7557/7557 -v -5286 16266 -243.113 -vt 0.611388 0.522259 -v -1003.5 16266 -285.3 -vt 0.64547 0.522259 -v -1041 16266 -243.113 -vt 0.645168 0.521434 -o mesh1540 -s off -f 7558/7558/7558 7559/7559/7559 7560/7560/7560 -g charts -o chart0000 -s off -f 7558/7558/7558 7559/7559/7559 7560/7560/7560 -v -1041 16266 -243.113 -vt 0.252629 0.832234 -v -1003.5 16266 -285.3 -vt 0.252286 0.833058 -v -1041 16266 2912.51 -vt 0.278055 0.833058 -o mesh1541 -s off -f 7561/7561/7561 7562/7562/7562 7563/7563/7563 -g charts -o chart0000 -s off -f 7561/7561/7561 7562/7562/7562 7563/7563/7563 -v -5323.5 16266 2954.7 -vt 0.501662 0.599753 -v -5286 16266 2912.51 -vt 0.501367 0.598928 -v -1003.5 16266 2954.7 -vt 0.467581 0.599753 -o mesh1542 -s off -f 7564/7564/7564 7565/7565/7565 7566/7566/7566 -g charts -o chart0000 -s off -f 7564/7564/7564 7565/7565/7565 7566/7566/7566 -v -1003.5 16266 2954.7 -vt 0.999584 0.511542 -v -5286 16266 2912.51 -vt 0.999584 0.545342 -v -1041 16266 2912.51 -vt 0.998753 0.511841 -o mesh1543 -s off -f 7567/7567/7567 7568/7568/7568 7569/7569/7569 -g charts -o chart0000 -s off -f 7567/7567/7567 7568/7568/7568 7569/7569/7569 -v -1003.5 16266 2954.7 -vt 0.355362 0.434872 -v -1041 16266 2912.51 -vt 0.355026 0.434048 -v -1003.5 16266 -285.3 -vt 0.329593 0.434872 -o mesh1544 -s off -f 7570/7570/7570 7571/7571/7571 7572/7572/7572 -g charts -o chart0000 -s off -f 7570/7570/7570 7571/7571/7571 7572/7572/7572 -v -1003.5 16266 -285.3 -vt 0.376143 0.997939 -v -5323.5 16266 -285.3 -vt 0.410224 0.997939 -v -5323.5 16431 -285.3 -vt 0.410224 0.999588 -v -1003.5 16431 -285.3 -vt 0.376143 0.999588 -o mesh1545 -s off -f 7573/7573/7573 7574/7574/7574 7575/7575/7575 -f 7573/7573/7573 7575/7575/7575 7576/7576/7576 -g charts -o chart0000 -s off -f 7573/7573/7573 7574/7574/7574 7575/7575/7575 -f 7573/7573/7573 7575/7575/7575 7576/7576/7576 -v -1041 16266 2912.51 -vt 0.708645 0.318632 -v -5286 16266 2912.51 -vt 0.708645 0.352432 -v -5286 16431 2912.51 -vt 0.710307 0.352432 -v -1041 16431 2912.51 -vt 0.710307 0.318632 -o mesh1546 -s off -f 7577/7577/7577 7578/7578/7578 7579/7579/7579 -f 7577/7577/7577 7579/7579/7579 7580/7580/7580 -g charts -o chart0000 -s off -f 7577/7577/7577 7578/7578/7578 7579/7579/7579 -f 7577/7577/7577 7579/7579/7579 7580/7580/7580 -v -5323.5 16266 2954.7 -vt 0.820033 0.319456 -v -1003.5 16266 2954.7 -vt 0.785952 0.319456 -v -1003.5 16431 2954.7 -vt 0.785952 0.317807 -v -5323.5 16431 2954.7 -vt 0.820033 0.317807 -o mesh1547 -s off -f 7581/7581/7581 7582/7582/7582 7583/7583/7583 -f 7581/7581/7581 7583/7583/7583 7584/7584/7584 -g charts -o chart0000 -s off -f 7581/7581/7581 7582/7582/7582 7583/7583/7583 -f 7581/7581/7581 7583/7583/7583 7584/7584/7584 -v -1003.5 16266 2954.7 -vt 0.906484 0.546991 -v -1003.5 16266 -285.3 -vt 0.906484 0.572547 -v -1003.5 16431 -285.3 -vt 0.908146 0.572547 -v -1003.5 16431 2954.7 -vt 0.908146 0.546991 -o mesh1548 -s off -f 7585/7585/7585 7586/7586/7586 7587/7587/7587 -f 7585/7585/7585 7587/7587/7587 7588/7588/7588 -g charts -o chart0000 -s off -f 7585/7585/7585 7586/7586/7586 7587/7587/7587 -f 7585/7585/7585 7587/7587/7587 7588/7588/7588 -v -1041 16266 -243.113 -vt 0.654613 0.889118 -v -1041 16266 2912.51 -vt 0.654613 0.864386 -v -1041 16431 2912.51 -vt 0.652951 0.864386 -v -1041 16431 -243.113 -vt 0.652951 0.889118 -o mesh1549 -s off -f 7589/7589/7589 7590/7590/7590 7591/7591/7591 -f 7589/7589/7589 7591/7591/7591 7592/7592/7592 -g charts -o chart0000 -s off -f 7589/7589/7589 7590/7590/7590 7591/7591/7591 -f 7589/7589/7589 7591/7591/7591 7592/7592/7592 -v -5286 16266 -243.113 -vt 0.959684 0.69291 -v -1041 16266 -243.113 -vt 0.959684 0.65911 -v -1041 16431 -243.113 -vt 0.958022 0.65911 -v -5286 16431 -243.113 -vt 0.958022 0.69291 -o mesh1550 -s off -f 7593/7593/7593 7594/7594/7594 7595/7595/7595 -f 7593/7593/7593 7595/7595/7595 7596/7596/7596 -g charts -o chart0000 -s off -f 7593/7593/7593 7594/7594/7594 7595/7595/7595 -f 7593/7593/7593 7595/7595/7595 7596/7596/7596 -v -5286 16266 2912.51 -vt 0.554863 0.891591 -v -5286 16266 -243.113 -vt 0.554863 0.916323 -v -5286 16431 -243.113 -vt 0.556525 0.916323 -v -5286 16431 2912.51 -vt 0.556525 0.891591 -o mesh1551 -s off -f 7597/7597/7597 7598/7598/7598 7599/7599/7599 -f 7597/7597/7597 7599/7599/7599 7600/7600/7600 -g charts -o chart0000 -s off -f 7597/7597/7597 7598/7598/7598 7599/7599/7599 -f 7597/7597/7597 7599/7599/7599 7600/7600/7600 -v -5323.5 16266 -285.3 -vt 0.813383 0.559357 -v -5323.5 16266 2954.7 -vt 0.813383 0.5338 -v -5323.5 16431 2954.7 -vt 0.811721 0.5338 -v -5323.5 16431 -285.3 -vt 0.811721 0.559357 -o mesh1552 -s off -f 7601/7601/7601 7602/7602/7602 7603/7603/7603 -f 7601/7601/7601 7603/7603/7603 7604/7604/7604 -g charts -o chart0000 -s off -f 7601/7601/7601 7602/7602/7602 7603/7603/7603 -f 7601/7601/7601 7603/7603/7603 7604/7604/7604 -v -5323.5 16431 2954.7 -vt 0.916459 0.293899 -v -5286 16431 2912.51 -vt 0.915628 0.293567 -v -5323.5 16431 -285.3 -vt 0.916459 0.268343 -v -5286 16431 -243.113 -vt 0.915628 0.268676 -o mesh1553 -s off -f 7605/7605/7605 7606/7606/7606 7607/7607/7607 -f 7608/7608/7608 7607/7607/7607 7606/7606/7606 -g charts -o chart0000 -s off -f 7605/7605/7605 7606/7606/7606 7607/7607/7607 -f 7608/7608/7608 7607/7607/7607 7606/7606/7606 -v -5286 16431 2912.51 -vt 0.825317 0.000412201 -v -5323.5 16431 2954.7 -vt 0.825021 0.00123652 -v -1003.5 16431 2954.7 -vt 0.859102 0.00123652 -o mesh1554 -s off -f 7609/7609/7609 7610/7610/7610 7611/7611/7611 -g charts -o chart0000 -s off -f 7609/7609/7609 7610/7610/7610 7611/7611/7611 -v -5286 16431 2912.51 -vt 0.104322 0.371393 -v -1003.5 16431 2954.7 -vt 0.104322 0.405194 -v -1041 16431 2912.51 -vt 0.103491 0.404894 -o mesh1555 -s off -f 7612/7612/7612 7613/7613/7613 7614/7614/7614 -g charts -o chart0000 -s off -f 7612/7612/7612 7613/7613/7613 7614/7614/7614 -v -1041 16431 2912.51 -vt 0.000415628 0.188717 -v -1003.5 16431 2954.7 -vt 0.0012468 0.188376 -v -1041 16431 -243.113 -vt 0.0012468 0.213932 -o mesh1556 -s off -f 7615/7615/7615 7616/7616/7616 7617/7617/7617 -g charts -o chart0000 -s off -f 7615/7615/7615 7616/7616/7616 7617/7617/7617 -v -5323.5 16431 -285.3 -vt 0.687032 0.912201 -v -5286 16431 -243.113 -vt 0.686736 0.911377 -v -1003.5 16431 -285.3 -vt 0.652951 0.912201 -o mesh1557 -s off -f 7618/7618/7618 7619/7619/7619 7620/7620/7620 -g charts -o chart0000 -s off -f 7618/7618/7618 7619/7619/7619 7620/7620/7620 -v -1003.5 16431 -285.3 -vt 0.0477971 0.589035 -v -5286 16431 -243.113 -vt 0.0477971 0.622836 -v -1041 16431 -243.113 -vt 0.0469659 0.589335 -o mesh1558 -s off -f 7621/7621/7621 7622/7622/7622 7623/7623/7623 -g charts -o chart0000 -s off -f 7621/7621/7621 7622/7622/7622 7623/7623/7623 -v -1003.5 16431 -285.3 -vt 0.0145469 0.912201 -v -1041 16431 -243.113 -vt 0.0137157 0.911868 -v -1003.5 16431 2954.7 -vt 0.0145469 0.886645 -o mesh1559 -s off -f 7624/7624/7624 7625/7625/7625 7626/7626/7626 -g charts -o chart0000 -s off -f 7624/7624/7624 7625/7625/7625 7626/7626/7626 -v -4164.75 16371 2197.43 -vt 0.6872 0.686993 -v -4164.75 16371 2226.97 -vt 0.687434 0.686993 -v -3283.5 16371 2197.43 -vt 0.6872 0.679866 -v -4164.75 16371 2777.51 -vt 0.691784 0.686993 -v -3737.25 16371 2226.97 -vt 0.687434 0.683536 -v -3711 16371 2226.97 -vt 0.687434 0.683323 -v -3711 16371 2777.51 -vt 0.691784 0.683323 -v -3283.5 16371 2226.97 -vt 0.687434 0.679866 -v -3283.5 16371 -40.6129 -vt 0.669514 0.679866 -v -3283.5 16371 2777.51 -vt 0.691784 0.679866 -v -4284.75 16371 2912.51 -vt 0.692851 0.687964 -v -4284.75 16371 -243.113 -vt 0.667914 0.687964 -v -3163.5 16371 2912.51 -vt 0.692851 0.678895 -v -3737.25 16371 2777.51 -vt 0.691784 0.683536 -v -3163.5 16371 -243.113 -vt 0.667914 0.678895 -v -4164.75 16371 -40.6129 -vt 0.669514 0.686993 -o mesh1560 -s off -f 7627/7627/7627 7628/7628/7628 7629/7629/7629 -f 7628/7628/7628 7627/7627/7627 7630/7630/7630 -f 7629/7629/7629 7628/7628/7628 7631/7631/7631 -f 7629/7629/7629 7631/7631/7631 7632/7632/7632 -f 7632/7632/7632 7631/7631/7631 7633/7633/7633 -f 7629/7629/7629 7632/7632/7632 7634/7634/7634 -f 7629/7629/7629 7634/7634/7634 7635/7635/7635 -f 7635/7635/7635 7634/7634/7634 7636/7636/7636 -f 7637/7637/7637 7630/7630/7630 7638/7638/7638 -f 7630/7630/7630 7637/7637/7637 7639/7639/7639 -f 7638/7638/7638 7630/7630/7630 7627/7627/7627 -f 7630/7630/7630 7639/7639/7639 7640/7640/7640 -f 7640/7640/7640 7639/7639/7639 7633/7633/7633 -f 7640/7640/7640 7633/7633/7633 7631/7631/7631 -f 7633/7633/7633 7639/7639/7639 7636/7636/7636 -f 7636/7636/7636 7639/7639/7639 7641/7641/7641 -f 7638/7638/7638 7642/7642/7642 7641/7641/7641 -f 7642/7642/7642 7638/7638/7638 7627/7627/7627 -f 7641/7641/7641 7642/7642/7642 7635/7635/7635 -f 7641/7641/7641 7635/7635/7635 7636/7636/7636 -g charts -o chart0000 -s off -f 7627/7627/7627 7628/7628/7628 7629/7629/7629 -f 7628/7628/7628 7627/7627/7627 7630/7630/7630 -f 7629/7629/7629 7628/7628/7628 7631/7631/7631 -f 7629/7629/7629 7631/7631/7631 7632/7632/7632 -f 7632/7632/7632 7631/7631/7631 7633/7633/7633 -f 7629/7629/7629 7632/7632/7632 7634/7634/7634 -f 7629/7629/7629 7634/7634/7634 7635/7635/7635 -f 7635/7635/7635 7634/7634/7634 7636/7636/7636 -f 7637/7637/7637 7630/7630/7630 7638/7638/7638 -f 7630/7630/7630 7637/7637/7637 7639/7639/7639 -f 7638/7638/7638 7630/7630/7630 7627/7627/7627 -f 7630/7630/7630 7639/7639/7639 7640/7640/7640 -f 7640/7640/7640 7639/7639/7639 7633/7633/7633 -f 7640/7640/7640 7633/7633/7633 7631/7631/7631 -f 7633/7633/7633 7639/7639/7639 7636/7636/7636 -f 7636/7636/7636 7639/7639/7639 7641/7641/7641 -f 7638/7638/7638 7642/7642/7642 7641/7641/7641 -f 7642/7642/7642 7638/7638/7638 7627/7627/7627 -f 7641/7641/7641 7642/7642/7642 7635/7635/7635 -f 7641/7641/7641 7635/7635/7635 7636/7636/7636 -v -4284.75 16318.5 2912.51 -vt 0.908146 0.280709 -v -3163.5 16318.5 2912.51 -vt 0.899002 0.280709 -v -3163.5 16371 2912.51 -vt 0.899002 0.279885 -v -4284.75 16371 2912.51 -vt 0.908146 0.279885 -o mesh1561 -s off -f 7643/7643/7643 7644/7644/7644 7645/7645/7645 -f 7643/7643/7643 7645/7645/7645 7646/7646/7646 -g charts -o chart0000 -s off -f 7643/7643/7643 7644/7644/7644 7645/7645/7645 -f 7643/7643/7643 7645/7645/7645 7646/7646/7646 -v -3163.5 16318.5 -243.113 -vt 0.809227 0.759687 -v -4284.75 16318.5 -243.113 -vt 0.809227 0.768755 -v -4284.75 16371 -243.113 -vt 0.810058 0.768755 -v -3163.5 16371 -243.113 -vt 0.810058 0.759687 -o mesh1562 -s off -f 7647/7647/7647 7648/7648/7648 7649/7649/7649 -f 7647/7647/7647 7649/7649/7649 7650/7650/7650 -g charts -o chart0000 -s off -f 7647/7647/7647 7648/7648/7648 7649/7649/7649 -f 7647/7647/7647 7649/7649/7649 7650/7650/7650 -v -3163.5 16318.5 2912.51 -vt 0.205736 0.298021 -v -3163.5 16318.5 -243.113 -vt 0.230673 0.298021 -v -3163.5 16371 -243.113 -vt 0.230673 0.298846 -v -3163.5 16371 2912.51 -vt 0.205736 0.298846 -o mesh1563 -s off -f 7651/7651/7651 7652/7652/7652 7653/7653/7653 -f 7651/7651/7651 7653/7653/7653 7654/7654/7654 -g charts -o chart0000 -s off -f 7651/7651/7651 7652/7652/7652 7653/7653/7653 -f 7651/7651/7651 7653/7653/7653 7654/7654/7654 -v -4164.75 16318.5 -40.6129 -vt 0.830839 0.185903 -v -3283.5 16318.5 -40.6129 -vt 0.830839 0.178483 -v -3283.5 16371 -40.6129 -vt 0.830008 0.178483 -v -4164.75 16371 -40.6129 -vt 0.830008 0.185903 -o mesh1564 -s off -f 7655/7655/7655 7656/7656/7656 7657/7657/7657 -f 7655/7655/7655 7657/7657/7657 7658/7658/7658 -g charts -o chart0000 -s off -f 7655/7655/7655 7656/7656/7656 7657/7657/7657 -f 7655/7655/7655 7657/7657/7657 7658/7658/7658 -v -4164.75 16318.5 2777.51 -vt 0.44015 0.30709 -v -4164.75 16318.5 -40.6129 -vt 0.44015 0.330173 -v -4164.75 16371 -40.6129 -vt 0.439318 0.330173 -v -4164.75 16371 2197.43 -vt 0.439318 0.311841 -v -4164.75 16356 2197.43 -vt 0.439556 0.311841 -v -4164.75 16356 2226.97 -vt 0.439556 0.311599 -v -4164.75 16318.5 2777.51 -vt 0.781795 0.384584 -v -4164.75 16356 2226.97 -vt 0.781202 0.379637 -v -4164.75 16371 2226.97 -vt 0.780964 0.379637 -v -4164.75 16371 2777.51 -vt 0.780964 0.384584 -o mesh1565 -s off -f 7659/7659/7659 7660/7660/7660 7661/7661/7661 -f 7659/7659/7659 7661/7661/7661 7662/7662/7662 -f 7659/7659/7659 7662/7662/7662 7663/7663/7663 -f 7659/7659/7659 7663/7663/7663 7664/7664/7664 -f 7665/7665/7665 7666/7666/7666 7667/7667/7667 -f 7665/7665/7665 7667/7667/7667 7668/7668/7668 -g charts -o chart0000 -s off -f 7659/7659/7659 7660/7660/7660 7661/7661/7661 -f 7659/7659/7659 7661/7661/7661 7662/7662/7662 -f 7659/7659/7659 7662/7662/7662 7663/7663/7663 -f 7659/7659/7659 7663/7663/7663 7664/7664/7664 -o chart0001 -s off -f 7665/7665/7665 7666/7666/7666 7667/7667/7667 -f 7665/7665/7665 7667/7667/7667 7668/7668/7668 -v -3283.5 16318.5 2777.51 -vt 0.4468 0.1554 -v -4164.75 16318.5 2777.51 -vt 0.455112 0.1554 -v -4164.75 16371 2777.51 -vt 0.455112 0.156224 -v -3737.25 16371 2777.51 -vt 0.45108 0.156224 -v -3737.25 16356 2777.51 -vt 0.45108 0.155989 -v -3711 16356 2777.51 -vt 0.450832 0.155989 -v -3283.5 16318.5 2777.51 -vt 0.42685 0.981451 -v -3711 16356 2777.51 -vt 0.431006 0.98204 -v -3711 16371 2777.51 -vt 0.431006 0.982275 -v -3283.5 16371 2777.51 -vt 0.42685 0.982275 -o mesh1566 -s off -f 7669/7669/7669 7670/7670/7670 7671/7671/7671 -f 7669/7669/7669 7671/7671/7671 7672/7672/7672 -f 7669/7669/7669 7672/7672/7672 7673/7673/7673 -f 7669/7669/7669 7673/7673/7673 7674/7674/7674 -f 7675/7675/7675 7676/7676/7676 7677/7677/7677 -f 7675/7675/7675 7677/7677/7677 7678/7678/7678 -g charts -o chart0000 -s off -f 7669/7669/7669 7670/7670/7670 7671/7671/7671 -f 7669/7669/7669 7671/7671/7671 7672/7672/7672 -f 7669/7669/7669 7672/7672/7672 7673/7673/7673 -f 7669/7669/7669 7673/7673/7673 7674/7674/7674 -o chart0001 -s off -f 7675/7675/7675 7676/7676/7676 7677/7677/7677 -f 7675/7675/7675 7677/7677/7677 7678/7678/7678 -v -4284.75 16318.5 -243.113 -vt 0.994597 0.858615 -v -4164.75 16318.5 -40.6129 -vt 0.993618 0.857028 -v -4164.75 16318.5 2777.51 -vt 0.993618 0.834941 -v -3163.5 16318.5 -243.113 -vt 0.985453 0.858615 -v -3283.5 16318.5 -40.6129 -vt 0.986432 0.857028 -v -3283.5 16318.5 2777.51 -vt 0.986432 0.834941 -v -4284.75 16318.5 2912.51 -vt 0.994597 0.833883 -v -3163.5 16318.5 2912.51 -vt 0.985453 0.833883 -o mesh1567 -s off -f 7679/7679/7679 7680/7680/7680 7681/7681/7681 -f 7680/7680/7680 7679/7679/7679 7682/7682/7682 -f 7680/7680/7680 7682/7682/7682 7683/7683/7683 -f 7683/7683/7683 7682/7682/7682 7684/7684/7684 -f 7685/7685/7685 7681/7681/7681 7686/7686/7686 -f 7681/7681/7681 7685/7685/7685 7679/7679/7679 -f 7686/7686/7686 7681/7681/7681 7684/7684/7684 -f 7686/7686/7686 7684/7684/7684 7682/7682/7682 -g charts -o chart0000 -s off -f 7679/7679/7679 7680/7680/7680 7681/7681/7681 -f 7680/7680/7680 7679/7679/7679 7682/7682/7682 -f 7680/7680/7680 7682/7682/7682 7683/7683/7683 -f 7683/7683/7683 7682/7682/7682 7684/7684/7684 -f 7685/7685/7685 7681/7681/7681 7686/7686/7686 -f 7681/7681/7681 7685/7685/7685 7679/7679/7679 -f 7686/7686/7686 7681/7681/7681 7684/7684/7684 -f 7686/7686/7686 7684/7684/7684 7682/7682/7682 -v -4284.75 16318.5 -243.113 -vt 0.15586 0.537922 -v -4284.75 16318.5 2912.51 -vt 0.130923 0.537922 -v -4284.75 16371 2912.51 -vt 0.130923 0.537098 -v -4284.75 16371 -243.113 -vt 0.15586 0.537098 -o mesh1568 -s off -f 7687/7687/7687 7688/7688/7688 7689/7689/7689 -f 7687/7687/7687 7689/7689/7689 7690/7690/7690 -g charts -o chart0000 -s off -f 7687/7687/7687 7688/7688/7688 7689/7689/7689 -f 7687/7687/7687 7689/7689/7689 7690/7690/7690 -v -3283.5 16371 2197.43 -vt 0.770158 0.861453 -v -3283.5 16371 -40.6129 -vt 0.770158 0.843776 -v -3283.5 16318.5 -40.6129 -vt 0.770989 0.843776 -v -3283.5 16318.5 2777.51 -vt 0.770989 0.866035 -v -3283.5 16371 2777.51 -vt 0.770158 0.866035 -v -3283.5 16371 2226.97 -vt 0.770158 0.861686 -v -3283.5 16371 2197.43 -vt 0.438487 0.449711 -v -3283.5 16371 2226.97 -vt 0.439318 0.449711 -v -3283.5 16356 2226.97 -vt 0.439318 0.450536 -v -3283.5 16356 2197.43 -vt 0.438487 0.450536 -o mesh1569 -s off -f 7691/7691/7691 7692/7692/7692 7693/7693/7693 -f 7691/7691/7691 7693/7693/7693 7694/7694/7694 -f 7691/7691/7691 7694/7694/7694 7695/7695/7695 -f 7691/7691/7691 7695/7695/7695 7696/7696/7696 -f 7697/7697/7697 7698/7698/7698 7699/7699/7699 -f 7697/7697/7697 7699/7699/7699 7700/7700/7700 -g charts -o chart0000 -s off -f 7691/7691/7691 7692/7692/7692 7693/7693/7693 -f 7691/7691/7691 7693/7693/7693 7694/7694/7694 -f 7691/7691/7691 7694/7694/7694 7695/7695/7695 -f 7691/7691/7691 7695/7695/7695 7696/7696/7696 -o chart0001 -s off -f 7697/7697/7697 7698/7698/7698 7699/7699/7699 -f 7697/7697/7697 7699/7699/7699 7700/7700/7700 -v -3737.25 16371 2226.97 -vt 0.90399 0.369744 -v -4164.75 16371 2226.97 -vt 0.90399 0.373866 -v -4164.75 16356 2226.97 -vt 0.904821 0.373866 -v -3737.25 16356 2226.97 -vt 0.904821 0.369744 -o mesh1570 -s off -f 7701/7701/7701 7702/7702/7702 7703/7703/7703 -f 7701/7701/7701 7703/7703/7703 7704/7704/7704 -g charts -o chart0000 -s off -f 7701/7701/7701 7702/7702/7702 7703/7703/7703 -f 7701/7701/7701 7703/7703/7703 7704/7704/7704 -v -3283.5 16356 2197.43 -vt 0.927265 0.43075 -v -3283.5 16356 2226.97 -vt 0.927245 0.429926 -v -3711 16356 2226.97 -vt 0.923109 0.43075 -v -3283.5 16356 2197.43 -vt 0.0951787 0.364798 -v -3711 16356 2226.97 -vt 0.0974187 0.3615 -v -3711 16356 2777.51 -vt 0.100997 0.364798 -v -3283.5 16356 2197.43 -vt 0.724439 0.65911 -v -3711 16356 2777.51 -vt 0.719451 0.65551 -v -3737.25 16356 2777.51 -vt 0.719451 0.655289 -v -3737.25 16356 2226.97 -vt 0.724185 0.655289 -v -4164.75 16356 2226.97 -vt 0.724185 0.65169 -v -4164.75 16356 2197.43 -vt 0.724439 0.65169 -o mesh1571 -s off -f 7705/7705/7705 7706/7706/7706 7707/7707/7707 -f 7708/7708/7708 7709/7709/7709 7710/7710/7710 -f 7711/7711/7711 7712/7712/7712 7713/7713/7713 -f 7711/7711/7711 7713/7713/7713 7714/7714/7714 -f 7711/7711/7711 7714/7714/7714 7715/7715/7715 -f 7711/7711/7711 7715/7715/7715 7716/7716/7716 -g charts -o chart0000 -s off -f 7705/7705/7705 7706/7706/7706 7707/7707/7707 -o chart0001 -s off -f 7708/7708/7708 7709/7709/7709 7710/7710/7710 -o chart0002 -s off -f 7711/7711/7711 7712/7712/7712 7713/7713/7713 -f 7711/7711/7711 7713/7713/7713 7714/7714/7714 -f 7711/7711/7711 7714/7714/7714 7715/7715/7715 -f 7711/7711/7711 7715/7715/7715 7716/7716/7716 -v -3283.5 16371 2197.43 -vt 0.35453 0.380462 -v -3283.5 16356 2197.43 -vt 0.353699 0.380462 -v -4164.75 16356 2197.43 -vt 0.353699 0.373042 -v -4164.75 16371 2197.43 -vt 0.35453 0.373042 -o mesh1572 -s off -f 7717/7717/7717 7718/7718/7718 7719/7719/7719 -f 7717/7717/7717 7719/7719/7719 7720/7720/7720 -g charts -o chart0000 -s off -f 7717/7717/7717 7718/7718/7718 7719/7719/7719 -f 7717/7717/7717 7719/7719/7719 7720/7720/7720 -v -3711 16356 2226.97 -vt 0.0635909 0.639324 -v -3283.5 16356 2226.97 -vt 0.0594347 0.639324 -v -3283.5 16371 2226.97 -vt 0.0594347 0.6385 -v -3711 16371 2226.97 -vt 0.0635909 0.6385 -o mesh1573 -s off -f 7721/7721/7721 7722/7722/7722 7723/7723/7723 -f 7721/7721/7721 7723/7723/7723 7724/7724/7724 -g charts -o chart0000 -s off -f 7721/7721/7721 7722/7722/7722 7723/7723/7723 -f 7721/7721/7721 7723/7723/7723 7724/7724/7724 -v -3711 16356 2226.97 -vt 0.202411 0.871805 -v -3711 16371 2226.97 -vt 0.203242 0.871805 -v -3711 16371 2777.51 -vt 0.203242 0.866859 -v -3711 16356 2777.51 -vt 0.202411 0.866859 -o mesh1574 -s off -f 7725/7725/7725 7726/7726/7726 7727/7727/7727 -f 7725/7725/7725 7727/7727/7727 7728/7728/7728 -g charts -o chart0000 -s off -f 7725/7725/7725 7726/7726/7726 7727/7727/7727 -f 7725/7725/7725 7727/7727/7727 7728/7728/7728 -v -3737.25 16371 2226.97 -vt 0.889027 0.152102 -v -3737.25 16356 2226.97 -vt 0.889027 0.152927 -v -3737.25 16356 2777.51 -vt 0.88404 0.152927 -v -3737.25 16371 2777.51 -vt 0.88404 0.152102 -o mesh1575 -s off -f 7729/7729/7729 7730/7730/7730 7731/7731/7731 -f 7729/7729/7729 7731/7731/7731 7732/7732/7732 -g charts -o chart0000 -s off -f 7729/7729/7729 7730/7730/7730 7731/7731/7731 -f 7729/7729/7729 7731/7731/7731 7732/7732/7732 -v -5166 16318.5 2197.43 -vt 0.24632 0.631246 -v -5166 16318.5 2226.97 -vt 0.24632 0.631478 -v -4284.75 16318.5 2197.43 -vt 0.239133 0.631246 -v -5166 16318.5 2777.51 -vt 0.24632 0.635793 -v -4738.5 16318.5 2226.97 -vt 0.242834 0.631478 -v -4712.25 16318.5 2226.97 -vt 0.242619 0.631478 -v -4712.25 16318.5 2777.51 -vt 0.242619 0.635793 -v -4284.75 16318.5 2226.97 -vt 0.239133 0.631478 -v -4284.75 16318.5 -40.6129 -vt 0.239133 0.613706 -v -4284.75 16318.5 2777.51 -vt 0.239133 0.635793 -v -5286 16318.5 2912.51 -vt 0.247298 0.636851 -v -5286 16318.5 -243.113 -vt 0.247298 0.612119 -v -4164.75 16318.5 2912.51 -vt 0.238155 0.636851 -v -4738.5 16318.5 2777.51 -vt 0.242834 0.635793 -v -4164.75 16318.5 -243.113 -vt 0.238155 0.612119 -v -5166 16318.5 -40.6129 -vt 0.24632 0.613706 -o mesh1576 -s off -f 7733/7733/7733 7734/7734/7734 7735/7735/7735 -f 7734/7734/7734 7733/7733/7733 7736/7736/7736 -f 7735/7735/7735 7734/7734/7734 7737/7737/7737 -f 7735/7735/7735 7737/7737/7737 7738/7738/7738 -f 7738/7738/7738 7737/7737/7737 7739/7739/7739 -f 7735/7735/7735 7738/7738/7738 7740/7740/7740 -f 7735/7735/7735 7740/7740/7740 7741/7741/7741 -f 7741/7741/7741 7740/7740/7740 7742/7742/7742 -f 7743/7743/7743 7736/7736/7736 7744/7744/7744 -f 7736/7736/7736 7743/7743/7743 7745/7745/7745 -f 7744/7744/7744 7736/7736/7736 7733/7733/7733 -f 7736/7736/7736 7745/7745/7745 7746/7746/7746 -f 7746/7746/7746 7745/7745/7745 7739/7739/7739 -f 7746/7746/7746 7739/7739/7739 7737/7737/7737 -f 7739/7739/7739 7745/7745/7745 7742/7742/7742 -f 7742/7742/7742 7745/7745/7745 7747/7747/7747 -f 7744/7744/7744 7748/7748/7748 7747/7747/7747 -f 7748/7748/7748 7744/7744/7744 7733/7733/7733 -f 7747/7747/7747 7748/7748/7748 7741/7741/7741 -f 7747/7747/7747 7741/7741/7741 7742/7742/7742 -g charts -o chart0000 -s off -f 7733/7733/7733 7734/7734/7734 7735/7735/7735 -f 7734/7734/7734 7733/7733/7733 7736/7736/7736 -f 7735/7735/7735 7734/7734/7734 7737/7737/7737 -f 7735/7735/7735 7737/7737/7737 7738/7738/7738 -f 7738/7738/7738 7737/7737/7737 7739/7739/7739 -f 7735/7735/7735 7738/7738/7738 7740/7740/7740 -f 7735/7735/7735 7740/7740/7740 7741/7741/7741 -f 7741/7741/7741 7740/7740/7740 7742/7742/7742 -f 7743/7743/7743 7736/7736/7736 7744/7744/7744 -f 7736/7736/7736 7743/7743/7743 7745/7745/7745 -f 7744/7744/7744 7736/7736/7736 7733/7733/7733 -f 7736/7736/7736 7745/7745/7745 7746/7746/7746 -f 7746/7746/7746 7745/7745/7745 7739/7739/7739 -f 7746/7746/7746 7739/7739/7739 7737/7737/7737 -f 7739/7739/7739 7745/7745/7745 7742/7742/7742 -f 7742/7742/7742 7745/7745/7745 7747/7747/7747 -f 7744/7744/7744 7748/7748/7748 7747/7747/7747 -f 7748/7748/7748 7744/7744/7744 7733/7733/7733 -f 7747/7747/7747 7748/7748/7748 7741/7741/7741 -f 7747/7747/7747 7741/7741/7741 7742/7742/7742 -v -5286 16266 2912.51 -vt 0.707814 0.592333 -v -4164.75 16266 2912.51 -vt 0.69867 0.592333 -v -4164.75 16318.5 2912.51 -vt 0.69867 0.591509 -v -5286 16318.5 2912.51 -vt 0.707814 0.591509 -o mesh1577 -s off -f 7749/7749/7749 7750/7750/7750 7751/7751/7751 -f 7749/7749/7749 7751/7751/7751 7752/7752/7752 -g charts -o chart0000 -s off -f 7749/7749/7749 7750/7750/7750 7751/7751/7751 -f 7749/7749/7749 7751/7751/7751 7752/7752/7752 -v -4164.75 16266 -243.113 -vt 0.0162095 0.338417 -v -5286 16266 -243.113 -vt 0.0162095 0.347485 -v -5286 16318.5 -243.113 -vt 0.0170406 0.347485 -v -4164.75 16318.5 -243.113 -vt 0.0170406 0.338417 -o mesh1578 -s off -f 7753/7753/7753 7754/7754/7754 7755/7755/7755 -f 7753/7753/7753 7755/7755/7755 7756/7756/7756 -g charts -o chart0000 -s off -f 7753/7753/7753 7754/7754/7754 7755/7755/7755 -f 7753/7753/7753 7755/7755/7755 7756/7756/7756 -v -4164.75 16266 2912.51 -vt 0.617207 0.523908 -v -4164.75 16266 -243.113 -vt 0.642145 0.523908 -v -4164.75 16318.5 -243.113 -vt 0.642145 0.524732 -v -4164.75 16318.5 2912.51 -vt 0.617207 0.524732 -o mesh1579 -s off -f 7757/7757/7757 7758/7758/7758 7759/7759/7759 -f 7757/7757/7757 7759/7759/7759 7760/7760/7760 -g charts -o chart0000 -s off -f 7757/7757/7757 7758/7758/7758 7759/7759/7759 -f 7757/7757/7757 7759/7759/7759 7760/7760/7760 -v -5166 16266 -40.6129 -vt 0.0394845 0.408491 -v -4284.75 16266 -40.6129 -vt 0.0394845 0.401072 -v -4284.75 16318.5 -40.6129 -vt 0.0386534 0.401072 -v -5166 16318.5 -40.6129 -vt 0.0386534 0.408491 -o mesh1580 -s off -f 7761/7761/7761 7762/7762/7762 7763/7763/7763 -f 7761/7761/7761 7763/7763/7763 7764/7764/7764 -g charts -o chart0000 -s off -f 7761/7761/7761 7762/7762/7762 7763/7763/7763 -f 7761/7761/7761 7763/7763/7763 7764/7764/7764 -v -5166 16266 2777.51 -vt 0.828346 0.81657 -v -5166 16266 -40.6129 -vt 0.851621 0.81657 -v -5166 16318.5 -40.6129 -vt 0.851621 0.815746 -v -5166 16318.5 2197.43 -vt 0.833137 0.815746 -v -5166 16303.5 2197.43 -vt 0.833137 0.815982 -v -5166 16303.5 2226.97 -vt 0.832893 0.815982 -v -5166 16266 2777.51 -vt 0.894846 0.387881 -v -5166 16303.5 2226.97 -vt 0.889859 0.387292 -v -5166 16318.5 2226.97 -vt 0.889859 0.387057 -v -5166 16318.5 2777.51 -vt 0.894846 0.387057 -o mesh1581 -s off -f 7765/7765/7765 7766/7766/7766 7767/7767/7767 -f 7765/7765/7765 7767/7767/7767 7768/7768/7768 -f 7765/7765/7765 7768/7768/7768 7769/7769/7769 -f 7765/7765/7765 7769/7769/7769 7770/7770/7770 -f 7771/7771/7771 7772/7772/7772 7773/7773/7773 -f 7771/7771/7771 7773/7773/7773 7774/7774/7774 -g charts -o chart0000 -s off -f 7765/7765/7765 7766/7766/7766 7767/7767/7767 -f 7765/7765/7765 7767/7767/7767 7768/7768/7768 -f 7765/7765/7765 7768/7768/7768 7769/7769/7769 -f 7765/7765/7765 7769/7769/7769 7770/7770/7770 -o chart0001 -s off -f 7771/7771/7771 7772/7772/7772 7773/7773/7773 -f 7771/7771/7771 7773/7773/7773 7774/7774/7774 -v -4284.75 16266 2777.51 -vt 0.436825 0.455482 -v -5166 16266 2777.51 -vt 0.436825 0.463726 -v -5166 16318.5 2777.51 -vt 0.437656 0.463726 -v -4738.5 16318.5 2777.51 -vt 0.437656 0.459727 -v -4738.5 16303.5 2777.51 -vt 0.437418 0.459727 -v -4712.25 16303.5 2777.51 -vt 0.437418 0.459482 -v -4284.75 16266 2777.51 -vt 0.986284 0.531327 -v -4712.25 16303.5 2777.51 -vt 0.986878 0.535449 -v -4712.25 16318.5 2777.51 -vt 0.987115 0.535449 -v -4284.75 16318.5 2777.51 -vt 0.987115 0.531327 -o mesh1582 -s off -f 7775/7775/7775 7776/7776/7776 7777/7777/7777 -f 7775/7775/7775 7777/7777/7777 7778/7778/7778 -f 7775/7775/7775 7778/7778/7778 7779/7779/7779 -f 7775/7775/7775 7779/7779/7779 7780/7780/7780 -f 7781/7781/7781 7782/7782/7782 7783/7783/7783 -f 7781/7781/7781 7783/7783/7783 7784/7784/7784 -g charts -o chart0000 -s off -f 7775/7775/7775 7776/7776/7776 7777/7777/7777 -f 7775/7775/7775 7777/7777/7777 7778/7778/7778 -f 7775/7775/7775 7778/7778/7778 7779/7779/7779 -f 7775/7775/7775 7779/7779/7779 7780/7780/7780 -o chart0001 -s off -f 7781/7781/7781 7782/7782/7782 7783/7783/7783 -f 7781/7781/7781 7783/7783/7783 7784/7784/7784 -v -5286 16266 -243.113 -vt 0.125935 0.988046 -v -5166 16266 -40.6129 -vt 0.124957 0.986459 -v -5166 16266 2777.51 -vt 0.124957 0.964372 -v -4164.75 16266 -243.113 -vt 0.116791 0.988046 -v -4284.75 16266 -40.6129 -vt 0.11777 0.986459 -v -4284.75 16266 2777.51 -vt 0.11777 0.964372 -v -5286 16266 2912.51 -vt 0.125935 0.963314 -v -4164.75 16266 2912.51 -vt 0.116791 0.963314 -o mesh1583 -s off -f 7785/7785/7785 7786/7786/7786 7787/7787/7787 -f 7786/7786/7786 7785/7785/7785 7788/7788/7788 -f 7786/7786/7786 7788/7788/7788 7789/7789/7789 -f 7789/7789/7789 7788/7788/7788 7790/7790/7790 -f 7791/7791/7791 7787/7787/7787 7792/7792/7792 -f 7787/7787/7787 7791/7791/7791 7785/7785/7785 -f 7792/7792/7792 7787/7787/7787 7790/7790/7790 -f 7792/7792/7792 7790/7790/7790 7788/7788/7788 -g charts -o chart0000 -s off -f 7785/7785/7785 7786/7786/7786 7787/7787/7787 -f 7786/7786/7786 7785/7785/7785 7788/7788/7788 -f 7786/7786/7786 7788/7788/7788 7789/7789/7789 -f 7789/7789/7789 7788/7788/7788 7790/7790/7790 -f 7791/7791/7791 7787/7787/7787 7792/7792/7792 -f 7787/7787/7787 7791/7791/7791 7785/7785/7785 -f 7792/7792/7792 7787/7787/7787 7790/7790/7790 -f 7792/7792/7792 7790/7790/7790 7788/7788/7788 -v -5286 16266 -243.113 -vt 0.859933 0.998763 -v -5286 16266 2912.51 -vt 0.859933 0.974031 -v -5286 16318.5 2912.51 -vt 0.859102 0.974031 -v -5286 16318.5 -243.113 -vt 0.859102 0.998763 -o mesh1584 -s off -f 7793/7793/7793 7794/7794/7794 7795/7795/7795 -f 7793/7793/7793 7795/7795/7795 7796/7796/7796 -g charts -o chart0000 -s off -f 7793/7793/7793 7794/7794/7794 7795/7795/7795 -f 7793/7793/7793 7795/7795/7795 7796/7796/7796 -v -4284.75 16318.5 2197.43 -vt 0.226053 0.666529 -v -4284.75 16318.5 -40.6129 -vt 0.208229 0.666529 -v -4284.75 16266 -40.6129 -vt 0.208229 0.667354 -v -4284.75 16266 2777.51 -vt 0.230673 0.667354 -v -4284.75 16318.5 2777.51 -vt 0.230673 0.666529 -v -4284.75 16318.5 2226.97 -vt 0.226289 0.666529 -v -4284.75 16318.5 2197.43 -vt 0.861596 0.903133 -v -4284.75 16318.5 2226.97 -vt 0.862427 0.903133 -v -4284.75 16303.5 2226.97 -vt 0.862427 0.903957 -v -4284.75 16303.5 2197.43 -vt 0.861596 0.903957 -o mesh1585 -s off -f 7797/7797/7797 7798/7798/7798 7799/7799/7799 -f 7797/7797/7797 7799/7799/7799 7800/7800/7800 -f 7797/7797/7797 7800/7800/7800 7801/7801/7801 -f 7797/7797/7797 7801/7801/7801 7802/7802/7802 -f 7803/7803/7803 7804/7804/7804 7805/7805/7805 -f 7803/7803/7803 7805/7805/7805 7806/7806/7806 -g charts -o chart0000 -s off -f 7797/7797/7797 7798/7798/7798 7799/7799/7799 -f 7797/7797/7797 7799/7799/7799 7800/7800/7800 -f 7797/7797/7797 7800/7800/7800 7801/7801/7801 -f 7797/7797/7797 7801/7801/7801 7802/7802/7802 -o chart0001 -s off -f 7803/7803/7803 7804/7804/7804 7805/7805/7805 -f 7803/7803/7803 7805/7805/7805 7806/7806/7806 -v -4738.5 16318.5 2226.97 -vt 0.229011 0.669827 -v -5166 16318.5 2226.97 -vt 0.229011 0.673949 -v -5166 16303.5 2226.97 -vt 0.229842 0.673949 -v -4738.5 16303.5 2226.97 -vt 0.229842 0.669827 -o mesh1586 -s off -f 7807/7807/7807 7808/7808/7808 7809/7809/7809 -f 7807/7807/7807 7809/7809/7809 7810/7810/7810 -g charts -o chart0000 -s off -f 7807/7807/7807 7808/7808/7808 7809/7809/7809 -f 7807/7807/7807 7809/7809/7809 7810/7810/7810 -v -4284.75 16303.5 2197.43 -vt 0.176642 0.615416 -v -4284.75 16303.5 2226.97 -vt 0.176622 0.614592 -v -4712.25 16303.5 2226.97 -vt 0.172485 0.615416 -v -4284.75 16303.5 2197.43 -vt 0.708645 0.608821 -v -4712.25 16303.5 2226.97 -vt 0.710885 0.605523 -v -4712.25 16303.5 2777.51 -vt 0.714464 0.608821 -v -4284.75 16303.5 2197.43 -vt 0.88404 0.161995 -v -4712.25 16303.5 2777.51 -vt 0.880411 0.157049 -v -4738.5 16303.5 2777.51 -vt 0.880188 0.157049 -v -4738.5 16303.5 2226.97 -vt 0.880188 0.161743 -v -5166 16303.5 2226.97 -vt 0.876559 0.161743 -v -5166 16303.5 2197.43 -vt 0.876559 0.161995 -o mesh1587 -s off -f 7811/7811/7811 7812/7812/7812 7813/7813/7813 -f 7814/7814/7814 7815/7815/7815 7816/7816/7816 -f 7817/7817/7817 7818/7818/7818 7819/7819/7819 -f 7817/7817/7817 7819/7819/7819 7820/7820/7820 -f 7817/7817/7817 7820/7820/7820 7821/7821/7821 -f 7817/7817/7817 7821/7821/7821 7822/7822/7822 -g charts -o chart0000 -s off -f 7811/7811/7811 7812/7812/7812 7813/7813/7813 -o chart0001 -s off -f 7814/7814/7814 7815/7815/7815 7816/7816/7816 -o chart0002 -s off -f 7817/7817/7817 7818/7818/7818 7819/7819/7819 -f 7817/7817/7817 7819/7819/7819 7820/7820/7820 -f 7817/7817/7817 7820/7820/7820 7821/7821/7821 -f 7817/7817/7817 7821/7821/7821 7822/7822/7822 -v -4284.75 16318.5 2197.43 -vt 0.146716 0.748145 -v -4284.75 16303.5 2197.43 -vt 0.146716 0.747321 -v -5166 16303.5 2197.43 -vt 0.139235 0.747321 -v -5166 16318.5 2197.43 -vt 0.139235 0.748145 -o mesh1588 -s off -f 7823/7823/7823 7824/7824/7824 7825/7825/7825 -f 7823/7823/7823 7825/7825/7825 7826/7826/7826 -g charts -o chart0000 -s off -f 7823/7823/7823 7824/7824/7824 7825/7825/7825 -f 7823/7823/7823 7825/7825/7825 7826/7826/7826 -v -4712.25 16303.5 2226.97 -vt 0.642145 0.763809 -v -4284.75 16303.5 2226.97 -vt 0.637988 0.763809 -v -4284.75 16318.5 2226.97 -vt 0.637988 0.762984 -v -4712.25 16318.5 2226.97 -vt 0.642145 0.762984 -o mesh1589 -s off -f 7827/7827/7827 7828/7828/7828 7829/7829/7829 -f 7827/7827/7827 7829/7829/7829 7830/7830/7830 -g charts -o chart0000 -s off -f 7827/7827/7827 7828/7828/7828 7829/7829/7829 -f 7827/7827/7827 7829/7829/7829 7830/7830/7830 -v -4712.25 16303.5 2226.97 -vt 0.529925 0.959192 -v -4712.25 16318.5 2226.97 -vt 0.530756 0.959192 -v -4712.25 16318.5 2777.51 -vt 0.530756 0.954246 -v -4712.25 16303.5 2777.51 -vt 0.529925 0.954246 -o mesh1590 -s off -f 7831/7831/7831 7832/7832/7832 7833/7833/7833 -f 7831/7831/7831 7833/7833/7833 7834/7834/7834 -g charts -o chart0000 -s off -f 7831/7831/7831 7832/7832/7832 7833/7833/7833 -f 7831/7831/7831 7833/7833/7833 7834/7834/7834 -v -4738.5 16318.5 2226.97 -vt 0.554032 0.83141 -v -4738.5 16303.5 2226.97 -vt 0.554863 0.83141 -v -4738.5 16303.5 2777.51 -vt 0.554863 0.826463 -v -4738.5 16318.5 2777.51 -vt 0.554032 0.826463 -o mesh1591 -s off -f 7835/7835/7835 7836/7836/7836 7837/7837/7837 -f 7835/7835/7835 7837/7837/7837 7838/7838/7838 -g charts -o chart0000 -s off -f 7835/7835/7835 7836/7836/7836 7837/7837/7837 -f 7835/7835/7835 7837/7837/7837 7838/7838/7838 -v -3043.5 16371 2197.43 -vt 0.808248 0.340232 -v -2162.25 16371 2226.97 -vt 0.801062 0.340464 -v -2162.25 16371 2197.43 -vt 0.801062 0.340232 -v -2162.25 16371 2777.51 -vt 0.801062 0.344779 -v -2589.75 16371 2226.97 -vt 0.804548 0.340464 -v -2616 16371 2226.97 -vt 0.804762 0.340464 -v -2616 16371 2777.51 -vt 0.804762 0.344779 -v -3043.5 16371 2226.97 -vt 0.808248 0.340464 -v -3043.5 16371 -40.6129 -vt 0.808248 0.322692 -v -3043.5 16371 2777.51 -vt 0.808248 0.344779 -v -2042.25 16371 -243.113 -vt 0.800083 0.321105 -v -2042.25 16371 2912.51 -vt 0.800083 0.345837 -v -3163.5 16371 2912.51 -vt 0.809227 0.345837 -v -2589.75 16371 2777.51 -vt 0.804548 0.344779 -v -3163.5 16371 -243.113 -vt 0.809227 0.321105 -v -2162.25 16371 -40.6129 -vt 0.801062 0.322692 -o mesh1592 -s off -f 7839/7839/7839 7840/7840/7840 7841/7841/7841 -f 7842/7842/7842 7841/7841/7841 7840/7840/7840 -f 7843/7843/7843 7840/7840/7840 7839/7839/7839 -f 7844/7844/7844 7843/7843/7843 7839/7839/7839 -f 7845/7845/7845 7843/7843/7843 7844/7844/7844 -f 7846/7846/7846 7844/7844/7844 7839/7839/7839 -f 7847/7847/7847 7846/7846/7846 7839/7839/7839 -f 7848/7848/7848 7846/7846/7846 7847/7847/7847 -f 7849/7849/7849 7842/7842/7842 7850/7850/7850 -f 7851/7851/7851 7850/7850/7850 7842/7842/7842 -f 7841/7841/7841 7842/7842/7842 7849/7849/7849 -f 7852/7852/7852 7851/7851/7851 7842/7842/7842 -f 7845/7845/7845 7851/7851/7851 7852/7852/7852 -f 7843/7843/7843 7845/7845/7845 7852/7852/7852 -f 7848/7848/7848 7851/7851/7851 7845/7845/7845 -f 7853/7853/7853 7851/7851/7851 7848/7848/7848 -f 7853/7853/7853 7854/7854/7854 7849/7849/7849 -f 7841/7841/7841 7849/7849/7849 7854/7854/7854 -f 7847/7847/7847 7854/7854/7854 7853/7853/7853 -f 7848/7848/7848 7847/7847/7847 7853/7853/7853 -g charts -o chart0000 -s off -f 7839/7839/7839 7840/7840/7840 7841/7841/7841 -f 7842/7842/7842 7841/7841/7841 7840/7840/7840 -f 7843/7843/7843 7840/7840/7840 7839/7839/7839 -f 7844/7844/7844 7843/7843/7843 7839/7839/7839 -f 7845/7845/7845 7843/7843/7843 7844/7844/7844 -f 7846/7846/7846 7844/7844/7844 7839/7839/7839 -f 7847/7847/7847 7846/7846/7846 7839/7839/7839 -f 7848/7848/7848 7846/7846/7846 7847/7847/7847 -f 7849/7849/7849 7842/7842/7842 7850/7850/7850 -f 7851/7851/7851 7850/7850/7850 7842/7842/7842 -f 7841/7841/7841 7842/7842/7842 7849/7849/7849 -f 7852/7852/7852 7851/7851/7851 7842/7842/7842 -f 7845/7845/7845 7851/7851/7851 7852/7852/7852 -f 7843/7843/7843 7845/7845/7845 7852/7852/7852 -f 7848/7848/7848 7851/7851/7851 7845/7845/7845 -f 7853/7853/7853 7851/7851/7851 7848/7848/7848 -f 7853/7853/7853 7854/7854/7854 7849/7849/7849 -f 7841/7841/7841 7849/7849/7849 7854/7854/7854 -f 7847/7847/7847 7854/7854/7854 7853/7853/7853 -f 7848/7848/7848 7847/7847/7847 7853/7853/7853 -v -2042.25 16371 2912.51 -vt 0.0045719 0.559357 -v -3163.5 16371 2912.51 -vt 0.0045719 0.568425 -v -3163.5 16318.5 2912.51 -vt 0.00540308 0.568425 -v -2042.25 16318.5 2912.51 -vt 0.00540308 0.559357 -o mesh1593 -s off -f 7855/7855/7855 7856/7856/7856 7857/7857/7857 -f 7855/7855/7855 7857/7857/7857 7858/7858/7858 -g charts -o chart0000 -s off -f 7855/7855/7855 7856/7856/7856 7857/7857/7857 -f 7855/7855/7855 7857/7857/7857 7858/7858/7858 -v -3163.5 16371 -243.113 -vt 0.456775 0.599753 -v -2042.25 16371 -243.113 -vt 0.447631 0.599753 -v -2042.25 16318.5 -243.113 -vt 0.447631 0.598928 -v -3163.5 16318.5 -243.113 -vt 0.456775 0.598928 -o mesh1594 -s off -f 7859/7859/7859 7860/7860/7860 7861/7861/7861 -f 7859/7859/7859 7861/7861/7861 7862/7862/7862 -g charts -o chart0000 -s off -f 7859/7859/7859 7860/7860/7860 7861/7861/7861 -f 7859/7859/7859 7861/7861/7861 7862/7862/7862 -v -3163.5 16371 2912.51 -vt 0.0469659 0.415911 -v -3163.5 16371 -243.113 -vt 0.0719035 0.415911 -v -3163.5 16318.5 -243.113 -vt 0.0719035 0.416735 -v -3163.5 16318.5 2912.51 -vt 0.0469659 0.416735 -o mesh1595 -s off -f 7863/7863/7863 7864/7864/7864 7865/7865/7865 -f 7863/7863/7863 7865/7865/7865 7866/7866/7866 -g charts -o chart0000 -s off -f 7863/7863/7863 7864/7864/7864 7865/7865/7865 -f 7863/7863/7863 7865/7865/7865 7866/7866/7866 -v -2162.25 16371 -40.6129 -vt 0.324605 0.989695 -v -3043.5 16371 -40.6129 -vt 0.332086 0.989695 -v -3043.5 16318.5 -40.6129 -vt 0.332086 0.990519 -v -2162.25 16318.5 -40.6129 -vt 0.324605 0.990519 -o mesh1596 -s off -f 7867/7867/7867 7868/7868/7868 7869/7869/7869 -f 7867/7867/7867 7869/7869/7869 7870/7870/7870 -g charts -o chart0000 -s off -f 7867/7867/7867 7868/7868/7868 7869/7869/7869 -f 7867/7867/7867 7869/7869/7869 7870/7870/7870 -v -2162.25 16371 2777.51 -vt 0.968828 0.496702 -v -2162.25 16371 2226.97 -vt 0.968828 0.501649 -v -2162.25 16356 2226.97 -vt 0.969659 0.501649 -v -2162.25 16371 2777.51 -vt 0.360349 0.923743 -v -2162.25 16356 2226.97 -vt 0.355964 0.924567 -v -2162.25 16356 2197.43 -vt 0.355729 0.924567 -v -2162.25 16371 2197.43 -vt 0.355729 0.923743 -v -2162.25 16371 -40.6129 -vt 0.337905 0.923743 -v -2162.25 16371 2777.51 -vt 0.416874 0.71352 -v -2162.25 16371 -40.6129 -vt 0.439318 0.71352 -v -2162.25 16318.5 -40.6129 -vt 0.439318 0.714345 -v -2162.25 16318.5 2777.51 -vt 0.416874 0.714345 -o mesh1597 -s off -f 7871/7871/7871 7872/7872/7872 7873/7873/7873 -f 7874/7874/7874 7875/7875/7875 7876/7876/7876 -f 7874/7874/7874 7876/7876/7876 7877/7877/7877 -f 7874/7874/7874 7877/7877/7877 7878/7878/7878 -f 7879/7879/7879 7880/7880/7880 7881/7881/7881 -f 7879/7879/7879 7881/7881/7881 7882/7882/7882 -g charts -o chart0000 -s off -f 7871/7871/7871 7872/7872/7872 7873/7873/7873 -o chart0001 -s off -f 7874/7874/7874 7875/7875/7875 7876/7876/7876 -f 7874/7874/7874 7876/7876/7876 7877/7877/7877 -f 7874/7874/7874 7877/7877/7877 7878/7878/7878 -o chart0002 -s off -f 7879/7879/7879 7880/7880/7880 7881/7881/7881 -f 7879/7879/7879 7881/7881/7881 7882/7882/7882 -v -3043.5 16371 2777.51 -vt 0.816708 0.108409 -v -2616 16371 2777.51 -vt 0.816708 0.112531 -v -2616 16356 2777.51 -vt 0.815877 0.112531 -v -3043.5 16371 2777.51 -vt 0.237323 0.883347 -v -2616 16356 2777.51 -vt 0.233291 0.883111 -v -2589.75 16356 2777.51 -vt 0.233043 0.883111 -v -2589.75 16371 2777.51 -vt 0.233043 0.883347 -v -2162.25 16371 2777.51 -vt 0.229011 0.883347 -v -2162.25 16318.5 2777.51 -vt 0.229011 0.882523 -v -3043.5 16318.5 2777.51 -vt 0.237323 0.882523 -o mesh1598 -s off -f 7883/7883/7883 7884/7884/7884 7885/7885/7885 -f 7886/7886/7886 7887/7887/7887 7888/7888/7888 -f 7886/7886/7886 7888/7888/7888 7889/7889/7889 -f 7886/7886/7886 7889/7889/7889 7890/7890/7890 -f 7886/7886/7886 7890/7890/7890 7891/7891/7891 -f 7886/7886/7886 7891/7891/7891 7892/7892/7892 -g charts -o chart0000 -s off -f 7883/7883/7883 7884/7884/7884 7885/7885/7885 -o chart0001 -s off -f 7886/7886/7886 7887/7887/7887 7888/7888/7888 -f 7886/7886/7886 7888/7888/7888 7889/7889/7889 -f 7886/7886/7886 7889/7889/7889 7890/7890/7890 -f 7886/7886/7886 7890/7890/7890 7891/7891/7891 -f 7886/7886/7886 7891/7891/7891 7892/7892/7892 -v -2162.25 16318.5 2777.51 -vt 0.810205 0.504356 -v -2162.25 16318.5 -40.6129 -vt 0.810205 0.526443 -v -2042.25 16318.5 -243.113 -vt 0.809227 0.52803 -v -3163.5 16318.5 -243.113 -vt 0.818371 0.52803 -v -3043.5 16318.5 -40.6129 -vt 0.817392 0.526443 -v -3043.5 16318.5 2777.51 -vt 0.817392 0.504356 -v -3163.5 16318.5 2912.51 -vt 0.818371 0.503298 -v -2042.25 16318.5 2912.51 -vt 0.809227 0.503298 -o mesh1599 -s off -f 7893/7893/7893 7894/7894/7894 7895/7895/7895 -f 7896/7896/7896 7895/7895/7895 7894/7894/7894 -f 7897/7897/7897 7896/7896/7896 7894/7894/7894 -f 7898/7898/7898 7896/7896/7896 7897/7897/7897 -f 7899/7899/7899 7893/7893/7893 7900/7900/7900 -f 7895/7895/7895 7900/7900/7900 7893/7893/7893 -f 7898/7898/7898 7893/7893/7893 7899/7899/7899 -f 7896/7896/7896 7898/7898/7898 7899/7899/7899 -g charts -o chart0000 -s off -f 7893/7893/7893 7894/7894/7894 7895/7895/7895 -f 7896/7896/7896 7895/7895/7895 7894/7894/7894 -f 7897/7897/7897 7896/7896/7896 7894/7894/7894 -f 7898/7898/7898 7896/7896/7896 7897/7897/7897 -f 7899/7899/7899 7893/7893/7893 7900/7900/7900 -f 7895/7895/7895 7900/7900/7900 7893/7893/7893 -f 7898/7898/7898 7893/7893/7893 7899/7899/7899 -f 7896/7896/7896 7898/7898/7898 7899/7899/7899 -v -2042.25 16371 -243.113 -vt 0.431006 0.199093 -v -2042.25 16371 2912.51 -vt 0.431006 0.174361 -v -2042.25 16318.5 2912.51 -vt 0.430175 0.174361 -v -2042.25 16318.5 -243.113 -vt 0.430175 0.199093 -o mesh1600 -s off -f 7901/7901/7901 7902/7902/7902 7903/7903/7903 -f 7901/7901/7901 7903/7903/7903 7904/7904/7904 -g charts -o chart0000 -s off -f 7901/7901/7901 7902/7902/7902 7903/7903/7903 -f 7901/7901/7901 7903/7903/7903 7904/7904/7904 -v -3043.5 16356 2197.43 -vt 0.335411 0.447238 -v -3043.5 16356 2226.97 -vt 0.335411 0.448063 -v -3043.5 16371 2226.97 -vt 0.33458 0.448063 -v -3043.5 16356 2197.43 -vt 0.981664 0.241373 -v -3043.5 16371 2226.97 -vt 0.9819 0.241138 -v -3043.5 16371 2777.51 -vt 0.986284 0.241138 -v -3043.5 16318.5 2777.51 -vt 0.986284 0.241962 -v -3043.5 16318.5 -40.6129 -vt 0.96384 0.241962 -v -3043.5 16371 -40.6129 -vt 0.96384 0.241138 -v -3043.5 16371 2197.43 -vt 0.981664 0.241138 -o mesh1601 -s off -f 7905/7905/7905 7906/7906/7906 7907/7907/7907 -f 7908/7908/7908 7909/7909/7909 7910/7910/7910 -f 7908/7908/7908 7910/7910/7910 7911/7911/7911 -f 7908/7908/7908 7911/7911/7911 7912/7912/7912 -f 7908/7908/7908 7912/7912/7912 7913/7913/7913 -f 7908/7908/7908 7913/7913/7913 7914/7914/7914 -g charts -o chart0000 -s off -f 7905/7905/7905 7906/7906/7906 7907/7907/7907 -o chart0001 -s off -f 7908/7908/7908 7909/7909/7909 7910/7910/7910 -f 7908/7908/7908 7910/7910/7910 7911/7911/7911 -f 7908/7908/7908 7911/7911/7911 7912/7912/7912 -f 7908/7908/7908 7912/7912/7912 7913/7913/7913 -f 7908/7908/7908 7913/7913/7913 7914/7914/7914 -v -2589.75 16356 2226.97 -vt 0.447631 0.167766 -v -2162.25 16356 2226.97 -vt 0.447631 0.163644 -v -2162.25 16371 2226.97 -vt 0.4468 0.163644 -v -2589.75 16371 2226.97 -vt 0.4468 0.167766 -o mesh1602 -s off -f 7915/7915/7915 7916/7916/7916 7917/7917/7917 -f 7915/7915/7915 7917/7917/7917 7918/7918/7918 -g charts -o chart0000 -s off -f 7915/7915/7915 7916/7916/7916 7917/7917/7917 -f 7915/7915/7915 7917/7917/7917 7918/7918/7918 -v -2162.25 16356 2197.43 -vt 0.070241 0.194147 -v -2162.25 16356 2226.97 -vt 0.0694098 0.194127 -v -2589.75 16356 2226.97 -vt 0.070241 0.190025 -v -2162.25 16356 2197.43 -vt 0.963009 0.248557 -v -2589.75 16356 2226.97 -vt 0.959684 0.250779 -v -2589.75 16356 2777.51 -vt 0.963009 0.254328 -v -2162.25 16356 2197.43 -vt 0.4601 0.330997 -v -2589.75 16356 2777.51 -vt 0.45647 0.326051 -v -2616 16356 2777.51 -vt 0.456248 0.326051 -v -2616 16356 2226.97 -vt 0.456248 0.330746 -v -3043.5 16356 2226.97 -vt 0.452618 0.330746 -v -3043.5 16356 2197.43 -vt 0.452618 0.330997 -o mesh1603 -s off -f 7919/7919/7919 7920/7920/7920 7921/7921/7921 -f 7922/7922/7922 7923/7923/7923 7924/7924/7924 -f 7925/7925/7925 7926/7926/7926 7927/7927/7927 -f 7925/7925/7925 7927/7927/7927 7928/7928/7928 -f 7925/7925/7925 7928/7928/7928 7929/7929/7929 -f 7925/7925/7925 7929/7929/7929 7930/7930/7930 -g charts -o chart0000 -s off -f 7919/7919/7919 7920/7920/7920 7921/7921/7921 -o chart0001 -s off -f 7922/7922/7922 7923/7923/7923 7924/7924/7924 -o chart0002 -s off -f 7925/7925/7925 7926/7926/7926 7927/7927/7927 -f 7925/7925/7925 7927/7927/7927 7928/7928/7928 -f 7925/7925/7925 7928/7928/7928 7929/7929/7929 -f 7925/7925/7925 7929/7929/7929 7930/7930/7930 -v -2162.25 16371 2197.43 -vt 0.623857 0.462077 -v -2162.25 16356 2197.43 -vt 0.623857 0.461253 -v -3043.5 16356 2197.43 -vt 0.616376 0.461253 -v -3043.5 16371 2197.43 -vt 0.616376 0.462077 -o mesh1604 -s off -f 7931/7931/7931 7932/7932/7932 7933/7933/7933 -f 7931/7931/7931 7933/7933/7933 7934/7934/7934 -g charts -o chart0000 -s off -f 7931/7931/7931 7932/7932/7932 7933/7933/7933 -f 7931/7931/7931 7933/7933/7933 7934/7934/7934 -v -2616 16371 2226.97 -vt 0.167498 0.58986 -v -3043.5 16371 2226.97 -vt 0.171654 0.58986 -v -3043.5 16356 2226.97 -vt 0.171654 0.590684 -v -2616 16356 2226.97 -vt 0.167498 0.590684 -o mesh1605 -s off -f 7935/7935/7935 7936/7936/7936 7937/7937/7937 -f 7935/7935/7935 7937/7937/7937 7938/7938/7938 -g charts -o chart0000 -s off -f 7935/7935/7935 7936/7936/7936 7937/7937/7937 -f 7935/7935/7935 7937/7937/7937 7938/7938/7938 -v -2616 16356 2777.51 -vt 0.986284 0.589035 -v -2616 16371 2777.51 -vt 0.985453 0.589035 -v -2616 16371 2226.97 -vt 0.985453 0.584089 -v -2616 16356 2226.97 -vt 0.986284 0.584089 -o mesh1606 -s off -f 7939/7939/7939 7940/7940/7940 7941/7941/7941 -f 7939/7939/7939 7941/7941/7941 7942/7942/7942 -g charts -o chart0000 -s off -f 7939/7939/7939 7940/7940/7940 7941/7941/7941 -f 7939/7939/7939 7941/7941/7941 7942/7942/7942 -v -2589.75 16371 2777.51 -vt 0.430174 0.992168 -v -2589.75 16356 2777.51 -vt 0.429343 0.992168 -v -2589.75 16356 2226.97 -vt 0.429343 0.987222 -v -2589.75 16371 2226.97 -vt 0.430174 0.987222 -o mesh1607 -s off -f 7943/7943/7943 7944/7944/7944 7945/7945/7945 -f 7943/7943/7943 7945/7945/7945 7946/7946/7946 -g charts -o chart0000 -s off -f 7943/7943/7943 7944/7944/7944 7945/7945/7945 -f 7943/7943/7943 7945/7945/7945 7946/7946/7946 -v -2042.25 16318.5 2197.43 -vt 0.361864 0.366613 -v -1161 16318.5 2226.97 -vt 0.354678 0.366845 -v -1161 16318.5 2197.43 -vt 0.354678 0.366613 -v -1161 16318.5 2777.51 -vt 0.354678 0.37116 -v -1588.5 16318.5 2226.97 -vt 0.358164 0.366845 -v -1614.75 16318.5 2226.97 -vt 0.358378 0.366845 -v -1614.75 16318.5 2777.51 -vt 0.358378 0.37116 -v -2042.25 16318.5 2226.97 -vt 0.361864 0.366845 -v -2042.25 16318.5 -40.6129 -vt 0.361864 0.349073 -v -2042.25 16318.5 2777.51 -vt 0.361864 0.37116 -v -1041 16318.5 -243.113 -vt 0.353699 0.347486 -v -1041 16318.5 2912.51 -vt 0.353699 0.372218 -v -2162.25 16318.5 2912.51 -vt 0.362843 0.372218 -v -1588.5 16318.5 2777.51 -vt 0.358164 0.37116 -v -2162.25 16318.5 -243.113 -vt 0.362843 0.347486 -v -1161 16318.5 -40.6129 -vt 0.354678 0.349073 -o mesh1608 -s off -f 7947/7947/7947 7948/7948/7948 7949/7949/7949 -f 7950/7950/7950 7949/7949/7949 7948/7948/7948 -f 7951/7951/7951 7948/7948/7948 7947/7947/7947 -f 7952/7952/7952 7951/7951/7951 7947/7947/7947 -f 7953/7953/7953 7951/7951/7951 7952/7952/7952 -f 7954/7954/7954 7952/7952/7952 7947/7947/7947 -f 7955/7955/7955 7954/7954/7954 7947/7947/7947 -f 7956/7956/7956 7954/7954/7954 7955/7955/7955 -f 7957/7957/7957 7950/7950/7950 7958/7958/7958 -f 7959/7959/7959 7958/7958/7958 7950/7950/7950 -f 7949/7949/7949 7950/7950/7950 7957/7957/7957 -f 7960/7960/7960 7959/7959/7959 7950/7950/7950 -f 7953/7953/7953 7959/7959/7959 7960/7960/7960 -f 7951/7951/7951 7953/7953/7953 7960/7960/7960 -f 7956/7956/7956 7959/7959/7959 7953/7953/7953 -f 7961/7961/7961 7959/7959/7959 7956/7956/7956 -f 7961/7961/7961 7962/7962/7962 7957/7957/7957 -f 7949/7949/7949 7957/7957/7957 7962/7962/7962 -f 7955/7955/7955 7962/7962/7962 7961/7961/7961 -f 7956/7956/7956 7955/7955/7955 7961/7961/7961 -g charts -o chart0000 -s off -f 7947/7947/7947 7948/7948/7948 7949/7949/7949 -f 7950/7950/7950 7949/7949/7949 7948/7948/7948 -f 7951/7951/7951 7948/7948/7948 7947/7947/7947 -f 7952/7952/7952 7951/7951/7951 7947/7947/7947 -f 7953/7953/7953 7951/7951/7951 7952/7952/7952 -f 7954/7954/7954 7952/7952/7952 7947/7947/7947 -f 7955/7955/7955 7954/7954/7954 7947/7947/7947 -f 7956/7956/7956 7954/7954/7954 7955/7955/7955 -f 7957/7957/7957 7950/7950/7950 7958/7958/7958 -f 7959/7959/7959 7958/7958/7958 7950/7950/7950 -f 7949/7949/7949 7950/7950/7950 7957/7957/7957 -f 7960/7960/7960 7959/7959/7959 7950/7950/7950 -f 7953/7953/7953 7959/7959/7959 7960/7960/7960 -f 7951/7951/7951 7953/7953/7953 7960/7960/7960 -f 7956/7956/7956 7959/7959/7959 7953/7953/7953 -f 7961/7961/7961 7959/7959/7959 7956/7956/7956 -f 7961/7961/7961 7962/7962/7962 7957/7957/7957 -f 7949/7949/7949 7957/7957/7957 7962/7962/7962 -f 7955/7955/7955 7962/7962/7962 7961/7961/7961 -f 7956/7956/7956 7955/7955/7955 7961/7961/7961 -v -1041 16318.5 2912.51 -vt 0.375312 0.594806 -v -2162.25 16318.5 2912.51 -vt 0.384455 0.594806 -v -2162.25 16266 2912.51 -vt 0.384455 0.595631 -v -1041 16266 2912.51 -vt 0.375312 0.595631 -o mesh1609 -s off -f 7963/7963/7963 7964/7964/7964 7965/7965/7965 -f 7963/7963/7963 7965/7965/7965 7966/7966/7966 -g charts -o chart0000 -s off -f 7963/7963/7963 7964/7964/7964 7965/7965/7965 -f 7963/7963/7963 7965/7965/7965 7966/7966/7966 -v -2162.25 16318.5 -243.113 -vt 0.312136 0.998763 -v -1041 16318.5 -243.113 -vt 0.302993 0.998763 -v -1041 16266 -243.113 -vt 0.302993 0.997939 -v -2162.25 16266 -243.113 -vt 0.312136 0.997939 -o mesh1610 -s off -f 7967/7967/7967 7968/7968/7968 7969/7969/7969 -f 7967/7967/7967 7969/7969/7969 7970/7970/7970 -g charts -o chart0000 -s off -f 7967/7967/7967 7968/7968/7968 7969/7969/7969 -f 7967/7967/7967 7969/7969/7969 7970/7970/7970 -v -2162.25 16318.5 2912.51 -vt 0.240648 0.881698 -v -2162.25 16318.5 -243.113 -vt 0.265586 0.881698 -v -2162.25 16266 -243.113 -vt 0.265586 0.882523 -v -2162.25 16266 2912.51 -vt 0.240648 0.882523 -o mesh1611 -s off -f 7971/7971/7971 7972/7972/7972 7973/7973/7973 -f 7971/7971/7971 7973/7973/7973 7974/7974/7974 -g charts -o chart0000 -s off -f 7971/7971/7971 7972/7972/7972 7973/7973/7973 -f 7971/7971/7971 7973/7973/7973 7974/7974/7974 -v -1161 16318.5 -40.6129 -vt 0.723608 0.964139 -v -2042.25 16318.5 -40.6129 -vt 0.723608 0.971558 -v -2042.25 16266 -40.6129 -vt 0.724439 0.971558 -v -1161 16266 -40.6129 -vt 0.724439 0.964139 -o mesh1612 -s off -f 7975/7975/7975 7976/7976/7976 7977/7977/7977 -f 7975/7975/7975 7977/7977/7977 7978/7978/7978 -g charts -o chart0000 -s off -f 7975/7975/7975 7976/7976/7976 7977/7977/7977 -f 7975/7975/7975 7977/7977/7977 7978/7978/7978 -v -1161 16318.5 2777.51 -vt 0.460931 0.850371 -v -1161 16318.5 2226.97 -vt 0.460931 0.855317 -v -1161 16303.5 2226.97 -vt 0.461762 0.855317 -v -1161 16318.5 2777.51 -vt 0.916459 0.0251442 -v -1161 16303.5 2226.97 -vt 0.91729 0.0207958 -v -1161 16303.5 2197.43 -vt 0.91729 0.0205625 -v -1161 16318.5 2197.43 -vt 0.916459 0.0205625 -v -1161 16318.5 -40.6129 -vt 0.916459 0.00288541 -v -1161 16318.5 2777.51 -vt 0.455943 0.193322 -v -1161 16318.5 -40.6129 -vt 0.455943 0.215581 -v -1161 16266 -40.6129 -vt 0.456775 0.215581 -v -1161 16266 2777.51 -vt 0.456775 0.193322 -o mesh1613 -s off -f 7979/7979/7979 7980/7980/7980 7981/7981/7981 -f 7982/7982/7982 7983/7983/7983 7984/7984/7984 -f 7982/7982/7982 7984/7984/7984 7985/7985/7985 -f 7982/7982/7982 7985/7985/7985 7986/7986/7986 -f 7987/7987/7987 7988/7988/7988 7989/7989/7989 -f 7987/7987/7987 7989/7989/7989 7990/7990/7990 -g charts -o chart0000 -s off -f 7979/7979/7979 7980/7980/7980 7981/7981/7981 -o chart0001 -s off -f 7982/7982/7982 7983/7983/7983 7984/7984/7984 -f 7982/7982/7982 7984/7984/7984 7985/7985/7985 -f 7982/7982/7982 7985/7985/7985 7986/7986/7986 -o chart0002 -s off -f 7987/7987/7987 7988/7988/7988 7989/7989/7989 -f 7987/7987/7987 7989/7989/7989 7990/7990/7990 -v -2042.25 16318.5 2777.51 -vt 0.922278 0.41756 -v -1614.75 16318.5 2777.51 -vt 0.926434 0.41756 -v -1614.75 16303.5 2777.51 -vt 0.926434 0.416735 -v -2042.25 16318.5 2777.51 -vt 0.966334 0.921269 -v -1614.75 16303.5 2777.51 -vt 0.962302 0.921034 -v -1588.5 16303.5 2777.51 -vt 0.962054 0.921034 -v -1588.5 16318.5 2777.51 -vt 0.962054 0.921269 -v -1161 16318.5 2777.51 -vt 0.958022 0.921269 -v -1161 16266 2777.51 -vt 0.958022 0.920445 -v -2042.25 16266 2777.51 -vt 0.966334 0.920445 -o mesh1614 -s off -f 7991/7991/7991 7992/7992/7992 7993/7993/7993 -f 7994/7994/7994 7995/7995/7995 7996/7996/7996 -f 7994/7994/7994 7996/7996/7996 7997/7997/7997 -f 7994/7994/7994 7997/7997/7997 7998/7998/7998 -f 7994/7994/7994 7998/7998/7998 7999/7999/7999 -f 7994/7994/7994 7999/7999/7999 8000/8000/8000 -g charts -o chart0000 -s off -f 7991/7991/7991 7992/7992/7992 7993/7993/7993 -o chart0001 -s off -f 7994/7994/7994 7995/7995/7995 7996/7996/7996 -f 7994/7994/7994 7996/7996/7996 7997/7997/7997 -f 7994/7994/7994 7997/7997/7997 7998/7998/7998 -f 7994/7994/7994 7998/7998/7998 7999/7999/7999 -f 7994/7994/7994 7999/7999/7999 8000/8000/8000 -v -1161 16266 2777.51 -vt 0.00305673 0.888527 -v -1161 16266 -40.6129 -vt 0.00305673 0.910614 -v -1041 16266 -243.113 -vt 0.00207814 0.912201 -v -2162.25 16266 -243.113 -vt 0.0112219 0.912201 -v -2042.25 16266 -40.6129 -vt 0.0102433 0.910614 -v -2042.25 16266 2777.51 -vt 0.0102433 0.888527 -v -2162.25 16266 2912.51 -vt 0.0112219 0.887469 -v -1041 16266 2912.51 -vt 0.00207814 0.887469 -o mesh1615 -s off -f 8001/8001/8001 8002/8002/8002 8003/8003/8003 -f 8004/8004/8004 8003/8003/8003 8002/8002/8002 -f 8005/8005/8005 8004/8004/8004 8002/8002/8002 -f 8006/8006/8006 8004/8004/8004 8005/8005/8005 -f 8007/8007/8007 8001/8001/8001 8008/8008/8008 -f 8003/8003/8003 8008/8008/8008 8001/8001/8001 -f 8006/8006/8006 8001/8001/8001 8007/8007/8007 -f 8004/8004/8004 8006/8006/8006 8007/8007/8007 -g charts -o chart0000 -s off -f 8001/8001/8001 8002/8002/8002 8003/8003/8003 -f 8004/8004/8004 8003/8003/8003 8002/8002/8002 -f 8005/8005/8005 8004/8004/8004 8002/8002/8002 -f 8006/8006/8006 8004/8004/8004 8005/8005/8005 -f 8007/8007/8007 8001/8001/8001 8008/8008/8008 -f 8003/8003/8003 8008/8008/8008 8001/8001/8001 -f 8006/8006/8006 8001/8001/8001 8007/8007/8007 -f 8004/8004/8004 8006/8006/8006 8007/8007/8007 -v -1041 16318.5 -243.113 -vt 0.679551 0.997114 -v -1041 16318.5 2912.51 -vt 0.654613 0.997114 -v -1041 16266 2912.51 -vt 0.654613 0.99629 -v -1041 16266 -243.113 -vt 0.679551 0.99629 -o mesh1616 -s off -f 8009/8009/8009 8010/8010/8010 8011/8011/8011 -f 8009/8009/8009 8011/8011/8011 8012/8012/8012 -g charts -o chart0000 -s off -f 8009/8009/8009 8010/8010/8010 8011/8011/8011 -f 8009/8009/8009 8011/8011/8011 8012/8012/8012 -v -2042.25 16303.5 2197.43 -vt 0.385287 0.603875 -v -2042.25 16303.5 2226.97 -vt 0.384456 0.603219 -v -2042.25 16318.5 2226.97 -vt 0.385287 0.60305 -v -2042.25 16303.5 2197.43 -vt 0.716364 0.942244 -v -2042.25 16318.5 2226.97 -vt 0.716126 0.942478 -v -2042.25 16318.5 2777.51 -vt 0.716126 0.946826 -v -2042.25 16266 2777.51 -vt 0.716958 0.946826 -v -2042.25 16266 -40.6129 -vt 0.716958 0.924567 -v -2042.25 16318.5 -40.6129 -vt 0.716126 0.924567 -v -2042.25 16318.5 2197.43 -vt 0.716126 0.942244 -o mesh1617 -s off -f 8013/8013/8013 8014/8014/8014 8015/8015/8015 -f 8016/8016/8016 8017/8017/8017 8018/8018/8018 -f 8016/8016/8016 8018/8018/8018 8019/8019/8019 -f 8016/8016/8016 8019/8019/8019 8020/8020/8020 -f 8016/8016/8016 8020/8020/8020 8021/8021/8021 -f 8016/8016/8016 8021/8021/8021 8022/8022/8022 -g charts -o chart0000 -s off -f 8013/8013/8013 8014/8014/8014 8015/8015/8015 -o chart0001 -s off -f 8016/8016/8016 8017/8017/8017 8018/8018/8018 -f 8016/8016/8016 8018/8018/8018 8019/8019/8019 -f 8016/8016/8016 8019/8019/8019 8020/8020/8020 -f 8016/8016/8016 8020/8020/8020 8021/8021/8021 -f 8016/8016/8016 8021/8021/8021 8022/8022/8022 -v -1588.5 16303.5 2226.97 -vt 0.233998 0.847073 -v -1161 16303.5 2226.97 -vt 0.229842 0.847073 -v -1161 16318.5 2226.97 -vt 0.229842 0.846249 -v -1588.5 16318.5 2226.97 -vt 0.233998 0.846249 -o mesh1618 -s off -f 8023/8023/8023 8024/8024/8024 8025/8025/8025 -f 8023/8023/8023 8025/8025/8025 8026/8026/8026 -g charts -o chart0000 -s off -f 8023/8023/8023 8024/8024/8024 8025/8025/8025 -f 8023/8023/8023 8025/8025/8025 8026/8026/8026 -v -1161 16303.5 2197.43 -vt 0.188279 0.627782 -v -1161 16303.5 2226.97 -vt 0.18826 0.626958 -v -1588.5 16303.5 2226.97 -vt 0.184123 0.627782 -v -1161 16303.5 2197.43 -vt 0.799252 0.957543 -v -1588.5 16303.5 2226.97 -vt 0.795927 0.959765 -v -1588.5 16303.5 2777.51 -vt 0.799252 0.963314 -v -1161 16303.5 2197.43 -vt 0.395262 0.821517 -v -1588.5 16303.5 2777.51 -vt 0.390274 0.817917 -v -1614.75 16303.5 2777.51 -vt 0.390274 0.817697 -v -1614.75 16303.5 2226.97 -vt 0.395008 0.817697 -v -2042.25 16303.5 2226.97 -vt 0.395008 0.814097 -v -2042.25 16303.5 2197.43 -vt 0.395262 0.814097 -o mesh1619 -s off -f 8027/8027/8027 8028/8028/8028 8029/8029/8029 -f 8030/8030/8030 8031/8031/8031 8032/8032/8032 -f 8033/8033/8033 8034/8034/8034 8035/8035/8035 -f 8033/8033/8033 8035/8035/8035 8036/8036/8036 -f 8033/8033/8033 8036/8036/8036 8037/8037/8037 -f 8033/8033/8033 8037/8037/8037 8038/8038/8038 -g charts -o chart0000 -s off -f 8027/8027/8027 8028/8028/8028 8029/8029/8029 -o chart0001 -s off -f 8030/8030/8030 8031/8031/8031 8032/8032/8032 -o chart0002 -s off -f 8033/8033/8033 8034/8034/8034 8035/8035/8035 -f 8033/8033/8033 8035/8035/8035 8036/8036/8036 -f 8033/8033/8033 8036/8036/8036 8037/8037/8037 -f 8033/8033/8033 8037/8037/8037 8038/8038/8038 -v -1161 16318.5 2197.43 -vt 0.775977 0.305441 -v -1161 16303.5 2197.43 -vt 0.775977 0.304617 -v -2042.25 16303.5 2197.43 -vt 0.768495 0.304617 -v -2042.25 16318.5 2197.43 -vt 0.768495 0.305441 -o mesh1620 -s off -f 8039/8039/8039 8040/8040/8040 8041/8041/8041 -f 8039/8039/8039 8041/8041/8041 8042/8042/8042 -g charts -o chart0000 -s off -f 8039/8039/8039 8040/8040/8040 8041/8041/8041 -f 8039/8039/8039 8041/8041/8041 8042/8042/8042 -v -1614.75 16318.5 2226.97 -vt 0.707814 0.305441 -v -2042.25 16318.5 2226.97 -vt 0.71197 0.305441 -v -2042.25 16303.5 2226.97 -vt 0.71197 0.306265 -v -1614.75 16303.5 2226.97 -vt 0.707814 0.306265 -o mesh1621 -s off -f 8043/8043/8043 8044/8044/8044 8045/8045/8045 -f 8043/8043/8043 8045/8045/8045 8046/8046/8046 -g charts -o chart0000 -s off -f 8043/8043/8043 8044/8044/8044 8045/8045/8045 -f 8043/8043/8043 8045/8045/8045 8046/8046/8046 -v -1614.75 16303.5 2777.51 -vt 0.801746 0.521434 -v -1614.75 16318.5 2777.51 -vt 0.801746 0.52061 -v -1614.75 16318.5 2226.97 -vt 0.796758 0.52061 -v -1614.75 16303.5 2226.97 -vt 0.796758 0.521434 -o mesh1622 -s off -f 8047/8047/8047 8048/8048/8048 8049/8049/8049 -f 8047/8047/8047 8049/8049/8049 8050/8050/8050 -g charts -o chart0000 -s off -f 8047/8047/8047 8048/8048/8048 8049/8049/8049 -f 8047/8047/8047 8049/8049/8049 8050/8050/8050 -v -1588.5 16318.5 2777.51 -vt 0.770158 0.57502 -v -1588.5 16303.5 2777.51 -vt 0.770158 0.574196 -v -1588.5 16303.5 2226.97 -vt 0.76517 0.574196 -v -1588.5 16318.5 2226.97 -vt 0.76517 0.57502 -o mesh1623 -s off -f 8051/8051/8051 8052/8052/8052 8053/8053/8053 -f 8051/8051/8051 8053/8053/8053 8054/8054/8054 -g charts -o chart0000 -s off -f 8051/8051/8051 8052/8052/8052 8053/8053/8053 -f 8051/8051/8051 8053/8053/8053 8054/8054/8054 -v -109.125 16266 -285.3 -vt 0.399418 0.594806 -v -71.6247 16266 -243.113 -vt 0.399754 0.595631 -v -109.125 16266 2954.7 -vt 0.425187 0.594806 -v -71.6247 16266 2912.51 -vt 0.424851 0.595631 -o mesh1624 -s off -f 8055/8055/8055 8056/8056/8056 8057/8057/8057 -f 8058/8058/8058 8057/8057/8057 8056/8056/8056 -g charts -o chart0000 -s off -f 8055/8055/8055 8056/8056/8056 8057/8057/8057 -f 8058/8058/8058 8057/8057/8057 8056/8056/8056 -v -71.6247 16266 -243.113 -vt 0.259232 0.41014 -v -109.125 16266 -285.3 -vt 0.258936 0.410964 -v 4210.88 16266 -285.3 -vt 0.293017 0.410964 -o mesh1625 -s off -f 8059/8059/8059 8060/8060/8060 8061/8061/8061 -g charts -o chart0000 -s off -f 8059/8059/8059 8060/8060/8060 8061/8061/8061 -v -71.6247 16266 -243.113 -vt 0.727764 0.997939 -v 4210.88 16266 -285.3 -vt 0.761845 0.997939 -v 4173.38 16266 -243.113 -vt 0.761544 0.997115 -o mesh1626 -s off -f 8062/8062/8062 8063/8063/8063 8064/8064/8064 -g charts -o chart0000 -s off -f 8062/8062/8062 8063/8063/8063 8064/8064/8064 -v 4173.38 16266 -243.113 -vt 0.00374065 0.764149 -v 4210.88 16266 -285.3 -vt 0.00457182 0.763809 -v 4173.38 16266 2912.51 -vt 0.00457182 0.789365 -o mesh1627 -s off -f 8065/8065/8065 8066/8066/8066 8067/8067/8067 -g charts -o chart0000 -s off -f 8065/8065/8065 8066/8066/8066 8067/8067/8067 -v -109.125 16266 2954.7 -vt 0.386118 0.99629 -v -71.6247 16266 2912.51 -vt 0.385822 0.995466 -v 4210.88 16266 2954.7 -vt 0.352037 0.99629 -o mesh1628 -s off -f 8068/8068/8068 8069/8069/8069 8070/8070/8070 -g charts -o chart0000 -s off -f 8068/8068/8068 8069/8069/8069 8070/8070/8070 -v 4210.88 16266 2954.7 -vt 0.998753 0.780297 -v -71.6247 16266 2912.51 -vt 0.998753 0.814097 -v 4173.38 16266 2912.51 -vt 0.997922 0.780596 -o mesh1629 -s off -f 8071/8071/8071 8072/8072/8072 8073/8073/8073 -g charts -o chart0000 -s off -f 8071/8071/8071 8072/8072/8072 8073/8073/8073 -v 4210.88 16266 2954.7 -vt 0.357024 0.297197 -v 4173.38 16266 2912.51 -vt 0.356689 0.296373 -v 4210.88 16266 -285.3 -vt 0.331255 0.297197 -o mesh1630 -s off -f 8074/8074/8074 8075/8075/8075 8076/8076/8076 -g charts -o chart0000 -s off -f 8074/8074/8074 8075/8075/8075 8076/8076/8076 -v 4210.88 16266 -285.3 -vt 0.993766 0.41756 -v -109.125 16266 -285.3 -vt 0.993766 0.45136 -v -109.125 16431 -285.3 -vt 0.995428 0.45136 -v 4210.88 16431 -285.3 -vt 0.995428 0.41756 -o mesh1631 -s off -f 8077/8077/8077 8078/8078/8078 8079/8079/8079 -f 8077/8077/8077 8079/8079/8079 8080/8080/8080 -g charts -o chart0000 -s off -f 8077/8077/8077 8078/8078/8078 8079/8079/8079 -f 8077/8077/8077 8079/8079/8079 8080/8080/8080 -v 4173.38 16266 2912.51 -vt 0.635495 0.76958 -v -71.6247 16266 2912.51 -vt 0.635495 0.80338 -v -71.6247 16431 2912.51 -vt 0.637157 0.80338 -v 4173.38 16431 2912.51 -vt 0.637157 0.76958 -o mesh1632 -s off -f 8081/8081/8081 8082/8082/8082 8083/8083/8083 -f 8081/8081/8081 8083/8083/8083 8084/8084/8084 -g charts -o chart0000 -s off -f 8081/8081/8081 8082/8082/8082 8083/8083/8083 -f 8081/8081/8081 8083/8083/8083 8084/8084/8084 -v -109.125 16266 2954.7 -vt 0.272236 0.45878 -v 4210.88 16266 2954.7 -vt 0.238155 0.45878 -v 4210.88 16431 2954.7 -vt 0.238155 0.457131 -v -109.125 16431 2954.7 -vt 0.272236 0.457131 -o mesh1633 -s off -f 8085/8085/8085 8086/8086/8086 8087/8087/8087 -f 8085/8085/8085 8087/8087/8087 8088/8088/8088 -g charts -o chart0000 -s off -f 8085/8085/8085 8086/8086/8086 8087/8087/8087 -f 8085/8085/8085 8087/8087/8087 8088/8088/8088 -v 4210.88 16266 2954.7 -vt 0.793433 0.431575 -v 4210.88 16266 -285.3 -vt 0.793433 0.457131 -v 4210.88 16431 -285.3 -vt 0.795096 0.457131 -v 4210.88 16431 2954.7 -vt 0.795096 0.431575 -o mesh1634 -s off -f 8089/8089/8089 8090/8090/8090 8091/8091/8091 -f 8089/8089/8089 8091/8091/8091 8092/8092/8092 -g charts -o chart0000 -s off -f 8089/8089/8089 8090/8090/8090 8091/8091/8091 -f 8089/8089/8089 8091/8091/8091 8092/8092/8092 -v 4173.38 16266 -243.113 -vt 0.999584 0.424155 -v 4173.38 16266 2912.51 -vt 0.999584 0.399423 -v 4173.38 16431 2912.51 -vt 0.997922 0.399423 -v 4173.38 16431 -243.113 -vt 0.997922 0.424155 -o mesh1635 -s off -f 8093/8093/8093 8094/8094/8094 8095/8095/8095 -f 8093/8093/8093 8095/8095/8095 8096/8096/8096 -g charts -o chart0000 -s off -f 8093/8093/8093 8094/8094/8094 8095/8095/8095 -f 8093/8093/8093 8095/8095/8095 8096/8096/8096 -v -71.6247 16266 -243.113 -vt 0.967997 0.301319 -v 4173.38 16266 -243.113 -vt 0.967997 0.267519 -v 4173.38 16431 -243.113 -vt 0.966334 0.267519 -v -71.6247 16431 -243.113 -vt 0.966334 0.301319 -o mesh1636 -s off -f 8097/8097/8097 8098/8098/8098 8099/8099/8099 -f 8097/8097/8097 8099/8099/8099 8100/8100/8100 -g charts -o chart0000 -s off -f 8097/8097/8097 8098/8098/8098 8099/8099/8099 -f 8097/8097/8097 8099/8099/8099 8100/8100/8100 -v -71.6247 16266 2912.51 -vt 0.207398 0.431575 -v -71.6247 16266 -243.113 -vt 0.232336 0.431575 -v -71.6247 16431 -243.113 -vt 0.232336 0.433223 -v -71.6247 16431 2912.51 -vt 0.207398 0.433223 -o mesh1637 -s off -f 8101/8101/8101 8102/8102/8102 8103/8103/8103 -f 8101/8101/8101 8103/8103/8103 8104/8104/8104 -g charts -o chart0000 -s off -f 8101/8101/8101 8102/8102/8102 8103/8103/8103 -f 8101/8101/8101 8103/8103/8103 8104/8104/8104 -v -109.125 16266 -285.3 -vt 0.0935161 0.91385 -v -109.125 16266 2954.7 -vt 0.0677473 0.91385 -v -109.125 16431 2954.7 -vt 0.0677473 0.912201 -v -109.125 16431 -285.3 -vt 0.0935161 0.912201 -o mesh1638 -s off -f 8105/8105/8105 8106/8106/8106 8107/8107/8107 -f 8105/8105/8105 8107/8107/8107 8108/8108/8108 -g charts -o chart0000 -s off -f 8105/8105/8105 8106/8106/8106 8107/8107/8107 -f 8105/8105/8105 8107/8107/8107 8108/8108/8108 -v -109.125 16431 2954.7 -vt 0.237323 0.708574 -v -71.6247 16431 2912.51 -vt 0.236988 0.707749 -v -109.125 16431 -285.3 -vt 0.211554 0.708574 -v -71.6247 16431 -243.113 -vt 0.21189 0.707749 -o mesh1639 -s off -f 8109/8109/8109 8110/8110/8110 8111/8111/8111 -f 8112/8112/8112 8111/8111/8111 8110/8110/8110 -g charts -o chart0000 -s off -f 8109/8109/8109 8110/8110/8110 8111/8111/8111 -f 8112/8112/8112 8111/8111/8111 8110/8110/8110 -v -71.6247 16431 2912.51 -vt 0.288326 0.669002 -v -109.125 16431 2954.7 -vt 0.28803 0.669827 -v 4210.88 16431 2954.7 -vt 0.322111 0.669827 -o mesh1640 -s off -f 8113/8113/8113 8114/8114/8114 8115/8115/8115 -g charts -o chart0000 -s off -f 8113/8113/8113 8114/8114/8114 8115/8115/8115 -v -71.6247 16431 2912.51 -vt 0.825852 0.820692 -v 4210.88 16431 2954.7 -vt 0.859933 0.820692 -v 4173.38 16431 2912.51 -vt 0.859632 0.819868 -o mesh1641 -s off -f 8116/8116/8116 8117/8117/8117 8118/8118/8118 -g charts -o chart0000 -s off -f 8116/8116/8116 8117/8117/8117 8118/8118/8118 -v 4173.38 16431 2912.51 -vt 0.250967 0.678071 -v 4210.88 16431 2954.7 -vt 0.250623 0.678895 -v 4173.38 16431 -243.113 -vt 0.276392 0.678895 -o mesh1642 -s off -f 8119/8119/8119 8120/8120/8120 8121/8121/8121 -g charts -o chart0000 -s off -f 8119/8119/8119 8120/8120/8120 8121/8121/8121 -v -109.125 16431 -285.3 -vt 0.742726 0.301319 -v -71.6247 16431 -243.113 -vt 0.742431 0.300495 -v 4210.88 16431 -285.3 -vt 0.708645 0.301319 -o mesh1643 -s off -f 8122/8122/8122 8123/8123/8123 8124/8124/8124 -g charts -o chart0000 -s off -f 8122/8122/8122 8123/8123/8123 8124/8124/8124 -v 4210.88 16431 -285.3 -vt 0.928928 0.214757 -v -71.6247 16431 -243.113 -vt 0.928928 0.248557 -v 4173.38 16431 -243.113 -vt 0.928096 0.215056 -o mesh1644 -s off -f 8125/8125/8125 8126/8126/8126 8127/8127/8127 -g charts -o chart0000 -s off -f 8125/8125/8125 8126/8126/8126 8127/8127/8127 -v 4210.88 16431 -285.3 -vt 0.239817 0.835532 -v 4173.38 16431 -243.113 -vt 0.239482 0.834707 -v 4210.88 16431 2954.7 -vt 0.214048 0.835532 -o mesh1645 -s off -f 8128/8128/8128 8129/8129/8129 8130/8130/8130 -g charts -o chart0000 -s off -f 8128/8128/8128 8129/8129/8129 8130/8130/8130 -v 1049.62 16371 2197.43 -vt 0.847632 0.998617 -v 1049.62 16371 2226.97 -vt 0.847866 0.998617 -v 1930.88 16371 2197.43 -vt 0.847632 0.99149 -v 1049.62 16371 2777.51 -vt 0.852216 0.998617 -v 1477.12 16371 2226.97 -vt 0.847866 0.99516 -v 1503.38 16371 2226.97 -vt 0.847866 0.994947 -v 1503.38 16371 2777.51 -vt 0.852216 0.994947 -v 1930.88 16371 2226.97 -vt 0.847866 0.99149 -v 1930.88 16371 -40.6129 -vt 0.829946 0.99149 -v 1930.88 16371 2777.51 -vt 0.852216 0.99149 -v 929.625 16371 2912.51 -vt 0.853283 0.999588 -v 929.625 16371 -243.113 -vt 0.828346 0.999588 -v 2050.88 16371 2912.51 -vt 0.853283 0.990519 -v 1477.12 16371 2777.51 -vt 0.852216 0.99516 -v 2050.88 16371 -243.113 -vt 0.828346 0.990519 -v 1049.62 16371 -40.6129 -vt 0.829946 0.998617 -o mesh1646 -s off -f 8131/8131/8131 8132/8132/8132 8133/8133/8133 -f 8132/8132/8132 8131/8131/8131 8134/8134/8134 -f 8133/8133/8133 8132/8132/8132 8135/8135/8135 -f 8133/8133/8133 8135/8135/8135 8136/8136/8136 -f 8136/8136/8136 8135/8135/8135 8137/8137/8137 -f 8133/8133/8133 8136/8136/8136 8138/8138/8138 -f 8133/8133/8133 8138/8138/8138 8139/8139/8139 -f 8139/8139/8139 8138/8138/8138 8140/8140/8140 -f 8141/8141/8141 8134/8134/8134 8142/8142/8142 -f 8134/8134/8134 8141/8141/8141 8143/8143/8143 -f 8142/8142/8142 8134/8134/8134 8131/8131/8131 -f 8134/8134/8134 8143/8143/8143 8144/8144/8144 -f 8144/8144/8144 8143/8143/8143 8137/8137/8137 -f 8144/8144/8144 8137/8137/8137 8135/8135/8135 -f 8137/8137/8137 8143/8143/8143 8140/8140/8140 -f 8140/8140/8140 8143/8143/8143 8145/8145/8145 -f 8142/8142/8142 8146/8146/8146 8145/8145/8145 -f 8146/8146/8146 8142/8142/8142 8131/8131/8131 -f 8145/8145/8145 8146/8146/8146 8139/8139/8139 -f 8145/8145/8145 8139/8139/8139 8140/8140/8140 -g charts -o chart0000 -s off -f 8131/8131/8131 8132/8132/8132 8133/8133/8133 -f 8132/8132/8132 8131/8131/8131 8134/8134/8134 -f 8133/8133/8133 8132/8132/8132 8135/8135/8135 -f 8133/8133/8133 8135/8135/8135 8136/8136/8136 -f 8136/8136/8136 8135/8135/8135 8137/8137/8137 -f 8133/8133/8133 8136/8136/8136 8138/8138/8138 -f 8133/8133/8133 8138/8138/8138 8139/8139/8139 -f 8139/8139/8139 8138/8138/8138 8140/8140/8140 -f 8141/8141/8141 8134/8134/8134 8142/8142/8142 -f 8134/8134/8134 8141/8141/8141 8143/8143/8143 -f 8142/8142/8142 8134/8134/8134 8131/8131/8131 -f 8134/8134/8134 8143/8143/8143 8144/8144/8144 -f 8144/8144/8144 8143/8143/8143 8137/8137/8137 -f 8144/8144/8144 8137/8137/8137 8135/8135/8135 -f 8137/8137/8137 8143/8143/8143 8140/8140/8140 -f 8140/8140/8140 8143/8143/8143 8145/8145/8145 -f 8142/8142/8142 8146/8146/8146 8145/8145/8145 -f 8146/8146/8146 8142/8142/8142 8131/8131/8131 -f 8145/8145/8145 8146/8146/8146 8139/8139/8139 -f 8145/8145/8145 8139/8139/8139 8140/8140/8140 -v 929.625 16318.5 2912.51 -vt 0.497506 0.597279 -v 2050.88 16318.5 2912.51 -vt 0.488362 0.597279 -v 2050.88 16371 2912.51 -vt 0.488362 0.596455 -v 929.625 16371 2912.51 -vt 0.497506 0.596455 -o mesh1647 -s off -f 8147/8147/8147 8148/8148/8148 8149/8149/8149 -f 8147/8147/8147 8149/8149/8149 8150/8150/8150 -g charts -o chart0000 -s off -f 8147/8147/8147 8148/8148/8148 8149/8149/8149 -f 8147/8147/8147 8149/8149/8149 8150/8150/8150 -v 2050.88 16318.5 -243.113 -vt 0.317124 0.847898 -v 929.625 16318.5 -243.113 -vt 0.326268 0.847898 -v 929.625 16371 -243.113 -vt 0.326268 0.848722 -v 2050.88 16371 -243.113 -vt 0.317124 0.848722 -o mesh1648 -s off -f 8151/8151/8151 8152/8152/8152 8153/8153/8153 -f 8151/8151/8151 8153/8153/8153 8154/8154/8154 -g charts -o chart0000 -s off -f 8151/8151/8151 8152/8152/8152 8153/8153/8153 -f 8151/8151/8151 8153/8153/8153 8154/8154/8154 -v 2050.88 16318.5 2912.51 -vt 0.874896 0.0012366 -v 2050.88 16318.5 -243.113 -vt 0.899834 0.0012366 -v 2050.88 16371 -243.113 -vt 0.899834 0.00206092 -v 2050.88 16371 2912.51 -vt 0.874896 0.00206092 -o mesh1649 -s off -f 8155/8155/8155 8156/8156/8156 8157/8157/8157 -f 8155/8155/8155 8157/8157/8157 8158/8158/8158 -g charts -o chart0000 -s off -f 8155/8155/8155 8156/8156/8156 8157/8157/8157 -f 8155/8155/8155 8157/8157/8157 8158/8158/8158 -v 1049.62 16318.5 -40.6129 -vt 0.124273 0.587387 -v 1930.88 16318.5 -40.6129 -vt 0.116791 0.587387 -v 1930.88 16371 -40.6129 -vt 0.116791 0.586562 -v 1049.62 16371 -40.6129 -vt 0.124273 0.586562 -o mesh1650 -s off -f 8159/8159/8159 8160/8160/8160 8161/8161/8161 -f 8159/8159/8159 8161/8161/8161 8162/8162/8162 -g charts -o chart0000 -s off -f 8159/8159/8159 8160/8160/8160 8161/8161/8161 -f 8159/8159/8159 8161/8161/8161 8162/8162/8162 -v 1049.62 16318.5 2777.51 -vt 0.0428096 0.4662 -v 1049.62 16318.5 -40.6129 -vt 0.0428096 0.489283 -v 1049.62 16371 -40.6129 -vt 0.0419784 0.489283 -v 1049.62 16371 2197.43 -vt 0.0419784 0.470951 -v 1049.62 16356 2197.43 -vt 0.0422159 0.470951 -v 1049.62 16356 2226.97 -vt 0.0422159 0.470709 -v 1049.62 16318.5 2777.51 -vt 0.700332 0.464551 -v 1049.62 16356 2226.97 -vt 0.695345 0.463962 -v 1049.62 16371 2226.97 -vt 0.695345 0.463726 -v 1049.62 16371 2777.51 -vt 0.700332 0.463726 -o mesh1651 -s off -f 8163/8163/8163 8164/8164/8164 8165/8165/8165 -f 8163/8163/8163 8165/8165/8165 8166/8166/8166 -f 8163/8163/8163 8166/8166/8166 8167/8167/8167 -f 8163/8163/8163 8167/8167/8167 8168/8168/8168 -f 8169/8169/8169 8170/8170/8170 8171/8171/8171 -f 8169/8169/8169 8171/8171/8171 8172/8172/8172 -g charts -o chart0000 -s off -f 8163/8163/8163 8164/8164/8164 8165/8165/8165 -f 8163/8163/8163 8165/8165/8165 8166/8166/8166 -f 8163/8163/8163 8166/8166/8166 8167/8167/8167 -f 8163/8163/8163 8167/8167/8167 8168/8168/8168 -o chart0001 -s off -f 8169/8169/8169 8170/8170/8170 8171/8171/8171 -f 8169/8169/8169 8171/8171/8171 8172/8172/8172 -v 1930.88 16318.5 2777.51 -vt 0.997922 0.147156 -v 1049.62 16318.5 2777.51 -vt 0.997922 0.1554 -v 1049.62 16371 2777.51 -vt 0.998753 0.1554 -v 1477.12 16371 2777.51 -vt 0.998753 0.151401 -v 1477.12 16356 2777.51 -vt 0.998516 0.151401 -v 1503.38 16356 2777.51 -vt 0.998516 0.151155 -v 1930.88 16318.5 2777.51 -vt 0.357024 0.926216 -v 1503.38 16356 2777.51 -vt 0.36118 0.926805 -v 1503.38 16371 2777.51 -vt 0.36118 0.92704 -v 1930.88 16371 2777.51 -vt 0.357024 0.92704 -o mesh1652 -s off -f 8173/8173/8173 8174/8174/8174 8175/8175/8175 -f 8173/8173/8173 8175/8175/8175 8176/8176/8176 -f 8173/8173/8173 8176/8176/8176 8177/8177/8177 -f 8173/8173/8173 8177/8177/8177 8178/8178/8178 -f 8179/8179/8179 8180/8180/8180 8181/8181/8181 -f 8179/8179/8179 8181/8181/8181 8182/8182/8182 -g charts -o chart0000 -s off -f 8173/8173/8173 8174/8174/8174 8175/8175/8175 -f 8173/8173/8173 8175/8175/8175 8176/8176/8176 -f 8173/8173/8173 8176/8176/8176 8177/8177/8177 -f 8173/8173/8173 8177/8177/8177 8178/8178/8178 -o chart0001 -s off -f 8179/8179/8179 8180/8180/8180 8181/8181/8181 -f 8179/8179/8179 8181/8181/8181 8182/8182/8182 -v 929.625 16318.5 -243.113 -vt 0.0960099 0.997114 -v 1049.62 16318.5 -40.6129 -vt 0.0944096 0.996144 -v 1049.62 16318.5 2777.51 -vt 0.0721392 0.996144 -v 2050.88 16318.5 -243.113 -vt 0.0960099 0.988046 -v 1930.88 16318.5 -40.6129 -vt 0.0944096 0.989017 -v 1930.88 16318.5 2777.51 -vt 0.0721392 0.989017 -v 929.625 16318.5 2912.51 -vt 0.0710723 0.997114 -v 2050.88 16318.5 2912.51 -vt 0.0710723 0.988046 -o mesh1653 -s off -f 8183/8183/8183 8184/8184/8184 8185/8185/8185 -f 8184/8184/8184 8183/8183/8183 8186/8186/8186 -f 8184/8184/8184 8186/8186/8186 8187/8187/8187 -f 8187/8187/8187 8186/8186/8186 8188/8188/8188 -f 8189/8189/8189 8185/8185/8185 8190/8190/8190 -f 8185/8185/8185 8189/8189/8189 8183/8183/8183 -f 8190/8190/8190 8185/8185/8185 8188/8188/8188 -f 8190/8190/8190 8188/8188/8188 8186/8186/8186 -g charts -o chart0000 -s off -f 8183/8183/8183 8184/8184/8184 8185/8185/8185 -f 8184/8184/8184 8183/8183/8183 8186/8186/8186 -f 8184/8184/8184 8186/8186/8186 8187/8187/8187 -f 8187/8187/8187 8186/8186/8186 8188/8188/8188 -f 8189/8189/8189 8185/8185/8185 8190/8190/8190 -f 8185/8185/8185 8189/8189/8189 8183/8183/8183 -f 8190/8190/8190 8185/8185/8185 8188/8188/8188 -f 8190/8190/8190 8188/8188/8188 8186/8186/8186 -v 929.625 16318.5 -243.113 -vt 0.835827 0.396125 -v 929.625 16318.5 2912.51 -vt 0.835827 0.371393 -v 929.625 16371 2912.51 -vt 0.834996 0.371393 -v 929.625 16371 -243.113 -vt 0.834996 0.396125 -o mesh1654 -s off -f 8191/8191/8191 8192/8192/8192 8193/8193/8193 -f 8191/8191/8191 8193/8193/8193 8194/8194/8194 -g charts -o chart0000 -s off -f 8191/8191/8191 8192/8192/8192 8193/8193/8193 -f 8191/8191/8191 8193/8193/8193 8194/8194/8194 -v 1930.88 16371 2197.43 -vt 0.386949 0.762525 -v 1930.88 16371 -40.6129 -vt 0.386949 0.744847 -v 1930.88 16318.5 -40.6129 -vt 0.38778 0.744847 -v 1930.88 16318.5 2777.51 -vt 0.38778 0.767106 -v 1930.88 16371 2777.51 -vt 0.386949 0.767106 -v 1930.88 16371 2226.97 -vt 0.386949 0.762758 -v 1930.88 16371 2197.43 -vt 0.140898 0.297197 -v 1930.88 16371 2226.97 -vt 0.140898 0.298021 -v 1930.88 16356 2226.97 -vt 0.141729 0.298021 -v 1930.88 16356 2197.43 -vt 0.141729 0.297197 -o mesh1655 -s off -f 8195/8195/8195 8196/8196/8196 8197/8197/8197 -f 8195/8195/8195 8197/8197/8197 8198/8198/8198 -f 8195/8195/8195 8198/8198/8198 8199/8199/8199 -f 8195/8195/8195 8199/8199/8199 8200/8200/8200 -f 8201/8201/8201 8202/8202/8202 8203/8203/8203 -f 8201/8201/8201 8203/8203/8203 8204/8204/8204 -g charts -o chart0000 -s off -f 8195/8195/8195 8196/8196/8196 8197/8197/8197 -f 8195/8195/8195 8197/8197/8197 8198/8198/8198 -f 8195/8195/8195 8198/8198/8198 8199/8199/8199 -f 8195/8195/8195 8199/8199/8199 8200/8200/8200 -o chart0001 -s off -f 8201/8201/8201 8202/8202/8202 8203/8203/8203 -f 8201/8201/8201 8203/8203/8203 8204/8204/8204 -v 1477.12 16371 2226.97 -vt 0.871571 0.165293 -v 1049.62 16371 2226.97 -vt 0.875727 0.165293 -v 1049.62 16356 2226.97 -vt 0.875727 0.166117 -v 1477.12 16356 2226.97 -vt 0.871571 0.166117 -o mesh1656 -s off -f 8205/8205/8205 8206/8206/8206 8207/8207/8207 -f 8205/8205/8205 8207/8207/8207 8208/8208/8208 -g charts -o chart0000 -s off -f 8205/8205/8205 8206/8206/8206 8207/8207/8207 -f 8205/8205/8205 8207/8207/8207 8208/8208/8208 -v 1930.88 16356 2197.43 -vt 0.662926 0.698681 -v 1930.88 16356 2226.97 -vt 0.662095 0.698661 -v 1503.38 16356 2226.97 -vt 0.662926 0.694559 -v 1930.88 16356 2197.43 -vt 0.555694 0.343364 -v 1503.38 16356 2226.97 -vt 0.552369 0.345585 -v 1503.38 16356 2777.51 -vt 0.555694 0.349134 -v 1930.88 16356 2197.43 -vt 0.165004 0.829761 -v 1503.38 16356 2777.51 -vt 0.160017 0.826162 -v 1477.12 16356 2777.51 -vt 0.160017 0.82594 -v 1477.12 16356 2226.97 -vt 0.16475 0.82594 -v 1049.62 16356 2226.97 -vt 0.16475 0.822341 -v 1049.62 16356 2197.43 -vt 0.165004 0.822341 -o mesh1657 -s off -f 8209/8209/8209 8210/8210/8210 8211/8211/8211 -f 8212/8212/8212 8213/8213/8213 8214/8214/8214 -f 8215/8215/8215 8216/8216/8216 8217/8217/8217 -f 8215/8215/8215 8217/8217/8217 8218/8218/8218 -f 8215/8215/8215 8218/8218/8218 8219/8219/8219 -f 8215/8215/8215 8219/8219/8219 8220/8220/8220 -g charts -o chart0000 -s off -f 8209/8209/8209 8210/8210/8210 8211/8211/8211 -o chart0001 -s off -f 8212/8212/8212 8213/8213/8213 8214/8214/8214 -o chart0002 -s off -f 8215/8215/8215 8216/8216/8216 8217/8217/8217 -f 8215/8215/8215 8217/8217/8217 8218/8218/8218 -f 8215/8215/8215 8218/8218/8218 8219/8219/8219 -f 8215/8215/8215 8219/8219/8219 8220/8220/8220 -v 1930.88 16371 2197.43 -vt 0.0187032 0.349134 -v 1930.88 16356 2197.43 -vt 0.017872 0.349134 -v 1049.62 16356 2197.43 -vt 0.017872 0.341715 -v 1049.62 16371 2197.43 -vt 0.0187032 0.341715 -o mesh1658 -s off -f 8221/8221/8221 8222/8222/8222 8223/8223/8223 -f 8221/8221/8221 8223/8223/8223 8224/8224/8224 -g charts -o chart0000 -s off -f 8221/8221/8221 8222/8222/8222 8223/8223/8223 -f 8221/8221/8221 8223/8223/8223 8224/8224/8224 -v 1503.38 16356 2226.97 -vt 0.434331 0.52803 -v 1930.88 16356 2226.97 -vt 0.430175 0.52803 -v 1930.88 16371 2226.97 -vt 0.430175 0.527205 -v 1503.38 16371 2226.97 -vt 0.434331 0.527205 -o mesh1659 -s off -f 8225/8225/8225 8226/8226/8226 8227/8227/8227 -f 8225/8225/8225 8227/8227/8227 8228/8228/8228 -g charts -o chart0000 -s off -f 8225/8225/8225 8226/8226/8226 8227/8227/8227 -f 8225/8225/8225 8227/8227/8227 8228/8228/8228 -v 1503.38 16356 2226.97 -vt 0.25478 0.993817 -v 1503.38 16371 2226.97 -vt 0.255611 0.993817 -v 1503.38 16371 2777.51 -vt 0.255611 0.988871 -v 1503.38 16356 2777.51 -vt 0.25478 0.988871 -o mesh1660 -s off -f 8229/8229/8229 8230/8230/8230 8231/8231/8231 -f 8229/8229/8229 8231/8231/8231 8232/8232/8232 -g charts -o chart0000 -s off -f 8229/8229/8229 8230/8230/8230 8231/8231/8231 -f 8229/8229/8229 8231/8231/8231 8232/8232/8232 -v 1477.12 16371 2226.97 -vt 0.0885286 0.948475 -v 1477.12 16356 2226.97 -vt 0.0885286 0.949299 -v 1477.12 16356 2777.51 -vt 0.0835411 0.949299 -v 1477.12 16371 2777.51 -vt 0.0835411 0.948475 -o mesh1661 -s off -f 8233/8233/8233 8234/8234/8234 8235/8235/8235 -f 8233/8233/8233 8235/8235/8235 8236/8236/8236 -g charts -o chart0000 -s off -f 8233/8233/8233 8234/8234/8234 8235/8235/8235 -f 8233/8233/8233 8235/8235/8235 8236/8236/8236 -v 48.3753 16318.5 2197.43 -vt 0.91548 0.0508671 -v 48.3753 16318.5 2226.97 -vt 0.91548 0.0510986 -v 929.625 16318.5 2197.43 -vt 0.908294 0.0508671 -v 48.3753 16318.5 2777.51 -vt 0.91548 0.0554134 -v 475.875 16318.5 2226.97 -vt 0.911994 0.0510986 -v 502.125 16318.5 2226.97 -vt 0.91178 0.0510986 -v 502.125 16318.5 2777.51 -vt 0.91178 0.0554134 -v 929.625 16318.5 2226.97 -vt 0.908294 0.0510986 -v 929.625 16318.5 -40.6129 -vt 0.908294 0.0333265 -v 929.625 16318.5 2777.51 -vt 0.908294 0.0554134 -v -71.6247 16318.5 2912.51 -vt 0.916459 0.0564715 -v -71.6247 16318.5 -243.113 -vt 0.916459 0.0317395 -v 1049.62 16318.5 2912.51 -vt 0.907315 0.0564715 -v 475.875 16318.5 2777.51 -vt 0.911994 0.0554134 -v 1049.62 16318.5 -243.113 -vt 0.907315 0.0317395 -v 48.3753 16318.5 -40.6129 -vt 0.91548 0.0333265 -o mesh1662 -s off -f 8237/8237/8237 8238/8238/8238 8239/8239/8239 -f 8238/8238/8238 8237/8237/8237 8240/8240/8240 -f 8239/8239/8239 8238/8238/8238 8241/8241/8241 -f 8239/8239/8239 8241/8241/8241 8242/8242/8242 -f 8242/8242/8242 8241/8241/8241 8243/8243/8243 -f 8239/8239/8239 8242/8242/8242 8244/8244/8244 -f 8239/8239/8239 8244/8244/8244 8245/8245/8245 -f 8245/8245/8245 8244/8244/8244 8246/8246/8246 -f 8247/8247/8247 8240/8240/8240 8248/8248/8248 -f 8240/8240/8240 8247/8247/8247 8249/8249/8249 -f 8248/8248/8248 8240/8240/8240 8237/8237/8237 -f 8240/8240/8240 8249/8249/8249 8250/8250/8250 -f 8250/8250/8250 8249/8249/8249 8243/8243/8243 -f 8250/8250/8250 8243/8243/8243 8241/8241/8241 -f 8243/8243/8243 8249/8249/8249 8246/8246/8246 -f 8246/8246/8246 8249/8249/8249 8251/8251/8251 -f 8248/8248/8248 8252/8252/8252 8251/8251/8251 -f 8252/8252/8252 8248/8248/8248 8237/8237/8237 -f 8251/8251/8251 8252/8252/8252 8245/8245/8245 -f 8251/8251/8251 8245/8245/8245 8246/8246/8246 -g charts -o chart0000 -s off -f 8237/8237/8237 8238/8238/8238 8239/8239/8239 -f 8238/8238/8238 8237/8237/8237 8240/8240/8240 -f 8239/8239/8239 8238/8238/8238 8241/8241/8241 -f 8239/8239/8239 8241/8241/8241 8242/8242/8242 -f 8242/8242/8242 8241/8241/8241 8243/8243/8243 -f 8239/8239/8239 8242/8242/8242 8244/8244/8244 -f 8239/8239/8239 8244/8244/8244 8245/8245/8245 -f 8245/8245/8245 8244/8244/8244 8246/8246/8246 -f 8247/8247/8247 8240/8240/8240 8248/8248/8248 -f 8240/8240/8240 8247/8247/8247 8249/8249/8249 -f 8248/8248/8248 8240/8240/8240 8237/8237/8237 -f 8240/8240/8240 8249/8249/8249 8250/8250/8250 -f 8250/8250/8250 8249/8249/8249 8243/8243/8243 -f 8250/8250/8250 8243/8243/8243 8241/8241/8241 -f 8243/8243/8243 8249/8249/8249 8246/8246/8246 -f 8246/8246/8246 8249/8249/8249 8251/8251/8251 -f 8248/8248/8248 8252/8252/8252 8251/8251/8251 -f 8252/8252/8252 8248/8248/8248 8237/8237/8237 -f 8251/8251/8251 8252/8252/8252 8245/8245/8245 -f 8251/8251/8251 8245/8245/8245 8246/8246/8246 -v -71.6247 16266 2912.51 -vt 0.982128 0.914674 -v 1049.62 16266 2912.51 -vt 0.972984 0.914674 -v 1049.62 16318.5 2912.51 -vt 0.972984 0.91385 -v -71.6247 16318.5 2912.51 -vt 0.982128 0.91385 -o mesh1663 -s off -f 8253/8253/8253 8254/8254/8254 8255/8255/8255 -f 8253/8253/8253 8255/8255/8255 8256/8256/8256 -g charts -o chart0000 -s off -f 8253/8253/8253 8254/8254/8254 8255/8255/8255 -f 8253/8253/8253 8255/8255/8255 8256/8256/8256 -v 1049.62 16266 -243.113 -vt 0.755195 0.312036 -v -71.6247 16266 -243.113 -vt 0.764339 0.312036 -v -71.6247 16318.5 -243.113 -vt 0.764339 0.312861 -v 1049.62 16318.5 -243.113 -vt 0.755195 0.312861 -o mesh1664 -s off -f 8257/8257/8257 8258/8258/8258 8259/8259/8259 -f 8257/8257/8257 8259/8259/8259 8260/8260/8260 -g charts -o chart0000 -s off -f 8257/8257/8257 8258/8258/8258 8259/8259/8259 -f 8257/8257/8257 8259/8259/8259 8260/8260/8260 -v 1049.62 16266 2912.51 -vt 0.622195 0.970734 -v 1049.62 16266 -243.113 -vt 0.647132 0.970734 -v 1049.62 16318.5 -243.113 -vt 0.647132 0.971558 -v 1049.62 16318.5 2912.51 -vt 0.622195 0.971558 -o mesh1665 -s off -f 8261/8261/8261 8262/8262/8262 8263/8263/8263 -f 8261/8261/8261 8263/8263/8263 8264/8264/8264 -g charts -o chart0000 -s off -f 8261/8261/8261 8262/8262/8262 8263/8263/8263 -f 8261/8261/8261 8263/8263/8263 8264/8264/8264 -v 48.3753 16266 -40.6129 -vt 0.719451 0.587387 -v 929.625 16266 -40.6129 -vt 0.71197 0.587387 -v 929.625 16318.5 -40.6129 -vt 0.71197 0.586562 -v 48.3753 16318.5 -40.6129 -vt 0.719451 0.586562 -o mesh1666 -s off -f 8265/8265/8265 8266/8266/8266 8267/8267/8267 -f 8265/8265/8265 8267/8267/8267 8268/8268/8268 -g charts -o chart0000 -s off -f 8265/8265/8265 8266/8266/8266 8267/8267/8267 -f 8265/8265/8265 8267/8267/8267 8268/8268/8268 -v 48.3753 16266 2777.51 -vt 0.820033 0.436521 -v 48.3753 16266 -40.6129 -vt 0.820033 0.459604 -v 48.3753 16318.5 -40.6129 -vt 0.819202 0.459604 -v 48.3753 16318.5 2197.43 -vt 0.819202 0.441272 -v 48.3753 16303.5 2197.43 -vt 0.819439 0.441272 -v 48.3753 16303.5 2226.97 -vt 0.819439 0.441031 -v 48.3753 16266 2777.51 -vt 0.249792 0.709398 -v 48.3753 16303.5 2226.97 -vt 0.244805 0.708809 -v 48.3753 16318.5 2226.97 -vt 0.244805 0.708574 -v 48.3753 16318.5 2777.51 -vt 0.249792 0.708574 -o mesh1667 -s off -f 8269/8269/8269 8270/8270/8270 8271/8271/8271 -f 8269/8269/8269 8271/8271/8271 8272/8272/8272 -f 8269/8269/8269 8272/8272/8272 8273/8273/8273 -f 8269/8269/8269 8273/8273/8273 8274/8274/8274 -f 8275/8275/8275 8276/8276/8276 8277/8277/8277 -f 8275/8275/8275 8277/8277/8277 8278/8278/8278 -g charts -o chart0000 -s off -f 8269/8269/8269 8270/8270/8270 8271/8271/8271 -f 8269/8269/8269 8271/8271/8271 8272/8272/8272 -f 8269/8269/8269 8272/8272/8272 8273/8273/8273 -f 8269/8269/8269 8273/8273/8273 8274/8274/8274 -o chart0001 -s off -f 8275/8275/8275 8276/8276/8276 8277/8277/8277 -f 8275/8275/8275 8277/8277/8277 8278/8278/8278 -v 929.625 16266 2777.51 -vt 0.492519 0.61789 -v 48.3753 16266 2777.51 -vt 0.500831 0.61789 -v 48.3753 16318.5 2777.51 -vt 0.500831 0.618714 -v 475.875 16318.5 2777.51 -vt 0.496799 0.618714 -v 475.875 16303.5 2777.51 -vt 0.496799 0.618478 -v 502.125 16303.5 2777.51 -vt 0.496551 0.618478 -v 929.625 16266 2777.51 -vt 0.521613 0.931162 -v 502.125 16303.5 2777.51 -vt 0.522206 0.935284 -v 502.125 16318.5 2777.51 -vt 0.522444 0.935284 -v 929.625 16318.5 2777.51 -vt 0.522444 0.931162 -o mesh1668 -s off -f 8279/8279/8279 8280/8280/8280 8281/8281/8281 -f 8279/8279/8279 8281/8281/8281 8282/8282/8282 -f 8279/8279/8279 8282/8282/8282 8283/8283/8283 -f 8279/8279/8279 8283/8283/8283 8284/8284/8284 -f 8285/8285/8285 8286/8286/8286 8287/8287/8287 -f 8285/8285/8285 8287/8287/8287 8288/8288/8288 -g charts -o chart0000 -s off -f 8279/8279/8279 8280/8280/8280 8281/8281/8281 -f 8279/8279/8279 8281/8281/8281 8282/8282/8282 -f 8279/8279/8279 8282/8282/8282 8283/8283/8283 -f 8279/8279/8279 8283/8283/8283 8284/8284/8284 -o chart0001 -s off -f 8285/8285/8285 8286/8286/8286 8287/8287/8287 -f 8285/8285/8285 8287/8287/8287 8288/8288/8288 -v -71.6247 16266 -243.113 -vt 0.627182 0.453833 -v 48.3753 16266 -40.6129 -vt 0.626203 0.452246 -v 48.3753 16266 2777.51 -vt 0.626203 0.430159 -v 1049.62 16266 -243.113 -vt 0.618038 0.453833 -v 929.625 16266 -40.6129 -vt 0.619017 0.452246 -v 929.625 16266 2777.51 -vt 0.619017 0.430159 -v -71.6247 16266 2912.51 -vt 0.627182 0.429101 -v 1049.62 16266 2912.51 -vt 0.618038 0.429101 -o mesh1669 -s off -f 8289/8289/8289 8290/8290/8290 8291/8291/8291 -f 8290/8290/8290 8289/8289/8289 8292/8292/8292 -f 8290/8290/8290 8292/8292/8292 8293/8293/8293 -f 8293/8293/8293 8292/8292/8292 8294/8294/8294 -f 8295/8295/8295 8291/8291/8291 8296/8296/8296 -f 8291/8291/8291 8295/8295/8295 8289/8289/8289 -f 8296/8296/8296 8291/8291/8291 8294/8294/8294 -f 8296/8296/8296 8294/8294/8294 8292/8292/8292 -g charts -o chart0000 -s off -f 8289/8289/8289 8290/8290/8290 8291/8291/8291 -f 8290/8290/8290 8289/8289/8289 8292/8292/8292 -f 8290/8290/8290 8292/8292/8292 8293/8293/8293 -f 8293/8293/8293 8292/8292/8292 8294/8294/8294 -f 8295/8295/8295 8291/8291/8291 8296/8296/8296 -f 8291/8291/8291 8295/8295/8295 8289/8289/8289 -f 8296/8296/8296 8291/8291/8291 8294/8294/8294 -f 8296/8296/8296 8294/8294/8294 8292/8292/8292 -v -71.6247 16266 -243.113 -vt 0.451787 0.187551 -v -71.6247 16266 2912.51 -vt 0.451787 0.162819 -v -71.6247 16318.5 2912.51 -vt 0.450956 0.162819 -v -71.6247 16318.5 -243.113 -vt 0.450956 0.187551 -o mesh1670 -s off -f 8297/8297/8297 8298/8298/8298 8299/8299/8299 -f 8297/8297/8297 8299/8299/8299 8300/8300/8300 -g charts -o chart0000 -s off -f 8297/8297/8297 8298/8298/8298 8299/8299/8299 -f 8297/8297/8297 8299/8299/8299 8300/8300/8300 -v 929.625 16318.5 2197.43 -vt 0.113003 0.910552 -v 929.625 16318.5 -40.6129 -vt 0.0951787 0.910552 -v 929.625 16266 -40.6129 -vt 0.0951787 0.911377 -v 929.625 16266 2777.51 -vt 0.117623 0.911377 -v 929.625 16318.5 2777.51 -vt 0.117623 0.910552 -v 929.625 16318.5 2226.97 -vt 0.113238 0.910552 -v 929.625 16318.5 2197.43 -vt 0.769327 0.578318 -v 929.625 16318.5 2226.97 -vt 0.769327 0.579143 -v 929.625 16303.5 2226.97 -vt 0.770158 0.579143 -v 929.625 16303.5 2197.43 -vt 0.770158 0.578318 -o mesh1671 -s off -f 8301/8301/8301 8302/8302/8302 8303/8303/8303 -f 8301/8301/8301 8303/8303/8303 8304/8304/8304 -f 8301/8301/8301 8304/8304/8304 8305/8305/8305 -f 8301/8301/8301 8305/8305/8305 8306/8306/8306 -f 8307/8307/8307 8308/8308/8308 8309/8309/8309 -f 8307/8307/8307 8309/8309/8309 8310/8310/8310 -g charts -o chart0000 -s off -f 8301/8301/8301 8302/8302/8302 8303/8303/8303 -f 8301/8301/8301 8303/8303/8303 8304/8304/8304 -f 8301/8301/8301 8304/8304/8304 8305/8305/8305 -f 8301/8301/8301 8305/8305/8305 8306/8306/8306 -o chart0001 -s off -f 8307/8307/8307 8308/8308/8308 8309/8309/8309 -f 8307/8307/8307 8309/8309/8309 8310/8310/8310 -v 475.875 16318.5 2226.97 -vt 0.782627 0.938582 -v 48.3753 16318.5 2226.97 -vt 0.786783 0.938582 -v 48.3753 16303.5 2226.97 -vt 0.786783 0.939406 -v 475.875 16303.5 2226.97 -vt 0.782627 0.939406 -o mesh1672 -s off -f 8311/8311/8311 8312/8312/8312 8313/8313/8313 -f 8311/8311/8311 8313/8313/8313 8314/8314/8314 -g charts -o chart0000 -s off -f 8311/8311/8311 8312/8312/8312 8313/8313/8313 -f 8311/8311/8311 8313/8313/8313 8314/8314/8314 -v 929.625 16303.5 2197.43 -vt 0.961347 0.432399 -v 929.625 16303.5 2226.97 -vt 0.961347 0.433223 -v 502.125 16303.5 2226.97 -vt 0.95719 0.433223 -v 929.625 16303.5 2197.43 -vt 0.616376 0.386232 -v 502.125 16303.5 2226.97 -vt 0.618616 0.382935 -v 502.125 16303.5 2777.51 -vt 0.622194 0.386232 -v 929.625 16303.5 2197.43 -vt 0.477556 0.421682 -v 502.125 16303.5 2777.51 -vt 0.473927 0.416735 -v 475.875 16303.5 2777.51 -vt 0.473704 0.416735 -v 475.875 16303.5 2226.97 -vt 0.473704 0.42143 -v 48.3753 16303.5 2226.97 -vt 0.470075 0.42143 -v 48.3753 16303.5 2197.43 -vt 0.470075 0.421682 -o mesh1673 -s off -f 8315/8315/8315 8316/8316/8316 8317/8317/8317 -f 8318/8318/8318 8319/8319/8319 8320/8320/8320 -f 8321/8321/8321 8322/8322/8322 8323/8323/8323 -f 8321/8321/8321 8323/8323/8323 8324/8324/8324 -f 8321/8321/8321 8324/8324/8324 8325/8325/8325 -f 8321/8321/8321 8325/8325/8325 8326/8326/8326 -g charts -o chart0000 -s off -f 8315/8315/8315 8316/8316/8316 8317/8317/8317 -o chart0001 -s off -f 8318/8318/8318 8319/8319/8319 8320/8320/8320 -o chart0002 -s off -f 8321/8321/8321 8322/8322/8322 8323/8323/8323 -f 8321/8321/8321 8323/8323/8323 8324/8324/8324 -f 8321/8321/8321 8324/8324/8324 8325/8325/8325 -f 8321/8321/8321 8325/8325/8325 8326/8326/8326 -v 929.625 16318.5 2197.43 -vt 0.661263 0.612943 -v 929.625 16303.5 2197.43 -vt 0.660432 0.612943 -v 48.3753 16303.5 2197.43 -vt 0.660432 0.605523 -v 48.3753 16318.5 2197.43 -vt 0.661263 0.605523 -o mesh1674 -s off -f 8327/8327/8327 8328/8328/8328 8329/8329/8329 -f 8327/8327/8327 8329/8329/8329 8330/8330/8330 -g charts -o chart0000 -s off -f 8327/8327/8327 8328/8328/8328 8329/8329/8329 -f 8327/8327/8327 8329/8329/8329 8330/8330/8330 -v 502.125 16303.5 2226.97 -vt 0.00207805 0.732481 -v 929.625 16303.5 2226.97 -vt 0.00207805 0.728359 -v 929.625 16318.5 2226.97 -vt 0.00124688 0.728359 -v 502.125 16318.5 2226.97 -vt 0.00124688 0.732481 -o mesh1675 -s off -f 8331/8331/8331 8332/8332/8332 8333/8333/8333 -f 8331/8331/8331 8333/8333/8333 8334/8334/8334 -g charts -o chart0000 -s off -f 8331/8331/8331 8332/8332/8332 8333/8333/8333 -f 8331/8331/8331 8333/8333/8333 8334/8334/8334 -v 502.125 16303.5 2226.97 -vt 0.217373 0.758038 -v 502.125 16318.5 2226.97 -vt 0.217373 0.758862 -v 502.125 16318.5 2777.51 -vt 0.212386 0.758862 -v 502.125 16303.5 2777.51 -vt 0.212386 0.758038 -o mesh1676 -s off -f 8335/8335/8335 8336/8336/8336 8337/8337/8337 -f 8335/8335/8335 8337/8337/8337 8338/8338/8338 -g charts -o chart0000 -s off -f 8335/8335/8335 8336/8336/8336 8337/8337/8337 -f 8335/8335/8335 8337/8337/8337 8338/8338/8338 -v 475.875 16318.5 2226.97 -vt 0.716126 0.605523 -v 475.875 16303.5 2226.97 -vt 0.716958 0.605523 -v 475.875 16303.5 2777.51 -vt 0.716958 0.600577 -v 475.875 16318.5 2777.51 -vt 0.716126 0.600577 -o mesh1677 -s off -f 8339/8339/8339 8340/8340/8340 8341/8341/8341 -f 8339/8339/8339 8341/8341/8341 8342/8342/8342 -g charts -o chart0000 -s off -f 8339/8339/8339 8340/8340/8340 8341/8341/8341 -f 8339/8339/8339 8341/8341/8341 8342/8342/8342 -v 2170.88 16371 2197.43 -vt 0.0787214 0.386911 -v 3052.12 16371 2226.97 -vt 0.0789547 0.379783 -v 3052.12 16371 2197.43 -vt 0.0787214 0.379783 -v 3052.12 16371 2777.51 -vt 0.0833055 0.379783 -v 2624.62 16371 2226.97 -vt 0.0789547 0.383241 -v 2598.38 16371 2226.97 -vt 0.0789547 0.383453 -v 2598.38 16371 2777.51 -vt 0.0833055 0.383453 -v 2170.88 16371 2226.97 -vt 0.0789547 0.386911 -v 2170.88 16371 -40.6129 -vt 0.061035 0.386911 -v 2170.88 16371 2777.51 -vt 0.0833055 0.386911 -v 3172.12 16371 -243.113 -vt 0.0594347 0.378813 -v 3172.12 16371 2912.51 -vt 0.0843723 0.378813 -v 2050.88 16371 2912.51 -vt 0.0843723 0.387881 -v 2624.62 16371 2777.51 -vt 0.0833055 0.383241 -v 2050.88 16371 -243.113 -vt 0.0594347 0.387881 -v 3052.12 16371 -40.6129 -vt 0.061035 0.379783 -o mesh1678 -s off -f 8343/8343/8343 8344/8344/8344 8345/8345/8345 -f 8346/8346/8346 8345/8345/8345 8344/8344/8344 -f 8347/8347/8347 8344/8344/8344 8343/8343/8343 -f 8348/8348/8348 8347/8347/8347 8343/8343/8343 -f 8349/8349/8349 8347/8347/8347 8348/8348/8348 -f 8350/8350/8350 8348/8348/8348 8343/8343/8343 -f 8351/8351/8351 8350/8350/8350 8343/8343/8343 -f 8352/8352/8352 8350/8350/8350 8351/8351/8351 -f 8353/8353/8353 8346/8346/8346 8354/8354/8354 -f 8355/8355/8355 8354/8354/8354 8346/8346/8346 -f 8345/8345/8345 8346/8346/8346 8353/8353/8353 -f 8356/8356/8356 8355/8355/8355 8346/8346/8346 -f 8349/8349/8349 8355/8355/8355 8356/8356/8356 -f 8347/8347/8347 8349/8349/8349 8356/8356/8356 -f 8352/8352/8352 8355/8355/8355 8349/8349/8349 -f 8357/8357/8357 8355/8355/8355 8352/8352/8352 -f 8357/8357/8357 8358/8358/8358 8353/8353/8353 -f 8345/8345/8345 8353/8353/8353 8358/8358/8358 -f 8351/8351/8351 8358/8358/8358 8357/8357/8357 -f 8352/8352/8352 8351/8351/8351 8357/8357/8357 -g charts -o chart0000 -s off -f 8343/8343/8343 8344/8344/8344 8345/8345/8345 -f 8346/8346/8346 8345/8345/8345 8344/8344/8344 -f 8347/8347/8347 8344/8344/8344 8343/8343/8343 -f 8348/8348/8348 8347/8347/8347 8343/8343/8343 -f 8349/8349/8349 8347/8347/8347 8348/8348/8348 -f 8350/8350/8350 8348/8348/8348 8343/8343/8343 -f 8351/8351/8351 8350/8350/8350 8343/8343/8343 -f 8352/8352/8352 8350/8350/8350 8351/8351/8351 -f 8353/8353/8353 8346/8346/8346 8354/8354/8354 -f 8355/8355/8355 8354/8354/8354 8346/8346/8346 -f 8345/8345/8345 8346/8346/8346 8353/8353/8353 -f 8356/8356/8356 8355/8355/8355 8346/8346/8346 -f 8349/8349/8349 8355/8355/8355 8356/8356/8356 -f 8347/8347/8347 8349/8349/8349 8356/8356/8356 -f 8352/8352/8352 8355/8355/8355 8349/8349/8349 -f 8357/8357/8357 8355/8355/8355 8352/8352/8352 -f 8357/8357/8357 8358/8358/8358 8353/8353/8353 -f 8345/8345/8345 8353/8353/8353 8358/8358/8358 -f 8351/8351/8351 8358/8358/8358 8357/8357/8357 -f 8352/8352/8352 8351/8351/8351 8357/8357/8357 -v 3172.12 16371 2912.51 -vt 0.500831 0.442292 -v 2050.88 16371 2912.51 -vt 0.509975 0.442292 -v 2050.88 16318.5 2912.51 -vt 0.509975 0.443116 -v 3172.12 16318.5 2912.51 -vt 0.500831 0.443116 -o mesh1679 -s off -f 8359/8359/8359 8360/8360/8360 8361/8361/8361 -f 8359/8359/8359 8361/8361/8361 8362/8362/8362 -g charts -o chart0000 -s off -f 8359/8359/8359 8360/8360/8360 8361/8361/8361 -f 8359/8359/8359 8361/8361/8361 8362/8362/8362 -v 2050.88 16371 -243.113 -vt 0.928928 0.927865 -v 3172.12 16371 -243.113 -vt 0.919784 0.927865 -v 3172.12 16318.5 -243.113 -vt 0.919784 0.92704 -v 2050.88 16318.5 -243.113 -vt 0.928928 0.92704 -o mesh1680 -s off -f 8363/8363/8363 8364/8364/8364 8365/8365/8365 -f 8363/8363/8363 8365/8365/8365 8366/8366/8366 -g charts -o chart0000 -s off -f 8363/8363/8363 8364/8364/8364 8365/8365/8365 -f 8363/8363/8363 8365/8365/8365 8366/8366/8366 -v 2050.88 16371 2912.51 -vt 0.0270158 0.382935 -v 2050.88 16371 -243.113 -vt 0.0270158 0.407667 -v 2050.88 16318.5 -243.113 -vt 0.027847 0.407667 -v 2050.88 16318.5 2912.51 -vt 0.027847 0.382935 -o mesh1681 -s off -f 8367/8367/8367 8368/8368/8368 8369/8369/8369 -f 8367/8367/8367 8369/8369/8369 8370/8370/8370 -g charts -o chart0000 -s off -f 8367/8367/8367 8368/8368/8368 8369/8369/8369 -f 8367/8367/8367 8369/8369/8369 8370/8370/8370 -v 3052.12 16371 -40.6129 -vt 0.873234 0.0457543 -v 2170.88 16371 -40.6129 -vt 0.873234 0.0531739 -v 2170.88 16318.5 -40.6129 -vt 0.874065 0.0531739 -v 3052.12 16318.5 -40.6129 -vt 0.874065 0.0457543 -o mesh1682 -s off -f 8371/8371/8371 8372/8372/8372 8373/8373/8373 -f 8371/8371/8371 8373/8373/8373 8374/8374/8374 -g charts -o chart0000 -s off -f 8371/8371/8371 8372/8372/8372 8373/8373/8373 -f 8371/8371/8371 8373/8373/8373 8374/8374/8374 -v 3052.12 16371 2777.51 -vt 0.847465 0.626958 -v 3052.12 16371 2226.97 -vt 0.852452 0.626958 -v 3052.12 16356 2226.97 -vt 0.852452 0.627782 -v 3052.12 16371 2777.51 -vt 0.886534 0.311212 -v 3052.12 16356 2226.97 -vt 0.882149 0.312036 -v 3052.12 16356 2197.43 -vt 0.881914 0.312036 -v 3052.12 16371 2197.43 -vt 0.881914 0.311212 -v 3052.12 16371 -40.6129 -vt 0.86409 0.311212 -v 3052.12 16371 2777.51 -vt 0.060266 0.185903 -v 3052.12 16371 -40.6129 -vt 0.060266 0.208162 -v 3052.12 16318.5 -40.6129 -vt 0.0610972 0.208162 -v 3052.12 16318.5 2777.51 -vt 0.0610972 0.185903 -o mesh1683 -s off -f 8375/8375/8375 8376/8376/8376 8377/8377/8377 -f 8378/8378/8378 8379/8379/8379 8380/8380/8380 -f 8378/8378/8378 8380/8380/8380 8381/8381/8381 -f 8378/8378/8378 8381/8381/8381 8382/8382/8382 -f 8383/8383/8383 8384/8384/8384 8385/8385/8385 -f 8383/8383/8383 8385/8385/8385 8386/8386/8386 -g charts -o chart0000 -s off -f 8375/8375/8375 8376/8376/8376 8377/8377/8377 -o chart0001 -s off -f 8378/8378/8378 8379/8379/8379 8380/8380/8380 -f 8378/8378/8378 8380/8380/8380 8381/8381/8381 -f 8378/8378/8378 8381/8381/8381 8382/8382/8382 -o chart0002 -s off -f 8383/8383/8383 8384/8384/8384 8385/8385/8385 -f 8383/8383/8383 8385/8385/8385 8386/8386/8386 -v 2170.88 16371 2777.51 -vt 0.82419 0.666529 -v 2598.38 16371 2777.51 -vt 0.828346 0.666529 -v 2598.38 16356 2777.51 -vt 0.828346 0.665705 -v 2170.88 16371 2777.51 -vt 0.514131 0.819044 -v 2598.38 16356 2777.51 -vt 0.510099 0.818808 -v 2624.62 16356 2777.51 -vt 0.509851 0.818808 -v 2624.62 16371 2777.51 -vt 0.509851 0.819044 -v 3052.12 16371 2777.51 -vt 0.505819 0.819044 -v 3052.12 16318.5 2777.51 -vt 0.505819 0.818219 -v 2170.88 16318.5 2777.51 -vt 0.514131 0.818219 -o mesh1684 -s off -f 8387/8387/8387 8388/8388/8388 8389/8389/8389 -f 8390/8390/8390 8391/8391/8391 8392/8392/8392 -f 8390/8390/8390 8392/8392/8392 8393/8393/8393 -f 8390/8390/8390 8393/8393/8393 8394/8394/8394 -f 8390/8390/8390 8394/8394/8394 8395/8395/8395 -f 8390/8390/8390 8395/8395/8395 8396/8396/8396 -g charts -o chart0000 -s off -f 8387/8387/8387 8388/8388/8388 8389/8389/8389 -o chart0001 -s off -f 8390/8390/8390 8391/8391/8391 8392/8392/8392 -f 8390/8390/8390 8392/8392/8392 8393/8393/8393 -f 8390/8390/8390 8393/8393/8393 8394/8394/8394 -f 8390/8390/8390 8394/8394/8394 8395/8395/8395 -f 8390/8390/8390 8395/8395/8395 8396/8396/8396 -v 3052.12 16318.5 2777.51 -vt 0.0114575 0.481185 -v 3052.12 16318.5 -40.6129 -vt 0.033728 0.481185 -v 3172.12 16318.5 -243.113 -vt 0.0353283 0.480214 -v 2050.88 16318.5 -243.113 -vt 0.0353283 0.489283 -v 2170.88 16318.5 -40.6129 -vt 0.033728 0.488312 -v 2170.88 16318.5 2777.51 -vt 0.0114575 0.488312 -v 2050.88 16318.5 2912.51 -vt 0.0103907 0.489283 -v 3172.12 16318.5 2912.51 -vt 0.0103907 0.480214 -o mesh1685 -s off -f 8397/8397/8397 8398/8398/8398 8399/8399/8399 -f 8400/8400/8400 8399/8399/8399 8398/8398/8398 -f 8401/8401/8401 8400/8400/8400 8398/8398/8398 -f 8402/8402/8402 8400/8400/8400 8401/8401/8401 -f 8403/8403/8403 8397/8397/8397 8404/8404/8404 -f 8399/8399/8399 8404/8404/8404 8397/8397/8397 -f 8402/8402/8402 8397/8397/8397 8403/8403/8403 -f 8400/8400/8400 8402/8402/8402 8403/8403/8403 -g charts -o chart0000 -s off -f 8397/8397/8397 8398/8398/8398 8399/8399/8399 -f 8400/8400/8400 8399/8399/8399 8398/8398/8398 -f 8401/8401/8401 8400/8400/8400 8398/8398/8398 -f 8402/8402/8402 8400/8400/8400 8401/8401/8401 -f 8403/8403/8403 8397/8397/8397 8404/8404/8404 -f 8399/8399/8399 8404/8404/8404 8397/8397/8397 -f 8402/8402/8402 8397/8397/8397 8403/8403/8403 -f 8400/8400/8400 8402/8402/8402 8403/8403/8403 -v 3172.12 16371 -243.113 -vt 0.625519 0.715169 -v 3172.12 16371 2912.51 -vt 0.625519 0.690437 -v 3172.12 16318.5 2912.51 -vt 0.624688 0.690437 -v 3172.12 16318.5 -243.113 -vt 0.624688 0.715169 -o mesh1686 -s off -f 8405/8405/8405 8406/8406/8406 8407/8407/8407 -f 8405/8405/8405 8407/8407/8407 8408/8408/8408 -g charts -o chart0000 -s off -f 8405/8405/8405 8406/8406/8406 8407/8407/8407 -f 8405/8405/8405 8407/8407/8407 8408/8408/8408 -v 2170.88 16356 2197.43 -vt 0.121779 0.406018 -v 2170.88 16356 2226.97 -vt 0.120948 0.405363 -v 2170.88 16371 2226.97 -vt 0.121779 0.405194 -v 2170.88 16356 2197.43 -vt 0.64085 0.599164 -v 2170.88 16371 2226.97 -vt 0.641085 0.598928 -v 2170.88 16371 2777.51 -vt 0.64547 0.598928 -v 2170.88 16318.5 2777.51 -vt 0.64547 0.599753 -v 2170.88 16318.5 -40.6129 -vt 0.623026 0.599753 -v 2170.88 16371 -40.6129 -vt 0.623026 0.598928 -v 2170.88 16371 2197.43 -vt 0.64085 0.598928 -o mesh1687 -s off -f 8409/8409/8409 8410/8410/8410 8411/8411/8411 -f 8412/8412/8412 8413/8413/8413 8414/8414/8414 -f 8412/8412/8412 8414/8414/8414 8415/8415/8415 -f 8412/8412/8412 8415/8415/8415 8416/8416/8416 -f 8412/8412/8412 8416/8416/8416 8417/8417/8417 -f 8412/8412/8412 8417/8417/8417 8418/8418/8418 -g charts -o chart0000 -s off -f 8409/8409/8409 8410/8410/8410 8411/8411/8411 -o chart0001 -s off -f 8412/8412/8412 8413/8413/8413 8414/8414/8414 -f 8412/8412/8412 8414/8414/8414 8415/8415/8415 -f 8412/8412/8412 8415/8415/8415 8416/8416/8416 -f 8412/8412/8412 8416/8416/8416 8417/8417/8417 -f 8412/8412/8412 8417/8417/8417 8418/8418/8418 -v 2624.62 16356 2226.97 -vt 0.803408 0.791014 -v 3052.12 16356 2226.97 -vt 0.803408 0.786892 -v 3052.12 16371 2226.97 -vt 0.802577 0.786892 -v 2624.62 16371 2226.97 -vt 0.802577 0.791014 -o mesh1688 -s off -f 8419/8419/8419 8420/8420/8420 8421/8421/8421 -f 8419/8419/8419 8421/8421/8421 8422/8422/8422 -g charts -o chart0000 -s off -f 8419/8419/8419 8420/8420/8420 8421/8421/8421 -f 8419/8419/8419 8421/8421/8421 8422/8422/8422 -v 3052.12 16356 2197.43 -vt 0.0868661 0.654988 -v 3052.12 16356 2226.97 -vt 0.0868464 0.654163 -v 2624.62 16356 2226.97 -vt 0.0827099 0.654988 -v 3052.12 16356 2197.43 -vt 0.279717 0.606348 -v 2624.62 16356 2226.97 -vt 0.276392 0.608569 -v 2624.62 16356 2777.51 -vt 0.279717 0.612119 -v 3052.12 16356 2197.43 -vt 0.85079 0.0317394 -v 2624.62 16356 2777.51 -vt 0.845802 0.0281402 -v 2598.38 16356 2777.51 -vt 0.845802 0.0279191 -v 2598.38 16356 2226.97 -vt 0.850536 0.0279191 -v 2170.88 16356 2226.97 -vt 0.850536 0.0243199 -v 2170.88 16356 2197.43 -vt 0.85079 0.0243199 -o mesh1689 -s off -f 8423/8423/8423 8424/8424/8424 8425/8425/8425 -f 8426/8426/8426 8427/8427/8427 8428/8428/8428 -f 8429/8429/8429 8430/8430/8430 8431/8431/8431 -f 8429/8429/8429 8431/8431/8431 8432/8432/8432 -f 8429/8429/8429 8432/8432/8432 8433/8433/8433 -f 8429/8429/8429 8433/8433/8433 8434/8434/8434 -g charts -o chart0000 -s off -f 8423/8423/8423 8424/8424/8424 8425/8425/8425 -o chart0001 -s off -f 8426/8426/8426 8427/8427/8427 8428/8428/8428 -o chart0002 -s off -f 8429/8429/8429 8430/8430/8430 8431/8431/8431 -f 8429/8429/8429 8431/8431/8431 8432/8432/8432 -f 8429/8429/8429 8432/8432/8432 8433/8433/8433 -f 8429/8429/8429 8433/8433/8433 8434/8434/8434 -v 3052.12 16371 2197.43 -vt 0.809227 0.475268 -v 3052.12 16356 2197.43 -vt 0.808396 0.475268 -v 2170.88 16356 2197.43 -vt 0.808396 0.467848 -v 2170.88 16371 2197.43 -vt 0.809227 0.467848 -o mesh1690 -s off -f 8435/8435/8435 8436/8436/8436 8437/8437/8437 -f 8435/8435/8435 8437/8437/8437 8438/8438/8438 -g charts -o chart0000 -s off -f 8435/8435/8435 8436/8436/8436 8437/8437/8437 -f 8435/8435/8435 8437/8437/8437 8438/8438/8438 -v 2598.38 16371 2226.97 -vt 0.968828 0.899011 -v 2170.88 16371 2226.97 -vt 0.968828 0.903133 -v 2170.88 16356 2226.97 -vt 0.969659 0.903133 -v 2598.38 16356 2226.97 -vt 0.969659 0.899011 -o mesh1691 -s off -f 8439/8439/8439 8440/8440/8440 8441/8441/8441 -f 8439/8439/8439 8441/8441/8441 8442/8442/8442 -g charts -o chart0000 -s off -f 8439/8439/8439 8440/8440/8440 8441/8441/8441 -f 8439/8439/8439 8441/8441/8441 8442/8442/8442 -v 2598.38 16356 2777.51 -vt 0.415212 0.661583 -v 2598.38 16371 2777.51 -vt 0.414381 0.661583 -v 2598.38 16371 2226.97 -vt 0.414381 0.656636 -v 2598.38 16356 2226.97 -vt 0.415212 0.656636 -o mesh1692 -s off -f 8443/8443/8443 8444/8444/8444 8445/8445/8445 -f 8443/8443/8443 8445/8445/8445 8446/8446/8446 -g charts -o chart0000 -s off -f 8443/8443/8443 8444/8444/8444 8445/8445/8445 -f 8443/8443/8443 8445/8445/8445 8446/8446/8446 -v 2624.62 16371 2777.51 -vt 0.999584 0.957543 -v 2624.62 16356 2777.51 -vt 0.998753 0.957543 -v 2624.62 16356 2226.97 -vt 0.998753 0.952597 -v 2624.62 16371 2226.97 -vt 0.999584 0.952597 -o mesh1693 -s off -f 8447/8447/8447 8448/8448/8448 8449/8449/8449 -f 8447/8447/8447 8449/8449/8449 8450/8450/8450 -g charts -o chart0000 -s off -f 8447/8447/8447 8448/8448/8448 8449/8449/8449 -f 8447/8447/8447 8449/8449/8449 8450/8450/8450 -v 3172.12 16318.5 2197.43 -vt 0.0720714 0.604553 -v 4053.38 16318.5 2226.97 -vt 0.0723047 0.597426 -v 4053.38 16318.5 2197.43 -vt 0.0720714 0.597426 -v 4053.38 16318.5 2777.51 -vt 0.0766555 0.597426 -v 3625.88 16318.5 2226.97 -vt 0.0723047 0.600883 -v 3599.62 16318.5 2226.97 -vt 0.0723047 0.601095 -v 3599.62 16318.5 2777.51 -vt 0.0766555 0.601095 -v 3172.12 16318.5 2226.97 -vt 0.0723047 0.604553 -v 3172.12 16318.5 -40.6129 -vt 0.0543849 0.604553 -v 3172.12 16318.5 2777.51 -vt 0.0766555 0.604553 -v 4173.38 16318.5 -243.113 -vt 0.0527847 0.596455 -v 4173.38 16318.5 2912.51 -vt 0.0777223 0.596455 -v 3052.12 16318.5 2912.51 -vt 0.0777223 0.605523 -v 3625.88 16318.5 2777.51 -vt 0.0766555 0.600883 -v 3052.12 16318.5 -243.113 -vt 0.0527847 0.605523 -v 4053.38 16318.5 -40.6129 -vt 0.0543849 0.597426 -o mesh1694 -s off -f 8451/8451/8451 8452/8452/8452 8453/8453/8453 -f 8454/8454/8454 8453/8453/8453 8452/8452/8452 -f 8455/8455/8455 8452/8452/8452 8451/8451/8451 -f 8456/8456/8456 8455/8455/8455 8451/8451/8451 -f 8457/8457/8457 8455/8455/8455 8456/8456/8456 -f 8458/8458/8458 8456/8456/8456 8451/8451/8451 -f 8459/8459/8459 8458/8458/8458 8451/8451/8451 -f 8460/8460/8460 8458/8458/8458 8459/8459/8459 -f 8461/8461/8461 8454/8454/8454 8462/8462/8462 -f 8463/8463/8463 8462/8462/8462 8454/8454/8454 -f 8453/8453/8453 8454/8454/8454 8461/8461/8461 -f 8464/8464/8464 8463/8463/8463 8454/8454/8454 -f 8457/8457/8457 8463/8463/8463 8464/8464/8464 -f 8455/8455/8455 8457/8457/8457 8464/8464/8464 -f 8460/8460/8460 8463/8463/8463 8457/8457/8457 -f 8465/8465/8465 8463/8463/8463 8460/8460/8460 -f 8465/8465/8465 8466/8466/8466 8461/8461/8461 -f 8453/8453/8453 8461/8461/8461 8466/8466/8466 -f 8459/8459/8459 8466/8466/8466 8465/8465/8465 -f 8460/8460/8460 8459/8459/8459 8465/8465/8465 -g charts -o chart0000 -s off -f 8451/8451/8451 8452/8452/8452 8453/8453/8453 -f 8454/8454/8454 8453/8453/8453 8452/8452/8452 -f 8455/8455/8455 8452/8452/8452 8451/8451/8451 -f 8456/8456/8456 8455/8455/8455 8451/8451/8451 -f 8457/8457/8457 8455/8455/8455 8456/8456/8456 -f 8458/8458/8458 8456/8456/8456 8451/8451/8451 -f 8459/8459/8459 8458/8458/8458 8451/8451/8451 -f 8460/8460/8460 8458/8458/8458 8459/8459/8459 -f 8461/8461/8461 8454/8454/8454 8462/8462/8462 -f 8463/8463/8463 8462/8462/8462 8454/8454/8454 -f 8453/8453/8453 8454/8454/8454 8461/8461/8461 -f 8464/8464/8464 8463/8463/8463 8454/8454/8454 -f 8457/8457/8457 8463/8463/8463 8464/8464/8464 -f 8455/8455/8455 8457/8457/8457 8464/8464/8464 -f 8460/8460/8460 8463/8463/8463 8457/8457/8457 -f 8465/8465/8465 8463/8463/8463 8460/8460/8460 -f 8465/8465/8465 8466/8466/8466 8461/8461/8461 -f 8453/8453/8453 8461/8461/8461 8466/8466/8466 -f 8459/8459/8459 8466/8466/8466 8465/8465/8465 -f 8460/8460/8460 8459/8459/8459 8465/8465/8465 -v 4173.38 16318.5 2912.51 -vt 0.0586035 0.761336 -v 3052.12 16318.5 2912.51 -vt 0.0586035 0.770404 -v 3052.12 16266 2912.51 -vt 0.0594347 0.770404 -v 4173.38 16266 2912.51 -vt 0.0594347 0.761336 -o mesh1695 -s off -f 8467/8467/8467 8468/8468/8468 8469/8469/8469 -f 8467/8467/8467 8469/8469/8469 8470/8470/8470 -g charts -o chart0000 -s off -f 8467/8467/8467 8468/8468/8468 8469/8469/8469 -f 8467/8467/8467 8469/8469/8469 8470/8470/8470 -v 3052.12 16318.5 -243.113 -vt 0.388612 0.303792 -v 4173.38 16318.5 -243.113 -vt 0.379468 0.303792 -v 4173.38 16266 -243.113 -vt 0.379468 0.302968 -v 3052.12 16266 -243.113 -vt 0.388612 0.302968 -o mesh1696 -s off -f 8471/8471/8471 8472/8472/8472 8473/8473/8473 -f 8471/8471/8471 8473/8473/8473 8474/8474/8474 -g charts -o chart0000 -s off -f 8471/8471/8471 8472/8472/8472 8473/8473/8473 -f 8471/8471/8471 8473/8473/8473 8474/8474/8474 -v 3052.12 16318.5 2912.51 -vt 0.0112219 0.730008 -v 3052.12 16318.5 -243.113 -vt 0.0361595 0.730008 -v 3052.12 16266 -243.113 -vt 0.0361595 0.730833 -v 3052.12 16266 2912.51 -vt 0.0112219 0.730833 -o mesh1697 -s off -f 8475/8475/8475 8476/8476/8476 8477/8477/8477 -f 8475/8475/8475 8477/8477/8477 8478/8478/8478 -g charts -o chart0000 -s off -f 8475/8475/8475 8476/8476/8476 8477/8477/8477 -f 8475/8475/8475 8477/8477/8477 8478/8478/8478 -v 4053.38 16318.5 -40.6129 -vt 0.97049 0.418384 -v 3172.12 16318.5 -40.6129 -vt 0.97049 0.425804 -v 3172.12 16266 -40.6129 -vt 0.971322 0.425804 -v 4053.38 16266 -40.6129 -vt 0.971322 0.418384 -o mesh1698 -s off -f 8479/8479/8479 8480/8480/8480 8481/8481/8481 -f 8479/8479/8479 8481/8481/8481 8482/8482/8482 -g charts -o chart0000 -s off -f 8479/8479/8479 8480/8480/8480 8481/8481/8481 -f 8479/8479/8479 8481/8481/8481 8482/8482/8482 -v 4053.38 16318.5 2777.51 -vt 0.209892 0.888294 -v 4053.38 16318.5 2226.97 -vt 0.214879 0.888294 -v 4053.38 16303.5 2226.97 -vt 0.214879 0.889118 -v 4053.38 16318.5 2777.51 -vt 0.140898 0.577494 -v 4053.38 16303.5 2226.97 -vt 0.141729 0.573145 -v 4053.38 16303.5 2197.43 -vt 0.141729 0.572912 -v 4053.38 16318.5 2197.43 -vt 0.140898 0.572912 -v 4053.38 16318.5 -40.6129 -vt 0.140898 0.555235 -v 4053.38 16318.5 2777.51 -vt 0.174148 0.789365 -v 4053.38 16318.5 -40.6129 -vt 0.174148 0.811624 -v 4053.38 16266 -40.6129 -vt 0.174979 0.811624 -v 4053.38 16266 2777.51 -vt 0.174979 0.789365 -o mesh1699 -s off -f 8483/8483/8483 8484/8484/8484 8485/8485/8485 -f 8486/8486/8486 8487/8487/8487 8488/8488/8488 -f 8486/8486/8486 8488/8488/8488 8489/8489/8489 -f 8486/8486/8486 8489/8489/8489 8490/8490/8490 -f 8491/8491/8491 8492/8492/8492 8493/8493/8493 -f 8491/8491/8491 8493/8493/8493 8494/8494/8494 -g charts -o chart0000 -s off -f 8483/8483/8483 8484/8484/8484 8485/8485/8485 -o chart0001 -s off -f 8486/8486/8486 8487/8487/8487 8488/8488/8488 -f 8486/8486/8486 8488/8488/8488 8489/8489/8489 -f 8486/8486/8486 8489/8489/8489 8490/8490/8490 -o chart0002 -s off -f 8491/8491/8491 8492/8492/8492 8493/8493/8493 -f 8491/8491/8491 8493/8493/8493 8494/8494/8494 -v 3172.12 16318.5 2777.51 -vt 0.184123 0.747321 -v 3599.62 16318.5 2777.51 -vt 0.188279 0.747321 -v 3599.62 16303.5 2777.51 -vt 0.188279 0.746496 -v 3172.12 16318.5 2777.51 -vt 0.00457182 0.17601 -v 3599.62 16303.5 2777.51 -vt 0.00433451 0.172011 -v 3625.88 16303.5 2777.51 -vt 0.00433451 0.171765 -v 3625.88 16318.5 2777.51 -vt 0.00457182 0.171765 -v 4053.38 16318.5 2777.51 -vt 0.00457182 0.167766 -v 4053.38 16266 2777.51 -vt 0.00374065 0.167766 -v 3172.12 16266 2777.51 -vt 0.00374065 0.17601 -o mesh1700 -s off -f 8495/8495/8495 8496/8496/8496 8497/8497/8497 -f 8498/8498/8498 8499/8499/8499 8500/8500/8500 -f 8498/8498/8498 8500/8500/8500 8501/8501/8501 -f 8498/8498/8498 8501/8501/8501 8502/8502/8502 -f 8498/8498/8498 8502/8502/8502 8503/8503/8503 -f 8498/8498/8498 8503/8503/8503 8504/8504/8504 -g charts -o chart0000 -s off -f 8495/8495/8495 8496/8496/8496 8497/8497/8497 -o chart0001 -s off -f 8498/8498/8498 8499/8499/8499 8500/8500/8500 -f 8498/8498/8498 8500/8500/8500 8501/8501/8501 -f 8498/8498/8498 8501/8501/8501 8502/8502/8502 -f 8498/8498/8498 8502/8502/8502 8503/8503/8503 -f 8498/8498/8498 8503/8503/8503 8504/8504/8504 -v 4053.38 16266 2777.51 -vt 0.407966 0.50097 -v 4053.38 16266 -40.6129 -vt 0.430237 0.50097 -v 4173.38 16266 -243.113 -vt 0.431837 0.5 -v 3052.12 16266 -243.113 -vt 0.431837 0.509068 -v 3172.12 16266 -40.6129 -vt 0.430237 0.508098 -v 3172.12 16266 2777.51 -vt 0.407966 0.508098 -v 3052.12 16266 2912.51 -vt 0.406899 0.509068 -v 4173.38 16266 2912.51 -vt 0.406899 0.5 -o mesh1701 -s off -f 8505/8505/8505 8506/8506/8506 8507/8507/8507 -f 8508/8508/8508 8507/8507/8507 8506/8506/8506 -f 8509/8509/8509 8508/8508/8508 8506/8506/8506 -f 8510/8510/8510 8508/8508/8508 8509/8509/8509 -f 8511/8511/8511 8505/8505/8505 8512/8512/8512 -f 8507/8507/8507 8512/8512/8512 8505/8505/8505 -f 8510/8510/8510 8505/8505/8505 8511/8511/8511 -f 8508/8508/8508 8510/8510/8510 8511/8511/8511 -g charts -o chart0000 -s off -f 8505/8505/8505 8506/8506/8506 8507/8507/8507 -f 8508/8508/8508 8507/8507/8507 8506/8506/8506 -f 8509/8509/8509 8508/8508/8508 8506/8506/8506 -f 8510/8510/8510 8508/8508/8508 8509/8509/8509 -f 8511/8511/8511 8505/8505/8505 8512/8512/8512 -f 8507/8507/8507 8512/8512/8512 8505/8505/8505 -f 8510/8510/8510 8505/8505/8505 8511/8511/8511 -f 8508/8508/8508 8510/8510/8510 8511/8511/8511 -v 4173.38 16318.5 -243.113 -vt 0.537406 0.370569 -v 4173.38 16318.5 2912.51 -vt 0.512469 0.370569 -v 4173.38 16266 2912.51 -vt 0.512469 0.369744 -v 4173.38 16266 -243.113 -vt 0.537406 0.369744 -o mesh1702 -s off -f 8513/8513/8513 8514/8514/8514 8515/8515/8515 -f 8513/8513/8513 8515/8515/8515 8516/8516/8516 -g charts -o chart0000 -s off -f 8513/8513/8513 8514/8514/8514 8515/8515/8515 -f 8513/8513/8513 8515/8515/8515 8516/8516/8516 -v 3172.12 16303.5 2197.43 -vt 0.393599 0.306265 -v 3172.12 16303.5 2226.97 -vt 0.392768 0.30561 -v 3172.12 16318.5 2226.97 -vt 0.393599 0.305441 -v 3172.12 16303.5 2197.43 -vt 0.167735 0.691626 -v 3172.12 16318.5 2226.97 -vt 0.167498 0.691859 -v 3172.12 16318.5 2777.51 -vt 0.167498 0.696208 -v 3172.12 16266 2777.51 -vt 0.168329 0.696208 -v 3172.12 16266 -40.6129 -vt 0.168329 0.673949 -v 3172.12 16318.5 -40.6129 -vt 0.167498 0.673949 -v 3172.12 16318.5 2197.43 -vt 0.167498 0.691626 -o mesh1703 -s off -f 8517/8517/8517 8518/8518/8518 8519/8519/8519 -f 8520/8520/8520 8521/8521/8521 8522/8522/8522 -f 8520/8520/8520 8522/8522/8522 8523/8523/8523 -f 8520/8520/8520 8523/8523/8523 8524/8524/8524 -f 8520/8520/8520 8524/8524/8524 8525/8525/8525 -f 8520/8520/8520 8525/8525/8525 8526/8526/8526 -g charts -o chart0000 -s off -f 8517/8517/8517 8518/8518/8518 8519/8519/8519 -o chart0001 -s off -f 8520/8520/8520 8521/8521/8521 8522/8522/8522 -f 8520/8520/8520 8522/8522/8522 8523/8523/8523 -f 8520/8520/8520 8523/8523/8523 8524/8524/8524 -f 8520/8520/8520 8524/8524/8524 8525/8525/8525 -f 8520/8520/8520 8525/8525/8525 8526/8526/8526 -v 3625.88 16303.5 2226.97 -vt 0.819202 0.00618293 -v 4053.38 16303.5 2226.97 -vt 0.819202 0.00206101 -v 4053.38 16318.5 2226.97 -vt 0.818371 0.00206101 -v 3625.88 16318.5 2226.97 -vt 0.818371 0.00618293 -o mesh1704 -s off -f 8527/8527/8527 8528/8528/8528 8529/8529/8529 -f 8527/8527/8527 8529/8529/8529 8530/8530/8530 -g charts -o chart0000 -s off -f 8527/8527/8527 8528/8528/8528 8529/8529/8529 -f 8527/8527/8527 8529/8529/8529 8530/8530/8530 -v 4053.38 16303.5 2197.43 -vt 0.598088 0.588211 -v 4053.38 16303.5 2226.97 -vt 0.598919 0.588211 -v 3625.88 16303.5 2226.97 -vt 0.598919 0.584089 -v 4053.38 16303.5 2197.43 -vt 0.0120531 0.949299 -v 3625.88 16303.5 2226.97 -vt 0.00872818 0.951521 -v 3625.88 16303.5 2777.51 -vt 0.0120531 0.95507 -v 4053.38 16303.5 2197.43 -vt 0.277224 0.9831 -v 3625.88 16303.5 2777.51 -vt 0.273594 0.978153 -v 3599.62 16303.5 2777.51 -vt 0.273371 0.978153 -v 3599.62 16303.5 2226.97 -vt 0.273371 0.982848 -v 3172.12 16303.5 2226.97 -vt 0.269742 0.982848 -v 3172.12 16303.5 2197.43 -vt 0.269742 0.9831 -o mesh1705 -s off -f 8531/8531/8531 8532/8532/8532 8533/8533/8533 -f 8534/8534/8534 8535/8535/8535 8536/8536/8536 -f 8537/8537/8537 8538/8538/8538 8539/8539/8539 -f 8537/8537/8537 8539/8539/8539 8540/8540/8540 -f 8537/8537/8537 8540/8540/8540 8541/8541/8541 -f 8537/8537/8537 8541/8541/8541 8542/8542/8542 -g charts -o chart0000 -s off -f 8531/8531/8531 8532/8532/8532 8533/8533/8533 -o chart0001 -s off -f 8534/8534/8534 8535/8535/8535 8536/8536/8536 -o chart0002 -s off -f 8537/8537/8537 8538/8538/8538 8539/8539/8539 -f 8537/8537/8537 8539/8539/8539 8540/8540/8540 -f 8537/8537/8537 8540/8540/8540 8541/8541/8541 -f 8537/8537/8537 8541/8541/8541 8542/8542/8542 -v 4053.38 16318.5 2197.43 -vt 0.107647 0.91385 -v 4053.38 16303.5 2197.43 -vt 0.107647 0.913026 -v 3172.12 16303.5 2197.43 -vt 0.100166 0.913026 -v 3172.12 16318.5 2197.43 -vt 0.100166 0.91385 -o mesh1706 -s off -f 8543/8543/8543 8544/8544/8544 8545/8545/8545 -f 8543/8543/8543 8545/8545/8545 8546/8546/8546 -g charts -o chart0000 -s off -f 8543/8543/8543 8544/8544/8544 8545/8545/8545 -f 8543/8543/8543 8545/8545/8545 8546/8546/8546 -v 3599.62 16318.5 2226.97 -vt 0.819202 0.367271 -v 3172.12 16318.5 2226.97 -vt 0.819202 0.371393 -v 3172.12 16303.5 2226.97 -vt 0.820033 0.371393 -v 3599.62 16303.5 2226.97 -vt 0.820033 0.367271 -o mesh1707 -s off -f 8547/8547/8547 8548/8548/8548 8549/8549/8549 -f 8547/8547/8547 8549/8549/8549 8550/8550/8550 -g charts -o chart0000 -s off -f 8547/8547/8547 8548/8548/8548 8549/8549/8549 -f 8547/8547/8547 8549/8549/8549 8550/8550/8550 -v 3599.62 16303.5 2777.51 -vt 0.717789 0.312036 -v 3599.62 16318.5 2777.51 -vt 0.717789 0.311212 -v 3599.62 16318.5 2226.97 -vt 0.712801 0.311212 -v 3599.62 16303.5 2226.97 -vt 0.712801 0.312036 -o mesh1708 -s off -f 8551/8551/8551 8552/8552/8552 8553/8553/8553 -f 8551/8551/8551 8553/8553/8553 8554/8554/8554 -g charts -o chart0000 -s off -f 8551/8551/8551 8552/8552/8552 8553/8553/8553 -f 8551/8551/8551 8553/8553/8553 8554/8554/8554 -v 3625.88 16318.5 2777.51 -vt 0.184123 0.98887 -v 3625.88 16303.5 2777.51 -vt 0.184123 0.988046 -v 3625.88 16303.5 2226.97 -vt 0.179136 0.988046 -v 3625.88 16318.5 2226.97 -vt 0.179136 0.98887 -o mesh1709 -s off -f 8555/8555/8555 8556/8556/8556 8557/8557/8557 -f 8555/8555/8555 8557/8557/8557 8558/8558/8558 -g charts -o chart0000 -s off -f 8555/8555/8555 8556/8556/8556 8557/8557/8557 -f 8555/8555/8555 8557/8557/8557 8558/8558/8558 -v 5105.88 16266 -285.3 -vt 0.893184 0.944353 -v 5143.38 16266 -243.113 -vt 0.893519 0.945177 -v 5105.88 16266 2954.7 -vt 0.918953 0.944353 -v 5143.38 16266 2912.51 -vt 0.918617 0.945177 -o mesh1710 -s off -f 8559/8559/8559 8560/8560/8560 8561/8561/8561 -f 8562/8562/8562 8561/8561/8561 8560/8560/8560 -g charts -o chart0000 -s off -f 8559/8559/8559 8560/8560/8560 8561/8561/8561 -f 8562/8562/8562 8561/8561/8561 8560/8560/8560 -v 5143.38 16266 -243.113 -vt 0.559315 0.889118 -v 5105.88 16266 -285.3 -vt 0.559019 0.889942 -v 9425.88 16266 -285.3 -vt 0.5931 0.889942 -o mesh1711 -s off -f 8563/8563/8563 8564/8564/8564 8565/8565/8565 -g charts -o chart0000 -s off -f 8563/8563/8563 8564/8564/8564 8565/8565/8565 -v 5143.38 16266 -243.113 -vt 0.00207805 0.645919 -v 9425.88 16266 -285.3 -vt 0.00207805 0.67972 -v 9388.38 16266 -243.113 -vt 0.00124688 0.67942 -o mesh1712 -s off -f 8566/8566/8566 8567/8567/8567 8568/8568/8568 -g charts -o chart0000 -s off -f 8566/8566/8566 8567/8567/8567 8568/8568/8568 -v 9388.38 16266 -243.113 -vt 0.628013 0.71551 -v 9425.88 16266 -285.3 -vt 0.628844 0.715169 -v 9388.38 16266 2912.51 -vt 0.628844 0.740725 -o mesh1713 -s off -f 8569/8569/8569 8570/8570/8570 8571/8571/8571 -g charts -o chart0000 -s off -f 8569/8569/8569 8570/8570/8570 8571/8571/8571 -v 5105.88 16266 2954.7 -vt 0.996259 0.180132 -v 5143.38 16266 2912.51 -vt 0.995428 0.179838 -v 9425.88 16266 2954.7 -vt 0.996259 0.146331 -o mesh1714 -s off -f 8572/8572/8572 8573/8573/8573 8574/8574/8574 -g charts -o chart0000 -s off -f 8572/8572/8572 8573/8573/8573 8574/8574/8574 -v 9425.88 16266 2954.7 -vt 0.208229 0.539571 -v 5143.38 16266 2912.51 -vt 0.242311 0.539571 -v 9388.38 16266 2912.51 -vt 0.208531 0.538747 -o mesh1715 -s off -f 8575/8575/8575 8576/8576/8576 8577/8577/8577 -g charts -o chart0000 -s off -f 8575/8575/8575 8576/8576/8576 8577/8577/8577 -v 9425.88 16266 2954.7 -vt 0.896509 0.365622 -v 9388.38 16266 2912.51 -vt 0.895677 0.36529 -v 9425.88 16266 -285.3 -vt 0.896509 0.340066 -o mesh1716 -s off -f 8578/8578/8578 8579/8579/8579 8580/8580/8580 -g charts -o chart0000 -s off -f 8578/8578/8578 8579/8579/8579 8580/8580/8580 -v 9425.88 16266 -285.3 -vt 0.714464 0.88582 -v 5105.88 16266 -285.3 -vt 0.748545 0.88582 -v 5105.88 16431 -285.3 -vt 0.748545 0.887469 -v 9425.88 16431 -285.3 -vt 0.714464 0.887469 -o mesh1717 -s off -f 8581/8581/8581 8582/8582/8582 8583/8583/8583 -f 8581/8581/8581 8583/8583/8583 8584/8584/8584 -g charts -o chart0000 -s off -f 8581/8581/8581 8582/8582/8582 8583/8583/8583 -f 8581/8581/8581 8583/8583/8583 8584/8584/8584 -v 9388.38 16266 2912.51 -vt 0.503325 0.41756 -v 5143.38 16266 2912.51 -vt 0.537406 0.41756 -v 5143.38 16431 2912.51 -vt 0.537406 0.419208 -v 9388.38 16431 2912.51 -vt 0.503325 0.419208 -o mesh1718 -s off -f 8585/8585/8585 8586/8586/8586 8587/8587/8587 -f 8585/8585/8585 8587/8587/8587 8588/8588/8588 -g charts -o chart0000 -s off -f 8585/8585/8585 8586/8586/8586 8587/8587/8587 -f 8585/8585/8585 8587/8587/8587 8588/8588/8588 -v 5105.88 16266 2954.7 -vt 0.100997 0.407667 -v 9425.88 16266 2954.7 -vt 0.100997 0.373866 -v 9425.88 16431 2954.7 -vt 0.099335 0.373866 -v 5105.88 16431 2954.7 -vt 0.099335 0.407667 -o mesh1719 -s off -f 8589/8589/8589 8590/8590/8590 8591/8591/8591 -f 8589/8589/8589 8591/8591/8591 8592/8592/8592 -g charts -o chart0000 -s off -f 8589/8589/8589 8590/8590/8590 8591/8591/8591 -f 8589/8589/8589 8591/8591/8591 8592/8592/8592 -v 9425.88 16266 2954.7 -vt 0.163342 0.979802 -v 9425.88 16266 -285.3 -vt 0.18911 0.979802 -v 9425.88 16431 -285.3 -vt 0.18911 0.981451 -v 9425.88 16431 2954.7 -vt 0.163342 0.981451 -o mesh1720 -s off -f 8593/8593/8593 8594/8594/8594 8595/8595/8595 -f 8593/8593/8593 8595/8595/8595 8596/8596/8596 -g charts -o chart0000 -s off -f 8593/8593/8593 8594/8594/8594 8595/8595/8595 -f 8593/8593/8593 8595/8595/8595 8596/8596/8596 -v 9388.38 16266 -243.113 -vt 0.656276 0.627782 -v 9388.38 16266 2912.51 -vt 0.656276 0.60305 -v 9388.38 16431 2912.51 -vt 0.654613 0.60305 -v 9388.38 16431 -243.113 -vt 0.654613 0.627782 -o mesh1721 -s off -f 8597/8597/8597 8598/8598/8598 8599/8599/8599 -f 8597/8597/8597 8599/8599/8599 8600/8600/8600 -g charts -o chart0000 -s off -f 8597/8597/8597 8598/8598/8598 8599/8599/8599 -f 8597/8597/8597 8599/8599/8599 8600/8600/8600 -v 5143.38 16266 -243.113 -vt 0.869908 0.764633 -v 9388.38 16266 -243.113 -vt 0.869908 0.730833 -v 9388.38 16431 -243.113 -vt 0.868246 0.730833 -v 5143.38 16431 -243.113 -vt 0.868246 0.764633 -o mesh1722 -s off -f 8601/8601/8601 8602/8602/8602 8603/8603/8603 -f 8601/8601/8601 8603/8603/8603 8604/8604/8604 -g charts -o chart0000 -s off -f 8601/8601/8601 8602/8602/8602 8603/8603/8603 -f 8601/8601/8601 8603/8603/8603 8604/8604/8604 -v 5143.38 16266 2912.51 -vt 0.00290939 0.439819 -v 5143.38 16266 -243.113 -vt 0.027847 0.439819 -v 5143.38 16431 -243.113 -vt 0.027847 0.441467 -v 5143.38 16431 2912.51 -vt 0.00290939 0.441467 -o mesh1723 -s off -f 8605/8605/8605 8606/8606/8606 8607/8607/8607 -f 8605/8605/8605 8607/8607/8607 8608/8608/8608 -g charts -o chart0000 -s off -f 8605/8605/8605 8606/8606/8606 8607/8607/8607 -f 8605/8605/8605 8607/8607/8607 8608/8608/8608 -v 5105.88 16266 -285.3 -vt 0.160017 0.664056 -v 5105.88 16266 2954.7 -vt 0.160017 0.6385 -v 5105.88 16431 2954.7 -vt 0.158354 0.6385 -v 5105.88 16431 -285.3 -vt 0.158354 0.664056 -o mesh1724 -s off -f 8609/8609/8609 8610/8610/8610 8611/8611/8611 -f 8609/8609/8609 8611/8611/8611 8612/8612/8612 -g charts -o chart0000 -s off -f 8609/8609/8609 8610/8610/8610 8611/8611/8611 -f 8609/8609/8609 8611/8611/8611 8612/8612/8612 -v 5105.88 16431 2954.7 -vt 0.883209 0.71352 -v 5143.38 16431 2912.51 -vt 0.882377 0.713187 -v 5105.88 16431 -285.3 -vt 0.883209 0.687964 -v 5143.38 16431 -243.113 -vt 0.882377 0.688296 -o mesh1725 -s off -f 8613/8613/8613 8614/8614/8614 8615/8615/8615 -f 8616/8616/8616 8615/8615/8615 8614/8614/8614 -g charts -o chart0000 -s off -f 8613/8613/8613 8614/8614/8614 8615/8615/8615 -f 8616/8616/8616 8615/8615/8615 8614/8614/8614 -v 5143.38 16431 2912.51 -vt 0.997091 0.462371 -v 5105.88 16431 2954.7 -vt 0.997922 0.462077 -v 9425.88 16431 2954.7 -vt 0.997922 0.495878 -o mesh1726 -s off -f 8617/8617/8617 8618/8618/8618 8619/8619/8619 -g charts -o chart0000 -s off -f 8617/8617/8617 8618/8618/8618 8619/8619/8619 -v 5143.38 16431 2912.51 -vt 0.73857 0.475268 -v 9425.88 16431 2954.7 -vt 0.772652 0.475268 -v 9388.38 16431 2912.51 -vt 0.77235 0.474444 -o mesh1727 -s off -f 8620/8620/8620 8621/8621/8621 8622/8622/8622 -g charts -o chart0000 -s off -f 8620/8620/8620 8621/8621/8621 8622/8622/8622 -v 9388.38 16431 2912.51 -vt 0.926434 0.201907 -v 9425.88 16431 2954.7 -vt 0.927265 0.201566 -v 9388.38 16431 -243.113 -vt 0.927265 0.227123 -o mesh1728 -s off -f 8623/8623/8623 8624/8624/8624 8625/8625/8625 -g charts -o chart0000 -s off -f 8623/8623/8623 8624/8624/8624 8625/8625/8625 -v 5105.88 16431 -285.3 -vt 0.186617 0.833058 -v 5143.38 16431 -243.113 -vt 0.186321 0.832234 -v 9425.88 16431 -285.3 -vt 0.152535 0.833058 -o mesh1729 -s off -f 8626/8626/8626 8627/8627/8627 8628/8628/8628 -g charts -o chart0000 -s off -f 8626/8626/8626 8627/8627/8627 8628/8628/8628 -v 9425.88 16431 -285.3 -vt 0.703658 0.313685 -v 5143.38 16431 -243.113 -vt 0.737739 0.313685 -v 9388.38 16431 -243.113 -vt 0.703959 0.312861 -o mesh1730 -s off -f 8629/8629/8629 8630/8630/8630 8631/8631/8631 -g charts -o chart0000 -s off -f 8629/8629/8629 8630/8630/8630 8631/8631/8631 -v 9425.88 16431 -285.3 -vt 0.90399 0.627782 -v 9388.38 16431 -243.113 -vt 0.903654 0.626958 -v 9425.88 16431 2954.7 -vt 0.878221 0.627782 -o mesh1731 -s off -f 8632/8632/8632 8633/8633/8633 8634/8634/8634 -g charts -o chart0000 -s off -f 8632/8632/8632 8633/8633/8633 8634/8634/8634 -v 6264.63 16371 2197.43 -vt 0.385139 0.768922 -v 6264.63 16371 2226.97 -vt 0.385139 0.769153 -v 7145.88 16371 2197.43 -vt 0.377953 0.768922 -v 6264.63 16371 2777.51 -vt 0.385139 0.773468 -v 6692.13 16371 2226.97 -vt 0.381653 0.769153 -v 6718.38 16371 2226.97 -vt 0.381439 0.769153 -v 6718.38 16371 2777.51 -vt 0.381439 0.773468 -v 7145.88 16371 2226.97 -vt 0.377953 0.769153 -v 7145.88 16371 -40.6129 -vt 0.377953 0.751381 -v 7145.88 16371 2777.51 -vt 0.377953 0.773468 -v 6144.63 16371 2912.51 -vt 0.386118 0.774526 -v 6144.63 16371 -243.113 -vt 0.386118 0.749794 -v 7265.88 16371 2912.51 -vt 0.376974 0.774526 -v 6692.13 16371 2777.51 -vt 0.381653 0.773468 -v 7265.88 16371 -243.113 -vt 0.376974 0.749794 -v 6264.63 16371 -40.6129 -vt 0.385139 0.751381 -o mesh1732 -s off -f 8635/8635/8635 8636/8636/8636 8637/8637/8637 -f 8636/8636/8636 8635/8635/8635 8638/8638/8638 -f 8637/8637/8637 8636/8636/8636 8639/8639/8639 -f 8637/8637/8637 8639/8639/8639 8640/8640/8640 -f 8640/8640/8640 8639/8639/8639 8641/8641/8641 -f 8637/8637/8637 8640/8640/8640 8642/8642/8642 -f 8637/8637/8637 8642/8642/8642 8643/8643/8643 -f 8643/8643/8643 8642/8642/8642 8644/8644/8644 -f 8645/8645/8645 8638/8638/8638 8646/8646/8646 -f 8638/8638/8638 8645/8645/8645 8647/8647/8647 -f 8646/8646/8646 8638/8638/8638 8635/8635/8635 -f 8638/8638/8638 8647/8647/8647 8648/8648/8648 -f 8648/8648/8648 8647/8647/8647 8641/8641/8641 -f 8648/8648/8648 8641/8641/8641 8639/8639/8639 -f 8641/8641/8641 8647/8647/8647 8644/8644/8644 -f 8644/8644/8644 8647/8647/8647 8649/8649/8649 -f 8646/8646/8646 8650/8650/8650 8649/8649/8649 -f 8650/8650/8650 8646/8646/8646 8635/8635/8635 -f 8649/8649/8649 8650/8650/8650 8643/8643/8643 -f 8649/8649/8649 8643/8643/8643 8644/8644/8644 -g charts -o chart0000 -s off -f 8635/8635/8635 8636/8636/8636 8637/8637/8637 -f 8636/8636/8636 8635/8635/8635 8638/8638/8638 -f 8637/8637/8637 8636/8636/8636 8639/8639/8639 -f 8637/8637/8637 8639/8639/8639 8640/8640/8640 -f 8640/8640/8640 8639/8639/8639 8641/8641/8641 -f 8637/8637/8637 8640/8640/8640 8642/8642/8642 -f 8637/8637/8637 8642/8642/8642 8643/8643/8643 -f 8643/8643/8643 8642/8642/8642 8644/8644/8644 -f 8645/8645/8645 8638/8638/8638 8646/8646/8646 -f 8638/8638/8638 8645/8645/8645 8647/8647/8647 -f 8646/8646/8646 8638/8638/8638 8635/8635/8635 -f 8638/8638/8638 8647/8647/8647 8648/8648/8648 -f 8648/8648/8648 8647/8647/8647 8641/8641/8641 -f 8648/8648/8648 8641/8641/8641 8639/8639/8639 -f 8641/8641/8641 8647/8647/8647 8644/8644/8644 -f 8644/8644/8644 8647/8647/8647 8649/8649/8649 -f 8646/8646/8646 8650/8650/8650 8649/8649/8649 -f 8650/8650/8650 8646/8646/8646 8635/8635/8635 -f 8649/8649/8649 8650/8650/8650 8643/8643/8643 -f 8649/8649/8649 8643/8643/8643 8644/8644/8644 -v 6144.63 16318.5 2912.51 -vt 0.031172 0.913025 -v 7265.88 16318.5 2912.51 -vt 0.0220283 0.913025 -v 7265.88 16371 2912.51 -vt 0.0220283 0.912201 -v 6144.63 16371 2912.51 -vt 0.031172 0.912201 -o mesh1733 -s off -f 8651/8651/8651 8652/8652/8652 8653/8653/8653 -f 8651/8651/8651 8653/8653/8653 8654/8654/8654 -g charts -o chart0000 -s off -f 8651/8651/8651 8652/8652/8652 8653/8653/8653 -f 8651/8651/8651 8653/8653/8653 8654/8654/8654 -v 7265.88 16318.5 -243.113 -vt 0.805902 0.752267 -v 6144.63 16318.5 -243.113 -vt 0.805902 0.761335 -v 6144.63 16371 -243.113 -vt 0.806733 0.761335 -v 7265.88 16371 -243.113 -vt 0.806733 0.752267 -o mesh1734 -s off -f 8655/8655/8655 8656/8656/8656 8657/8657/8657 -f 8655/8655/8655 8657/8657/8657 8658/8658/8658 -g charts -o chart0000 -s off -f 8655/8655/8655 8656/8656/8656 8657/8657/8657 -f 8655/8655/8655 8657/8657/8657 8658/8658/8658 -v 7265.88 16318.5 2912.51 -vt 0.101829 0.997939 -v 7265.88 16318.5 -243.113 -vt 0.126766 0.997939 -v 7265.88 16371 -243.113 -vt 0.126766 0.998763 -v 7265.88 16371 2912.51 -vt 0.101829 0.998763 -o mesh1735 -s off -f 8659/8659/8659 8660/8660/8660 8661/8661/8661 -f 8659/8659/8659 8661/8661/8661 8662/8662/8662 -g charts -o chart0000 -s off -f 8659/8659/8659 8660/8660/8660 8661/8661/8661 -f 8659/8659/8659 8661/8661/8661 8662/8662/8662 -v 6264.63 16318.5 -40.6129 -vt 0.066916 0.377988 -v 7145.88 16318.5 -40.6129 -vt 0.0594347 0.377988 -v 7145.88 16371 -40.6129 -vt 0.0594347 0.377164 -v 6264.63 16371 -40.6129 -vt 0.066916 0.377164 -o mesh1736 -s off -f 8663/8663/8663 8664/8664/8664 8665/8665/8665 -f 8663/8663/8663 8665/8665/8665 8666/8666/8666 -g charts -o chart0000 -s off -f 8663/8663/8663 8664/8664/8664 8665/8665/8665 -f 8663/8663/8663 8665/8665/8665 8666/8666/8666 -v 6264.63 16318.5 2777.51 -vt 0.816708 0.06554 -v 6264.63 16318.5 -40.6129 -vt 0.816708 0.0886232 -v 6264.63 16371 -40.6129 -vt 0.815877 0.0886232 -v 6264.63 16371 2197.43 -vt 0.815877 0.0702913 -v 6264.63 16356 2197.43 -vt 0.816114 0.0702913 -v 6264.63 16356 2226.97 -vt 0.816114 0.0700495 -v 6264.63 16318.5 2777.51 -vt 0.371155 0.935284 -v 6264.63 16356 2226.97 -vt 0.366168 0.934695 -v 6264.63 16371 2226.97 -vt 0.366168 0.93446 -v 6264.63 16371 2777.51 -vt 0.371155 0.93446 -o mesh1737 -s off -f 8667/8667/8667 8668/8668/8668 8669/8669/8669 -f 8667/8667/8667 8669/8669/8669 8670/8670/8670 -f 8667/8667/8667 8670/8670/8670 8671/8671/8671 -f 8667/8667/8667 8671/8671/8671 8672/8672/8672 -f 8673/8673/8673 8674/8674/8674 8675/8675/8675 -f 8673/8673/8673 8675/8675/8675 8676/8676/8676 -g charts -o chart0000 -s off -f 8667/8667/8667 8668/8668/8668 8669/8669/8669 -f 8667/8667/8667 8669/8669/8669 8670/8670/8670 -f 8667/8667/8667 8670/8670/8670 8671/8671/8671 -f 8667/8667/8667 8671/8671/8671 8672/8672/8672 -o chart0001 -s off -f 8673/8673/8673 8674/8674/8674 8675/8675/8675 -f 8673/8673/8673 8675/8675/8675 8676/8676/8676 -v 7145.88 16318.5 2777.51 -vt 0.992934 0.788541 -v 6264.63 16318.5 2777.51 -vt 0.992934 0.796785 -v 6264.63 16371 2777.51 -vt 0.993765 0.796785 -v 6692.13 16371 2777.51 -vt 0.993765 0.792786 -v 6692.13 16356 2777.51 -vt 0.993528 0.792786 -v 6718.38 16356 2777.51 -vt 0.993528 0.79254 -v 7145.88 16318.5 2777.51 -vt 0.554863 0.847073 -v 6718.38 16356 2777.51 -vt 0.559019 0.847662 -v 6718.38 16371 2777.51 -vt 0.559019 0.847898 -v 7145.88 16371 2777.51 -vt 0.554863 0.847898 -o mesh1738 -s off -f 8677/8677/8677 8678/8678/8678 8679/8679/8679 -f 8677/8677/8677 8679/8679/8679 8680/8680/8680 -f 8677/8677/8677 8680/8680/8680 8681/8681/8681 -f 8677/8677/8677 8681/8681/8681 8682/8682/8682 -f 8683/8683/8683 8684/8684/8684 8685/8685/8685 -f 8683/8683/8683 8685/8685/8685 8686/8686/8686 -g charts -o chart0000 -s off -f 8677/8677/8677 8678/8678/8678 8679/8679/8679 -f 8677/8677/8677 8679/8679/8679 8680/8680/8680 -f 8677/8677/8677 8680/8680/8680 8681/8681/8681 -f 8677/8677/8677 8681/8681/8681 8682/8682/8682 -o chart0001 -s off -f 8683/8683/8683 8684/8684/8684 8685/8685/8685 -f 8683/8683/8683 8685/8685/8685 8686/8686/8686 -v 6144.63 16318.5 -243.113 -vt 0.450956 0.980626 -v 6264.63 16318.5 -40.6129 -vt 0.449356 0.979656 -v 6264.63 16318.5 2777.51 -vt 0.427085 0.979656 -v 7265.88 16318.5 -243.113 -vt 0.450956 0.971558 -v 7145.88 16318.5 -40.6129 -vt 0.449356 0.972529 -v 7145.88 16318.5 2777.51 -vt 0.427085 0.972529 -v 6144.63 16318.5 2912.51 -vt 0.426018 0.980626 -v 7265.88 16318.5 2912.51 -vt 0.426018 0.971558 -o mesh1739 -s off -f 8687/8687/8687 8688/8688/8688 8689/8689/8689 -f 8688/8688/8688 8687/8687/8687 8690/8690/8690 -f 8688/8688/8688 8690/8690/8690 8691/8691/8691 -f 8691/8691/8691 8690/8690/8690 8692/8692/8692 -f 8693/8693/8693 8689/8689/8689 8694/8694/8694 -f 8689/8689/8689 8693/8693/8693 8687/8687/8687 -f 8694/8694/8694 8689/8689/8689 8692/8692/8692 -f 8694/8694/8694 8692/8692/8692 8690/8690/8690 -g charts -o chart0000 -s off -f 8687/8687/8687 8688/8688/8688 8689/8689/8689 -f 8688/8688/8688 8687/8687/8687 8690/8690/8690 -f 8688/8688/8688 8690/8690/8690 8691/8691/8691 -f 8691/8691/8691 8690/8690/8690 8692/8692/8692 -f 8693/8693/8693 8689/8689/8689 8694/8694/8694 -f 8689/8689/8689 8693/8693/8693 8687/8687/8687 -f 8694/8694/8694 8689/8689/8689 8692/8692/8692 -f 8694/8694/8694 8692/8692/8692 8690/8690/8690 -v 6144.63 16318.5 -243.113 -vt 0.992934 0.83141 -v 6144.63 16318.5 2912.51 -vt 0.992934 0.806678 -v 6144.63 16371 2912.51 -vt 0.992103 0.806678 -v 6144.63 16371 -243.113 -vt 0.992103 0.83141 -o mesh1740 -s off -f 8695/8695/8695 8696/8696/8696 8697/8697/8697 -f 8695/8695/8695 8697/8697/8697 8698/8698/8698 -g charts -o chart0000 -s off -f 8695/8695/8695 8696/8696/8696 8697/8697/8697 -f 8695/8695/8695 8697/8697/8697 8698/8698/8698 -v 7145.88 16371 2197.43 -vt 0.401448 0.504122 -v 7145.88 16371 -40.6129 -vt 0.383624 0.504122 -v 7145.88 16318.5 -40.6129 -vt 0.383624 0.504946 -v 7145.88 16318.5 2777.51 -vt 0.406068 0.504946 -v 7145.88 16371 2777.51 -vt 0.406068 0.504122 -v 7145.88 16371 2226.97 -vt 0.401684 0.504122 -v 7145.88 16371 2197.43 -vt 0.497506 0.926216 -v 7145.88 16371 2226.97 -vt 0.497506 0.92704 -v 7145.88 16356 2226.97 -vt 0.498337 0.92704 -v 7145.88 16356 2197.43 -vt 0.498337 0.926216 -o mesh1741 -s off -f 8699/8699/8699 8700/8700/8700 8701/8701/8701 -f 8699/8699/8699 8701/8701/8701 8702/8702/8702 -f 8699/8699/8699 8702/8702/8702 8703/8703/8703 -f 8699/8699/8699 8703/8703/8703 8704/8704/8704 -f 8705/8705/8705 8706/8706/8706 8707/8707/8707 -f 8705/8705/8705 8707/8707/8707 8708/8708/8708 -g charts -o chart0000 -s off -f 8699/8699/8699 8700/8700/8700 8701/8701/8701 -f 8699/8699/8699 8701/8701/8701 8702/8702/8702 -f 8699/8699/8699 8702/8702/8702 8703/8703/8703 -f 8699/8699/8699 8703/8703/8703 8704/8704/8704 -o chart0001 -s off -f 8705/8705/8705 8706/8706/8706 8707/8707/8707 -f 8705/8705/8705 8707/8707/8707 8708/8708/8708 -v 6692.13 16371 2226.97 -vt 0.63217 0.786068 -v 6264.63 16371 2226.97 -vt 0.63217 0.79019 -v 6264.63 16356 2226.97 -vt 0.633001 0.79019 -v 6692.13 16356 2226.97 -vt 0.633001 0.786068 -o mesh1742 -s off -f 8709/8709/8709 8710/8710/8710 8711/8711/8711 -f 8709/8709/8709 8711/8711/8711 8712/8712/8712 -g charts -o chart0000 -s off -f 8709/8709/8709 8710/8710/8710 8711/8711/8711 -f 8709/8709/8709 8711/8711/8711 8712/8712/8712 -v 7145.88 16356 2197.43 -vt 0.140898 0.966612 -v 7145.88 16356 2226.97 -vt 0.140878 0.965787 -v 6718.38 16356 2226.97 -vt 0.136741 0.966612 -v 7145.88 16356 2197.43 -vt 0.967997 0.431575 -v 6718.38 16356 2226.97 -vt 0.964672 0.433796 -v 6718.38 16356 2777.51 -vt 0.967997 0.437345 -v 7145.88 16356 2197.43 -vt 0.583125 0.785243 -v 6718.38 16356 2777.51 -vt 0.579496 0.780297 -v 6692.13 16356 2777.51 -vt 0.579273 0.780297 -v 6692.13 16356 2226.97 -vt 0.579273 0.784991 -v 6264.63 16356 2226.97 -vt 0.575644 0.784991 -v 6264.63 16356 2197.43 -vt 0.575644 0.785243 -o mesh1743 -s off -f 8713/8713/8713 8714/8714/8714 8715/8715/8715 -f 8716/8716/8716 8717/8717/8717 8718/8718/8718 -f 8719/8719/8719 8720/8720/8720 8721/8721/8721 -f 8719/8719/8719 8721/8721/8721 8722/8722/8722 -f 8719/8719/8719 8722/8722/8722 8723/8723/8723 -f 8719/8719/8719 8723/8723/8723 8724/8724/8724 -g charts -o chart0000 -s off -f 8713/8713/8713 8714/8714/8714 8715/8715/8715 -o chart0001 -s off -f 8716/8716/8716 8717/8717/8717 8718/8718/8718 -o chart0002 -s off -f 8719/8719/8719 8720/8720/8720 8721/8721/8721 -f 8719/8719/8719 8721/8721/8721 8722/8722/8722 -f 8719/8719/8719 8722/8722/8722 8723/8723/8723 -f 8719/8719/8719 8723/8723/8723 8724/8724/8724 -v 7145.88 16371 2197.43 -vt 0.524106 0.535449 -v 7145.88 16356 2197.43 -vt 0.524106 0.534625 -v 6264.63 16356 2197.43 -vt 0.516625 0.534625 -v 6264.63 16371 2197.43 -vt 0.516625 0.535449 -o mesh1744 -s off -f 8725/8725/8725 8726/8726/8726 8727/8727/8727 -f 8725/8725/8725 8727/8727/8727 8728/8728/8728 -g charts -o chart0000 -s off -f 8725/8725/8725 8726/8726/8726 8727/8727/8727 -f 8725/8725/8725 8727/8727/8727 8728/8728/8728 -v 6718.38 16356 2226.97 -vt 0.243973 0.944353 -v 7145.88 16356 2226.97 -vt 0.239817 0.944353 -v 7145.88 16371 2226.97 -vt 0.239817 0.943528 -v 6718.38 16371 2226.97 -vt 0.243973 0.943528 -o mesh1745 -s off -f 8729/8729/8729 8730/8730/8730 8731/8731/8731 -f 8729/8729/8729 8731/8731/8731 8732/8732/8732 -g charts -o chart0000 -s off -f 8729/8729/8729 8730/8730/8730 8731/8731/8731 -f 8729/8729/8729 8731/8731/8731 8732/8732/8732 -v 6718.38 16356 2226.97 -vt 0.0968412 0.394476 -v 6718.38 16371 2226.97 -vt 0.0976724 0.394476 -v 6718.38 16371 2777.51 -vt 0.0976724 0.38953 -v 6718.38 16356 2777.51 -vt 0.0968412 0.38953 -o mesh1746 -s off -f 8733/8733/8733 8734/8734/8734 8735/8735/8735 -f 8733/8733/8733 8735/8735/8735 8736/8736/8736 -g charts -o chart0000 -s off -f 8733/8733/8733 8734/8734/8734 8735/8735/8735 -f 8733/8733/8733 8735/8735/8735 8736/8736/8736 -v 6692.13 16371 2226.97 -vt 0.199917 0.858615 -v 6692.13 16356 2226.97 -vt 0.200748 0.858615 -v 6692.13 16356 2777.51 -vt 0.200748 0.853669 -v 6692.13 16371 2777.51 -vt 0.199917 0.853669 -o mesh1747 -s off -f 8737/8737/8737 8738/8738/8738 8739/8739/8739 -f 8737/8737/8737 8739/8739/8739 8740/8740/8740 -g charts -o chart0000 -s off -f 8737/8737/8737 8738/8738/8738 8739/8739/8739 -f 8737/8737/8737 8739/8739/8739 8740/8740/8740 -v 5263.38 16318.5 2197.43 -vt 0.32976 0.612797 -v 5263.38 16318.5 2226.97 -vt 0.329994 0.612797 -v 6144.63 16318.5 2197.43 -vt 0.32976 0.60567 -v 5263.38 16318.5 2777.51 -vt 0.334344 0.612797 -v 5690.88 16318.5 2226.97 -vt 0.329994 0.609339 -v 5717.13 16318.5 2226.97 -vt 0.329994 0.609127 -v 5717.13 16318.5 2777.51 -vt 0.334344 0.609127 -v 6144.63 16318.5 2226.97 -vt 0.329994 0.60567 -v 6144.63 16318.5 -40.6129 -vt 0.312074 0.60567 -v 6144.63 16318.5 2777.51 -vt 0.334344 0.60567 -v 5143.38 16318.5 2912.51 -vt 0.335411 0.613767 -v 5143.38 16318.5 -243.113 -vt 0.310474 0.613767 -v 6264.63 16318.5 2912.51 -vt 0.335411 0.604699 -v 5690.88 16318.5 2777.51 -vt 0.334344 0.609339 -v 6264.63 16318.5 -243.113 -vt 0.310474 0.604699 -v 5263.38 16318.5 -40.6129 -vt 0.312074 0.612797 -o mesh1748 -s off -f 8741/8741/8741 8742/8742/8742 8743/8743/8743 -f 8742/8742/8742 8741/8741/8741 8744/8744/8744 -f 8743/8743/8743 8742/8742/8742 8745/8745/8745 -f 8743/8743/8743 8745/8745/8745 8746/8746/8746 -f 8746/8746/8746 8745/8745/8745 8747/8747/8747 -f 8743/8743/8743 8746/8746/8746 8748/8748/8748 -f 8743/8743/8743 8748/8748/8748 8749/8749/8749 -f 8749/8749/8749 8748/8748/8748 8750/8750/8750 -f 8751/8751/8751 8744/8744/8744 8752/8752/8752 -f 8744/8744/8744 8751/8751/8751 8753/8753/8753 -f 8752/8752/8752 8744/8744/8744 8741/8741/8741 -f 8744/8744/8744 8753/8753/8753 8754/8754/8754 -f 8754/8754/8754 8753/8753/8753 8747/8747/8747 -f 8754/8754/8754 8747/8747/8747 8745/8745/8745 -f 8747/8747/8747 8753/8753/8753 8750/8750/8750 -f 8750/8750/8750 8753/8753/8753 8755/8755/8755 -f 8752/8752/8752 8756/8756/8756 8755/8755/8755 -f 8756/8756/8756 8752/8752/8752 8741/8741/8741 -f 8755/8755/8755 8756/8756/8756 8749/8749/8749 -f 8755/8755/8755 8749/8749/8749 8750/8750/8750 -g charts -o chart0000 -s off -f 8741/8741/8741 8742/8742/8742 8743/8743/8743 -f 8742/8742/8742 8741/8741/8741 8744/8744/8744 -f 8743/8743/8743 8742/8742/8742 8745/8745/8745 -f 8743/8743/8743 8745/8745/8745 8746/8746/8746 -f 8746/8746/8746 8745/8745/8745 8747/8747/8747 -f 8743/8743/8743 8746/8746/8746 8748/8748/8748 -f 8743/8743/8743 8748/8748/8748 8749/8749/8749 -f 8749/8749/8749 8748/8748/8748 8750/8750/8750 -f 8751/8751/8751 8744/8744/8744 8752/8752/8752 -f 8744/8744/8744 8751/8751/8751 8753/8753/8753 -f 8752/8752/8752 8744/8744/8744 8741/8741/8741 -f 8744/8744/8744 8753/8753/8753 8754/8754/8754 -f 8754/8754/8754 8753/8753/8753 8747/8747/8747 -f 8754/8754/8754 8747/8747/8747 8745/8745/8745 -f 8747/8747/8747 8753/8753/8753 8750/8750/8750 -f 8750/8750/8750 8753/8753/8753 8755/8755/8755 -f 8752/8752/8752 8756/8756/8756 8755/8755/8755 -f 8756/8756/8756 8752/8752/8752 8741/8741/8741 -f 8755/8755/8755 8756/8756/8756 8749/8749/8749 -f 8755/8755/8755 8749/8749/8749 8750/8750/8750 -v 5143.38 16266 2912.51 -vt 0.467581 0.682193 -v 6264.63 16266 2912.51 -vt 0.467581 0.673124 -v 6264.63 16318.5 2912.51 -vt 0.46675 0.673124 -v 5143.38 16318.5 2912.51 -vt 0.46675 0.682193 -o mesh1749 -s off -f 8757/8757/8757 8758/8758/8758 8759/8759/8759 -f 8757/8757/8757 8759/8759/8759 8760/8760/8760 -g charts -o chart0000 -s off -f 8757/8757/8757 8758/8758/8758 8759/8759/8759 -f 8757/8757/8757 8759/8759/8759 8760/8760/8760 -v 6264.63 16266 -243.113 -vt 0.802577 0.800907 -v 5143.38 16266 -243.113 -vt 0.811721 0.800907 -v 5143.38 16318.5 -243.113 -vt 0.811721 0.801731 -v 6264.63 16318.5 -243.113 -vt 0.802577 0.801731 -o mesh1750 -s off -f 8761/8761/8761 8762/8762/8762 8763/8763/8763 -f 8761/8761/8761 8763/8763/8763 8764/8764/8764 -g charts -o chart0000 -s off -f 8761/8761/8761 8762/8762/8762 8763/8763/8763 -f 8761/8761/8761 8763/8763/8763 8764/8764/8764 -v 6264.63 16266 2912.51 -vt 0.105154 0.368096 -v 6264.63 16266 -243.113 -vt 0.105154 0.392828 -v 6264.63 16318.5 -243.113 -vt 0.105985 0.392828 -v 6264.63 16318.5 2912.51 -vt 0.105985 0.368096 -o mesh1751 -s off -f 8765/8765/8765 8766/8766/8766 8767/8767/8767 -f 8765/8765/8765 8767/8767/8767 8768/8768/8768 -g charts -o chart0000 -s off -f 8765/8765/8765 8766/8766/8766 8767/8767/8767 -f 8765/8765/8765 8767/8767/8767 8768/8768/8768 -v 5263.38 16266 -40.6129 -vt 0.915627 0.522259 -v 6144.63 16266 -40.6129 -vt 0.908146 0.522259 -v 6144.63 16318.5 -40.6129 -vt 0.908146 0.521434 -v 5263.38 16318.5 -40.6129 -vt 0.915627 0.521434 -o mesh1752 -s off -f 8769/8769/8769 8770/8770/8770 8771/8771/8771 -f 8769/8769/8769 8771/8771/8771 8772/8772/8772 -g charts -o chart0000 -s off -f 8769/8769/8769 8770/8770/8770 8771/8771/8771 -f 8769/8769/8769 8771/8771/8771 8772/8772/8772 -v 5263.38 16266 2777.51 -vt 0.385287 0.836356 -v 5263.38 16266 -40.6129 -vt 0.408562 0.836356 -v 5263.38 16318.5 -40.6129 -vt 0.408562 0.835532 -v 5263.38 16318.5 2197.43 -vt 0.390078 0.835532 -v 5263.38 16303.5 2197.43 -vt 0.390078 0.835767 -v 5263.38 16303.5 2226.97 -vt 0.389834 0.835767 -v 5263.38 16266 2777.51 -vt 0.993765 0.157049 -v 5263.38 16303.5 2226.97 -vt 0.988778 0.15646 -v 5263.38 16318.5 2226.97 -vt 0.988778 0.156224 -v 5263.38 16318.5 2777.51 -vt 0.993765 0.156224 -o mesh1753 -s off -f 8773/8773/8773 8774/8774/8774 8775/8775/8775 -f 8773/8773/8773 8775/8775/8775 8776/8776/8776 -f 8773/8773/8773 8776/8776/8776 8777/8777/8777 -f 8773/8773/8773 8777/8777/8777 8778/8778/8778 -f 8779/8779/8779 8780/8780/8780 8781/8781/8781 -f 8779/8779/8779 8781/8781/8781 8782/8782/8782 -g charts -o chart0000 -s off -f 8773/8773/8773 8774/8774/8774 8775/8775/8775 -f 8773/8773/8773 8775/8775/8775 8776/8776/8776 -f 8773/8773/8773 8776/8776/8776 8777/8777/8777 -f 8773/8773/8773 8777/8777/8777 8778/8778/8778 -o chart0001 -s off -f 8779/8779/8779 8780/8780/8780 8781/8781/8781 -f 8779/8779/8779 8781/8781/8781 8782/8782/8782 -v 6144.63 16266 2777.51 -vt 0.805902 0.542045 -v 5263.38 16266 2777.51 -vt 0.805902 0.550288 -v 5263.38 16318.5 2777.51 -vt 0.806733 0.550288 -v 5690.88 16318.5 2777.51 -vt 0.806733 0.546289 -v 5690.88 16303.5 2777.51 -vt 0.806496 0.546289 -v 5717.13 16303.5 2777.51 -vt 0.806496 0.546044 -v 6144.63 16266 2777.51 -vt 0.0785536 0.923743 -v 5717.13 16303.5 2777.51 -vt 0.0791473 0.927865 -v 5717.13 16318.5 2777.51 -vt 0.0793848 0.927865 -v 6144.63 16318.5 2777.51 -vt 0.0793848 0.923743 -o mesh1754 -s off -f 8783/8783/8783 8784/8784/8784 8785/8785/8785 -f 8783/8783/8783 8785/8785/8785 8786/8786/8786 -f 8783/8783/8783 8786/8786/8786 8787/8787/8787 -f 8783/8783/8783 8787/8787/8787 8788/8788/8788 -f 8789/8789/8789 8790/8790/8790 8791/8791/8791 -f 8789/8789/8789 8791/8791/8791 8792/8792/8792 -g charts -o chart0000 -s off -f 8783/8783/8783 8784/8784/8784 8785/8785/8785 -f 8783/8783/8783 8785/8785/8785 8786/8786/8786 -f 8783/8783/8783 8786/8786/8786 8787/8787/8787 -f 8783/8783/8783 8787/8787/8787 8788/8788/8788 -o chart0001 -s off -f 8789/8789/8789 8790/8790/8790 8791/8791/8791 -f 8789/8789/8789 8791/8791/8791 8792/8792/8792 -v 5143.38 16266 -243.113 -vt 0.639651 0.424979 -v 5263.38 16266 -40.6129 -vt 0.63805 0.424009 -v 5263.38 16266 2777.51 -vt 0.61578 0.424009 -v 6264.63 16266 -243.113 -vt 0.639651 0.415911 -v 6144.63 16266 -40.6129 -vt 0.63805 0.416882 -v 6144.63 16266 2777.51 -vt 0.61578 0.416882 -v 5143.38 16266 2912.51 -vt 0.614713 0.424979 -v 6264.63 16266 2912.51 -vt 0.614713 0.415911 -o mesh1755 -s off -f 8793/8793/8793 8794/8794/8794 8795/8795/8795 -f 8794/8794/8794 8793/8793/8793 8796/8796/8796 -f 8794/8794/8794 8796/8796/8796 8797/8797/8797 -f 8797/8797/8797 8796/8796/8796 8798/8798/8798 -f 8799/8799/8799 8795/8795/8795 8800/8800/8800 -f 8795/8795/8795 8799/8799/8799 8793/8793/8793 -f 8800/8800/8800 8795/8795/8795 8798/8798/8798 -f 8800/8800/8800 8798/8798/8798 8796/8796/8796 -g charts -o chart0000 -s off -f 8793/8793/8793 8794/8794/8794 8795/8795/8795 -f 8794/8794/8794 8793/8793/8793 8796/8796/8796 -f 8794/8794/8794 8796/8796/8796 8797/8797/8797 -f 8797/8797/8797 8796/8796/8796 8798/8798/8798 -f 8799/8799/8799 8795/8795/8795 8800/8800/8800 -f 8795/8795/8795 8799/8799/8799 8793/8793/8793 -f 8800/8800/8800 8795/8795/8795 8798/8798/8798 -f 8800/8800/8800 8798/8798/8798 8796/8796/8796 -v 5143.38 16266 -243.113 -vt 0.997091 0.823166 -v 5143.38 16266 2912.51 -vt 0.997091 0.798434 -v 5143.38 16318.5 2912.51 -vt 0.996259 0.798434 -v 5143.38 16318.5 -243.113 -vt 0.996259 0.823166 -o mesh1756 -s off -f 8801/8801/8801 8802/8802/8802 8803/8803/8803 -f 8801/8801/8801 8803/8803/8803 8804/8804/8804 -g charts -o chart0000 -s off -f 8801/8801/8801 8802/8802/8802 8803/8803/8803 -f 8801/8801/8801 8803/8803/8803 8804/8804/8804 -v 6144.63 16318.5 2197.43 -vt 0.992103 0.765822 -v 6144.63 16318.5 -40.6129 -vt 0.992103 0.748145 -v 6144.63 16266 -40.6129 -vt 0.992934 0.748145 -v 6144.63 16266 2777.51 -vt 0.992934 0.770404 -v 6144.63 16318.5 2777.51 -vt 0.992103 0.770404 -v 6144.63 16318.5 2226.97 -vt 0.992103 0.766055 -v 6144.63 16318.5 2197.43 -vt 0.465087 0.490107 -v 6144.63 16318.5 2226.97 -vt 0.465918 0.490107 -v 6144.63 16303.5 2226.97 -vt 0.465918 0.490931 -v 6144.63 16303.5 2197.43 -vt 0.465087 0.490931 -o mesh1757 -s off -f 8805/8805/8805 8806/8806/8806 8807/8807/8807 -f 8805/8805/8805 8807/8807/8807 8808/8808/8808 -f 8805/8805/8805 8808/8808/8808 8809/8809/8809 -f 8805/8805/8805 8809/8809/8809 8810/8810/8810 -f 8811/8811/8811 8812/8812/8812 8813/8813/8813 -f 8811/8811/8811 8813/8813/8813 8814/8814/8814 -g charts -o chart0000 -s off -f 8805/8805/8805 8806/8806/8806 8807/8807/8807 -f 8805/8805/8805 8807/8807/8807 8808/8808/8808 -f 8805/8805/8805 8808/8808/8808 8809/8809/8809 -f 8805/8805/8805 8809/8809/8809 8810/8810/8810 -o chart0001 -s off -f 8811/8811/8811 8812/8812/8812 8813/8813/8813 -f 8811/8811/8811 8813/8813/8813 8814/8814/8814 -v 5690.88 16318.5 2226.97 -vt 0.780964 0.386232 -v 5263.38 16318.5 2226.97 -vt 0.780964 0.390354 -v 5263.38 16303.5 2226.97 -vt 0.781795 0.390354 -v 5690.88 16303.5 2226.97 -vt 0.781795 0.386232 -o mesh1758 -s off -f 8815/8815/8815 8816/8816/8816 8817/8817/8817 -f 8815/8815/8815 8817/8817/8817 8818/8818/8818 -g charts -o chart0000 -s off -f 8815/8815/8815 8816/8816/8816 8817/8817/8817 -f 8815/8815/8815 8817/8817/8817 8818/8818/8818 -v 6144.63 16303.5 2197.43 -vt 0.101829 0.51319 -v 6144.63 16303.5 2226.97 -vt 0.101829 0.514015 -v 5717.13 16303.5 2226.97 -vt 0.0976725 0.514015 -v 6144.63 16303.5 2197.43 -vt 0.434331 0.824814 -v 5717.13 16303.5 2226.97 -vt 0.436571 0.821517 -v 5717.13 16303.5 2777.51 -vt 0.44015 0.824814 -v 6144.63 16303.5 2197.43 -vt 0.596425 0.587387 -v 5717.13 16303.5 2777.51 -vt 0.591438 0.583787 -v 5690.88 16303.5 2777.51 -vt 0.591438 0.583566 -v 5690.88 16303.5 2226.97 -vt 0.596172 0.583566 -v 5263.38 16303.5 2226.97 -vt 0.596172 0.579967 -v 5263.38 16303.5 2197.43 -vt 0.596425 0.579967 -o mesh1759 -s off -f 8819/8819/8819 8820/8820/8820 8821/8821/8821 -f 8822/8822/8822 8823/8823/8823 8824/8824/8824 -f 8825/8825/8825 8826/8826/8826 8827/8827/8827 -f 8825/8825/8825 8827/8827/8827 8828/8828/8828 -f 8825/8825/8825 8828/8828/8828 8829/8829/8829 -f 8825/8825/8825 8829/8829/8829 8830/8830/8830 -g charts -o chart0000 -s off -f 8819/8819/8819 8820/8820/8820 8821/8821/8821 -o chart0001 -s off -f 8822/8822/8822 8823/8823/8823 8824/8824/8824 -o chart0002 -s off -f 8825/8825/8825 8826/8826/8826 8827/8827/8827 -f 8825/8825/8825 8827/8827/8827 8828/8828/8828 -f 8825/8825/8825 8828/8828/8828 8829/8829/8829 -f 8825/8825/8825 8829/8829/8829 8830/8830/8830 -v 6144.63 16318.5 2197.43 -vt 0.628013 0.58986 -v 6144.63 16303.5 2197.43 -vt 0.628013 0.589035 -v 5263.38 16303.5 2197.43 -vt 0.620532 0.589035 -v 5263.38 16318.5 2197.43 -vt 0.620532 0.58986 -o mesh1760 -s off -f 8831/8831/8831 8832/8832/8832 8833/8833/8833 -f 8831/8831/8831 8833/8833/8833 8834/8834/8834 -g charts -o chart0000 -s off -f 8831/8831/8831 8832/8832/8832 8833/8833/8833 -f 8831/8831/8831 8833/8833/8833 8834/8834/8834 -v 5717.13 16303.5 2226.97 -vt 0.5532 0.529678 -v 6144.63 16303.5 2226.97 -vt 0.549044 0.529678 -v 6144.63 16318.5 2226.97 -vt 0.549044 0.528854 -v 5717.13 16318.5 2226.97 -vt 0.5532 0.528854 -o mesh1761 -s off -f 8835/8835/8835 8836/8836/8836 8837/8837/8837 -f 8835/8835/8835 8837/8837/8837 8838/8838/8838 -g charts -o chart0000 -s off -f 8835/8835/8835 8836/8836/8836 8837/8837/8837 -f 8835/8835/8835 8837/8837/8837 8838/8838/8838 -v 5717.13 16303.5 2226.97 -vt 0.804239 0.337593 -v 5717.13 16318.5 2226.97 -vt 0.805071 0.337593 -v 5717.13 16318.5 2777.51 -vt 0.805071 0.332646 -v 5717.13 16303.5 2777.51 -vt 0.804239 0.332646 -o mesh1762 -s off -f 8839/8839/8839 8840/8840/8840 8841/8841/8841 -f 8839/8839/8839 8841/8841/8841 8842/8842/8842 -g charts -o chart0000 -s off -f 8839/8839/8839 8840/8840/8840 8841/8841/8841 -f 8839/8839/8839 8841/8841/8841 8842/8842/8842 -v 5690.88 16318.5 2226.97 -vt 0.567332 0.859439 -v 5690.88 16303.5 2226.97 -vt 0.567332 0.860264 -v 5690.88 16303.5 2777.51 -vt 0.562344 0.860264 -v 5690.88 16318.5 2777.51 -vt 0.562344 0.859439 -o mesh1763 -s off -f 8843/8843/8843 8844/8844/8844 8845/8845/8845 -f 8843/8843/8843 8845/8845/8845 8846/8846/8846 -g charts -o chart0000 -s off -f 8843/8843/8843 8844/8844/8844 8845/8845/8845 -f 8843/8843/8843 8845/8845/8845 8846/8846/8846 -v 7385.88 16371 2197.43 -vt 0.996943 0.517479 -v 8267.13 16371 2226.97 -vt 0.989757 0.51771 -v 8267.13 16371 2197.43 -vt 0.989757 0.517479 -v 8267.13 16371 2777.51 -vt 0.989757 0.522025 -v 7839.63 16371 2226.97 -vt 0.993243 0.51771 -v 7813.38 16371 2226.97 -vt 0.993457 0.51771 -v 7813.38 16371 2777.51 -vt 0.993457 0.522025 -v 7385.88 16371 2226.97 -vt 0.996943 0.51771 -v 7385.88 16371 -40.6129 -vt 0.996943 0.499938 -v 7385.88 16371 2777.51 -vt 0.996943 0.522025 -v 8387.13 16371 -243.113 -vt 0.988778 0.498351 -v 8387.13 16371 2912.51 -vt 0.988778 0.523083 -v 7265.88 16371 2912.51 -vt 0.997922 0.523083 -v 7839.63 16371 2777.51 -vt 0.993243 0.522025 -v 7265.88 16371 -243.113 -vt 0.997922 0.498351 -v 8267.13 16371 -40.6129 -vt 0.989757 0.499938 -o mesh1764 -s off -f 8847/8847/8847 8848/8848/8848 8849/8849/8849 -f 8850/8850/8850 8849/8849/8849 8848/8848/8848 -f 8851/8851/8851 8848/8848/8848 8847/8847/8847 -f 8852/8852/8852 8851/8851/8851 8847/8847/8847 -f 8853/8853/8853 8851/8851/8851 8852/8852/8852 -f 8854/8854/8854 8852/8852/8852 8847/8847/8847 -f 8855/8855/8855 8854/8854/8854 8847/8847/8847 -f 8856/8856/8856 8854/8854/8854 8855/8855/8855 -f 8857/8857/8857 8850/8850/8850 8858/8858/8858 -f 8859/8859/8859 8858/8858/8858 8850/8850/8850 -f 8849/8849/8849 8850/8850/8850 8857/8857/8857 -f 8860/8860/8860 8859/8859/8859 8850/8850/8850 -f 8853/8853/8853 8859/8859/8859 8860/8860/8860 -f 8851/8851/8851 8853/8853/8853 8860/8860/8860 -f 8856/8856/8856 8859/8859/8859 8853/8853/8853 -f 8861/8861/8861 8859/8859/8859 8856/8856/8856 -f 8861/8861/8861 8862/8862/8862 8857/8857/8857 -f 8849/8849/8849 8857/8857/8857 8862/8862/8862 -f 8855/8855/8855 8862/8862/8862 8861/8861/8861 -f 8856/8856/8856 8855/8855/8855 8861/8861/8861 -g charts -o chart0000 -s off -f 8847/8847/8847 8848/8848/8848 8849/8849/8849 -f 8850/8850/8850 8849/8849/8849 8848/8848/8848 -f 8851/8851/8851 8848/8848/8848 8847/8847/8847 -f 8852/8852/8852 8851/8851/8851 8847/8847/8847 -f 8853/8853/8853 8851/8851/8851 8852/8852/8852 -f 8854/8854/8854 8852/8852/8852 8847/8847/8847 -f 8855/8855/8855 8854/8854/8854 8847/8847/8847 -f 8856/8856/8856 8854/8854/8854 8855/8855/8855 -f 8857/8857/8857 8850/8850/8850 8858/8858/8858 -f 8859/8859/8859 8858/8858/8858 8850/8850/8850 -f 8849/8849/8849 8850/8850/8850 8857/8857/8857 -f 8860/8860/8860 8859/8859/8859 8850/8850/8850 -f 8853/8853/8853 8859/8859/8859 8860/8860/8860 -f 8851/8851/8851 8853/8853/8853 8860/8860/8860 -f 8856/8856/8856 8859/8859/8859 8853/8853/8853 -f 8861/8861/8861 8859/8859/8859 8856/8856/8856 -f 8861/8861/8861 8862/8862/8862 8857/8857/8857 -f 8849/8849/8849 8857/8857/8857 8862/8862/8862 -f 8855/8855/8855 8862/8862/8862 8861/8861/8861 -f 8856/8856/8856 8855/8855/8855 8861/8861/8861 -v 8387.13 16371 2912.51 -vt 0.104323 0.899011 -v 7265.88 16371 2912.51 -vt 0.104323 0.908079 -v 7265.88 16318.5 2912.51 -vt 0.105154 0.908079 -v 8387.13 16318.5 2912.51 -vt 0.105154 0.899011 -o mesh1765 -s off -f 8863/8863/8863 8864/8864/8864 8865/8865/8865 -f 8863/8863/8863 8865/8865/8865 8866/8866/8866 -g charts -o chart0000 -s off -f 8863/8863/8863 8864/8864/8864 8865/8865/8865 -f 8863/8863/8863 8865/8865/8865 8866/8866/8866 -v 7265.88 16371 -243.113 -vt 0.445137 0.177659 -v 8387.13 16371 -243.113 -vt 0.445137 0.16859 -v 8387.13 16318.5 -243.113 -vt 0.444306 0.16859 -v 7265.88 16318.5 -243.113 -vt 0.444306 0.177659 -o mesh1766 -s off -f 8867/8867/8867 8868/8868/8868 8869/8869/8869 -f 8867/8867/8867 8869/8869/8869 8870/8870/8870 -g charts -o chart0000 -s off -f 8867/8867/8867 8868/8868/8868 8869/8869/8869 -f 8867/8867/8867 8869/8869/8869 8870/8870/8870 -v 7265.88 16371 2912.51 -vt 0.491687 0.611294 -v 7265.88 16371 -243.113 -vt 0.516625 0.611294 -v 7265.88 16318.5 -243.113 -vt 0.516625 0.612119 -v 7265.88 16318.5 2912.51 -vt 0.491687 0.612119 -o mesh1767 -s off -f 8871/8871/8871 8872/8872/8872 8873/8873/8873 -f 8871/8871/8871 8873/8873/8873 8874/8874/8874 -g charts -o chart0000 -s off -f 8871/8871/8871 8872/8872/8872 8873/8873/8873 -f 8871/8871/8871 8873/8873/8873 8874/8874/8874 -v 8267.13 16371 -40.6129 -vt 0.439318 0.45136 -v 7385.88 16371 -40.6129 -vt 0.439318 0.45878 -v 7385.88 16318.5 -40.6129 -vt 0.44015 0.45878 -v 8267.13 16318.5 -40.6129 -vt 0.44015 0.45136 -o mesh1768 -s off -f 8875/8875/8875 8876/8876/8876 8877/8877/8877 -f 8875/8875/8875 8877/8877/8877 8878/8878/8878 -g charts -o chart0000 -s off -f 8875/8875/8875 8876/8876/8876 8877/8877/8877 -f 8875/8875/8875 8877/8877/8877 8878/8878/8878 -v 8267.13 16371 2777.51 -vt 0.0344971 0.23784 -v 8267.13 16371 2226.97 -vt 0.0344971 0.242786 -v 8267.13 16356 2226.97 -vt 0.0353283 0.242786 -v 8267.13 16371 2777.51 -vt 0.484206 0.471146 -v 8267.13 16356 2226.97 -vt 0.485037 0.466797 -v 8267.13 16356 2197.43 -vt 0.485037 0.466564 -v 8267.13 16371 2197.43 -vt 0.484206 0.466564 -v 8267.13 16371 -40.6129 -vt 0.484206 0.448887 -v 8267.13 16371 2777.51 -vt 0.623857 0.304617 -v 8267.13 16371 -40.6129 -vt 0.646301 0.304617 -v 8267.13 16318.5 -40.6129 -vt 0.646301 0.305441 -v 8267.13 16318.5 2777.51 -vt 0.623857 0.305441 -o mesh1769 -s off -f 8879/8879/8879 8880/8880/8880 8881/8881/8881 -f 8882/8882/8882 8883/8883/8883 8884/8884/8884 -f 8882/8882/8882 8884/8884/8884 8885/8885/8885 -f 8882/8882/8882 8885/8885/8885 8886/8886/8886 -f 8887/8887/8887 8888/8888/8888 8889/8889/8889 -f 8887/8887/8887 8889/8889/8889 8890/8890/8890 -g charts -o chart0000 -s off -f 8879/8879/8879 8880/8880/8880 8881/8881/8881 -o chart0001 -s off -f 8882/8882/8882 8883/8883/8883 8884/8884/8884 -f 8882/8882/8882 8884/8884/8884 8885/8885/8885 -f 8882/8882/8882 8885/8885/8885 8886/8886/8886 -o chart0002 -s off -f 8887/8887/8887 8888/8888/8888 8889/8889/8889 -f 8887/8887/8887 8889/8889/8889 8890/8890/8890 -v 7385.88 16371 2777.51 -vt 0.53325 0.559357 -v 7813.38 16371 2777.51 -vt 0.529099 0.558533 -v 7813.38 16356 2777.51 -vt 0.529094 0.559357 -v 7385.88 16371 2777.51 -vt 0.908977 0.126546 -v 7813.38 16356 2777.51 -vt 0.90874 0.122546 -v 7839.63 16356 2777.51 -vt 0.90874 0.122301 -v 7839.63 16371 2777.51 -vt 0.908977 0.122301 -v 8267.13 16371 2777.51 -vt 0.908977 0.118302 -v 8267.13 16318.5 2777.51 -vt 0.908146 0.118302 -v 7385.88 16318.5 2777.51 -vt 0.908146 0.126546 -o mesh1770 -s off -f 8891/8891/8891 8892/8892/8892 8893/8893/8893 -f 8894/8894/8894 8895/8895/8895 8896/8896/8896 -f 8894/8894/8894 8896/8896/8896 8897/8897/8897 -f 8894/8894/8894 8897/8897/8897 8898/8898/8898 -f 8894/8894/8894 8898/8898/8898 8899/8899/8899 -f 8894/8894/8894 8899/8899/8899 8900/8900/8900 -g charts -o chart0000 -s off -f 8891/8891/8891 8892/8892/8892 8893/8893/8893 -o chart0001 -s off -f 8894/8894/8894 8895/8895/8895 8896/8896/8896 -f 8894/8894/8894 8896/8896/8896 8897/8897/8897 -f 8894/8894/8894 8897/8897/8897 8898/8898/8898 -f 8894/8894/8894 8898/8898/8898 8899/8899/8899 -f 8894/8894/8894 8899/8899/8899 8900/8900/8900 -v 8267.13 16318.5 2777.51 -vt 0.390422 0.789599 -v 8267.13 16318.5 -40.6129 -vt 0.390422 0.811686 -v 8387.13 16318.5 -243.113 -vt 0.389443 0.813273 -v 7265.88 16318.5 -243.113 -vt 0.398587 0.813273 -v 7385.88 16318.5 -40.6129 -vt 0.397608 0.811686 -v 7385.88 16318.5 2777.51 -vt 0.397608 0.789599 -v 7265.88 16318.5 2912.51 -vt 0.398587 0.788541 -v 8387.13 16318.5 2912.51 -vt 0.389443 0.788541 -o mesh1771 -s off -f 8901/8901/8901 8902/8902/8902 8903/8903/8903 -f 8904/8904/8904 8903/8903/8903 8902/8902/8902 -f 8905/8905/8905 8904/8904/8904 8902/8902/8902 -f 8906/8906/8906 8904/8904/8904 8905/8905/8905 -f 8907/8907/8907 8901/8901/8901 8908/8908/8908 -f 8903/8903/8903 8908/8908/8908 8901/8901/8901 -f 8906/8906/8906 8901/8901/8901 8907/8907/8907 -f 8904/8904/8904 8906/8906/8906 8907/8907/8907 -g charts -o chart0000 -s off -f 8901/8901/8901 8902/8902/8902 8903/8903/8903 -f 8904/8904/8904 8903/8903/8903 8902/8902/8902 -f 8905/8905/8905 8904/8904/8904 8902/8902/8902 -f 8906/8906/8906 8904/8904/8904 8905/8905/8905 -f 8907/8907/8907 8901/8901/8901 8908/8908/8908 -f 8903/8903/8903 8908/8908/8908 8901/8901/8901 -f 8906/8906/8906 8901/8901/8901 8907/8907/8907 -f 8904/8904/8904 8906/8906/8906 8907/8907/8907 -v 8387.13 16371 -243.113 -vt 0.997922 0.208162 -v 8387.13 16371 2912.51 -vt 0.997922 0.18343 -v 8387.13 16318.5 2912.51 -vt 0.997091 0.18343 -v 8387.13 16318.5 -243.113 -vt 0.997091 0.208162 -o mesh1772 -s off -f 8909/8909/8909 8910/8910/8910 8911/8911/8911 -f 8909/8909/8909 8911/8911/8911 8912/8912/8912 -g charts -o chart0000 -s off -f 8909/8909/8909 8910/8910/8910 8911/8911/8911 -f 8909/8909/8909 8911/8911/8911 8912/8912/8912 -v 7385.88 16356 2197.43 -vt 0.797589 0.944353 -v 7385.88 16356 2226.97 -vt 0.797589 0.945177 -v 7385.88 16371 2226.97 -vt 0.796758 0.945177 -v 7385.88 16356 2197.43 -vt 0.0988714 0.367507 -v 7385.88 16371 2226.97 -vt 0.0991066 0.367271 -v 7385.88 16371 2777.51 -vt 0.103491 0.367271 -v 7385.88 16318.5 2777.51 -vt 0.103491 0.368096 -v 7385.88 16318.5 -40.6129 -vt 0.0810474 0.368096 -v 7385.88 16371 -40.6129 -vt 0.0810474 0.367271 -v 7385.88 16371 2197.43 -vt 0.0988714 0.367271 -o mesh1773 -s off -f 8913/8913/8913 8914/8914/8914 8915/8915/8915 -f 8916/8916/8916 8917/8917/8917 8918/8918/8918 -f 8916/8916/8916 8918/8918/8918 8919/8919/8919 -f 8916/8916/8916 8919/8919/8919 8920/8920/8920 -f 8916/8916/8916 8920/8920/8920 8921/8921/8921 -f 8916/8916/8916 8921/8921/8921 8922/8922/8922 -g charts -o chart0000 -s off -f 8913/8913/8913 8914/8914/8914 8915/8915/8915 -o chart0001 -s off -f 8916/8916/8916 8917/8917/8917 8918/8918/8918 -f 8916/8916/8916 8918/8918/8918 8919/8919/8919 -f 8916/8916/8916 8919/8919/8919 8920/8920/8920 -f 8916/8916/8916 8920/8920/8920 8921/8921/8921 -f 8916/8916/8916 8921/8921/8921 8922/8922/8922 -v 7839.63 16356 2226.97 -vt 0.97714 0.354081 -v 8267.13 16356 2226.97 -vt 0.972984 0.354081 -v 8267.13 16371 2226.97 -vt 0.972984 0.353256 -v 7839.63 16371 2226.97 -vt 0.97714 0.353256 -o mesh1774 -s off -f 8923/8923/8923 8924/8924/8924 8925/8925/8925 -f 8923/8923/8923 8925/8925/8925 8926/8926/8926 -g charts -o chart0000 -s off -f 8923/8923/8923 8924/8924/8924 8925/8925/8925 -f 8923/8923/8923 8925/8925/8925 8926/8926/8926 -v 8267.13 16356 2197.43 -vt 0.0768911 0.188376 -v 8267.13 16356 2226.97 -vt 0.0777223 0.188376 -v 7839.63 16356 2226.97 -vt 0.0777223 0.184254 -v 8267.13 16356 2197.43 -vt 0.204904 0.707749 -v 7839.63 16356 2226.97 -vt 0.201579 0.709971 -v 7839.63 16356 2777.51 -vt 0.204904 0.71352 -v 8267.13 16356 2197.43 -vt 0.992934 0.490107 -v 7839.63 16356 2777.51 -vt 0.987947 0.486508 -v 7813.38 16356 2777.51 -vt 0.987947 0.486287 -v 7813.38 16356 2226.97 -vt 0.99268 0.486287 -v 7385.88 16356 2226.97 -vt 0.99268 0.482688 -v 7385.88 16356 2197.43 -vt 0.992934 0.482688 -o mesh1775 -s off -f 8927/8927/8927 8928/8928/8928 8929/8929/8929 -f 8930/8930/8930 8931/8931/8931 8932/8932/8932 -f 8933/8933/8933 8934/8934/8934 8935/8935/8935 -f 8933/8933/8933 8935/8935/8935 8936/8936/8936 -f 8933/8933/8933 8936/8936/8936 8937/8937/8937 -f 8933/8933/8933 8937/8937/8937 8938/8938/8938 -g charts -o chart0000 -s off -f 8927/8927/8927 8928/8928/8928 8929/8929/8929 -o chart0001 -s off -f 8930/8930/8930 8931/8931/8931 8932/8932/8932 -o chart0002 -s off -f 8933/8933/8933 8934/8934/8934 8935/8935/8935 -f 8933/8933/8933 8935/8935/8935 8936/8936/8936 -f 8933/8933/8933 8936/8936/8936 8937/8937/8937 -f 8933/8933/8933 8937/8937/8937 8938/8938/8938 -v 8267.13 16371 2197.43 -vt 0.949709 0.958368 -v 8267.13 16356 2197.43 -vt 0.949709 0.957543 -v 7385.88 16356 2197.43 -vt 0.942228 0.957543 -v 7385.88 16371 2197.43 -vt 0.942228 0.958368 -o mesh1776 -s off -f 8939/8939/8939 8940/8940/8940 8941/8941/8941 -f 8939/8939/8939 8941/8941/8941 8942/8942/8942 -g charts -o chart0000 -s off -f 8939/8939/8939 8940/8940/8940 8941/8941/8941 -f 8939/8939/8939 8941/8941/8941 8942/8942/8942 -v 7813.38 16371 2226.97 -vt 0.91064 0.926216 -v 7385.88 16371 2226.97 -vt 0.91064 0.930338 -v 7385.88 16356 2226.97 -vt 0.911471 0.930338 -v 7813.38 16356 2226.97 -vt 0.911471 0.926216 -o mesh1777 -s off -f 8943/8943/8943 8944/8944/8944 8945/8945/8945 -f 8943/8943/8943 8945/8945/8945 8946/8946/8946 -g charts -o chart0000 -s off -f 8943/8943/8943 8944/8944/8944 8945/8945/8945 -f 8943/8943/8943 8945/8945/8945 8946/8946/8946 -v 7813.38 16356 2777.51 -vt 0.259767 0.953421 -v 7813.38 16371 2777.51 -vt 0.258936 0.953421 -v 7813.38 16371 2226.97 -vt 0.258936 0.948475 -v 7813.38 16356 2226.97 -vt 0.259767 0.948475 -o mesh1778 -s off -f 8947/8947/8947 8948/8948/8948 8949/8949/8949 -f 8947/8947/8947 8949/8949/8949 8950/8950/8950 -g charts -o chart0000 -s off -f 8947/8947/8947 8948/8948/8948 8949/8949/8949 -f 8947/8947/8947 8949/8949/8949 8950/8950/8950 -v 7839.63 16371 2777.51 -vt 0.198254 0.595631 -v 7839.63 16356 2777.51 -vt 0.198254 0.594806 -v 7839.63 16356 2226.97 -vt 0.193267 0.594806 -v 7839.63 16371 2226.97 -vt 0.193267 0.595631 -o mesh1779 -s off -f 8951/8951/8951 8952/8952/8952 8953/8953/8953 -f 8951/8951/8951 8953/8953/8953 8954/8954/8954 -g charts -o chart0000 -s off -f 8951/8951/8951 8952/8952/8952 8953/8953/8953 -f 8951/8951/8951 8953/8953/8953 8954/8954/8954 -v 8387.13 16318.5 2197.43 -vt 0.809079 0.55705 -v 9268.38 16318.5 2226.97 -vt 0.801893 0.557282 -v 9268.38 16318.5 2197.43 -vt 0.801893 0.55705 -v 9268.38 16318.5 2777.51 -vt 0.801893 0.561596 -v 8840.88 16318.5 2226.97 -vt 0.805379 0.557282 -v 8814.63 16318.5 2226.97 -vt 0.805593 0.557282 -v 8814.63 16318.5 2777.51 -vt 0.805593 0.561596 -v 8387.13 16318.5 2226.97 -vt 0.809079 0.557282 -v 8387.13 16318.5 -40.6129 -vt 0.809079 0.53951 -v 8387.13 16318.5 2777.51 -vt 0.809079 0.561596 -v 9388.38 16318.5 -243.113 -vt 0.800914 0.537923 -v 9388.38 16318.5 2912.51 -vt 0.800914 0.562654 -v 8267.13 16318.5 2912.51 -vt 0.810058 0.562654 -v 8840.88 16318.5 2777.51 -vt 0.805379 0.561596 -v 8267.13 16318.5 -243.113 -vt 0.810058 0.537923 -v 9268.38 16318.5 -40.6129 -vt 0.801893 0.53951 -o mesh1780 -s off -f 8955/8955/8955 8956/8956/8956 8957/8957/8957 -f 8958/8958/8958 8957/8957/8957 8956/8956/8956 -f 8959/8959/8959 8956/8956/8956 8955/8955/8955 -f 8960/8960/8960 8959/8959/8959 8955/8955/8955 -f 8961/8961/8961 8959/8959/8959 8960/8960/8960 -f 8962/8962/8962 8960/8960/8960 8955/8955/8955 -f 8963/8963/8963 8962/8962/8962 8955/8955/8955 -f 8964/8964/8964 8962/8962/8962 8963/8963/8963 -f 8965/8965/8965 8958/8958/8958 8966/8966/8966 -f 8967/8967/8967 8966/8966/8966 8958/8958/8958 -f 8957/8957/8957 8958/8958/8958 8965/8965/8965 -f 8968/8968/8968 8967/8967/8967 8958/8958/8958 -f 8961/8961/8961 8967/8967/8967 8968/8968/8968 -f 8959/8959/8959 8961/8961/8961 8968/8968/8968 -f 8964/8964/8964 8967/8967/8967 8961/8961/8961 -f 8969/8969/8969 8967/8967/8967 8964/8964/8964 -f 8969/8969/8969 8970/8970/8970 8965/8965/8965 -f 8957/8957/8957 8965/8965/8965 8970/8970/8970 -f 8963/8963/8963 8970/8970/8970 8969/8969/8969 -f 8964/8964/8964 8963/8963/8963 8969/8969/8969 -g charts -o chart0000 -s off -f 8955/8955/8955 8956/8956/8956 8957/8957/8957 -f 8958/8958/8958 8957/8957/8957 8956/8956/8956 -f 8959/8959/8959 8956/8956/8956 8955/8955/8955 -f 8960/8960/8960 8959/8959/8959 8955/8955/8955 -f 8961/8961/8961 8959/8959/8959 8960/8960/8960 -f 8962/8962/8962 8960/8960/8960 8955/8955/8955 -f 8963/8963/8963 8962/8962/8962 8955/8955/8955 -f 8964/8964/8964 8962/8962/8962 8963/8963/8963 -f 8965/8965/8965 8958/8958/8958 8966/8966/8966 -f 8967/8967/8967 8966/8966/8966 8958/8958/8958 -f 8957/8957/8957 8958/8958/8958 8965/8965/8965 -f 8968/8968/8968 8967/8967/8967 8958/8958/8958 -f 8961/8961/8961 8967/8967/8967 8968/8968/8968 -f 8959/8959/8959 8961/8961/8961 8968/8968/8968 -f 8964/8964/8964 8967/8967/8967 8961/8961/8961 -f 8969/8969/8969 8967/8967/8967 8964/8964/8964 -f 8969/8969/8969 8970/8970/8970 8965/8965/8965 -f 8957/8957/8957 8965/8965/8965 8970/8970/8970 -f 8963/8963/8963 8970/8970/8970 8969/8969/8969 -f 8964/8964/8964 8963/8963/8963 8969/8969/8969 -v 9388.38 16318.5 2912.51 -vt 0.997922 0.901484 -v 8267.13 16318.5 2912.51 -vt 0.997922 0.910552 -v 8267.13 16266 2912.51 -vt 0.998753 0.910552 -v 9388.38 16266 2912.51 -vt 0.998753 0.901484 -o mesh1781 -s off -f 8971/8971/8971 8972/8972/8972 8973/8973/8973 -f 8971/8971/8971 8973/8973/8973 8974/8974/8974 -g charts -o chart0000 -s off -f 8971/8971/8971 8972/8972/8972 8973/8973/8973 -f 8971/8971/8971 8973/8973/8973 8974/8974/8974 -v 8267.13 16318.5 -243.113 -vt 0.967997 0.0614179 -v 9388.38 16318.5 -243.113 -vt 0.967997 0.0523495 -v 9388.38 16266 -243.113 -vt 0.967165 0.0523495 -v 8267.13 16266 -243.113 -vt 0.967165 0.0614179 -o mesh1782 -s off -f 8975/8975/8975 8976/8976/8976 8977/8977/8977 -f 8975/8975/8975 8977/8977/8977 8978/8978/8978 -g charts -o chart0000 -s off -f 8975/8975/8975 8976/8976/8976 8977/8977/8977 -f 8975/8975/8975 8977/8977/8977 8978/8978/8978 -v 8267.13 16318.5 2912.51 -vt 0.948047 0.743199 -v 8267.13 16318.5 -243.113 -vt 0.972984 0.743199 -v 8267.13 16266 -243.113 -vt 0.972984 0.744023 -v 8267.13 16266 2912.51 -vt 0.948047 0.744023 -o mesh1783 -s off -f 8979/8979/8979 8980/8980/8980 8981/8981/8981 -f 8979/8979/8979 8981/8981/8981 8982/8982/8982 -g charts -o chart0000 -s off -f 8979/8979/8979 8980/8980/8980 8981/8981/8981 -f 8979/8979/8979 8981/8981/8981 8982/8982/8982 -v 9268.38 16318.5 -40.6129 -vt 0.746883 0.748145 -v 8387.13 16318.5 -40.6129 -vt 0.754364 0.748145 -v 8387.13 16266 -40.6129 -vt 0.754364 0.748969 -v 9268.38 16266 -40.6129 -vt 0.746883 0.748969 -o mesh1784 -s off -f 8983/8983/8983 8984/8984/8984 8985/8985/8985 -f 8983/8983/8983 8985/8985/8985 8986/8986/8986 -g charts -o chart0000 -s off -f 8983/8983/8983 8984/8984/8984 8985/8985/8985 -f 8983/8983/8983 8985/8985/8985 8986/8986/8986 -v 9268.38 16318.5 2777.51 -vt 0.894015 0.961665 -v 9268.38 16318.5 2226.97 -vt 0.899002 0.961665 -v 9268.38 16303.5 2226.97 -vt 0.899002 0.96249 -v 9268.38 16318.5 2777.51 -vt 0.795927 0.331822 -v 9268.38 16303.5 2226.97 -vt 0.796758 0.327473 -v 9268.38 16303.5 2197.43 -vt 0.796758 0.32724 -v 9268.38 16318.5 2197.43 -vt 0.795927 0.32724 -v 9268.38 16318.5 -40.6129 -vt 0.795927 0.309563 -v 9268.38 16318.5 2777.51 -vt 0.258936 0.920445 -v 9268.38 16318.5 -40.6129 -vt 0.258936 0.942704 -v 9268.38 16266 -40.6129 -vt 0.259767 0.942704 -v 9268.38 16266 2777.51 -vt 0.259767 0.920445 -o mesh1785 -s off -f 8987/8987/8987 8988/8988/8988 8989/8989/8989 -f 8990/8990/8990 8991/8991/8991 8992/8992/8992 -f 8990/8990/8990 8992/8992/8992 8993/8993/8993 -f 8990/8990/8990 8993/8993/8993 8994/8994/8994 -f 8995/8995/8995 8996/8996/8996 8997/8997/8997 -f 8995/8995/8995 8997/8997/8997 8998/8998/8998 -g charts -o chart0000 -s off -f 8987/8987/8987 8988/8988/8988 8989/8989/8989 -o chart0001 -s off -f 8990/8990/8990 8991/8991/8991 8992/8992/8992 -f 8990/8990/8990 8992/8992/8992 8993/8993/8993 -f 8990/8990/8990 8993/8993/8993 8994/8994/8994 -o chart0002 -s off -f 8995/8995/8995 8996/8996/8996 8997/8997/8997 -f 8995/8995/8995 8997/8997/8997 8998/8998/8998 -v 8387.13 16318.5 2777.51 -vt 0.458437 0.972383 -v 8814.63 16318.5 2777.51 -vt 0.458437 0.976504 -v 8814.63 16303.5 2777.51 -vt 0.457606 0.976504 -v 8387.13 16318.5 2777.51 -vt 0.879052 0.961665 -v 8814.63 16303.5 2777.51 -vt 0.878815 0.957666 -v 8840.88 16303.5 2777.51 -vt 0.878815 0.95742 -v 8840.88 16318.5 2777.51 -vt 0.879052 0.95742 -v 9268.38 16318.5 2777.51 -vt 0.879052 0.953421 -v 9268.38 16266 2777.51 -vt 0.878221 0.953421 -v 8387.13 16266 2777.51 -vt 0.878221 0.961665 -o mesh1786 -s off -f 8999/8999/8999 9000/9000/9000 9001/9001/9001 -f 9002/9002/9002 9003/9003/9003 9004/9004/9004 -f 9002/9002/9002 9004/9004/9004 9005/9005/9005 -f 9002/9002/9002 9005/9005/9005 9006/9006/9006 -f 9002/9002/9002 9006/9006/9006 9007/9007/9007 -f 9002/9002/9002 9007/9007/9007 9008/9008/9008 -g charts -o chart0000 -s off -f 8999/8999/8999 9000/9000/9000 9001/9001/9001 -o chart0001 -s off -f 9002/9002/9002 9003/9003/9003 9004/9004/9004 -f 9002/9002/9002 9004/9004/9004 9005/9005/9005 -f 9002/9002/9002 9005/9005/9005 9006/9006/9006 -f 9002/9002/9002 9006/9006/9006 9007/9007/9007 -f 9002/9002/9002 9007/9007/9007 9008/9008/9008 -v 9268.38 16266 2777.51 -vt 0.781943 0.884405 -v 9268.38 16266 -40.6129 -vt 0.781943 0.906492 -v 9388.38 16266 -243.113 -vt 0.780964 0.908079 -v 8267.13 16266 -243.113 -vt 0.790108 0.908079 -v 8387.13 16266 -40.6129 -vt 0.789129 0.906492 -v 8387.13 16266 2777.51 -vt 0.789129 0.884405 -v 8267.13 16266 2912.51 -vt 0.790108 0.883347 -v 9388.38 16266 2912.51 -vt 0.780964 0.883347 -o mesh1787 -s off -f 9009/9009/9009 9010/9010/9010 9011/9011/9011 -f 9012/9012/9012 9011/9011/9011 9010/9010/9010 -f 9013/9013/9013 9012/9012/9012 9010/9010/9010 -f 9014/9014/9014 9012/9012/9012 9013/9013/9013 -f 9015/9015/9015 9009/9009/9009 9016/9016/9016 -f 9011/9011/9011 9016/9016/9016 9009/9009/9009 -f 9014/9014/9014 9009/9009/9009 9015/9015/9015 -f 9012/9012/9012 9014/9014/9014 9015/9015/9015 -g charts -o chart0000 -s off -f 9009/9009/9009 9010/9010/9010 9011/9011/9011 -f 9012/9012/9012 9011/9011/9011 9010/9010/9010 -f 9013/9013/9013 9012/9012/9012 9010/9010/9010 -f 9014/9014/9014 9012/9012/9012 9013/9013/9013 -f 9015/9015/9015 9009/9009/9009 9016/9016/9016 -f 9011/9011/9011 9016/9016/9016 9009/9009/9009 -f 9014/9014/9014 9009/9009/9009 9015/9015/9015 -f 9012/9012/9012 9014/9014/9014 9015/9015/9015 -v 9388.38 16318.5 -243.113 -vt 0.609726 0.474443 -v 9388.38 16318.5 2912.51 -vt 0.609726 0.449711 -v 9388.38 16266 2912.51 -vt 0.608894 0.449711 -v 9388.38 16266 -243.113 -vt 0.608894 0.474443 -o mesh1788 -s off -f 9017/9017/9017 9018/9018/9018 9019/9019/9019 -f 9017/9017/9017 9019/9019/9019 9020/9020/9020 -g charts -o chart0000 -s off -f 9017/9017/9017 9018/9018/9018 9019/9019/9019 -f 9017/9017/9017 9019/9019/9019 9020/9020/9020 -v 8387.13 16303.5 2197.43 -vt 0.190773 0.941055 -v 8387.13 16303.5 2226.97 -vt 0.190773 0.94188 -v 8387.13 16318.5 2226.97 -vt 0.189942 0.94188 -v 8387.13 16303.5 2197.43 -vt 0.66745 0.713756 -v 8387.13 16318.5 2226.97 -vt 0.667685 0.71352 -v 8387.13 16318.5 2777.51 -vt 0.67207 0.71352 -v 8387.13 16266 2777.51 -vt 0.67207 0.714345 -v 8387.13 16266 -40.6129 -vt 0.649626 0.714345 -v 8387.13 16318.5 -40.6129 -vt 0.649626 0.71352 -v 8387.13 16318.5 2197.43 -vt 0.66745 0.71352 -o mesh1789 -s off -f 9021/9021/9021 9022/9022/9022 9023/9023/9023 -f 9024/9024/9024 9025/9025/9025 9026/9026/9026 -f 9024/9024/9024 9026/9026/9026 9027/9027/9027 -f 9024/9024/9024 9027/9027/9027 9028/9028/9028 -f 9024/9024/9024 9028/9028/9028 9029/9029/9029 -f 9024/9024/9024 9029/9029/9029 9030/9030/9030 -g charts -o chart0000 -s off -f 9021/9021/9021 9022/9022/9022 9023/9023/9023 -o chart0001 -s off -f 9024/9024/9024 9025/9025/9025 9026/9026/9026 -f 9024/9024/9024 9026/9026/9026 9027/9027/9027 -f 9024/9024/9024 9027/9027/9027 9028/9028/9028 -f 9024/9024/9024 9028/9028/9028 9029/9029/9029 -f 9024/9024/9024 9029/9029/9029 9030/9030/9030 -v 8840.88 16303.5 2226.97 -vt 0.790939 0.958368 -v 9268.38 16303.5 2226.97 -vt 0.786783 0.958368 -v 9268.38 16318.5 2226.97 -vt 0.786783 0.957543 -v 8840.88 16318.5 2226.97 -vt 0.790939 0.957543 -o mesh1790 -s off -f 9031/9031/9031 9032/9032/9032 9033/9033/9033 -f 9031/9031/9031 9033/9033/9033 9034/9034/9034 -g charts -o chart0000 -s off -f 9031/9031/9031 9032/9032/9032 9033/9033/9033 -f 9031/9031/9031 9033/9033/9033 9034/9034/9034 -v 9268.38 16303.5 2197.43 -vt 0.93724 0.273289 -v 9268.38 16303.5 2226.97 -vt 0.93724 0.274114 -v 8840.88 16303.5 2226.97 -vt 0.933084 0.274114 -v 9268.38 16303.5 2197.43 -vt 0.293017 0.848722 -v 8840.88 16303.5 2226.97 -vt 0.295257 0.845425 -v 8840.88 16303.5 2777.51 -vt 0.298836 0.848722 -v 9268.38 16303.5 2197.43 -vt 0.795096 0.819868 -v 8840.88 16303.5 2777.51 -vt 0.791466 0.814922 -v 8814.63 16303.5 2777.51 -vt 0.791243 0.814922 -v 8814.63 16303.5 2226.97 -vt 0.791243 0.819616 -v 8387.13 16303.5 2226.97 -vt 0.787614 0.819616 -v 8387.13 16303.5 2197.43 -vt 0.787614 0.819868 -o mesh1791 -s off -f 9035/9035/9035 9036/9036/9036 9037/9037/9037 -f 9038/9038/9038 9039/9039/9039 9040/9040/9040 -f 9041/9041/9041 9042/9042/9042 9043/9043/9043 -f 9041/9041/9041 9043/9043/9043 9044/9044/9044 -f 9041/9041/9041 9044/9044/9044 9045/9045/9045 -f 9041/9041/9041 9045/9045/9045 9046/9046/9046 -g charts -o chart0000 -s off -f 9035/9035/9035 9036/9036/9036 9037/9037/9037 -o chart0001 -s off -f 9038/9038/9038 9039/9039/9039 9040/9040/9040 -o chart0002 -s off -f 9041/9041/9041 9042/9042/9042 9043/9043/9043 -f 9041/9041/9041 9043/9043/9043 9044/9044/9044 -f 9041/9041/9041 9044/9044/9044 9045/9045/9045 -f 9041/9041/9041 9045/9045/9045 9046/9046/9046 -v 9268.38 16318.5 2197.43 -vt 0.14256 0.549464 -v 9268.38 16303.5 2197.43 -vt 0.14256 0.54864 -v 8387.13 16303.5 2197.43 -vt 0.135079 0.54864 -v 8387.13 16318.5 2197.43 -vt 0.135079 0.549464 -o mesh1792 -s off -f 9047/9047/9047 9048/9048/9048 9049/9049/9049 -f 9047/9047/9047 9049/9049/9049 9050/9050/9050 -g charts -o chart0000 -s off -f 9047/9047/9047 9048/9048/9048 9049/9049/9049 -f 9047/9047/9047 9049/9049/9049 9050/9050/9050 -v 8814.63 16318.5 2226.97 -vt 0.25478 0.319456 -v 8387.13 16318.5 2226.97 -vt 0.258936 0.319456 -v 8387.13 16303.5 2226.97 -vt 0.258936 0.32028 -v 8814.63 16303.5 2226.97 -vt 0.25478 0.32028 -o mesh1793 -s off -f 9051/9051/9051 9052/9052/9052 9053/9053/9053 -f 9051/9051/9051 9053/9053/9053 9054/9054/9054 -g charts -o chart0000 -s off -f 9051/9051/9051 9052/9052/9052 9053/9053/9053 -f 9051/9051/9051 9053/9053/9053 9054/9054/9054 -v 8814.63 16303.5 2777.51 -vt 0.999584 0.581616 -v 8814.63 16318.5 2777.51 -vt 0.998753 0.581616 -v 8814.63 16318.5 2226.97 -vt 0.998753 0.576669 -v 8814.63 16303.5 2226.97 -vt 0.999584 0.576669 -o mesh1794 -s off -f 9055/9055/9055 9056/9056/9056 9057/9057/9057 -f 9055/9055/9055 9057/9057/9057 9058/9058/9058 -g charts -o chart0000 -s off -f 9055/9055/9055 9056/9056/9056 9057/9057/9057 -f 9055/9055/9055 9057/9057/9057 9058/9058/9058 -v 8840.88 16318.5 2777.51 -vt 0.948046 0.617889 -v 8840.88 16303.5 2777.51 -vt 0.948046 0.617065 -v 8840.88 16303.5 2226.97 -vt 0.943059 0.617065 -v 8840.88 16318.5 2226.97 -vt 0.943059 0.617889 -o mesh1795 -s off -f 9059/9059/9059 9060/9060/9060 9061/9061/9061 -f 9059/9059/9059 9061/9061/9061 9062/9062/9062 -g charts -o chart0000 -s off -f 9059/9059/9059 9060/9060/9060 9061/9061/9061 -f 9059/9059/9059 9061/9061/9061 9062/9062/9062 -v -6956 -2079.01 -285.3 -vt 0.063591 0.750383 -v -8216 -2079.01 -285.3 -vt 0.063591 0.760276 -v -12026 -2079.01 -285.3 -vt 0.063591 0.79019 -v -12026 4790.99 -285.3 -vt 0.117756 0.79019 -v -8051 4790.99 -285.3 -vt 0.117756 0.75898 -v -8051 16266 -285.3 -vt 0.208229 0.75898 -v -6776 16266 -285.3 -vt 0.208229 0.748969 -v -6776 5120.99 -285.3 -vt 0.120358 0.748969 -v -6956 -2079.01 -285.3 -vt 0.97049 0.431575 -v -6776 5120.99 -285.3 -vt 0.968828 0.488458 -v -6956 5120.99 -285.3 -vt 0.97049 0.488458 -o mesh1796 -s off -f 9063/9063/9063 9064/9064/9064 9065/9065/9065 -f 9063/9063/9063 9065/9065/9065 9066/9066/9066 -f 9063/9063/9063 9066/9066/9066 9067/9067/9067 -f 9063/9063/9063 9067/9067/9067 9068/9068/9068 -f 9063/9063/9063 9068/9068/9068 9069/9069/9069 -f 9063/9063/9063 9069/9069/9069 9070/9070/9070 -f 9071/9071/9071 9072/9072/9072 9073/9073/9073 -g charts -o chart0000 -s off -f 9063/9063/9063 9064/9064/9064 9065/9065/9065 -f 9063/9063/9063 9065/9065/9065 9066/9066/9066 -f 9063/9063/9063 9066/9066/9066 9067/9067/9067 -f 9063/9063/9063 9067/9067/9067 9068/9068/9068 -f 9063/9063/9063 9068/9068/9068 9069/9069/9069 -f 9063/9063/9063 9069/9069/9069 9070/9070/9070 -o chart0001 -s off -f 9071/9071/9071 9072/9072/9072 9073/9073/9073 -v -8216 16431 2594.7 -vt 0.353708 0.91949 -v -7991 16431 2594.7 -vt 0.353699 0.921263 -v -7991 16266 2594.7 -vt 0.355005 0.921269 -v -8051 16266 2594.7 -vt 0.355007 0.920797 -v -8051 4790.99 2594.7 -vt 0.445804 0.921269 -v -12026 4790.99 2594.7 -vt 0.445968 0.889942 -v -8216 16431 2594.7 -vt 0.455112 0.176834 -v -12026 4790.99 2594.7 -vt 0.443475 0.272389 -v -12026 -2079.01 2594.7 -vt 0.455112 0.325227 -v -8216 16431 2594.7 -vt 0.192436 0.443941 -v -12026 -2079.01 2594.7 -vt 0.341798 0.443941 -v -12191 -2079.01 2594.7 -vt 0.342061 0.442675 -v -12191 4955.99 2594.7 -vt 0.287601 0.431575 -v -8216 16431 2594.7 -vt 0.0802161 0.887469 -v -12191 4955.99 2594.7 -vt 0.170823 0.918796 -v -8216 4955.99 2594.7 -vt 0.170823 0.887469 -o mesh1797 -s off -f 9074/9074/9074 9075/9075/9075 9076/9076/9076 -f 9074/9074/9074 9076/9076/9076 9077/9077/9077 -f 9074/9074/9074 9077/9077/9077 9078/9078/9078 -f 9074/9074/9074 9078/9078/9078 9079/9079/9079 -f 9080/9080/9080 9081/9081/9081 9082/9082/9082 -f 9083/9083/9083 9084/9084/9084 9085/9085/9085 -f 9083/9083/9083 9085/9085/9085 9086/9086/9086 -f 9087/9087/9087 9088/9088/9088 9089/9089/9089 -g charts -o chart0000 -s off -f 9074/9074/9074 9075/9075/9075 9076/9076/9076 -f 9074/9074/9074 9076/9076/9076 9077/9077/9077 -f 9074/9074/9074 9077/9077/9077 9078/9078/9078 -f 9074/9074/9074 9078/9078/9078 9079/9079/9079 -o chart0001 -s off -f 9080/9080/9080 9081/9081/9081 9082/9082/9082 -o chart0002 -s off -f 9083/9083/9083 9084/9084/9084 9085/9085/9085 -f 9083/9083/9083 9085/9085/9085 9086/9086/9086 -o chart0003 -s off -f 9087/9087/9087 9088/9088/9088 9089/9089/9089 -v -8216 -2244.01 -285.3 -vt 0.866584 0.234542 -v -8216 -2079.01 -285.3 -vt 0.868246 0.234542 -v -8216 -2079.01 2594.7 -vt 0.868246 0.211459 -v -8216 -2244.01 2594.7 -vt 0.866584 0.211459 -o mesh1798 -s off -f 9090/9090/9090 9091/9091/9091 9092/9092/9092 -f 9090/9090/9090 9092/9092/9092 9093/9093/9093 -g charts -o chart0000 -s off -f 9090/9090/9090 9091/9091/9091 9092/9092/9092 -f 9090/9090/9090 9092/9092/9092 9093/9093/9093 -v -8216 -2079.01 -285.3 -vt 0.489194 0.427453 -v -6956 -2079.01 -285.3 -vt 0.499169 0.427453 -v -6956 -2079.01 2594.7 -vt 0.499169 0.404369 -v -8216 -2079.01 2594.7 -vt 0.489194 0.404369 -o mesh1799 -s off -f 9094/9094/9094 9095/9095/9095 9096/9096/9096 -f 9094/9094/9094 9096/9096/9096 9097/9097/9097 -g charts -o chart0000 -s off -f 9094/9094/9094 9095/9095/9095 9096/9096/9096 -f 9094/9094/9094 9096/9096/9096 9097/9097/9097 -v -6956 -2079.01 -285.3 -vt 0.993765 0.243611 -v -6956 5120.99 -285.3 -vt 0.993765 0.300495 -v -6956 5120.99 2594.7 -vt 0.97049 0.300495 -v -6956 -2079.01 2594.7 -vt 0.97049 0.243611 -o mesh1800 -s off -f 9098/9098/9098 9099/9099/9099 9100/9100/9100 -f 9098/9098/9098 9100/9100/9100 9101/9101/9101 -g charts -o chart0000 -s off -f 9098/9098/9098 9099/9099/9099 9100/9100/9100 -f 9098/9098/9098 9100/9100/9100 9101/9101/9101 -v -6956 5120.99 -285.3 -vt 0.400249 0.500824 -v -6776 5120.99 -285.3 -vt 0.400249 0.502473 -v -6776 5120.99 2594.7 -vt 0.376974 0.502473 -v -6956 5120.99 2594.7 -vt 0.376974 0.500824 -o mesh1801 -s off -f 9102/9102/9102 9103/9103/9103 9104/9104/9104 -f 9102/9102/9102 9104/9104/9104 9105/9105/9105 -g charts -o chart0000 -s off -f 9102/9102/9102 9103/9103/9103 9104/9104/9104 -f 9102/9102/9102 9104/9104/9104 9105/9105/9105 -v -6776 5120.99 -285.3 -vt 0.672901 0.938582 -v -6776 16266 -285.3 -vt 0.584788 0.938582 -v -6776 16266 2594.7 -vt 0.584788 0.915499 -v -6776 5120.99 2594.7 -vt 0.672901 0.915499 -o mesh1802 -s off -f 9106/9106/9106 9107/9107/9107 9108/9108/9108 -f 9106/9106/9106 9108/9108/9108 9109/9109/9109 -g charts -o chart0000 -s off -f 9106/9106/9106 9107/9107/9107 9108/9108/9108 -f 9106/9106/9106 9108/9108/9108 9109/9109/9109 -v -8051 16266 -285.3 -vt 0.905653 0.314509 -v -8051 4790.99 -285.3 -vt 0.905653 0.404369 -v -8051 4790.99 2594.7 -vt 0.928928 0.404369 -v -8051 16266 2594.7 -vt 0.928928 0.314509 -o mesh1803 -s off -f 9110/9110/9110 9111/9111/9111 9112/9112/9112 -f 9110/9110/9110 9112/9112/9112 9113/9113/9113 -g charts -o chart0000 -s off -f 9110/9110/9110 9111/9111/9111 9112/9112/9112 -f 9110/9110/9110 9112/9112/9112 9113/9113/9113 -v -8051 4790.99 -285.3 -vt 0.878221 0.920445 -v -12026 4790.99 -285.3 -vt 0.909809 0.920445 -v -12026 4790.99 2594.7 -vt 0.909809 0.943528 -v -8051 4790.99 2594.7 -vt 0.878221 0.943528 -o mesh1804 -s off -f 9114/9114/9114 9115/9115/9115 9116/9116/9116 -f 9114/9114/9114 9116/9116/9116 9117/9117/9117 -g charts -o chart0000 -s off -f 9114/9114/9114 9115/9115/9115 9116/9116/9116 -f 9114/9114/9114 9116/9116/9116 9117/9117/9117 -v -12026 4790.99 -285.3 -vt 0.973815 0.354905 -v -12026 -2079.01 -285.3 -vt 0.973815 0.409316 -v -12026 -2079.01 2594.7 -vt 0.997091 0.409316 -v -12026 4790.99 2594.7 -vt 0.997091 0.354905 -o mesh1805 -s off -f 9118/9118/9118 9119/9119/9119 9120/9120/9120 -f 9118/9118/9118 9120/9120/9120 9121/9121/9121 -g charts -o chart0000 -s off -f 9118/9118/9118 9119/9119/9119 9120/9120/9120 -f 9118/9118/9118 9120/9120/9120 9121/9121/9121 -v -12026 -2079.01 -285.3 -vt 0.939734 0.860264 -v -12191 -2079.01 -285.3 -vt 0.941396 0.860264 -v -12191 -2079.01 2594.7 -vt 0.941396 0.837181 -v -12026 -2079.01 2594.7 -vt 0.939734 0.837181 -o mesh1806 -s off -f 9122/9122/9122 9123/9123/9123 9124/9124/9124 -f 9122/9122/9122 9124/9124/9124 9125/9125/9125 -g charts -o chart0000 -s off -f 9122/9122/9122 9123/9123/9123 9124/9124/9124 -f 9122/9122/9122 9124/9124/9124 9125/9125/9125 -v -12191 -2079.01 -285.3 -vt 0.879052 0.532976 -v -12191 4955.99 -285.3 -vt 0.823358 0.532976 -v -12191 4955.99 2594.7 -vt 0.823358 0.509893 -v -12191 -2079.01 2594.7 -vt 0.879052 0.509893 -o mesh1807 -s off -f 9126/9126/9126 9127/9127/9127 9128/9128/9128 -f 9126/9126/9126 9128/9128/9128 9129/9129/9129 -g charts -o chart0000 -s off -f 9126/9126/9126 9127/9127/9127 9128/9128/9128 -f 9126/9126/9126 9128/9128/9128 9129/9129/9129 -v -12191 4955.99 -285.3 -vt 0.0818786 0.179307 -v -8216 4955.99 -285.3 -vt 0.0818786 0.14798 -v -8216 4955.99 2594.7 -vt 0.0586035 0.14798 -v -12191 4955.99 2594.7 -vt 0.0586035 0.179307 -o mesh1808 -s off -f 9130/9130/9130 9131/9131/9131 9132/9132/9132 -f 9130/9130/9130 9132/9132/9132 9133/9133/9133 -g charts -o chart0000 -s off -f 9130/9130/9130 9131/9131/9131 9132/9132/9132 -f 9130/9130/9130 9132/9132/9132 9133/9133/9133 -v -8216 4955.99 -285.3 -vt 0.214879 0.788541 -v -8216 16431 -285.3 -vt 0.124273 0.788541 -v -8216 16431 2594.7 -vt 0.124273 0.765458 -v -8216 4955.99 2594.7 -vt 0.214879 0.765458 -o mesh1809 -s off -f 9134/9134/9134 9135/9135/9135 9136/9136/9136 -f 9134/9134/9134 9136/9136/9136 9137/9137/9137 -g charts -o chart0000 -s off -f 9134/9134/9134 9135/9135/9135 9136/9136/9136 -f 9134/9134/9134 9136/9136/9136 9137/9137/9137 -v -6611 16431 2594.7 -vt 0.13591 0.343363 -v -6956 16431 2594.7 -vt 0.13591 0.340066 -v -6956 16431 -285.3 -vt 0.112635 0.340066 -v -6611 16431 -285.3 -vt 0.112635 0.343363 -o mesh1810 -s off -f 9138/9138/9138 9139/9139/9139 9140/9140/9140 -f 9138/9138/9138 9140/9140/9140 9141/9141/9141 -g charts -o chart0000 -s off -f 9138/9138/9138 9139/9139/9139 9140/9140/9140 -f 9138/9138/9138 9140/9140/9140 9141/9141/9141 -v -6611 16431 -285.3 -vt 0.894846 0.152102 -v -6611 4955.99 -285.3 -vt 0.894846 0.241962 -v -6611 4955.99 2594.7 -vt 0.918121 0.241962 -v -6611 16431 2594.7 -vt 0.918121 0.152102 -o mesh1811 -s off -f 9142/9142/9142 9143/9143/9143 9144/9144/9144 -f 9142/9142/9142 9144/9144/9144 9145/9145/9145 -g charts -o chart0000 -s off -f 9142/9142/9142 9143/9143/9143 9144/9144/9144 -f 9142/9142/9142 9144/9144/9144 9145/9145/9145 -v -6611 4955.99 -285.3 -vt 0.344555 0.407667 -v -6791 4955.99 -285.3 -vt 0.344555 0.409316 -v -6791 4955.99 2594.7 -vt 0.32128 0.409316 -v -6611 4955.99 2594.7 -vt 0.32128 0.407667 -o mesh1812 -s off -f 9146/9146/9146 9147/9147/9147 9148/9148/9148 -f 9146/9146/9146 9148/9148/9148 9149/9149/9149 -g charts -o chart0000 -s off -f 9146/9146/9146 9147/9147/9147 9148/9148/9148 -f 9146/9146/9146 9148/9148/9148 9149/9149/9149 -v -6791 4955.99 -285.3 -vt 0.972153 0.918796 -v -6791 -2244.01 -285.3 -vt 0.972153 0.97568 -v -6791 -2244.01 2594.7 -vt 0.995428 0.97568 -v -6791 4955.99 2594.7 -vt 0.995428 0.918796 -o mesh1813 -s off -f 9150/9150/9150 9151/9151/9151 9152/9152/9152 -f 9150/9150/9150 9152/9152/9152 9153/9153/9153 -g charts -o chart0000 -s off -f 9150/9150/9150 9151/9151/9151 9152/9152/9152 -f 9150/9150/9150 9152/9152/9152 9153/9153/9153 -v -6791 -2244.01 -285.3 -vt 0.854946 0.179308 -v -8216 -2244.01 -285.3 -vt 0.854946 0.190849 -v -8216 -2244.01 2594.7 -vt 0.831671 0.190849 -v -6791 -2244.01 2594.7 -vt 0.831671 0.179308 -o mesh1814 -s off -f 9154/9154/9154 9155/9155/9155 9156/9156/9156 -f 9154/9154/9154 9156/9156/9156 9157/9157/9157 -g charts -o chart0000 -s off -f 9154/9154/9154 9155/9155/9155 9156/9156/9156 -f 9154/9154/9154 9156/9156/9156 9157/9157/9157 -v -7991 16431 -285.3 -vt 0.14256 0.683017 -v -6956 16431 -285.3 -vt 0.14256 0.674773 -v -6956 16249.1 -285.3 -vt 0.140898 0.674773 -v -7991 16249.1 -285.3 -vt 0.140898 0.683017 -o mesh1815 -s off -f 9158/9158/9158 9159/9159/9159 9160/9160/9160 -f 9158/9158/9158 9160/9160/9160 9161/9161/9161 -g charts -o chart0000 -s off -f 9158/9158/9158 9159/9159/9159 9160/9160/9160 -f 9158/9158/9158 9160/9160/9160 9161/9161/9161 -v -6956 16431 -285.3 -vt 0.944721 0.486809 -v -6956 16431 2594.7 -vt 0.921446 0.486809 -v -6956 16266 2594.7 -vt 0.921446 0.485314 -v -6956 16249.1 2594.7 -vt 0.921446 0.485161 -v -6956 16249.1 -285.3 -vt 0.944721 0.485161 -o mesh1816 -s off -f 9162/9162/9162 9163/9163/9163 9164/9164/9164 -f 9162/9162/9162 9164/9164/9164 9165/9165/9165 -f 9162/9162/9162 9165/9165/9165 9166/9166/9166 -g charts -o chart0000 -s off -f 9162/9162/9162 9163/9163/9163 9164/9164/9164 -f 9162/9162/9162 9164/9164/9164 9165/9165/9165 -f 9162/9162/9162 9165/9165/9165 9166/9166/9166 -v -6956 16249.1 2594.7 -vt 0.694514 0.631904 -v -6956 16266 2594.7 -vt 0.693682 0.631904 -v -7991 16266 2594.7 -vt 0.693682 0.62366 -v -7991 16249.1 2594.7 -vt 0.694514 0.62366 -o mesh1817 -s off -f 9167/9167/9167 9168/9168/9168 9169/9169/9169 -f 9167/9167/9167 9169/9169/9169 9170/9170/9170 -g charts -o chart0000 -s off -f 9167/9167/9167 9168/9168/9168 9169/9169/9169 -f 9167/9167/9167 9169/9169/9169 9170/9170/9170 -v -7991 16431 2594.7 -vt 0.337074 0.762984 -v -7991 16431 -285.3 -vt 0.360349 0.762984 -v -7991 16249.1 -285.3 -vt 0.360349 0.764633 -v -7991 16249.1 2594.7 -vt 0.337074 0.764633 -v -7991 16266 2594.7 -vt 0.337074 0.76448 -o mesh1818 -s off -f 9171/9171/9171 9172/9172/9172 9173/9173/9173 -f 9171/9171/9171 9173/9173/9173 9174/9174/9174 -f 9171/9171/9171 9174/9174/9174 9175/9175/9175 -g charts -o chart0000 -s off -f 9171/9171/9171 9172/9172/9172 9173/9173/9173 -f 9171/9171/9171 9173/9173/9173 9174/9174/9174 -f 9171/9171/9171 9174/9174/9174 9175/9175/9175 -v -7991 16431 -285.3 -vt 0.403574 0.434048 -v -7991 16431 2594.7 -vt 0.380299 0.434048 -v -8216 16431 2594.7 -vt 0.380299 0.431575 -v -8216 16431 -285.3 -vt 0.403574 0.431575 -o mesh1819 -s off -f 9176/9176/9176 9177/9177/9177 9178/9178/9178 -f 9176/9176/9176 9178/9178/9178 9179/9179/9179 -g charts -o chart0000 -s off -f 9176/9176/9176 9177/9177/9177 9178/9178/9178 -f 9176/9176/9176 9178/9178/9178 9179/9179/9179 -v -6776 16266 2594.7 -vt 0.39479 0.845353 -v -6956 16266 2594.7 -vt 0.39479 0.847073 -v -6956 16431 2594.7 -vt 0.396093 0.847073 -v -6611 16431 2594.7 -vt 0.396093 0.843776 -v -6611 4955.99 2594.7 -vt 0.305486 0.843776 -v -6791 4955.99 2594.7 -vt 0.305486 0.845496 -v -6776 16266 2594.7 -vt 0.299668 0.678895 -v -6791 4955.99 2594.7 -vt 0.389563 0.678848 -v -6791 -2244.01 2594.7 -vt 0.44679 0.678895 -v -8216 -2244.01 2594.7 -vt 0.4468 0.667355 -v -8216 -2079.01 2594.7 -vt 0.445488 0.667354 -v -6776 16266 2594.7 -vt 0.245636 0.842951 -v -8216 -2079.01 2594.7 -vt 0.0918537 0.842951 -v -6956 -2079.01 2594.7 -vt 0.0926777 0.832234 -v -6956 5120.99 2594.7 -vt 0.152664 0.837041 -v -6776 16266 2594.7 -vt 0.440981 0.244435 -v -6956 5120.99 2594.7 -vt 0.442643 0.331822 -v -6776 5120.99 2594.7 -vt 0.440981 0.331822 -o mesh1820 -s off -f 9180/9180/9180 9181/9181/9181 9182/9182/9182 -f 9180/9180/9180 9182/9182/9182 9183/9183/9183 -f 9180/9180/9180 9183/9183/9183 9184/9184/9184 -f 9180/9180/9180 9184/9184/9184 9185/9185/9185 -f 9186/9186/9186 9187/9187/9187 9188/9188/9188 -f 9186/9186/9186 9188/9188/9188 9189/9189/9189 -f 9186/9186/9186 9189/9189/9189 9190/9190/9190 -f 9191/9191/9191 9192/9192/9192 9193/9193/9193 -f 9191/9191/9191 9193/9193/9193 9194/9194/9194 -f 9195/9195/9195 9196/9196/9196 9197/9197/9197 -g charts -o chart0000 -s off -f 9180/9180/9180 9181/9181/9181 9182/9182/9182 -f 9180/9180/9180 9182/9182/9182 9183/9183/9183 -f 9180/9180/9180 9183/9183/9183 9184/9184/9184 -f 9180/9180/9180 9184/9184/9184 9185/9185/9185 -o chart0001 -s off -f 9186/9186/9186 9187/9187/9187 9188/9188/9188 -f 9186/9186/9186 9188/9188/9188 9189/9189/9189 -f 9186/9186/9186 9189/9189/9189 9190/9190/9190 -o chart0002 -s off -f 9191/9191/9191 9192/9192/9192 9193/9193/9193 -f 9191/9191/9191 9193/9193/9193 9194/9194/9194 -o chart0003 -s off -f 9195/9195/9195 9196/9196/9196 9197/9197/9197 -v -6956 16266 2594.7 -vt 0.880715 0.143034 -v -7991 16266 2594.7 -vt 0.880715 0.151278 -v -7991 16431 2594.7 -vt 0.882377 0.151278 -v -6956 16431 2594.7 -vt 0.882377 0.143034 -o mesh1821 -s off -f 9198/9198/9198 9199/9199/9199 9200/9200/9200 -f 9198/9198/9198 9200/9200/9200 9201/9201/9201 -g charts -o chart0000 -s off -f 9198/9198/9198 9199/9199/9199 9200/9200/9200 -f 9198/9198/9198 9200/9200/9200 9201/9201/9201 -v 16451.5 8180.99 -285.3 -vt 0.644638 0.993817 -v 16451.5 8180.99 6070.95 -vt 0.593932 0.993817 -v 16727.5 8180.99 6070.95 -vt 0.593932 0.991626 -v 19151.5 8180.99 6070.95 -vt 0.593932 0.972383 -v 19151.5 8180.99 -285.3 -vt 0.644638 0.972383 -o mesh1822 -s off -f 9202/9202/9202 9203/9203/9203 9204/9204/9204 -f 9202/9202/9202 9204/9204/9204 9205/9205/9205 -f 9202/9202/9202 9205/9205/9205 9206/9206/9206 -g charts -o chart0000 -s off -f 9202/9202/9202 9203/9203/9203 9204/9204/9204 -f 9202/9202/9202 9204/9204/9204 9205/9205/9205 -f 9202/9202/9202 9205/9205/9205 9206/9206/9206 -v 19151.5 8180.99 6070.95 -vt 0.658317 0.414262 -v 19151.5 9485.99 5759.7 -vt 0.655856 0.403989 -v 19151.5 8180.99 -285.3 -vt 0.608063 0.414262 -v 19151.5 11061 8230.95 -vt 0.675395 0.391591 -v 19151.5 12801 5759.7 -vt 0.655856 0.377894 -v 19151.5 13941 6070.95 -vt 0.658317 0.36892 -v 19151.5 12801 3854.7 -vt 0.640795 0.377894 -v 19151.5 12801 2159.7 -vt 0.627394 0.377894 -v 19151.5 12801 254.7 -vt 0.612333 0.377894 -v 19151.5 9485.99 254.7 -vt 0.612333 0.403989 -v 19151.5 13941 -285.3 -vt 0.608063 0.36892 -v 19151.5 9485.99 3854.7 -vt 0.640795 0.403989 -v 19151.5 9485.99 2159.7 -vt 0.627394 0.403989 -o mesh1823 -s off -f 9207/9207/9207 9208/9208/9208 9209/9209/9209 -f 9208/9208/9208 9207/9207/9207 9210/9210/9210 -f 9208/9208/9208 9210/9210/9210 9211/9211/9211 -f 9211/9211/9211 9210/9210/9210 9212/9212/9212 -f 9211/9211/9211 9212/9212/9212 9213/9213/9213 -f 9213/9213/9213 9212/9212/9212 9214/9214/9214 -f 9214/9214/9214 9212/9212/9212 9215/9215/9215 -f 9209/9209/9209 9216/9216/9216 9217/9217/9217 -f 9216/9216/9216 9209/9209/9209 9208/9208/9208 -f 9216/9216/9216 9208/9208/9208 9218/9218/9218 -f 9216/9216/9216 9218/9218/9218 9219/9219/9219 -f 9217/9217/9217 9216/9216/9216 9215/9215/9215 -f 9217/9217/9217 9215/9215/9215 9212/9212/9212 -f 9213/9213/9213 9219/9219/9219 9218/9218/9218 -f 9219/9219/9219 9213/9213/9213 9214/9214/9214 -g charts -o chart0000 -s off -f 9207/9207/9207 9208/9208/9208 9209/9209/9209 -f 9208/9208/9208 9207/9207/9207 9210/9210/9210 -f 9208/9208/9208 9210/9210/9210 9211/9211/9211 -f 9211/9211/9211 9210/9210/9210 9212/9212/9212 -f 9211/9211/9211 9212/9212/9212 9213/9213/9213 -f 9213/9213/9213 9212/9212/9212 9214/9214/9214 -f 9214/9214/9214 9212/9212/9212 9215/9215/9215 -f 9209/9209/9209 9216/9216/9216 9217/9217/9217 -f 9216/9216/9216 9209/9209/9209 9208/9208/9208 -f 9216/9216/9216 9208/9208/9208 9218/9218/9218 -f 9216/9216/9216 9218/9218/9218 9219/9219/9219 -f 9217/9217/9217 9216/9216/9216 9215/9215/9215 -f 9217/9217/9217 9215/9215/9215 9212/9212/9212 -f 9213/9213/9213 9219/9219/9219 9218/9218/9218 -f 9219/9219/9219 9213/9213/9213 9214/9214/9214 -v 19151.5 13941 -285.3 -vt 0.507481 0.300495 -v 18371.5 13941 284.7 -vt 0.502934 0.306687 -v 16451.5 13941 -285.3 -vt 0.507481 0.321929 -v 19151.5 13941 6070.95 -vt 0.456775 0.300495 -v 18371.5 13941 2204.7 -vt 0.487617 0.306687 -v 18371.5 13941 3884.7 -vt 0.474215 0.306687 -v 17291.5 13941 2204.7 -vt 0.487617 0.315261 -v 18371.5 13941 5804.7 -vt 0.458899 0.306687 -v 17292.1 13941 5804.7 -vt 0.458899 0.315256 -v 17291.5 13941 284.7 -vt 0.502934 0.315261 -v 16451.5 13941 6070.95 -vt 0.456775 0.321929 -v 17292.1 13941 3884.7 -vt 0.474215 0.315256 -v 16727.5 13941 6070.95 -vt 0.456775 0.319738 -o mesh1824 -s off -f 9220/9220/9220 9221/9221/9221 9222/9222/9222 -f 9221/9221/9221 9220/9220/9220 9223/9223/9223 -f 9221/9221/9221 9223/9223/9223 9224/9224/9224 -f 9224/9224/9224 9223/9223/9223 9225/9225/9225 -f 9224/9224/9224 9225/9225/9225 9226/9226/9226 -f 9225/9225/9225 9223/9223/9223 9227/9227/9227 -f 9227/9227/9227 9223/9223/9223 9228/9228/9228 -f 9222/9222/9222 9229/9229/9229 9230/9230/9230 -f 9229/9229/9229 9222/9222/9222 9221/9221/9221 -f 9230/9230/9230 9229/9229/9229 9226/9226/9226 -f 9230/9230/9230 9226/9226/9226 9231/9231/9231 -f 9231/9231/9231 9226/9226/9226 9225/9225/9225 -f 9230/9230/9230 9231/9231/9231 9228/9228/9228 -f 9230/9230/9230 9228/9228/9228 9232/9232/9232 -f 9232/9232/9232 9228/9228/9228 9223/9223/9223 -g charts -o chart0000 -s off -f 9220/9220/9220 9221/9221/9221 9222/9222/9222 -f 9221/9221/9221 9220/9220/9220 9223/9223/9223 -f 9221/9221/9221 9223/9223/9223 9224/9224/9224 -f 9224/9224/9224 9223/9223/9223 9225/9225/9225 -f 9224/9224/9224 9225/9225/9225 9226/9226/9226 -f 9225/9225/9225 9223/9223/9223 9227/9227/9227 -f 9227/9227/9227 9223/9223/9223 9228/9228/9228 -f 9222/9222/9222 9229/9229/9229 9230/9230/9230 -f 9229/9229/9229 9222/9222/9222 9221/9221/9221 -f 9230/9230/9230 9229/9229/9229 9226/9226/9226 -f 9230/9230/9230 9226/9226/9226 9231/9231/9231 -f 9231/9231/9231 9226/9226/9226 9225/9225/9225 -f 9230/9230/9230 9231/9231/9231 9228/9228/9228 -f 9230/9230/9230 9228/9228/9228 9232/9232/9232 -f 9232/9232/9232 9228/9228/9228 9223/9223/9223 -v 16286.5 5120.99 -285.3 -vt 0.762677 0.54279 -v 10856.5 5120.99 -285.3 -vt 0.762677 0.585738 -v 10856.5 18433.5 -285.3 -vt 0.657846 0.585738 -v 10856.5 20593.5 -285.3 -vt 0.640837 0.585738 -v 10856.5 22461 -285.3 -vt 0.626131 0.585738 -v 10856.5 23616 -285.3 -vt 0.617036 0.585738 -v 10856.5 23706 -285.3 -vt 0.616327 0.585738 -v 10856.5 24861 -285.3 -vt 0.607232 0.585738 -v 12146.5 24861 -285.3 -vt 0.607232 0.575535 -v 12236.5 24861 -285.3 -vt 0.607232 0.574823 -v 13526.5 24861 -285.3 -vt 0.607232 0.56462 -v 13616.5 24861 -285.3 -vt 0.607232 0.563908 -v 14906.5 24861 -285.3 -vt 0.607232 0.553705 -v 14996.5 24861 -285.3 -vt 0.607232 0.552993 -v 16286.5 24861 -285.3 -vt 0.607232 0.54279 -v 16286.5 23706 -285.3 -vt 0.616327 0.54279 -v 16286.5 23616 -285.3 -vt 0.617036 0.54279 -v 16286.5 22461 -285.3 -vt 0.626131 0.54279 -v 16286.5 13776 -285.3 -vt 0.694522 0.54279 -v 18986.5 13776 -285.3 -vt 0.694522 0.521434 -v 18986.5 8345.99 -285.3 -vt 0.737281 0.521434 -v 16286.5 5120.99 -285.3 -vt 0.63217 0.699505 -v 18986.5 8345.99 -285.3 -vt 0.657938 0.678071 -v 16286.5 8345.99 -285.3 -vt 0.657938 0.699505 -o mesh1825 -s off -f 9233/9233/9233 9234/9234/9234 9235/9235/9235 -f 9233/9233/9233 9235/9235/9235 9236/9236/9236 -f 9233/9233/9233 9236/9236/9236 9237/9237/9237 -f 9233/9233/9233 9237/9237/9237 9238/9238/9238 -f 9233/9233/9233 9238/9238/9238 9239/9239/9239 -f 9233/9233/9233 9239/9239/9239 9240/9240/9240 -f 9233/9233/9233 9240/9240/9240 9241/9241/9241 -f 9233/9233/9233 9241/9241/9241 9242/9242/9242 -f 9233/9233/9233 9242/9242/9242 9243/9243/9243 -f 9233/9233/9233 9243/9243/9243 9244/9244/9244 -f 9233/9233/9233 9244/9244/9244 9245/9245/9245 -f 9233/9233/9233 9245/9245/9245 9246/9246/9246 -f 9233/9233/9233 9246/9246/9246 9247/9247/9247 -f 9233/9233/9233 9247/9247/9247 9248/9248/9248 -f 9233/9233/9233 9248/9248/9248 9249/9249/9249 -f 9233/9233/9233 9249/9249/9249 9250/9250/9250 -f 9233/9233/9233 9250/9250/9250 9251/9251/9251 -f 9233/9233/9233 9251/9251/9251 9252/9252/9252 -f 9233/9233/9233 9252/9252/9252 9253/9253/9253 -f 9254/9254/9254 9255/9255/9255 9256/9256/9256 -g charts -o chart0000 -s off -f 9233/9233/9233 9234/9234/9234 9235/9235/9235 -f 9233/9233/9233 9235/9235/9235 9236/9236/9236 -f 9233/9233/9233 9236/9236/9236 9237/9237/9237 -f 9233/9233/9233 9237/9237/9237 9238/9238/9238 -f 9233/9233/9233 9238/9238/9238 9239/9239/9239 -f 9233/9233/9233 9239/9239/9239 9240/9240/9240 -f 9233/9233/9233 9240/9240/9240 9241/9241/9241 -f 9233/9233/9233 9241/9241/9241 9242/9242/9242 -f 9233/9233/9233 9242/9242/9242 9243/9243/9243 -f 9233/9233/9233 9243/9243/9243 9244/9244/9244 -f 9233/9233/9233 9244/9244/9244 9245/9245/9245 -f 9233/9233/9233 9245/9245/9245 9246/9246/9246 -f 9233/9233/9233 9246/9246/9246 9247/9247/9247 -f 9233/9233/9233 9247/9247/9247 9248/9248/9248 -f 9233/9233/9233 9248/9248/9248 9249/9249/9249 -f 9233/9233/9233 9249/9249/9249 9250/9250/9250 -f 9233/9233/9233 9250/9250/9250 9251/9251/9251 -f 9233/9233/9233 9251/9251/9251 9252/9252/9252 -f 9233/9233/9233 9252/9252/9252 9253/9253/9253 -o chart0001 -s off -f 9254/9254/9254 9255/9255/9255 9256/9256/9256 -v 18986.5 8345.99 -285.3 -vt 0.963009 0.311212 -v 18986.5 9485.99 254.7 -vt 0.953934 0.306978 -v 18986.5 8345.99 6194.7 -vt 0.963009 0.260402 -v 18986.5 13776 -285.3 -vt 0.919784 0.311212 -v 18986.5 12801 254.7 -vt 0.927545 0.306978 -v 18986.5 12801 2159.7 -vt 0.927545 0.29204 -v 18986.5 12801 3854.7 -vt 0.927545 0.27875 -v 18986.5 12801 5759.7 -vt 0.927545 0.263813 -v 18986.5 13776 6194.7 -vt 0.919784 0.260402 -v 18986.5 9485.99 5759.7 -vt 0.953934 0.263813 -v 18986.5 11061 8230.95 -vt 0.941396 0.244435 -v 18986.5 9485.99 2159.7 -vt 0.953934 0.29204 -v 18986.5 9485.99 3854.7 -vt 0.953934 0.27875 -o mesh1826 -s off -f 9257/9257/9257 9258/9258/9258 9259/9259/9259 -f 9258/9258/9258 9257/9257/9257 9260/9260/9260 -f 9258/9258/9258 9260/9260/9260 9261/9261/9261 -f 9261/9261/9261 9260/9260/9260 9262/9262/9262 -f 9262/9262/9262 9260/9260/9260 9263/9263/9263 -f 9263/9263/9263 9260/9260/9260 9264/9264/9264 -f 9264/9264/9264 9260/9260/9260 9265/9265/9265 -f 9259/9259/9259 9266/9266/9266 9267/9267/9267 -f 9266/9266/9266 9259/9259/9259 9258/9258/9258 -f 9266/9266/9266 9258/9258/9258 9268/9268/9268 -f 9266/9266/9266 9268/9268/9268 9269/9269/9269 -f 9267/9267/9267 9266/9266/9266 9264/9264/9264 -f 9267/9267/9267 9264/9264/9264 9265/9265/9265 -f 9262/9262/9262 9269/9269/9269 9268/9268/9268 -f 9269/9269/9269 9262/9262/9262 9263/9263/9263 -g charts -o chart0000 -s off -f 9257/9257/9257 9258/9258/9258 9259/9259/9259 -f 9258/9258/9258 9257/9257/9257 9260/9260/9260 -f 9258/9258/9258 9260/9260/9260 9261/9261/9261 -f 9261/9261/9261 9260/9260/9260 9262/9262/9262 -f 9262/9262/9262 9260/9260/9260 9263/9263/9263 -f 9263/9263/9263 9260/9260/9260 9264/9264/9264 -f 9264/9264/9264 9260/9260/9260 9265/9265/9265 -f 9259/9259/9259 9266/9266/9266 9267/9267/9267 -f 9266/9266/9266 9259/9259/9259 9258/9258/9258 -f 9266/9266/9266 9258/9258/9258 9268/9268/9268 -f 9266/9266/9266 9268/9268/9268 9269/9269/9269 -f 9267/9267/9267 9266/9266/9266 9264/9264/9264 -f 9267/9267/9267 9264/9264/9264 9265/9265/9265 -f 9262/9262/9262 9269/9269/9269 9268/9268/9268 -f 9269/9269/9269 9262/9262/9262 9263/9263/9263 -v 18986.5 8345.99 -285.3 -vt 0.0926849 0.41014 -v 18986.5 8345.99 6194.7 -vt 0.0411471 0.41014 -v 16562.5 8345.99 6194.7 -vt 0.0411471 0.390897 -v 16286.5 8345.99 6194.7 -vt 0.0411471 0.388706 -v 16286.5 8345.99 -285.3 -vt 0.0926849 0.388706 -o mesh1827 -s off -f 9270/9270/9270 9271/9271/9271 9272/9272/9272 -f 9270/9270/9270 9272/9272/9272 9273/9273/9273 -f 9270/9270/9270 9273/9273/9273 9274/9274/9274 -g charts -o chart0000 -s off -f 9270/9270/9270 9271/9271/9271 9272/9272/9272 -f 9270/9270/9270 9272/9272/9272 9273/9273/9273 -f 9270/9270/9270 9273/9273/9273 9274/9274/9274 -v 16286.5 13776 -285.3 -vt 0.425187 0.992992 -v 17291.5 13776 284.7 -vt 0.420654 0.985014 -v 18986.5 13776 -285.3 -vt 0.425187 0.971558 -v 16286.5 13776 6194.7 -vt 0.373649 0.992992 -v 17291.5 13776 2204.7 -vt 0.405383 0.985014 -v 17292.1 13776 3884.7 -vt 0.392021 0.985009 -v 18371.5 13776 2204.7 -vt 0.405383 0.97644 -v 17292.1 13776 5804.7 -vt 0.376751 0.985009 -v 18371.5 13776 5804.7 -vt 0.376751 0.97644 -v 18986.5 13776 6194.7 -vt 0.373649 0.971558 -v 16562.5 13776 6194.7 -vt 0.373649 0.990801 -v 18371.5 13776 284.7 -vt 0.420654 0.97644 -v 18371.5 13776 3884.7 -vt 0.392021 0.97644 -o mesh1828 -s off -f 9275/9275/9275 9276/9276/9276 9277/9277/9277 -f 9276/9276/9276 9275/9275/9275 9278/9278/9278 -f 9276/9276/9276 9278/9278/9278 9279/9279/9279 -f 9279/9279/9279 9278/9278/9278 9280/9280/9280 -f 9279/9279/9279 9280/9280/9280 9281/9281/9281 -f 9280/9280/9280 9278/9278/9278 9282/9282/9282 -f 9282/9282/9282 9278/9278/9278 9283/9283/9283 -f 9283/9283/9283 9278/9278/9278 9284/9284/9284 -f 9284/9284/9284 9278/9278/9278 9285/9285/9285 -f 9277/9277/9277 9286/9286/9286 9284/9284/9284 -f 9286/9286/9286 9277/9277/9277 9276/9276/9276 -f 9284/9284/9284 9286/9286/9286 9281/9281/9281 -f 9284/9284/9284 9281/9281/9281 9287/9287/9287 -f 9287/9287/9287 9281/9281/9281 9280/9280/9280 -f 9284/9284/9284 9287/9287/9287 9283/9283/9283 -g charts -o chart0000 -s off -f 9275/9275/9275 9276/9276/9276 9277/9277/9277 -f 9276/9276/9276 9275/9275/9275 9278/9278/9278 -f 9276/9276/9276 9278/9278/9278 9279/9279/9279 -f 9279/9279/9279 9278/9278/9278 9280/9280/9280 -f 9279/9279/9279 9280/9280/9280 9281/9281/9281 -f 9280/9280/9280 9278/9278/9278 9282/9282/9282 -f 9282/9282/9282 9278/9278/9278 9283/9283/9283 -f 9283/9283/9283 9278/9278/9278 9284/9284/9284 -f 9284/9284/9284 9278/9278/9278 9285/9285/9285 -f 9277/9277/9277 9286/9286/9286 9284/9284/9284 -f 9286/9286/9286 9277/9277/9277 9276/9276/9276 -f 9284/9284/9284 9286/9286/9286 9281/9281/9281 -f 9284/9284/9284 9281/9281/9281 9287/9287/9287 -f 9287/9287/9287 9281/9281/9281 9280/9280/9280 -f 9284/9284/9284 9287/9287/9287 9283/9283/9283 -v 16286.5 5120.99 -285.3 -vt 0.909809 0.117477 -v 16286.5 5120.99 6194.7 -vt 0.909809 0.0666671 -v 14794.3 5120.99 7313.82 -vt 0.921687 0.057892 -v 13571.5 5120.99 8230.95 -vt 0.931421 0.0507007 -v 10856.5 5120.99 6194.7 -vt 0.953034 0.0666671 -v 10856.5 5120.99 -285.3 -vt 0.953034 0.117477 -o mesh1829 -s off -f 9288/9288/9288 9289/9289/9289 9290/9290/9290 -f 9288/9288/9288 9290/9290/9290 9291/9291/9291 -f 9288/9288/9288 9291/9291/9291 9292/9292/9292 -f 9288/9288/9288 9292/9292/9292 9293/9293/9293 -g charts -o chart0000 -s off -f 9288/9288/9288 9289/9289/9289 9290/9290/9290 -f 9288/9288/9288 9290/9290/9290 9291/9291/9291 -f 9288/9288/9288 9291/9291/9291 9292/9292/9292 -f 9288/9288/9288 9292/9292/9292 9293/9293/9293 -v 16286.5 8345.99 -285.3 -vt 0.996259 0.910552 -v 16286.5 8345.99 6194.7 -vt 0.996259 0.859439 -v 16286.5 8069.99 6194.7 -vt 0.994054 0.859439 -v 16286.5 5120.99 6194.7 -vt 0.97049 0.859439 -v 16286.5 5120.99 -285.3 -vt 0.97049 0.910552 -o mesh1830 -s off -f 9294/9294/9294 9295/9295/9295 9296/9296/9296 -f 9294/9294/9294 9296/9296/9296 9297/9297/9297 -f 9294/9294/9294 9297/9297/9297 9298/9298/9298 -g charts -o chart0000 -s off -f 9294/9294/9294 9295/9295/9295 9296/9296/9296 -f 9294/9294/9294 9296/9296/9296 9297/9297/9297 -f 9294/9294/9294 9297/9297/9297 9298/9298/9298 -v 16451.5 4955.99 -285.3 -vt 0.925603 0.992168 -v 16451.5 4955.99 6070.95 -vt 0.874896 0.992168 -v 16451.5 7904.99 6070.95 -vt 0.874896 0.968799 -v 16451.5 8180.99 6070.95 -vt 0.874896 0.966612 -v 16451.5 8180.99 -285.3 -vt 0.925603 0.966612 -o mesh1831 -s off -f 9299/9299/9299 9300/9300/9300 9301/9301/9301 -f 9299/9299/9299 9301/9301/9301 9302/9302/9302 -f 9299/9299/9299 9302/9302/9302 9303/9303/9303 -g charts -o chart0000 -s off -f 9299/9299/9299 9300/9300/9300 9301/9301/9301 -f 9299/9299/9299 9301/9301/9301 9302/9302/9302 -f 9299/9299/9299 9302/9302/9302 9303/9303/9303 -v 10691.5 22461 -285.3 -vt 0.391596 0.667354 -v 10691.5 20593.5 2594.7 -vt 0.376822 0.644568 -v 10691.5 20593.5 -285.3 -vt 0.376822 0.667354 -v 10691.5 23616 2594.7 -vt 0.400733 0.644568 -v 10691.5 22558.5 3884.7 -vt 0.392367 0.634362 -v 10691.5 22461 2594.7 -vt 0.391596 0.644568 -v 10691.5 24763.5 3884.7 -vt 0.40981 0.634362 -v 10691.5 23706 2594.7 -vt 0.401445 0.644568 -v 10691.5 24861 2594.7 -vt 0.410582 0.644568 -v 10691.5 24763.5 5804.7 -vt 0.40981 0.619172 -v 10691.5 25026 -285.3 -vt 0.411887 0.667354 -v 10691.5 24861 -285.3 -vt 0.410582 0.667354 -v 10691.5 5855.99 -285.3 -vt 0.260237 0.667354 -v 10691.5 4955.99 6070.95 -vt 0.253117 0.617065 -v 10691.5 4955.99 -285.3 -vt 0.253117 0.667354 -v 10691.5 22558.5 5804.7 -vt 0.392367 0.619172 -v 10691.5 25026 6070.95 -vt 0.411887 0.617065 -v 10691.5 6020.99 -285.3 -vt 0.261542 0.667354 -v 10691.5 18433.5 2594.7 -vt 0.359735 0.644568 -v 10691.5 16626 -285.3 -vt 0.345436 0.667354 -v 10691.5 16791 -285.3 -vt 0.346741 0.667354 -v 10691.5 18433.5 -285.3 -vt 0.359735 0.667354 -o mesh1832 -s off -f 9304/9304/9304 9305/9305/9305 9306/9306/9306 -f 9307/9307/9307 9308/9308/9308 9309/9309/9309 -f 9308/9308/9308 9307/9307/9307 9310/9310/9310 -f 9310/9310/9310 9307/9307/9307 9311/9311/9311 -f 9310/9310/9310 9311/9311/9311 9312/9312/9312 -f 9310/9310/9310 9312/9312/9312 9313/9313/9313 -f 9314/9314/9314 9312/9312/9312 9315/9315/9315 -f 9316/9316/9316 9317/9317/9317 9318/9318/9318 -f 9317/9317/9317 9316/9316/9316 9319/9319/9319 -f 9317/9317/9317 9319/9319/9319 9320/9320/9320 -f 9319/9319/9319 9316/9316/9316 9321/9321/9321 -f 9319/9319/9319 9321/9321/9321 9322/9322/9322 -f 9322/9322/9322 9321/9321/9321 9323/9323/9323 -f 9322/9322/9322 9323/9323/9323 9324/9324/9324 -f 9322/9322/9322 9324/9324/9324 9325/9325/9325 -f 9319/9319/9319 9322/9322/9322 9305/9305/9305 -f 9319/9319/9319 9305/9305/9305 9309/9309/9309 -f 9309/9309/9309 9305/9305/9305 9304/9304/9304 -f 9319/9319/9319 9309/9309/9309 9308/9308/9308 -f 9320/9320/9320 9319/9319/9319 9313/9313/9313 -f 9320/9320/9320 9313/9313/9313 9312/9312/9312 -f 9320/9320/9320 9312/9312/9312 9314/9314/9314 -g charts -o chart0000 -s off -f 9304/9304/9304 9305/9305/9305 9306/9306/9306 -f 9307/9307/9307 9308/9308/9308 9309/9309/9309 -f 9308/9308/9308 9307/9307/9307 9310/9310/9310 -f 9310/9310/9310 9307/9307/9307 9311/9311/9311 -f 9310/9310/9310 9311/9311/9311 9312/9312/9312 -f 9310/9310/9310 9312/9312/9312 9313/9313/9313 -f 9314/9314/9314 9312/9312/9312 9315/9315/9315 -f 9316/9316/9316 9317/9317/9317 9318/9318/9318 -f 9317/9317/9317 9316/9316/9316 9319/9319/9319 -f 9317/9317/9317 9319/9319/9319 9320/9320/9320 -f 9319/9319/9319 9316/9316/9316 9321/9321/9321 -f 9319/9319/9319 9321/9321/9321 9322/9322/9322 -f 9322/9322/9322 9321/9321/9321 9323/9323/9323 -f 9322/9322/9322 9323/9323/9323 9324/9324/9324 -f 9322/9322/9322 9324/9324/9324 9325/9325/9325 -f 9319/9319/9319 9322/9322/9322 9305/9305/9305 -f 9319/9319/9319 9305/9305/9305 9309/9309/9309 -f 9309/9309/9309 9305/9305/9305 9304/9304/9304 -f 9319/9319/9319 9309/9309/9309 9308/9308/9308 -f 9320/9320/9320 9319/9319/9319 9313/9313/9313 -f 9320/9320/9320 9313/9313/9313 9312/9312/9312 -f 9320/9320/9320 9312/9312/9312 9314/9314/9314 -v 10691.5 4955.99 -285.3 -vt 0.258105 0.941055 -v 10691.5 4955.99 6070.95 -vt 0.207851 0.941055 -v 13571.5 4955.99 8230.95 -vt 0.190773 0.918384 -v 14915.4 4955.99 7223.05 -vt 0.198742 0.907805 -v 16451.5 4955.99 6070.95 -vt 0.207851 0.895713 -v 16451.5 4955.99 -285.3 -vt 0.258105 0.895713 -o mesh1833 -s off -f 9326/9326/9326 9327/9327/9327 9328/9328/9328 -f 9326/9326/9326 9328/9328/9328 9329/9329/9329 -f 9326/9326/9326 9329/9329/9329 9330/9330/9330 -f 9326/9326/9326 9330/9330/9330 9331/9331/9331 -g charts -o chart0000 -s off -f 9326/9326/9326 9327/9327/9327 9328/9328/9328 -f 9326/9326/9326 9328/9328/9328 9329/9329/9329 -f 9326/9326/9326 9329/9329/9329 9330/9330/9330 -f 9326/9326/9326 9330/9330/9330 9331/9331/9331 -v 18986.5 13776 6194.7 -vt 0.988774 0.215092 -v 16562.5 13776 6194.7 -vt 0.988774 0.195796 -v 16727.5 13941 6070.95 -vt 0.99044 0.197109 -v 19151.5 13941 6070.95 -vt 0.99044 0.216406 -v 19151.5 11061 8230.95 -vt 0.961347 0.216405 -v 18986.5 11061 8230.95 -vt 0.961347 0.215092 -o mesh1834 -s off -f 9332/9332/9332 9333/9333/9333 9334/9334/9334 -f 9332/9332/9332 9334/9334/9334 9335/9335/9335 -f 9332/9332/9332 9335/9335/9335 9336/9336/9336 -f 9332/9332/9332 9336/9336/9336 9337/9337/9337 -g charts -o chart0000 -s off -f 9332/9332/9332 9333/9333/9333 9334/9334/9334 -f 9332/9332/9332 9334/9334/9334 9335/9335/9335 -f 9332/9332/9332 9335/9335/9335 9336/9336/9336 -f 9332/9332/9332 9336/9336/9336 9337/9337/9337 -v 16286.5 8345.99 6194.7 -vt 0.776808 0.532152 -v 16562.5 8345.99 6194.7 -vt 0.774207 0.532152 -v 16727.5 8180.99 6070.95 -vt 0.772652 0.5338 -v 16451.5 8180.99 6070.95 -vt 0.775253 0.5338 -o mesh1835 -s off -f 9338/9338/9338 9339/9339/9339 9340/9340/9340 -f 9338/9338/9338 9340/9340/9340 9341/9341/9341 -g charts -o chart0000 -s off -f 9338/9338/9338 9339/9339/9339 9340/9340/9340 -f 9338/9338/9338 9340/9340/9340 9341/9341/9341 -v 18986.5 11061 8230.95 -vt 0.00290946 0.727894 -v 19151.5 11061 8230.95 -vt 0.00290939 0.729184 -v 19151.5 8180.99 6070.95 -vt 0.0320032 0.729184 -v 16727.5 8180.99 6070.95 -vt 0.0320032 0.710238 -v 16562.5 8345.99 6194.7 -vt 0.0303365 0.708948 -v 18986.5 8345.99 6194.7 -vt 0.0118058 0.702803 -o mesh1836 -s off -f 9342/9342/9342 9343/9343/9343 9344/9344/9344 -f 9342/9342/9342 9344/9344/9344 9345/9345/9345 -f 9342/9342/9342 9345/9345/9345 9346/9346/9346 -f 9342/9342/9342 9346/9346/9346 9347/9347/9347 -g charts -o chart0000 -s off -f 9342/9342/9342 9343/9343/9343 9344/9344/9344 -f 9342/9342/9342 9344/9344/9344 9345/9345/9345 -f 9342/9342/9342 9345/9345/9345 9346/9346/9346 -f 9342/9342/9342 9346/9346/9346 9347/9347/9347 -v 16286.5 13776 6194.7 -vt 0.908978 0.0581204 -v 16451.5 13941 6070.95 -vt 0.910533 0.059769 -v 16727.5 13941 6070.95 -vt 0.913134 0.0597691 -v 16562.5 13776 6194.7 -vt 0.911579 0.0581204 -o mesh1837 -s off -f 9348/9348/9348 9349/9349/9349 9350/9350/9350 -f 9348/9348/9348 9350/9350/9350 9351/9351/9351 -g charts -o chart0000 -s off -f 9348/9348/9348 9349/9349/9349 9350/9350/9350 -f 9348/9348/9348 9350/9350/9350 9351/9351/9351 -v 13571.5 5120.99 8230.95 -vt 0.00710605 0.000412201 -v 13571.5 4955.99 8230.95 -vt 0.000415628 0.000412201 -v 10691.5 4955.99 6070.95 -vt 0.000415628 0.145507 -v 10691.5 25026 6070.95 -vt 0.814214 0.145507 -v 13571.5 25026 8230.95 -vt 0.814214 0.000412201 -v 13571.5 24861 8230.95 -vt 0.807524 0.000412201 -v 10856.5 24861 6194.7 -vt 0.807524 0.137194 -v 10856.5 5120.99 6194.7 -vt 0.00710605 0.137194 -o mesh1838 -s off -f 9352/9352/9352 9353/9353/9353 9354/9354/9354 -f 9352/9352/9352 9354/9354/9354 9355/9355/9355 -f 9352/9352/9352 9355/9355/9355 9356/9356/9356 -f 9352/9352/9352 9356/9356/9356 9357/9357/9357 -f 9352/9352/9352 9357/9357/9357 9358/9358/9358 -f 9352/9352/9352 9358/9358/9358 9359/9359/9359 -g charts -o chart0000 -s off -f 9352/9352/9352 9353/9353/9353 9354/9354/9354 -f 9352/9352/9352 9354/9354/9354 9355/9355/9355 -f 9352/9352/9352 9355/9355/9355 9356/9356/9356 -f 9352/9352/9352 9356/9356/9356 9357/9357/9357 -f 9352/9352/9352 9357/9357/9357 9358/9358/9358 -f 9352/9352/9352 9358/9358/9358 9359/9359/9359 -v 16451.5 4955.99 6070.95 -vt 0.783458 0.306265 -v 14915.4 4955.99 7223.05 -vt 0.783458 0.321549 -v 14794.3 5120.99 7313.82 -vt 0.782137 0.322753 -v 16286.5 5120.99 6194.7 -vt 0.782136 0.307907 -v 16286.5 8069.99 6194.7 -vt 0.75852 0.307907 -v 16451.5 7904.99 6070.95 -vt 0.759842 0.306266 -o mesh1839 -s off -f 9360/9360/9360 9361/9361/9361 9362/9362/9362 -f 9360/9360/9360 9362/9362/9362 9363/9363/9363 -f 9360/9360/9360 9363/9363/9363 9364/9364/9364 -f 9360/9360/9360 9364/9364/9364 9365/9365/9365 -g charts -o chart0000 -s off -f 9360/9360/9360 9361/9361/9361 9362/9362/9362 -f 9360/9360/9360 9362/9362/9362 9363/9363/9363 -f 9360/9360/9360 9363/9363/9363 9364/9364/9364 -f 9360/9360/9360 9364/9364/9364 9365/9365/9365 -v 13571.5 4955.99 8230.95 -vt 0.662926 0.523908 -v 13571.5 5120.99 8230.95 -vt 0.662926 0.522259 -v 14794.3 5120.99 7313.82 -vt 0.650824 0.522259 -v 14915.4 4955.99 7223.05 -vt 0.649626 0.523908 -o mesh1840 -s off -f 9366/9366/9366 9367/9367/9367 9368/9368/9368 -f 9366/9366/9366 9368/9368/9368 9369/9369/9369 -g charts -o chart0000 -s off -f 9366/9366/9366 9367/9367/9367 9368/9368/9368 -f 9366/9366/9366 9368/9368/9368 9369/9369/9369 -v 16451.5 7904.99 6070.95 -vt 0.0137157 0.740725 -v 16286.5 8069.99 6194.7 -vt 0.0153781 0.742268 -v 16286.5 8345.99 6194.7 -vt 0.0153781 0.744847 -v 16451.5 8180.99 6070.95 -vt 0.0137157 0.743305 -o mesh1841 -s off -f 9370/9370/9370 9371/9371/9371 9372/9372/9372 -f 9370/9370/9370 9372/9372/9372 9373/9373/9373 -g charts -o chart0000 -s off -f 9370/9370/9370 9371/9371/9371 9372/9372/9372 -f 9370/9370/9370 9372/9372/9372 9373/9373/9373 -v 16451.5 25026 -285.3 -vt 0.864921 0.0696619 -v 16286.5 25026 2594.7 -vt 0.863611 0.0470797 -v 16286.5 25026 -285.3 -vt 0.863611 0.0696619 -v 16451.5 25026 6070.95 -vt 0.864921 0.0198221 -v 14996.5 25026 2594.7 -vt 0.853372 0.0470796 -v 14906.5 25026 2594.7 -vt 0.852658 0.0470796 -v 15236.5 25026 3899.7 -vt 0.855277 0.036847 -v 13616.5 25026 2594.7 -vt 0.842419 0.0470796 -v 13526.5 25026 2594.7 -vt 0.841704 0.0470796 -v 12236.5 25026 2594.7 -vt 0.831465 0.0470796 -v 12146.5 25026 2594.7 -vt 0.830751 0.0470796 -v 10856.5 25026 2594.7 -vt 0.820512 0.0470796 -v 15236.5 25026 5819.7 -vt 0.855277 0.0217921 -v 11906.5 25026 5819.7 -vt 0.828846 0.0217921 -v 10691.5 25026 -285.3 -vt 0.819202 0.0696619 -v 10856.5 25026 -285.3 -vt 0.820512 0.0696619 -v 10691.5 25026 6070.95 -vt 0.819202 0.0198221 -v 11906.5 25026 3899.7 -vt 0.828846 0.036847 -v 14206.6 25026 7754.62 -vt 0.847103 0.00662039 -v 13571.5 25026 8230.95 -vt 0.842062 0.00288541 -v 12146.5 25026 -285.3 -vt 0.830751 0.0696619 -v 12236.5 25026 -285.3 -vt 0.831465 0.0696619 -v 13616.5 25026 -285.3 -vt 0.842419 0.0696619 -v 13526.5 25026 -285.3 -vt 0.841704 0.0696619 -v 14996.5 25026 -285.3 -vt 0.853372 0.0696619 -v 14906.5 25026 -285.3 -vt 0.852658 0.0696619 -o mesh1842 -s off -f 9374/9374/9374 9375/9375/9375 9376/9376/9376 -f 9375/9375/9375 9374/9374/9374 9377/9377/9377 -f 9375/9375/9375 9377/9377/9377 9378/9378/9378 -f 9378/9378/9378 9377/9377/9377 9379/9379/9379 -f 9379/9379/9379 9377/9377/9377 9380/9380/9380 -f 9379/9379/9379 9380/9380/9380 9381/9381/9381 -f 9381/9381/9381 9380/9380/9380 9382/9382/9382 -f 9382/9382/9382 9380/9380/9380 9383/9383/9383 -f 9383/9383/9383 9380/9380/9380 9384/9384/9384 -f 9384/9384/9384 9380/9380/9380 9385/9385/9385 -f 9380/9380/9380 9377/9377/9377 9386/9386/9386 -f 9386/9386/9386 9377/9377/9377 9387/9387/9387 -f 9385/9385/9385 9388/9388/9388 9389/9389/9389 -f 9388/9388/9388 9385/9385/9385 9390/9390/9390 -f 9390/9390/9390 9385/9385/9385 9391/9391/9391 -f 9391/9391/9391 9385/9385/9385 9380/9380/9380 -f 9390/9390/9390 9391/9391/9391 9387/9387/9387 -f 9390/9390/9390 9387/9387/9387 9377/9377/9377 -f 9390/9390/9390 9377/9377/9377 9392/9392/9392 -f 9390/9390/9390 9392/9392/9392 9393/9393/9393 -f 9383/9383/9383 9394/9394/9394 9395/9395/9395 -f 9394/9394/9394 9383/9383/9383 9384/9384/9384 -f 9396/9396/9396 9382/9382/9382 9397/9397/9397 -f 9382/9382/9382 9396/9396/9396 9381/9381/9381 -f 9398/9398/9398 9379/9379/9379 9399/9399/9399 -f 9379/9379/9379 9398/9398/9398 9378/9378/9378 -g charts -o chart0000 -s off -f 9374/9374/9374 9375/9375/9375 9376/9376/9376 -f 9375/9375/9375 9374/9374/9374 9377/9377/9377 -f 9375/9375/9375 9377/9377/9377 9378/9378/9378 -f 9378/9378/9378 9377/9377/9377 9379/9379/9379 -f 9379/9379/9379 9377/9377/9377 9380/9380/9380 -f 9379/9379/9379 9380/9380/9380 9381/9381/9381 -f 9381/9381/9381 9380/9380/9380 9382/9382/9382 -f 9382/9382/9382 9380/9380/9380 9383/9383/9383 -f 9383/9383/9383 9380/9380/9380 9384/9384/9384 -f 9384/9384/9384 9380/9380/9380 9385/9385/9385 -f 9380/9380/9380 9377/9377/9377 9386/9386/9386 -f 9386/9386/9386 9377/9377/9377 9387/9387/9387 -f 9385/9385/9385 9388/9388/9388 9389/9389/9389 -f 9388/9388/9388 9385/9385/9385 9390/9390/9390 -f 9390/9390/9390 9385/9385/9385 9391/9391/9391 -f 9391/9391/9391 9385/9385/9385 9380/9380/9380 -f 9390/9390/9390 9391/9391/9391 9387/9387/9387 -f 9390/9390/9390 9387/9387/9387 9377/9377/9377 -f 9390/9390/9390 9377/9377/9377 9392/9392/9392 -f 9390/9390/9390 9392/9392/9392 9393/9393/9393 -f 9383/9383/9383 9394/9394/9394 9395/9395/9395 -f 9394/9394/9394 9383/9383/9383 9384/9384/9384 -f 9396/9396/9396 9382/9382/9382 9397/9397/9397 -f 9382/9382/9382 9396/9396/9396 9381/9381/9381 -f 9398/9398/9398 9379/9379/9379 9399/9399/9399 -f 9379/9379/9379 9398/9398/9398 9378/9378/9378 -v 10856.5 24861 6194.7 -vt 0.946384 0.608518 -v 12146.5 24861 2594.7 -vt 0.936115 0.58029 -v 10856.5 24861 2594.7 -vt 0.946384 0.58029 -v 12236.5 24861 2594.7 -vt 0.935399 0.58029 -v 11906.5 24861 3899.7 -vt 0.938026 0.590523 -v 13526.5 24861 2594.7 -vt 0.92513 0.58029 -v 13616.5 24861 2594.7 -vt 0.924413 0.58029 -v 14906.5 24861 2594.7 -vt 0.914144 0.58029 -v 14996.5 24861 2594.7 -vt 0.913428 0.58029 -v 16286.5 24861 2594.7 -vt 0.903159 0.58029 -v 11906.5 24861 5819.7 -vt 0.938026 0.605578 -v 15236.5 24861 5819.7 -vt 0.911517 0.605578 -v 16286.5 24861 6194.7 -vt 0.903159 0.608518 -v 14182.2 24861 7772.92 -vt 0.91991 0.620893 -v 13571.5 24861 8230.95 -vt 0.924771 0.624485 -v 15236.5 24861 3899.7 -vt 0.911517 0.590523 -v 14906.5 24861 -285.3 -vt 0.914144 0.557708 -v 14996.5 24861 -285.3 -vt 0.913428 0.557708 -v 13616.5 24861 -285.3 -vt 0.924413 0.557708 -v 13526.5 24861 -285.3 -vt 0.92513 0.557708 -v 12236.5 24861 -285.3 -vt 0.935399 0.557708 -v 12146.5 24861 -285.3 -vt 0.936115 0.557708 -o mesh1843 -s off -f 9400/9400/9400 9401/9401/9401 9402/9402/9402 -f 9401/9401/9401 9400/9400/9400 9403/9403/9403 -f 9403/9403/9403 9400/9400/9400 9404/9404/9404 -f 9403/9403/9403 9404/9404/9404 9405/9405/9405 -f 9405/9405/9405 9404/9404/9404 9406/9406/9406 -f 9406/9406/9406 9404/9404/9404 9407/9407/9407 -f 9407/9407/9407 9404/9404/9404 9408/9408/9408 -f 9408/9408/9408 9404/9404/9404 9409/9409/9409 -f 9404/9404/9404 9400/9400/9400 9410/9410/9410 -f 9410/9410/9410 9400/9400/9400 9411/9411/9411 -f 9411/9411/9411 9400/9400/9400 9412/9412/9412 -f 9412/9412/9412 9400/9400/9400 9413/9413/9413 -f 9413/9413/9413 9400/9400/9400 9414/9414/9414 -f 9409/9409/9409 9415/9415/9415 9412/9412/9412 -f 9415/9415/9415 9409/9409/9409 9404/9404/9404 -f 9412/9412/9412 9415/9415/9415 9411/9411/9411 -f 9416/9416/9416 9408/9408/9408 9417/9417/9417 -f 9408/9408/9408 9416/9416/9416 9407/9407/9407 -f 9405/9405/9405 9418/9418/9418 9419/9419/9419 -f 9418/9418/9418 9405/9405/9405 9406/9406/9406 -f 9401/9401/9401 9420/9420/9420 9421/9421/9421 -f 9420/9420/9420 9401/9401/9401 9403/9403/9403 -g charts -o chart0000 -s off -f 9400/9400/9400 9401/9401/9401 9402/9402/9402 -f 9401/9401/9401 9400/9400/9400 9403/9403/9403 -f 9403/9403/9403 9400/9400/9400 9404/9404/9404 -f 9403/9403/9403 9404/9404/9404 9405/9405/9405 -f 9405/9405/9405 9404/9404/9404 9406/9406/9406 -f 9406/9406/9406 9404/9404/9404 9407/9407/9407 -f 9407/9407/9407 9404/9404/9404 9408/9408/9408 -f 9408/9408/9408 9404/9404/9404 9409/9409/9409 -f 9404/9404/9404 9400/9400/9400 9410/9410/9410 -f 9410/9410/9410 9400/9400/9400 9411/9411/9411 -f 9411/9411/9411 9400/9400/9400 9412/9412/9412 -f 9412/9412/9412 9400/9400/9400 9413/9413/9413 -f 9413/9413/9413 9400/9400/9400 9414/9414/9414 -f 9409/9409/9409 9415/9415/9415 9412/9412/9412 -f 9415/9415/9415 9409/9409/9409 9404/9404/9404 -f 9412/9412/9412 9415/9415/9415 9411/9411/9411 -f 9416/9416/9416 9408/9408/9408 9417/9417/9417 -f 9408/9408/9408 9416/9416/9416 9407/9407/9407 -f 9405/9405/9405 9418/9418/9418 9419/9419/9419 -f 9418/9418/9418 9405/9405/9405 9406/9406/9406 -f 9401/9401/9401 9420/9420/9420 9421/9421/9421 -f 9420/9420/9420 9401/9401/9401 9403/9403/9403 -v 16451.5 13941 6070.95 -vt 0.847465 0.539571 -v 16451.5 22461 -285.3 -vt 0.898171 0.606104 -v 16451.5 13941 -285.3 -vt 0.898171 0.539571 -v 16451.5 14217 6070.95 -vt 0.847465 0.541727 -v 16451.5 22461 2594.7 -vt 0.875196 0.606104 -v 16451.5 22558.5 5804.7 -vt 0.849589 0.606865 -v 16451.5 25026 6070.95 -vt 0.847465 0.626133 -v 16451.5 24763.5 5804.7 -vt 0.849589 0.624084 -v 16451.5 24763.5 3884.7 -vt 0.864905 0.624084 -v 16451.5 24861 2594.7 -vt 0.875196 0.624845 -v 16451.5 24861 -285.3 -vt 0.898171 0.624845 -v 16451.5 25026 -285.3 -vt 0.898171 0.626133 -v 16451.5 22558.5 3884.7 -vt 0.864905 0.606865 -v 16451.5 23616 2594.7 -vt 0.875196 0.615123 -v 16451.5 23706 2594.7 -vt 0.875196 0.615826 -v 16451.5 23616 -285.3 -vt 0.898171 0.615123 -v 16451.5 23706 -285.3 -vt 0.898171 0.615826 -o mesh1844 -s off -f 9422/9422/9422 9423/9423/9423 9424/9424/9424 -f 9423/9423/9423 9422/9422/9422 9425/9425/9425 -f 9423/9423/9423 9425/9425/9425 9426/9426/9426 -f 9426/9426/9426 9425/9425/9425 9427/9427/9427 -f 9427/9427/9427 9425/9425/9425 9428/9428/9428 -f 9427/9427/9427 9428/9428/9428 9429/9429/9429 -f 9429/9429/9429 9428/9428/9428 9430/9430/9430 -f 9430/9430/9430 9428/9428/9428 9431/9431/9431 -f 9431/9431/9431 9428/9428/9428 9432/9432/9432 -f 9432/9432/9432 9428/9428/9428 9433/9433/9433 -f 9426/9426/9426 9434/9434/9434 9435/9435/9435 -f 9434/9434/9434 9426/9426/9426 9427/9427/9427 -f 9435/9435/9435 9434/9434/9434 9430/9430/9430 -f 9435/9435/9435 9430/9430/9430 9436/9436/9436 -f 9435/9435/9435 9436/9436/9436 9437/9437/9437 -f 9436/9436/9436 9430/9430/9430 9431/9431/9431 -f 9438/9438/9438 9437/9437/9437 9436/9436/9436 -g charts -o chart0000 -s off -f 9422/9422/9422 9423/9423/9423 9424/9424/9424 -f 9423/9423/9423 9422/9422/9422 9425/9425/9425 -f 9423/9423/9423 9425/9425/9425 9426/9426/9426 -f 9426/9426/9426 9425/9425/9425 9427/9427/9427 -f 9427/9427/9427 9425/9425/9425 9428/9428/9428 -f 9427/9427/9427 9428/9428/9428 9429/9429/9429 -f 9429/9429/9429 9428/9428/9428 9430/9430/9430 -f 9430/9430/9430 9428/9428/9428 9431/9431/9431 -f 9431/9431/9431 9428/9428/9428 9432/9432/9432 -f 9432/9432/9432 9428/9428/9428 9433/9433/9433 -f 9426/9426/9426 9434/9434/9434 9435/9435/9435 -f 9434/9434/9434 9426/9426/9426 9427/9427/9427 -f 9435/9435/9435 9434/9434/9434 9430/9430/9430 -f 9435/9435/9435 9430/9430/9430 9436/9436/9436 -f 9435/9435/9435 9436/9436/9436 9437/9437/9437 -f 9436/9436/9436 9430/9430/9430 9431/9431/9431 -f 9438/9438/9438 9437/9437/9437 9436/9436/9436 -v 16286.5 23706 -285.3 -vt 0.894846 0.390404 -v 16286.5 23616 2594.7 -vt 0.87194 0.389701 -v 16286.5 23616 -285.3 -vt 0.894846 0.389701 -v 16286.5 22558.5 3884.7 -vt 0.861681 0.381443 -v 16286.5 22461 2594.7 -vt 0.87194 0.380681 -v 16286.5 24763.5 3884.7 -vt 0.861681 0.398661 -v 16286.5 23706 2594.7 -vt 0.87194 0.390404 -v 16286.5 24861 2594.7 -vt 0.87194 0.399423 -v 16286.5 24763.5 5804.7 -vt 0.84641 0.398661 -v 16286.5 24861 6194.7 -vt 0.843308 0.399423 -v 16286.5 22461 -285.3 -vt 0.894846 0.380681 -v 16286.5 13776 6194.7 -vt 0.843308 0.312861 -v 16286.5 13776 -285.3 -vt 0.894846 0.312861 -v 16286.5 14052 6194.7 -vt 0.843308 0.315016 -v 16286.5 22558.5 5804.7 -vt 0.84641 0.381443 -o mesh1845 -s off -f 9439/9439/9439 9440/9440/9440 9441/9441/9441 -f 9440/9440/9440 9442/9442/9442 9443/9443/9443 -f 9442/9442/9442 9440/9440/9440 9444/9444/9444 -f 9444/9444/9444 9440/9440/9440 9445/9445/9445 -f 9445/9445/9445 9440/9440/9440 9439/9439/9439 -f 9444/9444/9444 9445/9445/9445 9446/9446/9446 -f 9444/9444/9444 9446/9446/9446 9447/9447/9447 -f 9447/9447/9447 9446/9446/9446 9448/9448/9448 -f 9449/9449/9449 9450/9450/9450 9451/9451/9451 -f 9450/9450/9450 9449/9449/9449 9452/9452/9452 -f 9452/9452/9452 9449/9449/9449 9443/9443/9443 -f 9452/9452/9452 9443/9443/9443 9453/9453/9453 -f 9452/9452/9452 9453/9453/9453 9448/9448/9448 -f 9453/9453/9453 9443/9443/9443 9442/9442/9442 -f 9448/9448/9448 9453/9453/9453 9447/9447/9447 -g charts -o chart0000 -s off -f 9439/9439/9439 9440/9440/9440 9441/9441/9441 -f 9440/9440/9440 9442/9442/9442 9443/9443/9443 -f 9442/9442/9442 9440/9440/9440 9444/9444/9444 -f 9444/9444/9444 9440/9440/9440 9445/9445/9445 -f 9445/9445/9445 9440/9440/9440 9439/9439/9439 -f 9444/9444/9444 9445/9445/9445 9446/9446/9446 -f 9444/9444/9444 9446/9446/9446 9447/9447/9447 -f 9447/9447/9447 9446/9446/9446 9448/9448/9448 -f 9449/9449/9449 9450/9450/9450 9451/9451/9451 -f 9450/9450/9450 9449/9449/9449 9452/9452/9452 -f 9452/9452/9452 9449/9449/9449 9443/9443/9443 -f 9452/9452/9452 9443/9443/9443 9453/9453/9453 -f 9452/9452/9452 9453/9453/9453 9448/9448/9448 -f 9453/9453/9453 9443/9443/9443 9442/9442/9442 -f 9448/9448/9448 9453/9453/9453 9447/9447/9447 -v 16286.5 24861 6194.7 -vt 0.94974 0.64556 -v 14182.2 24861 7772.92 -vt 0.928928 0.64556 -v 14206.6 25026 7754.62 -vt 0.929169 0.64427 -v 16451.5 25026 6070.95 -vt 0.951371 0.64427 -v 16451.5 14217 6070.95 -vt 0.951371 0.728719 -v 16286.5 14052 6194.7 -vt 0.94974 0.730008 -o mesh1846 -s off -f 9454/9454/9454 9455/9455/9455 9456/9456/9456 -f 9454/9454/9454 9456/9456/9456 9457/9457/9457 -f 9454/9454/9454 9457/9457/9457 9458/9458/9458 -f 9454/9454/9454 9458/9458/9458 9459/9459/9459 -g charts -o chart0000 -s off -f 9454/9454/9454 9455/9455/9455 9456/9456/9456 -f 9454/9454/9454 9456/9456/9456 9457/9457/9457 -f 9454/9454/9454 9457/9457/9457 9458/9458/9458 -f 9454/9454/9454 9458/9458/9458 9459/9459/9459 -v 16286.5 14052 6194.7 -vt 0.629783 0.673124 -v 16451.5 14217 6070.95 -vt 0.631338 0.671476 -v 16451.5 13941 6070.95 -vt 0.628737 0.671476 -v 16286.5 13776 6194.7 -vt 0.627182 0.673124 -o mesh1847 -s off -f 9460/9460/9460 9461/9461/9461 9462/9462/9462 -f 9460/9460/9460 9462/9462/9462 9463/9463/9463 -g charts -o chart0000 -s off -f 9460/9460/9460 9461/9461/9461 9462/9462/9462 -f 9460/9460/9460 9462/9462/9462 9463/9463/9463 -v 13571.5 24861 8230.95 -vt 0.276392 0.963314 -v 13571.5 25026 8230.95 -vt 0.276392 0.964963 -v 14206.6 25026 7754.62 -vt 0.283042 0.964963 -v 14182.2 24861 7772.92 -vt 0.282787 0.963314 -o mesh1848 -s off -f 9464/9464/9464 9465/9465/9465 9466/9466/9466 -f 9464/9464/9464 9466/9466/9466 9467/9467/9467 -g charts -o chart0000 -s off -f 9464/9464/9464 9465/9465/9465 9466/9466/9466 -f 9464/9464/9464 9466/9466/9466 9467/9467/9467 -v 19151.5 9485.99 3854.7 -vt 0.194929 0.983924 -v 19151.5 9485.99 5759.7 -vt 0.179136 0.983924 -v 18986.5 9485.99 5759.7 -vt 0.179136 0.982275 -v 18986.5 9485.99 3854.7 -vt 0.194929 0.982275 -o mesh1849 -s off -f 9468/9468/9468 9469/9469/9469 9470/9470/9470 -f 9468/9468/9468 9470/9470/9470 9471/9471/9471 -g charts -o chart0000 -s off -f 9468/9468/9468 9469/9469/9469 9470/9470/9470 -f 9468/9468/9468 9470/9470/9470 9471/9471/9471 -v 19151.5 9485.99 5759.7 -vt 0.642976 0.794312 -v 19151.5 12801 5759.7 -vt 0.642976 0.767931 -v 18986.5 12801 5759.7 -vt 0.641313 0.767931 -v 18986.5 9485.99 5759.7 -vt 0.641313 0.794312 -o mesh1850 -s off -f 9472/9472/9472 9473/9473/9473 9474/9474/9474 -f 9472/9472/9472 9474/9474/9474 9475/9475/9475 -g charts -o chart0000 -s off -f 9472/9472/9472 9473/9473/9473 9474/9474/9474 -f 9472/9472/9472 9474/9474/9474 9475/9475/9475 -v 19151.5 12801 5759.7 -vt 0.000415628 0.882523 -v 19151.5 12801 3854.7 -vt 0.0162094 0.882523 -v 18986.5 12801 3854.7 -vt 0.0162094 0.884171 -v 18986.5 12801 5759.7 -vt 0.000415628 0.884171 -o mesh1851 -s off -f 9476/9476/9476 9477/9477/9477 9478/9478/9478 -f 9476/9476/9476 9478/9478/9478 9479/9479/9479 -g charts -o chart0000 -s off -f 9476/9476/9476 9477/9477/9477 9478/9478/9478 -f 9476/9476/9476 9478/9478/9478 9479/9479/9479 -v 19151.5 12801 3854.7 -vt 0.618869 0.766282 -v 19151.5 9485.99 3854.7 -vt 0.618869 0.792663 -v 18986.5 9485.99 3854.7 -vt 0.620532 0.792663 -v 18986.5 12801 3854.7 -vt 0.620532 0.766282 -o mesh1852 -s off -f 9480/9480/9480 9481/9481/9481 9482/9482/9482 -f 9480/9480/9480 9482/9482/9482 9483/9483/9483 -g charts -o chart0000 -s off -f 9480/9480/9480 9481/9481/9481 9482/9482/9482 -f 9480/9480/9480 9482/9482/9482 9483/9483/9483 -v 19151.5 9485.99 2159.7 -vt 0.840815 0.34831 -v 19151.5 12801 2159.7 -vt 0.840815 0.321929 -v 18986.5 12801 2159.7 -vt 0.839152 0.321929 -v 18986.5 9485.99 2159.7 -vt 0.839152 0.34831 -o mesh1853 -s off -f 9484/9484/9484 9485/9485/9485 9486/9486/9486 -f 9484/9484/9484 9486/9486/9486 9487/9487/9487 -g charts -o chart0000 -s off -f 9484/9484/9484 9485/9485/9485 9486/9486/9486 -f 9484/9484/9484 9486/9486/9486 9487/9487/9487 -v 19151.5 12801 2159.7 -vt 0.253117 0.409316 -v 19151.5 12801 254.7 -vt 0.253117 0.424979 -v 18986.5 12801 254.7 -vt 0.25478 0.424979 -v 18986.5 12801 2159.7 -vt 0.25478 0.409316 -o mesh1854 -s off -f 9488/9488/9488 9489/9489/9489 9490/9490/9490 -f 9488/9488/9488 9490/9490/9490 9491/9491/9491 -g charts -o chart0000 -s off -f 9488/9488/9488 9489/9489/9489 9490/9490/9490 -f 9488/9488/9488 9490/9490/9490 9491/9491/9491 -v 19151.5 12801 254.7 -vt 0.278055 0.454658 -v 19151.5 9485.99 254.7 -vt 0.304655 0.454658 -v 18986.5 9485.99 254.7 -vt 0.304655 0.456307 -v 18986.5 12801 254.7 -vt 0.278055 0.456307 -o mesh1855 -s off -f 9492/9492/9492 9493/9493/9493 9494/9494/9494 -f 9492/9492/9492 9494/9494/9494 9495/9495/9495 -g charts -o chart0000 -s off -f 9492/9492/9492 9493/9493/9493 9494/9494/9494 -f 9492/9492/9492 9494/9494/9494 9495/9495/9495 -v 19151.5 9485.99 254.7 -vt 0.994597 0.594806 -v 19151.5 9485.99 2159.7 -vt 0.994597 0.579143 -v 18986.5 9485.99 2159.7 -vt 0.992934 0.579143 -v 18986.5 9485.99 254.7 -vt 0.992934 0.594806 -o mesh1856 -s off -f 9496/9496/9496 9497/9497/9497 9498/9498/9498 -f 9496/9496/9496 9498/9498/9498 9499/9499/9499 -g charts -o chart0000 -s off -f 9496/9496/9496 9497/9497/9497 9498/9498/9498 -f 9496/9496/9496 9498/9498/9498 9499/9499/9499 -v 18371.5 13941 284.7 -vt 0.258105 0.817395 -v 18371.5 13941 2204.7 -vt 0.242311 0.817395 -v 18371.5 13776 2204.7 -vt 0.242311 0.815746 -v 18371.5 13776 284.7 -vt 0.258105 0.815746 -o mesh1857 -s off -f 9500/9500/9500 9501/9501/9501 9502/9502/9502 -f 9500/9500/9500 9502/9502/9502 9503/9503/9503 -g charts -o chart0000 -s off -f 9500/9500/9500 9501/9501/9501 9502/9502/9502 -f 9500/9500/9500 9502/9502/9502 9503/9503/9503 -v 18371.5 13941 2204.7 -vt 0.296342 0.965787 -v 17291.5 13941 2204.7 -vt 0.305486 0.965787 -v 17291.5 13776 2204.7 -vt 0.305486 0.967436 -v 18371.5 13776 2204.7 -vt 0.296342 0.967436 -o mesh1858 -s off -f 9504/9504/9504 9505/9505/9505 9506/9506/9506 -f 9504/9504/9504 9506/9506/9506 9507/9507/9507 -g charts -o chart0000 -s off -f 9504/9504/9504 9505/9505/9505 9506/9506/9506 -f 9504/9504/9504 9506/9506/9506 9507/9507/9507 -v 17291.5 13941 2204.7 -vt 0.913134 0.0127782 -v 17291.5 13941 284.7 -vt 0.913134 0.0284418 -v 17291.5 13776 284.7 -vt 0.914796 0.0284418 -v 17291.5 13776 2204.7 -vt 0.914796 0.0127782 -o mesh1859 -s off -f 9508/9508/9508 9509/9509/9509 9510/9510/9510 -f 9508/9508/9508 9510/9510/9510 9511/9511/9511 -g charts -o chart0000 -s off -f 9508/9508/9508 9509/9509/9509 9510/9510/9510 -f 9508/9508/9508 9510/9510/9510 9511/9511/9511 -v 17291.5 13941 284.7 -vt 0.609726 0.490931 -v 18371.5 13941 284.7 -vt 0.609726 0.481863 -v 18371.5 13776 284.7 -vt 0.608063 0.481863 -v 17291.5 13776 284.7 -vt 0.608063 0.490931 -o mesh1860 -s off -f 9512/9512/9512 9513/9513/9513 9514/9514/9514 -f 9512/9512/9512 9514/9514/9514 9515/9515/9515 -g charts -o chart0000 -s off -f 9512/9512/9512 9513/9513/9513 9514/9514/9514 -f 9512/9512/9512 9514/9514/9514 9515/9515/9515 -v 17292.1 13941 3884.7 -vt 0.00623433 0.964138 -v 18371.5 13941 3884.7 -vt 0.00623433 0.95507 -v 18371.5 13776 3884.7 -vt 0.0045719 0.95507 -v 17292.1 13776 3884.7 -vt 0.0045719 0.964138 -o mesh1861 -s off -f 9516/9516/9516 9517/9517/9517 9518/9518/9518 -f 9516/9516/9516 9518/9518/9518 9519/9519/9519 -g charts -o chart0000 -s off -f 9516/9516/9516 9517/9517/9517 9518/9518/9518 -f 9516/9516/9516 9518/9518/9518 9519/9519/9519 -v 18371.5 13941 3884.7 -vt 0.188279 0.954246 -v 18371.5 13941 5804.7 -vt 0.188279 0.938582 -v 18371.5 13776 5804.7 -vt 0.186617 0.938582 -v 18371.5 13776 3884.7 -vt 0.186617 0.954246 -o mesh1862 -s off -f 9520/9520/9520 9521/9521/9521 9522/9522/9522 -f 9520/9520/9520 9522/9522/9522 9523/9523/9523 -g charts -o chart0000 -s off -f 9520/9520/9520 9521/9521/9521 9522/9522/9522 -f 9520/9520/9520 9522/9522/9522 9523/9523/9523 -v 18371.5 13941 5804.7 -vt 0.130091 0.761336 -v 17292.1 13941 5804.7 -vt 0.139235 0.761336 -v 17292.1 13776 5804.7 -vt 0.139235 0.762984 -v 18371.5 13776 5804.7 -vt 0.130091 0.762984 -o mesh1863 -s off -f 9524/9524/9524 9525/9525/9525 9526/9526/9526 -f 9524/9524/9524 9526/9526/9526 9527/9527/9527 -g charts -o chart0000 -s off -f 9524/9524/9524 9525/9525/9525 9526/9526/9526 -f 9524/9524/9524 9526/9526/9526 9527/9527/9527 -v 17292.1 13941 5804.7 -vt 0.640482 0.750618 -v 17292.1 13941 3884.7 -vt 0.656276 0.750618 -v 17292.1 13776 3884.7 -vt 0.656276 0.752267 -v 17292.1 13776 5804.7 -vt 0.640482 0.752267 -o mesh1864 -s off -f 9528/9528/9528 9529/9529/9529 9530/9530/9530 -f 9528/9528/9528 9530/9530/9530 9531/9531/9531 -g charts -o chart0000 -s off -f 9528/9528/9528 9529/9529/9529 9530/9530/9530 -f 9528/9528/9528 9530/9530/9530 9531/9531/9531 -v 10856.5 25026 -285.3 -vt 0.405237 0.715993 -v 12146.5 25026 -285.3 -vt 0.394431 0.715993 -v 12146.5 24861 -285.3 -vt 0.394431 0.714345 -v 10856.5 24861 -285.3 -vt 0.405237 0.714345 -o mesh1865 -s off -f 9532/9532/9532 9533/9533/9533 9534/9534/9534 -f 9532/9532/9532 9534/9534/9534 9535/9535/9535 -g charts -o chart0000 -s off -f 9532/9532/9532 9533/9533/9533 9534/9534/9534 -f 9532/9532/9532 9534/9534/9534 9535/9535/9535 -v 12146.5 25026 -285.3 -vt 0.163342 0.687139 -v 12146.5 25026 2594.7 -vt 0.163342 0.664056 -v 12146.5 24861 2594.7 -vt 0.161679 0.664056 -v 12146.5 24861 -285.3 -vt 0.161679 0.687139 -o mesh1866 -s off -f 9536/9536/9536 9537/9537/9537 9538/9538/9538 -f 9536/9536/9536 9538/9538/9538 9539/9539/9539 -g charts -o chart0000 -s off -f 9536/9536/9536 9537/9537/9537 9538/9538/9538 -f 9536/9536/9536 9538/9538/9538 9539/9539/9539 -v 12146.5 25026 2594.7 -vt 0.810058 0.565128 -v 10856.5 25026 2594.7 -vt 0.810058 0.575845 -v 10856.5 24861 2594.7 -vt 0.811721 0.575845 -v 12146.5 24861 2594.7 -vt 0.811721 0.565128 -o mesh1867 -s off -f 9540/9540/9540 9541/9541/9541 9542/9542/9542 -f 9540/9540/9540 9542/9542/9542 9543/9543/9543 -g charts -o chart0000 -s off -f 9540/9540/9540 9541/9541/9541 9542/9542/9542 -f 9540/9540/9540 9542/9542/9542 9543/9543/9543 -v 10856.5 25026 2594.7 -vt 0.0943475 0.38211 -v 10856.5 25026 -285.3 -vt 0.0943475 0.405194 -v 10856.5 24861 -285.3 -vt 0.0960099 0.405194 -v 10856.5 24861 2594.7 -vt 0.0960099 0.38211 -o mesh1868 -s off -f 9544/9544/9544 9545/9545/9545 9546/9546/9546 -f 9544/9544/9544 9546/9546/9546 9547/9547/9547 -g charts -o chart0000 -s off -f 9544/9544/9544 9545/9545/9545 9546/9546/9546 -f 9544/9544/9544 9546/9546/9546 9547/9547/9547 -v 12236.5 25026 -285.3 -vt 0.942228 0.944353 -v 13526.5 25026 -285.3 -vt 0.931421 0.944353 -v 13526.5 24861 -285.3 -vt 0.931421 0.942704 -v 12236.5 24861 -285.3 -vt 0.942228 0.942704 -o mesh1869 -s off -f 9548/9548/9548 9549/9549/9549 9550/9550/9550 -f 9548/9548/9548 9550/9550/9550 9551/9551/9551 -g charts -o chart0000 -s off -f 9548/9548/9548 9549/9549/9549 9550/9550/9550 -f 9548/9548/9548 9550/9550/9550 9551/9551/9551 -v 13526.5 25026 -285.3 -vt 0.219036 0.894889 -v 13526.5 25026 2594.7 -vt 0.195761 0.894889 -v 13526.5 24861 2594.7 -vt 0.195761 0.89324 -v 13526.5 24861 -285.3 -vt 0.219036 0.89324 -o mesh1870 -s off -f 9552/9552/9552 9553/9553/9553 9554/9554/9554 -f 9552/9552/9552 9554/9554/9554 9555/9555/9555 -g charts -o chart0000 -s off -f 9552/9552/9552 9553/9553/9553 9554/9554/9554 -f 9552/9552/9552 9554/9554/9554 9555/9555/9555 -v 13526.5 25026 2594.7 -vt 0.584788 0.864386 -v 12236.5 25026 2594.7 -vt 0.595594 0.864386 -v 12236.5 24861 2594.7 -vt 0.595594 0.866035 -v 13526.5 24861 2594.7 -vt 0.584788 0.866035 -o mesh1871 -s off -f 9556/9556/9556 9557/9557/9557 9558/9558/9558 -f 9556/9556/9556 9558/9558/9558 9559/9559/9559 -g charts -o chart0000 -s off -f 9556/9556/9556 9557/9557/9557 9558/9558/9558 -f 9556/9556/9556 9558/9558/9558 9559/9559/9559 -v 12236.5 25026 2594.7 -vt 0.997091 0.861913 -v 12236.5 25026 -285.3 -vt 0.997091 0.884996 -v 12236.5 24861 -285.3 -vt 0.998753 0.884996 -v 12236.5 24861 2594.7 -vt 0.998753 0.861913 -o mesh1872 -s off -f 9560/9560/9560 9561/9561/9561 9562/9562/9562 -f 9560/9560/9560 9562/9562/9562 9563/9563/9563 -g charts -o chart0000 -s off -f 9560/9560/9560 9561/9561/9561 9562/9562/9562 -f 9560/9560/9560 9562/9562/9562 9563/9563/9563 -v 13616.5 25026 -285.3 -vt 0.816708 0.133141 -v 14906.5 25026 -285.3 -vt 0.816708 0.122424 -v 14906.5 24861 -285.3 -vt 0.815046 0.122424 -v 13616.5 24861 -285.3 -vt 0.815046 0.133141 -o mesh1873 -s off -f 9564/9564/9564 9565/9565/9565 9566/9566/9566 -f 9564/9564/9564 9566/9566/9566 9567/9567/9567 -g charts -o chart0000 -s off -f 9564/9564/9564 9565/9565/9565 9566/9566/9566 -f 9564/9564/9564 9566/9566/9566 9567/9567/9567 -v 14906.5 25026 -285.3 -vt 0.00457182 0.832234 -v 14906.5 25026 2594.7 -vt 0.00457182 0.809151 -v 14906.5 24861 2594.7 -vt 0.00290939 0.809151 -v 14906.5 24861 -285.3 -vt 0.00290939 0.832234 -o mesh1874 -s off -f 9568/9568/9568 9569/9569/9569 9570/9570/9570 -f 9568/9568/9568 9570/9570/9570 9571/9571/9571 -g charts -o chart0000 -s off -f 9568/9568/9568 9569/9569/9569 9570/9570/9570 -f 9568/9568/9568 9570/9570/9570 9571/9571/9571 -v 14906.5 25026 2594.7 -vt 0.206567 0.656636 -v 13616.5 25026 2594.7 -vt 0.217373 0.656636 -v 13616.5 24861 2594.7 -vt 0.217373 0.658285 -v 14906.5 24861 2594.7 -vt 0.206567 0.658285 -o mesh1875 -s off -f 9572/9572/9572 9573/9573/9573 9574/9574/9574 -f 9572/9572/9572 9574/9574/9574 9575/9575/9575 -g charts -o chart0000 -s off -f 9572/9572/9572 9573/9573/9573 9574/9574/9574 -f 9572/9572/9572 9574/9574/9574 9575/9575/9575 -v 13616.5 25026 2594.7 -vt 0.24148 0.603875 -v 13616.5 25026 -285.3 -vt 0.264755 0.603875 -v 13616.5 24861 -285.3 -vt 0.264755 0.605523 -v 13616.5 24861 2594.7 -vt 0.24148 0.605523 -o mesh1876 -s off -f 9576/9576/9576 9577/9577/9577 9578/9578/9578 -f 9576/9576/9576 9578/9578/9578 9579/9579/9579 -g charts -o chart0000 -s off -f 9576/9576/9576 9577/9577/9577 9578/9578/9578 -f 9576/9576/9576 9578/9578/9578 9579/9579/9579 -v 14996.5 25026 -285.3 -vt 0.600582 0.849546 -v 16286.5 25026 -285.3 -vt 0.589776 0.849546 -v 16286.5 24861 -285.3 -vt 0.589776 0.847898 -v 14996.5 24861 -285.3 -vt 0.600582 0.847898 -o mesh1877 -s off -f 9580/9580/9580 9581/9581/9581 9582/9582/9582 -f 9580/9580/9580 9582/9582/9582 9583/9583/9583 -g charts -o chart0000 -s off -f 9580/9580/9580 9581/9581/9581 9582/9582/9582 -f 9580/9580/9580 9582/9582/9582 9583/9583/9583 -v 16286.5 25026 -285.3 -vt 0.899834 0.443116 -v 16286.5 25026 2594.7 -vt 0.899834 0.420033 -v 16286.5 24861 2594.7 -vt 0.898171 0.420033 -v 16286.5 24861 -285.3 -vt 0.898171 0.443116 -o mesh1878 -s off -f 9584/9584/9584 9585/9585/9585 9586/9586/9586 -f 9584/9584/9584 9586/9586/9586 9587/9587/9587 -g charts -o chart0000 -s off -f 9584/9584/9584 9585/9585/9585 9586/9586/9586 -f 9584/9584/9584 9586/9586/9586 9587/9587/9587 -v 16286.5 25026 2594.7 -vt 0.946384 0.159522 -v 14996.5 25026 2594.7 -vt 0.946384 0.170239 -v 14996.5 24861 2594.7 -vt 0.948046 0.170239 -v 16286.5 24861 2594.7 -vt 0.948046 0.159522 -o mesh1879 -s off -f 9588/9588/9588 9589/9589/9589 9590/9590/9590 -f 9588/9588/9588 9590/9590/9590 9591/9591/9591 -g charts -o chart0000 -s off -f 9588/9588/9588 9589/9589/9589 9590/9590/9590 -f 9588/9588/9588 9590/9590/9590 9591/9591/9591 -v 14996.5 25026 2594.7 -vt 0.574813 0.345837 -v 14996.5 25026 -285.3 -vt 0.598088 0.345837 -v 14996.5 24861 -285.3 -vt 0.598088 0.347485 -v 14996.5 24861 2594.7 -vt 0.574813 0.347485 -o mesh1880 -s off -f 9592/9592/9592 9593/9593/9593 9594/9594/9594 -f 9592/9592/9592 9594/9594/9594 9595/9595/9595 -g charts -o chart0000 -s off -f 9592/9592/9592 9593/9593/9593 9594/9594/9594 -f 9592/9592/9592 9594/9594/9594 9595/9595/9595 -v 16451.5 24861 -285.3 -vt 0.250623 0.420033 -v 16451.5 23706 -285.3 -vt 0.250623 0.429101 -v 16286.5 23706 -285.3 -vt 0.252286 0.429101 -v 16286.5 24861 -285.3 -vt 0.252286 0.420033 -o mesh1881 -s off -f 9596/9596/9596 9597/9597/9597 9598/9598/9598 -f 9596/9596/9596 9598/9598/9598 9599/9599/9599 -g charts -o chart0000 -s off -f 9596/9596/9596 9597/9597/9597 9598/9598/9598 -f 9596/9596/9596 9598/9598/9598 9599/9599/9599 -v 16451.5 23706 -285.3 -vt 0.653782 0.997114 -v 16451.5 23706 2594.7 -vt 0.630507 0.997114 -v 16286.5 23706 2594.7 -vt 0.630507 0.995466 -v 16286.5 23706 -285.3 -vt 0.653782 0.995466 -o mesh1882 -s off -f 9600/9600/9600 9601/9601/9601 9602/9602/9602 -f 9600/9600/9600 9602/9602/9602 9603/9603/9603 -g charts -o chart0000 -s off -f 9600/9600/9600 9601/9601/9601 9602/9602/9602 -f 9600/9600/9600 9602/9602/9602 9603/9603/9603 -v 16451.5 23706 2594.7 -vt 0.0586034 0.193322 -v 16451.5 24861 2594.7 -vt 0.0586034 0.184254 -v 16286.5 24861 2594.7 -vt 0.056941 0.184254 -v 16286.5 23706 2594.7 -vt 0.056941 0.193322 -o mesh1883 -s off -f 9604/9604/9604 9605/9605/9605 9606/9606/9606 -f 9604/9604/9604 9606/9606/9606 9607/9607/9607 -g charts -o chart0000 -s off -f 9604/9604/9604 9605/9605/9605 9606/9606/9606 -f 9604/9604/9604 9606/9606/9606 9607/9607/9607 -v 16451.5 24861 2594.7 -vt 0.411887 0.597279 -v 16451.5 24861 -285.3 -vt 0.435162 0.597279 -v 16286.5 24861 -285.3 -vt 0.435162 0.598928 -v 16286.5 24861 2594.7 -vt 0.411887 0.598928 -o mesh1884 -s off -f 9608/9608/9608 9609/9609/9609 9610/9610/9610 -f 9608/9608/9608 9610/9610/9610 9611/9611/9611 -g charts -o chart0000 -s off -f 9608/9608/9608 9609/9609/9609 9610/9610/9610 -f 9608/9608/9608 9610/9610/9610 9611/9611/9611 -v 16451.5 23616 -285.3 -vt 0.972984 0.976505 -v 16451.5 22461 -285.3 -vt 0.972984 0.985573 -v 16286.5 22461 -285.3 -vt 0.974647 0.985573 -v 16286.5 23616 -285.3 -vt 0.974647 0.976505 -o mesh1885 -s off -f 9612/9612/9612 9613/9613/9613 9614/9614/9614 -f 9612/9612/9612 9614/9614/9614 9615/9615/9615 -g charts -o chart0000 -s off -f 9612/9612/9612 9613/9613/9613 9614/9614/9614 -f 9612/9612/9612 9614/9614/9614 9615/9615/9615 -v 16451.5 22461 -285.3 -vt 0.851621 0.403545 -v 16451.5 22461 2594.7 -vt 0.828346 0.403545 -v 16286.5 22461 2594.7 -vt 0.828346 0.401896 -v 16286.5 22461 -285.3 -vt 0.851621 0.401896 -o mesh1886 -s off -f 9616/9616/9616 9617/9617/9617 9618/9618/9618 -f 9616/9616/9616 9618/9618/9618 9619/9619/9619 -g charts -o chart0000 -s off -f 9616/9616/9616 9617/9617/9617 9618/9618/9618 -f 9616/9616/9616 9618/9618/9618 9619/9619/9619 -v 16451.5 22461 2594.7 -vt 0.0985037 0.14798 -v 16451.5 23616 2594.7 -vt 0.0893599 0.14798 -v 16286.5 23616 2594.7 -vt 0.0893599 0.146331 -v 16286.5 22461 2594.7 -vt 0.0985037 0.146331 -o mesh1887 -s off -f 9620/9620/9620 9621/9621/9621 9622/9622/9622 -f 9620/9620/9620 9622/9622/9622 9623/9623/9623 -g charts -o chart0000 -s off -f 9620/9620/9620 9621/9621/9621 9622/9622/9622 -f 9620/9620/9620 9622/9622/9622 9623/9623/9623 -v 16451.5 23616 2594.7 -vt 0.993766 0.0424567 -v 16451.5 23616 -285.3 -vt 0.993766 0.0655399 -v 16286.5 23616 -285.3 -vt 0.995428 0.0655399 -v 16286.5 23616 2594.7 -vt 0.995428 0.0424567 -o mesh1888 -s off -f 9624/9624/9624 9625/9625/9625 9626/9626/9626 -f 9624/9624/9624 9626/9626/9626 9627/9627/9627 -g charts -o chart0000 -s off -f 9624/9624/9624 9625/9625/9625 9626/9626/9626 -f 9624/9624/9624 9626/9626/9626 9627/9627/9627 -v 10856.5 5120.99 6194.7 -vt 0.623857 0.668178 -v 10856.5 22558.5 5804.7 -vt 0.486544 0.671254 -v 10856.5 5120.99 -285.3 -vt 0.623857 0.719291 -v 10856.5 24861 6194.7 -vt 0.468412 0.668178 -v 10856.5 18433.5 2594.7 -vt 0.519026 0.696574 -v 10856.5 20593.5 2594.7 -vt 0.502017 0.696574 -v 10856.5 20593.5 -285.3 -vt 0.502017 0.719291 -v 10856.5 22461 2594.7 -vt 0.487311 0.696574 -v 10856.5 24763.5 5804.7 -vt 0.46918 0.671254 -v 10856.5 24763.5 3884.7 -vt 0.46918 0.686399 -v 10856.5 22558.5 3884.7 -vt 0.486544 0.686399 -v 10856.5 23616 2594.7 -vt 0.478216 0.696574 -v 10856.5 23706 2594.7 -vt 0.477507 0.696574 -v 10856.5 23616 -285.3 -vt 0.478216 0.719291 -v 10856.5 24861 2594.7 -vt 0.468412 0.696574 -v 10856.5 23706 -285.3 -vt 0.477507 0.719291 -v 10856.5 22461 -285.3 -vt 0.487311 0.719291 -v 10856.5 18433.5 -285.3 -vt 0.519026 0.719291 -o mesh1889 -s off -f 9628/9628/9628 9629/9629/9629 9630/9630/9630 -f 9629/9629/9629 9628/9628/9628 9631/9631/9631 -f 9630/9630/9630 9629/9629/9629 9632/9632/9632 -f 9632/9632/9632 9629/9629/9629 9633/9633/9633 -f 9633/9633/9633 9629/9629/9629 9634/9634/9634 -f 9634/9634/9634 9629/9629/9629 9635/9635/9635 -f 9629/9629/9629 9631/9631/9631 9636/9636/9636 -f 9636/9636/9636 9631/9631/9631 9637/9637/9637 -f 9635/9635/9635 9638/9638/9638 9639/9639/9639 -f 9638/9638/9638 9635/9635/9635 9629/9629/9629 -f 9639/9639/9639 9638/9638/9638 9637/9637/9637 -f 9639/9639/9639 9637/9637/9637 9640/9640/9640 -f 9639/9639/9639 9640/9640/9640 9641/9641/9641 -f 9640/9640/9640 9637/9637/9637 9642/9642/9642 -f 9642/9642/9642 9637/9637/9637 9631/9631/9631 -f 9643/9643/9643 9641/9641/9641 9640/9640/9640 -f 9644/9644/9644 9634/9634/9634 9635/9635/9635 -f 9645/9645/9645 9630/9630/9630 9632/9632/9632 -g charts -o chart0000 -s off -f 9628/9628/9628 9629/9629/9629 9630/9630/9630 -f 9629/9629/9629 9628/9628/9628 9631/9631/9631 -f 9630/9630/9630 9629/9629/9629 9632/9632/9632 -f 9632/9632/9632 9629/9629/9629 9633/9633/9633 -f 9633/9633/9633 9629/9629/9629 9634/9634/9634 -f 9634/9634/9634 9629/9629/9629 9635/9635/9635 -f 9629/9629/9629 9631/9631/9631 9636/9636/9636 -f 9636/9636/9636 9631/9631/9631 9637/9637/9637 -f 9635/9635/9635 9638/9638/9638 9639/9639/9639 -f 9638/9638/9638 9635/9635/9635 9629/9629/9629 -f 9639/9639/9639 9638/9638/9638 9637/9637/9637 -f 9639/9639/9639 9637/9637/9637 9640/9640/9640 -f 9639/9639/9639 9640/9640/9640 9641/9641/9641 -f 9640/9640/9640 9637/9637/9637 9642/9642/9642 -f 9642/9642/9642 9637/9637/9637 9631/9631/9631 -f 9643/9643/9643 9641/9641/9641 9640/9640/9640 -f 9644/9644/9644 9634/9634/9634 9635/9635/9635 -f 9645/9645/9645 9630/9630/9630 9632/9632/9632 -v 10691.5 23706 -285.3 -vt 0.871571 0.0655399 -v 10691.5 23706 2594.7 -vt 0.871571 0.0424567 -v 10691.5 23616 2594.7 -vt 0.87074 0.0424567 -v 10691.5 23616 -285.3 -vt 0.87074 0.0655399 -o mesh1890 -s off -f 9646/9646/9646 9647/9647/9647 9648/9648/9648 -f 9646/9646/9646 9648/9648/9648 9649/9649/9649 -g charts -o chart0000 -s off -f 9646/9646/9646 9647/9647/9647 9648/9648/9648 -f 9646/9646/9646 9648/9648/9648 9649/9649/9649 -v 10691.5 23706 -285.3 -vt 0.327099 0.570898 -v 10691.5 24861 -285.3 -vt 0.327099 0.56183 -v 10856.5 24861 -285.3 -vt 0.325436 0.56183 -v 10856.5 23706 -285.3 -vt 0.325436 0.570898 -o mesh1891 -s off -f 9650/9650/9650 9651/9651/9651 9652/9652/9652 -f 9650/9650/9650 9652/9652/9652 9653/9653/9653 -g charts -o chart0000 -s off -f 9650/9650/9650 9651/9651/9651 9652/9652/9652 -f 9650/9650/9650 9652/9652/9652 9653/9653/9653 -v 10691.5 24861 -285.3 -vt 0.984622 0.518137 -v 10691.5 24861 2594.7 -vt 0.984622 0.495054 -v 10856.5 24861 2594.7 -vt 0.982959 0.495054 -v 10856.5 24861 -285.3 -vt 0.982959 0.518137 -o mesh1892 -s off -f 9654/9654/9654 9655/9655/9655 9656/9656/9656 -f 9654/9654/9654 9656/9656/9656 9657/9657/9657 -g charts -o chart0000 -s off -f 9654/9654/9654 9655/9655/9655 9656/9656/9656 -f 9654/9654/9654 9656/9656/9656 9657/9657/9657 -v 10691.5 24861 2594.7 -vt 0.802577 0.792663 -v 10691.5 23706 2594.7 -vt 0.811721 0.792663 -v 10856.5 23706 2594.7 -vt 0.811721 0.794312 -v 10856.5 24861 2594.7 -vt 0.802577 0.794312 -o mesh1893 -s off -f 9658/9658/9658 9659/9659/9659 9660/9660/9660 -f 9658/9658/9658 9660/9660/9660 9661/9661/9661 -g charts -o chart0000 -s off -f 9658/9658/9658 9659/9659/9659 9660/9660/9660 -f 9658/9658/9658 9660/9660/9660 9661/9661/9661 -v 10691.5 23706 2594.7 -vt 0.979634 0.416735 -v 10691.5 23706 -285.3 -vt 0.979634 0.439819 -v 10856.5 23706 -285.3 -vt 0.981297 0.439819 -v 10856.5 23706 2594.7 -vt 0.981297 0.416735 -o mesh1894 -s off -f 9662/9662/9662 9663/9663/9663 9664/9664/9664 -f 9662/9662/9662 9664/9664/9664 9665/9665/9665 -g charts -o chart0000 -s off -f 9662/9662/9662 9663/9663/9663 9664/9664/9664 -f 9662/9662/9662 9664/9664/9664 9665/9665/9665 -v 10691.5 23616 -285.3 -vt 0.747714 0.305441 -v 10691.5 23616 2594.7 -vt 0.724439 0.305441 -v 10856.5 23616 2594.7 -vt 0.724439 0.303792 -v 10856.5 23616 -285.3 -vt 0.747714 0.303792 -o mesh1895 -s off -f 9666/9666/9666 9667/9667/9667 9668/9668/9668 -f 9666/9666/9666 9668/9668/9668 9669/9669/9669 -g charts -o chart0000 -s off -f 9666/9666/9666 9667/9667/9667 9668/9668/9668 -f 9666/9666/9666 9668/9668/9668 9669/9669/9669 -v 10691.5 23616 2594.7 -vt 0.388612 0.297197 -v 10691.5 22461 2594.7 -vt 0.397756 0.297197 -v 10856.5 22461 2594.7 -vt 0.397756 0.298846 -v 10856.5 23616 2594.7 -vt 0.388612 0.298846 -o mesh1896 -s off -f 9670/9670/9670 9671/9671/9671 9672/9672/9672 -f 9670/9670/9670 9672/9672/9672 9673/9673/9673 -g charts -o chart0000 -s off -f 9670/9670/9670 9671/9671/9671 9672/9672/9672 -f 9670/9670/9670 9672/9672/9672 9673/9673/9673 -v 10691.5 22461 2594.7 -vt 0.992934 0.523908 -v 10691.5 22461 -285.3 -vt 0.992934 0.546991 -v 10856.5 22461 -285.3 -vt 0.994597 0.546991 -v 10856.5 22461 2594.7 -vt 0.994597 0.523908 -o mesh1897 -s off -f 9674/9674/9674 9675/9675/9675 9676/9676/9676 -f 9674/9674/9674 9676/9676/9676 9677/9677/9677 -g charts -o chart0000 -s off -f 9674/9674/9674 9675/9675/9675 9676/9676/9676 -f 9674/9674/9674 9676/9676/9676 9677/9677/9677 -v 10691.5 22461 -285.3 -vt 0.313799 0.531327 -v 10691.5 23616 -285.3 -vt 0.313799 0.522259 -v 10856.5 23616 -285.3 -vt 0.312136 0.522259 -v 10856.5 22461 -285.3 -vt 0.312136 0.531327 -o mesh1898 -s off -f 9678/9678/9678 9679/9679/9679 9680/9680/9680 -f 9678/9678/9678 9680/9680/9680 9681/9681/9681 -g charts -o chart0000 -s off -f 9678/9678/9678 9679/9679/9679 9680/9680/9680 -f 9678/9678/9678 9680/9680/9680 9681/9681/9681 -v 10691.5 18433.5 -285.3 -vt 0.730258 0.894064 -v 10691.5 20593.5 -285.3 -vt 0.712801 0.894064 -v 10856.5 20593.5 -285.3 -vt 0.712801 0.892416 -v 10856.5 18433.5 -285.3 -vt 0.730258 0.892416 -o mesh1899 -s off -f 9682/9682/9682 9683/9683/9683 9684/9684/9684 -f 9682/9682/9682 9684/9684/9684 9685/9685/9685 -g charts -o chart0000 -s off -f 9682/9682/9682 9683/9683/9683 9684/9684/9684 -f 9682/9682/9682 9684/9684/9684 9685/9685/9685 -v 10691.5 20593.5 -285.3 -vt 0.790939 0.531327 -v 10691.5 20593.5 2594.7 -vt 0.767664 0.531327 -v 10856.5 20593.5 2594.7 -vt 0.767664 0.529678 -v 10856.5 20593.5 -285.3 -vt 0.790939 0.529678 -o mesh1900 -s off -f 9686/9686/9686 9687/9687/9687 9688/9688/9688 -f 9686/9686/9686 9688/9688/9688 9689/9689/9689 -g charts -o chart0000 -s off -f 9686/9686/9686 9687/9687/9687 9688/9688/9688 -f 9686/9686/9686 9688/9688/9688 9689/9689/9689 -v 10691.5 20593.5 2594.7 -vt 0.647132 0.941055 -v 10691.5 18433.5 2594.7 -vt 0.664588 0.941055 -v 10856.5 18433.5 2594.7 -vt 0.664588 0.942704 -v 10856.5 20593.5 2594.7 -vt 0.647132 0.942704 -o mesh1901 -s off -f 9690/9690/9690 9691/9691/9691 9692/9692/9692 -f 9690/9690/9690 9692/9692/9692 9693/9693/9693 -g charts -o chart0000 -s off -f 9690/9690/9690 9691/9691/9691 9692/9692/9692 -f 9690/9690/9690 9692/9692/9692 9693/9693/9693 -v 10691.5 18433.5 2594.7 -vt 0.060266 0.748145 -v 10691.5 18433.5 -285.3 -vt 0.060266 0.771228 -v 10856.5 18433.5 -285.3 -vt 0.0619284 0.771228 -v 10856.5 18433.5 2594.7 -vt 0.0619284 0.748145 -o mesh1902 -s off -f 9694/9694/9694 9695/9695/9695 9696/9696/9696 -f 9694/9694/9694 9696/9696/9696 9697/9697/9697 -g charts -o chart0000 -s off -f 9694/9694/9694 9695/9695/9695 9696/9696/9696 -f 9694/9694/9694 9696/9696/9696 9697/9697/9697 -v 15236.5 25026 3899.7 -vt 0.918953 0.311212 -v 15236.5 25026 5819.7 -vt 0.918953 0.295548 -v 15236.5 24861 5819.7 -vt 0.91729 0.295548 -v 15236.5 24861 3899.7 -vt 0.91729 0.311212 -o mesh1903 -s off -f 9698/9698/9698 9699/9699/9699 9700/9700/9700 -f 9698/9698/9698 9700/9700/9700 9701/9701/9701 -g charts -o chart0000 -s off -f 9698/9698/9698 9699/9699/9699 9700/9700/9700 -f 9698/9698/9698 9700/9700/9700 9701/9701/9701 -v 15236.5 25026 5819.7 -vt 0.000415628 0.847898 -v 11906.5 25026 5819.7 -vt 0.000415628 0.874279 -v 11906.5 24861 5819.7 -vt 0.00207805 0.874279 -v 15236.5 24861 5819.7 -vt 0.00207805 0.847898 -o mesh1904 -s off -f 9702/9702/9702 9703/9703/9703 9704/9704/9704 -f 9702/9702/9702 9704/9704/9704 9705/9705/9705 -g charts -o chart0000 -s off -f 9702/9702/9702 9703/9703/9703 9704/9704/9704 -f 9702/9702/9702 9704/9704/9704 9705/9705/9705 -v 11906.5 25026 5819.7 -vt 0.439318 0.159522 -v 11906.5 25026 3899.7 -vt 0.455112 0.159522 -v 11906.5 24861 3899.7 -vt 0.455112 0.161171 -v 11906.5 24861 5819.7 -vt 0.439318 0.161171 -o mesh1905 -s off -f 9706/9706/9706 9707/9707/9707 9708/9708/9708 -f 9706/9706/9706 9708/9708/9708 9709/9709/9709 -g charts -o chart0000 -s off -f 9706/9706/9706 9707/9707/9707 9708/9708/9708 -f 9706/9706/9706 9708/9708/9708 9709/9709/9709 -v 11906.5 25026 3899.7 -vt 0.88404 0.5338 -v 15236.5 25026 3899.7 -vt 0.88404 0.50742 -v 15236.5 24861 3899.7 -vt 0.882377 0.50742 -v 11906.5 24861 3899.7 -vt 0.882377 0.5338 -o mesh1906 -s off -f 9710/9710/9710 9711/9711/9711 9712/9712/9712 -f 9710/9710/9710 9712/9712/9712 9713/9713/9713 -g charts -o chart0000 -s off -f 9710/9710/9710 9711/9711/9711 9712/9712/9712 -f 9710/9710/9710 9712/9712/9712 9713/9713/9713 -v 10691.5 24763.5 3884.7 -vt 0.89069 0.698681 -v 10691.5 24763.5 5804.7 -vt 0.89069 0.683017 -v 10856.5 24763.5 5804.7 -vt 0.889027 0.683017 -v 10856.5 24763.5 3884.7 -vt 0.889027 0.698681 -o mesh1907 -s off -f 9714/9714/9714 9715/9715/9715 9716/9716/9716 -f 9714/9714/9714 9716/9716/9716 9717/9717/9717 -g charts -o chart0000 -s off -f 9714/9714/9714 9715/9715/9715 9716/9716/9716 -f 9714/9714/9714 9716/9716/9716 9717/9717/9717 -v 10691.5 24763.5 5804.7 -vt 0.00207814 0.952597 -v 10691.5 22558.5 5804.7 -vt 0.00207814 0.969909 -v 10856.5 22558.5 5804.7 -vt 0.00374057 0.969909 -v 10856.5 24763.5 5804.7 -vt 0.00374057 0.952597 -o mesh1908 -s off -f 9718/9718/9718 9719/9719/9719 9720/9720/9720 -f 9718/9718/9718 9720/9720/9720 9721/9721/9721 -g charts -o chart0000 -s off -f 9718/9718/9718 9719/9719/9719 9720/9720/9720 -f 9718/9718/9718 9720/9720/9720 9721/9721/9721 -v 10691.5 22558.5 5804.7 -vt 0.958022 0.711047 -v 10691.5 22558.5 3884.7 -vt 0.958022 0.726711 -v 10856.5 22558.5 3884.7 -vt 0.959684 0.726711 -v 10856.5 22558.5 5804.7 -vt 0.959684 0.711047 -o mesh1909 -s off -f 9722/9722/9722 9723/9723/9723 9724/9724/9724 -f 9722/9722/9722 9724/9724/9724 9725/9725/9725 -g charts -o chart0000 -s off -f 9722/9722/9722 9723/9723/9723 9724/9724/9724 -f 9722/9722/9722 9724/9724/9724 9725/9725/9725 -v 10691.5 22558.5 3884.7 -vt 0.762677 0.796785 -v 10691.5 24763.5 3884.7 -vt 0.74522 0.796785 -v 10856.5 24763.5 3884.7 -vt 0.74522 0.795136 -v 10856.5 22558.5 3884.7 -vt 0.762677 0.795136 -o mesh1910 -s off -f 9726/9726/9726 9727/9727/9727 9728/9728/9728 -f 9726/9726/9726 9728/9728/9728 9729/9729/9729 -g charts -o chart0000 -s off -f 9726/9726/9726 9727/9727/9727 9728/9728/9728 -f 9726/9726/9726 9728/9728/9728 9729/9729/9729 -v 16451.5 24763.5 5804.7 -vt 0.933915 0.420857 -v 16451.5 24763.5 3884.7 -vt 0.949709 0.420857 -v 16286.5 24763.5 3884.7 -vt 0.949709 0.422506 -v 16286.5 24763.5 5804.7 -vt 0.933915 0.422506 -o mesh1911 -s off -f 9730/9730/9730 9731/9731/9731 9732/9732/9732 -f 9730/9730/9730 9732/9732/9732 9733/9733/9733 -g charts -o chart0000 -s off -f 9730/9730/9730 9731/9731/9731 9732/9732/9732 -f 9730/9730/9730 9732/9732/9732 9733/9733/9733 -v 16451.5 24763.5 3884.7 -vt 0.421031 0.512366 -v 16451.5 22558.5 3884.7 -vt 0.438487 0.512366 -v 16286.5 22558.5 3884.7 -vt 0.438487 0.514015 -v 16286.5 24763.5 3884.7 -vt 0.421031 0.514015 -o mesh1912 -s off -f 9734/9734/9734 9735/9735/9735 9736/9736/9736 -f 9734/9734/9734 9736/9736/9736 9737/9737/9737 -g charts -o chart0000 -s off -f 9734/9734/9734 9735/9735/9735 9736/9736/9736 -f 9734/9734/9734 9736/9736/9736 9737/9737/9737 -v 16451.5 22558.5 3884.7 -vt 0.882377 0.997939 -v 16451.5 22558.5 5804.7 -vt 0.866584 0.997939 -v 16286.5 22558.5 5804.7 -vt 0.866584 0.99629 -v 16286.5 22558.5 3884.7 -vt 0.882377 0.99629 -o mesh1913 -s off -f 9738/9738/9738 9739/9739/9739 9740/9740/9740 -f 9738/9738/9738 9740/9740/9740 9741/9741/9741 -g charts -o chart0000 -s off -f 9738/9738/9738 9739/9739/9739 9740/9740/9740 -f 9738/9738/9738 9740/9740/9740 9741/9741/9741 -v 16451.5 22558.5 5804.7 -vt 0.267248 0.673124 -v 16451.5 24763.5 5804.7 -vt 0.249792 0.673124 -v 16286.5 24763.5 5804.7 -vt 0.249792 0.671476 -v 16286.5 22558.5 5804.7 -vt 0.267248 0.671476 -o mesh1914 -s off -f 9742/9742/9742 9743/9743/9743 9744/9744/9744 -f 9742/9742/9742 9744/9744/9744 9745/9745/9745 -g charts -o chart0000 -s off -f 9742/9742/9742 9743/9743/9743 9744/9744/9744 -f 9742/9742/9742 9744/9744/9744 9745/9745/9745 -v -8216 17871 -285.3 -vt 0.10931 0.490107 -v -8216 4955.99 -285.3 -vt 0.211554 0.490107 -v -13976 4955.99 -285.3 -vt 0.211554 0.535449 -v -13976 17871 -285.3 -vt 0.10931 0.535449 -o mesh1915 -s off -f 9746/9746/9746 9747/9747/9747 9748/9748/9748 -f 9746/9746/9746 9748/9748/9748 9749/9749/9749 -g charts -o chart0000 -s off -f 9746/9746/9746 9747/9747/9747 9748/9748/9748 -f 9746/9746/9746 9748/9748/9748 9749/9749/9749 -v -8216 4955.99 -285.3 -vt 0.764339 0.884171 -v -8216 17871 -285.3 -vt 0.662095 0.884171 -v -8216 17871 5710.95 -vt 0.662095 0.837181 -v -8216 4955.99 5710.95 -vt 0.764339 0.837181 -o mesh1916 -s off -f 9750/9750/9750 9751/9751/9751 9752/9752/9752 -f 9750/9750/9750 9752/9752/9752 9753/9753/9753 -g charts -o chart0000 -s off -f 9750/9750/9750 9751/9751/9751 9752/9752/9752 -f 9750/9750/9750 9752/9752/9752 9753/9753/9753 -v -8216 4955.99 -285.3 -vt 0.947215 0.763809 -v -8216 4955.99 5710.95 -vt 0.947215 0.716535 -v -11096 4955.99 7870.95 -vt 0.924356 0.699505 -v -13976 4955.99 5710.95 -vt 0.901496 0.716535 -v -13976 4955.99 -285.3 -vt 0.901496 0.763809 -o mesh1917 -s off -f 9754/9754/9754 9755/9755/9755 9756/9756/9756 -f 9754/9754/9754 9756/9756/9756 9757/9757/9757 -f 9754/9754/9754 9757/9757/9757 9758/9758/9758 -g charts -o chart0000 -s off -f 9754/9754/9754 9755/9755/9755 9756/9756/9756 -f 9754/9754/9754 9756/9756/9756 9757/9757/9757 -f 9754/9754/9754 9757/9757/9757 9758/9758/9758 -v -13976 4955.99 -285.3 -vt 0.874896 0.822341 -v -13976 4955.99 5710.95 -vt 0.874896 0.869332 -v -13976 17871 5710.95 -vt 0.772652 0.869332 -v -13976 17871 -285.3 -vt 0.772652 0.822341 -o mesh1918 -s off -f 9759/9759/9759 9760/9760/9760 9761/9761/9761 -f 9759/9759/9759 9761/9761/9761 9762/9762/9762 -g charts -o chart0000 -s off -f 9759/9759/9759 9760/9760/9760 9761/9761/9761 -f 9759/9759/9759 9761/9761/9761 9762/9762/9762 -v -13811 5120.99 -285.3 -vt 0.962178 0.553586 -v -13811 5120.99 5834.7 -vt 0.962178 0.505336 -v -11096 5120.99 7870.95 -vt 0.940565 0.489283 -v -8381 5120.99 5834.7 -vt 0.918953 0.505336 -v -8381 5120.99 -285.3 -vt 0.918953 0.553586 -o mesh1919 -s off -f 9763/9763/9763 9764/9764/9764 9765/9765/9765 -f 9763/9763/9763 9765/9765/9765 9766/9766/9766 -f 9763/9763/9763 9766/9766/9766 9767/9767/9767 -g charts -o chart0000 -s off -f 9763/9763/9763 9764/9764/9764 9765/9765/9765 -f 9763/9763/9763 9765/9765/9765 9766/9766/9766 -f 9763/9763/9763 9766/9766/9766 9767/9767/9767 -v -11096 17871 7870.95 -vt 0.790939 0.870157 -v -11096 5120.99 7870.95 -vt 0.891877 0.870157 -v -11096 4955.99 7870.95 -vt 0.893184 0.870157 -v -13976 4955.99 5710.95 -vt 0.893184 0.899011 -v -13976 17871 5710.95 -vt 0.790939 0.899011 -o mesh1920 -s off -f 9768/9768/9768 9769/9769/9769 9770/9770/9770 -f 9768/9768/9768 9770/9770/9770 9771/9771/9771 -f 9768/9768/9768 9771/9771/9771 9772/9772/9772 -g charts -o chart0000 -s off -f 9768/9768/9768 9769/9769/9769 9770/9770/9770 -f 9768/9768/9768 9770/9770/9770 9771/9771/9771 -f 9768/9768/9768 9771/9771/9771 9772/9772/9772 -v -11096 4955.99 7870.95 -vt 0.906484 0.136439 -v -11096 5120.99 7870.95 -vt 0.906484 0.135143 -v -11096 17871 7870.95 -vt 0.906484 0.0350371 -v -8216 17871 5710.95 -vt 0.87739 0.0350371 -v -8216 4955.99 5710.95 -vt 0.87739 0.136439 -o mesh1921 -s off -f 9773/9773/9773 9774/9774/9774 9775/9775/9775 -f 9773/9773/9773 9775/9775/9775 9776/9776/9776 -f 9773/9773/9773 9776/9776/9776 9777/9777/9777 -g charts -o chart0000 -s off -f 9773/9773/9773 9774/9774/9774 9775/9775/9775 -f 9773/9773/9773 9775/9775/9775 9776/9776/9776 -f 9773/9773/9773 9776/9776/9776 9777/9777/9777 -v -12761 17151 2705.32 -vt 0.18911 0.972383 -v -12761 17151 3539.7 -vt 0.18911 0.978978 -v -9431 17151 3539.7 -vt 0.16251 0.978978 -v -9431 17151 2705.32 -vt 0.16251 0.972383 -o mesh1922 -s off -f 9778/9778/9778 9779/9779/9779 9780/9780/9780 -f 9778/9778/9778 9780/9780/9780 9781/9781/9781 -g charts -o chart0000 -s off -f 9778/9778/9778 9779/9779/9779 9780/9780/9780 -f 9778/9778/9778 9780/9780/9780 9781/9781/9781 -v -13976 17871 -285.3 -vt 0.947215 0.861913 -v -12771.3 17871 284.7 -vt 0.937654 0.866407 -v -8216 17871 -285.3 -vt 0.901496 0.861913 -v -13976 17871 5710.95 -vt 0.947215 0.909187 -v -9441.35 17871 284.7 -vt 0.911222 0.866407 -v -12771.3 17871 2204.7 -vt 0.937654 0.881544 -v -12761 17871 2705.32 -vt 0.937571 0.88549 -v -9441.35 17871 2204.7 -vt 0.911222 0.881544 -v -12761 17871 5459.7 -vt 0.937571 0.907206 -v -9431 17871 5459.7 -vt 0.91114 0.907206 -v -8216 17871 5710.95 -vt 0.901496 0.909187 -v -11096 17871 7870.95 -vt 0.924356 0.926216 -v -9431 17871 2705.32 -vt 0.91114 0.88549 -o mesh1923 -s off -f 9782/9782/9782 9783/9783/9783 9784/9784/9784 -f 9783/9783/9783 9782/9782/9782 9785/9785/9785 -f 9784/9784/9784 9783/9783/9783 9786/9786/9786 -f 9783/9783/9783 9785/9785/9785 9787/9787/9787 -f 9787/9787/9787 9785/9785/9785 9788/9788/9788 -f 9787/9787/9787 9788/9788/9788 9789/9789/9789 -f 9788/9788/9788 9785/9785/9785 9790/9790/9790 -f 9790/9790/9790 9785/9785/9785 9791/9791/9791 -f 9791/9791/9791 9785/9785/9785 9792/9792/9792 -f 9792/9792/9792 9785/9785/9785 9793/9793/9793 -f 9786/9786/9786 9792/9792/9792 9784/9784/9784 -f 9792/9792/9792 9786/9786/9786 9789/9789/9789 -f 9792/9792/9792 9789/9789/9789 9794/9794/9794 -f 9794/9794/9794 9789/9789/9789 9788/9788/9788 -f 9792/9792/9792 9794/9794/9794 9791/9791/9791 -g charts -o chart0000 -s off -f 9782/9782/9782 9783/9783/9783 9784/9784/9784 -f 9783/9783/9783 9782/9782/9782 9785/9785/9785 -f 9784/9784/9784 9783/9783/9783 9786/9786/9786 -f 9783/9783/9783 9785/9785/9785 9787/9787/9787 -f 9787/9787/9787 9785/9785/9785 9788/9788/9788 -f 9787/9787/9787 9788/9788/9788 9789/9789/9789 -f 9788/9788/9788 9785/9785/9785 9790/9790/9790 -f 9790/9790/9790 9785/9785/9785 9791/9791/9791 -f 9791/9791/9791 9785/9785/9785 9792/9792/9792 -f 9792/9792/9792 9785/9785/9785 9793/9793/9793 -f 9786/9786/9786 9792/9792/9792 9784/9784/9784 -f 9792/9792/9792 9786/9786/9786 9789/9789/9789 -f 9792/9792/9792 9789/9789/9789 9794/9794/9794 -f 9794/9794/9794 9789/9789/9789 9788/9788/9788 -f 9792/9792/9792 9794/9794/9794 9791/9791/9791 -v -12761 17871 5459.7 -vt 0.201579 0.997114 -v -12761 16654.1 5459.7 -vt 0.201579 0.987222 -v -12761 16654.1 3539.7 -vt 0.185934 0.987222 -v -12761 17151 3539.7 -vt 0.185934 0.991261 -v -12761 17151 2705.32 -vt 0.179136 0.991261 -v -12761 17871 2705.32 -vt 0.179136 0.997114 -o mesh1924 -s off -f 9795/9795/9795 9796/9796/9796 9797/9797/9797 -f 9795/9795/9795 9797/9797/9797 9798/9798/9798 -f 9795/9795/9795 9798/9798/9798 9799/9799/9799 -f 9795/9795/9795 9799/9799/9799 9800/9800/9800 -g charts -o chart0000 -s off -f 9795/9795/9795 9796/9796/9796 9797/9797/9797 -f 9795/9795/9795 9797/9797/9797 9798/9798/9798 -f 9795/9795/9795 9798/9798/9798 9799/9799/9799 -f 9795/9795/9795 9799/9799/9799 9800/9800/9800 -v -12761 17151 2705.32 -vt 0.0793848 0.673124 -v -9431 17151 2705.32 -vt 0.0793848 0.646744 -v -9431 17871 2705.32 -vt 0.0735661 0.646744 -v -12761 17871 2705.32 -vt 0.0735661 0.673124 -o mesh1925 -s off -f 9801/9801/9801 9802/9802/9802 9803/9803/9803 -f 9801/9801/9801 9803/9803/9803 9804/9804/9804 -g charts -o chart0000 -s off -f 9801/9801/9801 9802/9802/9802 9803/9803/9803 -f 9801/9801/9801 9803/9803/9803 9804/9804/9804 -v -9431 17151 2705.32 -vt 0.679551 0.688788 -v -9431 17151 3539.7 -vt 0.686201 0.688788 -v -9431 16654.1 3539.7 -vt 0.686201 0.69291 -v -9431 17151 2705.32 -vt 0.978886 0.835532 -v -9431 16654.1 3539.7 -vt 0.982959 0.842275 -v -9431 16654.1 5459.7 -vt 0.982959 0.857791 -v -9431 17871 5459.7 -vt 0.972984 0.857791 -v -9431 17871 2705.32 -vt 0.972984 0.835532 -o mesh1926 -s off -f 9805/9805/9805 9806/9806/9806 9807/9807/9807 -f 9808/9808/9808 9809/9809/9809 9810/9810/9810 -f 9808/9808/9808 9810/9810/9810 9811/9811/9811 -f 9808/9808/9808 9811/9811/9811 9812/9812/9812 -g charts -o chart0000 -s off -f 9805/9805/9805 9806/9806/9806 9807/9807/9807 -o chart0001 -s off -f 9808/9808/9808 9809/9809/9809 9810/9810/9810 -f 9808/9808/9808 9810/9810/9810 9811/9811/9811 -f 9808/9808/9808 9811/9811/9811 9812/9812/9812 -v -9431 17871 5459.7 -vt 0.105985 0.978978 -v -9431 16654.1 5459.7 -vt 0.09601 0.978978 -v -12761 16654.1 5459.7 -vt 0.09601 0.952597 -v -12761 17871 5459.7 -vt 0.105985 0.952597 -o mesh1927 -s off -f 9813/9813/9813 9814/9814/9814 9815/9815/9815 -f 9813/9813/9813 9815/9815/9815 9816/9816/9816 -g charts -o chart0000 -s off -f 9813/9813/9813 9814/9814/9814 9815/9815/9815 -f 9813/9813/9813 9815/9815/9815 9816/9816/9816 -v -9431 17151 3539.7 -vt 0.263092 0.478566 -v -12761 17151 3539.7 -vt 0.289692 0.478566 -v -12761 16654.1 3539.7 -vt 0.289692 0.482687 -v -9431 16654.1 3539.7 -vt 0.263092 0.482687 -o mesh1928 -s off -f 9817/9817/9817 9818/9818/9818 9819/9819/9819 -f 9817/9817/9817 9819/9819/9819 9820/9820/9820 -g charts -o chart0000 -s off -f 9817/9817/9817 9818/9818/9818 9819/9819/9819 -f 9817/9817/9817 9819/9819/9819 9820/9820/9820 -v -9441.35 17871 2204.7 -vt 0.183292 0.630256 -v -9441.35 17871 284.7 -vt 0.183292 0.645919 -v -9441.35 16991.6 284.7 -vt 0.190773 0.645919 -v -9441.35 16991.6 2204.7 -vt 0.190773 0.630256 -o mesh1929 -s off -f 9821/9821/9821 9822/9822/9822 9823/9823/9823 -f 9821/9821/9821 9823/9823/9823 9824/9824/9824 -g charts -o chart0000 -s off -f 9821/9821/9821 9822/9822/9822 9823/9823/9823 -f 9821/9821/9821 9823/9823/9823 9824/9824/9824 -v -9441.35 17871 284.7 -vt 0.885702 0.142209 -v -12771.3 17871 284.7 -vt 0.912302 0.142209 -v -12771.3 16991.6 284.7 -vt 0.912302 0.149629 -v -9441.35 16991.6 284.7 -vt 0.885702 0.149629 -o mesh1930 -s off -f 9825/9825/9825 9826/9826/9826 9827/9827/9827 -f 9825/9825/9825 9827/9827/9827 9828/9828/9828 -g charts -o chart0000 -s off -f 9825/9825/9825 9826/9826/9826 9827/9827/9827 -f 9825/9825/9825 9827/9827/9827 9828/9828/9828 -v -12771.3 17871 284.7 -vt 0.299667 0.613767 -v -12771.3 17871 2204.7 -vt 0.283874 0.613767 -v -12771.3 16991.6 2204.7 -vt 0.283874 0.606348 -v -12771.3 16991.6 284.7 -vt 0.299667 0.606348 -o mesh1931 -s off -f 9829/9829/9829 9830/9830/9830 9831/9831/9831 -f 9829/9829/9829 9831/9831/9831 9832/9832/9832 -g charts -o chart0000 -s off -f 9829/9829/9829 9830/9830/9830 9831/9831/9831 -f 9829/9829/9829 9831/9831/9831 9832/9832/9832 -v -12771.3 17871 2204.7 -vt 0.655445 0.47197 -v -9441.35 17871 2204.7 -vt 0.628845 0.47197 -v -9441.35 16991.6 2204.7 -vt 0.628845 0.464551 -v -12771.3 16991.6 2204.7 -vt 0.655445 0.464551 -o mesh1932 -s off -f 9833/9833/9833 9834/9834/9834 9835/9835/9835 -f 9833/9833/9833 9835/9835/9835 9836/9836/9836 -g charts -o chart0000 -s off -f 9833/9833/9833 9834/9834/9834 9835/9835/9835 -f 9833/9833/9833 9835/9835/9835 9836/9836/9836 -v -7943.46 18591 5506.54 -vt 0.343724 0.85202 -v -7943.46 4198.49 5506.54 -vt 0.457606 0.85202 -v -11096 4198.49 7870.95 -vt 0.457606 0.883347 -v -11096 18591 7870.95 -vt 0.343724 0.883347 -o mesh1933 -s off -f 9837/9837/9837 9838/9838/9838 9839/9839/9839 -f 9837/9837/9837 9839/9839/9839 9840/9840/9840 -g charts -o chart0000 -s off -f 9837/9837/9837 9838/9838/9838 9839/9839/9839 -f 9837/9837/9837 9839/9839/9839 9840/9840/9840 -v -7844.1 18591 5639.02 -vt 0.192435 0.883347 -v -11096 18591 8077.95 -vt 0.192435 0.851195 -v -11096 4198.49 8077.95 -vt 0.0785536 0.851195 -v -7844.1 4198.49 5639.02 -vt 0.0785536 0.883347 -o mesh1934 -s off -f 9841/9841/9841 9842/9842/9842 9843/9843/9843 -f 9841/9841/9841 9843/9843/9843 9844/9844/9844 -g charts -o chart0000 -s off -f 9841/9841/9841 9842/9842/9842 9843/9843/9843 -f 9841/9841/9841 9843/9843/9843 9844/9844/9844 -v -11096 4198.49 7870.95 -vt 0.861604 0.191725 -v -7943.46 4198.49 5506.54 -vt 0.880715 0.216449 -v -7844.1 4198.49 5639.02 -vt 0.879646 0.21723 -v -11096 4198.49 8077.95 -vt 0.859933 0.191727 -v -14356.4 4198.49 5632.62 -vt 0.879645 0.166117 -v -14257.1 4198.49 5500.14 -vt 0.880715 0.166896 -o mesh1935 -s off -f 9845/9845/9845 9846/9846/9846 9847/9847/9847 -f 9845/9845/9845 9847/9847/9847 9848/9848/9848 -f 9845/9845/9845 9848/9848/9848 9849/9849/9849 -f 9845/9845/9845 9849/9849/9849 9850/9850/9850 -g charts -o chart0000 -s off -f 9845/9845/9845 9846/9846/9846 9847/9847/9847 -f 9845/9845/9845 9847/9847/9847 9848/9848/9848 -f 9845/9845/9845 9848/9848/9848 9849/9849/9849 -f 9845/9845/9845 9849/9849/9849 9850/9850/9850 -v -11096 18591 8077.95 -vt 0.0843189 0.973207 -v -7844.1 18591 5639.02 -vt 0.0586035 0.992757 -v -7943.46 18591 5506.54 -vt 0.0593909 0.993817 -v -11096 18591 7870.95 -vt 0.0843206 0.974864 -v -14257.1 18591 5500.14 -vt 0.109356 0.993817 -v -14356.4 18591 5632.62 -vt 0.110141 0.992756 -o mesh1936 -s off -f 9851/9851/9851 9852/9852/9852 9853/9853/9853 -f 9851/9851/9851 9853/9853/9853 9854/9854/9854 -f 9851/9851/9851 9854/9854/9854 9855/9855/9855 -f 9851/9851/9851 9855/9855/9855 9856/9856/9856 -g charts -o chart0000 -s off -f 9851/9851/9851 9852/9852/9852 9853/9853/9853 -f 9851/9851/9851 9853/9853/9853 9854/9854/9854 -f 9851/9851/9851 9854/9854/9854 9855/9855/9855 -f 9851/9851/9851 9855/9855/9855 9856/9856/9856 -v -14356.4 18591 5632.62 -vt 0.120116 0.917147 -v -14257.1 18591 5500.14 -vt 0.120116 0.915499 -v -14257.1 4198.49 5500.14 -vt 0.00623441 0.915499 -v -14356.4 4198.49 5632.62 -vt 0.00623441 0.917147 -o mesh1937 -s off -f 9857/9857/9857 9858/9858/9858 9859/9859/9859 -f 9857/9857/9857 9859/9859/9859 9860/9860/9860 -g charts -o chart0000 -s off -f 9857/9857/9857 9858/9858/9858 9859/9859/9859 -f 9857/9857/9857 9859/9859/9859 9860/9860/9860 -v -7943.46 18591 5506.54 -vt 0.88404 0.275762 -v -7844.1 18591 5639.02 -vt 0.882377 0.275762 -v -7844.1 4198.49 5639.02 -vt 0.882377 0.162819 -v -7943.46 4198.49 5506.54 -vt 0.88404 0.162819 -o mesh1938 -s off -f 9861/9861/9861 9862/9862/9862 9863/9863/9863 -f 9861/9861/9861 9863/9863/9863 9864/9864/9864 -g charts -o chart0000 -s off -f 9861/9861/9861 9862/9862/9862 9863/9863/9863 -f 9861/9861/9861 9863/9863/9863 9864/9864/9864 -v -11096 18591 8077.95 -vt 0.432668 0.83141 -v -14356.4 18591 5632.62 -vt 0.400249 0.83141 -v -14356.4 4198.49 5632.62 -vt 0.400249 0.718467 -v -11096 4198.49 8077.95 -vt 0.432668 0.718467 -o mesh1939 -s off -f 9865/9865/9865 9866/9866/9866 9867/9867/9867 -f 9865/9865/9865 9867/9867/9867 9868/9868/9868 -g charts -o chart0000 -s off -f 9865/9865/9865 9866/9866/9866 9867/9867/9867 -f 9865/9865/9865 9867/9867/9867 9868/9868/9868 -v -11096 4198.49 7870.95 -vt 0.342061 0.849547 -v -14257.1 4198.49 5500.14 -vt 0.342061 0.880874 -v -14257.1 18591 5500.14 -vt 0.22818 0.880874 -v -11096 18591 7870.95 -vt 0.22818 0.849547 -o mesh1940 -s off -f 9869/9869/9869 9870/9870/9870 9871/9871/9871 -f 9869/9869/9869 9871/9871/9871 9872/9872/9872 -g charts -o chart0000 -s off -f 9869/9869/9869 9870/9870/9870 9871/9871/9871 -f 9869/9869/9869 9871/9871/9871 9872/9872/9872 -v -8381 16101 2954.7 -vt 0.5532 0.925391 -v -13811 16101 2954.7 -vt 0.5532 0.882523 -v -13811 5120.99 2954.7 -vt 0.465919 0.882523 -v -8381 5120.99 2954.7 -vt 0.465919 0.925391 -o mesh1941 -s off -f 9873/9873/9873 9874/9874/9874 9875/9875/9875 -f 9873/9873/9873 9875/9875/9875 9876/9876/9876 -g charts -o chart0000 -s off -f 9873/9873/9873 9874/9874/9874 9875/9875/9875 -f 9873/9873/9873 9875/9875/9875 9876/9876/9876 -v -13811 16101 2594.7 -vt 0.34788 0.92704 -v -8381 16101 2594.7 -vt 0.34788 0.884171 -v -8381 5120.99 2594.7 -vt 0.260599 0.884171 -v -13811 5120.99 2594.7 -vt 0.260599 0.92704 -o mesh1942 -s off -f 9877/9877/9877 9878/9878/9878 9879/9879/9879 -f 9877/9877/9877 9879/9879/9879 9880/9880/9880 -g charts -o chart0000 -s off -f 9877/9877/9877 9878/9878/9878 9879/9879/9879 -f 9877/9877/9877 9879/9879/9879 9880/9880/9880 -v -13811 16101 2954.7 -vt 0.98379 0.201566 -v -8381 16101 2954.7 -vt 0.98379 0.158697 -v -8381 16101 2594.7 -vt 0.980466 0.158697 -v -13811 16101 2594.7 -vt 0.980466 0.201566 -o mesh1943 -s off -f 9881/9881/9881 9882/9882/9882 9883/9883/9883 -f 9881/9881/9881 9883/9883/9883 9884/9884/9884 -g charts -o chart0000 -s off -f 9881/9881/9881 9882/9882/9882 9883/9883/9883 -f 9881/9881/9881 9883/9883/9883 9884/9884/9884 -v -13811 5120.99 2954.7 -vt 0.356193 0.429926 -v -13811 16101 2954.7 -vt 0.268911 0.429926 -v -13811 16101 2594.7 -vt 0.268911 0.426628 -v -13811 5120.99 2594.7 -vt 0.356193 0.426628 -o mesh1944 -s off -f 9885/9885/9885 9886/9886/9886 9887/9887/9887 -f 9885/9885/9885 9887/9887/9887 9888/9888/9888 -g charts -o chart0000 -s off -f 9885/9885/9885 9886/9886/9886 9887/9887/9887 -f 9885/9885/9885 9887/9887/9887 9888/9888/9888 -v -8381 5120.99 2954.7 -vt 0.460931 0.88582 -v -13811 5120.99 2954.7 -vt 0.460931 0.928689 -v -13811 5120.99 2594.7 -vt 0.464256 0.928689 -v -8381 5120.99 2594.7 -vt 0.464256 0.88582 -o mesh1945 -s off -f 9889/9889/9889 9890/9890/9890 9891/9891/9891 -f 9889/9889/9889 9891/9891/9891 9892/9892/9892 -g charts -o chart0000 -s off -f 9889/9889/9889 9890/9890/9890 9891/9891/9891 -f 9889/9889/9889 9891/9891/9891 9892/9892/9892 -v -8381 16101 2954.7 -vt 0.227348 0.588211 -v -8381 5120.99 2954.7 -vt 0.31463 0.588211 -v -8381 5120.99 2594.7 -vt 0.31463 0.591509 -v -8381 16101 2594.7 -vt 0.227348 0.591509 -o mesh1946 -s off -f 9893/9893/9893 9894/9894/9894 9895/9895/9895 -f 9893/9893/9893 9895/9895/9895 9896/9896/9896 -g charts -o chart0000 -s off -f 9893/9893/9893 9894/9894/9894 9895/9895/9895 -f 9893/9893/9893 9895/9895/9895 9896/9896/9896 -v -16691 -2244.01 1310.32 -vt 0.931421 0.847898 -v -8381 -2244.01 1310.32 -vt 0.931421 0.78277 -v -8381 -8394.01 1310.32 -vt 0.882377 0.78277 -v -16691 -8394.01 1310.32 -vt 0.882377 0.847898 -o mesh1947 -s off -f 9897/9897/9897 9898/9898/9898 9899/9899/9899 -f 9897/9897/9897 9899/9899/9899 9900/9900/9900 -g charts -o chart0000 -s off -f 9897/9897/9897 9898/9898/9898 9899/9899/9899 -f 9897/9897/9897 9899/9899/9899 9900/9900/9900 -v -12026 -2079.01 4190.33 -vt 0.93368 0.387749 -v -12026 -2079.01 -285.3 -vt 0.969659 0.387749 -v -8216 -2079.01 -285.3 -vt 0.969659 0.41756 -v -8216 -2079.01 1310.32 -vt 0.956832 0.41756 -v -8216 -2079.01 3314.7 -vt 0.940719 0.41756 -v -8216 -2079.01 4574.7 -vt 0.93059 0.41756 -v -16856 -2079.01 4574.7 -vt 0.93059 0.349959 -v -16856 -2079.01 -285.3 -vt 0.969659 0.349959 -v -12191 -2079.01 -285.3 -vt 0.969659 0.386459 -v -12026 -2079.01 4190.33 -vt 0.997922 0.852844 -v -12191 -2079.01 -285.3 -vt 0.999584 0.817395 -v -12191 -2079.01 4190.33 -vt 0.999584 0.852844 -o mesh1948 -s off -f 9901/9901/9901 9902/9902/9902 9903/9903/9903 -f 9901/9901/9901 9903/9903/9903 9904/9904/9904 -f 9901/9901/9901 9904/9904/9904 9905/9905/9905 -f 9901/9901/9901 9905/9905/9905 9906/9906/9906 -f 9901/9901/9901 9906/9906/9906 9907/9907/9907 -f 9901/9901/9901 9907/9907/9907 9908/9908/9908 -f 9901/9901/9901 9908/9908/9908 9909/9909/9909 -f 9910/9910/9910 9911/9911/9911 9912/9912/9912 -g charts -o chart0000 -s off -f 9901/9901/9901 9902/9902/9902 9903/9903/9903 -f 9901/9901/9901 9903/9903/9903 9904/9904/9904 -f 9901/9901/9901 9904/9904/9904 9905/9905/9905 -f 9901/9901/9901 9905/9905/9905 9906/9906/9906 -f 9901/9901/9901 9906/9906/9906 9907/9907/9907 -f 9901/9901/9901 9907/9907/9907 9908/9908/9908 -f 9901/9901/9901 9908/9908/9908 9909/9909/9909 -o chart0001 -s off -f 9910/9910/9910 9911/9911/9911 9912/9912/9912 -v -8216 -2079.01 -285.3 -vt 0.0835411 0.946826 -v -8216 -5319.01 -285.3 -vt 0.10931 0.946826 -v -8216 -5319.01 2954.7 -vt 0.10931 0.920857 -v -8216 -5319.01 3314.7 -vt 0.10931 0.917972 -v -8216 -3250.89 3314.7 -vt 0.0928615 0.917972 -v -8216 -2079.01 3314.7 -vt 0.0835411 0.917972 -v -8216 -2079.01 1310.32 -vt 0.0835411 0.934037 -o mesh1949 -s off -f 9913/9913/9913 9914/9914/9914 9915/9915/9915 -f 9913/9913/9913 9915/9915/9915 9916/9916/9916 -f 9913/9913/9913 9916/9916/9916 9917/9917/9917 -f 9913/9913/9913 9917/9917/9917 9918/9918/9918 -f 9913/9913/9913 9918/9918/9918 9919/9919/9919 -g charts -o chart0000 -s off -f 9913/9913/9913 9914/9914/9914 9915/9915/9915 -f 9913/9913/9913 9915/9915/9915 9916/9916/9916 -f 9913/9913/9913 9916/9916/9916 9917/9917/9917 -f 9913/9913/9913 9917/9917/9917 9918/9918/9918 -f 9913/9913/9913 9918/9918/9918 9919/9919/9919 -v -16856 -8559.01 -285.3 -vt 0.934746 0.833883 -v -16856 -8559.01 4574.7 -vt 0.973815 0.833883 -v -8216 -8559.01 4574.7 -vt 0.973815 0.766282 -v -8216 -8559.01 -285.3 -vt 0.934746 0.766282 -o mesh1950 -s off -f 9920/9920/9920 9921/9921/9921 9922/9922/9922 -f 9920/9920/9920 9922/9922/9922 9923/9923/9923 -g charts -o chart0000 -s off -f 9920/9920/9920 9921/9921/9921 9922/9922/9922 -f 9920/9920/9920 9922/9922/9922 9923/9923/9923 -v -16856 -2079.01 -285.3 -vt 0.916459 0.482687 -v -16856 -2079.01 4574.7 -vt 0.916459 0.444215 -v -16856 -5319.01 7004.7 -vt 0.942228 0.424979 -v -16856 -8559.01 4574.7 -vt 0.967997 0.444215 -v -16856 -8559.01 -285.3 -vt 0.967997 0.482687 -o mesh1951 -s off -f 9924/9924/9924 9925/9925/9925 9926/9926/9926 -f 9924/9924/9924 9926/9926/9926 9927/9927/9927 -f 9924/9924/9924 9927/9927/9927 9928/9928/9928 -g charts -o chart0000 -s off -f 9924/9924/9924 9925/9925/9925 9926/9926/9926 -f 9924/9924/9924 9926/9926/9926 9927/9927/9927 -f 9924/9924/9924 9927/9927/9927 9928/9928/9928 -v -8381 -2244.01 1310.32 -vt 0.874065 0.969909 -v -8381 -2244.01 4698.45 -vt 0.874065 0.943421 -v -8381 -5319.01 7004.7 -vt 0.849543 0.925392 -v -8381 -8394.01 4698.45 -vt 0.825021 0.943421 -v -8381 -8394.01 1310.32 -vt 0.825021 0.969909 -o mesh1952 -s off -f 9929/9929/9929 9930/9930/9930 9931/9931/9931 -f 9929/9929/9929 9931/9931/9931 9932/9932/9932 -f 9929/9929/9929 9932/9932/9932 9933/9933/9933 -g charts -o chart0000 -s off -f 9929/9929/9929 9930/9930/9930 9931/9931/9931 -f 9929/9929/9929 9931/9931/9931 9932/9932/9932 -f 9929/9929/9929 9932/9932/9932 9933/9933/9933 -v -16691 -2244.01 1310.32 -vt 0.636326 0.941055 -v -16691 -2244.01 4698.45 -vt 0.636326 0.96826 -v -8381 -2244.01 4698.45 -vt 0.570657 0.96826 -v -8381 -2244.01 1310.32 -vt 0.570657 0.941055 -o mesh1953 -s off -f 9934/9934/9934 9935/9935/9935 9936/9936/9936 -f 9934/9934/9934 9936/9936/9936 9937/9937/9937 -g charts -o chart0000 -s off -f 9934/9934/9934 9935/9935/9935 9936/9936/9936 -f 9934/9934/9934 9936/9936/9936 9937/9937/9937 -v -16691 -8394.01 1310.32 -vt 0.529094 0.971558 -v -16691 -8394.01 4698.45 -vt 0.529094 0.94507 -v -16691 -5319.01 7004.7 -vt 0.504572 0.92704 -v -16691 -2244.01 4698.45 -vt 0.48005 0.94507 -v -16691 -2244.01 1310.32 -vt 0.48005 0.971558 -o mesh1954 -s off -f 9938/9938/9938 9939/9939/9939 9940/9940/9940 -f 9938/9938/9938 9940/9940/9940 9941/9941/9941 -f 9938/9938/9938 9941/9941/9941 9942/9942/9942 -g charts -o chart0000 -s off -f 9938/9938/9938 9939/9939/9939 9940/9940/9940 -f 9938/9938/9938 9940/9940/9940 9941/9941/9941 -f 9938/9938/9938 9941/9941/9941 9942/9942/9942 -v -8381 -8394.01 1310.32 -vt 0.0444721 0.649217 -v -8381 -8394.01 4698.45 -vt 0.0170407 0.649217 -v -16691 -8394.01 4698.45 -vt 0.0170407 0.584089 -v -16691 -8394.01 1310.32 -vt 0.0444721 0.584089 -o mesh1955 -s off -f 9943/9943/9943 9944/9944/9944 9945/9945/9945 -f 9943/9943/9943 9945/9945/9945 9946/9946/9946 -g charts -o chart0000 -s off -f 9943/9943/9943 9944/9944/9944 9945/9945/9945 -f 9943/9943/9943 9945/9945/9945 9946/9946/9946 -v -16856 -5319.01 7004.7 -vt 0.77847 0.296373 -v -16691 -5319.01 7004.7 -vt 0.772343 0.296373 -v -16691 -8394.01 4698.45 -vt 0.772343 0.154755 -v -8381 -8394.01 4698.45 -vt 0.463734 0.154755 -v -8381 -5319.01 7004.7 -vt 0.463734 0.296373 -v -8216 -5319.01 7004.7 -vt 0.457606 0.296373 -v -8216 -8559.01 4574.7 -vt 0.457606 0.147156 -v -16856 -8559.01 4574.7 -vt 0.77847 0.147156 -o mesh1956 -s off -f 9947/9947/9947 9948/9948/9948 9949/9949/9949 -f 9947/9947/9947 9949/9949/9949 9950/9950/9950 -f 9947/9947/9947 9950/9950/9950 9951/9951/9951 -f 9947/9947/9947 9951/9951/9951 9952/9952/9952 -f 9947/9947/9947 9952/9952/9952 9953/9953/9953 -f 9947/9947/9947 9953/9953/9953 9954/9954/9954 -g charts -o chart0000 -s off -f 9947/9947/9947 9948/9948/9948 9949/9949/9949 -f 9947/9947/9947 9949/9949/9949 9950/9950/9950 -f 9947/9947/9947 9950/9950/9950 9951/9951/9951 -f 9947/9947/9947 9951/9951/9951 9952/9952/9952 -f 9947/9947/9947 9952/9952/9952 9953/9953/9953 -f 9947/9947/9947 9953/9953/9953 9954/9954/9954 -v -8216 -5319.01 7004.7 -vt 0.108479 0.146331 -v -8381 -5319.01 7004.7 -vt 0.114606 0.146331 -v -8381 -2244.01 4698.45 -vt 0.114606 0.287949 -v -16691 -2244.01 4698.45 -vt 0.423216 0.287949 -v -16691 -5319.01 7004.7 -vt 0.423216 0.146331 -v -16856 -5319.01 7004.7 -vt 0.429343 0.146331 -v -16856 -2079.01 4574.7 -vt 0.429343 0.295548 -v -8216 -2079.01 4574.7 -vt 0.108479 0.295548 -o mesh1957 -s off -f 9955/9955/9955 9956/9956/9956 9957/9957/9957 -f 9955/9955/9955 9957/9957/9957 9958/9958/9958 -f 9955/9955/9955 9958/9958/9958 9959/9959/9959 -f 9955/9955/9955 9959/9959/9959 9960/9960/9960 -f 9955/9955/9955 9960/9960/9960 9961/9961/9961 -f 9955/9955/9955 9961/9961/9961 9962/9962/9962 -g charts -o chart0000 -s off -f 9955/9955/9955 9956/9956/9956 9957/9957/9957 -f 9955/9955/9955 9957/9957/9957 9958/9958/9958 -f 9955/9955/9955 9958/9958/9958 9959/9959/9959 -f 9955/9955/9955 9959/9959/9959 9960/9960/9960 -f 9955/9955/9955 9960/9960/9960 9961/9961/9961 -f 9955/9955/9955 9961/9961/9961 9962/9962/9962 -v -12191 -2079.01 4190.33 -vt 0.866584 0.0012366 -v -12191 -2079.01 -285.3 -vt 0.866584 0.0366858 -v -12026 -2079.01 -285.3 -vt 0.868246 0.0366858 -v -12026 -2079.01 4190.33 -vt 0.868246 0.0012366 -o mesh1958 -s off -f 9963/9963/9963 9964/9964/9964 9965/9965/9965 -f 9963/9963/9963 9965/9965/9965 9966/9966/9966 -g charts -o chart0000 -s off -f 9963/9963/9963 9964/9964/9964 9965/9965/9965 -f 9963/9963/9963 9965/9965/9965 9966/9966/9966 -v -16856 -2079.01 -285.3 -vt 0.876558 0.0671887 -v -16691 -2244.01 -285.3 -vt 0.874896 0.0658872 -v -16856 -8559.01 -285.3 -vt 0.876558 0.0160758 -v -16691 -8394.01 -285.3 -vt 0.874896 0.0173773 -o mesh1959 -s off -f 9967/9967/9967 9968/9968/9968 9969/9969/9969 -f 9970/9970/9970 9969/9969/9969 9968/9968/9968 -g charts -o chart0000 -s off -f 9967/9967/9967 9968/9968/9968 9969/9969/9969 -f 9970/9970/9970 9969/9969/9969 9968/9968/9968 -v -16691 -2244.01 -285.3 -vt 0.897832 0.848722 -v -16856 -2079.01 -285.3 -vt 0.896509 0.850371 -v -12191 -2079.01 -285.3 -vt 0.933915 0.850371 -o mesh1960 -s off -f 9971/9971/9971 9972/9972/9972 9973/9973/9973 -g charts -o chart0000 -s off -f 9971/9971/9971 9972/9972/9972 9973/9973/9973 -v -16691 -2244.01 -285.3 -vt 0.722776 0.982275 -v -12191 -2079.01 -285.3 -vt 0.721114 0.947008 -v -8381 -2244.01 -285.3 -vt 0.722776 0.917148 -o mesh1961 -s off -f 9974/9974/9974 9975/9975/9975 9976/9976/9976 -g charts -o chart0000 -s off -f 9974/9974/9974 9975/9975/9975 9976/9976/9976 -v -8381 -2244.01 -285.3 -vt 0.445968 0.33217 -v -12191 -2079.01 -285.3 -vt 0.447631 0.302143 -v -12026 -2079.01 -285.3 -vt 0.447631 0.303444 -v -8216 -2079.01 -285.3 -vt 0.447631 0.333471 -o mesh1962 -s off -f 9977/9977/9977 9978/9978/9978 9979/9979/9979 -f 9977/9977/9977 9979/9979/9979 9980/9980/9980 -g charts -o chart0000 -s off -f 9977/9977/9977 9978/9978/9978 9979/9979/9979 -f 9977/9977/9977 9979/9979/9979 9980/9980/9980 -v -8381 -2244.01 -285.3 -vt 0.0253533 0.83933 -v -8216 -2079.01 -285.3 -vt 0.0270157 0.838005 -v -8381 -8394.01 -285.3 -vt 0.0270157 0.887469 -o mesh1963 -s off -f 9981/9981/9981 9982/9982/9982 9983/9983/9983 -g charts -o chart0000 -s off -f 9981/9981/9981 9982/9982/9982 9983/9983/9983 -v -16856 -8559.01 -285.3 -vt 0.363674 0.482687 -v -16691 -8394.01 -285.3 -vt 0.362372 0.481039 -v -8216 -8559.01 -285.3 -vt 0.295511 0.482687 -o mesh1964 -s off -f 9984/9984/9984 9985/9985/9985 9986/9986/9986 -g charts -o chart0000 -s off -f 9984/9984/9984 9985/9985/9985 9986/9986/9986 -v -8216 -8559.01 -285.3 -vt 0.284705 0.930338 -v -16691 -8394.01 -285.3 -vt 0.352037 0.930338 -v -8381 -8394.01 -285.3 -vt 0.286041 0.928689 -o mesh1965 -s off -f 9987/9987/9987 9988/9988/9988 9989/9989/9989 -g charts -o chart0000 -s off -f 9987/9987/9987 9988/9988/9988 9989/9989/9989 -v -8216 -8559.01 -285.3 -vt 0.727764 0.899011 -v -8381 -8394.01 -285.3 -vt 0.726452 0.897362 -v -8216 -2079.01 -285.3 -vt 0.676226 0.899011 -v -8216 -5319.01 -285.3 -vt 0.701995 0.899011 -o mesh1966 -s off -f 9990/9990/9990 9991/9991/9991 9992/9992/9992 -f 9990/9990/9990 9992/9992/9992 9993/9993/9993 -g charts -o chart0000 -s off -f 9990/9990/9990 9991/9991/9991 9992/9992/9992 -f 9990/9990/9990 9992/9992/9992 9993/9993/9993 -v -8381 -2244.01 1310.32 -vt 0.974647 0.681369 -v -16691 -2244.01 1310.32 -vt 0.974647 0.746496 -v -16691 -2244.01 -285.3 -vt 0.987947 0.746496 -v -8381 -2244.01 -285.3 -vt 0.987947 0.681369 -o mesh1967 -s off -f 9994/9994/9994 9995/9995/9995 9996/9996/9996 -f 9994/9994/9994 9996/9996/9996 9997/9997/9997 -g charts -o chart0000 -s off -f 9994/9994/9994 9995/9995/9995 9996/9996/9996 -f 9994/9994/9994 9996/9996/9996 9997/9997/9997 -v -16691 -2244.01 1310.32 -vt 0.504988 0.978153 -v -16691 -8394.01 1310.32 -vt 0.554031 0.978153 -v -16691 -8394.01 -285.3 -vt 0.554031 0.991344 -v -16691 -2244.01 -285.3 -vt 0.504988 0.991344 -o mesh1968 -s off -f 9998/9998/9998 9999/9999/9999 10000/10000/10000 -f 9998/9998/9998 10000/10000/10000 10001/10001/10001 -g charts -o chart0000 -s off -f 9998/9998/9998 9999/9999/9999 10000/10000/10000 -f 9998/9998/9998 10000/10000/10000 10001/10001/10001 -v -16691 -8394.01 1310.32 -vt 0.991272 0.822341 -v -8381 -8394.01 1310.32 -vt 0.991272 0.757214 -v -8381 -8394.01 -285.3 -vt 0.977972 0.757214 -v -16691 -8394.01 -285.3 -vt 0.977972 0.822341 -o mesh1969 -s off -f 10002/10002/10002 10003/10003/10003 10004/10004/10004 -f 10002/10002/10002 10004/10004/10004 10005/10005/10005 -g charts -o chart0000 -s off -f 10002/10002/10002 10003/10003/10003 10004/10004/10004 -f 10002/10002/10002 10004/10004/10004 10005/10005/10005 -v -8381 -8394.01 1310.32 -vt 0.251455 0.99629 -v -8381 -2244.01 1310.32 -vt 0.202411 0.99629 -v -8381 -2244.01 -285.3 -vt 0.202411 0.9831 -v -8381 -8394.01 -285.3 -vt 0.251455 0.9831 -o mesh1970 -s off -f 10006/10006/10006 10007/10007/10007 10008/10008/10008 -f 10006/10006/10006 10008/10008/10008 10009/10009/10009 -g charts -o chart0000 -s off -f 10006/10006/10006 10007/10007/10007 10008/10008/10008 -f 10006/10006/10006 10008/10008/10008 10009/10009/10009 -v -8216 -2079.01 4574.7 -vt 0.832502 0.191674 -v -8216 -2079.01 3314.7 -vt 0.832502 0.201566 -v -8216 -3250.89 3314.7 -vt 0.841822 0.201566 -v -8216 -5319.01 3314.7 -vt 0.858271 0.201566 -v -8216 -2079.01 4574.7 -vt 0.770158 0.997939 -v -8216 -5319.01 3314.7 -vt 0.792836 0.982275 -v -8216 -5319.01 2954.7 -vt 0.795223 0.983842 -v -8216 -5319.01 -285.3 -vt 0.816708 0.997939 -v -8216 -2079.01 4574.7 -vt 0.118573 0.960841 -v -8216 -5319.01 -285.3 -vt 0.164885 0.960841 -v -8216 -8559.01 -285.3 -vt 0.179135 0.939406 -v -8216 -8559.01 4574.7 -vt 0.147073 0.917972 -v -8216 -5319.01 7004.7 -vt 0.116791 0.928689 -o mesh1971 -s off -f 10010/10010/10010 10011/10011/10011 10012/10012/10012 -f 10010/10010/10010 10012/10012/10012 10013/10013/10013 -f 10014/10014/10014 10015/10015/10015 10016/10016/10016 -f 10014/10014/10014 10016/10016/10016 10017/10017/10017 -f 10018/10018/10018 10019/10019/10019 10020/10020/10020 -f 10018/10018/10018 10020/10020/10020 10021/10021/10021 -f 10018/10018/10018 10021/10021/10021 10022/10022/10022 -g charts -o chart0000 -s off -f 10010/10010/10010 10011/10011/10011 10012/10012/10012 -f 10010/10010/10010 10012/10012/10012 10013/10013/10013 -o chart0001 -s off -f 10014/10014/10014 10015/10015/10015 10016/10016/10016 -f 10014/10014/10014 10016/10016/10016 10017/10017/10017 -o chart0002 -s off -f 10018/10018/10018 10019/10019/10019 10020/10020/10020 -f 10018/10018/10018 10020/10020/10020 10021/10021/10021 -f 10018/10018/10018 10021/10021/10021 10022/10022/10022 -v -12191 4955.99 2594.7 -vt 0.89734 0.471146 -v -12191 -2244.01 2594.7 -vt 0.89734 0.52803 -v -12191 -2244.01 2954.7 -vt 0.900665 0.52803 -v -12191 4955.99 2954.7 -vt 0.900665 0.471146 -o mesh1972 -s off -f 10023/10023/10023 10024/10024/10024 10025/10025/10025 -f 10023/10023/10023 10025/10025/10025 10026/10026/10026 -g charts -o chart0000 -s off -f 10023/10023/10023 10024/10024/10024 10025/10025/10025 -f 10023/10023/10023 10025/10025/10025 10026/10026/10026 -v -13436 16266 2954.7 -vt 0.812552 0.634377 -v -8216 16266 2954.7 -vt 0.812552 0.593157 -v -8216 16791 2954.7 -vt 0.808396 0.593157 -v -8381 16791 2954.7 -vt 0.808396 0.59446 -v -13436 16791 2954.7 -vt 0.808396 0.634377 -o mesh1973 -s off -f 10027/10027/10027 10028/10028/10028 10029/10029/10029 -f 10027/10027/10027 10029/10029/10029 10030/10030/10030 -f 10027/10027/10027 10030/10030/10030 10031/10031/10031 -g charts -o chart0000 -s off -f 10027/10027/10027 10028/10028/10028 10029/10029/10029 -f 10027/10027/10027 10029/10029/10029 10030/10030/10030 -f 10027/10027/10027 10030/10030/10030 10031/10031/10031 -v -6791 -2244.01 2594.7 -vt 0.36118 0.480214 -v -6791 4955.99 2594.7 -vt 0.303824 0.480214 -v -6791 4955.99 2954.7 -vt 0.303824 0.476917 -v -6791 -2244.01 2954.7 -vt 0.36118 0.476917 -o mesh1974 -s off -f 10032/10032/10032 10033/10033/10033 10034/10034/10034 -f 10032/10032/10032 10034/10034/10034 10035/10035/10035 -g charts -o chart0000 -s off -f 10032/10032/10032 10033/10033/10033 10034/10034/10034 -f 10032/10032/10032 10034/10034/10034 10035/10035/10035 -v -12191 -2244.01 2594.7 -vt 0.931421 0.856142 -v -6791 -2244.01 2594.7 -vt 0.888196 0.856142 -v -6791 -2244.01 2954.7 -vt 0.888196 0.852844 -v -12191 -2244.01 2954.7 -vt 0.931421 0.852844 -o mesh1975 -s off -f 10036/10036/10036 10037/10037/10037 10038/10038/10038 -f 10036/10036/10036 10038/10038/10038 10039/10039/10039 -g charts -o chart0000 -s off -f 10036/10036/10036 10037/10037/10037 10038/10038/10038 -f 10036/10036/10036 10038/10038/10038 10039/10039/10039 -v -12191 4955.99 2954.7 -vt 0.602244 0.861088 -v -8216 4955.99 2954.7 -vt 0.570657 0.861088 -v -8216 4955.99 2594.7 -vt 0.570657 0.857791 -v -12191 4955.99 2594.7 -vt 0.602244 0.857791 -o mesh1976 -s off -f 10040/10040/10040 10041/10041/10041 10042/10042/10042 -f 10040/10040/10040 10042/10042/10042 10043/10043/10043 -g charts -o chart0000 -s off -f 10040/10040/10040 10041/10041/10041 10042/10042/10042 -f 10040/10040/10040 10042/10042/10042 10043/10043/10043 -v -6611 16791 2954.7 -vt 0.204073 0.592333 -v -6611 4955.99 2954.7 -vt 0.298005 0.592333 -v -6611 4955.99 2594.7 -vt 0.298005 0.595631 -v -6611 16791 2594.7 -vt 0.204073 0.595631 -o mesh1977 -s off -f 10044/10044/10044 10045/10045/10045 10046/10046/10046 -f 10044/10044/10044 10046/10046/10046 10047/10047/10047 -g charts -o chart0000 -s off -f 10044/10044/10044 10045/10045/10045 10046/10046/10046 -f 10044/10044/10044 10046/10046/10046 10047/10047/10047 -v -6791 4955.99 2954.7 -vt 0.780133 0.29967 -v -6791 4955.99 2594.7 -vt 0.783458 0.29967 -v -6611 4955.99 2594.7 -vt 0.783458 0.301319 -v -6611 4955.99 2954.7 -vt 0.780133 0.301319 -o mesh1978 -s off -f 10048/10048/10048 10049/10049/10049 10050/10050/10050 -f 10048/10048/10048 10050/10050/10050 10051/10051/10051 -g charts -o chart0000 -s off -f 10048/10048/10048 10049/10049/10049 10050/10050/10050 -f 10048/10048/10048 10050/10050/10050 10051/10051/10051 -v -8216 4955.99 2954.7 -vt 0.977972 0.50742 -v -8216 16266 2954.7 -vt 0.977972 0.418384 -v -8216 16266 2774.7 -vt 0.976309 0.418384 -v -8216 16266 2594.7 -vt 0.974647 0.418384 -v -8216 4955.99 2594.7 -vt 0.974647 0.50742 -o mesh1979 -s off -f 10052/10052/10052 10053/10053/10053 10054/10054/10054 -f 10052/10052/10052 10054/10054/10054 10055/10055/10055 -f 10052/10052/10052 10055/10055/10055 10056/10056/10056 -g charts -o chart0000 -s off -f 10052/10052/10052 10053/10053/10053 10054/10054/10054 -f 10052/10052/10052 10054/10054/10054 10055/10055/10055 -f 10052/10052/10052 10055/10055/10055 10056/10056/10056 -v -13436 16791 2954.7 -vt 0.501662 0.994641 -v -13436 16791 2774.7 -vt 0.5 0.994641 -v -13436 16266 2774.7 -vt 0.5 0.990519 -v -13436 16266 2954.7 -vt 0.501662 0.990519 -o mesh1980 -s off -f 10057/10057/10057 10058/10058/10058 10059/10059/10059 -f 10057/10057/10057 10059/10059/10059 10060/10060/10060 -g charts -o chart0000 -s off -f 10057/10057/10057 10058/10058/10058 10059/10059/10059 -f 10057/10057/10057 10059/10059/10059 10060/10060/10060 -v -8216 16266 2774.7 -vt 0.0236907 0.88582 -v -8216 16266 2954.7 -vt 0.0220283 0.88582 -v -13436 16266 2954.7 -vt 0.0220283 0.8446 -v -13436 16266 2774.7 -vt 0.0236907 0.8446 -o mesh1981 -s off -f 10061/10061/10061 10062/10062/10062 10063/10063/10063 -f 10061/10061/10061 10063/10063/10063 10064/10064/10064 -g charts -o chart0000 -s off -f 10061/10061/10061 10062/10062/10062 10063/10063/10063 -f 10061/10061/10061 10063/10063/10063 10064/10064/10064 -v -13436 16791 2954.7 -vt 0.376143 0.398598 -v -8381 16791 2954.7 -vt 0.376143 0.359027 -v -8381 16791 2774.7 -vt 0.37448 0.359027 -v -13436 16791 2774.7 -vt 0.37448 0.398598 -o mesh1982 -s off -f 10065/10065/10065 10066/10066/10066 10067/10067/10067 -f 10065/10065/10065 10067/10067/10067 10068/10068/10068 -g charts -o chart0000 -s off -f 10065/10065/10065 10066/10066/10066 10067/10067/10067 -f 10065/10065/10065 10067/10067/10067 10068/10068/10068 -v -8216 16266 2954.7 -vt 0.822527 0.0704864 -v -8216 16266 2774.7 -vt 0.822527 0.0721351 -v -8216 16791 2774.7 -vt 0.818371 0.0721351 -v -8216 16791 2954.7 -vt 0.818371 0.0704864 -v -8216 16266 2594.7 -vt 0.822527 0.0737839 -v -8216 16791 2594.7 -vt 0.818371 0.0737839 -o mesh1983 -s off -f 10069/10069/10069 10070/10070/10070 10071/10071/10071 -f 10069/10069/10069 10071/10071/10071 10072/10072/10072 -f 10073/10073/10073 10074/10074/10074 10071/10071/10071 -f 10073/10073/10073 10071/10071/10071 10070/10070/10070 -g charts -o chart0000 -s off -f 10069/10069/10069 10070/10070/10070 10071/10071/10071 -f 10069/10069/10069 10071/10071/10071 10072/10072/10072 -f 10073/10073/10073 10074/10074/10074 10071/10071/10071 -f 10073/10073/10073 10071/10071/10071 10070/10070/10070 -v -8216 4955.99 2594.7 -vt 0.0664699 0.686113 -v -8216 16266 2594.7 -vt 0.155867 0.686113 -v -8216 16791 2594.7 -vt 0.160017 0.686113 -v -6776 16791 2594.7 -vt 0.160017 0.697389 -v -6611 16791 2594.7 -vt 0.160017 0.698681 -v -6611 4955.99 2594.7 -vt 0.0664699 0.698681 -v -6791 4955.99 2594.7 -vt 0.0664699 0.697271 -v -6791 -2244.01 2594.7 -vt 0.00955943 0.697271 -v -12191 -2244.01 2594.7 -vt 0.00955943 0.654988 -v -12191 4955.99 2594.7 -vt 0.0664699 0.654988 -o mesh1984 -s off -f 10075/10075/10075 10076/10076/10076 10077/10077/10077 -f 10075/10075/10075 10077/10077/10077 10078/10078/10078 -f 10075/10075/10075 10078/10078/10078 10079/10079/10079 -f 10075/10075/10075 10079/10079/10079 10080/10080/10080 -f 10075/10075/10075 10080/10080/10080 10081/10081/10081 -f 10075/10075/10075 10081/10081/10081 10082/10082/10082 -f 10075/10075/10075 10082/10082/10082 10083/10083/10083 -f 10075/10075/10075 10083/10083/10083 10084/10084/10084 -g charts -o chart0000 -s off -f 10075/10075/10075 10076/10076/10076 10077/10077/10077 -f 10075/10075/10075 10077/10077/10077 10078/10078/10078 -f 10075/10075/10075 10078/10078/10078 10079/10079/10079 -f 10075/10075/10075 10079/10079/10079 10080/10080/10080 -f 10075/10075/10075 10080/10080/10080 10081/10081/10081 -f 10075/10075/10075 10081/10081/10081 10082/10082/10082 -f 10075/10075/10075 10082/10082/10082 10083/10083/10083 -f 10075/10075/10075 10083/10083/10083 10084/10084/10084 -v -13436 16791 2774.7 -vt 0.809227 0.799258 -v -8381 16791 2774.7 -vt 0.768978 0.799258 -v -8216 16791 2774.7 -vt 0.767664 0.799258 -v -8216 16266 2774.7 -vt 0.767664 0.795136 -v -13436 16266 2774.7 -vt 0.809227 0.795136 -o mesh1985 -s off -f 10085/10085/10085 10086/10086/10086 10087/10087/10087 -f 10085/10085/10085 10087/10087/10087 10088/10088/10088 -f 10085/10085/10085 10088/10088/10088 10089/10089/10089 -g charts -o chart0000 -s off -f 10085/10085/10085 10086/10086/10086 10087/10087/10087 -f 10085/10085/10085 10087/10087/10087 10088/10088/10088 -f 10085/10085/10085 10088/10088/10088 10089/10089/10089 -v -6611 16791 2954.7 -vt 0.873234 0.503298 -v -8216 16791 2954.7 -vt 0.886534 0.503298 -v -8216 16266 2954.7 -vt 0.886534 0.499165 -v -8216 4955.99 2954.7 -vt 0.886534 0.41014 -v -6611 16791 2954.7 -vt 0.899834 0.678071 -v -8216 4955.99 2954.7 -vt 0.87074 0.767053 -v -12191 4955.99 2954.7 -vt 0.899834 0.780297 -v -6611 16791 2954.7 -vt 0.385287 0.789365 -v -12191 4955.99 2954.7 -vt 0.290547 0.745672 -v -12191 -2244.01 2954.7 -vt 0.233167 0.746216 -v -6791 -2244.01 2954.7 -vt 0.233574 0.789365 -v -6791 4955.99 2954.7 -vt 0.290954 0.788821 -v -6611 16791 2954.7 -vt 0.631338 0.701979 -v -6791 4955.99 2954.7 -vt 0.629676 0.795136 -v -6611 4955.99 2954.7 -vt 0.631338 0.795136 -o mesh1986 -s off -f 10090/10090/10090 10091/10091/10091 10092/10092/10092 -f 10090/10090/10090 10092/10092/10092 10093/10093/10093 -f 10094/10094/10094 10095/10095/10095 10096/10096/10096 -f 10097/10097/10097 10098/10098/10098 10099/10099/10099 -f 10097/10097/10097 10099/10099/10099 10100/10100/10100 -f 10097/10097/10097 10100/10100/10100 10101/10101/10101 -f 10102/10102/10102 10103/10103/10103 10104/10104/10104 -g charts -o chart0000 -s off -f 10090/10090/10090 10091/10091/10091 10092/10092/10092 -f 10090/10090/10090 10092/10092/10092 10093/10093/10093 -o chart0001 -s off -f 10094/10094/10094 10095/10095/10095 10096/10096/10096 -o chart0002 -s off -f 10097/10097/10097 10098/10098/10098 10099/10099/10099 -f 10097/10097/10097 10099/10099/10099 10100/10100/10100 -f 10097/10097/10097 10100/10100/10100 10101/10101/10101 -o chart0003 -s off -f 10102/10102/10102 10103/10103/10103 10104/10104/10104 -v -8216 16791 2954.7 -vt 0.203242 0.977329 -v -8216 16791 2774.7 -vt 0.204904 0.977329 -v -8381 16791 2774.7 -vt 0.204904 0.978978 -v -8381 16791 2954.7 -vt 0.203242 0.978978 -o mesh1987 -s off -f 10105/10105/10105 10106/10106/10106 10107/10107/10107 -f 10105/10105/10105 10107/10107/10107 10108/10108/10108 -g charts -o chart0000 -s off -f 10105/10105/10105 10106/10106/10106 10107/10107/10107 -f 10105/10105/10105 10107/10107/10107 10108/10108/10108 -v -6776 16791 2594.7 -vt 0.633001 0.761336 -v -8216 16791 2594.7 -vt 0.633001 0.772877 -v -8216 16791 2774.7 -vt 0.634663 0.772877 -v -6776 16791 2774.7 -vt 0.634663 0.761336 -o mesh1988 -s off -f 10109/10109/10109 10110/10110/10110 10111/10111/10111 -f 10109/10109/10109 10111/10111/10111 10112/10112/10112 -g charts -o chart0000 -s off -f 10109/10109/10109 10110/10110/10110 10111/10111/10111 -f 10109/10109/10109 10111/10111/10111 10112/10112/10112 -v -6611 16791 2594.7 -vt 0.839983 0.970734 -v -6776 16791 2594.7 -vt 0.839983 0.972382 -v -6776 16791 2774.7 -vt 0.838321 0.972382 -v -6611 16791 2594.7 -vt 0.567332 0.562654 -v -6776 16791 2774.7 -vt 0.565816 0.561006 -v -8216 16791 2774.7 -vt 0.554032 0.562654 -v -6611 16791 2594.7 -vt 0.501662 0.613768 -v -8216 16791 2774.7 -vt 0.488363 0.615416 -v -8216 16791 2954.7 -vt 0.488362 0.617065 -v -6611 16791 2954.7 -vt 0.501662 0.617065 -o mesh1989 -s off -f 10113/10113/10113 10114/10114/10114 10115/10115/10115 -f 10116/10116/10116 10117/10117/10117 10118/10118/10118 -f 10119/10119/10119 10120/10120/10120 10121/10121/10121 -f 10119/10119/10119 10121/10121/10121 10122/10122/10122 -g charts -o chart0000 -s off -f 10113/10113/10113 10114/10114/10114 10115/10115/10115 -o chart0001 -s off -f 10116/10116/10116 10117/10117/10117 10118/10118/10118 -o chart0002 -s off -f 10119/10119/10119 10120/10120/10120 10121/10121/10121 -f 10119/10119/10119 10121/10121/10121 10122/10122/10122 -v -8336 -4477.76 5018.08 -vt 0.330424 0.437345 -v -8336 -4477.76 5009.7 -vt 0.330424 0.437757 -v -8306 -4477.76 5009.7 -vt 0.331255 0.437757 -v -8306 -4477.76 5018.08 -vt 0.331255 0.437345 -v -8306 -4477.76 5001.32 -vt 0.331255 0.43817 -v -8336 -4477.76 5001.32 -vt 0.330424 0.43817 -o mesh1990 -s off -f 10123/10123/10123 10124/10124/10124 10125/10125/10125 -f 10123/10123/10123 10125/10125/10125 10126/10126/10126 -f 10127/10127/10127 10125/10125/10125 10124/10124/10124 -f 10127/10127/10127 10124/10124/10124 10128/10128/10128 -g charts -o chart0000 -s off -f 10123/10123/10123 10124/10124/10124 10125/10125/10125 -f 10123/10123/10123 10125/10125/10125 10126/10126/10126 -f 10127/10127/10127 10125/10125/10125 10124/10124/10124 -f 10127/10127/10127 10124/10124/10124 10128/10128/10128 -v -8336 -5422.76 5018.08 -vt 0.110141 0.669827 -v -8336 -5422.76 5009.7 -vt 0.110141 0.670239 -v -8306 -5422.76 5009.7 -vt 0.110972 0.670239 -v -8306 -5422.76 5018.08 -vt 0.110972 0.669827 -v -8306 -5422.76 5001.32 -vt 0.110972 0.670651 -v -8336 -5422.76 5001.32 -vt 0.110141 0.670651 -o mesh1991 -s off -f 10129/10129/10129 10130/10130/10130 10131/10131/10131 -f 10129/10129/10129 10131/10131/10131 10132/10132/10132 -f 10133/10133/10133 10131/10131/10131 10130/10130/10130 -f 10133/10133/10133 10130/10130/10130 10134/10134/10134 -g charts -o chart0000 -s off -f 10129/10129/10129 10130/10130/10130 10131/10131/10131 -f 10129/10129/10129 10131/10131/10131 10132/10132/10132 -f 10133/10133/10133 10131/10131/10131 10130/10130/10130 -f 10133/10133/10133 10130/10130/10130 10134/10134/10134 -v 18371.5 13798.5 3884.7 -vt 0.876558 0.939406 -v 18334 13798.5 3922.2 -vt 0.875727 0.939092 -v 17291.5 13798.5 3884.7 -vt 0.876558 0.930338 -v 17329 13798.5 3922.2 -vt 0.875727 0.930653 -o mesh1992 -s off -f 10135/10135/10135 10136/10136/10136 10137/10137/10137 -f 10138/10138/10138 10137/10137/10137 10136/10136/10136 -g charts -o chart0000 -s off -f 10135/10135/10135 10136/10136/10136 10137/10137/10137 -f 10138/10138/10138 10137/10137/10137 10136/10136/10136 -v 18334 13798.5 3922.2 -vt 0.107125 0.90643 -v 18371.5 13798.5 3884.7 -vt 0.106816 0.907255 -v 18371.5 13798.5 5804.7 -vt 0.12261 0.907255 -o mesh1993 -s off -f 10139/10139/10139 10140/10140/10140 10141/10141/10141 -g charts -o chart0000 -s off -f 10139/10139/10139 10140/10140/10140 10141/10141/10141 -v 18334 13798.5 3922.2 -vt 0.91064 0.767931 -v 18371.5 13798.5 5804.7 -vt 0.925603 0.767931 -v 18334 13798.5 5767.2 -vt 0.925299 0.767106 -o mesh1994 -s off -f 10142/10142/10142 10143/10143/10143 10144/10144/10144 -g charts -o chart0000 -s off -f 10142/10142/10142 10143/10143/10143 10144/10144/10144 -v 18334 13798.5 5767.2 -vt 0.998753 0.696514 -v 18371.5 13798.5 5804.7 -vt 0.999584 0.696208 -v 17329 13798.5 5767.2 -vt 0.999584 0.704452 -o mesh1995 -s off -f 10145/10145/10145 10146/10146/10146 10147/10147/10147 -g charts -o chart0000 -s off -f 10145/10145/10145 10146/10146/10146 10147/10147/10147 -v 17291.5 13798.5 3884.7 -vt 0.400249 0.613767 -v 17329 13798.5 3922.2 -vt 0.399941 0.612943 -v 17291.5 13798.5 5804.7 -vt 0.384456 0.613767 -o mesh1996 -s off -f 10148/10148/10148 10149/10149/10149 10150/10150/10150 -g charts -o chart0000 -s off -f 10148/10148/10148 10149/10149/10149 10150/10150/10150 -v 17291.5 13798.5 5804.7 -vt 0.874065 0.0177246 -v 17329 13798.5 3922.2 -vt 0.874065 0.0325638 -v 17329 13798.5 5767.2 -vt 0.873234 0.0180261 -o mesh1997 -s off -f 10151/10151/10151 10152/10152/10152 10153/10153/10153 -g charts -o chart0000 -s off -f 10151/10151/10151 10152/10152/10152 10153/10153/10153 -v 17291.5 13798.5 5804.7 -vt 0.370324 0.937757 -v 17329 13798.5 5767.2 -vt 0.370007 0.936933 -v 18371.5 13798.5 5804.7 -vt 0.36118 0.937758 -o mesh1998 -s off -f 10154/10154/10154 10155/10155/10155 10156/10156/10156 -g charts -o chart0000 -s off -f 10154/10154/10154 10155/10155/10155 10156/10156/10156 -v 17291.5 13963.5 3884.7 -vt 0.862427 0.974031 -v 17329 13963.5 3922.2 -vt 0.863258 0.974346 -v 18371.5 13963.5 3884.7 -vt 0.862427 0.9831 -v 18334 13963.5 3922.2 -vt 0.863258 0.982785 -o mesh1999 -s off -f 10157/10157/10157 10158/10158/10158 10159/10159/10159 -f 10160/10160/10160 10159/10159/10159 10158/10158/10158 -g charts -o chart0000 -s off -f 10157/10157/10157 10158/10158/10158 10159/10159/10159 -f 10160/10160/10160 10159/10159/10159 10158/10158/10158 -v 17329 13963.5 3922.2 -vt 0.93059 0.765763 -v 17291.5 13963.5 3884.7 -vt 0.931421 0.765458 -v 17291.5 13963.5 5804.7 -vt 0.931421 0.781121 -o mesh2000 -s off -f 10161/10161/10161 10162/10162/10162 10163/10163/10163 -g charts -o chart0000 -s off -f 10161/10161/10161 10162/10162/10162 10163/10163/10163 -v 17329 13963.5 3922.2 -vt 0.916459 0.870157 -v 17291.5 13963.5 5804.7 -vt 0.931421 0.870156 -v 17329 13963.5 5767.2 -vt 0.931118 0.869332 -o mesh2001 -s off -f 10164/10164/10164 10165/10165/10165 10166/10166/10166 -g charts -o chart0000 -s off -f 10164/10164/10164 10165/10165/10165 10166/10166/10166 -v 17329 13963.5 5767.2 -vt 0.87853 0.504946 -v 17291.5 13963.5 5804.7 -vt 0.878221 0.505771 -v 18334 13963.5 5767.2 -vt 0.886534 0.505771 -o mesh2002 -s off -f 10167/10167/10167 10168/10168/10168 10169/10169/10169 -g charts -o chart0000 -s off -f 10167/10167/10167 10168/10168/10168 10169/10169/10169 -v 18371.5 13963.5 3884.7 -vt 0.200748 0.986397 -v 18334 13963.5 3922.2 -vt 0.20044 0.985573 -v 18371.5 13963.5 5804.7 -vt 0.184954 0.986397 -o mesh2003 -s off -f 10170/10170/10170 10171/10171/10171 10172/10172/10172 -g charts -o chart0000 -s off -f 10170/10170/10170 10171/10171/10171 10172/10172/10172 -v 18371.5 13963.5 5804.7 -vt 0.754364 0.911376 -v 18334 13963.5 3922.2 -vt 0.769327 0.911377 -v 18334 13963.5 5767.2 -vt 0.754668 0.910552 -o mesh2004 -s off -f 10173/10173/10173 10174/10174/10174 10175/10175/10175 -g charts -o chart0000 -s off -f 10173/10173/10173 10174/10174/10174 10175/10175/10175 -v 18371.5 13963.5 5804.7 -vt 0.928928 0.781945 -v 18334 13963.5 5767.2 -vt 0.928096 0.781631 -v 17291.5 13963.5 5804.7 -vt 0.928928 0.772877 -o mesh2005 -s off -f 10176/10176/10176 10177/10177/10177 10178/10178/10178 -g charts -o chart0000 -s off -f 10176/10176/10176 10177/10177/10177 10178/10178/10178 -v 17291.5 13798.5 5804.7 -vt 0.416874 0.979802 -v 18371.5 13798.5 5804.7 -vt 0.407731 0.979802 -v 18371.5 13963.5 5804.7 -vt 0.407731 0.978153 -v 17291.5 13963.5 5804.7 -vt 0.416874 0.978153 -o mesh2006 -s off -f 10179/10179/10179 10180/10180/10180 10181/10181/10181 -f 10179/10179/10179 10181/10181/10181 10182/10182/10182 -g charts -o chart0000 -s off -f 10179/10179/10179 10180/10180/10180 10181/10181/10181 -f 10179/10179/10179 10181/10181/10181 10182/10182/10182 -v 18371.5 13798.5 5804.7 -vt 0.953865 0.228772 -v 18371.5 13798.5 3884.7 -vt 0.953865 0.244435 -v 18371.5 13963.5 3884.7 -vt 0.955528 0.244435 -v 18371.5 13963.5 5804.7 -vt 0.955528 0.228772 -o mesh2007 -s off -f 10183/10183/10183 10184/10184/10184 10185/10185/10185 -f 10183/10183/10183 10185/10185/10185 10186/10186/10186 -g charts -o chart0000 -s off -f 10183/10183/10183 10184/10184/10184 10185/10185/10185 -f 10183/10183/10183 10185/10185/10185 10186/10186/10186 -v 18371.5 13798.5 3884.7 -vt 0.194929 0.640973 -v 17291.5 13798.5 3884.7 -vt 0.204073 0.640973 -v 17291.5 13963.5 3884.7 -vt 0.204073 0.642622 -v 18371.5 13963.5 3884.7 -vt 0.194929 0.642622 -o mesh2008 -s off -f 10187/10187/10187 10188/10188/10188 10189/10189/10189 -f 10187/10187/10187 10189/10189/10189 10190/10190/10190 -g charts -o chart0000 -s off -f 10187/10187/10187 10188/10188/10188 10189/10189/10189 -f 10187/10187/10187 10189/10189/10189 10190/10190/10190 -v 17291.5 13798.5 3884.7 -vt 0.469243 0.971558 -v 17291.5 13798.5 5804.7 -vt 0.45345 0.971558 -v 17291.5 13963.5 5804.7 -vt 0.45345 0.969909 -v 17291.5 13963.5 3884.7 -vt 0.469243 0.969909 -o mesh2009 -s off -f 10191/10191/10191 10192/10192/10192 10193/10193/10193 -f 10191/10191/10191 10193/10193/10193 10194/10194/10194 -g charts -o chart0000 -s off -f 10191/10191/10191 10192/10192/10192 10193/10193/10193 -f 10191/10191/10191 10193/10193/10193 10194/10194/10194 -v 17329 13963.5 3922.2 -vt 0.495012 0.335119 -v 17329 13918.5 3922.2 -vt 0.495466 0.335119 -v 18334 13918.5 3922.2 -vt 0.495466 0.326876 -v 18334 13963.5 3922.2 -vt 0.495012 0.326876 -v 17329 13798.5 3922.2 -vt 0.496675 0.335119 -v 18334 13798.5 3922.2 -vt 0.496675 0.326876 -o mesh2010 -s off -f 10195/10195/10195 10196/10196/10196 10197/10197/10197 -f 10195/10195/10195 10197/10197/10197 10198/10198/10198 -f 10199/10199/10199 10200/10200/10200 10197/10197/10197 -f 10199/10199/10199 10197/10197/10197 10196/10196/10196 -g charts -o chart0000 -s off -f 10195/10195/10195 10196/10196/10196 10197/10197/10197 -f 10195/10195/10195 10197/10197/10197 10198/10198/10198 -f 10199/10199/10199 10200/10200/10200 10197/10197/10197 -f 10199/10199/10199 10197/10197/10197 10196/10196/10196 -v 18334 13963.5 3922.2 -vt 0.708645 0.609645 -v 18334 13918.5 3922.2 -vt 0.708645 0.610095 -v 18334 13918.5 5767.2 -vt 0.693682 0.610095 -v 18334 13963.5 5767.2 -vt 0.693682 0.609645 -v 18334 13798.5 3922.2 -vt 0.708645 0.611294 -v 18334 13798.5 5767.2 -vt 0.693682 0.611294 -o mesh2011 -s off -f 10201/10201/10201 10202/10202/10202 10203/10203/10203 -f 10201/10201/10201 10203/10203/10203 10204/10204/10204 -f 10205/10205/10205 10206/10206/10206 10203/10203/10203 -f 10205/10205/10205 10203/10203/10203 10202/10202/10202 -g charts -o chart0000 -s off -f 10201/10201/10201 10202/10202/10202 10203/10203/10203 -f 10201/10201/10201 10203/10203/10203 10204/10204/10204 -f 10205/10205/10205 10206/10206/10206 10203/10203/10203 -f 10205/10205/10205 10203/10203/10203 10202/10202/10202 -v 18334 13963.5 5767.2 -vt 0.0777223 0.946002 -v 18334 13918.5 5767.2 -vt 0.0772688 0.946002 -v 17329 13918.5 5767.2 -vt 0.0772688 0.937758 -v 17329 13963.5 5767.2 -vt 0.0777223 0.937758 -v 18334 13798.5 5767.2 -vt 0.0760598 0.946002 -v 17329 13798.5 5767.2 -vt 0.0760598 0.937758 -o mesh2012 -s off -f 10207/10207/10207 10208/10208/10208 10209/10209/10209 -f 10207/10207/10207 10209/10209/10209 10210/10210/10210 -f 10211/10211/10211 10212/10212/10212 10209/10209/10209 -f 10211/10211/10211 10209/10209/10209 10208/10208/10208 -g charts -o chart0000 -s off -f 10207/10207/10207 10208/10208/10208 10209/10209/10209 -f 10207/10207/10207 10209/10209/10209 10210/10210/10210 -f 10211/10211/10211 10212/10212/10212 10209/10209/10209 -f 10211/10211/10211 10209/10209/10209 10208/10208/10208 -v 17329 13963.5 5767.2 -vt 0.742726 0.833883 -v 17329 13918.5 5767.2 -vt 0.742726 0.833433 -v 17329 13918.5 3922.2 -vt 0.727764 0.833433 -v 17329 13963.5 3922.2 -vt 0.727764 0.833883 -v 17329 13798.5 5767.2 -vt 0.742726 0.832234 -v 17329 13798.5 3922.2 -vt 0.727764 0.832234 -o mesh2013 -s off -f 10213/10213/10213 10214/10214/10214 10215/10215/10215 -f 10213/10213/10213 10215/10215/10215 10216/10216/10216 -f 10217/10217/10217 10218/10218/10218 10215/10215/10215 -f 10217/10217/10217 10215/10215/10215 10214/10214/10214 -g charts -o chart0000 -s off -f 10213/10213/10213 10214/10214/10214 10215/10215/10215 -f 10213/10213/10213 10215/10215/10215 10216/10216/10216 -f 10217/10217/10217 10218/10218/10218 10215/10215/10215 -f 10217/10217/10217 10215/10215/10215 10214/10214/10214 -v 17329 13918.5 3922.2 -vt 0.57315 0.923743 -v 17389 13918.5 3982.2 -vt 0.573982 0.924235 -v 18334 13918.5 3922.2 -vt 0.57315 0.931987 -v 18274 13918.5 3982.2 -vt 0.573982 0.931495 -o mesh2014 -s off -f 10219/10219/10219 10220/10220/10220 10221/10221/10221 -f 10222/10222/10222 10221/10221/10221 10220/10220/10220 -g charts -o chart0000 -s off -f 10219/10219/10219 10220/10220/10220 10221/10221/10221 -f 10222/10222/10222 10221/10221/10221 10220/10220/10220 -v 17389 13918.5 3982.2 -vt 0.791426 0.93446 -v 17329 13918.5 3922.2 -vt 0.790939 0.935284 -v 17329 13918.5 5767.2 -vt 0.805902 0.935284 -o mesh2015 -s off -f 10223/10223/10223 10224/10224/10224 10225/10225/10225 -g charts -o chart0000 -s off -f 10223/10223/10223 10224/10224/10224 10225/10225/10225 -v 17389 13918.5 3982.2 -vt 0.10931 0.951772 -v 17329 13918.5 5767.2 -vt 0.10931 0.965787 -v 17389 13918.5 5707.2 -vt 0.108479 0.965301 -o mesh2016 -s off -f 10226/10226/10226 10227/10227/10227 10228/10228/10228 -g charts -o chart0000 -s off -f 10226/10226/10226 10227/10227/10227 10228/10228/10228 -v 17389 13918.5 5707.2 -vt 0.217045 0.94188 -v 17329 13918.5 5767.2 -vt 0.216542 0.942704 -v 18274 13918.5 5707.2 -vt 0.224023 0.942704 -o mesh2017 -s off -f 10229/10229/10229 10230/10230/10230 10231/10231/10231 -g charts -o chart0000 -s off -f 10229/10229/10229 10230/10230/10230 10231/10231/10231 -v 18334 13918.5 3922.2 -vt 0.45345 0.474443 -v 18274 13918.5 3982.2 -vt 0.452618 0.473961 -v 18334 13918.5 5767.2 -vt 0.45345 0.459604 -o mesh2018 -s off -f 10232/10232/10232 10233/10233/10233 10234/10234/10234 -g charts -o chart0000 -s off -f 10232/10232/10232 10233/10233/10233 10234/10234/10234 -v 18334 13918.5 5767.2 -vt 0.866583 0.977329 -v 18274 13918.5 3982.2 -vt 0.866583 0.991344 -v 18274 13918.5 5707.2 -vt 0.865752 0.977815 -o mesh2019 -s off -f 10235/10235/10235 10236/10236/10236 10237/10237/10237 -g charts -o chart0000 -s off -f 10235/10235/10235 10236/10236/10236 10237/10237/10237 -v 18334 13918.5 5767.2 -vt 0.216542 0.779472 -v 18274 13918.5 5707.2 -vt 0.215711 0.77898 -v 17329 13918.5 5767.2 -vt 0.216542 0.771228 -o mesh2020 -s off -f 10238/10238/10238 10239/10239/10239 10240/10240/10240 -g charts -o chart0000 -s off -f 10238/10238/10238 10239/10239/10239 10240/10240/10240 -v 18274 13798.5 5707.2 -vt 0.562344 0.884996 -v 17844.6 13843.5 5707.2 -vt 0.558714 0.884377 -v 18274 13918.5 5707.2 -vt 0.562344 0.883347 -v 17389 13798.5 5707.2 -vt 0.554863 0.884996 -v 17818.4 13843.5 5707.2 -vt 0.558492 0.884377 -v 17818.4 13873.5 5707.2 -vt 0.558492 0.883965 -v 17844.6 13873.5 5707.2 -vt 0.558714 0.883965 -v 17389 13918.5 5707.2 -vt 0.554863 0.883347 -o mesh2021 -s off -f 10241/10241/10241 10242/10242/10242 10243/10243/10243 -f 10242/10242/10242 10241/10241/10241 10244/10244/10244 -f 10242/10242/10242 10244/10244/10244 10245/10245/10245 -f 10245/10245/10245 10244/10244/10244 10246/10246/10246 -f 10243/10243/10243 10247/10247/10247 10248/10248/10248 -f 10247/10247/10247 10243/10243/10243 10242/10242/10242 -f 10248/10248/10248 10247/10247/10247 10246/10246/10246 -f 10248/10248/10248 10246/10246/10246 10244/10244/10244 -g charts -o chart0000 -s off -f 10241/10241/10241 10242/10242/10242 10243/10243/10243 -f 10242/10242/10242 10241/10241/10241 10244/10244/10244 -f 10242/10242/10242 10244/10244/10244 10245/10245/10245 -f 10245/10245/10245 10244/10244/10244 10246/10246/10246 -f 10243/10243/10243 10247/10247/10247 10248/10248/10248 -f 10247/10247/10247 10243/10243/10243 10242/10242/10242 -f 10248/10248/10248 10247/10247/10247 10246/10246/10246 -f 10248/10248/10248 10246/10246/10246 10244/10244/10244 -v 17389 13918.5 5707.2 -vt 0.867415 0.294724 -v 17389 13873.5 4854.82 -vt 0.868038 0.287799 -v 17389 13918.5 3982.2 -vt 0.867415 0.280709 -v 17389 13798.5 5707.2 -vt 0.869077 0.294724 -v 17389 13843.5 4854.82 -vt 0.868454 0.287799 -v 17389 13843.5 4834.58 -vt 0.868454 0.287634 -v 17389 13873.5 4834.58 -vt 0.868038 0.287634 -v 17389 13798.5 3982.2 -vt 0.869077 0.280709 -o mesh2022 -s off -f 10249/10249/10249 10250/10250/10250 10251/10251/10251 -f 10250/10250/10250 10249/10249/10249 10252/10252/10252 -f 10250/10250/10250 10252/10252/10252 10253/10253/10253 -f 10253/10253/10253 10252/10252/10252 10254/10254/10254 -f 10251/10251/10251 10255/10255/10255 10256/10256/10256 -f 10255/10255/10255 10251/10251/10251 10250/10250/10250 -f 10256/10256/10256 10255/10255/10255 10254/10254/10254 -f 10256/10256/10256 10254/10254/10254 10252/10252/10252 -g charts -o chart0000 -s off -f 10249/10249/10249 10250/10250/10250 10251/10251/10251 -f 10250/10250/10250 10249/10249/10249 10252/10252/10252 -f 10250/10250/10250 10252/10252/10252 10253/10253/10253 -f 10253/10253/10253 10252/10252/10252 10254/10254/10254 -f 10251/10251/10251 10255/10255/10255 10256/10256/10256 -f 10255/10255/10255 10251/10251/10251 10250/10250/10250 -f 10256/10256/10256 10255/10255/10255 10254/10254/10254 -f 10256/10256/10256 10254/10254/10254 10252/10252/10252 -v 18274 13918.5 3982.2 -vt 0.253117 0.94188 -v 17844.6 13873.5 3982.2 -vt 0.249488 0.942498 -v 18274 13798.5 3982.2 -vt 0.253117 0.943528 -v 17389 13918.5 3982.2 -vt 0.245636 0.94188 -v 17818.4 13873.5 3982.2 -vt 0.249266 0.942498 -v 17818.4 13843.5 3982.2 -vt 0.249266 0.94291 -v 17844.6 13843.5 3982.2 -vt 0.249488 0.94291 -v 17389 13798.5 3982.2 -vt 0.245636 0.943528 -o mesh2023 -s off -f 10257/10257/10257 10258/10258/10258 10259/10259/10259 -f 10258/10258/10258 10257/10257/10257 10260/10260/10260 -f 10258/10258/10258 10260/10260/10260 10261/10261/10261 -f 10261/10261/10261 10260/10260/10260 10262/10262/10262 -f 10259/10259/10259 10263/10263/10263 10264/10264/10264 -f 10263/10263/10263 10259/10259/10259 10258/10258/10258 -f 10264/10264/10264 10263/10263/10263 10262/10262/10262 -f 10264/10264/10264 10262/10262/10262 10260/10260/10260 -g charts -o chart0000 -s off -f 10257/10257/10257 10258/10258/10258 10259/10259/10259 -f 10258/10258/10258 10257/10257/10257 10260/10260/10260 -f 10258/10258/10258 10260/10260/10260 10261/10261/10261 -f 10261/10261/10261 10260/10260/10260 10262/10262/10262 -f 10259/10259/10259 10263/10263/10263 10264/10264/10264 -f 10263/10263/10263 10259/10259/10259 10258/10258/10258 -f 10264/10264/10264 10263/10263/10263 10262/10262/10262 -f 10264/10264/10264 10262/10262/10262 10260/10260/10260 -v 18274 13798.5 3982.2 -vt 0.034497 0.718467 -v 18274 13798.5 5707.2 -vt 0.034497 0.704452 -v 18274 13918.5 5707.2 -vt 0.0328346 0.704452 -v 18274 13918.5 3982.2 -vt 0.0328346 0.718467 -o mesh2024 -s off -f 10265/10265/10265 10266/10266/10266 10267/10267/10267 -f 10265/10265/10265 10267/10267/10267 10268/10268/10268 -g charts -o chart0000 -s off -f 10265/10265/10265 10266/10266/10266 10267/10267/10267 -f 10265/10265/10265 10267/10267/10267 10268/10268/10268 -v 17844.6 13843.5 5707.2 -vt 0.687032 0.79596 -v 17818.4 13843.5 5707.2 -vt 0.687032 0.795136 -v 17818.4 13843.5 3982.2 -vt 0.672901 0.795136 -v 17844.6 13843.5 3982.2 -vt 0.672901 0.79596 -o mesh2025 -s off -f 10269/10269/10269 10270/10270/10270 10271/10271/10271 -f 10269/10269/10269 10271/10271/10271 10272/10272/10272 -g charts -o chart0000 -s off -f 10269/10269/10269 10270/10270/10270 10271/10271/10271 -f 10269/10269/10269 10271/10271/10271 10272/10272/10272 -v 17818.4 13843.5 5707.2 -vt 0.0328345 0.65169 -v 17818.4 13873.5 5707.2 -vt 0.0328345 0.650866 -v 17818.4 13873.5 3982.2 -vt 0.0187032 0.650866 -v 17818.4 13843.5 3982.2 -vt 0.0187032 0.65169 -o mesh2026 -s off -f 10273/10273/10273 10274/10274/10274 10275/10275/10275 -f 10273/10273/10273 10275/10275/10275 10276/10276/10276 -g charts -o chart0000 -s off -f 10273/10273/10273 10274/10274/10274 10275/10275/10275 -f 10273/10273/10273 10275/10275/10275 10276/10276/10276 -v 18253.6 13873.5 4854.82 -vt 0.0610973 0.601402 -v 18253.6 13843.5 4854.82 -vt 0.0610973 0.602226 -v 18253.6 13843.5 4834.58 -vt 0.0619284 0.602226 -v 18253.6 13873.5 4834.58 -vt 0.0619284 0.601402 -o mesh2027 -s off -f 10277/10277/10277 10278/10278/10278 10279/10279/10279 -f 10277/10277/10277 10279/10279/10279 10280/10280/10280 -g charts -o chart0000 -s off -f 10277/10277/10277 10278/10278/10278 10279/10279/10279 -f 10277/10277/10277 10279/10279/10279 10280/10280/10280 -v 17389 13873.5 4854.82 -vt 0.836658 0.312861 -v 17389 13843.5 4854.82 -vt 0.836658 0.313685 -v 18253.6 13843.5 4854.82 -vt 0.829177 0.313685 -v 18253.6 13873.5 4854.82 -vt 0.829177 0.312861 -o mesh2028 -s off -f 10281/10281/10281 10282/10282/10282 10283/10283/10283 -f 10281/10281/10281 10283/10283/10283 10284/10284/10284 -g charts -o chart0000 -s off -f 10281/10281/10281 10282/10282/10282 10283/10283/10283 -f 10281/10281/10281 10283/10283/10283 10284/10284/10284 -v 17389 13843.5 4854.82 -vt 0.522444 0.415911 -v 17389 13843.5 4834.58 -vt 0.522444 0.416735 -v 18253.6 13843.5 4834.58 -vt 0.514963 0.416735 -v 18253.6 13843.5 4854.82 -vt 0.514963 0.415911 -o mesh2029 -s off -f 10285/10285/10285 10286/10286/10286 10287/10287/10287 -f 10285/10285/10285 10287/10287/10287 10288/10288/10288 -g charts -o chart0000 -s off -f 10285/10285/10285 10286/10286/10286 10287/10287/10287 -f 10285/10285/10285 10287/10287/10287 10288/10288/10288 -v 17389 13843.5 4834.58 -vt 0.621363 0.45878 -v 17389 13873.5 4834.58 -vt 0.621363 0.459604 -v 18253.6 13873.5 4834.58 -vt 0.613882 0.459604 -v 18253.6 13843.5 4834.58 -vt 0.613882 0.45878 -o mesh2030 -s off -f 10289/10289/10289 10290/10290/10290 10291/10291/10291 -f 10289/10289/10289 10291/10291/10291 10292/10292/10292 -g charts -o chart0000 -s off -f 10289/10289/10289 10290/10290/10290 10291/10291/10291 -f 10289/10289/10289 10291/10291/10291 10292/10292/10292 -v 17389 13873.5 4834.58 -vt 0.120116 0.78277 -v 17389 13873.5 4854.82 -vt 0.120948 0.78277 -v 18253.6 13873.5 4854.82 -vt 0.120948 0.77535 -v 18253.6 13873.5 4834.58 -vt 0.120116 0.77535 -o mesh2031 -s off -f 10293/10293/10293 10294/10294/10294 10295/10295/10295 -f 10293/10293/10293 10295/10295/10295 10296/10296/10296 -g charts -o chart0000 -s off -f 10293/10293/10293 10294/10294/10294 10295/10295/10295 -f 10293/10293/10293 10295/10295/10295 10296/10296/10296 -v 17844.6 13873.5 5707.2 -vt 0.783458 0.302968 -v 17844.6 13843.5 5707.2 -vt 0.783458 0.302143 -v 17844.6 13843.5 3982.2 -vt 0.769327 0.302143 -v 17844.6 13873.5 3982.2 -vt 0.769327 0.302968 -o mesh2032 -s off -f 10297/10297/10297 10298/10298/10298 10299/10299/10299 -f 10297/10297/10297 10299/10299/10299 10300/10300/10300 -g charts -o chart0000 -s off -f 10297/10297/10297 10298/10298/10298 10299/10299/10299 -f 10297/10297/10297 10299/10299/10299 10300/10300/10300 -v 17818.4 13873.5 5707.2 -vt 0.0087281 0.491756 -v 17844.6 13873.5 5707.2 -vt 0.00789692 0.491756 -v 17844.6 13873.5 3982.2 -vt 0.00789692 0.477741 -v 17818.4 13873.5 3982.2 -vt 0.0087281 0.477741 -o mesh2033 -s off -f 10301/10301/10301 10302/10302/10302 10303/10303/10303 -f 10301/10301/10301 10303/10303/10303 10304/10304/10304 -g charts -o chart0000 -s off -f 10301/10301/10301 10302/10302/10302 10303/10303/10303 -f 10301/10301/10301 10303/10303/10303 10304/10304/10304 -v 18371.5 13776 284.7 -vt 0.64547 0.874279 -v 18334 13776 322.2 -vt 0.645152 0.873454 -v 17291.5 13776 284.7 -vt 0.636326 0.874279 -v 17329 13776 322.2 -vt 0.636643 0.873454 -o mesh2034 -s off -f 10305/10305/10305 10306/10306/10306 10307/10307/10307 -f 10308/10308/10308 10307/10307/10307 10306/10306/10306 -g charts -o chart0000 -s off -f 10305/10305/10305 10306/10306/10306 10307/10307/10307 -f 10308/10308/10308 10307/10307/10307 10306/10306/10306 -v 18334 13776 322.2 -vt 0.216019 0.524732 -v 18371.5 13776 284.7 -vt 0.215711 0.525556 -v 18371.5 13776 2204.7 -vt 0.231504 0.525556 -o mesh2035 -s off -f 10309/10309/10309 10310/10310/10310 10311/10311/10311 -g charts -o chart0000 -s off -f 10309/10309/10309 10310/10310/10310 10311/10311/10311 -v 18334 13776 322.2 -vt 0.404406 0.65169 -v 18371.5 13776 2204.7 -vt 0.404406 0.666529 -v 18334 13776 2167.2 -vt 0.403574 0.666228 -o mesh2036 -s off -f 10312/10312/10312 10313/10313/10313 10314/10314/10314 -g charts -o chart0000 -s off -f 10312/10312/10312 10313/10313/10313 10314/10314/10314 -v 18334 13776 2167.2 -vt 0.93724 0.629738 -v 18371.5 13776 2204.7 -vt 0.938071 0.629431 -v 17329 13776 2167.2 -vt 0.938071 0.637675 -o mesh2037 -s off -f 10315/10315/10315 10316/10316/10316 10317/10317/10317 -g charts -o chart0000 -s off -f 10315/10315/10315 10316/10316/10316 10317/10317/10317 -v 17291.5 13776 284.7 -vt 0.979634 0.997114 -v 17329 13776 322.2 -vt 0.978803 0.996809 -v 17291.5 13776 2204.7 -vt 0.979634 0.981451 -o mesh2038 -s off -f 10318/10318/10318 10319/10319/10319 10320/10320/10320 -g charts -o chart0000 -s off -f 10318/10318/10318 10319/10319/10319 10320/10320/10320 -v 17291.5 13776 2204.7 -vt 0.755195 0.660758 -v 17329 13776 322.2 -vt 0.770158 0.660758 -v 17329 13776 2167.2 -vt 0.755499 0.659934 -o mesh2039 -s off -f 10321/10321/10321 10322/10322/10322 10323/10323/10323 -g charts -o chart0000 -s off -f 10321/10321/10321 10322/10322/10322 10323/10323/10323 -v 17291.5 13776 2204.7 -vt 0.224854 0.515664 -v 17329 13776 2167.2 -vt 0.224537 0.514839 -v 18371.5 13776 2204.7 -vt 0.215711 0.515664 -o mesh2040 -s off -f 10324/10324/10324 10325/10325/10325 10326/10326/10326 -g charts -o chart0000 -s off -f 10324/10324/10324 10325/10325/10325 10326/10326/10326 -v 17291.5 13941 284.7 -vt 0.412718 0.649217 -v 17329 13941 322.2 -vt 0.413549 0.649532 -v 18371.5 13941 284.7 -vt 0.412718 0.658285 -v 18334 13941 322.2 -vt 0.413549 0.65797 -o mesh2041 -s off -f 10327/10327/10327 10328/10328/10328 10329/10329/10329 -f 10330/10330/10330 10329/10329/10329 10328/10328/10328 -g charts -o chart0000 -s off -f 10327/10327/10327 10328/10328/10328 10329/10329/10329 -f 10330/10330/10330 10329/10329/10329 10328/10328/10328 -v 17329 13941 322.2 -vt 0.713633 0.980108 -v 17291.5 13941 284.7 -vt 0.714464 0.979802 -v 17291.5 13941 2204.7 -vt 0.714464 0.995466 -o mesh2042 -s off -f 10331/10331/10331 10332/10332/10332 10333/10333/10333 -g charts -o chart0000 -s off -f 10331/10331/10331 10332/10332/10332 10333/10333/10333 -v 17329 13941 322.2 -vt 0.450125 0.166117 -v 17291.5 13941 2204.7 -vt 0.450125 0.180956 -v 17329 13941 2167.2 -vt 0.449293 0.180655 -o mesh2043 -s off -f 10334/10334/10334 10335/10335/10335 10336/10336/10336 -g charts -o chart0000 -s off -f 10334/10334/10334 10335/10335/10335 10336/10336/10336 -v 17329 13941 2167.2 -vt 0.380609 0.597279 -v 17291.5 13941 2204.7 -vt 0.380299 0.598104 -v 18334 13941 2167.2 -vt 0.388612 0.598104 -o mesh2044 -s off -f 10337/10337/10337 10338/10338/10338 10339/10339/10339 -g charts -o chart0000 -s off -f 10337/10337/10337 10338/10338/10338 10339/10339/10339 -v 18371.5 13941 284.7 -vt 0.439318 0.665705 -v 18334 13941 322.2 -vt 0.43901 0.66488 -v 18371.5 13941 2204.7 -vt 0.423525 0.665705 -o mesh2045 -s off -f 10340/10340/10340 10341/10341/10341 10342/10342/10342 -g charts -o chart0000 -s off -f 10340/10340/10340 10341/10341/10341 10342/10342/10342 -v 18371.5 13941 2204.7 -vt 0.939734 0.626958 -v 18334 13941 322.2 -vt 0.939734 0.641797 -v 18334 13941 2167.2 -vt 0.938903 0.627259 -o mesh2046 -s off -f 10343/10343/10343 10344/10344/10344 10345/10345/10345 -g charts -o chart0000 -s off -f 10343/10343/10343 10344/10344/10344 10345/10345/10345 -v 18371.5 13941 2204.7 -vt 0.578969 0.9831 -v 18334 13941 2167.2 -vt 0.578138 0.982785 -v 17291.5 13941 2204.7 -vt 0.578969 0.974031 -o mesh2047 -s off -f 10346/10346/10346 10347/10347/10347 10348/10348/10348 -g charts -o chart0000 -s off -f 10346/10346/10346 10347/10347/10347 10348/10348/10348 -v 17291.5 13776 2204.7 -vt 0.912302 0.406842 -v 18371.5 13776 2204.7 -vt 0.903159 0.406842 -v 18371.5 13941 2204.7 -vt 0.903159 0.405194 -v 17291.5 13941 2204.7 -vt 0.912302 0.405194 -o mesh2048 -s off -f 10349/10349/10349 10350/10350/10350 10351/10351/10351 -f 10349/10349/10349 10351/10351/10351 10352/10352/10352 -g charts -o chart0000 -s off -f 10349/10349/10349 10350/10350/10350 10351/10351/10351 -f 10349/10349/10349 10351/10351/10351 10352/10352/10352 -v 18371.5 13776 2204.7 -vt 0.628845 0.682193 -v 18371.5 13776 284.7 -vt 0.644638 0.682193 -v 18371.5 13941 284.7 -vt 0.644638 0.683842 -v 18371.5 13941 2204.7 -vt 0.628845 0.683842 -o mesh2049 -s off -f 10353/10353/10353 10354/10354/10354 10355/10355/10355 -f 10353/10353/10353 10355/10355/10355 10356/10356/10356 -g charts -o chart0000 -s off -f 10353/10353/10353 10354/10354/10354 10355/10355/10355 -f 10353/10353/10353 10355/10355/10355 10356/10356/10356 -v 18371.5 13776 284.7 -vt 0.111804 0.371393 -v 17291.5 13776 284.7 -vt 0.120948 0.371393 -v 17291.5 13941 284.7 -vt 0.120948 0.373042 -v 18371.5 13941 284.7 -vt 0.111804 0.373042 -o mesh2050 -s off -f 10357/10357/10357 10358/10358/10358 10359/10359/10359 -f 10357/10357/10357 10359/10359/10359 10360/10360/10360 -g charts -o chart0000 -s off -f 10357/10357/10357 10358/10358/10358 10359/10359/10359 -f 10357/10357/10357 10359/10359/10359 10360/10360/10360 -v 17291.5 13776 284.7 -vt 0.0752285 0.875103 -v 17291.5 13776 2204.7 -vt 0.0752285 0.859439 -v 17291.5 13941 2204.7 -vt 0.0735661 0.859439 -v 17291.5 13941 284.7 -vt 0.0735661 0.875103 -o mesh2051 -s off -f 10361/10361/10361 10362/10362/10362 10363/10363/10363 -f 10361/10361/10361 10363/10363/10363 10364/10364/10364 -g charts -o chart0000 -s off -f 10361/10361/10361 10362/10362/10362 10363/10363/10363 -f 10361/10361/10361 10363/10363/10363 10364/10364/10364 -v 17329 13941 322.2 -vt 0.967165 0.242786 -v 17329 13896 322.2 -vt 0.967165 0.243236 -v 18334 13896 322.2 -vt 0.958853 0.243236 -v 18334 13941 322.2 -vt 0.958853 0.242786 -v 17329 13776 322.2 -vt 0.967165 0.244435 -v 18334 13776 322.2 -vt 0.958853 0.244435 -o mesh2052 -s off -f 10365/10365/10365 10366/10366/10366 10367/10367/10367 -f 10365/10365/10365 10367/10367/10367 10368/10368/10368 -f 10369/10369/10369 10370/10370/10370 10367/10367/10367 -f 10369/10369/10369 10367/10367/10367 10366/10366/10366 -g charts -o chart0000 -s off -f 10365/10365/10365 10366/10366/10366 10367/10367/10367 -f 10365/10365/10365 10367/10367/10367 10368/10368/10368 -f 10369/10369/10369 10370/10370/10370 10367/10367/10367 -f 10369/10369/10369 10367/10367/10367 10366/10366/10366 -v 18334 13941 322.2 -vt 0.927265 0.779472 -v 18334 13896 322.2 -vt 0.927265 0.779922 -v 18334 13896 2167.2 -vt 0.912303 0.779922 -v 18334 13941 2167.2 -vt 0.912303 0.779472 -v 18334 13776 322.2 -vt 0.927265 0.781121 -v 18334 13776 2167.2 -vt 0.912303 0.781121 -o mesh2053 -s off -f 10371/10371/10371 10372/10372/10372 10373/10373/10373 -f 10371/10371/10371 10373/10373/10373 10374/10374/10374 -f 10375/10375/10375 10376/10376/10376 10373/10373/10373 -f 10375/10375/10375 10373/10373/10373 10372/10372/10372 -g charts -o chart0000 -s off -f 10371/10371/10371 10372/10372/10372 10373/10373/10373 -f 10371/10371/10371 10373/10373/10373 10374/10374/10374 -f 10375/10375/10375 10376/10376/10376 10373/10373/10373 -f 10375/10375/10375 10373/10373/10373 10372/10372/10372 -v 18334 13941 2167.2 -vt 0.442643 0.987222 -v 18334 13896 2167.2 -vt 0.442643 0.986772 -v 17329 13896 2167.2 -vt 0.434331 0.986772 -v 17329 13941 2167.2 -vt 0.434331 0.987222 -v 18334 13776 2167.2 -vt 0.442643 0.985573 -v 17329 13776 2167.2 -vt 0.434331 0.985573 -o mesh2054 -s off -f 10377/10377/10377 10378/10378/10378 10379/10379/10379 -f 10377/10377/10377 10379/10379/10379 10380/10380/10380 -f 10381/10381/10381 10382/10382/10382 10379/10379/10379 -f 10381/10381/10381 10379/10379/10379 10378/10378/10378 -g charts -o chart0000 -s off -f 10377/10377/10377 10378/10378/10378 10379/10379/10379 -f 10377/10377/10377 10379/10379/10379 10380/10380/10380 -f 10381/10381/10381 10382/10382/10382 10379/10379/10379 -f 10381/10381/10381 10379/10379/10379 10378/10378/10378 -v 17329 13941 2167.2 -vt 0.0926849 0.986397 -v 17329 13896 2167.2 -vt 0.0926849 0.985948 -v 17329 13896 322.2 -vt 0.0777224 0.985948 -v 17329 13941 322.2 -vt 0.0777224 0.986397 -v 17329 13776 2167.2 -vt 0.0926849 0.984749 -v 17329 13776 322.2 -vt 0.0777224 0.984749 -o mesh2055 -s off -f 10383/10383/10383 10384/10384/10384 10385/10385/10385 -f 10383/10383/10383 10385/10385/10385 10386/10386/10386 -f 10387/10387/10387 10388/10388/10388 10385/10385/10385 -f 10387/10387/10387 10385/10385/10385 10384/10384/10384 -g charts -o chart0000 -s off -f 10383/10383/10383 10384/10384/10384 10385/10385/10385 -f 10383/10383/10383 10385/10385/10385 10386/10386/10386 -f 10387/10387/10387 10388/10388/10388 10385/10385/10385 -f 10387/10387/10387 10385/10385/10385 10384/10384/10384 -v 17329 13896 322.2 -vt 0.588944 0.861913 -v 17389 13896 382.2 -vt 0.589441 0.862737 -v 18334 13896 322.2 -vt 0.597257 0.861913 -v 18274 13896 382.2 -vt 0.596761 0.862737 -o mesh2056 -s off -f 10389/10389/10389 10390/10390/10390 10391/10391/10391 -f 10392/10392/10392 10391/10391/10391 10390/10390/10390 -g charts -o chart0000 -s off -f 10389/10389/10389 10390/10390/10390 10391/10391/10391 -f 10392/10392/10392 10391/10391/10391 10390/10390/10390 -v 17389 13896 382.2 -vt 0.392423 0.995466 -v 17329 13896 322.2 -vt 0.391937 0.99629 -v 17329 13896 2167.2 -vt 0.406899 0.99629 -o mesh2057 -s off -f 10393/10393/10393 10394/10394/10394 10395/10395/10395 -g charts -o chart0000 -s off -f 10393/10393/10393 10394/10394/10394 10395/10395/10395 -v 17389 13896 382.2 -vt 0.915628 0.889942 -v 17329 13896 2167.2 -vt 0.929759 0.889942 -v 17389 13896 2107.2 -vt 0.929268 0.889118 -o mesh2058 -s off -f 10396/10396/10396 10397/10397/10397 10398/10398/10398 -g charts -o chart0000 -s off -f 10396/10396/10396 10397/10397/10397 10398/10398/10398 -v 17389 13896 2107.2 -vt 0.659601 0.983599 -v 17329 13896 2167.2 -vt 0.660432 0.9831 -v 18274 13896 2107.2 -vt 0.660432 0.990519 -o mesh2059 -s off -f 10399/10399/10399 10400/10400/10400 10401/10401/10401 -g charts -o chart0000 -s off -f 10399/10399/10399 10400/10400/10400 10401/10401/10401 -v 18334 13896 322.2 -vt 0.632169 0.667354 -v 18274 13896 382.2 -vt 0.631338 0.666871 -v 18334 13896 2167.2 -vt 0.632169 0.652514 -o mesh2060 -s off -f 10402/10402/10402 10403/10403/10403 10404/10404/10404 -g charts -o chart0000 -s off -f 10402/10402/10402 10403/10403/10403 10404/10404/10404 -v 18334 13896 2167.2 -vt 0.752701 0.298846 -v 18274 13896 382.2 -vt 0.752701 0.312861 -v 18274 13896 2107.2 -vt 0.75187 0.299332 -o mesh2061 -s off -f 10405/10405/10405 10406/10406/10406 10407/10407/10407 -g charts -o chart0000 -s off -f 10405/10405/10405 10406/10406/10406 10407/10407/10407 -v 18334 13896 2167.2 -vt 0.89734 0.382935 -v 18274 13896 2107.2 -vt 0.896509 0.382443 -v 17329 13896 2167.2 -vt 0.89734 0.374691 -o mesh2062 -s off -f 10408/10408/10408 10409/10409/10409 10410/10410/10410 -g charts -o chart0000 -s off -f 10408/10408/10408 10409/10409/10409 10410/10410/10410 -v 18274 13776 2107.2 -vt 0.637157 0.807502 -v 17844.6 13821 2107.2 -vt 0.633527 0.806884 -v 18274 13896 2107.2 -vt 0.637157 0.805853 -v 17389 13776 2107.2 -vt 0.629676 0.807502 -v 17818.4 13821 2107.2 -vt 0.633306 0.806884 -v 17818.4 13851 2107.2 -vt 0.633306 0.806472 -v 17844.6 13851 2107.2 -vt 0.633527 0.806472 -v 17389 13896 2107.2 -vt 0.629676 0.805853 -o mesh2063 -s off -f 10411/10411/10411 10412/10412/10412 10413/10413/10413 -f 10412/10412/10412 10411/10411/10411 10414/10414/10414 -f 10412/10412/10412 10414/10414/10414 10415/10415/10415 -f 10415/10415/10415 10414/10414/10414 10416/10416/10416 -f 10413/10413/10413 10417/10417/10417 10418/10418/10418 -f 10417/10417/10417 10413/10413/10413 10412/10412/10412 -f 10418/10418/10418 10417/10417/10417 10416/10416/10416 -f 10418/10418/10418 10416/10416/10416 10414/10414/10414 -g charts -o chart0000 -s off -f 10411/10411/10411 10412/10412/10412 10413/10413/10413 -f 10412/10412/10412 10411/10411/10411 10414/10414/10414 -f 10412/10412/10412 10414/10414/10414 10415/10415/10415 -f 10415/10415/10415 10414/10414/10414 10416/10416/10416 -f 10413/10413/10413 10417/10417/10417 10418/10418/10418 -f 10417/10417/10417 10413/10413/10413 10412/10412/10412 -f 10418/10418/10418 10417/10417/10417 10416/10416/10416 -f 10418/10418/10418 10416/10416/10416 10414/10414/10414 -v 17389 13896 2107.2 -vt 0.251455 0.951772 -v 17389 13851 1254.82 -vt 0.244472 0.952391 -v 17389 13896 382.2 -vt 0.237323 0.951772 -v 17389 13776 2107.2 -vt 0.251455 0.953421 -v 17389 13821 1254.82 -vt 0.244472 0.952803 -v 17389 13821 1234.58 -vt 0.244306 0.952803 -v 17389 13851 1234.58 -vt 0.244306 0.952391 -v 17389 13776 382.2 -vt 0.237323 0.953421 -o mesh2064 -s off -f 10419/10419/10419 10420/10420/10420 10421/10421/10421 -f 10420/10420/10420 10419/10419/10419 10422/10422/10422 -f 10420/10420/10420 10422/10422/10422 10423/10423/10423 -f 10423/10423/10423 10422/10422/10422 10424/10424/10424 -f 10421/10421/10421 10425/10425/10425 10426/10426/10426 -f 10425/10425/10425 10421/10421/10421 10420/10420/10420 -f 10426/10426/10426 10425/10425/10425 10424/10424/10424 -f 10426/10426/10426 10424/10424/10424 10422/10422/10422 -g charts -o chart0000 -s off -f 10419/10419/10419 10420/10420/10420 10421/10421/10421 -f 10420/10420/10420 10419/10419/10419 10422/10422/10422 -f 10420/10420/10420 10422/10422/10422 10423/10423/10423 -f 10423/10423/10423 10422/10422/10422 10424/10424/10424 -f 10421/10421/10421 10425/10425/10425 10426/10426/10426 -f 10425/10425/10425 10421/10421/10421 10420/10420/10420 -f 10426/10426/10426 10425/10425/10425 10424/10424/10424 -f 10426/10426/10426 10424/10424/10424 10422/10422/10422 -v 18274 13896 382.2 -vt 0.31463 0.596455 -v 17844.6 13851 382.2 -vt 0.311 0.597074 -v 18274 13776 382.2 -vt 0.31463 0.598104 -v 17389 13896 382.2 -vt 0.307149 0.596455 -v 17818.4 13851 382.2 -vt 0.310778 0.597074 -v 17818.4 13821 382.2 -vt 0.310778 0.597486 -v 17844.6 13821 382.2 -vt 0.311 0.597486 -v 17389 13776 382.2 -vt 0.307149 0.598104 -o mesh2065 -s off -f 10427/10427/10427 10428/10428/10428 10429/10429/10429 -f 10428/10428/10428 10427/10427/10427 10430/10430/10430 -f 10428/10428/10428 10430/10430/10430 10431/10431/10431 -f 10431/10431/10431 10430/10430/10430 10432/10432/10432 -f 10429/10429/10429 10433/10433/10433 10434/10434/10434 -f 10433/10433/10433 10429/10429/10429 10428/10428/10428 -f 10434/10434/10434 10433/10433/10433 10432/10432/10432 -f 10434/10434/10434 10432/10432/10432 10430/10430/10430 -g charts -o chart0000 -s off -f 10427/10427/10427 10428/10428/10428 10429/10429/10429 -f 10428/10428/10428 10427/10427/10427 10430/10430/10430 -f 10428/10428/10428 10430/10430/10430 10431/10431/10431 -f 10431/10431/10431 10430/10430/10430 10432/10432/10432 -f 10429/10429/10429 10433/10433/10433 10434/10434/10434 -f 10433/10433/10433 10429/10429/10429 10428/10428/10428 -f 10434/10434/10434 10433/10433/10433 10432/10432/10432 -f 10434/10434/10434 10432/10432/10432 10430/10430/10430 -v 18274 13776 382.2 -vt 0.761845 0.712696 -v 18274 13776 2107.2 -vt 0.747714 0.712696 -v 18274 13896 2107.2 -vt 0.747714 0.711047 -v 18274 13896 382.2 -vt 0.761845 0.711047 -o mesh2066 -s off -f 10435/10435/10435 10436/10436/10436 10437/10437/10437 -f 10435/10435/10435 10437/10437/10437 10438/10438/10438 -g charts -o chart0000 -s off -f 10435/10435/10435 10436/10436/10436 10437/10437/10437 -f 10435/10435/10435 10437/10437/10437 10438/10438/10438 -v 17844.6 13821 2107.2 -vt 0.235661 0.612943 -v 17818.4 13821 2107.2 -vt 0.23483 0.612943 -v 17818.4 13821 382.2 -vt 0.23483 0.598928 -v 17844.6 13821 382.2 -vt 0.235661 0.598928 -o mesh2067 -s off -f 10439/10439/10439 10440/10440/10440 10441/10441/10441 -f 10439/10439/10439 10441/10441/10441 10442/10442/10442 -g charts -o chart0000 -s off -f 10439/10439/10439 10440/10440/10440 10441/10441/10441 -f 10439/10439/10439 10441/10441/10441 10442/10442/10442 -v 17818.4 13821 2107.2 -vt 0.0145469 0.73413 -v 17818.4 13851 2107.2 -vt 0.0145469 0.733306 -v 17818.4 13851 382.2 -vt 0.000415628 0.733306 -v 17818.4 13821 382.2 -vt 0.000415628 0.73413 -o mesh2068 -s off -f 10443/10443/10443 10444/10444/10444 10445/10445/10445 -f 10443/10443/10443 10445/10445/10445 10446/10446/10446 -g charts -o chart0000 -s off -f 10443/10443/10443 10444/10444/10444 10445/10445/10445 -f 10443/10443/10443 10445/10445/10445 10446/10446/10446 -v 18253.6 13851 1254.82 -vt 0.581463 0.92127 -v 18253.6 13821 1254.82 -vt 0.582294 0.92127 -v 18253.6 13821 1234.58 -vt 0.582294 0.922094 -v 18253.6 13851 1234.58 -vt 0.581463 0.922094 -o mesh2069 -s off -f 10447/10447/10447 10448/10448/10448 10449/10449/10449 -f 10447/10447/10447 10449/10449/10449 10450/10450/10450 -g charts -o chart0000 -s off -f 10447/10447/10447 10448/10448/10448 10449/10449/10449 -f 10447/10447/10447 10449/10449/10449 10450/10450/10450 -v 17389 13851 1254.82 -vt 0.371987 0.986397 -v 17389 13821 1254.82 -vt 0.372818 0.986397 -v 18253.6 13821 1254.82 -vt 0.372818 0.978978 -v 18253.6 13851 1254.82 -vt 0.371987 0.978978 -o mesh2070 -s off -f 10451/10451/10451 10452/10452/10452 10453/10453/10453 -f 10451/10451/10451 10453/10453/10453 10454/10454/10454 -g charts -o chart0000 -s off -f 10451/10451/10451 10452/10452/10452 10453/10453/10453 -f 10451/10451/10451 10453/10453/10453 10454/10454/10454 -v 17389 13821 1254.82 -vt 0.371987 0.415911 -v 17389 13821 1234.58 -vt 0.372818 0.415911 -v 18253.6 13821 1234.58 -vt 0.372818 0.408491 -v 18253.6 13821 1254.82 -vt 0.371987 0.408491 -o mesh2071 -s off -f 10455/10455/10455 10456/10456/10456 10457/10457/10457 -f 10455/10455/10455 10457/10457/10457 10458/10458/10458 -g charts -o chart0000 -s off -f 10455/10455/10455 10456/10456/10456 10457/10457/10457 -f 10455/10455/10455 10457/10457/10457 10458/10458/10458 -v 17389 13821 1234.58 -vt 0.879884 0.180132 -v 17389 13851 1234.58 -vt 0.880715 0.180132 -v 18253.6 13851 1234.58 -vt 0.880715 0.172712 -v 18253.6 13821 1234.58 -vt 0.879884 0.172712 -o mesh2072 -s off -f 10459/10459/10459 10460/10460/10460 10461/10461/10461 -f 10459/10459/10459 10461/10461/10461 10462/10462/10462 -g charts -o chart0000 -s off -f 10459/10459/10459 10460/10460/10460 10461/10461/10461 -f 10459/10459/10459 10461/10461/10461 10462/10462/10462 -v 17389 13851 1234.58 -vt 0.901496 0.475268 -v 17389 13851 1254.82 -vt 0.902327 0.475268 -v 18253.6 13851 1254.82 -vt 0.902327 0.467848 -v 18253.6 13851 1234.58 -vt 0.901496 0.467848 -o mesh2073 -s off -f 10463/10463/10463 10464/10464/10464 10465/10465/10465 -f 10463/10463/10463 10465/10465/10465 10466/10466/10466 -g charts -o chart0000 -s off -f 10463/10463/10463 10464/10464/10464 10465/10465/10465 -f 10463/10463/10463 10465/10465/10465 10466/10466/10466 -v 17844.6 13851 2107.2 -vt 0.979634 0.183429 -v 17844.6 13821 2107.2 -vt 0.978803 0.183429 -v 17844.6 13821 382.2 -vt 0.978803 0.169415 -v 17844.6 13851 382.2 -vt 0.979634 0.169415 -o mesh2074 -s off -f 10467/10467/10467 10468/10468/10468 10469/10469/10469 -f 10467/10467/10467 10469/10469/10469 10470/10470/10470 -g charts -o chart0000 -s off -f 10467/10467/10467 10468/10468/10468 10469/10469/10469 -f 10467/10467/10467 10469/10469/10469 10470/10470/10470 -v 17818.4 13851 2107.2 -vt 0.258105 0.993817 -v 17844.6 13851 2107.2 -vt 0.257273 0.993817 -v 17844.6 13851 382.2 -vt 0.257273 0.979802 -v 17818.4 13851 382.2 -vt 0.258105 0.979802 -o mesh2075 -s off -f 10471/10471/10471 10472/10472/10472 10473/10473/10473 -f 10471/10471/10471 10473/10473/10473 10474/10474/10474 -g charts -o chart0000 -s off -f 10471/10471/10471 10472/10472/10472 10473/10473/10473 -f 10471/10471/10471 10473/10473/10473 10474/10474/10474 -v -15753.5 -8394.01 284.7 -vt 0.980466 0.653339 -v -15716 -8394.01 322.2 -vt 0.981297 0.653654 -v -14673.5 -8394.01 284.7 -vt 0.980466 0.662407 -v -14711 -8394.01 322.2 -vt 0.981297 0.662092 -o mesh2076 -s off -f 10475/10475/10475 10476/10476/10476 10477/10477/10477 -f 10478/10478/10478 10477/10477/10477 10476/10476/10476 -g charts -o chart0000 -s off -f 10475/10475/10475 10476/10476/10476 10477/10477/10477 -f 10478/10478/10478 10477/10477/10477 10476/10476/10476 -v -15716 -8394.01 322.2 -vt 0.410533 0.503298 -v -15753.5 -8394.01 284.7 -vt 0.410224 0.504122 -v -15753.5 -8394.01 2204.7 -vt 0.426018 0.504122 -o mesh2077 -s off -f 10479/10479/10479 10480/10480/10480 10481/10481/10481 -g charts -o chart0000 -s off -f 10479/10479/10479 10480/10480/10480 10481/10481/10481 -v -15716 -8394.01 322.2 -vt 0.670407 0.372218 -v -15753.5 -8394.01 2204.7 -vt 0.68537 0.372218 -v -15716 -8394.01 2167.2 -vt 0.685066 0.371393 -o mesh2078 -s off -f 10482/10482/10482 10483/10483/10483 10484/10484/10484 -g charts -o chart0000 -s off -f 10482/10482/10482 10483/10483/10483 10484/10484/10484 -v -15716 -8394.01 2167.2 -vt 0.569304 0.570899 -v -15753.5 -8394.01 2204.7 -vt 0.568994 0.571723 -v -14711 -8394.01 2167.2 -vt 0.577307 0.571723 -o mesh2079 -s off -f 10485/10485/10485 10486/10486/10486 10487/10487/10487 -g charts -o chart0000 -s off -f 10485/10485/10485 10486/10486/10486 10487/10487/10487 -v -14673.5 -8394.01 284.7 -vt 0.262261 0.997114 -v -14711 -8394.01 322.2 -vt 0.26143 0.996809 -v -14673.5 -8394.01 2204.7 -vt 0.262261 0.981451 -o mesh2080 -s off -f 10488/10488/10488 10489/10489/10489 10490/10490/10490 -g charts -o chart0000 -s off -f 10488/10488/10488 10489/10489/10489 10490/10490/10490 -v -14673.5 -8394.01 2204.7 -vt 0.663757 0.370569 -v -14711 -8394.01 322.2 -vt 0.67872 0.370569 -v -14711 -8394.01 2167.2 -vt 0.664061 0.369744 -o mesh2081 -s off -f 10491/10491/10491 10492/10492/10492 10493/10493/10493 -g charts -o chart0000 -s off -f 10491/10491/10491 10492/10492/10492 10493/10493/10493 -v -14673.5 -8394.01 2204.7 -vt 0.289692 0.412613 -v -14711 -8394.01 2167.2 -vt 0.289375 0.411789 -v -15753.5 -8394.01 2204.7 -vt 0.280549 0.412613 -o mesh2082 -s off -f 10494/10494/10494 10495/10495/10495 10496/10496/10496 -g charts -o chart0000 -s off -f 10494/10494/10494 10495/10495/10495 10496/10496/10496 -v -14673.5 -8559.01 284.7 -vt 0.386118 0.815746 -v -14711 -8559.01 322.2 -vt 0.386949 0.816061 -v -15753.5 -8559.01 284.7 -vt 0.386118 0.824814 -v -15716 -8559.01 322.2 -vt 0.386949 0.8245 -o mesh2083 -s off -f 10497/10497/10497 10498/10498/10498 10499/10499/10499 -f 10500/10500/10500 10499/10499/10499 10498/10498/10498 -g charts -o chart0000 -s off -f 10497/10497/10497 10498/10498/10498 10499/10499/10499 -f 10500/10500/10500 10499/10499/10499 10498/10498/10498 -v -14711 -8559.01 322.2 -vt 0.0220283 0.38489 -v -14673.5 -8559.01 284.7 -vt 0.0228594 0.384584 -v -14673.5 -8559.01 2204.7 -vt 0.0228594 0.400247 -o mesh2084 -s off -f 10501/10501/10501 10502/10502/10502 10503/10503/10503 -g charts -o chart0000 -s off -f 10501/10501/10501 10502/10502/10502 10503/10503/10503 -v -14711 -8559.01 322.2 -vt 0.450125 0.18343 -v -14673.5 -8559.01 2204.7 -vt 0.450125 0.198269 -v -14711 -8559.01 2167.2 -vt 0.449293 0.197967 -o mesh2085 -s off -f 10504/10504/10504 10505/10505/10505 10506/10506/10506 -g charts -o chart0000 -s off -f 10504/10504/10504 10505/10505/10505 10506/10506/10506 -v -14711 -8559.01 2167.2 -vt 0.24148 0.620669 -v -14673.5 -8559.01 2204.7 -vt 0.242311 0.620363 -v -15716 -8559.01 2167.2 -vt 0.242311 0.628607 -o mesh2086 -s off -f 10507/10507/10507 10508/10508/10508 10509/10509/10509 -g charts -o chart0000 -s off -f 10507/10507/10507 10508/10508/10508 10509/10509/10509 -v -15753.5 -8559.01 284.7 -vt 0.372818 0.664056 -v -15716 -8559.01 322.2 -vt 0.371987 0.66375 -v -15753.5 -8559.01 2204.7 -vt 0.372818 0.648392 -o mesh2087 -s off -f 10510/10510/10510 10511/10511/10511 10512/10512/10512 -g charts -o chart0000 -s off -f 10510/10510/10510 10511/10511/10511 10512/10512/10512 -v -15753.5 -8559.01 2204.7 -vt 0.607232 0.940231 -v -15716 -8559.01 322.2 -vt 0.622194 0.940231 -v -15716 -8559.01 2167.2 -vt 0.607536 0.939406 -o mesh2088 -s off -f 10513/10513/10513 10514/10514/10514 10515/10515/10515 -g charts -o chart0000 -s off -f 10513/10513/10513 10514/10514/10514 10515/10515/10515 -v -15753.5 -8559.01 2204.7 -vt 0.832502 0.00453413 -v -15716 -8559.01 2167.2 -vt 0.832184 0.00370981 -v -14673.5 -8559.01 2204.7 -vt 0.823358 0.00453413 -o mesh2089 -s off -f 10516/10516/10516 10517/10517/10517 10518/10518/10518 -g charts -o chart0000 -s off -f 10516/10516/10516 10517/10517/10517 10518/10518/10518 -v -14673.5 -8394.01 2204.7 -vt 0.868246 0.67972 -v -15753.5 -8394.01 2204.7 -vt 0.868246 0.688788 -v -15753.5 -8559.01 2204.7 -vt 0.869908 0.688788 -v -14673.5 -8559.01 2204.7 -vt 0.869908 0.67972 -o mesh2090 -s off -f 10519/10519/10519 10520/10520/10520 10521/10521/10521 -f 10519/10519/10519 10521/10521/10521 10522/10522/10522 -g charts -o chart0000 -s off -f 10519/10519/10519 10520/10520/10520 10521/10521/10521 -f 10519/10519/10519 10521/10521/10521 10522/10522/10522 -v -15753.5 -8394.01 2204.7 -vt 0.770989 0.874279 -v -15753.5 -8394.01 284.7 -vt 0.786783 0.874279 -v -15753.5 -8559.01 284.7 -vt 0.786783 0.875927 -v -15753.5 -8559.01 2204.7 -vt 0.770989 0.875927 -o mesh2091 -s off -f 10523/10523/10523 10524/10524/10524 10525/10525/10525 -f 10523/10523/10523 10525/10525/10525 10526/10526/10526 -g charts -o chart0000 -s off -f 10523/10523/10523 10524/10524/10524 10525/10525/10525 -f 10523/10523/10523 10525/10525/10525 10526/10526/10526 -v -15753.5 -8394.01 284.7 -vt 0.696176 0.356554 -v -14673.5 -8394.01 284.7 -vt 0.696176 0.347486 -v -14673.5 -8559.01 284.7 -vt 0.694514 0.347486 -v -15753.5 -8559.01 284.7 -vt 0.694514 0.356554 -o mesh2092 -s off -f 10527/10527/10527 10528/10528/10528 10529/10529/10529 -f 10527/10527/10527 10529/10529/10529 10530/10530/10530 -g charts -o chart0000 -s off -f 10527/10527/10527 10528/10528/10528 10529/10529/10529 -f 10527/10527/10527 10529/10529/10529 10530/10530/10530 -v -14673.5 -8394.01 284.7 -vt 0.999584 0.180956 -v -14673.5 -8394.01 2204.7 -vt 0.999584 0.165293 -v -14673.5 -8559.01 2204.7 -vt 0.997922 0.165293 -v -14673.5 -8559.01 284.7 -vt 0.997922 0.180956 -o mesh2093 -s off -f 10531/10531/10531 10532/10532/10532 10533/10533/10533 -f 10531/10531/10531 10533/10533/10533 10534/10534/10534 -g charts -o chart0000 -s off -f 10531/10531/10531 10532/10532/10532 10533/10533/10533 -f 10531/10531/10531 10533/10533/10533 10534/10534/10534 -v -14711 -8559.01 322.2 -vt 0.90399 0.56925 -v -14711 -8514.01 322.2 -vt 0.903537 0.56925 -v -15716 -8514.01 322.2 -vt 0.903537 0.561006 -v -15716 -8559.01 322.2 -vt 0.90399 0.561006 -v -14711 -8394.01 322.2 -vt 0.902328 0.56925 -v -15716 -8394.01 322.2 -vt 0.902328 0.561006 -o mesh2094 -s off -f 10535/10535/10535 10536/10536/10536 10537/10537/10537 -f 10535/10535/10535 10537/10537/10537 10538/10538/10538 -f 10539/10539/10539 10540/10540/10540 10537/10537/10537 -f 10539/10539/10539 10537/10537/10537 10536/10536/10536 -g charts -o chart0000 -s off -f 10535/10535/10535 10536/10536/10536 10537/10537/10537 -f 10535/10535/10535 10537/10537/10537 10538/10538/10538 -f 10539/10539/10539 10540/10540/10540 10537/10537/10537 -f 10539/10539/10539 10537/10537/10537 10536/10536/10536 -v -15716 -8559.01 322.2 -vt 0.194929 0.997939 -v -15716 -8514.01 322.2 -vt 0.194929 0.998389 -v -15716 -8514.01 2167.2 -vt 0.179967 0.998389 -v -15716 -8559.01 2167.2 -vt 0.179967 0.997939 -v -15716 -8394.01 322.2 -vt 0.194929 0.999588 -v -15716 -8394.01 2167.2 -vt 0.179967 0.999588 -o mesh2095 -s off -f 10541/10541/10541 10542/10542/10542 10543/10543/10543 -f 10541/10541/10541 10543/10543/10543 10544/10544/10544 -f 10545/10545/10545 10546/10546/10546 10543/10543/10543 -f 10545/10545/10545 10543/10543/10543 10542/10542/10542 -g charts -o chart0000 -s off -f 10541/10541/10541 10542/10542/10542 10543/10543/10543 -f 10541/10541/10541 10543/10543/10543 10544/10544/10544 -f 10545/10545/10545 10546/10546/10546 10543/10543/10543 -f 10545/10545/10545 10543/10543/10543 10542/10542/10542 -v -15716 -8559.01 2167.2 -vt 0.77847 0.32028 -v -15716 -8514.01 2167.2 -vt 0.77847 0.32073 -v -14711 -8514.01 2167.2 -vt 0.770158 0.32073 -v -14711 -8559.01 2167.2 -vt 0.770158 0.32028 -v -15716 -8394.01 2167.2 -vt 0.77847 0.321929 -v -14711 -8394.01 2167.2 -vt 0.770158 0.321929 -o mesh2096 -s off -f 10547/10547/10547 10548/10548/10548 10549/10549/10549 -f 10547/10547/10547 10549/10549/10549 10550/10550/10550 -f 10551/10551/10551 10552/10552/10552 10549/10549/10549 -f 10551/10551/10551 10549/10549/10549 10548/10548/10548 -g charts -o chart0000 -s off -f 10547/10547/10547 10548/10548/10548 10549/10549/10549 -f 10547/10547/10547 10549/10549/10549 10550/10550/10550 -f 10551/10551/10551 10552/10552/10552 10549/10549/10549 -f 10551/10551/10551 10549/10549/10549 10548/10548/10548 -v -14711 -8559.01 2167.2 -vt 0.933084 0.599753 -v -14711 -8514.01 2167.2 -vt 0.933084 0.599303 -v -14711 -8514.01 322.2 -vt 0.918121 0.599303 -v -14711 -8559.01 322.2 -vt 0.918121 0.599753 -v -14711 -8394.01 2167.2 -vt 0.933084 0.598104 -v -14711 -8394.01 322.2 -vt 0.918121 0.598104 -o mesh2097 -s off -f 10553/10553/10553 10554/10554/10554 10555/10555/10555 -f 10553/10553/10553 10555/10555/10555 10556/10556/10556 -f 10557/10557/10557 10558/10558/10558 10555/10555/10555 -f 10557/10557/10557 10555/10555/10555 10554/10554/10554 -g charts -o chart0000 -s off -f 10553/10553/10553 10554/10554/10554 10555/10555/10555 -f 10553/10553/10553 10555/10555/10555 10556/10556/10556 -f 10557/10557/10557 10558/10558/10558 10555/10555/10555 -f 10557/10557/10557 10555/10555/10555 10554/10554/10554 -v -14711 -8514.01 322.2 -vt 0.534913 0.434048 -v -14771 -8514.01 382.2 -vt 0.534416 0.433223 -v -15716 -8514.01 322.2 -vt 0.5266 0.434048 -v -15656 -8514.01 382.2 -vt 0.527096 0.433223 -o mesh2098 -s off -f 10559/10559/10559 10560/10560/10560 10561/10561/10561 -f 10562/10562/10562 10561/10561/10561 10560/10560/10560 -g charts -o chart0000 -s off -f 10559/10559/10559 10560/10560/10560 10561/10561/10561 -f 10562/10562/10562 10561/10561/10561 10560/10560/10560 -v -14771 -8514.01 382.2 -vt 0.868246 0.238323 -v -14711 -8514.01 322.2 -vt 0.869077 0.23784 -v -14711 -8514.01 2167.2 -vt 0.869077 0.252679 -o mesh2099 -s off -f 10563/10563/10563 10564/10564/10564 10565/10565/10565 -g charts -o chart0000 -s off -f 10563/10563/10563 10564/10564/10564 10565/10565/10565 -v -14771 -8514.01 382.2 -vt 0.95054 0.593982 -v -14711 -8514.01 2167.2 -vt 0.95054 0.607997 -v -14771 -8514.01 2107.2 -vt 0.949709 0.60751 -o mesh2100 -s off -f 10566/10566/10566 10567/10567/10567 10568/10568/10568 -g charts -o chart0000 -s off -f 10566/10566/10566 10567/10567/10567 10568/10568/10568 -v -14771 -8514.01 2107.2 -vt 0.715798 0.680544 -v -14711 -8514.01 2167.2 -vt 0.715295 0.681368 -v -15656 -8514.01 2107.2 -vt 0.722776 0.681368 -o mesh2101 -s off -f 10569/10569/10569 10570/10570/10570 10571/10571/10571 -g charts -o chart0000 -s off -f 10569/10569/10569 10570/10570/10570 10571/10571/10571 -v -15716 -8514.01 322.2 -vt 0.687864 0.537922 -v -15656 -8514.01 382.2 -vt 0.687377 0.537098 -v -15716 -8514.01 2167.2 -vt 0.672901 0.537922 -o mesh2102 -s off -f 10572/10572/10572 10573/10573/10573 10574/10574/10574 -g charts -o chart0000 -s off -f 10572/10572/10572 10573/10573/10573 10574/10574/10574 -v -15716 -8514.01 2167.2 -vt 0.524938 0.529678 -v -15656 -8514.01 382.2 -vt 0.539069 0.529678 -v -15656 -8514.01 2107.2 -vt 0.525428 0.528854 -o mesh2103 -s off -f 10575/10575/10575 10576/10576/10576 10577/10577/10577 -g charts -o chart0000 -s off -f 10575/10575/10575 10576/10576/10576 10577/10577/10577 -v -15716 -8514.01 2167.2 -vt 0.869077 0.403545 -v -15656 -8514.01 2107.2 -vt 0.868581 0.402721 -v -14711 -8514.01 2167.2 -vt 0.860765 0.403545 -o mesh2104 -s off -f 10578/10578/10578 10579/10579/10579 10580/10580/10580 -g charts -o chart0000 -s off -f 10578/10578/10578 10579/10579/10579 10580/10580/10580 -v -15656 -8394.01 2107.2 -vt 0.65212 0.380462 -v -15226.6 -8439.01 2107.2 -vt 0.64849 0.38108 -v -15656 -8514.01 2107.2 -vt 0.65212 0.38211 -v -14771 -8394.01 2107.2 -vt 0.644638 0.380462 -v -15200.4 -8439.01 2107.2 -vt 0.648268 0.38108 -v -15200.4 -8469.01 2107.2 -vt 0.648268 0.381492 -v -15226.6 -8469.01 2107.2 -vt 0.64849 0.381492 -v -14771 -8514.01 2107.2 -vt 0.644638 0.38211 -o mesh2105 -s off -f 10581/10581/10581 10582/10582/10582 10583/10583/10583 -f 10582/10582/10582 10581/10581/10581 10584/10584/10584 -f 10582/10582/10582 10584/10584/10584 10585/10585/10585 -f 10585/10585/10585 10584/10584/10584 10586/10586/10586 -f 10583/10583/10583 10587/10587/10587 10588/10588/10588 -f 10587/10587/10587 10583/10583/10583 10582/10582/10582 -f 10588/10588/10588 10587/10587/10587 10586/10586/10586 -f 10588/10588/10588 10586/10586/10586 10584/10584/10584 -g charts -o chart0000 -s off -f 10581/10581/10581 10582/10582/10582 10583/10583/10583 -f 10582/10582/10582 10581/10581/10581 10584/10584/10584 -f 10582/10582/10582 10584/10584/10584 10585/10585/10585 -f 10585/10585/10585 10584/10584/10584 10586/10586/10586 -f 10583/10583/10583 10587/10587/10587 10588/10588/10588 -f 10587/10587/10587 10583/10583/10583 10582/10582/10582 -f 10588/10588/10588 10587/10587/10587 10586/10586/10586 -f 10588/10588/10588 10586/10586/10586 10584/10584/10584 -v -14771 -8514.01 2107.2 -vt 0.541563 0.55441 -v -14771 -8469.01 1254.82 -vt 0.53458 0.553792 -v -14771 -8514.01 382.2 -vt 0.527431 0.55441 -v -14771 -8394.01 2107.2 -vt 0.541563 0.552762 -v -14771 -8439.01 1254.82 -vt 0.53458 0.55338 -v -14771 -8439.01 1234.58 -vt 0.534414 0.55338 -v -14771 -8469.01 1234.58 -vt 0.534414 0.553792 -v -14771 -8394.01 382.2 -vt 0.527431 0.552762 -o mesh2106 -s off -f 10589/10589/10589 10590/10590/10590 10591/10591/10591 -f 10590/10590/10590 10589/10589/10589 10592/10592/10592 -f 10590/10590/10590 10592/10592/10592 10593/10593/10593 -f 10593/10593/10593 10592/10592/10592 10594/10594/10594 -f 10591/10591/10591 10595/10595/10595 10596/10596/10596 -f 10595/10595/10595 10591/10591/10591 10590/10590/10590 -f 10596/10596/10596 10595/10595/10595 10594/10594/10594 -f 10596/10596/10596 10594/10594/10594 10592/10592/10592 -g charts -o chart0000 -s off -f 10589/10589/10589 10590/10590/10590 10591/10591/10591 -f 10590/10590/10590 10589/10589/10589 10592/10592/10592 -f 10590/10590/10590 10592/10592/10592 10593/10593/10593 -f 10593/10593/10593 10592/10592/10592 10594/10594/10594 -f 10591/10591/10591 10595/10595/10595 10596/10596/10596 -f 10595/10595/10595 10591/10591/10591 10590/10590/10590 -f 10596/10596/10596 10595/10595/10595 10594/10594/10594 -f 10596/10596/10596 10594/10594/10594 10592/10592/10592 -v -15656 -8514.01 382.2 -vt 0.609726 0.78277 -v -15226.6 -8469.01 382.2 -vt 0.609102 0.77917 -v -15656 -8394.01 382.2 -vt 0.608063 0.78277 -v -14771 -8514.01 382.2 -vt 0.609726 0.77535 -v -15200.4 -8469.01 382.2 -vt 0.609102 0.77895 -v -15200.4 -8439.01 382.2 -vt 0.608687 0.77895 -v -15226.6 -8439.01 382.2 -vt 0.608687 0.77917 -v -14771 -8394.01 382.2 -vt 0.608063 0.77535 -o mesh2107 -s off -f 10597/10597/10597 10598/10598/10598 10599/10599/10599 -f 10598/10598/10598 10597/10597/10597 10600/10600/10600 -f 10598/10598/10598 10600/10600/10600 10601/10601/10601 -f 10601/10601/10601 10600/10600/10600 10602/10602/10602 -f 10599/10599/10599 10603/10603/10603 10604/10604/10604 -f 10603/10603/10603 10599/10599/10599 10598/10598/10598 -f 10604/10604/10604 10603/10603/10603 10602/10602/10602 -f 10604/10604/10604 10602/10602/10602 10600/10600/10600 -g charts -o chart0000 -s off -f 10597/10597/10597 10598/10598/10598 10599/10599/10599 -f 10598/10598/10598 10597/10597/10597 10600/10600/10600 -f 10598/10598/10598 10600/10600/10600 10601/10601/10601 -f 10601/10601/10601 10600/10600/10600 10602/10602/10602 -f 10599/10599/10599 10603/10603/10603 10604/10604/10604 -f 10603/10603/10603 10599/10599/10599 10598/10598/10598 -f 10604/10604/10604 10603/10603/10603 10602/10602/10602 -f 10604/10604/10604 10602/10602/10602 10600/10600/10600 -v -15656 -8394.01 382.2 -vt 0.913134 0.622836 -v -15656 -8394.01 2107.2 -vt 0.899002 0.622836 -v -15656 -8514.01 2107.2 -vt 0.899002 0.621187 -v -15656 -8514.01 382.2 -vt 0.913134 0.621187 -o mesh2108 -s off -f 10605/10605/10605 10606/10606/10606 10607/10607/10607 -f 10605/10605/10605 10607/10607/10607 10608/10608/10608 -g charts -o chart0000 -s off -f 10605/10605/10605 10606/10606/10606 10607/10607/10607 -f 10605/10605/10605 10607/10607/10607 10608/10608/10608 -v -15226.6 -8439.01 2107.2 -vt 0.87074 0.0820279 -v -15200.4 -8439.01 2107.2 -vt 0.869909 0.0820279 -v -15200.4 -8439.01 382.2 -vt 0.869909 0.0680132 -v -15226.6 -8439.01 382.2 -vt 0.87074 0.0680132 -o mesh2109 -s off -f 10609/10609/10609 10610/10610/10610 10611/10611/10611 -f 10609/10609/10609 10611/10611/10611 10612/10612/10612 -g charts -o chart0000 -s off -f 10609/10609/10609 10610/10610/10610 10611/10611/10611 -f 10609/10609/10609 10611/10611/10611 10612/10612/10612 -v -15200.4 -8439.01 2107.2 -vt 0.964672 0.280709 -v -15200.4 -8469.01 2107.2 -vt 0.96384 0.280709 -v -15200.4 -8469.01 382.2 -vt 0.96384 0.266694 -v -15200.4 -8439.01 382.2 -vt 0.964672 0.266694 -o mesh2110 -s off -f 10613/10613/10613 10614/10614/10614 10615/10615/10615 -f 10613/10613/10613 10615/10615/10615 10616/10616/10616 -g charts -o chart0000 -s off -f 10613/10613/10613 10614/10614/10614 10615/10615/10615 -f 10613/10613/10613 10615/10615/10615 10616/10616/10616 -v -15635.6 -8469.01 1254.82 -vt 0.988778 0.649217 -v -15635.6 -8439.01 1254.82 -vt 0.988778 0.648392 -v -15635.6 -8439.01 1234.58 -vt 0.987947 0.648392 -v -15635.6 -8469.01 1234.58 -vt 0.987947 0.649217 -o mesh2111 -s off -f 10617/10617/10617 10618/10618/10618 10619/10619/10619 -f 10617/10617/10617 10619/10619/10619 10620/10620/10620 -g charts -o chart0000 -s off -f 10617/10617/10617 10618/10618/10618 10619/10619/10619 -f 10617/10617/10617 10619/10619/10619 10620/10620/10620 -v -14771 -8469.01 1254.82 -vt 0.955528 0.0581203 -v -14771 -8439.01 1254.82 -vt 0.955528 0.057296 -v -15635.6 -8439.01 1254.82 -vt 0.948047 0.057296 -v -15635.6 -8469.01 1254.82 -vt 0.948047 0.0581203 -o mesh2112 -s off -f 10621/10621/10621 10622/10622/10622 10623/10623/10623 -f 10621/10621/10621 10623/10623/10623 10624/10624/10624 -g charts -o chart0000 -s off -f 10621/10621/10621 10622/10622/10622 10623/10623/10623 -f 10621/10621/10621 10623/10623/10623 10624/10624/10624 -v -14771 -8439.01 1254.82 -vt 0.869908 0.220528 -v -14771 -8439.01 1234.58 -vt 0.869077 0.220528 -v -15635.6 -8439.01 1234.58 -vt 0.869077 0.213108 -v -15635.6 -8439.01 1254.82 -vt 0.869908 0.213108 -o mesh2113 -s off -f 10625/10625/10625 10626/10626/10626 10627/10627/10627 -f 10625/10625/10625 10627/10627/10627 10628/10628/10628 -g charts -o chart0000 -s off -f 10625/10625/10625 10626/10626/10626 10627/10627/10627 -f 10625/10625/10625 10627/10627/10627 10628/10628/10628 -v -14771 -8439.01 1234.58 -vt 0.899834 0.24526 -v -14771 -8469.01 1234.58 -vt 0.899834 0.244435 -v -15635.6 -8469.01 1234.58 -vt 0.892352 0.244435 -v -15635.6 -8439.01 1234.58 -vt 0.892352 0.24526 -o mesh2114 -s off -f 10629/10629/10629 10630/10630/10630 10631/10631/10631 -f 10629/10629/10629 10631/10631/10631 10632/10632/10632 -g charts -o chart0000 -s off -f 10629/10629/10629 10630/10630/10630 10631/10631/10631 -f 10629/10629/10629 10631/10631/10631 10632/10632/10632 -v -14771 -8469.01 1234.58 -vt 0.582294 0.436521 -v -14771 -8469.01 1254.82 -vt 0.582294 0.435697 -v -15635.6 -8469.01 1254.82 -vt 0.574813 0.435697 -v -15635.6 -8469.01 1234.58 -vt 0.574813 0.436521 -o mesh2115 -s off -f 10633/10633/10633 10634/10634/10634 10635/10635/10635 -f 10633/10633/10633 10635/10635/10635 10636/10636/10636 -g charts -o chart0000 -s off -f 10633/10633/10633 10634/10634/10634 10635/10635/10635 -f 10633/10633/10633 10635/10635/10635 10636/10636/10636 -v -15226.6 -8469.01 2107.2 -vt 0.600582 0.529678 -v -15226.6 -8439.01 2107.2 -vt 0.600582 0.528854 -v -15226.6 -8439.01 382.2 -vt 0.586451 0.528854 -v -15226.6 -8469.01 382.2 -vt 0.586451 0.529678 -o mesh2116 -s off -f 10637/10637/10637 10638/10638/10638 10639/10639/10639 -f 10637/10637/10637 10639/10639/10639 10640/10640/10640 -g charts -o chart0000 -s off -f 10637/10637/10637 10638/10638/10638 10639/10639/10639 -f 10637/10637/10637 10639/10639/10639 10640/10640/10640 -v -15200.4 -8469.01 2107.2 -vt 0.967165 0.424155 -v -15226.6 -8469.01 2107.2 -vt 0.967165 0.423331 -v -15226.6 -8469.01 382.2 -vt 0.953034 0.423331 -v -15200.4 -8469.01 382.2 -vt 0.953034 0.424155 -o mesh2117 -s off -f 10641/10641/10641 10642/10642/10642 10643/10643/10643 -f 10641/10641/10641 10643/10643/10643 10644/10644/10644 -g charts -o chart0000 -s off -f 10641/10641/10641 10642/10642/10642 10643/10643/10643 -f 10641/10641/10641 10643/10643/10643 10644/10644/10644 -v -10353.5 -8394.01 284.7 -vt 0.0818786 0.998763 -v -10316 -8394.01 322.2 -vt 0.0821961 0.999588 -v -9273.5 -8394.01 284.7 -vt 0.0910224 0.998763 -v -9311 -8394.01 322.2 -vt 0.0907049 0.999588 -o mesh2118 -s off -f 10645/10645/10645 10646/10646/10646 10647/10647/10647 -f 10648/10648/10648 10647/10647/10647 10646/10646/10646 -g charts -o chart0000 -s off -f 10645/10645/10645 10646/10646/10646 10647/10647/10647 -f 10648/10648/10648 10647/10647/10647 10646/10646/10646 -v -10316 -8394.01 322.2 -vt 0.201888 0.660758 -v -10353.5 -8394.01 284.7 -vt 0.201579 0.661583 -v -10353.5 -8394.01 2204.7 -vt 0.217373 0.661583 -o mesh2119 -s off -f 10649/10649/10649 10650/10650/10650 10651/10651/10651 -g charts -o chart0000 -s off -f 10649/10649/10649 10650/10650/10650 10651/10651/10651 -v -10316 -8394.01 322.2 -vt 0.962178 0.560181 -v -10353.5 -8394.01 2204.7 -vt 0.962178 0.57502 -v -10316 -8394.01 2167.2 -vt 0.961347 0.574719 -o mesh2120 -s off -f 10652/10652/10652 10653/10653/10653 10654/10654/10654 -g charts -o chart0000 -s off -f 10652/10652/10652 10653/10653/10653 10654/10654/10654 -v -10316 -8394.01 2167.2 -vt 0.734723 0.674773 -v -10353.5 -8394.01 2204.7 -vt 0.734414 0.675598 -v -9311 -8394.01 2167.2 -vt 0.742726 0.675598 -o mesh2121 -s off -f 10655/10655/10655 10656/10656/10656 10657/10657/10657 -g charts -o chart0000 -s off -f 10655/10655/10655 10656/10656/10656 10657/10657/10657 -v -9273.5 -8394.01 284.7 -vt 0.743558 0.715169 -v -9311 -8394.01 322.2 -vt 0.743249 0.714345 -v -9273.5 -8394.01 2204.7 -vt 0.727764 0.715169 -o mesh2122 -s off -f 10658/10658/10658 10659/10659/10659 10660/10660/10660 -g charts -o chart0000 -s off -f 10658/10658/10658 10659/10659/10659 10660/10660/10660 -v -9273.5 -8394.01 2204.7 -vt 0.0477971 0.473619 -v -9311 -8394.01 322.2 -vt 0.0477971 0.488458 -v -9311 -8394.01 2167.2 -vt 0.0469659 0.473921 -o mesh2123 -s off -f 10661/10661/10661 10662/10662/10662 10663/10663/10663 -g charts -o chart0000 -s off -f 10661/10661/10661 10662/10662/10662 10663/10663/10663 -v -9273.5 -8394.01 2204.7 -vt 0.941396 0.312861 -v -9311 -8394.01 2167.2 -vt 0.941079 0.312036 -v -10353.5 -8394.01 2204.7 -vt 0.932253 0.312861 -o mesh2124 -s off -f 10664/10664/10664 10665/10665/10665 10666/10666/10666 -g charts -o chart0000 -s off -f 10664/10664/10664 10665/10665/10665 10666/10666/10666 -v -9273.5 -8559.01 284.7 -vt 0.844971 0.6723 -v -9311 -8559.01 322.2 -vt 0.844653 0.671476 -v -10353.5 -8559.01 284.7 -vt 0.835827 0.6723 -v -10316 -8559.01 322.2 -vt 0.836145 0.671476 -o mesh2125 -s off -f 10667/10667/10667 10668/10668/10668 10669/10669/10669 -f 10670/10670/10670 10669/10669/10669 10668/10668/10668 -g charts -o chart0000 -s off -f 10667/10667/10667 10668/10668/10668 10669/10669/10669 -f 10670/10670/10670 10669/10669/10669 10668/10668/10668 -v -9311 -8559.01 322.2 -vt 0.657107 0.607478 -v -9273.5 -8559.01 284.7 -vt 0.657938 0.607172 -v -9273.5 -8559.01 2204.7 -vt 0.657938 0.622836 -o mesh2126 -s off -f 10671/10671/10671 10672/10672/10672 10673/10673/10673 -g charts -o chart0000 -s off -f 10671/10671/10671 10672/10672/10672 10673/10673/10673 -v -9311 -8559.01 322.2 -vt 0.994597 0.801731 -v -9273.5 -8559.01 2204.7 -vt 0.994597 0.81657 -v -9311 -8559.01 2167.2 -vt 0.993766 0.816269 -o mesh2127 -s off -f 10674/10674/10674 10675/10675/10675 10676/10676/10676 -g charts -o chart0000 -s off -f 10674/10674/10674 10675/10675/10675 10676/10676/10676 -v -9311 -8559.01 2167.2 -vt 0.331565 0.41014 -v -9273.5 -8559.01 2204.7 -vt 0.331255 0.410964 -v -10316 -8559.01 2167.2 -vt 0.339568 0.410964 -o mesh2128 -s off -f 10677/10677/10677 10678/10678/10678 10679/10679/10679 -g charts -o chart0000 -s off -f 10677/10677/10677 10678/10678/10678 10679/10679/10679 -v -10353.5 -8559.01 284.7 -vt 0.595594 0.99629 -v -10316 -8559.01 322.2 -vt 0.595286 0.995466 -v -10353.5 -8559.01 2204.7 -vt 0.5798 0.99629 -o mesh2129 -s off -f 10680/10680/10680 10681/10681/10681 10682/10682/10682 -g charts -o chart0000 -s off -f 10680/10680/10680 10681/10681/10681 10682/10682/10682 -v -10353.5 -8559.01 2204.7 -vt 0.657107 0.998763 -v -10316 -8559.01 322.2 -vt 0.67207 0.998763 -v -10316 -8559.01 2167.2 -vt 0.657411 0.997939 -o mesh2130 -s off -f 10683/10683/10683 10684/10684/10684 10685/10685/10685 -g charts -o chart0000 -s off -f 10683/10683/10683 10684/10684/10684 10685/10685/10685 -v -10353.5 -8559.01 2204.7 -vt 0.646301 0.981451 -v -10316 -8559.01 2167.2 -vt 0.64547 0.981136 -v -9273.5 -8559.01 2204.7 -vt 0.646301 0.972383 -o mesh2131 -s off -f 10686/10686/10686 10687/10687/10687 10688/10688/10688 -g charts -o chart0000 -s off -f 10686/10686/10686 10687/10687/10687 10688/10688/10688 -v -9273.5 -8394.01 2204.7 -vt 0.782627 0.393652 -v -10353.5 -8394.01 2204.7 -vt 0.782627 0.40272 -v -10353.5 -8559.01 2204.7 -vt 0.784289 0.40272 -v -9273.5 -8559.01 2204.7 -vt 0.784289 0.393652 -o mesh2132 -s off -f 10689/10689/10689 10690/10690/10690 10691/10691/10691 -f 10689/10689/10689 10691/10691/10691 10692/10692/10692 -g charts -o chart0000 -s off -f 10689/10689/10689 10690/10690/10690 10691/10691/10691 -f 10689/10689/10689 10691/10691/10691 10692/10692/10692 -v -10353.5 -8394.01 2204.7 -vt 0.24148 0.961665 -v -10353.5 -8394.01 284.7 -vt 0.257273 0.961665 -v -10353.5 -8559.01 284.7 -vt 0.257273 0.963314 -v -10353.5 -8559.01 2204.7 -vt 0.24148 0.963314 -o mesh2133 -s off -f 10693/10693/10693 10694/10694/10694 10695/10695/10695 -f 10693/10693/10693 10695/10695/10695 10696/10696/10696 -g charts -o chart0000 -s off -f 10693/10693/10693 10694/10694/10694 10695/10695/10695 -f 10693/10693/10693 10695/10695/10695 10696/10696/10696 -v -10353.5 -8394.01 284.7 -vt 0.195761 0.942704 -v -9273.5 -8394.01 284.7 -vt 0.195761 0.933636 -v -9273.5 -8559.01 284.7 -vt 0.194098 0.933636 -v -10353.5 -8559.01 284.7 -vt 0.194098 0.942704 -o mesh2134 -s off -f 10697/10697/10697 10698/10698/10698 10699/10699/10699 -f 10697/10697/10697 10699/10699/10699 10700/10700/10700 -g charts -o chart0000 -s off -f 10697/10697/10697 10698/10698/10698 10699/10699/10699 -f 10697/10697/10697 10699/10699/10699 10700/10700/10700 -v -9273.5 -8394.01 284.7 -vt 0.0236907 0.908079 -v -9273.5 -8394.01 2204.7 -vt 0.0236907 0.892416 -v -9273.5 -8559.01 2204.7 -vt 0.0220283 0.892416 -v -9273.5 -8559.01 284.7 -vt 0.0220283 0.908079 -o mesh2135 -s off -f 10701/10701/10701 10702/10702/10702 10703/10703/10703 -f 10701/10701/10701 10703/10703/10703 10704/10704/10704 -g charts -o chart0000 -s off -f 10701/10701/10701 10702/10702/10702 10703/10703/10703 -f 10701/10701/10701 10703/10703/10703 10704/10704/10704 -v -9311 -8559.01 322.2 -vt 0.783458 0.194971 -v -9311 -8514.01 322.2 -vt 0.783005 0.194971 -v -10316 -8514.01 322.2 -vt 0.783005 0.186727 -v -10316 -8559.01 322.2 -vt 0.783458 0.186727 -v -9311 -8394.01 322.2 -vt 0.781796 0.194971 -v -10316 -8394.01 322.2 -vt 0.781796 0.186727 -o mesh2136 -s off -f 10705/10705/10705 10706/10706/10706 10707/10707/10707 -f 10705/10705/10705 10707/10707/10707 10708/10708/10708 -f 10709/10709/10709 10710/10710/10710 10707/10707/10707 -f 10709/10709/10709 10707/10707/10707 10706/10706/10706 -g charts -o chart0000 -s off -f 10705/10705/10705 10706/10706/10706 10707/10707/10707 -f 10705/10705/10705 10707/10707/10707 10708/10708/10708 -f 10709/10709/10709 10710/10710/10710 10707/10707/10707 -f 10709/10709/10709 10707/10707/10707 10706/10706/10706 -v -10316 -8559.01 322.2 -vt 0.797589 0.669827 -v -10316 -8514.01 322.2 -vt 0.797589 0.670277 -v -10316 -8514.01 2167.2 -vt 0.782627 0.670277 -v -10316 -8559.01 2167.2 -vt 0.782627 0.669827 -v -10316 -8394.01 322.2 -vt 0.797589 0.671476 -v -10316 -8394.01 2167.2 -vt 0.782627 0.671476 -o mesh2137 -s off -f 10711/10711/10711 10712/10712/10712 10713/10713/10713 -f 10711/10711/10711 10713/10713/10713 10714/10714/10714 -f 10715/10715/10715 10716/10716/10716 10713/10713/10713 -f 10715/10715/10715 10713/10713/10713 10712/10712/10712 -g charts -o chart0000 -s off -f 10711/10711/10711 10712/10712/10712 10713/10713/10713 -f 10711/10711/10711 10713/10713/10713 10714/10714/10714 -f 10715/10715/10715 10716/10716/10716 10713/10713/10713 -f 10715/10715/10715 10713/10713/10713 10712/10712/10712 -v -10316 -8559.01 2167.2 -vt 0.838321 0.985573 -v -10316 -8514.01 2167.2 -vt 0.838321 0.986023 -v -9311 -8514.01 2167.2 -vt 0.830008 0.986023 -v -9311 -8559.01 2167.2 -vt 0.830008 0.985573 -v -10316 -8394.01 2167.2 -vt 0.838321 0.987222 -v -9311 -8394.01 2167.2 -vt 0.830008 0.987222 -o mesh2138 -s off -f 10717/10717/10717 10718/10718/10718 10719/10719/10719 -f 10717/10717/10717 10719/10719/10719 10720/10720/10720 -f 10721/10721/10721 10722/10722/10722 10719/10719/10719 -f 10721/10721/10721 10719/10719/10719 10718/10718/10718 -g charts -o chart0000 -s off -f 10717/10717/10717 10718/10718/10718 10719/10719/10719 -f 10717/10717/10717 10719/10719/10719 10720/10720/10720 -f 10721/10721/10721 10722/10722/10722 10719/10719/10719 -f 10721/10721/10721 10719/10719/10719 10718/10718/10718 -v -9311 -8559.01 2167.2 -vt 0.150873 0.547815 -v -9311 -8514.01 2167.2 -vt 0.150873 0.547366 -v -9311 -8514.01 322.2 -vt 0.13591 0.547366 -v -9311 -8559.01 322.2 -vt 0.13591 0.547815 -v -9311 -8394.01 2167.2 -vt 0.150873 0.546167 -v -9311 -8394.01 322.2 -vt 0.13591 0.546167 -o mesh2139 -s off -f 10723/10723/10723 10724/10724/10724 10725/10725/10725 -f 10723/10723/10723 10725/10725/10725 10726/10726/10726 -f 10727/10727/10727 10728/10728/10728 10725/10725/10725 -f 10727/10727/10727 10725/10725/10725 10724/10724/10724 -g charts -o chart0000 -s off -f 10723/10723/10723 10724/10724/10724 10725/10725/10725 -f 10723/10723/10723 10725/10725/10725 10726/10726/10726 -f 10727/10727/10727 10728/10728/10728 10725/10725/10725 -f 10727/10727/10727 10725/10725/10725 10724/10724/10724 -v -9311 -8514.01 322.2 -vt 0.609726 0.886645 -v -9371 -8514.01 382.2 -vt 0.609229 0.88582 -v -10316 -8514.01 322.2 -vt 0.601413 0.886645 -v -10256 -8514.01 382.2 -vt 0.601909 0.88582 -o mesh2140 -s off -f 10729/10729/10729 10730/10730/10730 10731/10731/10731 -f 10732/10732/10732 10731/10731/10731 10730/10730/10730 -g charts -o chart0000 -s off -f 10729/10729/10729 10730/10730/10730 10731/10731/10731 -f 10732/10732/10732 10731/10731/10731 10730/10730/10730 -v -9371 -8514.01 382.2 -vt 0.937727 0.935284 -v -9311 -8514.01 322.2 -vt 0.93724 0.936109 -v -9311 -8514.01 2167.2 -vt 0.952203 0.936109 -o mesh2141 -s off -f 10733/10733/10733 10734/10734/10734 10735/10735/10735 -g charts -o chart0000 -s off -f 10733/10733/10733 10734/10734/10734 10735/10735/10735 -v -9371 -8514.01 382.2 -vt 0.157523 0.81657 -v -9311 -8514.01 2167.2 -vt 0.157523 0.830585 -v -9371 -8514.01 2107.2 -vt 0.156692 0.830099 -o mesh2142 -s off -f 10736/10736/10736 10737/10737/10737 10738/10738/10738 -g charts -o chart0000 -s off -f 10736/10736/10736 10737/10737/10737 10738/10738/10738 -v -9371 -8514.01 2107.2 -vt 0.12261 0.773376 -v -9311 -8514.01 2167.2 -vt 0.123441 0.772877 -v -10256 -8514.01 2107.2 -vt 0.123441 0.780297 -o mesh2143 -s off -f 10739/10739/10739 10740/10740/10740 10741/10741/10741 -g charts -o chart0000 -s off -f 10739/10739/10739 10740/10740/10740 10741/10741/10741 -v -10316 -8514.01 322.2 -vt 0.618869 0.995466 -v -10256 -8514.01 382.2 -vt 0.618383 0.994641 -v -10316 -8514.01 2167.2 -vt 0.603907 0.995466 -o mesh2144 -s off -f 10742/10742/10742 10743/10743/10743 10744/10744/10744 -g charts -o chart0000 -s off -f 10742/10742/10742 10743/10743/10743 10744/10744/10744 -v -10316 -8514.01 2167.2 -vt 0.4734 0.3277 -v -10256 -8514.01 382.2 -vt 0.487531 0.3277 -v -10256 -8514.01 2107.2 -vt 0.47389 0.326876 -o mesh2145 -s off -f 10745/10745/10745 10746/10746/10746 10747/10747/10747 -g charts -o chart0000 -s off -f 10745/10745/10745 10746/10746/10746 10747/10747/10747 -v -10316 -8514.01 2167.2 -vt 0.887365 0.621187 -v -10256 -8514.01 2107.2 -vt 0.886869 0.620363 -v -9311 -8514.01 2167.2 -vt 0.879052 0.621187 -o mesh2146 -s off -f 10748/10748/10748 10749/10749/10749 10750/10750/10750 -g charts -o chart0000 -s off -f 10748/10748/10748 10749/10749/10749 10750/10750/10750 -v -10256 -8394.01 2107.2 -vt 0.996259 0.940231 -v -9826.62 -8439.01 2107.2 -vt 0.996883 0.936631 -v -10256 -8514.01 2107.2 -vt 0.997922 0.940231 -v -9371 -8394.01 2107.2 -vt 0.996259 0.932811 -v -9800.37 -8439.01 2107.2 -vt 0.996883 0.936411 -v -9800.37 -8469.01 2107.2 -vt 0.997298 0.936411 -v -9826.62 -8469.01 2107.2 -vt 0.997298 0.936631 -v -9371 -8514.01 2107.2 -vt 0.997922 0.932811 -o mesh2147 -s off -f 10751/10751/10751 10752/10752/10752 10753/10753/10753 -f 10752/10752/10752 10751/10751/10751 10754/10754/10754 -f 10752/10752/10752 10754/10754/10754 10755/10755/10755 -f 10755/10755/10755 10754/10754/10754 10756/10756/10756 -f 10753/10753/10753 10757/10757/10757 10758/10758/10758 -f 10757/10757/10757 10753/10753/10753 10752/10752/10752 -f 10758/10758/10758 10757/10757/10757 10756/10756/10756 -f 10758/10758/10758 10756/10756/10756 10754/10754/10754 -g charts -o chart0000 -s off -f 10751/10751/10751 10752/10752/10752 10753/10753/10753 -f 10752/10752/10752 10751/10751/10751 10754/10754/10754 -f 10752/10752/10752 10754/10754/10754 10755/10755/10755 -f 10755/10755/10755 10754/10754/10754 10756/10756/10756 -f 10753/10753/10753 10757/10757/10757 10758/10758/10758 -f 10757/10757/10757 10753/10753/10753 10752/10752/10752 -f 10758/10758/10758 10757/10757/10757 10756/10756/10756 -f 10758/10758/10758 10756/10756/10756 10754/10754/10754 -v -9371 -8514.01 2107.2 -vt 0.455943 0.496702 -v -9371 -8469.01 1254.82 -vt 0.45532 0.489777 -v -9371 -8514.01 382.2 -vt 0.455943 0.482688 -v -9371 -8394.01 2107.2 -vt 0.454281 0.496702 -v -9371 -8439.01 1254.82 -vt 0.454904 0.489777 -v -9371 -8439.01 1234.58 -vt 0.454904 0.489613 -v -9371 -8469.01 1234.58 -vt 0.45532 0.489613 -v -9371 -8394.01 382.2 -vt 0.454281 0.482688 -o mesh2148 -s off -f 10759/10759/10759 10760/10760/10760 10761/10761/10761 -f 10760/10760/10760 10759/10759/10759 10762/10762/10762 -f 10760/10760/10760 10762/10762/10762 10763/10763/10763 -f 10763/10763/10763 10762/10762/10762 10764/10764/10764 -f 10761/10761/10761 10765/10765/10765 10766/10766/10766 -f 10765/10765/10765 10761/10761/10761 10760/10760/10760 -f 10766/10766/10766 10765/10765/10765 10764/10764/10764 -f 10766/10766/10766 10764/10764/10764 10762/10762/10762 -g charts -o chart0000 -s off -f 10759/10759/10759 10760/10760/10760 10761/10761/10761 -f 10760/10760/10760 10759/10759/10759 10762/10762/10762 -f 10760/10760/10760 10762/10762/10762 10763/10763/10763 -f 10763/10763/10763 10762/10762/10762 10764/10764/10764 -f 10761/10761/10761 10765/10765/10765 10766/10766/10766 -f 10765/10765/10765 10761/10761/10761 10760/10760/10760 -f 10766/10766/10766 10765/10765/10765 10764/10764/10764 -f 10766/10766/10766 10764/10764/10764 10762/10762/10762 -v -10256 -8514.01 382.2 -vt 0.165004 0.585738 -v -9826.62 -8469.01 382.2 -vt 0.164381 0.582138 -v -10256 -8394.01 382.2 -vt 0.163342 0.585738 -v -9371 -8514.01 382.2 -vt 0.165004 0.578318 -v -9800.37 -8469.01 382.2 -vt 0.164381 0.581918 -v -9800.37 -8439.01 382.2 -vt 0.163965 0.581918 -v -9826.62 -8439.01 382.2 -vt 0.163965 0.582138 -v -9371 -8394.01 382.2 -vt 0.163342 0.578318 -o mesh2149 -s off -f 10767/10767/10767 10768/10768/10768 10769/10769/10769 -f 10768/10768/10768 10767/10767/10767 10770/10770/10770 -f 10768/10768/10768 10770/10770/10770 10771/10771/10771 -f 10771/10771/10771 10770/10770/10770 10772/10772/10772 -f 10769/10769/10769 10773/10773/10773 10774/10774/10774 -f 10773/10773/10773 10769/10769/10769 10768/10768/10768 -f 10774/10774/10774 10773/10773/10773 10772/10772/10772 -f 10774/10774/10774 10772/10772/10772 10770/10770/10770 -g charts -o chart0000 -s off -f 10767/10767/10767 10768/10768/10768 10769/10769/10769 -f 10768/10768/10768 10767/10767/10767 10770/10770/10770 -f 10768/10768/10768 10770/10770/10770 10771/10771/10771 -f 10771/10771/10771 10770/10770/10770 10772/10772/10772 -f 10769/10769/10769 10773/10773/10773 10774/10774/10774 -f 10773/10773/10773 10769/10769/10769 10768/10768/10768 -f 10774/10774/10774 10773/10773/10773 10772/10772/10772 -f 10774/10774/10774 10772/10772/10772 10770/10770/10770 -v -10256 -8394.01 382.2 -vt 0.131754 0.97568 -v -10256 -8394.01 2107.2 -vt 0.131754 0.961665 -v -10256 -8514.01 2107.2 -vt 0.130091 0.961665 -v -10256 -8514.01 382.2 -vt 0.130091 0.97568 -o mesh2150 -s off -f 10775/10775/10775 10776/10776/10776 10777/10777/10777 -f 10775/10775/10775 10777/10777/10777 10778/10778/10778 -g charts -o chart0000 -s off -f 10775/10775/10775 10776/10776/10776 10777/10777/10777 -f 10775/10775/10775 10777/10777/10777 10778/10778/10778 -v -9826.62 -8439.01 2107.2 -vt 0.624688 0.801731 -v -9800.37 -8439.01 2107.2 -vt 0.623857 0.801731 -v -9800.37 -8439.01 382.2 -vt 0.623857 0.787716 -v -9826.62 -8439.01 382.2 -vt 0.624688 0.787716 -o mesh2151 -s off -f 10779/10779/10779 10780/10780/10780 10781/10781/10781 -f 10779/10779/10779 10781/10781/10781 10782/10782/10782 -g charts -o chart0000 -s off -f 10779/10779/10779 10780/10780/10780 10781/10781/10781 -f 10779/10779/10779 10781/10781/10781 10782/10782/10782 -v -9800.37 -8439.01 2107.2 -vt 0.79177 0.667354 -v -9800.37 -8469.01 2107.2 -vt 0.79177 0.666529 -v -9800.37 -8469.01 382.2 -vt 0.777639 0.666529 -v -9800.37 -8439.01 382.2 -vt 0.777639 0.667354 -o mesh2152 -s off -f 10783/10783/10783 10784/10784/10784 10785/10785/10785 -f 10783/10783/10783 10785/10785/10785 10786/10786/10786 -g charts -o chart0000 -s off -f 10783/10783/10783 10784/10784/10784 10785/10785/10785 -f 10783/10783/10783 10785/10785/10785 10786/10786/10786 -v -10235.6 -8469.01 1254.82 -vt 0.800083 0.974031 -v -10235.6 -8439.01 1254.82 -vt 0.800083 0.973207 -v -10235.6 -8439.01 1234.58 -vt 0.799252 0.973207 -v -10235.6 -8469.01 1234.58 -vt 0.799252 0.974031 -o mesh2153 -s off -f 10787/10787/10787 10788/10788/10788 10789/10789/10789 -f 10787/10787/10787 10789/10789/10789 10790/10790/10790 -g charts -o chart0000 -s off -f 10787/10787/10787 10788/10788/10788 10789/10789/10789 -f 10787/10787/10787 10789/10789/10789 10790/10790/10790 -v -9371 -8469.01 1254.82 -vt 0.604738 0.349134 -v -9371 -8439.01 1254.82 -vt 0.604738 0.34831 -v -10235.6 -8439.01 1254.82 -vt 0.597257 0.34831 -v -10235.6 -8469.01 1254.82 -vt 0.597257 0.349134 -o mesh2154 -s off -f 10791/10791/10791 10792/10792/10792 10793/10793/10793 -f 10791/10791/10791 10793/10793/10793 10794/10794/10794 -g charts -o chart0000 -s off -f 10791/10791/10791 10792/10792/10792 10793/10793/10793 -f 10791/10791/10791 10793/10793/10793 10794/10794/10794 -v -9371 -8439.01 1254.82 -vt 0.708645 0.683842 -v -9371 -8439.01 1234.58 -vt 0.708645 0.683017 -v -10235.6 -8439.01 1234.58 -vt 0.701164 0.683017 -v -10235.6 -8439.01 1254.82 -vt 0.701164 0.683842 -o mesh2155 -s off -f 10795/10795/10795 10796/10796/10796 10797/10797/10797 -f 10795/10795/10795 10797/10797/10797 10798/10798/10798 -g charts -o chart0000 -s off -f 10795/10795/10795 10796/10796/10796 10797/10797/10797 -f 10795/10795/10795 10797/10797/10797 10798/10798/10798 -v -9371 -8439.01 1234.58 -vt 0.066916 0.640973 -v -9371 -8469.01 1234.58 -vt 0.066916 0.640148 -v -10235.6 -8469.01 1234.58 -vt 0.0594347 0.640148 -v -10235.6 -8439.01 1234.58 -vt 0.0594347 0.640973 -o mesh2156 -s off -f 10799/10799/10799 10800/10800/10800 10801/10801/10801 -f 10799/10799/10799 10801/10801/10801 10802/10802/10802 -g charts -o chart0000 -s off -f 10799/10799/10799 10800/10800/10800 10801/10801/10801 -f 10799/10799/10799 10801/10801/10801 10802/10802/10802 -v -9371 -8469.01 1234.58 -vt 0.852452 0.0746083 -v -9371 -8469.01 1254.82 -vt 0.852452 0.073784 -v -10235.6 -8469.01 1254.82 -vt 0.844971 0.073784 -v -10235.6 -8469.01 1234.58 -vt 0.844971 0.0746083 -o mesh2157 -s off -f 10803/10803/10803 10804/10804/10804 10805/10805/10805 -f 10803/10803/10803 10805/10805/10805 10806/10806/10806 -g charts -o chart0000 -s off -f 10803/10803/10803 10804/10804/10804 10805/10805/10805 -f 10803/10803/10803 10805/10805/10805 10806/10806/10806 -v -9826.62 -8469.01 2107.2 -vt 0.0245219 0.25845 -v -9826.62 -8439.01 2107.2 -vt 0.0236908 0.25845 -v -9826.62 -8439.01 382.2 -vt 0.0236908 0.244435 -v -9826.62 -8469.01 382.2 -vt 0.0245219 0.244435 -o mesh2158 -s off -f 10807/10807/10807 10808/10808/10808 10809/10809/10809 -f 10807/10807/10807 10809/10809/10809 10810/10810/10810 -g charts -o chart0000 -s off -f 10807/10807/10807 10808/10808/10808 10809/10809/10809 -f 10807/10807/10807 10809/10809/10809 10810/10810/10810 -v -9800.37 -8469.01 2107.2 -vt 0.878221 0.863561 -v -9826.62 -8469.01 2107.2 -vt 0.87739 0.863561 -v -9826.62 -8469.01 382.2 -vt 0.87739 0.849547 -v -9800.37 -8469.01 382.2 -vt 0.878221 0.849547 -o mesh2159 -s off -f 10811/10811/10811 10812/10812/10812 10813/10813/10813 -f 10811/10811/10811 10813/10813/10813 10814/10814/10814 -g charts -o chart0000 -s off -f 10811/10811/10811 10812/10812/10812 10813/10813/10813 -f 10811/10811/10811 10813/10813/10813 10814/10814/10814 -v 19031.5 10461 1217.32 -vt 0.278055 0.484336 -v 19031.5 10461 1207.2 -vt 0.278471 0.484336 -v 19061.5 10461 1207.2 -vt 0.278471 0.485161 -v 19061.5 10461 1217.32 -vt 0.278055 0.485161 -v 19061.5 10461 1197.08 -vt 0.278886 0.485161 -v 19031.5 10461 1197.08 -vt 0.278886 0.484336 -o mesh2160 -s off -f 10815/10815/10815 10816/10816/10816 10817/10817/10817 -f 10815/10815/10815 10817/10817/10817 10818/10818/10818 -f 10819/10819/10819 10817/10817/10817 10816/10816/10816 -f 10819/10819/10819 10816/10816/10816 10820/10820/10820 -g charts -o chart0000 -s off -f 10815/10815/10815 10816/10816/10816 10817/10817/10817 -f 10815/10815/10815 10817/10817/10817 10818/10818/10818 -f 10819/10819/10819 10817/10817/10817 10816/10816/10816 -f 10819/10819/10819 10816/10816/10816 10820/10820/10820 -v 19031.5 12711 1217.32 -vt 0.948047 0.56183 -v 19031.5 12711 1207.2 -vt 0.948462 0.56183 -v 19061.5 12711 1207.2 -vt 0.948462 0.562654 -v 19061.5 12711 1217.32 -vt 0.948047 0.562654 -v 19061.5 12711 1197.08 -vt 0.948878 0.562654 -v 19031.5 12711 1197.08 -vt 0.948878 0.56183 -o mesh2161 -s off -f 10821/10821/10821 10822/10822/10822 10823/10823/10823 -f 10821/10821/10821 10823/10823/10823 10824/10824/10824 -f 10825/10825/10825 10823/10823/10823 10822/10822/10822 -f 10825/10825/10825 10822/10822/10822 10826/10826/10826 -g charts -o chart0000 -s off -f 10821/10821/10821 10822/10822/10822 10823/10823/10823 -f 10821/10821/10821 10823/10823/10823 10824/10824/10824 -f 10825/10825/10825 10823/10823/10823 10822/10822/10822 -f 10825/10825/10825 10822/10822/10822 10826/10826/10826 -v 19031.5 11586 1217.32 -vt 0.898171 0.914674 -v 19031.5 11586 1207.2 -vt 0.898171 0.915087 -v 19061.5 11586 1207.2 -vt 0.899002 0.915087 -v 19061.5 11586 1217.32 -vt 0.899002 0.914674 -v 19061.5 11586 1197.08 -vt 0.899002 0.915499 -v 19031.5 11586 1197.08 -vt 0.898171 0.915499 -o mesh2162 -s off -f 10827/10827/10827 10828/10828/10828 10829/10829/10829 -f 10827/10827/10827 10829/10829/10829 10830/10830/10830 -f 10831/10831/10831 10829/10829/10829 10828/10828/10828 -f 10831/10831/10831 10828/10828/10828 10832/10832/10832 -g charts -o chart0000 -s off -f 10827/10827/10827 10828/10828/10828 10829/10829/10829 -f 10827/10827/10827 10829/10829/10829 10830/10830/10830 -f 10831/10831/10831 10829/10829/10829 10828/10828/10828 -f 10831/10831/10831 10828/10828/10828 10832/10832/10832 -v 19031.5 10461 4817.32 -vt 0.979634 0.124073 -v 19031.5 10461 4807.2 -vt 0.979634 0.124485 -v 19061.5 10461 4807.2 -vt 0.980465 0.124485 -v 19061.5 10461 4817.32 -vt 0.980465 0.124073 -v 19061.5 10461 4797.08 -vt 0.980465 0.124897 -v 19031.5 10461 4797.08 -vt 0.979634 0.124897 -o mesh2163 -s off -f 10833/10833/10833 10834/10834/10834 10835/10835/10835 -f 10833/10833/10833 10835/10835/10835 10836/10836/10836 -f 10837/10837/10837 10835/10835/10835 10834/10834/10834 -f 10837/10837/10837 10834/10834/10834 10838/10838/10838 -g charts -o chart0000 -s off -f 10833/10833/10833 10834/10834/10834 10835/10835/10835 -f 10833/10833/10833 10835/10835/10835 10836/10836/10836 -f 10837/10837/10837 10835/10835/10835 10834/10834/10834 -f 10837/10837/10837 10834/10834/10834 10838/10838/10838 -v 19031.5 12711 4817.32 -vt 0.275561 0.411789 -v 19031.5 12711 4807.2 -vt 0.275561 0.412201 -v 19061.5 12711 4807.2 -vt 0.276392 0.412201 -v 19061.5 12711 4817.32 -vt 0.276392 0.411789 -v 19061.5 12711 4797.08 -vt 0.276392 0.412613 -v 19031.5 12711 4797.08 -vt 0.275561 0.412613 -o mesh2164 -s off -f 10839/10839/10839 10840/10840/10840 10841/10841/10841 -f 10839/10839/10839 10841/10841/10841 10842/10842/10842 -f 10843/10843/10843 10841/10841/10841 10840/10840/10840 -f 10843/10843/10843 10840/10840/10840 10844/10844/10844 -g charts -o chart0000 -s off -f 10839/10839/10839 10840/10840/10840 10841/10841/10841 -f 10839/10839/10839 10841/10841/10841 10842/10842/10842 -f 10843/10843/10843 10841/10841/10841 10840/10840/10840 -f 10843/10843/10843 10840/10840/10840 10844/10844/10844 -v 19031.5 11586 4817.32 -vt 0.810889 0.330173 -v 19031.5 11586 4807.2 -vt 0.810889 0.330586 -v 19061.5 11586 4807.2 -vt 0.811721 0.330586 -v 19061.5 11586 4817.32 -vt 0.811721 0.330173 -v 19061.5 11586 4797.08 -vt 0.811721 0.330997 -v 19031.5 11586 4797.08 -vt 0.810889 0.330997 -o mesh2165 -s off -f 10845/10845/10845 10846/10846/10846 10847/10847/10847 -f 10845/10845/10845 10847/10847/10847 10848/10848/10848 -f 10849/10849/10849 10847/10847/10847 10846/10846/10846 -f 10849/10849/10849 10846/10846/10846 10850/10850/10850 -g charts -o chart0000 -s off -f 10845/10845/10845 10846/10846/10846 10847/10847/10847 -f 10845/10845/10845 10847/10847/10847 10848/10848/10848 -f 10849/10849/10849 10847/10847/10847 10846/10846/10846 -f 10849/10849/10849 10846/10846/10846 10850/10850/10850 -v 14254 24906 4869.82 -vt 0.335411 0.485161 -v 14254 24906 4859.7 -vt 0.335411 0.485573 -v 14254 24936 4859.7 -vt 0.336243 0.485573 -v 14254 24936 4869.82 -vt 0.336243 0.485161 -v 14254 24936 4849.58 -vt 0.336243 0.485985 -v 14254 24906 4849.58 -vt 0.335411 0.485985 -o mesh2166 -s off -f 10851/10851/10851 10852/10852/10852 10853/10853/10853 -f 10851/10851/10851 10853/10853/10853 10854/10854/10854 -f 10855/10855/10855 10853/10853/10853 10852/10852/10852 -f 10855/10855/10855 10852/10852/10852 10856/10856/10856 -g charts -o chart0000 -s off -f 10851/10851/10851 10852/10852/10852 10853/10853/10853 -f 10851/10851/10851 10853/10853/10853 10854/10854/10854 -f 10855/10855/10855 10853/10853/10853 10852/10852/10852 -f 10855/10855/10855 10852/10852/10852 10856/10856/10856 -v 12004 24906 4869.82 -vt 0.445968 0.340066 -v 12004 24906 4859.7 -vt 0.445968 0.340478 -v 12004 24936 4859.7 -vt 0.4468 0.340478 -v 12004 24936 4869.82 -vt 0.4468 0.340066 -v 12004 24936 4849.58 -vt 0.4468 0.34089 -v 12004 24906 4849.58 -vt 0.445968 0.34089 -o mesh2167 -s off -f 10857/10857/10857 10858/10858/10858 10859/10859/10859 -f 10857/10857/10857 10859/10859/10859 10860/10860/10860 -f 10861/10861/10861 10859/10859/10859 10858/10858/10858 -f 10861/10861/10861 10858/10858/10858 10862/10862/10862 -g charts -o chart0000 -s off -f 10857/10857/10857 10858/10858/10858 10859/10859/10859 -f 10857/10857/10857 10859/10859/10859 10860/10860/10860 -f 10861/10861/10861 10859/10859/10859 10858/10858/10858 -f 10861/10861/10861 10858/10858/10858 10862/10862/10862 -v 13129 24906 4869.82 -vt 0.352037 0.89324 -v 13129 24906 4859.7 -vt 0.352037 0.893652 -v 13129 24936 4859.7 -vt 0.352868 0.893652 -v 13129 24936 4869.82 -vt 0.352868 0.89324 -v 13129 24936 4849.58 -vt 0.352868 0.894064 -v 13129 24906 4849.58 -vt 0.352037 0.894064 -o mesh2168 -s off -f 10863/10863/10863 10864/10864/10864 10865/10865/10865 -f 10863/10863/10863 10865/10865/10865 10866/10866/10866 -f 10867/10867/10867 10865/10865/10865 10864/10864/10864 -f 10867/10867/10867 10864/10864/10864 10868/10868/10868 -g charts -o chart0000 -s off -f 10863/10863/10863 10864/10864/10864 10865/10865/10865 -f 10863/10863/10863 10865/10865/10865 10866/10866/10866 -f 10867/10867/10867 10865/10865/10865 10864/10864/10864 -f 10867/10867/10867 10864/10864/10864 10868/10868/10868 -v 10856.5 24763.5 3884.7 -vt 0.808396 0.76216 -v 10856.5 24726 3922.2 -vt 0.807564 0.761845 -v 10856.5 23683.5 3884.7 -vt 0.808396 0.753092 -v 10856.5 23721 3922.2 -vt 0.807564 0.753406 -o mesh2169 -s off -f 10869/10869/10869 10870/10870/10870 10871/10871/10871 -f 10872/10872/10872 10871/10871/10871 10870/10870/10870 -g charts -o chart0000 -s off -f 10869/10869/10869 10870/10870/10870 10871/10871/10871 -f 10872/10872/10872 10871/10871/10871 10870/10870/10870 -v 10856.5 24726 3922.2 -vt 0.256442 0.409622 -v 10856.5 24763.5 3884.7 -vt 0.257273 0.409316 -v 10856.5 24763.5 5804.7 -vt 0.257273 0.424979 -o mesh2170 -s off -f 10873/10873/10873 10874/10874/10874 10875/10875/10875 -g charts -o chart0000 -s off -f 10873/10873/10873 10874/10874/10874 10875/10875/10875 -v 10856.5 24726 3922.2 -vt 0.997922 0.696208 -v 10856.5 24763.5 5804.7 -vt 0.997922 0.711047 -v 10856.5 24726 5767.2 -vt 0.997091 0.710746 -o mesh2171 -s off -f 10876/10876/10876 10877/10877/10877 10878/10878/10878 -g charts -o chart0000 -s off -f 10876/10876/10876 10877/10877/10877 10878/10878/10878 -v 10856.5 24726 5767.2 -vt 0.206045 0.653339 -v 10856.5 24763.5 5804.7 -vt 0.205736 0.654163 -v 10856.5 23721 5767.2 -vt 0.214048 0.654163 -o mesh2172 -s off -f 10879/10879/10879 10880/10880/10880 10881/10881/10881 -g charts -o chart0000 -s off -f 10879/10879/10879 10880/10880/10880 10881/10881/10881 -v 10856.5 23683.5 3884.7 -vt 0.968828 0.654988 -v 10856.5 23721 3922.2 -vt 0.968519 0.654163 -v 10856.5 23683.5 5804.7 -vt 0.953034 0.654988 -o mesh2173 -s off -f 10882/10882/10882 10883/10883/10883 10884/10884/10884 -g charts -o chart0000 -s off -f 10882/10882/10882 10883/10883/10883 10884/10884/10884 -v 10856.5 23683.5 5804.7 -vt 0.920615 0.875927 -v 10856.5 23721 3922.2 -vt 0.935578 0.875927 -v 10856.5 23721 5767.2 -vt 0.920919 0.875103 -o mesh2174 -s off -f 10885/10885/10885 10886/10886/10886 10887/10887/10887 -g charts -o chart0000 -s off -f 10885/10885/10885 10886/10886/10886 10887/10887/10887 -v 10856.5 23683.5 5804.7 -vt 0.611388 0.597279 -v 10856.5 23721 5767.2 -vt 0.610557 0.596965 -v 10856.5 24763.5 5804.7 -vt 0.611388 0.588211 -o mesh2175 -s off -f 10888/10888/10888 10889/10889/10889 10890/10890/10890 -g charts -o chart0000 -s off -f 10888/10888/10888 10889/10889/10889 10890/10890/10890 -v 10691.5 23683.5 3884.7 -vt 0.318786 0.553586 -v 10691.5 23721 3922.2 -vt 0.317955 0.553271 -v 10691.5 24763.5 3884.7 -vt 0.318786 0.544518 -v 10691.5 24726 3922.2 -vt 0.317955 0.544833 -o mesh2176 -s off -f 10891/10891/10891 10892/10892/10892 10893/10893/10893 -f 10894/10894/10894 10893/10893/10893 10892/10892/10892 -g charts -o chart0000 -s off -f 10891/10891/10891 10892/10892/10892 10893/10893/10893 -f 10894/10894/10894 10893/10893/10893 10892/10892/10892 -v 10691.5 23721 3922.2 -vt 0.856608 0.182087 -v 10691.5 23683.5 3884.7 -vt 0.85744 0.181781 -v 10691.5 23683.5 5804.7 -vt 0.85744 0.197444 -o mesh2177 -s off -f 10895/10895/10895 10896/10896/10896 10897/10897/10897 -g charts -o chart0000 -s off -f 10895/10895/10895 10896/10896/10896 10897/10897/10897 -v 10691.5 23721 3922.2 -vt 0.567332 0.336768 -v 10691.5 23683.5 5804.7 -vt 0.582294 0.336768 -v 10691.5 23721 5767.2 -vt 0.58199 0.335944 -o mesh2178 -s off -f 10898/10898/10898 10899/10899/10899 10900/10900/10900 -g charts -o chart0000 -s off -f 10898/10898/10898 10899/10899/10899 10900/10900/10900 -v 10691.5 23721 5767.2 -vt 0.87074 0.214239 -v 10691.5 23683.5 5804.7 -vt 0.871571 0.213932 -v 10691.5 24726 5767.2 -vt 0.871571 0.222176 -o mesh2179 -s off -f 10901/10901/10901 10902/10902/10902 10903/10903/10903 -g charts -o chart0000 -s off -f 10901/10901/10901 10902/10902/10902 10903/10903/10903 -v 10691.5 24763.5 3884.7 -vt 0.0128844 0.904781 -v 10691.5 24726 3922.2 -vt 0.0120532 0.904476 -v 10691.5 24763.5 5804.7 -vt 0.0128844 0.889118 -o mesh2180 -s off -f 10904/10904/10904 10905/10905/10905 10906/10906/10906 -g charts -o chart0000 -s off -f 10904/10904/10904 10905/10905/10905 10906/10906/10906 -v 10691.5 24763.5 5804.7 -vt 0.776808 0.542045 -v 10691.5 24726 3922.2 -vt 0.776808 0.556884 -v 10691.5 24726 5767.2 -vt 0.775977 0.542346 -o mesh2181 -s off -f 10907/10907/10907 10908/10908/10908 10909/10909/10909 -g charts -o chart0000 -s off -f 10907/10907/10907 10908/10908/10908 10909/10909/10909 -v 10691.5 24763.5 5804.7 -vt 0.310474 0.414262 -v 10691.5 24726 5767.2 -vt 0.310156 0.413438 -v 10691.5 23683.5 5804.7 -vt 0.30133 0.414262 -o mesh2182 -s off -f 10910/10910/10910 10911/10911/10911 10912/10912/10912 -g charts -o chart0000 -s off -f 10910/10910/10910 10911/10911/10911 10912/10912/10912 -v 10856.5 23683.5 5804.7 -vt 0.733583 0.795136 -v 10856.5 24763.5 5804.7 -vt 0.724439 0.795136 -v 10691.5 24763.5 5804.7 -vt 0.724439 0.793487 -v 10691.5 23683.5 5804.7 -vt 0.733583 0.793487 -o mesh2183 -s off -f 10913/10913/10913 10914/10914/10914 10915/10915/10915 -f 10913/10913/10913 10915/10915/10915 10916/10916/10916 -g charts -o chart0000 -s off -f 10913/10913/10913 10914/10914/10914 10915/10915/10915 -f 10913/10913/10913 10915/10915/10915 10916/10916/10916 -v 10856.5 24763.5 5804.7 -vt 0.913134 0.131492 -v 10856.5 24763.5 3884.7 -vt 0.913134 0.147156 -v 10691.5 24763.5 3884.7 -vt 0.914796 0.147156 -v 10691.5 24763.5 5804.7 -vt 0.914796 0.131492 -o mesh2184 -s off -f 10917/10917/10917 10918/10918/10918 10919/10919/10919 -f 10917/10917/10917 10919/10919/10919 10920/10920/10920 -g charts -o chart0000 -s off -f 10917/10917/10917 10918/10918/10918 10919/10919/10919 -f 10917/10917/10917 10919/10919/10919 10920/10920/10920 -v 10856.5 24763.5 3884.7 -vt 0.87074 0.0943941 -v 10856.5 23683.5 3884.7 -vt 0.87074 0.103462 -v 10691.5 23683.5 3884.7 -vt 0.872402 0.103462 -v 10691.5 24763.5 3884.7 -vt 0.872402 0.0943941 -o mesh2185 -s off -f 10921/10921/10921 10922/10922/10922 10923/10923/10923 -f 10921/10921/10921 10923/10923/10923 10924/10924/10924 -g charts -o chart0000 -s off -f 10921/10921/10921 10922/10922/10922 10923/10923/10923 -f 10921/10921/10921 10923/10923/10923 10924/10924/10924 -v 10856.5 23683.5 3884.7 -vt 0.551538 0.32028 -v 10856.5 23683.5 5804.7 -vt 0.551538 0.304617 -v 10691.5 23683.5 5804.7 -vt 0.549875 0.304617 -v 10691.5 23683.5 3884.7 -vt 0.549875 0.32028 -o mesh2186 -s off -f 10925/10925/10925 10926/10926/10926 10927/10927/10927 -f 10925/10925/10925 10927/10927/10927 10928/10928/10928 -g charts -o chart0000 -s off -f 10925/10925/10925 10926/10926/10926 10927/10927/10927 -f 10925/10925/10925 10927/10927/10927 10928/10928/10928 -v 10691.5 23721 3922.2 -vt 0.987947 0.833058 -v 10736.5 23721 3922.2 -vt 0.9884 0.833058 -v 10736.5 24726 3922.2 -vt 0.9884 0.824814 -v 10691.5 24726 3922.2 -vt 0.987947 0.824814 -v 10856.5 23721 3922.2 -vt 0.989609 0.833058 -v 10856.5 24726 3922.2 -vt 0.989609 0.824814 -o mesh2187 -s off -f 10929/10929/10929 10930/10930/10930 10931/10931/10931 -f 10929/10929/10929 10931/10931/10931 10932/10932/10932 -f 10933/10933/10933 10934/10934/10934 10931/10931/10931 -f 10933/10933/10933 10931/10931/10931 10930/10930/10930 -g charts -o chart0000 -s off -f 10929/10929/10929 10930/10930/10930 10931/10931/10931 -f 10929/10929/10929 10931/10931/10931 10932/10932/10932 -f 10933/10933/10933 10934/10934/10934 10931/10931/10931 -f 10933/10933/10933 10931/10931/10931 10930/10930/10930 -v 10691.5 24726 3922.2 -vt 0.87074 0.472795 -v 10736.5 24726 3922.2 -vt 0.871193 0.472795 -v 10736.5 24726 5767.2 -vt 0.871193 0.457955 -v 10691.5 24726 5767.2 -vt 0.87074 0.457955 -v 10856.5 24726 3922.2 -vt 0.872402 0.472795 -v 10856.5 24726 5767.2 -vt 0.872402 0.457955 -o mesh2188 -s off -f 10935/10935/10935 10936/10936/10936 10937/10937/10937 -f 10935/10935/10935 10937/10937/10937 10938/10938/10938 -f 10939/10939/10939 10940/10940/10940 10937/10937/10937 -f 10939/10939/10939 10937/10937/10937 10936/10936/10936 -g charts -o chart0000 -s off -f 10935/10935/10935 10936/10936/10936 10937/10937/10937 -f 10935/10935/10935 10937/10937/10937 10938/10938/10938 -f 10939/10939/10939 10940/10940/10940 10937/10937/10937 -f 10939/10939/10939 10937/10937/10937 10936/10936/10936 -v 10691.5 24726 5767.2 -vt 0.662926 0.687139 -v 10736.5 24726 5767.2 -vt 0.662473 0.687139 -v 10736.5 23721 5767.2 -vt 0.662473 0.678895 -v 10691.5 23721 5767.2 -vt 0.662926 0.678895 -v 10856.5 24726 5767.2 -vt 0.661264 0.687139 -v 10856.5 23721 5767.2 -vt 0.661264 0.678895 -o mesh2189 -s off -f 10941/10941/10941 10942/10942/10942 10943/10943/10943 -f 10941/10941/10941 10943/10943/10943 10944/10944/10944 -f 10945/10945/10945 10946/10946/10946 10943/10943/10943 -f 10945/10945/10945 10943/10943/10943 10942/10942/10942 -g charts -o chart0000 -s off -f 10941/10941/10941 10942/10942/10942 10943/10943/10943 -f 10941/10941/10941 10943/10943/10943 10944/10944/10944 -f 10945/10945/10945 10946/10946/10946 10943/10943/10943 -f 10945/10945/10945 10943/10943/10943 10942/10942/10942 -v 10691.5 23721 5767.2 -vt 0.806733 0.908903 -v 10736.5 23721 5767.2 -vt 0.806733 0.908454 -v 10736.5 23721 3922.2 -vt 0.791771 0.908454 -v 10691.5 23721 3922.2 -vt 0.791771 0.908903 -v 10856.5 23721 5767.2 -vt 0.806733 0.907255 -v 10856.5 23721 3922.2 -vt 0.791771 0.907255 -o mesh2190 -s off -f 10947/10947/10947 10948/10948/10948 10949/10949/10949 -f 10947/10947/10947 10949/10949/10949 10950/10950/10950 -f 10951/10951/10951 10952/10952/10952 10949/10949/10949 -f 10951/10951/10951 10949/10949/10949 10948/10948/10948 -g charts -o chart0000 -s off -f 10947/10947/10947 10948/10948/10948 10949/10949/10949 -f 10947/10947/10947 10949/10949/10949 10950/10950/10950 -f 10951/10951/10951 10952/10952/10952 10949/10949/10949 -f 10951/10951/10951 10949/10949/10949 10948/10948/10948 -v 10736.5 23721 3922.2 -vt 0.13591 0.673124 -v 10736.5 23781 3982.2 -vt 0.136406 0.673949 -v 10736.5 24726 3922.2 -vt 0.144223 0.673124 -v 10736.5 24666 3982.2 -vt 0.143726 0.673949 -o mesh2191 -s off -f 10953/10953/10953 10954/10954/10954 10955/10955/10955 -f 10956/10956/10956 10955/10955/10955 10954/10954/10954 -g charts -o chart0000 -s off -f 10953/10953/10953 10954/10954/10954 10955/10955/10955 -f 10956/10956/10956 10955/10955/10955 10954/10954/10954 -v 10736.5 23781 3982.2 -vt 0.934402 0.940231 -v 10736.5 23721 3922.2 -vt 0.933915 0.941055 -v 10736.5 23721 5767.2 -vt 0.948878 0.941055 -o mesh2192 -s off -f 10957/10957/10957 10958/10958/10958 10959/10959/10959 -g charts -o chart0000 -s off -f 10957/10957/10957 10958/10958/10958 10959/10959/10959 -v 10736.5 23781 3982.2 -vt 0.680382 0.645095 -v 10736.5 23721 5767.2 -vt 0.680382 0.65911 -v 10736.5 23781 5707.2 -vt 0.679551 0.658623 -o mesh2193 -s off -f 10960/10960/10960 10961/10961/10961 10962/10962/10962 -g charts -o chart0000 -s off -f 10960/10960/10960 10961/10961/10961 10962/10962/10962 -v 10736.5 23781 5707.2 -vt 0.00540316 0.633228 -v 10736.5 23721 5767.2 -vt 0.00623433 0.632729 -v 10736.5 24666 5707.2 -vt 0.00623433 0.640148 -o mesh2194 -s off -f 10963/10963/10963 10964/10964/10964 10965/10965/10965 -g charts -o chart0000 -s off -f 10963/10963/10963 10964/10964/10964 10965/10965/10965 -v 10736.5 24726 3922.2 -vt 0.169992 0.624485 -v 10736.5 24666 3982.2 -vt 0.16916 0.624002 -v 10736.5 24726 5767.2 -vt 0.169991 0.609645 -o mesh2195 -s off -f 10966/10966/10966 10967/10967/10967 10968/10968/10968 -g charts -o chart0000 -s off -f 10966/10966/10966 10967/10967/10967 10968/10968/10968 -v 10736.5 24726 5767.2 -vt 0.0137156 0.768755 -v 10736.5 24666 3982.2 -vt 0.0137156 0.78277 -v 10736.5 24666 5707.2 -vt 0.0128845 0.769242 -o mesh2196 -s off -f 10969/10969/10969 10970/10970/10970 10971/10971/10971 -g charts -o chart0000 -s off -f 10969/10969/10969 10970/10970/10970 10971/10971/10971 -v 10736.5 24726 5767.2 -vt 0.46675 0.454658 -v 10736.5 24666 5707.2 -vt 0.466254 0.453833 -v 10736.5 23721 5767.2 -vt 0.458437 0.454658 -o mesh2197 -s off -f 10972/10972/10972 10973/10973/10973 10974/10974/10974 -g charts -o chart0000 -s off -f 10972/10972/10972 10973/10973/10973 10974/10974/10974 -v 10856.5 24666 5707.2 -vt 0.649626 0.894064 -v 10811.5 24236.6 5707.2 -vt 0.650249 0.890464 -v 10736.5 24666 5707.2 -vt 0.651288 0.894064 -v 10856.5 23781 5707.2 -vt 0.649626 0.886645 -v 10811.5 24210.4 5707.2 -vt 0.650249 0.890244 -v 10781.5 24210.4 5707.2 -vt 0.650665 0.890244 -v 10781.5 24236.6 5707.2 -vt 0.650665 0.890464 -v 10736.5 23781 5707.2 -vt 0.651288 0.886645 -o mesh2198 -s off -f 10975/10975/10975 10976/10976/10976 10977/10977/10977 -f 10976/10976/10976 10975/10975/10975 10978/10978/10978 -f 10976/10976/10976 10978/10978/10978 10979/10979/10979 -f 10979/10979/10979 10978/10978/10978 10980/10980/10980 -f 10977/10977/10977 10981/10981/10981 10982/10982/10982 -f 10981/10981/10981 10977/10977/10977 10976/10976/10976 -f 10982/10982/10982 10981/10981/10981 10980/10980/10980 -f 10982/10982/10982 10980/10980/10980 10978/10978/10978 -g charts -o chart0000 -s off -f 10975/10975/10975 10976/10976/10976 10977/10977/10977 -f 10976/10976/10976 10975/10975/10975 10978/10978/10978 -f 10976/10976/10976 10978/10978/10978 10979/10979/10979 -f 10979/10979/10979 10978/10978/10978 10980/10980/10980 -f 10977/10977/10977 10981/10981/10981 10982/10982/10982 -f 10981/10981/10981 10977/10977/10977 10976/10976/10976 -f 10982/10982/10982 10981/10981/10981 10980/10980/10980 -f 10982/10982/10982 10980/10980/10980 10978/10978/10978 -v 10736.5 23781 5707.2 -vt 0.450956 0.474443 -v 10781.5 23781 4854.82 -vt 0.450332 0.467518 -v 10736.5 23781 3982.2 -vt 0.450956 0.460429 -v 10856.5 23781 5707.2 -vt 0.449293 0.474443 -v 10811.5 23781 4854.82 -vt 0.449917 0.467518 -v 10811.5 23781 4834.58 -vt 0.449917 0.467354 -v 10781.5 23781 4834.58 -vt 0.450332 0.467354 -v 10856.5 23781 3982.2 -vt 0.449293 0.460429 -o mesh2199 -s off -f 10983/10983/10983 10984/10984/10984 10985/10985/10985 -f 10984/10984/10984 10983/10983/10983 10986/10986/10986 -f 10984/10984/10984 10986/10986/10986 10987/10987/10987 -f 10987/10987/10987 10986/10986/10986 10988/10988/10988 -f 10985/10985/10985 10989/10989/10989 10990/10990/10990 -f 10989/10989/10989 10985/10985/10985 10984/10984/10984 -f 10990/10990/10990 10989/10989/10989 10988/10988/10988 -f 10990/10990/10990 10988/10988/10988 10986/10986/10986 -g charts -o chart0000 -s off -f 10983/10983/10983 10984/10984/10984 10985/10985/10985 -f 10984/10984/10984 10983/10983/10983 10986/10986/10986 -f 10984/10984/10984 10986/10986/10986 10987/10987/10987 -f 10987/10987/10987 10986/10986/10986 10988/10988/10988 -f 10985/10985/10985 10989/10989/10989 10990/10990/10990 -f 10989/10989/10989 10985/10985/10985 10984/10984/10984 -f 10990/10990/10990 10989/10989/10989 10988/10988/10988 -f 10990/10990/10990 10988/10988/10988 10986/10986/10986 -v 10736.5 24666 3982.2 -vt 0.24813 0.884996 -v 10781.5 24236.6 3982.2 -vt 0.2445 0.884377 -v 10856.5 24666 3982.2 -vt 0.24813 0.883347 -v 10736.5 23781 3982.2 -vt 0.240648 0.884996 -v 10781.5 24210.4 3982.2 -vt 0.244278 0.884377 -v 10811.5 24210.4 3982.2 -vt 0.244278 0.883965 -v 10811.5 24236.6 3982.2 -vt 0.2445 0.883965 -v 10856.5 23781 3982.2 -vt 0.240648 0.883347 -o mesh2200 -s off -f 10991/10991/10991 10992/10992/10992 10993/10993/10993 -f 10992/10992/10992 10991/10991/10991 10994/10994/10994 -f 10992/10992/10992 10994/10994/10994 10995/10995/10995 -f 10995/10995/10995 10994/10994/10994 10996/10996/10996 -f 10993/10993/10993 10997/10997/10997 10998/10998/10998 -f 10997/10997/10997 10993/10993/10993 10992/10992/10992 -f 10998/10998/10998 10997/10997/10997 10996/10996/10996 -f 10998/10998/10998 10996/10996/10996 10994/10994/10994 -g charts -o chart0000 -s off -f 10991/10991/10991 10992/10992/10992 10993/10993/10993 -f 10992/10992/10992 10991/10991/10991 10994/10994/10994 -f 10992/10992/10992 10994/10994/10994 10995/10995/10995 -f 10995/10995/10995 10994/10994/10994 10996/10996/10996 -f 10993/10993/10993 10997/10997/10997 10998/10998/10998 -f 10997/10997/10997 10993/10993/10993 10992/10992/10992 -f 10998/10998/10998 10997/10997/10997 10996/10996/10996 -f 10998/10998/10998 10996/10996/10996 10994/10994/10994 -v 10856.5 24666 3982.2 -vt 0.651288 0.979802 -v 10856.5 24666 5707.2 -vt 0.651288 0.993817 -v 10736.5 24666 5707.2 -vt 0.649626 0.993817 -v 10736.5 24666 3982.2 -vt 0.649626 0.979802 -o mesh2201 -s off -f 10999/10999/10999 11000/11000/11000 11001/11001/11001 -f 10999/10999/10999 11001/11001/11001 11002/11002/11002 -g charts -o chart0000 -s off -f 10999/10999/10999 11000/11000/11000 11001/11001/11001 -f 10999/10999/10999 11001/11001/11001 11002/11002/11002 -v 10811.5 24236.6 5707.2 -vt 0.95719 0.0556471 -v 10811.5 24210.4 5707.2 -vt 0.95719 0.0548228 -v 10811.5 24210.4 3982.2 -vt 0.943059 0.0548228 -v 10811.5 24236.6 3982.2 -vt 0.943059 0.0556471 -o mesh2202 -s off -f 11003/11003/11003 11004/11004/11004 11005/11005/11005 -f 11003/11003/11003 11005/11005/11005 11006/11006/11006 -g charts -o chart0000 -s off -f 11003/11003/11003 11004/11004/11004 11005/11005/11005 -f 11003/11003/11003 11005/11005/11005 11006/11006/11006 -v 10811.5 24210.4 5707.2 -vt 0.623026 0.78277 -v 10781.5 24210.4 5707.2 -vt 0.622195 0.78277 -v 10781.5 24210.4 3982.2 -vt 0.622195 0.768755 -v 10811.5 24210.4 3982.2 -vt 0.623026 0.768755 -o mesh2203 -s off -f 11007/11007/11007 11008/11008/11008 11009/11009/11009 -f 11007/11007/11007 11009/11009/11009 11010/11010/11010 -g charts -o chart0000 -s off -f 11007/11007/11007 11008/11008/11008 11009/11009/11009 -f 11007/11007/11007 11009/11009/11009 11010/11010/11010 -v 10781.5 24645.6 4854.82 -vt 0.413549 0.965787 -v 10811.5 24645.6 4854.82 -vt 0.413549 0.964963 -v 10811.5 24645.6 4834.58 -vt 0.412718 0.964963 -v 10781.5 24645.6 4834.58 -vt 0.412718 0.965787 -o mesh2204 -s off -f 11011/11011/11011 11012/11012/11012 11013/11013/11013 -f 11011/11011/11011 11013/11013/11013 11014/11014/11014 -g charts -o chart0000 -s off -f 11011/11011/11011 11012/11012/11012 11013/11013/11013 -f 11011/11011/11011 11013/11013/11013 11014/11014/11014 -v 10781.5 23781 4854.82 -vt 0.601413 0.589035 -v 10811.5 23781 4854.82 -vt 0.601413 0.58986 -v 10811.5 24645.6 4854.82 -vt 0.593932 0.58986 -v 10781.5 24645.6 4854.82 -vt 0.593932 0.589035 -o mesh2205 -s off -f 11015/11015/11015 11016/11016/11016 11017/11017/11017 -f 11015/11015/11015 11017/11017/11017 11018/11018/11018 -g charts -o chart0000 -s off -f 11015/11015/11015 11016/11016/11016 11017/11017/11017 -f 11015/11015/11015 11017/11017/11017 11018/11018/11018 -v 10811.5 23781 4854.82 -vt 0.406899 0.661583 -v 10811.5 23781 4834.58 -vt 0.407731 0.661583 -v 10811.5 24645.6 4834.58 -vt 0.407731 0.654163 -v 10811.5 24645.6 4854.82 -vt 0.406899 0.654163 -o mesh2206 -s off -f 11019/11019/11019 11020/11020/11020 11021/11021/11021 -f 11019/11019/11019 11021/11021/11021 11022/11022/11022 -g charts -o chart0000 -s off -f 11019/11019/11019 11020/11020/11020 11021/11021/11021 -f 11019/11019/11019 11021/11021/11021 11022/11022/11022 -v 10811.5 23781 4834.58 -vt 0.388612 0.941055 -v 10781.5 23781 4834.58 -vt 0.389443 0.941055 -v 10781.5 24645.6 4834.58 -vt 0.389443 0.933636 -v 10811.5 24645.6 4834.58 -vt 0.388612 0.933636 -o mesh2207 -s off -f 11023/11023/11023 11024/11024/11024 11025/11025/11025 -f 11023/11023/11023 11025/11025/11025 11026/11026/11026 -g charts -o chart0000 -s off -f 11023/11023/11023 11024/11024/11024 11025/11025/11025 -f 11023/11023/11023 11025/11025/11025 11026/11026/11026 -v 10781.5 23781 4834.58 -vt 0.866583 0.972383 -v 10781.5 23781 4854.82 -vt 0.866583 0.973207 -v 10781.5 24645.6 4854.82 -vt 0.859102 0.973207 -v 10781.5 24645.6 4834.58 -vt 0.859102 0.972383 -o mesh2208 -s off -f 11027/11027/11027 11028/11028/11028 11029/11029/11029 -f 11027/11027/11027 11029/11029/11029 11030/11030/11030 -g charts -o chart0000 -s off -f 11027/11027/11027 11028/11028/11028 11029/11029/11029 -f 11027/11027/11027 11029/11029/11029 11030/11030/11030 -v 10781.5 24236.6 5707.2 -vt 0.887365 0.708574 -v 10811.5 24236.6 5707.2 -vt 0.886534 0.708574 -v 10811.5 24236.6 3982.2 -vt 0.886534 0.694559 -v 10781.5 24236.6 3982.2 -vt 0.887365 0.694559 -o mesh2209 -s off -f 11031/11031/11031 11032/11032/11032 11033/11033/11033 -f 11031/11031/11031 11033/11033/11033 11034/11034/11034 -g charts -o chart0000 -s off -f 11031/11031/11031 11032/11032/11032 11033/11033/11033 -f 11031/11031/11031 11033/11033/11033 11034/11034/11034 -v 10781.5 24210.4 5707.2 -vt 0.0943474 0.653339 -v 10781.5 24236.6 5707.2 -vt 0.0943474 0.652514 -v 10781.5 24236.6 3982.2 -vt 0.0802161 0.652514 -v 10781.5 24210.4 3982.2 -vt 0.0802161 0.653339 -o mesh2210 -s off -f 11035/11035/11035 11036/11036/11036 11037/11037/11037 -f 11035/11035/11035 11037/11037/11037 11038/11038/11038 -g charts -o chart0000 -s off -f 11035/11035/11035 11036/11036/11036 11037/11037/11037 -f 11035/11035/11035 11037/11037/11037 11038/11038/11038 -v 10856.5 23638.5 3884.7 -vt 0.343724 0.475268 -v 10856.5 23601 3922.2 -vt 0.342893 0.474953 -v 10856.5 22558.5 3884.7 -vt 0.343724 0.4662 -v 10856.5 22596 3922.2 -vt 0.342893 0.466514 -o mesh2211 -s off -f 11039/11039/11039 11040/11040/11040 11041/11041/11041 -f 11042/11042/11042 11041/11041/11041 11040/11040/11040 -g charts -o chart0000 -s off -f 11039/11039/11039 11040/11040/11040 11041/11041/11041 -f 11042/11042/11042 11041/11041/11041 11040/11040/11040 -v 10856.5 23601 3922.2 -vt 0.343201 0.988871 -v 10856.5 23638.5 3884.7 -vt 0.342893 0.989695 -v 10856.5 23638.5 5804.7 -vt 0.358687 0.989695 -o mesh2212 -s off -f 11043/11043/11043 11044/11044/11044 11045/11045/11045 -g charts -o chart0000 -s off -f 11043/11043/11043 11044/11044/11044 11045/11045/11045 -v 10856.5 23601 3922.2 -vt 0.394431 0.794312 -v 10856.5 23638.5 5804.7 -vt 0.394431 0.809151 -v 10856.5 23601 5767.2 -vt 0.393599 0.808849 -o mesh2213 -s off -f 11046/11046/11046 11047/11047/11047 11048/11048/11048 -g charts -o chart0000 -s off -f 11046/11046/11046 11047/11047/11047 11048/11048/11048 -v 10856.5 23601 5767.2 -vt 0.349852 0.339242 -v 10856.5 23638.5 5804.7 -vt 0.349543 0.340066 -v 10856.5 22596 5767.2 -vt 0.357855 0.340066 -o mesh2214 -s off -f 11049/11049/11049 11050/11050/11050 11051/11051/11051 -g charts -o chart0000 -s off -f 11049/11049/11049 11050/11050/11050 11051/11051/11051 -v 10856.5 22558.5 3884.7 -vt 0.524106 0.415086 -v 10856.5 22596 3922.2 -vt 0.523798 0.414262 -v 10856.5 22558.5 5804.7 -vt 0.508313 0.415086 -o mesh2215 -s off -f 11052/11052/11052 11053/11053/11053 11054/11054/11054 -g charts -o chart0000 -s off -f 11052/11052/11052 11053/11053/11053 11054/11054/11054 -v 10856.5 22558.5 5804.7 -vt 0.953865 0.184254 -v 10856.5 22596 3922.2 -vt 0.953865 0.199093 -v 10856.5 22596 5767.2 -vt 0.953034 0.184555 -o mesh2216 -s off -f 11055/11055/11055 11056/11056/11056 11057/11057/11057 -g charts -o chart0000 -s off -f 11055/11055/11055 11056/11056/11056 11057/11057/11057 -v 10856.5 22558.5 5804.7 -vt 0.357024 0.345012 -v 10856.5 22596 5767.2 -vt 0.356706 0.344188 -v 10856.5 23638.5 5804.7 -vt 0.34788 0.345012 -o mesh2217 -s off -f 11058/11058/11058 11059/11059/11059 11060/11060/11060 -g charts -o chart0000 -s off -f 11058/11058/11058 11059/11059/11059 11060/11060/11060 -v 10691.5 22558.5 3884.7 -vt 0.961347 0.490107 -v 10691.5 22596 3922.2 -vt 0.962178 0.490422 -v 10691.5 23638.5 3884.7 -vt 0.961347 0.499175 -v 10691.5 23601 3922.2 -vt 0.962178 0.498861 -o mesh2218 -s off -f 11061/11061/11061 11062/11062/11062 11063/11063/11063 -f 11064/11064/11064 11063/11063/11063 11062/11062/11062 -g charts -o chart0000 -s off -f 11061/11061/11061 11062/11062/11062 11063/11063/11063 -f 11064/11064/11064 11063/11063/11063 11062/11062/11062 -v 10691.5 22596 3922.2 -vt 0.159494 0.968261 -v 10691.5 22558.5 3884.7 -vt 0.159185 0.969085 -v 10691.5 22558.5 5804.7 -vt 0.174979 0.969085 -o mesh2219 -s off -f 11065/11065/11065 11066/11066/11066 11067/11067/11067 -g charts -o chart0000 -s off -f 11065/11065/11065 11066/11066/11066 11067/11067/11067 -v 10691.5 22596 3922.2 -vt 0.613882 0.997114 -v 10691.5 22558.5 5804.7 -vt 0.628844 0.997114 -v 10691.5 22596 5767.2 -vt 0.628541 0.99629 -o mesh2220 -s off -f 11068/11068/11068 11069/11069/11069 11070/11070/11070 -g charts -o chart0000 -s off -f 11068/11068/11068 11069/11069/11069 11070/11070/11070 -v 10691.5 22596 5767.2 -vt 0.506959 0.701154 -v 10691.5 22558.5 5804.7 -vt 0.50665 0.701978 -v 10691.5 23601 5767.2 -vt 0.514962 0.701978 -o mesh2221 -s off -f 11071/11071/11071 11072/11072/11072 11073/11073/11073 -g charts -o chart0000 -s off -f 11071/11071/11071 11072/11072/11072 11073/11073/11073 -v 10691.5 23638.5 3884.7 -vt 0.0386533 0.701978 -v 10691.5 23601 3922.2 -vt 0.0383449 0.701154 -v 10691.5 23638.5 5804.7 -vt 0.0228595 0.701978 -o mesh2222 -s off -f 11074/11074/11074 11075/11075/11075 11076/11076/11076 -g charts -o chart0000 -s off -f 11074/11074/11074 11075/11075/11075 11076/11076/11076 -v 10691.5 23638.5 5804.7 -vt 0.322943 0.476092 -v 10691.5 23601 3922.2 -vt 0.337905 0.476092 -v 10691.5 23601 5767.2 -vt 0.323246 0.475268 -o mesh2223 -s off -f 11077/11077/11077 11078/11078/11078 11079/11079/11079 -g charts -o chart0000 -s off -f 11077/11077/11077 11078/11078/11078 11079/11079/11079 -v 10691.5 23638.5 5804.7 -vt 0.940565 0.680544 -v 10691.5 23601 5767.2 -vt 0.939734 0.680229 -v 10691.5 22558.5 5804.7 -vt 0.940565 0.671476 -o mesh2224 -s off -f 11080/11080/11080 11081/11081/11081 11082/11082/11082 -g charts -o chart0000 -s off -f 11080/11080/11080 11081/11081/11081 11082/11082/11082 -v 10856.5 22558.5 5804.7 -vt 0.908977 0.116653 -v 10856.5 23638.5 5804.7 -vt 0.908977 0.107584 -v 10691.5 23638.5 5804.7 -vt 0.907315 0.107584 -v 10691.5 22558.5 5804.7 -vt 0.907315 0.116653 -o mesh2225 -s off -f 11083/11083/11083 11084/11084/11084 11085/11085/11085 -f 11083/11083/11083 11085/11085/11085 11086/11086/11086 -g charts -o chart0000 -s off -f 11083/11083/11083 11084/11084/11084 11085/11085/11085 -f 11083/11083/11083 11085/11085/11085 11086/11086/11086 -v 10856.5 23638.5 5804.7 -vt 0.126766 0.969085 -v 10856.5 23638.5 3884.7 -vt 0.126766 0.984748 -v 10691.5 23638.5 3884.7 -vt 0.128429 0.984748 -v 10691.5 23638.5 5804.7 -vt 0.128429 0.969085 -o mesh2226 -s off -f 11087/11087/11087 11088/11088/11088 11089/11089/11089 -f 11087/11087/11087 11089/11089/11089 11090/11090/11090 -g charts -o chart0000 -s off -f 11087/11087/11087 11088/11088/11088 11089/11089/11089 -f 11087/11087/11087 11089/11089/11089 11090/11090/11090 -v 10856.5 23638.5 3884.7 -vt 0.437656 0.495878 -v 10856.5 22558.5 3884.7 -vt 0.437656 0.504946 -v 10691.5 22558.5 3884.7 -vt 0.439318 0.504946 -v 10691.5 23638.5 3884.7 -vt 0.439318 0.495878 -o mesh2227 -s off -f 11091/11091/11091 11092/11092/11092 11093/11093/11093 -f 11091/11091/11091 11093/11093/11093 11094/11094/11094 -g charts -o chart0000 -s off -f 11091/11091/11091 11092/11092/11092 11093/11093/11093 -f 11091/11091/11091 11093/11093/11093 11094/11094/11094 -v 10856.5 22558.5 3884.7 -vt 0.24813 0.79596 -v 10856.5 22558.5 5804.7 -vt 0.232336 0.79596 -v 10691.5 22558.5 5804.7 -vt 0.232336 0.794312 -v 10691.5 22558.5 3884.7 -vt 0.24813 0.794312 -o mesh2228 -s off -f 11095/11095/11095 11096/11096/11096 11097/11097/11097 -f 11095/11095/11095 11097/11097/11097 11098/11098/11098 -g charts -o chart0000 -s off -f 11095/11095/11095 11096/11096/11096 11097/11097/11097 -f 11095/11095/11095 11097/11097/11097 11098/11098/11098 -v 10691.5 22596 3922.2 -vt 0.416874 0.887469 -v 10736.5 22596 3922.2 -vt 0.416874 0.887919 -v 10736.5 23601 3922.2 -vt 0.408562 0.887919 -v 10691.5 23601 3922.2 -vt 0.408562 0.887469 -v 10856.5 22596 3922.2 -vt 0.416874 0.889118 -v 10856.5 23601 3922.2 -vt 0.408562 0.889118 -o mesh2229 -s off -f 11099/11099/11099 11100/11100/11100 11101/11101/11101 -f 11099/11099/11099 11101/11101/11101 11102/11102/11102 -f 11103/11103/11103 11104/11104/11104 11101/11101/11101 -f 11103/11103/11103 11101/11101/11101 11100/11100/11100 -g charts -o chart0000 -s off -f 11099/11099/11099 11100/11100/11100 11101/11101/11101 -f 11099/11099/11099 11101/11101/11101 11102/11102/11102 -f 11103/11103/11103 11104/11104/11104 11101/11101/11101 -f 11103/11103/11103 11101/11101/11101 11100/11100/11100 -v 10691.5 23601 3922.2 -vt 0.0045719 0.195795 -v 10736.5 23601 3922.2 -vt 0.00502529 0.195795 -v 10736.5 23601 5767.2 -vt 0.00502529 0.180956 -v 10691.5 23601 5767.2 -vt 0.0045719 0.180956 -v 10856.5 23601 3922.2 -vt 0.00623433 0.195795 -v 10856.5 23601 5767.2 -vt 0.00623433 0.180956 -o mesh2230 -s off -f 11105/11105/11105 11106/11106/11106 11107/11107/11107 -f 11105/11105/11105 11107/11107/11107 11108/11108/11108 -f 11109/11109/11109 11110/11110/11110 11107/11107/11107 -f 11109/11109/11109 11107/11107/11107 11106/11106/11106 -g charts -o chart0000 -s off -f 11105/11105/11105 11106/11106/11106 11107/11107/11107 -f 11105/11105/11105 11107/11107/11107 11108/11108/11108 -f 11109/11109/11109 11110/11110/11110 11107/11107/11107 -f 11109/11109/11109 11107/11107/11107 11106/11106/11106 -v 10691.5 23601 5767.2 -vt 0.267248 0.612943 -v 10736.5 23601 5767.2 -vt 0.267248 0.612493 -v 10736.5 22596 5767.2 -vt 0.258936 0.612493 -v 10691.5 22596 5767.2 -vt 0.258936 0.612943 -v 10856.5 23601 5767.2 -vt 0.267248 0.611294 -v 10856.5 22596 5767.2 -vt 0.258936 0.611294 -o mesh2231 -s off -f 11111/11111/11111 11112/11112/11112 11113/11113/11113 -f 11111/11111/11111 11113/11113/11113 11114/11114/11114 -f 11115/11115/11115 11116/11116/11116 11113/11113/11113 -f 11115/11115/11115 11113/11113/11113 11112/11112/11112 -g charts -o chart0000 -s off -f 11111/11111/11111 11112/11112/11112 11113/11113/11113 -f 11111/11111/11111 11113/11113/11113 11114/11114/11114 -f 11115/11115/11115 11116/11116/11116 11113/11113/11113 -f 11115/11115/11115 11113/11113/11113 11112/11112/11112 -v 10691.5 22596 5767.2 -vt 0.800083 0.684666 -v 10736.5 22596 5767.2 -vt 0.79963 0.684666 -v 10736.5 22596 3922.2 -vt 0.79963 0.669827 -v 10691.5 22596 3922.2 -vt 0.800083 0.669827 -v 10856.5 22596 5767.2 -vt 0.798421 0.684666 -v 10856.5 22596 3922.2 -vt 0.798421 0.669827 -o mesh2232 -s off -f 11117/11117/11117 11118/11118/11118 11119/11119/11119 -f 11117/11117/11117 11119/11119/11119 11120/11120/11120 -f 11121/11121/11121 11122/11122/11122 11119/11119/11119 -f 11121/11121/11121 11119/11119/11119 11118/11118/11118 -g charts -o chart0000 -s off -f 11117/11117/11117 11118/11118/11118 11119/11119/11119 -f 11117/11117/11117 11119/11119/11119 11120/11120/11120 -f 11121/11121/11121 11122/11122/11122 11119/11119/11119 -f 11121/11121/11121 11119/11119/11119 11118/11118/11118 -v 10736.5 22596 3922.2 -vt 0.616376 0.43075 -v 10736.5 22656 3982.2 -vt 0.617207 0.431242 -v 10736.5 23601 3922.2 -vt 0.616376 0.438994 -v 10736.5 23541 3982.2 -vt 0.617207 0.438502 -o mesh2233 -s off -f 11123/11123/11123 11124/11124/11124 11125/11125/11125 -f 11126/11126/11126 11125/11125/11125 11124/11124/11124 -g charts -o chart0000 -s off -f 11123/11123/11123 11124/11124/11124 11125/11125/11125 -f 11126/11126/11126 11125/11125/11125 11124/11124/11124 -v 10736.5 22656 3982.2 -vt 0.0187032 0.369403 -v 10736.5 22596 3922.2 -vt 0.0195344 0.36892 -v 10736.5 22596 5767.2 -vt 0.0195344 0.383759 -o mesh2234 -s off -f 11127/11127/11127 11128/11128/11128 11129/11129/11129 -g charts -o chart0000 -s off -f 11127/11127/11127 11128/11128/11128 11129/11129/11129 -v 10736.5 22656 3982.2 -vt 0.954697 0.428277 -v 10736.5 22596 5767.2 -vt 0.968828 0.428277 -v 10736.5 22656 5707.2 -vt 0.968338 0.427453 -o mesh2235 -s off -f 11130/11130/11130 11131/11131/11131 11132/11132/11132 -g charts -o chart0000 -s off -f 11130/11130/11130 11131/11131/11131 11132/11132/11132 -v 10736.5 22656 5707.2 -vt 0.560682 0.895388 -v 10736.5 22596 5767.2 -vt 0.561513 0.894889 -v 10736.5 23541 5707.2 -vt 0.561513 0.902308 -o mesh2236 -s off -f 11133/11133/11133 11134/11134/11134 11135/11135/11135 -g charts -o chart0000 -s off -f 11133/11133/11133 11134/11134/11134 11135/11135/11135 -v 10736.5 23601 3922.2 -vt 0.133416 0.909728 -v 10736.5 23541 3982.2 -vt 0.13293 0.908904 -v 10736.5 23601 5767.2 -vt 0.118454 0.909728 -o mesh2237 -s off -f 11136/11136/11136 11137/11137/11137 11138/11138/11138 -g charts -o chart0000 -s off -f 11136/11136/11136 11137/11137/11137 11138/11138/11138 -v 10736.5 23601 5767.2 -vt 0.398587 0.523908 -v 10736.5 23541 3982.2 -vt 0.412718 0.523907 -v 10736.5 23541 5707.2 -vt 0.399077 0.523083 -o mesh2238 -s off -f 11139/11139/11139 11140/11140/11140 11141/11141/11141 -g charts -o chart0000 -s off -f 11139/11139/11139 11140/11140/11140 11141/11141/11141 -v 10736.5 23601 5767.2 -vt 0.637157 0.998763 -v 10736.5 23541 5707.2 -vt 0.636661 0.997939 -v 10736.5 22596 5767.2 -vt 0.628845 0.998763 -o mesh2239 -s off -f 11142/11142/11142 11143/11143/11143 11144/11144/11144 -g charts -o chart0000 -s off -f 11142/11142/11142 11143/11143/11143 11144/11144/11144 -v 10856.5 23541 5707.2 -vt 0.445137 0.339242 -v 10811.5 23111.6 5707.2 -vt 0.441507 0.33986 -v 10736.5 23541 5707.2 -vt 0.445137 0.34089 -v 10856.5 22656 5707.2 -vt 0.437656 0.339242 -v 10811.5 23085.4 5707.2 -vt 0.441286 0.33986 -v 10781.5 23085.4 5707.2 -vt 0.441286 0.340272 -v 10781.5 23111.6 5707.2 -vt 0.441507 0.340272 -v 10736.5 22656 5707.2 -vt 0.437656 0.34089 -o mesh2240 -s off -f 11145/11145/11145 11146/11146/11146 11147/11147/11147 -f 11146/11146/11146 11145/11145/11145 11148/11148/11148 -f 11146/11146/11146 11148/11148/11148 11149/11149/11149 -f 11149/11149/11149 11148/11148/11148 11150/11150/11150 -f 11147/11147/11147 11151/11151/11151 11152/11152/11152 -f 11151/11151/11151 11147/11147/11147 11146/11146/11146 -f 11152/11152/11152 11151/11151/11151 11150/11150/11150 -f 11152/11152/11152 11150/11150/11150 11148/11148/11148 -g charts -o chart0000 -s off -f 11145/11145/11145 11146/11146/11146 11147/11147/11147 -f 11146/11146/11146 11145/11145/11145 11148/11148/11148 -f 11146/11146/11146 11148/11148/11148 11149/11149/11149 -f 11149/11149/11149 11148/11148/11148 11150/11150/11150 -f 11147/11147/11147 11151/11151/11151 11152/11152/11152 -f 11151/11151/11151 11147/11147/11147 11146/11146/11146 -f 11152/11152/11152 11151/11151/11151 11150/11150/11150 -f 11152/11152/11152 11150/11150/11150 11148/11148/11148 -v 10736.5 22656 5707.2 -vt 0.18246 0.946002 -v 10781.5 22656 4854.82 -vt 0.181837 0.939076 -v 10736.5 22656 3982.2 -vt 0.18246 0.931987 -v 10856.5 22656 5707.2 -vt 0.180798 0.946002 -v 10811.5 22656 4854.82 -vt 0.181421 0.939076 -v 10811.5 22656 4834.58 -vt 0.181421 0.938912 -v 10781.5 22656 4834.58 -vt 0.181837 0.938912 -v 10856.5 22656 3982.2 -vt 0.180798 0.931987 -o mesh2241 -s off -f 11153/11153/11153 11154/11154/11154 11155/11155/11155 -f 11154/11154/11154 11153/11153/11153 11156/11156/11156 -f 11154/11154/11154 11156/11156/11156 11157/11157/11157 -f 11157/11157/11157 11156/11156/11156 11158/11158/11158 -f 11155/11155/11155 11159/11159/11159 11160/11160/11160 -f 11159/11159/11159 11155/11155/11155 11154/11154/11154 -f 11160/11160/11160 11159/11159/11159 11158/11158/11158 -f 11160/11160/11160 11158/11158/11158 11156/11156/11156 -g charts -o chart0000 -s off -f 11153/11153/11153 11154/11154/11154 11155/11155/11155 -f 11154/11154/11154 11153/11153/11153 11156/11156/11156 -f 11154/11154/11154 11156/11156/11156 11157/11157/11157 -f 11157/11157/11157 11156/11156/11156 11158/11158/11158 -f 11155/11155/11155 11159/11159/11159 11160/11160/11160 -f 11159/11159/11159 11155/11155/11155 11154/11154/11154 -f 11160/11160/11160 11159/11159/11159 11158/11158/11158 -f 11160/11160/11160 11158/11158/11158 11156/11156/11156 -v 10736.5 23541 3982.2 -vt 0.406068 0.845424 -v 10781.5 23111.6 3982.2 -vt 0.402438 0.844806 -v 10856.5 23541 3982.2 -vt 0.406068 0.843776 -v 10736.5 22656 3982.2 -vt 0.398587 0.845424 -v 10781.5 23085.4 3982.2 -vt 0.402217 0.844806 -v 10811.5 23085.4 3982.2 -vt 0.402217 0.844394 -v 10811.5 23111.6 3982.2 -vt 0.402438 0.844394 -v 10856.5 22656 3982.2 -vt 0.398587 0.843776 -o mesh2242 -s off -f 11161/11161/11161 11162/11162/11162 11163/11163/11163 -f 11162/11162/11162 11161/11161/11161 11164/11164/11164 -f 11162/11162/11162 11164/11164/11164 11165/11165/11165 -f 11165/11165/11165 11164/11164/11164 11166/11166/11166 -f 11163/11163/11163 11167/11167/11167 11168/11168/11168 -f 11167/11167/11167 11163/11163/11163 11162/11162/11162 -f 11168/11168/11168 11167/11167/11167 11166/11166/11166 -f 11168/11168/11168 11166/11166/11166 11164/11164/11164 -g charts -o chart0000 -s off -f 11161/11161/11161 11162/11162/11162 11163/11163/11163 -f 11162/11162/11162 11161/11161/11161 11164/11164/11164 -f 11162/11162/11162 11164/11164/11164 11165/11165/11165 -f 11165/11165/11165 11164/11164/11164 11166/11166/11166 -f 11163/11163/11163 11167/11167/11167 11168/11168/11168 -f 11167/11167/11167 11163/11163/11163 11162/11162/11162 -f 11168/11168/11168 11167/11167/11167 11166/11166/11166 -f 11168/11168/11168 11166/11166/11166 11164/11164/11164 -v 10856.5 23541 3982.2 -vt 0.583125 0.987222 -v 10856.5 23541 5707.2 -vt 0.583125 0.973207 -v 10736.5 23541 5707.2 -vt 0.581463 0.973207 -v 10736.5 23541 3982.2 -vt 0.581463 0.987222 -o mesh2243 -s off -f 11169/11169/11169 11170/11170/11170 11171/11171/11171 -f 11169/11169/11169 11171/11171/11171 11172/11172/11172 -g charts -o chart0000 -s off -f 11169/11169/11169 11170/11170/11170 11171/11171/11171 -f 11169/11169/11169 11171/11171/11171 11172/11172/11172 -v 10811.5 23111.6 5707.2 -vt 0.0369908 0.459604 -v 10811.5 23085.4 5707.2 -vt 0.0361596 0.459604 -v 10811.5 23085.4 3982.2 -vt 0.0361596 0.445589 -v 10811.5 23111.6 3982.2 -vt 0.0369908 0.445589 -o mesh2244 -s off -f 11173/11173/11173 11174/11174/11174 11175/11175/11175 -f 11173/11173/11173 11175/11175/11175 11176/11176/11176 -g charts -o chart0000 -s off -f 11173/11173/11173 11174/11174/11174 11175/11175/11175 -f 11173/11173/11173 11175/11175/11175 11176/11176/11176 -v 10811.5 23085.4 5707.2 -vt 0.721945 0.652514 -v 10781.5 23085.4 5707.2 -vt 0.721114 0.652514 -v 10781.5 23085.4 3982.2 -vt 0.721114 0.6385 -v 10811.5 23085.4 3982.2 -vt 0.721945 0.6385 -o mesh2245 -s off -f 11177/11177/11177 11178/11178/11178 11179/11179/11179 -f 11177/11177/11177 11179/11179/11179 11180/11180/11180 -g charts -o chart0000 -s off -f 11177/11177/11177 11178/11178/11178 11179/11179/11179 -f 11177/11177/11177 11179/11179/11179 11180/11180/11180 -v 10781.5 23520.6 4854.82 -vt 0.931421 0.232894 -v 10811.5 23520.6 4854.82 -vt 0.931421 0.232069 -v 10811.5 23520.6 4834.58 -vt 0.93059 0.232069 -v 10781.5 23520.6 4834.58 -vt 0.93059 0.232894 -o mesh2246 -s off -f 11181/11181/11181 11182/11182/11182 11183/11183/11183 -f 11181/11181/11181 11183/11183/11183 11184/11184/11184 -g charts -o chart0000 -s off -f 11181/11181/11181 11182/11182/11182 11183/11183/11183 -f 11181/11181/11181 11183/11183/11183 11184/11184/11184 -v 10781.5 22656 4854.82 -vt 0.750208 0.298846 -v 10811.5 22656 4854.82 -vt 0.750208 0.29967 -v 10811.5 23520.6 4854.82 -vt 0.742727 0.29967 -v 10781.5 23520.6 4854.82 -vt 0.742727 0.298846 -o mesh2247 -s off -f 11185/11185/11185 11186/11186/11186 11187/11187/11187 -f 11185/11185/11185 11187/11187/11187 11188/11188/11188 -g charts -o chart0000 -s off -f 11185/11185/11185 11186/11186/11186 11187/11187/11187 -f 11185/11185/11185 11187/11187/11187 11188/11188/11188 -v 10811.5 22656 4854.82 -vt 0.212386 0.981451 -v 10811.5 22656 4834.58 -vt 0.212386 0.982275 -v 10811.5 23520.6 4834.58 -vt 0.204904 0.982275 -v 10811.5 23520.6 4854.82 -vt 0.204904 0.981451 -o mesh2248 -s off -f 11189/11189/11189 11190/11190/11190 11191/11191/11191 -f 11189/11189/11189 11191/11191/11191 11192/11192/11192 -g charts -o chart0000 -s off -f 11189/11189/11189 11190/11190/11190 11191/11191/11191 -f 11189/11189/11189 11191/11191/11191 11192/11192/11192 -v 10811.5 22656 4834.58 -vt 0.0727348 0.747321 -v 10781.5 22656 4834.58 -vt 0.0727348 0.748145 -v 10781.5 23520.6 4834.58 -vt 0.0652535 0.748145 -v 10811.5 23520.6 4834.58 -vt 0.0652535 0.747321 -o mesh2249 -s off -f 11193/11193/11193 11194/11194/11194 11195/11195/11195 -f 11193/11193/11193 11195/11195/11195 11196/11196/11196 -g charts -o chart0000 -s off -f 11193/11193/11193 11194/11194/11194 11195/11195/11195 -f 11193/11193/11193 11195/11195/11195 11196/11196/11196 -v 10781.5 22656 4834.58 -vt 0.135079 0.561006 -v 10781.5 22656 4854.82 -vt 0.13591 0.561006 -v 10781.5 23520.6 4854.82 -vt 0.13591 0.553586 -v 10781.5 23520.6 4834.58 -vt 0.135079 0.553586 -o mesh2250 -s off -f 11197/11197/11197 11198/11198/11198 11199/11199/11199 -f 11197/11197/11197 11199/11199/11199 11200/11200/11200 -g charts -o chart0000 -s off -f 11197/11197/11197 11198/11198/11198 11199/11199/11199 -f 11197/11197/11197 11199/11199/11199 11200/11200/11200 -v 10781.5 23111.6 5707.2 -vt 0.874896 0.427453 -v 10811.5 23111.6 5707.2 -vt 0.874065 0.427453 -v 10811.5 23111.6 3982.2 -vt 0.874065 0.413438 -v 10781.5 23111.6 3982.2 -vt 0.874896 0.413438 -o mesh2251 -s off -f 11201/11201/11201 11202/11202/11202 11203/11203/11203 -f 11201/11201/11201 11203/11203/11203 11204/11204/11204 -g charts -o chart0000 -s off -f 11201/11201/11201 11202/11202/11202 11203/11203/11203 -f 11201/11201/11201 11203/11203/11203 11204/11204/11204 -v 10781.5 23085.4 5707.2 -vt 0.936409 0.63108 -v 10781.5 23111.6 5707.2 -vt 0.936409 0.630256 -v 10781.5 23111.6 3982.2 -vt 0.922278 0.630256 -v 10781.5 23085.4 3982.2 -vt 0.922278 0.63108 -o mesh2252 -s off -f 11205/11205/11205 11206/11206/11206 11207/11207/11207 -f 11205/11205/11205 11207/11207/11207 11208/11208/11208 -g charts -o chart0000 -s off -f 11205/11205/11205 11206/11206/11206 11207/11207/11207 -f 11205/11205/11205 11207/11207/11207 11208/11208/11208 -v 16286.5 22558.5 3884.7 -vt 0.995428 0.306265 -v 16286.5 22596 3922.2 -vt 0.996259 0.30658 -v 16286.5 23638.5 3884.7 -vt 0.995428 0.315334 -v 16286.5 23601 3922.2 -vt 0.996259 0.315019 -o mesh2253 -s off -f 11209/11209/11209 11210/11210/11210 11211/11211/11211 -f 11212/11212/11212 11211/11211/11211 11210/11210/11210 -g charts -o chart0000 -s off -f 11209/11209/11209 11210/11210/11210 11211/11211/11211 -f 11212/11212/11212 11211/11211/11211 11210/11210/11210 -v 16286.5 22596 3922.2 -vt 0.184431 0.793487 -v 16286.5 22558.5 3884.7 -vt 0.184123 0.794312 -v 16286.5 22558.5 5804.7 -vt 0.199917 0.794312 -o mesh2254 -s off -f 11213/11213/11213 11214/11214/11214 11215/11215/11215 -g charts -o chart0000 -s off -f 11213/11213/11213 11214/11214/11214 11215/11215/11215 -v 16286.5 22596 3922.2 -vt 0.939734 0.937758 -v 16286.5 22558.5 5804.7 -vt 0.954696 0.937758 -v 16286.5 22596 5767.2 -vt 0.954393 0.936933 -o mesh2255 -s off -f 11216/11216/11216 11217/11217/11217 11218/11218/11218 -g charts -o chart0000 -s off -f 11216/11216/11216 11217/11217/11217 11218/11218/11218 -v 16286.5 22596 5767.2 -vt 0.343202 0.490107 -v 16286.5 22558.5 5804.7 -vt 0.342893 0.490931 -v 16286.5 23601 5767.2 -vt 0.351205 0.490931 -o mesh2256 -s off -f 11219/11219/11219 11220/11220/11220 11221/11221/11221 -g charts -o chart0000 -s off -f 11219/11219/11219 11220/11220/11220 11221/11221/11221 -v 16286.5 23638.5 3884.7 -vt 0.457606 0.931162 -v 16286.5 23601 3922.2 -vt 0.456775 0.930856 -v 16286.5 23638.5 5804.7 -vt 0.457606 0.915499 -o mesh2257 -s off -f 11222/11222/11222 11223/11223/11223 11224/11224/11224 -g charts -o chart0000 -s off -f 11222/11222/11222 11223/11223/11223 11224/11224/11224 -v 16286.5 23638.5 5804.7 -vt 0.184954 0.891591 -v 16286.5 23601 3922.2 -vt 0.199917 0.891591 -v 16286.5 23601 5767.2 -vt 0.185258 0.890767 -o mesh2258 -s off -f 11225/11225/11225 11226/11226/11226 11227/11227/11227 -g charts -o chart0000 -s off -f 11225/11225/11225 11226/11226/11226 11227/11227/11227 -v 16286.5 23638.5 5804.7 -vt 0.564007 0.823166 -v 16286.5 23601 5767.2 -vt 0.563689 0.822341 -v 16286.5 22558.5 5804.7 -vt 0.554863 0.823166 -o mesh2259 -s off -f 11228/11228/11228 11229/11229/11229 11230/11230/11230 -g charts -o chart0000 -s off -f 11228/11228/11228 11229/11229/11229 11230/11230/11230 -v 16451.5 23638.5 3884.7 -vt 0.624688 0.734955 -v 16451.5 23601 3922.2 -vt 0.623857 0.73464 -v 16451.5 22558.5 3884.7 -vt 0.624688 0.725886 -v 16451.5 22596 3922.2 -vt 0.623857 0.726201 -o mesh2260 -s off -f 11231/11231/11231 11232/11232/11232 11233/11233/11233 -f 11234/11234/11234 11233/11233/11233 11232/11232/11232 -g charts -o chart0000 -s off -f 11231/11231/11231 11232/11232/11232 11233/11233/11233 -f 11234/11234/11234 11233/11233/11233 11232/11232/11232 -v 16451.5 23601 3922.2 -vt 0.468412 0.92982 -v 16451.5 23638.5 3884.7 -vt 0.469243 0.929514 -v 16451.5 23638.5 5804.7 -vt 0.469243 0.945177 -o mesh2261 -s off -f 11235/11235/11235 11236/11236/11236 11237/11237/11237 -g charts -o chart0000 -s off -f 11235/11235/11235 11236/11236/11236 11237/11237/11237 -v 16451.5 23601 3922.2 -vt 0.972984 0.351608 -v 16451.5 23638.5 5804.7 -vt 0.987947 0.351608 -v 16451.5 23601 5767.2 -vt 0.987643 0.350783 -o mesh2262 -s off -f 11238/11238/11238 11239/11239/11239 11240/11240/11240 -g charts -o chart0000 -s off -f 11238/11238/11238 11239/11239/11239 11240/11240/11240 -v 16451.5 23601 5767.2 -vt 0.894324 0.39695 -v 16451.5 23638.5 5804.7 -vt 0.894015 0.397774 -v 16451.5 22596 5767.2 -vt 0.902327 0.397774 -o mesh2263 -s off -f 11241/11241/11241 11242/11242/11242 11243/11243/11243 -g charts -o chart0000 -s off -f 11241/11241/11241 11242/11242/11242 11243/11243/11243 -v 16451.5 22558.5 3884.7 -vt 0.746883 0.65169 -v 16451.5 22596 3922.2 -vt 0.746574 0.650866 -v 16451.5 22558.5 5804.7 -vt 0.731089 0.65169 -o mesh2264 -s off -f 11244/11244/11244 11245/11245/11245 11246/11246/11246 -g charts -o chart0000 -s off -f 11244/11244/11244 11245/11245/11245 11246/11246/11246 -v 16451.5 22558.5 5804.7 -vt 0.421031 0.888293 -v 16451.5 22596 3922.2 -vt 0.435993 0.888293 -v 16451.5 22596 5767.2 -vt 0.421335 0.887469 -o mesh2265 -s off -f 11247/11247/11247 11248/11248/11248 11249/11249/11249 -g charts -o chart0000 -s off -f 11247/11247/11247 11248/11248/11248 11249/11249/11249 -v 16451.5 22558.5 5804.7 -vt 0.646301 0.316158 -v 16451.5 22596 5767.2 -vt 0.64547 0.315844 -v 16451.5 23638.5 5804.7 -vt 0.646301 0.30709 -o mesh2266 -s off -f 11250/11250/11250 11251/11251/11251 11252/11252/11252 -g charts -o chart0000 -s off -f 11250/11250/11250 11251/11251/11251 11252/11252/11252 -v 16286.5 23638.5 5804.7 -vt 0.462594 0.309563 -v 16286.5 22558.5 5804.7 -vt 0.471737 0.309563 -v 16451.5 22558.5 5804.7 -vt 0.471737 0.311212 -v 16451.5 23638.5 5804.7 -vt 0.462594 0.311212 -o mesh2267 -s off -f 11253/11253/11253 11254/11254/11254 11255/11255/11255 -f 11253/11253/11253 11255/11255/11255 11256/11256/11256 -g charts -o chart0000 -s off -f 11253/11253/11253 11254/11254/11254 11255/11255/11255 -f 11253/11253/11253 11255/11255/11255 11256/11256/11256 -v 16286.5 22558.5 5804.7 -vt 0.0694098 0.674773 -v 16286.5 22558.5 3884.7 -vt 0.0852036 0.674773 -v 16451.5 22558.5 3884.7 -vt 0.0852036 0.676422 -v 16451.5 22558.5 5804.7 -vt 0.0694098 0.676422 -o mesh2268 -s off -f 11257/11257/11257 11258/11258/11258 11259/11259/11259 -f 11257/11257/11257 11259/11259/11259 11260/11260/11260 -g charts -o chart0000 -s off -f 11257/11257/11257 11258/11258/11258 11259/11259/11259 -f 11257/11257/11257 11259/11259/11259 11260/11260/11260 -v 16286.5 22558.5 3884.7 -vt 0.170823 0.826463 -v 16286.5 23638.5 3884.7 -vt 0.170823 0.817395 -v 16451.5 23638.5 3884.7 -vt 0.16916 0.817395 -v 16451.5 22558.5 3884.7 -vt 0.16916 0.826463 -o mesh2269 -s off -f 11261/11261/11261 11262/11262/11262 11263/11263/11263 -f 11261/11261/11261 11263/11263/11263 11264/11264/11264 -g charts -o chart0000 -s off -f 11261/11261/11261 11262/11262/11262 11263/11263/11263 -f 11261/11261/11261 11263/11263/11263 11264/11264/11264 -v 16286.5 23638.5 3884.7 -vt 0.00457182 0.645919 -v 16286.5 23638.5 5804.7 -vt 0.00457182 0.630256 -v 16451.5 23638.5 5804.7 -vt 0.00290939 0.630256 -v 16451.5 23638.5 3884.7 -vt 0.00290939 0.645919 -o mesh2270 -s off -f 11265/11265/11265 11266/11266/11266 11267/11267/11267 -f 11265/11265/11265 11267/11267/11267 11268/11268/11268 -g charts -o chart0000 -s off -f 11265/11265/11265 11266/11266/11266 11267/11267/11267 -f 11265/11265/11265 11267/11267/11267 11268/11268/11268 -v 16451.5 23601 3922.2 -vt 0.915627 0.552762 -v 16406.5 23601 3922.2 -vt 0.915174 0.552762 -v 16406.5 22596 3922.2 -vt 0.915174 0.544518 -v 16451.5 22596 3922.2 -vt 0.915627 0.544518 -v 16286.5 23601 3922.2 -vt 0.913965 0.552762 -v 16286.5 22596 3922.2 -vt 0.913965 0.544518 -o mesh2271 -s off -f 11269/11269/11269 11270/11270/11270 11271/11271/11271 -f 11269/11269/11269 11271/11271/11271 11272/11272/11272 -f 11273/11273/11273 11274/11274/11274 11271/11271/11271 -f 11273/11273/11273 11271/11271/11271 11270/11270/11270 -g charts -o chart0000 -s off -f 11269/11269/11269 11270/11270/11270 11271/11271/11271 -f 11269/11269/11269 11271/11271/11271 11272/11272/11272 -f 11273/11273/11273 11274/11274/11274 11271/11271/11271 -f 11273/11273/11273 11271/11271/11271 11270/11270/11270 -v 16451.5 22596 3922.2 -vt 0.0652535 0.612119 -v 16406.5 22596 3922.2 -vt 0.0652535 0.612568 -v 16406.5 22596 5767.2 -vt 0.0502909 0.612568 -v 16451.5 22596 5767.2 -vt 0.0502909 0.612119 -v 16286.5 22596 3922.2 -vt 0.0652535 0.613767 -v 16286.5 22596 5767.2 -vt 0.0502909 0.613767 -o mesh2272 -s off -f 11275/11275/11275 11276/11276/11276 11277/11277/11277 -f 11275/11275/11275 11277/11277/11277 11278/11278/11278 -f 11279/11279/11279 11280/11280/11280 11277/11277/11277 -f 11279/11279/11279 11277/11277/11277 11276/11276/11276 -g charts -o chart0000 -s off -f 11275/11275/11275 11276/11276/11276 11277/11277/11277 -f 11275/11275/11275 11277/11277/11277 11278/11278/11278 -f 11279/11279/11279 11280/11280/11280 11277/11277/11277 -f 11279/11279/11279 11277/11277/11277 11276/11276/11276 -v 16451.5 22596 5767.2 -vt 0.777639 0.889942 -v 16406.5 22596 5767.2 -vt 0.778093 0.889942 -v 16406.5 23601 5767.2 -vt 0.778093 0.881698 -v 16451.5 23601 5767.2 -vt 0.777639 0.881698 -v 16286.5 22596 5767.2 -vt 0.779302 0.889942 -v 16286.5 23601 5767.2 -vt 0.779302 0.881698 -o mesh2273 -s off -f 11281/11281/11281 11282/11282/11282 11283/11283/11283 -f 11281/11281/11281 11283/11283/11283 11284/11284/11284 -f 11285/11285/11285 11286/11286/11286 11283/11283/11283 -f 11285/11285/11285 11283/11283/11283 11282/11282/11282 -g charts -o chart0000 -s off -f 11281/11281/11281 11282/11282/11282 11283/11283/11283 -f 11281/11281/11281 11283/11283/11283 11284/11284/11284 -f 11285/11285/11285 11286/11286/11286 11283/11283/11283 -f 11285/11285/11285 11283/11283/11283 11282/11282/11282 -v 16451.5 23601 5767.2 -vt 0.723608 0.475268 -v 16406.5 23601 5767.2 -vt 0.723608 0.474818 -v 16406.5 23601 3922.2 -vt 0.708645 0.474818 -v 16451.5 23601 3922.2 -vt 0.708645 0.475268 -v 16286.5 23601 5767.2 -vt 0.723608 0.473619 -v 16286.5 23601 3922.2 -vt 0.708645 0.473619 -o mesh2274 -s off -f 11287/11287/11287 11288/11288/11288 11289/11289/11289 -f 11287/11287/11287 11289/11289/11289 11290/11290/11290 -f 11291/11291/11291 11292/11292/11292 11289/11289/11289 -f 11291/11291/11291 11289/11289/11289 11288/11288/11288 -g charts -o chart0000 -s off -f 11287/11287/11287 11288/11288/11288 11289/11289/11289 -f 11287/11287/11287 11289/11289/11289 11290/11290/11290 -f 11291/11291/11291 11292/11292/11292 11289/11289/11289 -f 11291/11291/11291 11289/11289/11289 11288/11288/11288 -v 16406.5 23601 3922.2 -vt 0.806733 0.776999 -v 16406.5 23541 3982.2 -vt 0.805902 0.776507 -v 16406.5 22596 3922.2 -vt 0.806733 0.768755 -v 16406.5 22656 3982.2 -vt 0.805902 0.769247 -o mesh2275 -s off -f 11293/11293/11293 11294/11294/11294 11295/11295/11295 -f 11296/11296/11296 11295/11295/11295 11294/11294/11294 -g charts -o chart0000 -s off -f 11293/11293/11293 11294/11294/11294 11295/11295/11295 -f 11296/11296/11296 11295/11295/11295 11294/11294/11294 -v 16406.5 23541 3982.2 -vt 0.00540316 0.481521 -v 16406.5 23601 3922.2 -vt 0.00623433 0.481039 -v 16406.5 23601 5767.2 -vt 0.00623433 0.495878 -o mesh2276 -s off -f 11297/11297/11297 11298/11298/11298 11299/11299/11299 -g charts -o chart0000 -s off -f 11297/11297/11297 11298/11298/11298 11299/11299/11299 -v 16406.5 23541 3982.2 -vt 0.815046 0.534625 -v 16406.5 23601 5767.2 -vt 0.829177 0.534625 -v 16406.5 23541 5707.2 -vt 0.828687 0.5338 -o mesh2277 -s off -f 11300/11300/11300 11301/11301/11301 11302/11302/11302 -g charts -o chart0000 -s off -f 11300/11300/11300 11301/11301/11301 11302/11302/11302 -v 16406.5 23541 5707.2 -vt 0.234502 0.886645 -v 16406.5 23601 5767.2 -vt 0.233998 0.887469 -v 16406.5 22656 5707.2 -vt 0.24148 0.887469 -o mesh2278 -s off -f 11303/11303/11303 11304/11304/11304 11305/11305/11305 -g charts -o chart0000 -s off -f 11303/11303/11303 11304/11304/11304 11305/11305/11305 -v 16406.5 22596 3922.2 -vt 0.240648 0.946826 -v 16406.5 22656 3982.2 -vt 0.240162 0.946002 -v 16406.5 22596 5767.2 -vt 0.225686 0.946826 -o mesh2279 -s off -f 11306/11306/11306 11307/11307/11307 11308/11308/11308 -g charts -o chart0000 -s off -f 11306/11306/11306 11307/11307/11307 11308/11308/11308 -v 16406.5 22596 5767.2 -vt 0.982128 0.485161 -v 16406.5 22656 3982.2 -vt 0.982128 0.499175 -v 16406.5 22656 5707.2 -vt 0.981297 0.485647 -o mesh2280 -s off -f 11309/11309/11309 11310/11310/11310 11311/11311/11311 -g charts -o chart0000 -s off -f 11309/11309/11309 11310/11310/11310 11311/11311/11311 -v 16406.5 22596 5767.2 -vt 0.499169 0.817395 -v 16406.5 22656 5707.2 -vt 0.498672 0.81657 -v 16406.5 23601 5767.2 -vt 0.490856 0.817395 -o mesh2281 -s off -f 11312/11312/11312 11313/11313/11313 11314/11314/11314 -g charts -o chart0000 -s off -f 11312/11312/11312 11313/11313/11313 11314/11314/11314 -v 16286.5 22656 5707.2 -vt 0.070241 0.997939 -v 16331.5 23085.4 5707.2 -vt 0.0666113 0.997321 -v 16406.5 22656 5707.2 -vt 0.070241 0.99629 -v 16286.5 23541 5707.2 -vt 0.0627598 0.997939 -v 16331.5 23111.6 5707.2 -vt 0.0663894 0.997321 -v 16361.5 23111.6 5707.2 -vt 0.0663894 0.996908 -v 16361.5 23085.4 5707.2 -vt 0.0666113 0.996908 -v 16406.5 23541 5707.2 -vt 0.0627598 0.99629 -o mesh2282 -s off -f 11315/11315/11315 11316/11316/11316 11317/11317/11317 -f 11316/11316/11316 11315/11315/11315 11318/11318/11318 -f 11316/11316/11316 11318/11318/11318 11319/11319/11319 -f 11319/11319/11319 11318/11318/11318 11320/11320/11320 -f 11317/11317/11317 11321/11321/11321 11322/11322/11322 -f 11321/11321/11321 11317/11317/11317 11316/11316/11316 -f 11322/11322/11322 11321/11321/11321 11320/11320/11320 -f 11322/11322/11322 11320/11320/11320 11318/11318/11318 -g charts -o chart0000 -s off -f 11315/11315/11315 11316/11316/11316 11317/11317/11317 -f 11316/11316/11316 11315/11315/11315 11318/11318/11318 -f 11316/11316/11316 11318/11318/11318 11319/11319/11319 -f 11319/11319/11319 11318/11318/11318 11320/11320/11320 -f 11317/11317/11317 11321/11321/11321 11322/11322/11322 -f 11321/11321/11321 11317/11317/11317 11316/11316/11316 -f 11322/11322/11322 11321/11321/11321 11320/11320/11320 -f 11322/11322/11322 11320/11320/11320 11318/11318/11318 -v 16406.5 23541 5707.2 -vt 0.412718 0.638499 -v 16361.5 23541 4854.82 -vt 0.413342 0.631574 -v 16406.5 23541 3982.2 -vt 0.412718 0.624485 -v 16286.5 23541 5707.2 -vt 0.414381 0.638499 -v 16331.5 23541 4854.82 -vt 0.413757 0.631574 -v 16331.5 23541 4834.58 -vt 0.413757 0.63141 -v 16361.5 23541 4834.58 -vt 0.413342 0.63141 -v 16286.5 23541 3982.2 -vt 0.414381 0.624485 -o mesh2283 -s off -f 11323/11323/11323 11324/11324/11324 11325/11325/11325 -f 11324/11324/11324 11323/11323/11323 11326/11326/11326 -f 11324/11324/11324 11326/11326/11326 11327/11327/11327 -f 11327/11327/11327 11326/11326/11326 11328/11328/11328 -f 11325/11325/11325 11329/11329/11329 11330/11330/11330 -f 11329/11329/11329 11325/11325/11325 11324/11324/11324 -f 11330/11330/11330 11329/11329/11329 11328/11328/11328 -f 11330/11330/11330 11328/11328/11328 11326/11326/11326 -g charts -o chart0000 -s off -f 11323/11323/11323 11324/11324/11324 11325/11325/11325 -f 11324/11324/11324 11323/11323/11323 11326/11326/11326 -f 11324/11324/11324 11326/11326/11326 11327/11327/11327 -f 11327/11327/11327 11326/11326/11326 11328/11328/11328 -f 11325/11325/11325 11329/11329/11329 11330/11330/11330 -f 11329/11329/11329 11325/11325/11325 11324/11324/11324 -f 11330/11330/11330 11329/11329/11329 11328/11328/11328 -f 11330/11330/11330 11328/11328/11328 11326/11326/11326 -v 16406.5 22656 3982.2 -vt 0.651288 0.525556 -v 16361.5 23085.4 3982.2 -vt 0.647659 0.526175 -v 16286.5 22656 3982.2 -vt 0.651288 0.527205 -v 16406.5 23541 3982.2 -vt 0.643807 0.525556 -v 16361.5 23111.6 3982.2 -vt 0.647437 0.526175 -v 16331.5 23111.6 3982.2 -vt 0.647437 0.526587 -v 16331.5 23085.4 3982.2 -vt 0.647659 0.526587 -v 16286.5 23541 3982.2 -vt 0.643807 0.527205 -o mesh2284 -s off -f 11331/11331/11331 11332/11332/11332 11333/11333/11333 -f 11332/11332/11332 11331/11331/11331 11334/11334/11334 -f 11332/11332/11332 11334/11334/11334 11335/11335/11335 -f 11335/11335/11335 11334/11334/11334 11336/11336/11336 -f 11333/11333/11333 11337/11337/11337 11338/11338/11338 -f 11337/11337/11337 11333/11333/11333 11332/11332/11332 -f 11338/11338/11338 11337/11337/11337 11336/11336/11336 -f 11338/11338/11338 11336/11336/11336 11334/11334/11334 -g charts -o chart0000 -s off -f 11331/11331/11331 11332/11332/11332 11333/11333/11333 -f 11332/11332/11332 11331/11331/11331 11334/11334/11334 -f 11332/11332/11332 11334/11334/11334 11335/11335/11335 -f 11335/11335/11335 11334/11334/11334 11336/11336/11336 -f 11333/11333/11333 11337/11337/11337 11338/11338/11338 -f 11337/11337/11337 11333/11333/11333 11332/11332/11332 -f 11338/11338/11338 11337/11337/11337 11336/11336/11336 -f 11338/11338/11338 11336/11336/11336 11334/11334/11334 -v 16286.5 22656 3982.2 -vt 0.462593 0.342539 -v 16286.5 22656 5707.2 -vt 0.462593 0.328524 -v 16406.5 22656 5707.2 -vt 0.460931 0.328524 -v 16406.5 22656 3982.2 -vt 0.460931 0.342539 -o mesh2285 -s off -f 11339/11339/11339 11340/11340/11340 11341/11341/11341 -f 11339/11339/11339 11341/11341/11341 11342/11342/11342 -g charts -o chart0000 -s off -f 11339/11339/11339 11340/11340/11340 11341/11341/11341 -f 11339/11339/11339 11341/11341/11341 11342/11342/11342 -v 16331.5 23085.4 5707.2 -vt 0.633832 0.601401 -v 16331.5 23111.6 5707.2 -vt 0.633832 0.600577 -v 16331.5 23111.6 3982.2 -vt 0.619701 0.600577 -v 16331.5 23085.4 3982.2 -vt 0.619701 0.601401 -o mesh2286 -s off -f 11343/11343/11343 11344/11344/11344 11345/11345/11345 -f 11343/11343/11343 11345/11345/11345 11346/11346/11346 -g charts -o chart0000 -s off -f 11343/11343/11343 11344/11344/11344 11345/11345/11345 -f 11343/11343/11343 11345/11345/11345 11346/11346/11346 -v 16331.5 23111.6 5707.2 -vt 0.160848 0.611294 -v 16361.5 23111.6 5707.2 -vt 0.160017 0.611294 -v 16361.5 23111.6 3982.2 -vt 0.160017 0.597279 -v 16331.5 23111.6 3982.2 -vt 0.160848 0.597279 -o mesh2287 -s off -f 11347/11347/11347 11348/11348/11348 11349/11349/11349 -f 11347/11347/11347 11349/11349/11349 11350/11350/11350 -g charts -o chart0000 -s off -f 11347/11347/11347 11348/11348/11348 11349/11349/11349 -f 11347/11347/11347 11349/11349/11349 11350/11350/11350 -v 16361.5 22676.3 4854.82 -vt 0.238986 0.948475 -v 16331.5 22676.3 4854.82 -vt 0.239817 0.948475 -v 16331.5 22676.3 4834.58 -vt 0.239817 0.949299 -v 16361.5 22676.3 4834.58 -vt 0.238986 0.949299 -o mesh2288 -s off -f 11351/11351/11351 11352/11352/11352 11353/11353/11353 -f 11351/11351/11351 11353/11353/11353 11354/11354/11354 -g charts -o chart0000 -s off -f 11351/11351/11351 11352/11352/11352 11353/11353/11353 -f 11351/11351/11351 11353/11353/11353 11354/11354/11354 -v 16361.5 23541 4854.82 -vt 0.77847 0.312036 -v 16331.5 23541 4854.82 -vt 0.77847 0.311212 -v 16331.5 22676.3 4854.82 -vt 0.770989 0.311212 -v 16361.5 22676.3 4854.82 -vt 0.770989 0.312036 -o mesh2289 -s off -f 11355/11355/11355 11356/11356/11356 11357/11357/11357 -f 11355/11355/11355 11357/11357/11357 11358/11358/11358 -g charts -o chart0000 -s off -f 11355/11355/11355 11356/11356/11356 11357/11357/11357 -f 11355/11355/11355 11357/11357/11357 11358/11358/11358 -v 16331.5 23541 4854.82 -vt 0.79842 0.351608 -v 16331.5 23541 4834.58 -vt 0.797589 0.351608 -v 16331.5 22676.3 4834.58 -vt 0.797589 0.344188 -v 16331.5 22676.3 4854.82 -vt 0.79842 0.344188 -o mesh2290 -s off -f 11359/11359/11359 11360/11360/11360 11361/11361/11361 -f 11359/11359/11359 11361/11361/11361 11362/11362/11362 -g charts -o chart0000 -s off -f 11359/11359/11359 11360/11360/11360 11361/11361/11361 -f 11359/11359/11359 11361/11361/11361 11362/11362/11362 -v 16331.5 23541 4834.58 -vt 0.556525 0.856966 -v 16361.5 23541 4834.58 -vt 0.556525 0.856142 -v 16361.5 22676.3 4834.58 -vt 0.549044 0.856142 -v 16331.5 22676.3 4834.58 -vt 0.549044 0.856966 -o mesh2291 -s off -f 11363/11363/11363 11364/11364/11364 11365/11365/11365 -f 11363/11363/11363 11365/11365/11365 11366/11366/11366 -g charts -o chart0000 -s off -f 11363/11363/11363 11364/11364/11364 11365/11365/11365 -f 11363/11363/11363 11365/11365/11365 11366/11366/11366 -v 16361.5 23541 4834.58 -vt 0.681214 0.603875 -v 16361.5 23541 4854.82 -vt 0.681214 0.60305 -v 16361.5 22676.3 4854.82 -vt 0.673732 0.60305 -v 16361.5 22676.3 4834.58 -vt 0.673732 0.603875 -o mesh2292 -s off -f 11367/11367/11367 11368/11368/11368 11369/11369/11369 -f 11367/11367/11367 11369/11369/11369 11370/11370/11370 -g charts -o chart0000 -s off -f 11367/11367/11367 11368/11368/11368 11369/11369/11369 -f 11367/11367/11367 11369/11369/11369 11370/11370/11370 -v 16361.5 23085.4 5707.2 -vt 0.913965 0.304617 -v 16331.5 23085.4 5707.2 -vt 0.913134 0.304617 -v 16331.5 23085.4 3982.2 -vt 0.913134 0.290602 -v 16361.5 23085.4 3982.2 -vt 0.913965 0.290602 -o mesh2293 -s off -f 11371/11371/11371 11372/11372/11372 11373/11373/11373 -f 11371/11371/11371 11373/11373/11373 11374/11374/11374 -g charts -o chart0000 -s off -f 11371/11371/11371 11372/11372/11372 11373/11373/11373 -f 11371/11371/11371 11373/11373/11373 11374/11374/11374 -v 16361.5 23111.6 5707.2 -vt 0.867415 0.0812035 -v 16361.5 23085.4 5707.2 -vt 0.866584 0.0812035 -v 16361.5 23085.4 3982.2 -vt 0.866584 0.0671888 -v 16361.5 23111.6 3982.2 -vt 0.867415 0.0671888 -o mesh2294 -s off -f 11375/11375/11375 11376/11376/11376 11377/11377/11377 -f 11375/11375/11375 11377/11377/11377 11378/11378/11378 -g charts -o chart0000 -s off -f 11375/11375/11375 11376/11376/11376 11377/11377/11377 -f 11375/11375/11375 11377/11377/11377 11378/11378/11378 -v 16286.5 23683.5 3884.7 -vt 0.955528 0.924567 -v 16286.5 23721 3922.2 -vt 0.955845 0.925391 -v 16286.5 24763.5 3884.7 -vt 0.964672 0.924567 -v 16286.5 24726 3922.2 -vt 0.964354 0.925391 -o mesh2295 -s off -f 11379/11379/11379 11380/11380/11380 11381/11381/11381 -f 11382/11382/11382 11381/11381/11381 11380/11380/11380 -g charts -o chart0000 -s off -f 11379/11379/11379 11380/11380/11380 11381/11381/11381 -f 11382/11382/11382 11381/11381/11381 11380/11380/11380 -v 16286.5 23721 3922.2 -vt 0.881023 0.61047 -v 16286.5 23683.5 3884.7 -vt 0.880715 0.611294 -v 16286.5 23683.5 5804.7 -vt 0.896509 0.611294 -o mesh2296 -s off -f 11383/11383/11383 11384/11384/11384 11385/11385/11385 -g charts -o chart0000 -s off -f 11383/11383/11383 11384/11384/11384 11385/11385/11385 -v 16286.5 23721 3922.2 -vt 0.244805 0.599753 -v 16286.5 23683.5 5804.7 -vt 0.259767 0.599753 -v 16286.5 23721 5767.2 -vt 0.259463 0.598928 -o mesh2297 -s off -f 11386/11386/11386 11387/11387/11387 11388/11388/11388 -g charts -o chart0000 -s off -f 11386/11386/11386 11387/11387/11387 11388/11388/11388 -v 16286.5 23721 5767.2 -vt 0.948047 0.886127 -v 16286.5 23683.5 5804.7 -vt 0.948878 0.88582 -v 16286.5 24726 5767.2 -vt 0.948878 0.894064 -o mesh2298 -s off -f 11389/11389/11389 11390/11390/11390 11391/11391/11391 -g charts -o chart0000 -s off -f 11389/11389/11389 11390/11390/11390 11391/11391/11391 -v 16286.5 24763.5 3884.7 -vt 0.460931 0.874279 -v 16286.5 24726 3922.2 -vt 0.4601 0.873973 -v 16286.5 24763.5 5804.7 -vt 0.460931 0.858615 -o mesh2299 -s off -f 11392/11392/11392 11393/11393/11393 11394/11394/11394 -g charts -o chart0000 -s off -f 11392/11392/11392 11393/11393/11393 11394/11394/11394 -v 16286.5 24763.5 5804.7 -vt 0.270573 0.598928 -v 16286.5 24726 3922.2 -vt 0.270573 0.613767 -v 16286.5 24726 5767.2 -vt 0.269742 0.59923 -o mesh2300 -s off -f 11395/11395/11395 11396/11396/11396 11397/11397/11397 -g charts -o chart0000 -s off -f 11395/11395/11395 11396/11396/11396 11397/11397/11397 -v 16286.5 24763.5 5804.7 -vt 0.808396 0.645919 -v 16286.5 24726 5767.2 -vt 0.807564 0.645604 -v 16286.5 23683.5 5804.7 -vt 0.808396 0.636851 -o mesh2301 -s off -f 11398/11398/11398 11399/11399/11399 11400/11400/11400 -g charts -o chart0000 -s off -f 11398/11398/11398 11399/11399/11399 11400/11400/11400 -v 16451.5 24763.5 3884.7 -vt 0.150041 0.309563 -v 16451.5 24726 3922.2 -vt 0.14921 0.309248 -v 16451.5 23683.5 3884.7 -vt 0.150041 0.300495 -v 16451.5 23721 3922.2 -vt 0.14921 0.30081 -o mesh2302 -s off -f 11401/11401/11401 11402/11402/11402 11403/11403/11403 -f 11404/11404/11404 11403/11403/11403 11402/11402/11402 -g charts -o chart0000 -s off -f 11401/11401/11401 11402/11402/11402 11403/11403/11403 -f 11404/11404/11404 11403/11403/11403 11402/11402/11402 -v 16451.5 24726 3922.2 -vt 0.371987 0.389836 -v 16451.5 24763.5 3884.7 -vt 0.372818 0.38953 -v 16451.5 24763.5 5804.7 -vt 0.372818 0.405194 -o mesh2303 -s off -f 11405/11405/11405 11406/11406/11406 11407/11407/11407 -g charts -o chart0000 -s off -f 11405/11405/11405 11406/11406/11406 11407/11407/11407 -v 16451.5 24726 3922.2 -vt 0.908146 0.634377 -v 16451.5 24763.5 5804.7 -vt 0.923109 0.634377 -v 16451.5 24726 5767.2 -vt 0.922805 0.633553 -o mesh2304 -s off -f 11408/11408/11408 11409/11409/11409 11410/11410/11410 -g charts -o chart0000 -s off -f 11408/11408/11408 11409/11409/11409 11410/11410/11410 -v 16451.5 24726 5767.2 -vt 0.412196 0.30709 -v 16451.5 24763.5 5804.7 -vt 0.411887 0.307914 -v 16451.5 23721 5767.2 -vt 0.420199 0.307914 -o mesh2305 -s off -f 11411/11411/11411 11412/11412/11412 11413/11413/11413 -g charts -o chart0000 -s off -f 11411/11411/11411 11412/11412/11412 11413/11413/11413 -v 16451.5 23683.5 3884.7 -vt 0.847465 0.0721351 -v 16451.5 23721 3922.2 -vt 0.846633 0.0718292 -v 16451.5 23683.5 5804.7 -vt 0.847465 0.0564716 -o mesh2306 -s off -f 11414/11414/11414 11415/11415/11415 11416/11416/11416 -g charts -o chart0000 -s off -f 11414/11414/11414 11415/11415/11415 11416/11416/11416 -v 16451.5 23683.5 5804.7 -vt 0.928096 0.966612 -v 16451.5 23721 3922.2 -vt 0.943059 0.966612 -v 16451.5 23721 5767.2 -vt 0.9284 0.965787 -o mesh2307 -s off -f 11417/11417/11417 11418/11418/11418 11419/11419/11419 -g charts -o chart0000 -s off -f 11417/11417/11417 11418/11418/11418 11419/11419/11419 -v 16451.5 23683.5 5804.7 -vt 0.814214 0.523083 -v 16451.5 23721 5767.2 -vt 0.813383 0.522769 -v 16451.5 24763.5 5804.7 -vt 0.814214 0.514015 -o mesh2308 -s off -f 11420/11420/11420 11421/11421/11421 11422/11422/11422 -g charts -o chart0000 -s off -f 11420/11420/11420 11421/11421/11421 11422/11422/11422 -v 16286.5 24763.5 5804.7 -vt 0.352037 0.420033 -v 16286.5 23683.5 5804.7 -vt 0.36118 0.420033 -v 16451.5 23683.5 5804.7 -vt 0.36118 0.421682 -v 16451.5 24763.5 5804.7 -vt 0.352037 0.421682 -o mesh2309 -s off -f 11423/11423/11423 11424/11424/11424 11425/11425/11425 -f 11423/11423/11423 11425/11425/11425 11426/11426/11426 -g charts -o chart0000 -s off -f 11423/11423/11423 11424/11424/11424 11425/11425/11425 -f 11423/11423/11423 11425/11425/11425 11426/11426/11426 -v 16286.5 23683.5 5804.7 -vt 0.875727 0.384584 -v 16286.5 23683.5 3884.7 -vt 0.891521 0.384584 -v 16451.5 23683.5 3884.7 -vt 0.891521 0.386232 -v 16451.5 23683.5 5804.7 -vt 0.875727 0.386232 -o mesh2310 -s off -f 11427/11427/11427 11428/11428/11428 11429/11429/11429 -f 11427/11427/11427 11429/11429/11429 11430/11430/11430 -g charts -o chart0000 -s off -f 11427/11427/11427 11428/11428/11428 11429/11429/11429 -f 11427/11427/11427 11429/11429/11429 11430/11430/11430 -v 16286.5 23683.5 3884.7 -vt 0.806733 0.712696 -v 16286.5 24763.5 3884.7 -vt 0.797589 0.712696 -v 16451.5 24763.5 3884.7 -vt 0.797589 0.711047 -v 16451.5 23683.5 3884.7 -vt 0.806733 0.711047 -o mesh2311 -s off -f 11431/11431/11431 11432/11432/11432 11433/11433/11433 -f 11431/11431/11431 11433/11433/11433 11434/11434/11434 -g charts -o chart0000 -s off -f 11431/11431/11431 11432/11432/11432 11433/11433/11433 -f 11431/11431/11431 11433/11433/11433 11434/11434/11434 -v 16286.5 24763.5 3884.7 -vt 0.00207805 0.929514 -v 16286.5 24763.5 5804.7 -vt 0.00207805 0.91385 -v 16451.5 24763.5 5804.7 -vt 0.000415628 0.91385 -v 16451.5 24763.5 3884.7 -vt 0.000415628 0.929514 -o mesh2312 -s off -f 11435/11435/11435 11436/11436/11436 11437/11437/11437 -f 11435/11435/11435 11437/11437/11437 11438/11438/11438 -g charts -o chart0000 -s off -f 11435/11435/11435 11436/11436/11436 11437/11437/11437 -f 11435/11435/11435 11437/11437/11437 11438/11438/11438 -v 16451.5 24726 3922.2 -vt 0.309642 0.425804 -v 16406.5 24726 3922.2 -vt 0.309642 0.425354 -v 16406.5 23721 3922.2 -vt 0.30133 0.425354 -v 16451.5 23721 3922.2 -vt 0.30133 0.425804 -v 16286.5 24726 3922.2 -vt 0.309642 0.424155 -v 16286.5 23721 3922.2 -vt 0.30133 0.424155 -o mesh2313 -s off -f 11439/11439/11439 11440/11440/11440 11441/11441/11441 -f 11439/11439/11439 11441/11441/11441 11442/11442/11442 -f 11443/11443/11443 11444/11444/11444 11441/11441/11441 -f 11443/11443/11443 11441/11441/11441 11440/11440/11440 -g charts -o chart0000 -s off -f 11439/11439/11439 11440/11440/11440 11441/11441/11441 -f 11439/11439/11439 11441/11441/11441 11442/11442/11442 -f 11443/11443/11443 11444/11444/11444 11441/11441/11441 -f 11443/11443/11443 11441/11441/11441 11440/11440/11440 -v 16451.5 23721 3922.2 -vt 0.189942 0.938582 -v 16406.5 23721 3922.2 -vt 0.190395 0.938582 -v 16406.5 23721 5767.2 -vt 0.190395 0.923743 -v 16451.5 23721 5767.2 -vt 0.189942 0.923743 -v 16286.5 23721 3922.2 -vt 0.191604 0.938582 -v 16286.5 23721 5767.2 -vt 0.191604 0.923743 -o mesh2314 -s off -f 11445/11445/11445 11446/11446/11446 11447/11447/11447 -f 11445/11445/11445 11447/11447/11447 11448/11448/11448 -f 11449/11449/11449 11450/11450/11450 11447/11447/11447 -f 11449/11449/11449 11447/11447/11447 11446/11446/11446 -g charts -o chart0000 -s off -f 11445/11445/11445 11446/11446/11446 11447/11447/11447 -f 11445/11445/11445 11447/11447/11447 11448/11448/11448 -f 11449/11449/11449 11450/11450/11450 11447/11447/11447 -f 11449/11449/11449 11447/11447/11447 11446/11446/11446 -v 16451.5 23721 5767.2 -vt 0.066916 0.870157 -v 16406.5 23721 5767.2 -vt 0.0673694 0.870157 -v 16406.5 24726 5767.2 -vt 0.0673694 0.861913 -v 16451.5 24726 5767.2 -vt 0.066916 0.861913 -v 16286.5 23721 5767.2 -vt 0.0685785 0.870157 -v 16286.5 24726 5767.2 -vt 0.0685785 0.861913 -o mesh2315 -s off -f 11451/11451/11451 11452/11452/11452 11453/11453/11453 -f 11451/11451/11451 11453/11453/11453 11454/11454/11454 -f 11455/11455/11455 11456/11456/11456 11453/11453/11453 -f 11455/11455/11455 11453/11453/11453 11452/11452/11452 -g charts -o chart0000 -s off -f 11451/11451/11451 11452/11452/11452 11453/11453/11453 -f 11451/11451/11451 11453/11453/11453 11454/11454/11454 -f 11455/11455/11455 11456/11456/11456 11453/11453/11453 -f 11455/11455/11455 11453/11453/11453 11452/11452/11452 -v 16451.5 24726 5767.2 -vt 0.965503 0.120775 -v 16406.5 24726 5767.2 -vt 0.965049 0.120775 -v 16406.5 24726 3922.2 -vt 0.965049 0.105936 -v 16451.5 24726 3922.2 -vt 0.965503 0.105936 -v 16286.5 24726 5767.2 -vt 0.96384 0.120775 -v 16286.5 24726 3922.2 -vt 0.96384 0.105936 -o mesh2316 -s off -f 11457/11457/11457 11458/11458/11458 11459/11459/11459 -f 11457/11457/11457 11459/11459/11459 11460/11460/11460 -f 11461/11461/11461 11462/11462/11462 11459/11459/11459 -f 11461/11461/11461 11459/11459/11459 11458/11458/11458 -g charts -o chart0000 -s off -f 11457/11457/11457 11458/11458/11458 11459/11459/11459 -f 11457/11457/11457 11459/11459/11459 11460/11460/11460 -f 11461/11461/11461 11462/11462/11462 11459/11459/11459 -f 11461/11461/11461 11459/11459/11459 11458/11458/11458 -v 16406.5 24726 3922.2 -vt 0.233167 0.942704 -v 16406.5 24666 3982.2 -vt 0.232671 0.94188 -v 16406.5 23721 3922.2 -vt 0.224855 0.942704 -v 16406.5 23781 3982.2 -vt 0.225351 0.94188 -o mesh2317 -s off -f 11463/11463/11463 11464/11464/11464 11465/11465/11465 -f 11466/11466/11466 11465/11465/11465 11464/11464/11464 -g charts -o chart0000 -s off -f 11463/11463/11463 11464/11464/11464 11465/11465/11465 -f 11466/11466/11466 11465/11465/11465 11464/11464/11464 -v 16406.5 24666 3982.2 -vt 0.159672 0.747321 -v 16406.5 24726 3922.2 -vt 0.159185 0.748145 -v 16406.5 24726 5767.2 -vt 0.174148 0.748145 -o mesh2318 -s off -f 11467/11467/11467 11468/11468/11468 11469/11469/11469 -g charts -o chart0000 -s off -f 11467/11467/11467 11468/11468/11468 11469/11469/11469 -v 16406.5 24666 3982.2 -vt 0.137573 0.701978 -v 16406.5 24726 5767.2 -vt 0.151704 0.701978 -v 16406.5 24666 5707.2 -vt 0.151214 0.701154 -o mesh2319 -s off -f 11470/11470/11470 11471/11471/11471 11472/11472/11472 -g charts -o chart0000 -s off -f 11470/11470/11470 11471/11471/11471 11472/11472/11472 -v 16406.5 24666 5707.2 -vt 0.150545 0.702803 -v 16406.5 24726 5767.2 -vt 0.150042 0.703627 -v 16406.5 23781 5707.2 -vt 0.157523 0.703627 -o mesh2320 -s off -f 11473/11473/11473 11474/11474/11474 11475/11475/11475 -g charts -o chart0000 -s off -f 11473/11473/11473 11474/11474/11474 11475/11475/11475 -v 16406.5 23721 3922.2 -vt 0.328761 0.587386 -v 16406.5 23781 3982.2 -vt 0.328275 0.586562 -v 16406.5 23721 5767.2 -vt 0.313799 0.587387 -o mesh2321 -s off -f 11476/11476/11476 11477/11477/11477 11478/11478/11478 -g charts -o chart0000 -s off -f 11476/11476/11476 11477/11477/11477 11478/11478/11478 -v 16406.5 23721 5767.2 -vt 0.5399 0.373866 -v 16406.5 23781 3982.2 -vt 0.5399 0.387881 -v 16406.5 23781 5707.2 -vt 0.539069 0.374353 -o mesh2322 -s off -f 11479/11479/11479 11480/11480/11480 11481/11481/11481 -g charts -o chart0000 -s off -f 11479/11479/11479 11480/11480/11480 11481/11481/11481 -v 16406.5 23721 5767.2 -vt 0.12926 0.359027 -v 16406.5 23781 5707.2 -vt 0.128764 0.358203 -v 16406.5 24726 5767.2 -vt 0.120948 0.359027 -o mesh2323 -s off -f 11482/11482/11482 11483/11483/11483 11484/11484/11484 -g charts -o chart0000 -s off -f 11482/11482/11482 11483/11483/11483 11484/11484/11484 -v 16286.5 23781 5707.2 -vt 0.993765 0.481039 -v 16331.5 24210.4 5707.2 -vt 0.990136 0.48042 -v 16406.5 23781 5707.2 -vt 0.993765 0.47939 -v 16286.5 24666 5707.2 -vt 0.986284 0.481039 -v 16331.5 24236.6 5707.2 -vt 0.989914 0.48042 -v 16361.5 24236.6 5707.2 -vt 0.989914 0.480008 -v 16361.5 24210.4 5707.2 -vt 0.990136 0.480008 -v 16406.5 24666 5707.2 -vt 0.986284 0.47939 -o mesh2324 -s off -f 11485/11485/11485 11486/11486/11486 11487/11487/11487 -f 11486/11486/11486 11485/11485/11485 11488/11488/11488 -f 11486/11486/11486 11488/11488/11488 11489/11489/11489 -f 11489/11489/11489 11488/11488/11488 11490/11490/11490 -f 11487/11487/11487 11491/11491/11491 11492/11492/11492 -f 11491/11491/11491 11487/11487/11487 11486/11486/11486 -f 11492/11492/11492 11491/11491/11491 11490/11490/11490 -f 11492/11492/11492 11490/11490/11490 11488/11488/11488 -g charts -o chart0000 -s off -f 11485/11485/11485 11486/11486/11486 11487/11487/11487 -f 11486/11486/11486 11485/11485/11485 11488/11488/11488 -f 11486/11486/11486 11488/11488/11488 11489/11489/11489 -f 11489/11489/11489 11488/11488/11488 11490/11490/11490 -f 11487/11487/11487 11491/11491/11491 11492/11492/11492 -f 11491/11491/11491 11487/11487/11487 11486/11486/11486 -f 11492/11492/11492 11491/11491/11491 11490/11490/11490 -f 11492/11492/11492 11490/11490/11490 11488/11488/11488 -v 16406.5 24666 5707.2 -vt 0.968828 0.848722 -v 16361.5 24666 4854.82 -vt 0.969451 0.841797 -v 16406.5 24666 3982.2 -vt 0.968828 0.834707 -v 16286.5 24666 5707.2 -vt 0.97049 0.848722 -v 16331.5 24666 4854.82 -vt 0.969867 0.841797 -v 16331.5 24666 4834.58 -vt 0.969867 0.841632 -v 16361.5 24666 4834.58 -vt 0.969451 0.841632 -v 16286.5 24666 3982.2 -vt 0.97049 0.834707 -o mesh2325 -s off -f 11493/11493/11493 11494/11494/11494 11495/11495/11495 -f 11494/11494/11494 11493/11493/11493 11496/11496/11496 -f 11494/11494/11494 11496/11496/11496 11497/11497/11497 -f 11497/11497/11497 11496/11496/11496 11498/11498/11498 -f 11495/11495/11495 11499/11499/11499 11500/11500/11500 -f 11499/11499/11499 11495/11495/11495 11494/11494/11494 -f 11500/11500/11500 11499/11499/11499 11498/11498/11498 -f 11500/11500/11500 11498/11498/11498 11496/11496/11496 -g charts -o chart0000 -s off -f 11493/11493/11493 11494/11494/11494 11495/11495/11495 -f 11494/11494/11494 11493/11493/11493 11496/11496/11496 -f 11494/11494/11494 11496/11496/11496 11497/11497/11497 -f 11497/11497/11497 11496/11496/11496 11498/11498/11498 -f 11495/11495/11495 11499/11499/11499 11500/11500/11500 -f 11499/11499/11499 11495/11495/11495 11494/11494/11494 -f 11500/11500/11500 11499/11499/11499 11498/11498/11498 -f 11500/11500/11500 11498/11498/11498 11496/11496/11496 -v 16406.5 23781 3982.2 -vt 0.591438 0.982275 -v 16361.5 24210.4 3982.2 -vt 0.592061 0.978676 -v 16286.5 23781 3982.2 -vt 0.5931 0.982275 -v 16406.5 24666 3982.2 -vt 0.591438 0.974856 -v 16361.5 24236.6 3982.2 -vt 0.592061 0.978455 -v 16331.5 24236.6 3982.2 -vt 0.592477 0.978455 -v 16331.5 24210.4 3982.2 -vt 0.592477 0.978676 -v 16286.5 24666 3982.2 -vt 0.5931 0.974856 -o mesh2326 -s off -f 11501/11501/11501 11502/11502/11502 11503/11503/11503 -f 11502/11502/11502 11501/11501/11501 11504/11504/11504 -f 11502/11502/11502 11504/11504/11504 11505/11505/11505 -f 11505/11505/11505 11504/11504/11504 11506/11506/11506 -f 11503/11503/11503 11507/11507/11507 11508/11508/11508 -f 11507/11507/11507 11503/11503/11503 11502/11502/11502 -f 11508/11508/11508 11507/11507/11507 11506/11506/11506 -f 11508/11508/11508 11506/11506/11506 11504/11504/11504 -g charts -o chart0000 -s off -f 11501/11501/11501 11502/11502/11502 11503/11503/11503 -f 11502/11502/11502 11501/11501/11501 11504/11504/11504 -f 11502/11502/11502 11504/11504/11504 11505/11505/11505 -f 11505/11505/11505 11504/11504/11504 11506/11506/11506 -f 11503/11503/11503 11507/11507/11507 11508/11508/11508 -f 11507/11507/11507 11503/11503/11503 11502/11502/11502 -f 11508/11508/11508 11507/11507/11507 11506/11506/11506 -f 11508/11508/11508 11506/11506/11506 11504/11504/11504 -v 16286.5 23781 3982.2 -vt 0.795096 0.527205 -v 16286.5 23781 5707.2 -vt 0.780964 0.527205 -v 16406.5 23781 5707.2 -vt 0.780964 0.525556 -v 16406.5 23781 3982.2 -vt 0.795096 0.525556 -o mesh2327 -s off -f 11509/11509/11509 11510/11510/11510 11511/11511/11511 -f 11509/11509/11509 11511/11511/11511 11512/11512/11512 -g charts -o chart0000 -s off -f 11509/11509/11509 11510/11510/11510 11511/11511/11511 -f 11509/11509/11509 11511/11511/11511 11512/11512/11512 -v 16331.5 24210.4 5707.2 -vt 0.070241 0.669002 -v 16331.5 24236.6 5707.2 -vt 0.0694098 0.669002 -v 16331.5 24236.6 3982.2 -vt 0.0694098 0.654988 -v 16331.5 24210.4 3982.2 -vt 0.070241 0.654988 -o mesh2328 -s off -f 11513/11513/11513 11514/11514/11514 11515/11515/11515 -f 11513/11513/11513 11515/11515/11515 11516/11516/11516 -g charts -o chart0000 -s off -f 11513/11513/11513 11514/11514/11514 11515/11515/11515 -f 11513/11513/11513 11515/11515/11515 11516/11516/11516 -v 16331.5 24236.6 5707.2 -vt 0.756027 0.522259 -v 16361.5 24236.6 5707.2 -vt 0.756027 0.521434 -v 16361.5 24236.6 3982.2 -vt 0.741895 0.521434 -v 16331.5 24236.6 3982.2 -vt 0.741895 0.522259 -o mesh2329 -s off -f 11517/11517/11517 11518/11518/11518 11519/11519/11519 -f 11517/11517/11517 11519/11519/11519 11520/11520/11520 -g charts -o chart0000 -s off -f 11517/11517/11517 11518/11518/11518 11519/11519/11519 -f 11517/11517/11517 11519/11519/11519 11520/11520/11520 -v 16361.5 23801.3 4854.82 -vt 0.422693 0.538747 -v 16331.5 23801.3 4854.82 -vt 0.422693 0.539571 -v 16331.5 23801.3 4834.58 -vt 0.423524 0.539571 -v 16361.5 23801.3 4834.58 -vt 0.423524 0.538747 -o mesh2330 -s off -f 11521/11521/11521 11522/11522/11522 11523/11523/11523 -f 11521/11521/11521 11523/11523/11523 11524/11524/11524 -g charts -o chart0000 -s off -f 11521/11521/11521 11522/11522/11522 11523/11523/11523 -f 11521/11521/11521 11523/11523/11523 11524/11524/11524 -v 16361.5 24666 4854.82 -vt 0.992934 0.0523495 -v 16331.5 24666 4854.82 -vt 0.992103 0.0523495 -v 16331.5 23801.3 4854.82 -vt 0.992103 0.0449299 -v 16361.5 23801.3 4854.82 -vt 0.992934 0.0449299 -o mesh2331 -s off -f 11525/11525/11525 11526/11526/11526 11527/11527/11527 -f 11525/11525/11525 11527/11527/11527 11528/11528/11528 -g charts -o chart0000 -s off -f 11525/11525/11525 11526/11526/11526 11527/11527/11527 -f 11525/11525/11525 11527/11527/11527 11528/11528/11528 -v 16331.5 24666 4854.82 -vt 0.108479 0.584089 -v 16331.5 24666 4834.58 -vt 0.108479 0.583265 -v 16331.5 23801.3 4834.58 -vt 0.100998 0.583265 -v 16331.5 23801.3 4854.82 -vt 0.100998 0.584089 -o mesh2332 -s off -f 11529/11529/11529 11530/11530/11530 11531/11531/11531 -f 11529/11529/11529 11531/11531/11531 11532/11532/11532 -g charts -o chart0000 -s off -f 11529/11529/11529 11530/11530/11530 11531/11531/11531 -f 11529/11529/11529 11531/11531/11531 11532/11532/11532 -v 16331.5 24666 4834.58 -vt 0.227348 0.307914 -v 16361.5 24666 4834.58 -vt 0.227348 0.30709 -v 16361.5 23801.3 4834.58 -vt 0.219867 0.30709 -v 16331.5 23801.3 4834.58 -vt 0.219867 0.307914 -o mesh2333 -s off -f 11533/11533/11533 11534/11534/11534 11535/11535/11535 -f 11533/11533/11533 11535/11535/11535 11536/11536/11536 -g charts -o chart0000 -s off -f 11533/11533/11533 11534/11534/11534 11535/11535/11535 -f 11533/11533/11533 11535/11535/11535 11536/11536/11536 -v 16361.5 24666 4834.58 -vt 0.413549 0.647568 -v 16361.5 24666 4854.82 -vt 0.412718 0.647568 -v 16361.5 23801.3 4854.82 -vt 0.412718 0.640148 -v 16361.5 23801.3 4834.58 -vt 0.413549 0.640148 -o mesh2334 -s off -f 11537/11537/11537 11538/11538/11538 11539/11539/11539 -f 11537/11537/11537 11539/11539/11539 11540/11540/11540 -g charts -o chart0000 -s off -f 11537/11537/11537 11538/11538/11538 11539/11539/11539 -f 11537/11537/11537 11539/11539/11539 11540/11540/11540 -v 16361.5 24210.4 5707.2 -vt 0.228179 0.688788 -v 16331.5 24210.4 5707.2 -vt 0.227348 0.688788 -v 16331.5 24210.4 3982.2 -vt 0.227348 0.674773 -v 16361.5 24210.4 3982.2 -vt 0.228179 0.674773 -o mesh2335 -s off -f 11541/11541/11541 11542/11542/11542 11543/11543/11543 -f 11541/11541/11541 11543/11543/11543 11544/11544/11544 -g charts -o chart0000 -s off -f 11541/11541/11541 11542/11542/11542 11543/11543/11543 -f 11541/11541/11541 11543/11543/11543 11544/11544/11544 -v 16361.5 24236.6 5707.2 -vt 0.111804 0.957543 -v 16361.5 24210.4 5707.2 -vt 0.110973 0.957543 -v 16361.5 24210.4 3982.2 -vt 0.110973 0.943528 -v 16361.5 24236.6 3982.2 -vt 0.111804 0.943528 -o mesh2336 -s off -f 11545/11545/11545 11546/11546/11546 11547/11547/11547 -f 11545/11545/11545 11547/11547/11547 11548/11548/11548 -g charts -o chart0000 -s off -f 11545/11545/11545 11546/11546/11546 11547/11547/11547 -f 11545/11545/11545 11547/11547/11547 11548/11548/11548 -v 385.817 10886 5014.64 -vt 0.388612 0.773701 -v 385.817 11013.2 4811.12 -vt 0.391106 0.773701 -v 3730.82 11013.2 4811.12 -vt 0.391106 0.747321 -v 3730.82 10886 5014.64 -vt 0.388612 0.747321 -o mesh2337 -s off -f 11549/11549/11549 11550/11550/11550 11551/11551/11551 -f 11549/11549/11549 11551/11551/11551 11552/11552/11552 -g charts -o chart0000 -s off -f 11549/11549/11549 11550/11550/11550 11551/11551/11551 -f 11549/11549/11549 11551/11551/11551 11552/11552/11552 -v 3730.82 10886 5014.64 -vt 0.37448 0.76958 -v 3730.82 11013.2 4811.12 -vt 0.37448 0.772053 -v 3730.82 11102.2 4866.77 -vt 0.375312 0.772053 -v 3730.82 10975 5070.29 -vt 0.375312 0.76958 -o mesh2338 -s off -f 11553/11553/11553 11554/11554/11554 11555/11555/11555 -f 11553/11553/11553 11555/11555/11555 11556/11556/11556 -g charts -o chart0000 -s off -f 11553/11553/11553 11554/11554/11554 11555/11555/11555 -f 11553/11553/11553 11555/11555/11555 11556/11556/11556 -v 385.817 11013.2 4811.12 -vt 0.647132 0.846249 -v 385.817 11102.2 4866.77 -vt 0.647132 0.847073 -v 3730.82 11102.2 4866.77 -vt 0.620532 0.847073 -v 3730.82 11013.2 4811.12 -vt 0.620532 0.846249 -o mesh2339 -s off -f 11557/11557/11557 11558/11558/11558 11559/11559/11559 -f 11557/11557/11557 11559/11559/11559 11560/11560/11560 -g charts -o chart0000 -s off -f 11557/11557/11557 11558/11558/11558 11559/11559/11559 -f 11557/11557/11557 11559/11559/11559 11560/11560/11560 -v 385.817 11013.2 4811.12 -vt 0.824189 0.961665 -v 385.817 10886 5014.64 -vt 0.821696 0.961665 -v 385.817 10975 5070.29 -vt 0.821696 0.960841 -v 385.817 11102.2 4866.77 -vt 0.824189 0.960841 -o mesh2340 -s off -f 11561/11561/11561 11562/11562/11562 11563/11563/11563 -f 11561/11561/11561 11563/11563/11563 11564/11564/11564 -g charts -o chart0000 -s off -f 11561/11561/11561 11562/11562/11562 11563/11563/11563 -f 11561/11561/11561 11563/11563/11563 11564/11564/11564 -v 385.817 11102.2 4866.77 -vt 0.583125 0.527205 -v 385.817 10975 5070.29 -vt 0.583125 0.529678 -v 3730.82 10975 5070.29 -vt 0.556525 0.529678 -v 3730.82 11102.2 4866.77 -vt 0.556525 0.527205 -o mesh2341 -s off -f 11565/11565/11565 11566/11566/11566 11567/11567/11567 -f 11565/11565/11565 11567/11567/11567 11568/11568/11568 -g charts -o chart0000 -s off -f 11565/11565/11565 11566/11566/11566 11567/11567/11567 -f 11565/11565/11565 11567/11567/11567 11568/11568/11568 -v 385.817 10975 5070.29 -vt 0.662095 0.990519 -v 385.817 10886 5014.64 -vt 0.662926 0.990519 -v 3730.82 10886 5014.64 -vt 0.662926 0.964139 -v 3730.82 10975 5070.29 -vt 0.662095 0.964139 -o mesh2342 -s off -f 11569/11569/11569 11570/11570/11570 11571/11571/11571 -f 11569/11569/11569 11571/11571/11571 11572/11572/11572 -g charts -o chart0000 -s off -f 11569/11569/11569 11570/11570/11570 11571/11571/11571 -f 11569/11569/11569 11571/11571/11571 11572/11572/11572 -v 3730.82 13959.1 5062.92 -vt 0.796758 0.979802 -v 3730.82 13831.9 4859.4 -vt 0.796758 0.977329 -v 385.817 13831.9 4859.4 -vt 0.770158 0.977329 -v 385.817 13959.1 5062.92 -vt 0.770158 0.979802 -o mesh2343 -s off -f 11573/11573/11573 11574/11574/11574 11575/11575/11575 -f 11573/11573/11573 11575/11575/11575 11576/11576/11576 -g charts -o chart0000 -s off -f 11573/11573/11573 11574/11574/11574 11575/11575/11575 -f 11573/11573/11573 11575/11575/11575 11576/11576/11576 -v 3730.82 13870.1 5118.57 -vt 0.557357 0.432399 -v 3730.82 13742.9 4915.05 -vt 0.55985 0.432399 -v 3730.82 13831.9 4859.4 -vt 0.55985 0.433223 -v 3730.82 13959.1 5062.92 -vt 0.557357 0.433223 -o mesh2344 -s off -f 11577/11577/11577 11578/11578/11578 11579/11579/11579 -f 11577/11577/11577 11579/11579/11579 11580/11580/11580 -g charts -o chart0000 -s off -f 11577/11577/11577 11578/11578/11578 11579/11579/11579 -f 11577/11577/11577 11579/11579/11579 11580/11580/11580 -v 3730.82 13831.9 4859.4 -vt 0.905652 0.549464 -v 3730.82 13742.9 4915.05 -vt 0.904821 0.549464 -v 385.817 13742.9 4915.05 -vt 0.904821 0.523083 -v 385.817 13831.9 4859.4 -vt 0.905652 0.523083 -o mesh2345 -s off -f 11581/11581/11581 11582/11582/11582 11583/11583/11583 -f 11581/11581/11581 11583/11583/11583 11584/11584/11584 -g charts -o chart0000 -s off -f 11581/11581/11581 11582/11582/11582 11583/11583/11583 -f 11581/11581/11581 11583/11583/11583 11584/11584/11584 -v 385.817 13742.9 4915.05 -vt 0.229842 0.464551 -v 385.817 13870.1 5118.57 -vt 0.227348 0.464551 -v 385.817 13959.1 5062.92 -vt 0.227348 0.463726 -v 385.817 13831.9 4859.4 -vt 0.229842 0.463726 -o mesh2346 -s off -f 11585/11585/11585 11586/11586/11586 11587/11587/11587 -f 11585/11585/11585 11587/11587/11587 11588/11588/11588 -g charts -o chart0000 -s off -f 11585/11585/11585 11586/11586/11586 11587/11587/11587 -f 11585/11585/11585 11587/11587/11587 11588/11588/11588 -v 3730.82 13742.9 4915.05 -vt 0.00955935 0.988046 -v 3730.82 13870.1 5118.57 -vt 0.00706567 0.988046 -v 385.817 13870.1 5118.57 -vt 0.00706567 0.961665 -v 385.817 13742.9 4915.05 -vt 0.00955935 0.961665 -o mesh2347 -s off -f 11589/11589/11589 11590/11590/11590 11591/11591/11591 -f 11589/11589/11589 11591/11591/11591 11592/11592/11592 -g charts -o chart0000 -s off -f 11589/11589/11589 11590/11590/11590 11591/11591/11591 -f 11589/11589/11589 11591/11591/11591 11592/11592/11592 -v 3730.82 13870.1 5118.57 -vt 0.923109 0.237016 -v 3730.82 13959.1 5062.92 -vt 0.922278 0.237016 -v 385.817 13959.1 5062.92 -vt 0.922278 0.210635 -v 385.817 13870.1 5118.57 -vt 0.923109 0.210635 -o mesh2348 -s off -f 11593/11593/11593 11594/11594/11594 11595/11595/11595 -f 11593/11593/11593 11595/11595/11595 11596/11596/11596 -g charts -o chart0000 -s off -f 11593/11593/11593 11594/11594/11594 11595/11595/11595 -f 11593/11593/11593 11595/11595/11595 11596/11596/11596 -v 265.817 11013.2 4811.12 -vt 0.32793 0.551113 -v 385.817 11013.2 4811.12 -vt 0.32793 0.552762 -v 385.817 10886 5014.64 -vt 0.325436 0.552762 -v 265.817 10886 5014.64 -vt 0.325436 0.551113 -o mesh2349 -s off -f 11597/11597/11597 11598/11598/11598 11599/11599/11599 -f 11597/11597/11597 11599/11599/11599 11600/11600/11600 -g charts -o chart0000 -s off -f 11597/11597/11597 11598/11598/11598 11599/11599/11599 -f 11597/11597/11597 11599/11599/11599 11600/11600/11600 -v 265.817 12412.4 5685.62 -vt 0.156396 0.575021 -v 265.817 11013.2 4811.12 -vt 0.143392 0.575063 -v 265.817 10886 5014.64 -vt 0.143396 0.577494 -v 265.817 12403.5 5968.5 -vt 0.157523 0.577494 -o mesh2350 -s off -f 11601/11601/11601 11602/11602/11602 11603/11603/11603 -f 11601/11601/11601 11603/11603/11603 11604/11604/11604 -g charts -o chart0000 -s off -f 11601/11601/11601 11602/11602/11602 11603/11603/11603 -f 11601/11601/11601 11603/11603/11603 11604/11604/11604 -v 265.817 13838.4 4855.5 -vt 0.00789684 0.894064 -v 265.817 12412.4 5685.62 -vt 0.00789684 0.907667 -v 265.817 12403.5 5968.5 -vt 0.00540316 0.908903 -v 265.817 13959.1 5062.92 -vt 0.00540316 0.894064 -o mesh2351 -s off -f 11605/11605/11605 11606/11606/11606 11607/11607/11607 -f 11605/11605/11605 11607/11607/11607 11608/11608/11608 -g charts -o chart0000 -s off -f 11605/11605/11605 11606/11606/11606 11607/11607/11607 -f 11605/11605/11605 11607/11607/11607 11608/11608/11608 -v 385.817 13838.4 4855.5 -vt 0.245636 0.967436 -v 265.817 13838.4 4855.5 -vt 0.247298 0.967436 -v 265.817 13959.1 5062.92 -vt 0.247298 0.964963 -v 385.817 13959.1 5062.92 -vt 0.245636 0.964963 -o mesh2352 -s off -f 11609/11609/11609 11610/11610/11610 11611/11611/11611 -f 11609/11609/11609 11611/11611/11611 11612/11612/11612 -g charts -o chart0000 -s off -f 11609/11609/11609 11610/11610/11610 11611/11611/11611 -f 11609/11609/11609 11611/11611/11611 11612/11612/11612 -v 385.817 11013.2 4811.12 -vt 0.661263 0.826463 -v 385.817 11102.2 4866.77 -vt 0.661263 0.827288 -v 385.817 10975 5070.29 -vt 0.65877 0.827288 -v 385.817 10886 5014.64 -vt 0.65877 0.826463 -o mesh2353 -s off -f 11613/11613/11613 11614/11614/11614 11615/11615/11615 -f 11613/11613/11613 11615/11615/11615 11616/11616/11616 -g charts -o chart0000 -s off -f 11613/11613/11613 11614/11614/11614 11615/11615/11615 -f 11613/11613/11613 11615/11615/11615 11616/11616/11616 -v 385.817 12412.4 5685.62 -vt 0.434331 0.510717 -v 265.817 12412.4 5685.62 -vt 0.435993 0.510717 -v 265.817 13838.4 4855.5 -vt 0.435993 0.497527 -v 385.817 13838.4 4855.5 -vt 0.434331 0.497527 -o mesh2354 -s off -f 11617/11617/11617 11618/11618/11618 11619/11619/11619 -f 11617/11617/11617 11619/11619/11619 11620/11620/11620 -g charts -o chart0000 -s off -f 11617/11617/11617 11618/11618/11618 11619/11619/11619 -f 11617/11617/11617 11619/11619/11619 11620/11620/11620 -v 385.817 12403.5 5968.5 -vt 0.554863 0.985573 -v 385.817 12412.4 5685.62 -vt 0.554863 0.988046 -v 265.817 12412.4 5685.62 -vt 0.556525 0.988046 -v 265.817 12403.5 5968.5 -vt 0.556525 0.985573 -o mesh2355 -s off -f 11621/11621/11621 11622/11622/11622 11623/11623/11623 -f 11621/11621/11621 11623/11623/11623 11624/11624/11624 -g charts -o chart0000 -s off -f 11621/11621/11621 11622/11622/11622 11623/11623/11623 -f 11621/11621/11621 11623/11623/11623 11624/11624/11624 -v 385.817 13959.1 5062.92 -vt 0.369493 0.974031 -v 385.817 12403.5 5968.5 -vt 0.369493 0.98887 -v 385.817 12412.4 5685.62 -vt 0.366999 0.987634 -v 385.817 13838.4 4855.5 -vt 0.366999 0.974031 -o mesh2356 -s off -f 11625/11625/11625 11626/11626/11626 11627/11627/11627 -f 11625/11625/11625 11627/11627/11627 11628/11628/11628 -g charts -o chart0000 -s off -f 11625/11625/11625 11626/11626/11626 11627/11627/11627 -f 11625/11625/11625 11627/11627/11627 11628/11628/11628 -v 385.817 12403.5 5968.5 -vt 0.813383 0.579143 -v 385.817 10975 5070.29 -vt 0.813383 0.592328 -v 385.817 11102.2 4866.77 -vt 0.810932 0.592333 -v 385.817 12412.4 5685.62 -vt 0.810889 0.58026 -o mesh2357 -s off -f 11629/11629/11629 11630/11630/11630 11631/11631/11631 -f 11629/11629/11629 11631/11631/11631 11632/11632/11632 -g charts -o chart0000 -s off -f 11629/11629/11629 11630/11630/11630 11631/11631/11631 -f 11629/11629/11629 11631/11631/11631 11632/11632/11632 -v 265.817 13959.1 5062.92 -vt 0.842477 0.678071 -v 265.817 12403.5 5968.5 -vt 0.827515 0.678071 -v 385.817 12403.5 5968.5 -vt 0.827515 0.676422 -v 385.817 13959.1 5062.92 -vt 0.842477 0.676422 -o mesh2358 -s off -f 11633/11633/11633 11634/11634/11634 11635/11635/11635 -f 11633/11633/11633 11635/11635/11635 11636/11636/11636 -g charts -o chart0000 -s off -f 11633/11633/11633 11634/11634/11634 11635/11635/11635 -f 11633/11633/11633 11635/11635/11635 11636/11636/11636 -v 265.817 12412.4 5685.62 -vt 0.677057 0.638499 -v 385.817 12412.4 5685.62 -vt 0.675395 0.638499 -v 385.817 11102.2 4866.77 -vt 0.675395 0.626149 -v 385.817 11013.2 4811.12 -vt 0.675395 0.625309 -v 265.817 11013.2 4811.12 -vt 0.677057 0.625309 -o mesh2359 -s off -f 11637/11637/11637 11638/11638/11638 11639/11639/11639 -f 11637/11637/11637 11639/11639/11639 11640/11640/11640 -f 11637/11637/11637 11640/11640/11640 11641/11641/11641 -g charts -o chart0000 -s off -f 11637/11637/11637 11638/11638/11638 11639/11639/11639 -f 11637/11637/11637 11639/11639/11639 11640/11640/11640 -f 11637/11637/11637 11640/11640/11640 11641/11641/11641 -v 265.817 12403.5 5968.5 -vt 0.452618 0.542869 -v 265.817 10886 5014.64 -vt 0.452618 0.528854 -v 385.817 10886 5014.64 -vt 0.450956 0.528854 -v 385.817 12403.5 5968.5 -vt 0.450956 0.542869 -o mesh2360 -s off -f 11642/11642/11642 11643/11643/11643 11644/11644/11644 -f 11642/11642/11642 11644/11644/11644 11645/11645/11645 -g charts -o chart0000 -s off -f 11642/11642/11642 11643/11643/11643 11644/11644/11644 -f 11642/11642/11642 11644/11644/11644 11645/11645/11645 -v 385.817 10975 5070.29 -vt 0.998708 0.124073 -v 385.817 12403.5 5968.5 -vt 0.984622 0.124897 -v 385.817 10886 5014.64 -vt 0.999584 0.124897 -o mesh2361 -s off -f 11646/11646/11646 11647/11647/11647 11648/11648/11648 -g charts -o chart0000 -s off -f 11646/11646/11646 11647/11647/11647 11648/11648/11648 -v 3730.82 11013.2 4811.12 -vt 0.0910224 0.375515 -v 3850.82 11013.2 4811.12 -vt 0.0926849 0.375515 -v 3850.82 10886 5014.64 -vt 0.0926849 0.373042 -v 3730.82 10886 5014.64 -vt 0.0910224 0.373042 -o mesh2362 -s off -f 11649/11649/11649 11650/11650/11650 11651/11651/11651 -f 11649/11649/11649 11651/11651/11651 11652/11652/11652 -g charts -o chart0000 -s off -f 11649/11649/11649 11650/11650/11650 11651/11651/11651 -f 11649/11649/11649 11651/11651/11651 11652/11652/11652 -v 3730.82 12412.4 5685.62 -vt 0.361716 0.767106 -v 3730.82 11013.2 4811.12 -vt 0.348712 0.767149 -v 3730.82 10886 5014.64 -vt 0.348716 0.769579 -v 3730.82 12403.5 5968.5 -vt 0.362843 0.769579 -o mesh2363 -s off -f 11653/11653/11653 11654/11654/11654 11655/11655/11655 -f 11653/11653/11653 11655/11655/11655 11656/11656/11656 -g charts -o chart0000 -s off -f 11653/11653/11653 11654/11654/11654 11655/11655/11655 -f 11653/11653/11653 11655/11655/11655 11656/11656/11656 -v 3730.82 13838.4 4855.5 -vt 0.10266 0.525556 -v 3730.82 12412.4 5685.62 -vt 0.10266 0.511954 -v 3730.82 12403.5 5968.5 -vt 0.105154 0.510717 -v 3730.82 13959.1 5062.92 -vt 0.105154 0.525556 -o mesh2364 -s off -f 11657/11657/11657 11658/11658/11658 11659/11659/11659 -f 11657/11657/11657 11659/11659/11659 11660/11660/11660 -g charts -o chart0000 -s off -f 11657/11657/11657 11658/11658/11658 11659/11659/11659 -f 11657/11657/11657 11659/11659/11659 11660/11660/11660 -v 3850.82 13838.4 4855.5 -vt 0.164173 0.671476 -v 3730.82 13838.4 4855.5 -vt 0.165835 0.671476 -v 3730.82 13959.1 5062.92 -vt 0.165835 0.669002 -v 3850.82 13959.1 5062.92 -vt 0.164173 0.669002 -o mesh2365 -s off -f 11661/11661/11661 11662/11662/11662 11663/11663/11663 -f 11661/11661/11661 11663/11663/11663 11664/11664/11664 -g charts -o chart0000 -s off -f 11661/11661/11661 11662/11662/11662 11663/11663/11663 -f 11661/11661/11661 11663/11663/11663 11664/11664/11664 -v 3850.82 11013.2 4811.12 -vt 0.924771 0.495878 -v 3850.82 11102.2 4866.77 -vt 0.925603 0.495878 -v 3850.82 10975 5070.29 -vt 0.925603 0.493405 -v 3850.82 10886 5014.64 -vt 0.924771 0.493405 -o mesh2366 -s off -f 11665/11665/11665 11666/11666/11666 11667/11667/11667 -f 11665/11665/11665 11667/11667/11667 11668/11668/11668 -g charts -o chart0000 -s off -f 11665/11665/11665 11666/11666/11666 11667/11667/11667 -f 11665/11665/11665 11667/11667/11667 11668/11668/11668 -v 3850.82 12412.4 5685.62 -vt 0.756027 0.925392 -v 3730.82 12412.4 5685.62 -vt 0.756027 0.92704 -v 3730.82 13838.4 4855.5 -vt 0.742727 0.92704 -v 3850.82 13838.4 4855.5 -vt 0.742727 0.925392 -o mesh2367 -s off -f 11669/11669/11669 11670/11670/11670 11671/11671/11671 -f 11669/11669/11669 11671/11671/11671 11672/11672/11672 -g charts -o chart0000 -s off -f 11669/11669/11669 11670/11670/11670 11671/11671/11671 -f 11669/11669/11669 11671/11671/11671 11672/11672/11672 -v 3850.82 12403.5 5968.5 -vt 0.992934 0.347486 -v 3850.82 12412.4 5685.62 -vt 0.992934 0.349959 -v 3730.82 12412.4 5685.62 -vt 0.994597 0.349959 -v 3730.82 12403.5 5968.5 -vt 0.994597 0.347486 -o mesh2368 -s off -f 11673/11673/11673 11674/11674/11674 11675/11675/11675 -f 11673/11673/11673 11675/11675/11675 11676/11676/11676 -g charts -o chart0000 -s off -f 11673/11673/11673 11674/11674/11674 11675/11675/11675 -f 11673/11673/11673 11675/11675/11675 11676/11676/11676 -v 3850.82 13959.1 5062.92 -vt 0.564838 0.982275 -v 3850.82 12403.5 5968.5 -vt 0.564838 0.967436 -v 3850.82 12412.4 5685.62 -vt 0.567332 0.968673 -v 3850.82 13838.4 4855.5 -vt 0.567332 0.982275 -o mesh2369 -s off -f 11677/11677/11677 11678/11678/11678 11679/11679/11679 -f 11677/11677/11677 11679/11679/11679 11680/11680/11680 -g charts -o chart0000 -s off -f 11677/11677/11677 11678/11678/11678 11679/11679/11679 -f 11677/11677/11677 11679/11679/11679 11680/11680/11680 -v 3850.82 12403.5 5968.5 -vt 0.849127 0.634377 -v 3850.82 10975 5070.29 -vt 0.862422 0.634377 -v 3850.82 11102.2 4866.77 -vt 0.862427 0.631947 -v 3850.82 12412.4 5685.62 -vt 0.850254 0.631904 -o mesh2370 -s off -f 11681/11681/11681 11682/11682/11682 11683/11683/11683 -f 11681/11681/11681 11683/11683/11683 11684/11684/11684 -g charts -o chart0000 -s off -f 11681/11681/11681 11682/11682/11682 11683/11683/11683 -f 11681/11681/11681 11683/11683/11683 11684/11684/11684 -v 3730.82 13959.1 5062.92 -vt 0.820864 0.316983 -v 3730.82 12403.5 5968.5 -vt 0.805902 0.316983 -v 3850.82 12403.5 5968.5 -vt 0.805902 0.315334 -v 3850.82 13959.1 5062.92 -vt 0.820864 0.315334 -o mesh2371 -s off -f 11685/11685/11685 11686/11686/11686 11687/11687/11687 -f 11685/11685/11685 11687/11687/11687 11688/11688/11688 -g charts -o chart0000 -s off -f 11685/11685/11685 11686/11686/11686 11687/11687/11687 -f 11685/11685/11685 11687/11687/11687 11688/11688/11688 -v 3730.82 12412.4 5685.62 -vt 0.519119 0.428277 -v 3850.82 12412.4 5685.62 -vt 0.519119 0.426628 -v 3850.82 11102.2 4866.77 -vt 0.506665 0.426628 -v 3850.82 11013.2 4811.12 -vt 0.505819 0.426628 -v 3730.82 11013.2 4811.12 -vt 0.505819 0.428277 -o mesh2372 -s off -f 11689/11689/11689 11690/11690/11690 11691/11691/11691 -f 11689/11689/11689 11691/11691/11691 11692/11692/11692 -f 11689/11689/11689 11692/11692/11692 11693/11693/11693 -g charts -o chart0000 -s off -f 11689/11689/11689 11690/11690/11690 11691/11691/11691 -f 11689/11689/11689 11691/11691/11691 11692/11692/11692 -f 11689/11689/11689 11692/11692/11692 11693/11693/11693 -v 3730.82 12403.5 5968.5 -vt 0.482544 0.720115 -v 3730.82 10886 5014.64 -vt 0.482544 0.706101 -v 3850.82 10886 5014.64 -vt 0.480881 0.706101 -v 3850.82 12403.5 5968.5 -vt 0.480881 0.720115 -o mesh2373 -s off -f 11694/11694/11694 11695/11695/11695 11696/11696/11696 -f 11694/11694/11694 11696/11696/11696 11697/11697/11697 -g charts -o chart0000 -s off -f 11694/11694/11694 11695/11695/11695 11696/11696/11696 -f 11694/11694/11694 11696/11696/11696 11697/11697/11697 -v 3850.82 10975 5070.29 -vt 0.9281 0.636026 -v 3850.82 12403.5 5968.5 -vt 0.914796 0.636851 -v 3850.82 10886 5014.64 -vt 0.928928 0.636851 -o mesh2374 -s off -f 11698/11698/11698 11699/11699/11699 11700/11700/11700 -g charts -o chart0000 -s off -f 11698/11698/11698 11699/11699/11699 11700/11700/11700 -v -8381 -5296.51 4214.7 -vt 0.948878 0.966612 -v -8381 -5265.26 4245.75 -vt 0.949138 0.967436 -v -8381 -4396.51 4214.7 -vt 0.956359 0.966612 -v -8381 -4427.76 4245.75 -vt 0.956099 0.967436 -o mesh2375 -s off -f 11701/11701/11701 11702/11702/11702 11703/11703/11703 -f 11704/11704/11704 11703/11703/11703 11702/11702/11702 -g charts -o chart0000 -s off -f 11701/11701/11701 11702/11702/11702 11703/11703/11703 -f 11704/11704/11704 11703/11703/11703 11702/11702/11702 -v -8381 -5265.26 4245.75 -vt 0.633261 0.528854 -v -8381 -5296.51 4214.7 -vt 0.633001 0.529678 -v -8381 -5296.51 5804.7 -vt 0.646301 0.529678 -o mesh2376 -s off -f 11705/11705/11705 11706/11706/11706 11707/11707/11707 -g charts -o chart0000 -s off -f 11705/11705/11705 11706/11706/11706 11707/11707/11707 -v -8381 -5265.26 4245.75 -vt 0.445968 0.489283 -v -8381 -5296.51 5804.7 -vt 0.445968 0.501649 -v -8381 -5265.26 5773.65 -vt 0.445137 0.501397 -o mesh2377 -s off -f 11708/11708/11708 11709/11709/11709 11710/11710/11710 -g charts -o chart0000 -s off -f 11708/11708/11708 11709/11709/11709 11710/11710/11710 -v -8381 -5265.26 5773.65 -vt 0.713633 0.966888 -v -8381 -5296.51 5804.7 -vt 0.714464 0.966612 -v -8381 -4427.76 5773.65 -vt 0.714464 0.974031 -o mesh2378 -s off -f 11711/11711/11711 11712/11712/11712 11713/11713/11713 -g charts -o chart0000 -s off -f 11711/11711/11711 11712/11712/11712 11713/11713/11713 -v -8381 -4396.51 4214.7 -vt 0.767664 0.847073 -v -8381 -4427.76 4245.75 -vt 0.766833 0.846816 -v -8381 -4396.51 5804.7 -vt 0.767664 0.833883 -o mesh2379 -s off -f 11714/11714/11714 11715/11715/11715 11716/11716/11716 -g charts -o chart0000 -s off -f 11714/11714/11714 11715/11715/11715 11716/11716/11716 -v -8381 -4396.51 5804.7 -vt 0.999584 0.683017 -v -8381 -4427.76 4245.75 -vt 0.999584 0.695383 -v -8381 -4427.76 5773.65 -vt 0.998753 0.683268 -o mesh2380 -s off -f 11717/11717/11717 11718/11718/11718 11719/11719/11719 -g charts -o chart0000 -s off -f 11717/11717/11717 11718/11718/11718 11719/11719/11719 -v -8381 -4396.51 5804.7 -vt 0.789277 0.877576 -v -8381 -4427.76 5773.65 -vt 0.789017 0.876752 -v -8381 -5296.51 5804.7 -vt 0.781796 0.877576 -o mesh2381 -s off -f 11720/11720/11720 11721/11721/11721 11722/11722/11722 -g charts -o chart0000 -s off -f 11720/11720/11720 11721/11721/11721 11722/11722/11722 -v -8216 -4396.51 4214.7 -vt 0.646301 0.704452 -v -8216 -4427.76 4245.75 -vt 0.646041 0.703627 -v -8216 -5296.51 4214.7 -vt 0.63882 0.704452 -v -8216 -5265.26 4245.75 -vt 0.639079 0.703627 -o mesh2382 -s off -f 11723/11723/11723 11724/11724/11724 11725/11725/11725 -f 11726/11726/11726 11725/11725/11725 11724/11724/11724 -g charts -o chart0000 -s off -f 11723/11723/11723 11724/11724/11724 11725/11725/11725 -f 11726/11726/11726 11725/11725/11725 11724/11724/11724 -v -8216 -4427.76 4245.75 -vt 0.241739 0.524732 -v -8216 -4396.51 4214.7 -vt 0.24148 0.525556 -v -8216 -4396.51 5804.7 -vt 0.25478 0.525556 -o mesh2383 -s off -f 11727/11727/11727 11728/11728/11728 11729/11729/11729 -g charts -o chart0000 -s off -f 11727/11727/11727 11728/11728/11728 11729/11729/11729 -v -8216 -4427.76 4245.75 -vt 0.208229 0.488458 -v -8216 -4396.51 5804.7 -vt 0.220698 0.488458 -v -8216 -4427.76 5773.65 -vt 0.220445 0.487634 -o mesh2384 -s off -f 11730/11730/11730 11731/11731/11731 11732/11732/11732 -g charts -o chart0000 -s off -f 11730/11730/11730 11731/11731/11731 11732/11732/11732 -v -8216 -4427.76 5773.65 -vt 0.248408 0.43075 -v -8216 -4396.51 5804.7 -vt 0.24813 0.431574 -v -8216 -5265.26 5773.65 -vt 0.255611 0.431574 -o mesh2385 -s off -f 11733/11733/11733 11734/11734/11734 11735/11735/11735 -g charts -o chart0000 -s off -f 11733/11733/11733 11734/11734/11734 11735/11735/11735 -v -8216 -5296.51 4214.7 -vt 0.997922 0.64427 -v -8216 -5265.26 4245.75 -vt 0.997091 0.644013 -v -8216 -5296.51 5804.7 -vt 0.997922 0.63108 -o mesh2386 -s off -f 11736/11736/11736 11737/11737/11737 11738/11738/11738 -g charts -o chart0000 -s off -f 11736/11736/11736 11737/11737/11737 11738/11738/11738 -v -8216 -5296.51 5804.7 -vt 0.0170406 0.894064 -v -8216 -5265.26 4245.75 -vt 0.0170406 0.90643 -v -8216 -5265.26 5773.65 -vt 0.0162095 0.894316 -o mesh2387 -s off -f 11739/11739/11739 11740/11740/11740 11741/11741/11741 -g charts -o chart0000 -s off -f 11739/11739/11739 11740/11740/11740 11741/11741/11741 -v -8216 -5296.51 5804.7 -vt 0.451787 0.614592 -v -8216 -5265.26 5773.65 -vt 0.451527 0.613768 -v -8216 -4396.51 5804.7 -vt 0.444306 0.614592 -o mesh2388 -s off -f 11742/11742/11742 11743/11743/11743 11744/11744/11744 -g charts -o chart0000 -s off -f 11742/11742/11742 11743/11743/11743 11744/11744/11744 -v -8381 -4396.51 5804.7 -vt 0.0802161 0.671476 -v -8381 -5296.51 5804.7 -vt 0.0876973 0.671476 -v -8216 -5296.51 5804.7 -vt 0.0876973 0.673124 -v -8216 -4396.51 5804.7 -vt 0.0802161 0.673124 -o mesh2389 -s off -f 11745/11745/11745 11746/11746/11746 11747/11747/11747 -f 11745/11745/11745 11747/11747/11747 11748/11748/11748 -g charts -o chart0000 -s off -f 11745/11745/11745 11746/11746/11746 11747/11747/11747 -f 11745/11745/11745 11747/11747/11747 11748/11748/11748 -v -8381 -5296.51 5804.7 -vt 0.892352 0.20404 -v -8381 -5296.51 4214.7 -vt 0.892352 0.21723 -v -8216 -5296.51 4214.7 -vt 0.894015 0.21723 -v -8216 -5296.51 5804.7 -vt 0.894015 0.20404 -o mesh2390 -s off -f 11749/11749/11749 11750/11750/11750 11751/11751/11751 -f 11749/11749/11749 11751/11751/11751 11752/11752/11752 -g charts -o chart0000 -s off -f 11749/11749/11749 11750/11750/11750 11751/11751/11751 -f 11749/11749/11749 11751/11751/11751 11752/11752/11752 -v -8381 -5296.51 4214.7 -vt 0.455112 0.999588 -v -8381 -4396.51 4214.7 -vt 0.447631 0.999588 -v -8216 -4396.51 4214.7 -vt 0.447631 0.997939 -v -8216 -5296.51 4214.7 -vt 0.455112 0.997939 -o mesh2391 -s off -f 11753/11753/11753 11754/11754/11754 11755/11755/11755 -f 11753/11753/11753 11755/11755/11755 11756/11756/11756 -g charts -o chart0000 -s off -f 11753/11753/11753 11754/11754/11754 11755/11755/11755 -f 11753/11753/11753 11755/11755/11755 11756/11756/11756 -v -8381 -4396.51 4214.7 -vt 0.840815 0.663232 -v -8381 -4396.51 5804.7 -vt 0.827515 0.663232 -v -8216 -4396.51 5804.7 -vt 0.827515 0.661583 -v -8216 -4396.51 4214.7 -vt 0.840815 0.661583 -o mesh2392 -s off -f 11757/11757/11757 11758/11758/11758 11759/11759/11759 -f 11757/11757/11757 11759/11759/11759 11760/11760/11760 -g charts -o chart0000 -s off -f 11757/11757/11757 11758/11758/11758 11759/11759/11759 -f 11757/11757/11757 11759/11759/11759 11760/11760/11760 -v -8216 -4427.76 4245.75 -vt 0.962178 0.0605935 -v -8261 -4427.76 4245.75 -vt 0.961724 0.0605935 -v -8261 -5265.26 4245.75 -vt 0.961724 0.0539984 -v -8216 -5265.26 4245.75 -vt 0.962178 0.0539984 -v -8381 -4427.76 4245.75 -vt 0.960515 0.0605935 -v -8381 -5265.26 4245.75 -vt 0.960515 0.0539984 -o mesh2393 -s off -f 11761/11761/11761 11762/11762/11762 11763/11763/11763 -f 11761/11761/11761 11763/11763/11763 11764/11764/11764 -f 11765/11765/11765 11766/11766/11766 11763/11763/11763 -f 11765/11765/11765 11763/11763/11763 11762/11762/11762 -g charts -o chart0000 -s off -f 11761/11761/11761 11762/11762/11762 11763/11763/11763 -f 11761/11761/11761 11763/11763/11763 11764/11764/11764 -f 11765/11765/11765 11766/11766/11766 11763/11763/11763 -f 11765/11765/11765 11763/11763/11763 11762/11762/11762 -v -8216 -5265.26 4245.75 -vt 0.11596 0.358203 -v -8261 -5265.26 4245.75 -vt 0.11596 0.358652 -v -8261 -5265.26 5773.65 -vt 0.103491 0.358652 -v -8216 -5265.26 5773.65 -vt 0.103491 0.358203 -v -8381 -5265.26 4245.75 -vt 0.11596 0.359852 -v -8381 -5265.26 5773.65 -vt 0.103491 0.359852 -o mesh2394 -s off -f 11767/11767/11767 11768/11768/11768 11769/11769/11769 -f 11767/11767/11767 11769/11769/11769 11770/11770/11770 -f 11771/11771/11771 11772/11772/11772 11769/11769/11769 -f 11771/11771/11771 11769/11769/11769 11768/11768/11768 -g charts -o chart0000 -s off -f 11767/11767/11767 11768/11768/11768 11769/11769/11769 -f 11767/11767/11767 11769/11769/11769 11770/11770/11770 -f 11771/11771/11771 11772/11772/11772 11769/11769/11769 -f 11771/11771/11771 11769/11769/11769 11768/11768/11768 -v -8216 -5265.26 5773.65 -vt 0.163342 0.536274 -v -8261 -5265.26 5773.65 -vt 0.163342 0.536723 -v -8261 -4427.76 5773.65 -vt 0.156692 0.536723 -v -8216 -4427.76 5773.65 -vt 0.156692 0.536274 -v -8381 -5265.26 5773.65 -vt 0.163342 0.537922 -v -8381 -4427.76 5773.65 -vt 0.156692 0.537922 -o mesh2395 -s off -f 11773/11773/11773 11774/11774/11774 11775/11775/11775 -f 11773/11773/11773 11775/11775/11775 11776/11776/11776 -f 11777/11777/11777 11778/11778/11778 11775/11775/11775 -f 11777/11777/11777 11775/11775/11775 11774/11774/11774 -g charts -o chart0000 -s off -f 11773/11773/11773 11774/11774/11774 11775/11775/11775 -f 11773/11773/11773 11775/11775/11775 11776/11776/11776 -f 11777/11777/11777 11778/11778/11778 11775/11775/11775 -f 11777/11777/11777 11775/11775/11775 11774/11774/11774 -v -8216 -4427.76 5773.65 -vt 0.32128 0.974856 -v -8261 -4427.76 5773.65 -vt 0.32128 0.974406 -v -8261 -4427.76 4245.75 -vt 0.308811 0.974406 -v -8216 -4427.76 4245.75 -vt 0.308811 0.974856 -v -8381 -4427.76 5773.65 -vt 0.32128 0.973207 -v -8381 -4427.76 4245.75 -vt 0.308811 0.973207 -o mesh2396 -s off -f 11779/11779/11779 11780/11780/11780 11781/11781/11781 -f 11779/11779/11779 11781/11781/11781 11782/11782/11782 -f 11783/11783/11783 11784/11784/11784 11781/11781/11781 -f 11783/11783/11783 11781/11781/11781 11780/11780/11780 -g charts -o chart0000 -s off -f 11779/11779/11779 11780/11780/11780 11781/11781/11781 -f 11779/11779/11779 11781/11781/11781 11782/11782/11782 -f 11783/11783/11783 11784/11784/11784 11781/11781/11781 -f 11783/11783/11783 11781/11781/11781 11780/11780/11780 -v -8261 -4427.76 4245.75 -vt 0.268911 0.964138 -v -8261 -4477.76 4295.44 -vt 0.268514 0.963314 -v -8261 -5265.26 4245.75 -vt 0.262261 0.964138 -v -8261 -5215.26 4295.44 -vt 0.262658 0.963314 -o mesh2397 -s off -f 11785/11785/11785 11786/11786/11786 11787/11787/11787 -f 11788/11788/11788 11787/11787/11787 11786/11786/11786 -g charts -o chart0000 -s off -f 11785/11785/11785 11786/11786/11786 11787/11787/11787 -f 11788/11788/11788 11787/11787/11787 11786/11786/11786 -v -8261 -4477.76 4295.44 -vt 0.919358 0.425804 -v -8261 -4427.76 4245.75 -vt 0.918953 0.426628 -v -8261 -4427.76 5773.65 -vt 0.931421 0.426628 -o mesh2398 -s off -f 11789/11789/11789 11790/11790/11790 11791/11791/11791 -g charts -o chart0000 -s off -f 11789/11789/11789 11790/11790/11790 11791/11791/11791 -v -8261 -4477.76 4295.44 -vt 0.0211968 0.890767 -v -8261 -4427.76 5773.65 -vt 0.0211969 0.903133 -v -8261 -4477.76 5723.96 -vt 0.0203658 0.902703 -o mesh2399 -s off -f 11792/11792/11792 11793/11793/11793 11794/11794/11794 -g charts -o chart0000 -s off -f 11792/11792/11792 11793/11793/11793 11794/11794/11794 -v -8261 -4477.76 5723.96 -vt 0.335027 0.847898 -v -8261 -4427.76 5773.65 -vt 0.33458 0.848722 -v -8261 -5215.26 5723.96 -vt 0.34123 0.848722 -o mesh2400 -s off -f 11795/11795/11795 11796/11796/11796 11797/11797/11797 -g charts -o chart0000 -s off -f 11795/11795/11795 11796/11796/11796 11797/11797/11797 -v -8261 -5265.26 4245.75 -vt 0.330424 0.338417 -v -8261 -5215.26 4295.44 -vt 0.330018 0.337593 -v -8261 -5265.26 5773.65 -vt 0.317955 0.338417 -o mesh2401 -s off -f 11798/11798/11798 11799/11799/11799 11800/11800/11800 -g charts -o chart0000 -s off -f 11798/11798/11798 11799/11799/11799 11800/11800/11800 -v -8261 -5265.26 5773.65 -vt 0.78512 0.889942 -v -8261 -5215.26 4295.44 -vt 0.78512 0.902308 -v -8261 -5215.26 5723.96 -vt 0.784289 0.890372 -o mesh2402 -s off -f 11801/11801/11801 11802/11802/11802 11803/11803/11803 -g charts -o chart0000 -s off -f 11801/11801/11801 11802/11802/11802 11803/11803/11803 -v -8261 -5265.26 5773.65 -vt 0.871571 0.160346 -v -8261 -5215.26 5723.96 -vt 0.87074 0.159952 -v -8261 -4427.76 5773.65 -vt 0.871571 0.153751 -o mesh2403 -s off -f 11804/11804/11804 11805/11805/11805 11806/11806/11806 -g charts -o chart0000 -s off -f 11804/11804/11804 11805/11805/11805 11806/11806/11806 -v -8381 -5215.26 5723.96 -vt 0.165004 0.819868 -v -8336 -4857.45 5723.96 -vt 0.162181 0.81925 -v -8261 -5215.26 5723.96 -vt 0.165004 0.818219 -v -8381 -4477.76 5723.96 -vt 0.159185 0.819868 -v -8336 -4835.57 5723.96 -vt 0.162008 0.81925 -v -8306 -4835.57 5723.96 -vt 0.162008 0.818838 -v -8306 -4857.45 5723.96 -vt 0.162181 0.818838 -v -8261 -4477.76 5723.96 -vt 0.159185 0.818219 -o mesh2404 -s off -f 11807/11807/11807 11808/11808/11808 11809/11809/11809 -f 11808/11808/11808 11807/11807/11807 11810/11810/11810 -f 11808/11808/11808 11810/11810/11810 11811/11811/11811 -f 11811/11811/11811 11810/11810/11810 11812/11812/11812 -f 11809/11809/11809 11813/11813/11813 11814/11814/11814 -f 11813/11813/11813 11809/11809/11809 11808/11808/11808 -f 11814/11814/11814 11813/11813/11813 11812/11812/11812 -f 11814/11814/11814 11812/11812/11812 11810/11810/11810 -g charts -o chart0000 -s off -f 11807/11807/11807 11808/11808/11808 11809/11809/11809 -f 11808/11808/11808 11807/11807/11807 11810/11810/11810 -f 11808/11808/11808 11810/11810/11810 11811/11811/11811 -f 11811/11811/11811 11810/11810/11810 11812/11812/11812 -f 11809/11809/11809 11813/11813/11813 11814/11814/11814 -f 11813/11813/11813 11809/11809/11809 11808/11808/11808 -f 11814/11814/11814 11813/11813/11813 11812/11812/11812 -f 11814/11814/11814 11812/11812/11812 11810/11810/11810 -v -8261 -4477.76 5723.96 -vt 0.172485 0.359852 -v -8306 -4477.76 5018.08 -vt 0.173109 0.354148 -v -8261 -4477.76 4295.44 -vt 0.172485 0.34831 -v -8381 -4477.76 5723.96 -vt 0.174148 0.359852 -v -8336 -4477.76 5018.08 -vt 0.173524 0.354148 -v -8336 -4477.76 5001.32 -vt 0.173524 0.354013 -v -8306 -4477.76 5001.32 -vt 0.173109 0.354013 -v -8381 -4477.76 4295.44 -vt 0.174148 0.34831 -o mesh2405 -s off -f 11815/11815/11815 11816/11816/11816 11817/11817/11817 -f 11816/11816/11816 11815/11815/11815 11818/11818/11818 -f 11816/11816/11816 11818/11818/11818 11819/11819/11819 -f 11819/11819/11819 11818/11818/11818 11820/11820/11820 -f 11817/11817/11817 11821/11821/11821 11822/11822/11822 -f 11821/11821/11821 11817/11817/11817 11816/11816/11816 -f 11822/11822/11822 11821/11821/11821 11820/11820/11820 -f 11822/11822/11822 11820/11820/11820 11818/11818/11818 -g charts -o chart0000 -s off -f 11815/11815/11815 11816/11816/11816 11817/11817/11817 -f 11816/11816/11816 11815/11815/11815 11818/11818/11818 -f 11816/11816/11816 11818/11818/11818 11819/11819/11819 -f 11819/11819/11819 11818/11818/11818 11820/11820/11820 -f 11817/11817/11817 11821/11821/11821 11822/11822/11822 -f 11821/11821/11821 11817/11817/11817 11816/11816/11816 -f 11822/11822/11822 11821/11821/11821 11820/11820/11820 -f 11822/11822/11822 11820/11820/11820 11818/11818/11818 -v -8261 -5215.26 4295.44 -vt 0.858271 0.0556471 -v -8306 -4857.45 4295.44 -vt 0.858895 0.0528472 -v -8381 -5215.26 4295.44 -vt 0.859933 0.0556471 -v -8261 -4477.76 4295.44 -vt 0.858271 0.0498763 -v -8306 -4835.57 4295.44 -vt 0.858895 0.0526761 -v -8336 -4835.57 4295.44 -vt 0.85931 0.0526761 -v -8336 -4857.45 4295.44 -vt 0.85931 0.0528472 -v -8381 -4477.76 4295.44 -vt 0.859933 0.0498763 -o mesh2406 -s off -f 11823/11823/11823 11824/11824/11824 11825/11825/11825 -f 11824/11824/11824 11823/11823/11823 11826/11826/11826 -f 11824/11824/11824 11826/11826/11826 11827/11827/11827 -f 11827/11827/11827 11826/11826/11826 11828/11828/11828 -f 11825/11825/11825 11829/11829/11829 11830/11830/11830 -f 11829/11829/11829 11825/11825/11825 11824/11824/11824 -f 11830/11830/11830 11829/11829/11829 11828/11828/11828 -f 11830/11830/11830 11828/11828/11828 11826/11826/11826 -g charts -o chart0000 -s off -f 11823/11823/11823 11824/11824/11824 11825/11825/11825 -f 11824/11824/11824 11823/11823/11823 11826/11826/11826 -f 11824/11824/11824 11826/11826/11826 11827/11827/11827 -f 11827/11827/11827 11826/11826/11826 11828/11828/11828 -f 11825/11825/11825 11829/11829/11829 11830/11830/11830 -f 11829/11829/11829 11825/11825/11825 11824/11824/11824 -f 11830/11830/11830 11829/11829/11829 11828/11828/11828 -f 11830/11830/11830 11828/11828/11828 11826/11826/11826 -v -8381 -5215.26 4295.44 -vt 0.0835411 0.374691 -v -8381 -5215.26 5723.96 -vt 0.0719036 0.374691 -v -8261 -5215.26 5723.96 -vt 0.0719036 0.373042 -v -8261 -5215.26 4295.44 -vt 0.0835411 0.373042 -o mesh2407 -s off -f 11831/11831/11831 11832/11832/11832 11833/11833/11833 -f 11831/11831/11831 11833/11833/11833 11834/11834/11834 -g charts -o chart0000 -s off -f 11831/11831/11831 11832/11832/11832 11833/11833/11833 -f 11831/11831/11831 11833/11833/11833 11834/11834/11834 -v -8336 -4857.45 5723.96 -vt 0.712801 0.964138 -v -8336 -4835.57 5723.96 -vt 0.71197 0.964138 -v -8336 -4835.57 4295.44 -vt 0.71197 0.952597 -v -8336 -4857.45 4295.44 -vt 0.712801 0.952597 -o mesh2408 -s off -f 11835/11835/11835 11836/11836/11836 11837/11837/11837 -f 11835/11835/11835 11837/11837/11837 11838/11838/11838 -g charts -o chart0000 -s off -f 11835/11835/11835 11836/11836/11836 11837/11837/11837 -f 11835/11835/11835 11837/11837/11837 11838/11838/11838 -v -8336 -4835.57 5723.96 -vt 0.194929 0.894889 -v -8306 -4835.57 5723.96 -vt 0.194929 0.894064 -v -8306 -4835.57 4295.44 -vt 0.183292 0.894064 -v -8336 -4835.57 4295.44 -vt 0.183292 0.894889 -o mesh2409 -s off -f 11839/11839/11839 11840/11840/11840 11841/11841/11841 -f 11839/11839/11839 11841/11841/11841 11842/11842/11842 -g charts -o chart0000 -s off -f 11839/11839/11839 11840/11840/11840 11841/11841/11841 -f 11839/11839/11839 11841/11841/11841 11842/11842/11842 -v -8306 -5198.3 5018.08 -vt 0.94389 0.0531739 -v -8336 -5198.3 5018.08 -vt 0.94389 0.0539983 -v -8336 -5198.3 5001.32 -vt 0.944721 0.0539983 -v -8306 -5198.3 5001.32 -vt 0.944721 0.0531739 -o mesh2410 -s off -f 11843/11843/11843 11844/11844/11844 11845/11845/11845 -f 11843/11843/11843 11845/11845/11845 11846/11846/11846 -g charts -o chart0000 -s off -f 11843/11843/11843 11844/11844/11844 11845/11845/11845 -f 11843/11843/11843 11845/11845/11845 11846/11846/11846 -v -8306 -4477.76 5018.08 -vt 0.876558 0.868508 -v -8336 -4477.76 5018.08 -vt 0.875727 0.868508 -v -8336 -5198.3 5018.08 -vt 0.875727 0.862737 -v -8306 -5198.3 5018.08 -vt 0.876558 0.862737 -o mesh2411 -s off -f 11847/11847/11847 11848/11848/11848 11849/11849/11849 -f 11847/11847/11847 11849/11849/11849 11850/11850/11850 -g charts -o chart0000 -s off -f 11847/11847/11847 11848/11848/11848 11849/11849/11849 -f 11847/11847/11847 11849/11849/11849 11850/11850/11850 -v -8336 -4477.76 5018.08 -vt 0.613882 0.449711 -v -8336 -4477.76 5001.32 -vt 0.613051 0.449711 -v -8336 -5198.3 5001.32 -vt 0.613051 0.443941 -v -8336 -5198.3 5018.08 -vt 0.613882 0.443941 -o mesh2412 -s off -f 11851/11851/11851 11852/11852/11852 11853/11853/11853 -f 11851/11851/11851 11853/11853/11853 11854/11854/11854 -g charts -o chart0000 -s off -f 11851/11851/11851 11852/11852/11852 11853/11853/11853 -f 11851/11851/11851 11853/11853/11853 11854/11854/11854 -v -8336 -4477.76 5001.32 -vt 0.126766 0.583265 -v -8306 -4477.76 5001.32 -vt 0.126766 0.58244 -v -8306 -5198.3 5001.32 -vt 0.120948 0.58244 -v -8336 -5198.3 5001.32 -vt 0.120948 0.583265 -o mesh2413 -s off -f 11855/11855/11855 11856/11856/11856 11857/11857/11857 -f 11855/11855/11855 11857/11857/11857 11858/11858/11858 -g charts -o chart0000 -s off -f 11855/11855/11855 11856/11856/11856 11857/11857/11857 -f 11855/11855/11855 11857/11857/11857 11858/11858/11858 -v -8306 -4477.76 5001.32 -vt 0.659601 0.910552 -v -8306 -4477.76 5018.08 -vt 0.659601 0.909728 -v -8306 -5198.3 5018.08 -vt 0.653782 0.909728 -v -8306 -5198.3 5001.32 -vt 0.653782 0.910552 -o mesh2414 -s off -f 11859/11859/11859 11860/11860/11860 11861/11861/11861 -f 11859/11859/11859 11861/11861/11861 11862/11862/11862 -g charts -o chart0000 -s off -f 11859/11859/11859 11860/11860/11860 11861/11861/11861 -f 11859/11859/11859 11861/11861/11861 11862/11862/11862 -v -8306 -4857.45 5723.96 -vt 0.788445 0.95507 -v -8336 -4857.45 5723.96 -vt 0.788445 0.954246 -v -8336 -4857.45 4295.44 -vt 0.776808 0.954246 -v -8306 -4857.45 4295.44 -vt 0.776808 0.95507 -o mesh2415 -s off -f 11863/11863/11863 11864/11864/11864 11865/11865/11865 -f 11863/11863/11863 11865/11865/11865 11866/11866/11866 -g charts -o chart0000 -s off -f 11863/11863/11863 11864/11864/11864 11865/11865/11865 -f 11863/11863/11863 11865/11865/11865 11866/11866/11866 -v -8306 -4835.57 5723.96 -vt 0.875727 0.80338 -v -8306 -4857.45 5723.96 -vt 0.874896 0.80338 -v -8306 -4857.45 4295.44 -vt 0.874896 0.791838 -v -8306 -4835.57 4295.44 -vt 0.875727 0.791838 -o mesh2416 -s off -f 11867/11867/11867 11868/11868/11868 11869/11869/11869 -f 11867/11867/11867 11869/11869/11869 11870/11870/11870 -g charts -o chart0000 -s off -f 11867/11867/11867 11868/11868/11868 11869/11869/11869 -f 11867/11867/11867 11869/11869/11869 11870/11870/11870 -v -8381 -6241.51 4214.7 -vt 0.187448 0.79596 -v -8381 -6210.26 4245.75 -vt 0.188279 0.796218 -v -8381 -5341.51 4214.7 -vt 0.187448 0.80338 -v -8381 -5372.76 4245.75 -vt 0.188279 0.803122 -o mesh2417 -s off -f 11871/11871/11871 11872/11872/11872 11873/11873/11873 -f 11874/11874/11874 11873/11873/11873 11872/11872/11872 -g charts -o chart0000 -s off -f 11871/11871/11871 11872/11872/11872 11873/11873/11873 -f 11874/11874/11874 11873/11873/11873 11872/11872/11872 -v -8381 -6210.26 4245.75 -vt 0.920875 0.124897 -v -8381 -6241.51 4214.7 -vt 0.920615 0.125721 -v -8381 -6241.51 5804.7 -vt 0.933915 0.125721 -o mesh2418 -s off -f 11875/11875/11875 11876/11876/11876 11877/11877/11877 -g charts -o chart0000 -s off -f 11875/11875/11875 11876/11876/11876 11877/11877/11877 -v -8381 -6210.26 4245.75 -vt 0.839983 0.368096 -v -8381 -6241.51 5804.7 -vt 0.839983 0.380462 -v -8381 -6210.26 5773.65 -vt 0.839152 0.38021 -o mesh2419 -s off -f 11878/11878/11878 11879/11879/11879 11880/11880/11880 -g charts -o chart0000 -s off -f 11878/11878/11878 11879/11879/11879 11880/11880/11880 -v -8381 -6210.26 5773.65 -vt 0.694514 0.299122 -v -8381 -6241.51 5804.7 -vt 0.695345 0.298846 -v -8381 -5372.76 5773.65 -vt 0.695345 0.306265 -o mesh2420 -s off -f 11881/11881/11881 11882/11882/11882 11883/11883/11883 -g charts -o chart0000 -s off -f 11881/11881/11881 11882/11882/11882 11883/11883/11883 -v -8381 -5341.51 4214.7 -vt 0.362843 0.418384 -v -8381 -5372.76 4245.75 -vt 0.362012 0.418126 -v -8381 -5341.51 5804.7 -vt 0.362843 0.405194 -o mesh2421 -s off -f 11884/11884/11884 11885/11885/11885 11886/11886/11886 -g charts -o chart0000 -s off -f 11884/11884/11884 11885/11885/11885 11886/11886/11886 -v -8381 -5341.51 5804.7 -vt 0.918121 0.860264 -v -8381 -5372.76 4245.75 -vt 0.93059 0.860264 -v -8381 -5372.76 5773.65 -vt 0.918375 0.859439 -o mesh2422 -s off -f 11887/11887/11887 11888/11888/11888 11889/11889/11889 -g charts -o chart0000 -s off -f 11887/11887/11887 11888/11888/11888 11889/11889/11889 -v -8381 -5341.51 5804.7 -vt 0.884871 0.0300906 -v -8381 -5372.76 5773.65 -vt 0.884611 0.0292663 -v -8381 -6241.51 5804.7 -vt 0.87739 0.0300906 -o mesh2423 -s off -f 11890/11890/11890 11891/11891/11891 11892/11892/11892 -g charts -o chart0000 -s off -f 11890/11890/11890 11891/11891/11891 11892/11892/11892 -v -8216 -5341.51 4214.7 -vt 0.481712 0.413438 -v -8216 -5372.76 4245.75 -vt 0.481453 0.412613 -v -8216 -6241.51 4214.7 -vt 0.474231 0.413438 -v -8216 -6210.26 4245.75 -vt 0.474491 0.412613 -o mesh2424 -s off -f 11893/11893/11893 11894/11894/11894 11895/11895/11895 -f 11896/11896/11896 11895/11895/11895 11894/11894/11894 -g charts -o chart0000 -s off -f 11893/11893/11893 11894/11894/11894 11895/11895/11895 -f 11896/11896/11896 11895/11895/11895 11894/11894/11894 -v -8216 -5372.76 4245.75 -vt 0.634923 0.913026 -v -8216 -5341.51 4214.7 -vt 0.634663 0.91385 -v -8216 -5341.51 5804.7 -vt 0.647963 0.91385 -o mesh2425 -s off -f 11897/11897/11897 11898/11898/11898 11899/11899/11899 -g charts -o chart0000 -s off -f 11897/11897/11897 11898/11898/11898 11899/11899/11899 -v -8216 -5372.76 4245.75 -vt 0.557357 0.990519 -v -8216 -5341.51 5804.7 -vt 0.569825 0.990519 -v -8216 -5372.76 5773.65 -vt 0.569572 0.989695 -o mesh2426 -s off -f 11900/11900/11900 11901/11901/11901 11902/11902/11902 -g charts -o chart0000 -s off -f 11900/11900/11900 11901/11901/11901 11902/11902/11902 -v -8216 -5372.76 5773.65 -vt 0.381409 0.604699 -v -8216 -5341.51 5804.7 -vt 0.381131 0.605523 -v -8216 -6210.26 5773.65 -vt 0.388612 0.605523 -o mesh2427 -s off -f 11903/11903/11903 11904/11904/11904 11905/11905/11905 -g charts -o chart0000 -s off -f 11903/11903/11903 11904/11904/11904 11905/11905/11905 -v -8216 -6241.51 4214.7 -vt 0.99044 0.70033 -v -8216 -6210.26 4245.75 -vt 0.989609 0.700072 -v -8216 -6241.51 5804.7 -vt 0.99044 0.687139 -o mesh2428 -s off -f 11906/11906/11906 11907/11907/11907 11908/11908/11908 -g charts -o chart0000 -s off -f 11906/11906/11906 11907/11907/11907 11908/11908/11908 -v -8216 -6241.51 5804.7 -vt 0.0893599 0.598928 -v -8216 -6210.26 4245.75 -vt 0.101829 0.598928 -v -8216 -6210.26 5773.65 -vt 0.0896133 0.598104 -o mesh2429 -s off -f 11909/11909/11909 11910/11910/11910 11911/11911/11911 -g charts -o chart0000 -s off -f 11909/11909/11909 11910/11910/11910 11911/11911/11911 -v -8216 -6241.51 5804.7 -vt 0.952203 0.193322 -v -8216 -6210.26 5773.65 -vt 0.951372 0.193065 -v -8216 -5341.51 5804.7 -vt 0.952203 0.185903 -o mesh2430 -s off -f 11912/11912/11912 11913/11913/11913 11914/11914/11914 -g charts -o chart0000 -s off -f 11912/11912/11912 11913/11913/11913 11914/11914/11914 -v -8381 -5341.51 5804.7 -vt 0.10931 0.903957 -v -8381 -6241.51 5804.7 -vt 0.116791 0.903957 -v -8216 -6241.51 5804.7 -vt 0.116791 0.905606 -v -8216 -5341.51 5804.7 -vt 0.10931 0.905606 -o mesh2431 -s off -f 11915/11915/11915 11916/11916/11916 11917/11917/11917 -f 11915/11915/11915 11917/11917/11917 11918/11918/11918 -g charts -o chart0000 -s off -f 11915/11915/11915 11916/11916/11916 11917/11917/11917 -f 11915/11915/11915 11917/11917/11917 11918/11918/11918 -v -8381 -6241.51 5804.7 -vt 0.692851 0.604699 -v -8381 -6241.51 4214.7 -vt 0.706151 0.604699 -v -8216 -6241.51 4214.7 -vt 0.706151 0.606348 -v -8216 -6241.51 5804.7 -vt 0.692851 0.606348 -o mesh2432 -s off -f 11919/11919/11919 11920/11920/11920 11921/11921/11921 -f 11919/11919/11919 11921/11921/11921 11922/11922/11922 -g charts -o chart0000 -s off -f 11919/11919/11919 11920/11920/11920 11921/11921/11921 -f 11919/11919/11919 11921/11921/11921 11922/11922/11922 -v -8381 -6241.51 4214.7 -vt 0.152535 0.683017 -v -8381 -5341.51 4214.7 -vt 0.145054 0.683017 -v -8216 -5341.51 4214.7 -vt 0.145054 0.681369 -v -8216 -6241.51 4214.7 -vt 0.152535 0.681369 -o mesh2433 -s off -f 11923/11923/11923 11924/11924/11924 11925/11925/11925 -f 11923/11923/11923 11925/11925/11925 11926/11926/11926 -g charts -o chart0000 -s off -f 11923/11923/11923 11924/11924/11924 11925/11925/11925 -f 11923/11923/11923 11925/11925/11925 11926/11926/11926 -v -8381 -5341.51 4214.7 -vt 0.391937 0.522259 -v -8381 -5341.51 5804.7 -vt 0.378637 0.522259 -v -8216 -5341.51 5804.7 -vt 0.378637 0.52061 -v -8216 -5341.51 4214.7 -vt 0.391937 0.52061 -o mesh2434 -s off -f 11927/11927/11927 11928/11928/11928 11929/11929/11929 -f 11927/11927/11927 11929/11929/11929 11930/11930/11930 -g charts -o chart0000 -s off -f 11927/11927/11927 11928/11928/11928 11929/11929/11929 -f 11927/11927/11927 11929/11929/11929 11930/11930/11930 -v -8216 -5372.76 4245.75 -vt 0.93724 0.673949 -v -8261 -5372.76 4245.75 -vt 0.93724 0.673499 -v -8261 -6210.26 4245.75 -vt 0.93059 0.673499 -v -8216 -6210.26 4245.75 -vt 0.93059 0.673949 -v -8381 -5372.76 4245.75 -vt 0.93724 0.6723 -v -8381 -6210.26 4245.75 -vt 0.93059 0.6723 -o mesh2435 -s off -f 11931/11931/11931 11932/11932/11932 11933/11933/11933 -f 11931/11931/11931 11933/11933/11933 11934/11934/11934 -f 11935/11935/11935 11936/11936/11936 11933/11933/11933 -f 11935/11935/11935 11933/11933/11933 11932/11932/11932 -g charts -o chart0000 -s off -f 11931/11931/11931 11932/11932/11932 11933/11933/11933 -f 11931/11931/11931 11933/11933/11933 11934/11934/11934 -f 11935/11935/11935 11936/11936/11936 11933/11933/11933 -f 11935/11935/11935 11933/11933/11933 11932/11932/11932 -v -8216 -6210.26 4245.75 -vt 0.0236907 0.490107 -v -8261 -6210.26 4245.75 -vt 0.0236907 0.490557 -v -8261 -6210.26 5773.65 -vt 0.0112219 0.490557 -v -8216 -6210.26 5773.65 -vt 0.0112219 0.490107 -v -8381 -6210.26 4245.75 -vt 0.0236907 0.491756 -v -8381 -6210.26 5773.65 -vt 0.0112219 0.491756 -o mesh2436 -s off -f 11937/11937/11937 11938/11938/11938 11939/11939/11939 -f 11937/11937/11937 11939/11939/11939 11940/11940/11940 -f 11941/11941/11941 11942/11942/11942 11939/11939/11939 -f 11941/11941/11941 11939/11939/11939 11938/11938/11938 -g charts -o chart0000 -s off -f 11937/11937/11937 11938/11938/11938 11939/11939/11939 -f 11937/11937/11937 11939/11939/11939 11940/11940/11940 -f 11941/11941/11941 11942/11942/11942 11939/11939/11939 -f 11941/11941/11941 11939/11939/11939 11938/11938/11938 -v -8216 -6210.26 5773.65 -vt 0.960515 0.940231 -v -8261 -6210.26 5773.65 -vt 0.960515 0.94068 -v -8261 -5372.76 5773.65 -vt 0.953865 0.94068 -v -8216 -5372.76 5773.65 -vt 0.953865 0.940231 -v -8381 -6210.26 5773.65 -vt 0.960515 0.94188 -v -8381 -5372.76 5773.65 -vt 0.953865 0.94188 -o mesh2437 -s off -f 11943/11943/11943 11944/11944/11944 11945/11945/11945 -f 11943/11943/11943 11945/11945/11945 11946/11946/11946 -f 11947/11947/11947 11948/11948/11948 11945/11945/11945 -f 11947/11947/11947 11945/11945/11945 11944/11944/11944 -g charts -o chart0000 -s off -f 11943/11943/11943 11944/11944/11944 11945/11945/11945 -f 11943/11943/11943 11945/11945/11945 11946/11946/11946 -f 11947/11947/11947 11948/11948/11948 11945/11945/11945 -f 11947/11947/11947 11945/11945/11945 11944/11944/11944 -v -8216 -5372.76 5773.65 -vt 0.353699 0.999588 -v -8261 -5372.76 5773.65 -vt 0.353699 0.999138 -v -8261 -5372.76 4245.75 -vt 0.34123 0.999138 -v -8216 -5372.76 4245.75 -vt 0.34123 0.999588 -v -8381 -5372.76 5773.65 -vt 0.353699 0.997939 -v -8381 -5372.76 4245.75 -vt 0.34123 0.997939 -o mesh2438 -s off -f 11949/11949/11949 11950/11950/11950 11951/11951/11951 -f 11949/11949/11949 11951/11951/11951 11952/11952/11952 -f 11953/11953/11953 11954/11954/11954 11951/11951/11951 -f 11953/11953/11953 11951/11951/11951 11950/11950/11950 -g charts -o chart0000 -s off -f 11949/11949/11949 11950/11950/11950 11951/11951/11951 -f 11949/11949/11949 11951/11951/11951 11952/11952/11952 -f 11953/11953/11953 11954/11954/11954 11951/11951/11951 -f 11953/11953/11953 11951/11951/11951 11950/11950/11950 -v -8261 -5372.76 4245.75 -vt 0.448462 0.462902 -v -8261 -5422.76 4295.44 -vt 0.447631 0.462508 -v -8261 -6210.26 4245.75 -vt 0.448462 0.456307 -v -8261 -6160.26 4295.44 -vt 0.447631 0.4567 -o mesh2439 -s off -f 11955/11955/11955 11956/11956/11956 11957/11957/11957 -f 11958/11958/11958 11957/11957/11957 11956/11956/11956 -g charts -o chart0000 -s off -f 11955/11955/11955 11956/11956/11956 11957/11957/11957 -f 11958/11958/11958 11957/11957/11957 11956/11956/11956 -v -8261 -5422.76 4295.44 -vt 0.217779 0.94765 -v -8261 -5372.76 4245.75 -vt 0.217373 0.948475 -v -8261 -5372.76 5773.65 -vt 0.229842 0.948475 -o mesh2440 -s off -f 11959/11959/11959 11960/11960/11960 11961/11961/11961 -g charts -o chart0000 -s off -f 11959/11959/11959 11960/11960/11960 11961/11961/11961 -v -8261 -5422.76 4295.44 -vt 0.383624 0.785243 -v -8261 -5372.76 5773.65 -vt 0.396093 0.785243 -v -8261 -5422.76 5723.96 -vt 0.39566 0.784419 -o mesh2441 -s off -f 11962/11962/11962 11963/11963/11963 11964/11964/11964 -g charts -o chart0000 -s off -f 11962/11962/11962 11963/11963/11963 11964/11964/11964 -v -8261 -5422.76 5723.96 -vt 0.985453 0.181399 -v -8261 -5372.76 5773.65 -vt 0.986284 0.180956 -v -8261 -6160.26 5723.96 -vt 0.986284 0.187551 -o mesh2442 -s off -f 11965/11965/11965 11966/11966/11966 11967/11967/11967 -g charts -o chart0000 -s off -f 11965/11965/11965 11966/11966/11966 11967/11967/11967 -v -8261 -6210.26 4245.75 -vt 0.249792 0.663232 -v -8261 -6160.26 4295.44 -vt 0.248961 0.662829 -v -8261 -6210.26 5773.65 -vt 0.249792 0.650866 -o mesh2443 -s off -f 11968/11968/11968 11969/11969/11969 11970/11970/11970 -g charts -o chart0000 -s off -f 11968/11968/11968 11969/11969/11969 11970/11970/11970 -v -8261 -6210.26 5773.65 -vt 0.818371 0.0251443 -v -8261 -6160.26 4295.44 -vt 0.818371 0.0375102 -v -8261 -6160.26 5723.96 -vt 0.81754 0.0255736 -o mesh2444 -s off -f 11971/11971/11971 11972/11972/11972 11973/11973/11973 -g charts -o chart0000 -s off -f 11971/11971/11971 11972/11972/11972 11973/11973/11973 -v -8261 -6210.26 5773.65 -vt 0.487531 0.414262 -v -8261 -6160.26 5723.96 -vt 0.4867 0.413868 -v -8261 -5372.76 5773.65 -vt 0.487531 0.407667 -o mesh2445 -s off -f 11974/11974/11974 11975/11975/11975 11976/11976/11976 -g charts -o chart0000 -s off -f 11974/11974/11974 11975/11975/11975 11976/11976/11976 -v -8381 -6160.26 5723.96 -vt 0.0843723 0.180132 -v -8336 -5802.45 5723.96 -vt 0.0837489 0.177332 -v -8261 -6160.26 5723.96 -vt 0.0827099 0.180132 -v -8381 -5422.76 5723.96 -vt 0.0843723 0.174361 -v -8336 -5780.57 5723.96 -vt 0.0837489 0.177161 -v -8306 -5780.57 5723.96 -vt 0.0833333 0.177161 -v -8306 -5802.45 5723.96 -vt 0.0833333 0.177332 -v -8261 -5422.76 5723.96 -vt 0.0827099 0.174361 -o mesh2446 -s off -f 11977/11977/11977 11978/11978/11978 11979/11979/11979 -f 11978/11978/11978 11977/11977/11977 11980/11980/11980 -f 11978/11978/11978 11980/11980/11980 11981/11981/11981 -f 11981/11981/11981 11980/11980/11980 11982/11982/11982 -f 11979/11979/11979 11983/11983/11983 11984/11984/11984 -f 11983/11983/11983 11979/11979/11979 11978/11978/11978 -f 11984/11984/11984 11983/11983/11983 11982/11982/11982 -f 11984/11984/11984 11982/11982/11982 11980/11980/11980 -g charts -o chart0000 -s off -f 11977/11977/11977 11978/11978/11978 11979/11979/11979 -f 11978/11978/11978 11977/11977/11977 11980/11980/11980 -f 11978/11978/11978 11980/11980/11980 11981/11981/11981 -f 11981/11981/11981 11980/11980/11980 11982/11982/11982 -f 11979/11979/11979 11983/11983/11983 11984/11984/11984 -f 11983/11983/11983 11979/11979/11979 11978/11978/11978 -f 11984/11984/11984 11983/11983/11983 11982/11982/11982 -f 11984/11984/11984 11982/11982/11982 11980/11980/11980 -v -8261 -5422.76 5723.96 -vt 0.060266 0.789365 -v -8306 -5422.76 5018.08 -vt 0.0608894 0.783662 -v -8261 -5422.76 4295.44 -vt 0.060266 0.777824 -v -8381 -5422.76 5723.96 -vt 0.0619284 0.789365 -v -8336 -5422.76 5018.08 -vt 0.061305 0.783662 -v -8336 -5422.76 5001.32 -vt 0.061305 0.783527 -v -8306 -5422.76 5001.32 -vt 0.0608894 0.783527 -v -8381 -5422.76 4295.44 -vt 0.0619284 0.777824 -o mesh2447 -s off -f 11985/11985/11985 11986/11986/11986 11987/11987/11987 -f 11986/11986/11986 11985/11985/11985 11988/11988/11988 -f 11986/11986/11986 11988/11988/11988 11989/11989/11989 -f 11989/11989/11989 11988/11988/11988 11990/11990/11990 -f 11987/11987/11987 11991/11991/11991 11992/11992/11992 -f 11991/11991/11991 11987/11987/11987 11986/11986/11986 -f 11992/11992/11992 11991/11991/11991 11990/11990/11990 -f 11992/11992/11992 11990/11990/11990 11988/11988/11988 -g charts -o chart0000 -s off -f 11985/11985/11985 11986/11986/11986 11987/11987/11987 -f 11986/11986/11986 11985/11985/11985 11988/11988/11988 -f 11986/11986/11986 11988/11988/11988 11989/11989/11989 -f 11989/11989/11989 11988/11988/11988 11990/11990/11990 -f 11987/11987/11987 11991/11991/11991 11992/11992/11992 -f 11991/11991/11991 11987/11987/11987 11986/11986/11986 -f 11992/11992/11992 11991/11991/11991 11990/11990/11990 -f 11992/11992/11992 11990/11990/11990 11988/11988/11988 -v -8261 -6160.26 4295.44 -vt 0.716958 0.595631 -v -8306 -5802.45 4295.44 -vt 0.714135 0.596249 -v -8381 -6160.26 4295.44 -vt 0.716958 0.597279 -v -8261 -5422.76 4295.44 -vt 0.711139 0.595631 -v -8306 -5780.57 4295.44 -vt 0.713962 0.596249 -v -8336 -5780.57 4295.44 -vt 0.713962 0.596661 -v -8336 -5802.45 4295.44 -vt 0.714135 0.596661 -v -8381 -5422.76 4295.44 -vt 0.711139 0.597279 -o mesh2448 -s off -f 11993/11993/11993 11994/11994/11994 11995/11995/11995 -f 11994/11994/11994 11993/11993/11993 11996/11996/11996 -f 11994/11994/11994 11996/11996/11996 11997/11997/11997 -f 11997/11997/11997 11996/11996/11996 11998/11998/11998 -f 11995/11995/11995 11999/11999/11999 12000/12000/12000 -f 11999/11999/11999 11995/11995/11995 11994/11994/11994 -f 12000/12000/12000 11999/11999/11999 11998/11998/11998 -f 12000/12000/12000 11998/11998/11998 11996/11996/11996 -g charts -o chart0000 -s off -f 11993/11993/11993 11994/11994/11994 11995/11995/11995 -f 11994/11994/11994 11993/11993/11993 11996/11996/11996 -f 11994/11994/11994 11996/11996/11996 11997/11997/11997 -f 11997/11997/11997 11996/11996/11996 11998/11998/11998 -f 11995/11995/11995 11999/11999/11999 12000/12000/12000 -f 11999/11999/11999 11995/11995/11995 11994/11994/11994 -f 12000/12000/12000 11999/11999/11999 11998/11998/11998 -f 12000/12000/12000 11998/11998/11998 11996/11996/11996 -v -8381 -6160.26 4295.44 -vt 0.969659 0.421682 -v -8381 -6160.26 5723.96 -vt 0.958022 0.421682 -v -8261 -6160.26 5723.96 -vt 0.958022 0.420033 -v -8261 -6160.26 4295.44 -vt 0.969659 0.420033 -o mesh2449 -s off -f 12001/12001/12001 12002/12002/12002 12003/12003/12003 -f 12001/12001/12001 12003/12003/12003 12004/12004/12004 -g charts -o chart0000 -s off -f 12001/12001/12001 12002/12002/12002 12003/12003/12003 -f 12001/12001/12001 12003/12003/12003 12004/12004/12004 -v -8336 -5802.45 5723.96 -vt 0.943059 0.85202 -v -8336 -5780.57 5723.96 -vt 0.942228 0.85202 -v -8336 -5780.57 4295.44 -vt 0.942228 0.840478 -v -8336 -5802.45 4295.44 -vt 0.943059 0.840478 -o mesh2450 -s off -f 12005/12005/12005 12006/12006/12006 12007/12007/12007 -f 12005/12005/12005 12007/12007/12007 12008/12008/12008 -g charts -o chart0000 -s off -f 12005/12005/12005 12006/12006/12006 12007/12007/12007 -f 12005/12005/12005 12007/12007/12007 12008/12008/12008 -v -8336 -5780.57 5723.96 -vt 0.192435 0.58986 -v -8306 -5780.57 5723.96 -vt 0.192435 0.589035 -v -8306 -5780.57 4295.44 -vt 0.180798 0.589035 -v -8336 -5780.57 4295.44 -vt 0.180798 0.58986 -o mesh2451 -s off -f 12009/12009/12009 12010/12010/12010 12011/12011/12011 -f 12009/12009/12009 12011/12011/12011 12012/12012/12012 -g charts -o chart0000 -s off -f 12009/12009/12009 12010/12010/12010 12011/12011/12011 -f 12009/12009/12009 12011/12011/12011 12012/12012/12012 -v -8306 -6143.3 5018.08 -vt 0.931421 0.302968 -v -8336 -6143.3 5018.08 -vt 0.932253 0.302968 -v -8336 -6143.3 5001.32 -vt 0.932253 0.303792 -v -8306 -6143.3 5001.32 -vt 0.931421 0.303792 -o mesh2452 -s off -f 12013/12013/12013 12014/12014/12014 12015/12015/12015 -f 12013/12013/12013 12015/12015/12015 12016/12016/12016 -g charts -o chart0000 -s off -f 12013/12013/12013 12014/12014/12014 12015/12015/12015 -f 12013/12013/12013 12015/12015/12015 12016/12016/12016 -v -8306 -5422.76 5018.08 -vt 0.881546 0.256801 -v -8336 -5422.76 5018.08 -vt 0.880715 0.256801 -v -8336 -6143.3 5018.08 -vt 0.880715 0.251031 -v -8306 -6143.3 5018.08 -vt 0.881546 0.251031 -o mesh2453 -s off -f 12017/12017/12017 12018/12018/12018 12019/12019/12019 -f 12017/12017/12017 12019/12019/12019 12020/12020/12020 -g charts -o chart0000 -s off -f 12017/12017/12017 12018/12018/12018 12019/12019/12019 -f 12017/12017/12017 12019/12019/12019 12020/12020/12020 -v -8336 -5422.76 5018.08 -vt 0.331255 0.992168 -v -8336 -5422.76 5001.32 -vt 0.331255 0.991344 -v -8336 -6143.3 5001.32 -vt 0.325436 0.991344 -v -8336 -6143.3 5018.08 -vt 0.325436 0.992168 -o mesh2454 -s off -f 12021/12021/12021 12022/12022/12022 12023/12023/12023 -f 12021/12021/12021 12023/12023/12023 12024/12024/12024 -g charts -o chart0000 -s off -f 12021/12021/12021 12022/12022/12022 12023/12023/12023 -f 12021/12021/12021 12023/12023/12023 12024/12024/12024 -v -8336 -5422.76 5001.32 -vt 0.999584 0.712696 -v -8306 -5422.76 5001.32 -vt 0.998753 0.712696 -v -8306 -6143.3 5001.32 -vt 0.998753 0.706925 -v -8336 -6143.3 5001.32 -vt 0.999584 0.706925 -o mesh2455 -s off -f 12025/12025/12025 12026/12026/12026 12027/12027/12027 -f 12025/12025/12025 12027/12027/12027 12028/12028/12028 -g charts -o chart0000 -s off -f 12025/12025/12025 12026/12026/12026 12027/12027/12027 -f 12025/12025/12025 12027/12027/12027 12028/12028/12028 -v -8306 -5422.76 5001.32 -vt 0.631338 0.804204 -v -8306 -5422.76 5018.08 -vt 0.631338 0.80338 -v -8306 -6143.3 5018.08 -vt 0.62552 0.80338 -v -8306 -6143.3 5001.32 -vt 0.62552 0.804204 -o mesh2456 -s off -f 12029/12029/12029 12030/12030/12030 12031/12031/12031 -f 12029/12029/12029 12031/12031/12031 12032/12032/12032 -g charts -o chart0000 -s off -f 12029/12029/12029 12030/12030/12030 12031/12031/12031 -f 12029/12029/12029 12031/12031/12031 12032/12032/12032 -v -8306 -5802.45 5723.96 -vt 0.934746 0.879225 -v -8336 -5802.45 5723.96 -vt 0.934746 0.878401 -v -8336 -5802.45 4295.44 -vt 0.923109 0.878401 -v -8306 -5802.45 4295.44 -vt 0.923109 0.879225 -o mesh2457 -s off -f 12033/12033/12033 12034/12034/12034 12035/12035/12035 -f 12033/12033/12033 12035/12035/12035 12036/12036/12036 -g charts -o chart0000 -s off -f 12033/12033/12033 12034/12034/12034 12035/12035/12035 -f 12033/12033/12033 12035/12035/12035 12036/12036/12036 -v -8306 -5780.57 5723.96 -vt 0.626351 0.457131 -v -8306 -5802.45 5723.96 -vt 0.626351 0.456307 -v -8306 -5802.45 4295.44 -vt 0.614713 0.456307 -v -8306 -5780.57 4295.44 -vt 0.614713 0.457131 -o mesh2458 -s off -f 12037/12037/12037 12038/12038/12038 12039/12039/12039 -f 12037/12037/12037 12039/12039/12039 12040/12040/12040 -g charts -o chart0000 -s off -f 12037/12037/12037 12038/12038/12038 12039/12039/12039 -f 12037/12037/12037 12039/12039/12039 12040/12040/12040 -v -10413.5 17031 4509.82 -vt 0.844971 0.781946 -v -10413.5 17031 4499.7 -vt 0.845386 0.781946 -v -10413.5 17061 4499.7 -vt 0.845386 0.78277 -v -10413.5 17061 4509.82 -vt 0.844971 0.78277 -v -10413.5 17061 4489.58 -vt 0.845802 0.78277 -v -10413.5 17031 4489.58 -vt 0.845802 0.781946 -o mesh2459 -s off -f 12041/12041/12041 12042/12042/12042 12043/12043/12043 -f 12041/12041/12041 12043/12043/12043 12044/12044/12044 -f 12045/12045/12045 12043/12043/12043 12042/12042/12042 -f 12045/12045/12045 12042/12042/12042 12046/12046/12046 -g charts -o chart0000 -s off -f 12041/12041/12041 12042/12042/12042 12043/12043/12043 -f 12041/12041/12041 12043/12043/12043 12044/12044/12044 -f 12045/12045/12045 12043/12043/12043 12042/12042/12042 -f 12045/12045/12045 12042/12042/12042 12046/12046/12046 -v -12663.5 17031 4509.82 -vt 0.805902 0.724237 -v -12663.5 17031 4499.7 -vt 0.806318 0.724237 -v -12663.5 17061 4499.7 -vt 0.806318 0.725062 -v -12663.5 17061 4509.82 -vt 0.805902 0.725062 -v -12663.5 17061 4489.58 -vt 0.806733 0.725062 -v -12663.5 17031 4489.58 -vt 0.806733 0.724237 -o mesh2460 -s off -f 12047/12047/12047 12048/12048/12048 12049/12049/12049 -f 12047/12047/12047 12049/12049/12049 12050/12050/12050 -f 12051/12051/12051 12049/12049/12049 12048/12048/12048 -f 12051/12051/12051 12048/12048/12048 12052/12052/12052 -g charts -o chart0000 -s off -f 12047/12047/12047 12048/12048/12048 12049/12049/12049 -f 12047/12047/12047 12049/12049/12049 12050/12050/12050 -f 12051/12051/12051 12049/12049/12049 12048/12048/12048 -f 12051/12051/12051 12048/12048/12048 12052/12052/12052 -v -11538.5 17031 4509.82 -vt 0.997091 0.894889 -v -11538.5 17031 4499.7 -vt 0.997506 0.894889 -v -11538.5 17061 4499.7 -vt 0.997506 0.895713 -v -11538.5 17061 4509.82 -vt 0.997091 0.895713 -v -11538.5 17061 4489.58 -vt 0.997922 0.895713 -v -11538.5 17031 4489.58 -vt 0.997922 0.894889 -o mesh2461 -s off -f 12053/12053/12053 12054/12054/12054 12055/12055/12055 -f 12053/12053/12053 12055/12055/12055 12056/12056/12056 -f 12057/12057/12057 12055/12055/12055 12054/12054/12054 -f 12057/12057/12057 12054/12054/12054 12058/12058/12058 -g charts -o chart0000 -s off -f 12053/12053/12053 12054/12054/12054 12055/12055/12055 -f 12053/12053/12053 12055/12055/12055 12056/12056/12056 -f 12057/12057/12057 12055/12055/12055 12054/12054/12054 -f 12057/12057/12057 12054/12054/12054 12058/12058/12058 -v -10423.8 17751 1254.82 -vt 0.640482 0.680544 -v -10423.8 17751 1244.7 -vt 0.640898 0.680544 -v -10423.8 17781 1244.7 -vt 0.640898 0.681368 -v -10423.8 17781 1254.82 -vt 0.640482 0.681368 -v -10423.8 17781 1234.58 -vt 0.641313 0.681368 -v -10423.8 17751 1234.58 -vt 0.641313 0.680544 -o mesh2462 -s off -f 12059/12059/12059 12060/12060/12060 12061/12061/12061 -f 12059/12059/12059 12061/12061/12061 12062/12062/12062 -f 12063/12063/12063 12061/12061/12061 12060/12060/12060 -f 12063/12063/12063 12060/12060/12060 12064/12064/12064 -g charts -o chart0000 -s off -f 12059/12059/12059 12060/12060/12060 12061/12061/12061 -f 12059/12059/12059 12061/12061/12061 12062/12062/12062 -f 12063/12063/12063 12061/12061/12061 12060/12060/12060 -f 12063/12063/12063 12060/12060/12060 12064/12064/12064 -v -12673.8 17751 1254.82 -vt 0.593101 0.887469 -v -12673.8 17751 1244.7 -vt 0.593101 0.887881 -v -12673.8 17781 1244.7 -vt 0.593932 0.887881 -v -12673.8 17781 1254.82 -vt 0.593932 0.887469 -v -12673.8 17781 1234.58 -vt 0.593932 0.888293 -v -12673.8 17751 1234.58 -vt 0.593101 0.888293 -o mesh2463 -s off -f 12065/12065/12065 12066/12066/12066 12067/12067/12067 -f 12065/12065/12065 12067/12067/12067 12068/12068/12068 -f 12069/12069/12069 12067/12067/12067 12066/12066/12066 -f 12069/12069/12069 12066/12066/12066 12070/12070/12070 -g charts -o chart0000 -s off -f 12065/12065/12065 12066/12066/12066 12067/12067/12067 -f 12065/12065/12065 12067/12067/12067 12068/12068/12068 -f 12069/12069/12069 12067/12067/12067 12066/12066/12066 -f 12069/12069/12069 12066/12066/12066 12070/12070/12070 -v -11548.8 17751 1254.82 -vt 0.0170407 0.974856 -v -11548.8 17751 1244.7 -vt 0.0170407 0.975268 -v -11548.8 17781 1244.7 -vt 0.0178719 0.975268 -v -11548.8 17781 1254.82 -vt 0.0178719 0.974856 -v -11548.8 17781 1234.58 -vt 0.0178719 0.97568 -v -11548.8 17751 1234.58 -vt 0.0170407 0.97568 -o mesh2464 -s off -f 12071/12071/12071 12072/12072/12072 12073/12073/12073 -f 12071/12071/12071 12073/12073/12073 12074/12074/12074 -f 12075/12075/12075 12073/12073/12073 12072/12072/12072 -f 12075/12075/12075 12072/12072/12072 12076/12076/12076 -g charts -o chart0000 -s off -f 12071/12071/12071 12072/12072/12072 12073/12073/12073 -f 12071/12071/12071 12073/12073/12073 12074/12074/12074 -f 12075/12075/12075 12073/12073/12073 12072/12072/12072 -f 12075/12075/12075 12072/12072/12072 12076/12076/12076 -v 18986.5 9478.49 247.2 -vt 0.881546 0.948475 -v 18986.5 9515.99 284.7 -vt 0.882377 0.94879 -v 18986.5 10558.5 247.2 -vt 0.881546 0.957543 -v 18986.5 10521 284.7 -vt 0.882377 0.957228 -o mesh2465 -s off -f 12077/12077/12077 12078/12078/12078 12079/12079/12079 -f 12080/12080/12080 12079/12079/12079 12078/12078/12078 -g charts -o chart0000 -s off -f 12077/12077/12077 12078/12078/12078 12079/12079/12079 -f 12080/12080/12080 12079/12079/12079 12078/12078/12078 -v 18986.5 9515.99 284.7 -vt 0.920615 0.562961 -v 18986.5 9478.49 247.2 -vt 0.921446 0.562655 -v 18986.5 9478.49 2167.2 -vt 0.921446 0.578318 -o mesh2466 -s off -f 12081/12081/12081 12082/12082/12082 12083/12083/12083 -g charts -o chart0000 -s off -f 12081/12081/12081 12082/12082/12082 12083/12083/12083 -v 18986.5 9515.99 284.7 -vt 0.0253532 0.894064 -v 18986.5 9478.49 2167.2 -vt 0.0253532 0.908903 -v 18986.5 9515.99 2129.7 -vt 0.024522 0.908602 -o mesh2467 -s off -f 12084/12084/12084 12085/12085/12085 12086/12086/12086 -g charts -o chart0000 -s off -f 12084/12084/12084 12085/12085/12085 12086/12086/12086 -v 18986.5 9515.99 2129.7 -vt 0.817017 0.818219 -v 18986.5 9478.49 2167.2 -vt 0.816708 0.819044 -v 18986.5 10521 2129.7 -vt 0.825021 0.819044 -o mesh2468 -s off -f 12087/12087/12087 12088/12088/12088 12089/12089/12089 -g charts -o chart0000 -s off -f 12087/12087/12087 12088/12088/12088 12089/12089/12089 -v 18986.5 10558.5 247.2 -vt 0.173317 0.805029 -v 18986.5 10521 284.7 -vt 0.172485 0.804723 -v 18986.5 10558.5 2167.2 -vt 0.173317 0.789365 -o mesh2469 -s off -f 12090/12090/12090 12091/12091/12091 12092/12092/12092 -g charts -o chart0000 -s off -f 12090/12090/12090 12091/12091/12091 12092/12092/12092 -v 18986.5 10558.5 2167.2 -vt 0.908146 0.069662 -v 18986.5 10521 284.7 -vt 0.908146 0.0845012 -v 18986.5 10521 2129.7 -vt 0.907315 0.0699634 -o mesh2470 -s off -f 12093/12093/12093 12094/12094/12094 12095/12095/12095 -g charts -o chart0000 -s off -f 12093/12093/12093 12094/12094/12094 12095/12095/12095 -v 18986.5 10558.5 2167.2 -vt 0.5532 0.55441 -v 18986.5 10521 2129.7 -vt 0.552883 0.553586 -v 18986.5 9478.49 2167.2 -vt 0.544057 0.55441 -o mesh2471 -s off -f 12096/12096/12096 12097/12097/12097 12098/12098/12098 -g charts -o chart0000 -s off -f 12096/12096/12096 12097/12097/12097 12098/12098/12098 -v 19151.5 10558.5 247.2 -vt 0.386949 0.801731 -v 19151.5 10521 284.7 -vt 0.386118 0.801416 -v 19151.5 9478.49 247.2 -vt 0.386949 0.792663 -v 19151.5 9515.99 284.7 -vt 0.386118 0.792978 -o mesh2472 -s off -f 12099/12099/12099 12100/12100/12100 12101/12101/12101 -f 12102/12102/12102 12101/12101/12101 12100/12100/12100 -g charts -o chart0000 -s off -f 12099/12099/12099 12100/12100/12100 12101/12101/12101 -f 12102/12102/12102 12101/12101/12101 12100/12100/12100 -v 19151.5 10521 284.7 -vt 0.017872 0.888599 -v 19151.5 10558.5 247.2 -vt 0.0187032 0.888294 -v 19151.5 10558.5 2167.2 -vt 0.0187032 0.903957 -o mesh2473 -s off -f 12103/12103/12103 12104/12104/12104 12105/12105/12105 -g charts -o chart0000 -s off -f 12103/12103/12103 12104/12104/12104 12105/12105/12105 -v 19151.5 10521 284.7 -vt 0.922278 0.174361 -v 19151.5 10558.5 2167.2 -vt 0.922278 0.1892 -v 19151.5 10521 2129.7 -vt 0.921446 0.188899 -o mesh2474 -s off -f 12106/12106/12106 12107/12107/12107 12108/12108/12108 -g charts -o chart0000 -s off -f 12106/12106/12106 12107/12107/12107 12108/12108/12108 -v 19151.5 10521 2129.7 -vt 0.284183 0.845425 -v 19151.5 10558.5 2167.2 -vt 0.283874 0.846249 -v 19151.5 9515.99 2129.7 -vt 0.292186 0.846249 -o mesh2475 -s off -f 12109/12109/12109 12110/12110/12110 12111/12111/12111 -g charts -o chart0000 -s off -f 12109/12109/12109 12110/12110/12110 12111/12111/12111 -v 19151.5 9478.49 247.2 -vt 0.762677 0.981451 -v 19151.5 9515.99 284.7 -vt 0.762368 0.980627 -v 19151.5 9478.49 2167.2 -vt 0.746883 0.981451 -o mesh2476 -s off -f 12112/12112/12112 12113/12113/12113 12114/12114/12114 -g charts -o chart0000 -s off -f 12112/12112/12112 12113/12113/12113 12114/12114/12114 -v 19151.5 9478.49 2167.2 -vt 0.44015 0.14798 -v 19151.5 9515.99 284.7 -vt 0.455112 0.14798 -v 19151.5 9515.99 2129.7 -vt 0.440454 0.147156 -o mesh2477 -s off -f 12115/12115/12115 12116/12116/12116 12117/12117/12117 -g charts -o chart0000 -s off -f 12115/12115/12115 12116/12116/12116 12117/12117/12117 -v 19151.5 9478.49 2167.2 -vt 0.34788 0.606348 -v 19151.5 9515.99 2129.7 -vt 0.347563 0.605523 -v 19151.5 10558.5 2167.2 -vt 0.338737 0.606348 -o mesh2478 -s off -f 12118/12118/12118 12119/12119/12119 12120/12120/12120 -g charts -o chart0000 -s off -f 12118/12118/12118 12119/12119/12119 12120/12120/12120 -v 18986.5 10558.5 2167.2 -vt 0.400249 0.650041 -v 18986.5 9478.49 2167.2 -vt 0.400249 0.65911 -v 19151.5 9478.49 2167.2 -vt 0.401912 0.65911 -v 19151.5 10558.5 2167.2 -vt 0.401912 0.650041 -o mesh2479 -s off -f 12121/12121/12121 12122/12122/12122 12123/12123/12123 -f 12121/12121/12121 12123/12123/12123 12124/12124/12124 -g charts -o chart0000 -s off -f 12121/12121/12121 12122/12122/12122 12123/12123/12123 -f 12121/12121/12121 12123/12123/12123 12124/12124/12124 -v 18986.5 9478.49 2167.2 -vt 0.355362 0.495878 -v 18986.5 9478.49 247.2 -vt 0.371155 0.495878 -v 19151.5 9478.49 247.2 -vt 0.371155 0.497527 -v 19151.5 9478.49 2167.2 -vt 0.355362 0.497527 -o mesh2480 -s off -f 12125/12125/12125 12126/12126/12126 12127/12127/12127 -f 12125/12125/12125 12127/12127/12127 12128/12128/12128 -g charts -o chart0000 -s off -f 12125/12125/12125 12126/12126/12126 12127/12127/12127 -f 12125/12125/12125 12127/12127/12127 12128/12128/12128 -v 18986.5 9478.49 247.2 -vt 0.766833 0.832234 -v 18986.5 10558.5 247.2 -vt 0.757689 0.832234 -v 19151.5 10558.5 247.2 -vt 0.757689 0.830585 -v 19151.5 9478.49 247.2 -vt 0.766833 0.830585 -o mesh2481 -s off -f 12129/12129/12129 12130/12130/12130 12131/12131/12131 -f 12129/12129/12129 12131/12131/12131 12132/12132/12132 -g charts -o chart0000 -s off -f 12129/12129/12129 12130/12130/12130 12131/12131/12131 -f 12129/12129/12129 12131/12131/12131 12132/12132/12132 -v 18986.5 10558.5 247.2 -vt 0.818371 0.985573 -v 18986.5 10558.5 2167.2 -vt 0.802577 0.985573 -v 19151.5 10558.5 2167.2 -vt 0.802577 0.983924 -v 19151.5 10558.5 247.2 -vt 0.818371 0.983924 -o mesh2482 -s off -f 12133/12133/12133 12134/12134/12134 12135/12135/12135 -f 12133/12133/12133 12135/12135/12135 12136/12136/12136 -g charts -o chart0000 -s off -f 12133/12133/12133 12134/12134/12134 12135/12135/12135 -f 12133/12133/12133 12135/12135/12135 12136/12136/12136 -v 19151.5 10521 284.7 -vt 0.654613 0.985573 -v 19106.5 10521 284.7 -vt 0.65416 0.985573 -v 19106.5 9515.99 284.7 -vt 0.65416 0.977329 -v 19151.5 9515.99 284.7 -vt 0.654613 0.977329 -v 18986.5 10521 284.7 -vt 0.652951 0.985573 -v 18986.5 9515.99 284.7 -vt 0.652951 0.977329 -o mesh2483 -s off -f 12137/12137/12137 12138/12138/12138 12139/12139/12139 -f 12137/12137/12137 12139/12139/12139 12140/12140/12140 -f 12141/12141/12141 12142/12142/12142 12139/12139/12139 -f 12141/12141/12141 12139/12139/12139 12138/12138/12138 -g charts -o chart0000 -s off -f 12137/12137/12137 12138/12138/12138 12139/12139/12139 -f 12137/12137/12137 12139/12139/12139 12140/12140/12140 -f 12141/12141/12141 12142/12142/12142 12139/12139/12139 -f 12141/12141/12141 12139/12139/12139 12138/12138/12138 -v 19151.5 9515.99 284.7 -vt 0.502494 0.527205 -v 19106.5 9515.99 284.7 -vt 0.502494 0.527655 -v 19106.5 9515.99 2129.7 -vt 0.487531 0.527655 -v 19151.5 9515.99 2129.7 -vt 0.487531 0.527205 -v 18986.5 9515.99 284.7 -vt 0.502494 0.528854 -v 18986.5 9515.99 2129.7 -vt 0.487531 0.528854 -o mesh2484 -s off -f 12143/12143/12143 12144/12144/12144 12145/12145/12145 -f 12143/12143/12143 12145/12145/12145 12146/12146/12146 -f 12147/12147/12147 12148/12148/12148 12145/12145/12145 -f 12147/12147/12147 12145/12145/12145 12144/12144/12144 -g charts -o chart0000 -s off -f 12143/12143/12143 12144/12144/12144 12145/12145/12145 -f 12143/12143/12143 12145/12145/12145 12146/12146/12146 -f 12147/12147/12147 12148/12148/12148 12145/12145/12145 -f 12147/12147/12147 12145/12145/12145 12144/12144/12144 -v 19151.5 9515.99 2129.7 -vt 0.319618 0.753916 -v 19106.5 9515.99 2129.7 -vt 0.320071 0.753916 -v 19106.5 10521 2129.7 -vt 0.320071 0.745672 -v 19151.5 10521 2129.7 -vt 0.319618 0.745672 -v 18986.5 9515.99 2129.7 -vt 0.32128 0.753916 -v 18986.5 10521 2129.7 -vt 0.32128 0.745672 -o mesh2485 -s off -f 12149/12149/12149 12150/12150/12150 12151/12151/12151 -f 12149/12149/12149 12151/12151/12151 12152/12152/12152 -f 12153/12153/12153 12154/12154/12154 12151/12151/12151 -f 12153/12153/12153 12151/12151/12151 12150/12150/12150 -g charts -o chart0000 -s off -f 12149/12149/12149 12150/12150/12150 12151/12151/12151 -f 12149/12149/12149 12151/12151/12151 12152/12152/12152 -f 12153/12153/12153 12154/12154/12154 12151/12151/12151 -f 12153/12153/12153 12151/12151/12151 12150/12150/12150 -v 19151.5 10521 2129.7 -vt 0.213217 0.446414 -v 19106.5 10521 2129.7 -vt 0.213217 0.445964 -v 19106.5 10521 284.7 -vt 0.198254 0.445964 -v 19151.5 10521 284.7 -vt 0.198254 0.446414 -v 18986.5 10521 2129.7 -vt 0.213217 0.444765 -v 18986.5 10521 284.7 -vt 0.198254 0.444765 -o mesh2486 -s off -f 12155/12155/12155 12156/12156/12156 12157/12157/12157 -f 12155/12155/12155 12157/12157/12157 12158/12158/12158 -f 12159/12159/12159 12160/12160/12160 12157/12157/12157 -f 12159/12159/12159 12157/12157/12157 12156/12156/12156 -g charts -o chart0000 -s off -f 12155/12155/12155 12156/12156/12156 12157/12157/12157 -f 12155/12155/12155 12157/12157/12157 12158/12158/12158 -f 12159/12159/12159 12160/12160/12160 12157/12157/12157 -f 12159/12159/12159 12157/12157/12157 12156/12156/12156 -v 19106.5 10521 284.7 -vt 0.516625 0.710222 -v 19106.5 10461 344.7 -vt 0.515794 0.70973 -v 19106.5 9515.99 284.7 -vt 0.516625 0.701979 -v 19106.5 9575.99 344.7 -vt 0.515794 0.702471 -o mesh2487 -s off -f 12161/12161/12161 12162/12162/12162 12163/12163/12163 -f 12164/12164/12164 12163/12163/12163 12162/12162/12162 -g charts -o chart0000 -s off -f 12161/12161/12161 12162/12162/12162 12163/12163/12163 -f 12164/12164/12164 12163/12163/12163 12162/12162/12162 -v 19106.5 10461 344.7 -vt 0.987116 0.15918 -v 19106.5 10521 284.7 -vt 0.987947 0.158697 -v 19106.5 10521 2129.7 -vt 0.987947 0.173537 -o mesh2488 -s off -f 12165/12165/12165 12166/12166/12166 12167/12167/12167 -g charts -o chart0000 -s off -f 12165/12165/12165 12166/12166/12166 12167/12167/12167 -v 19106.5 10461 344.7 -vt 0.514963 0.930338 -v 19106.5 10521 2129.7 -vt 0.529094 0.930338 -v 19106.5 10461 2069.7 -vt 0.528603 0.929514 -o mesh2489 -s off -f 12168/12168/12168 12169/12169/12169 12170/12170/12170 -g charts -o chart0000 -s off -f 12168/12168/12168 12169/12169/12169 12170/12170/12170 -v 19106.5 10461 2069.7 -vt 0.0782255 0.910552 -v 19106.5 10521 2129.7 -vt 0.0777224 0.911377 -v 19106.5 9575.99 2069.7 -vt 0.0852036 0.911377 -o mesh2490 -s off -f 12171/12171/12171 12172/12172/12172 12173/12173/12173 -g charts -o chart0000 -s off -f 12171/12171/12171 12172/12172/12172 12173/12173/12173 -v 19106.5 9515.99 284.7 -vt 0.256442 0.948475 -v 19106.5 9575.99 344.7 -vt 0.255955 0.94765 -v 19106.5 9515.99 2129.7 -vt 0.24148 0.948475 -o mesh2491 -s off -f 12174/12174/12174 12175/12175/12175 12176/12176/12176 -g charts -o chart0000 -s off -f 12174/12174/12174 12175/12175/12175 12176/12176/12176 -v 19106.5 9515.99 2129.7 -vt 0.273899 0.682193 -v 19106.5 9575.99 344.7 -vt 0.273898 0.696208 -v 19106.5 9575.99 2069.7 -vt 0.273067 0.682679 -o mesh2492 -s off -f 12177/12177/12177 12178/12178/12178 12179/12179/12179 -g charts -o chart0000 -s off -f 12177/12177/12177 12178/12178/12178 12179/12179/12179 -v 19106.5 9515.99 2129.7 -vt 0.0677472 0.707749 -v 19106.5 9575.99 2069.7 -vt 0.0672509 0.706925 -v 19106.5 10521 2129.7 -vt 0.0594347 0.707749 -o mesh2493 -s off -f 12180/12180/12180 12181/12181/12181 12182/12182/12182 -g charts -o chart0000 -s off -f 12180/12180/12180 12181/12181/12181 12182/12182/12182 -v 18986.5 9575.99 2069.7 -vt 0.889859 0.138912 -v 19031.5 10005.4 2069.7 -vt 0.886229 0.138293 -v 19106.5 9575.99 2069.7 -vt 0.889859 0.137263 -v 18986.5 10461 2069.7 -vt 0.882377 0.138912 -v 19031.5 10031.6 2069.7 -vt 0.886007 0.138293 -v 19061.5 10031.6 2069.7 -vt 0.886007 0.137881 -v 19061.5 10005.4 2069.7 -vt 0.886229 0.137881 -v 19106.5 10461 2069.7 -vt 0.882377 0.137263 -o mesh2494 -s off -f 12183/12183/12183 12184/12184/12184 12185/12185/12185 -f 12184/12184/12184 12183/12183/12183 12186/12186/12186 -f 12184/12184/12184 12186/12186/12186 12187/12187/12187 -f 12187/12187/12187 12186/12186/12186 12188/12188/12188 -f 12185/12185/12185 12189/12189/12189 12190/12190/12190 -f 12189/12189/12189 12185/12185/12185 12184/12184/12184 -f 12190/12190/12190 12189/12189/12189 12188/12188/12188 -f 12190/12190/12190 12188/12188/12188 12186/12186/12186 -g charts -o chart0000 -s off -f 12183/12183/12183 12184/12184/12184 12185/12185/12185 -f 12184/12184/12184 12183/12183/12183 12186/12186/12186 -f 12184/12184/12184 12186/12186/12186 12187/12187/12187 -f 12187/12187/12187 12186/12186/12186 12188/12188/12188 -f 12185/12185/12185 12189/12189/12189 12190/12190/12190 -f 12189/12189/12189 12185/12185/12185 12184/12184/12184 -f 12190/12190/12190 12189/12189/12189 12188/12188/12188 -f 12190/12190/12190 12188/12188/12188 12186/12186/12186 -v 19106.5 10461 2069.7 -vt 0.457606 0.910552 -v 19061.5 10461 1217.32 -vt 0.458229 0.903627 -v 19106.5 10461 344.7 -vt 0.457606 0.896537 -v 18986.5 10461 2069.7 -vt 0.459268 0.910552 -v 19031.5 10461 1217.32 -vt 0.458645 0.903627 -v 19031.5 10461 1197.08 -vt 0.458645 0.903463 -v 19061.5 10461 1197.08 -vt 0.458229 0.903463 -v 18986.5 10461 344.7 -vt 0.459268 0.896537 -o mesh2495 -s off -f 12191/12191/12191 12192/12192/12192 12193/12193/12193 -f 12192/12192/12192 12191/12191/12191 12194/12194/12194 -f 12192/12192/12192 12194/12194/12194 12195/12195/12195 -f 12195/12195/12195 12194/12194/12194 12196/12196/12196 -f 12193/12193/12193 12197/12197/12197 12198/12198/12198 -f 12197/12197/12197 12193/12193/12193 12192/12192/12192 -f 12198/12198/12198 12197/12197/12197 12196/12196/12196 -f 12198/12198/12198 12196/12196/12196 12194/12194/12194 -g charts -o chart0000 -s off -f 12191/12191/12191 12192/12192/12192 12193/12193/12193 -f 12192/12192/12192 12191/12191/12191 12194/12194/12194 -f 12192/12192/12192 12194/12194/12194 12195/12195/12195 -f 12195/12195/12195 12194/12194/12194 12196/12196/12196 -f 12193/12193/12193 12197/12197/12197 12198/12198/12198 -f 12197/12197/12197 12193/12193/12193 12192/12192/12192 -f 12198/12198/12198 12197/12197/12197 12196/12196/12196 -f 12198/12198/12198 12196/12196/12196 12194/12194/12194 -v 19106.5 9575.99 344.7 -vt 0.463425 0.936933 -v 19061.5 10005.4 344.7 -vt 0.464048 0.933334 -v 18986.5 9575.99 344.7 -vt 0.465087 0.936933 -v 19106.5 10461 344.7 -vt 0.463425 0.929514 -v 19061.5 10031.6 344.7 -vt 0.464048 0.933113 -v 19031.5 10031.6 344.7 -vt 0.464464 0.933113 -v 19031.5 10005.4 344.7 -vt 0.464464 0.933334 -v 18986.5 10461 344.7 -vt 0.465087 0.929514 -o mesh2496 -s off -f 12199/12199/12199 12200/12200/12200 12201/12201/12201 -f 12200/12200/12200 12199/12199/12199 12202/12202/12202 -f 12200/12200/12200 12202/12202/12202 12203/12203/12203 -f 12203/12203/12203 12202/12202/12202 12204/12204/12204 -f 12201/12201/12201 12205/12205/12205 12206/12206/12206 -f 12205/12205/12205 12201/12201/12201 12200/12200/12200 -f 12206/12206/12206 12205/12205/12205 12204/12204/12204 -f 12206/12206/12206 12204/12204/12204 12202/12202/12202 -g charts -o chart0000 -s off -f 12199/12199/12199 12200/12200/12200 12201/12201/12201 -f 12200/12200/12200 12199/12199/12199 12202/12202/12202 -f 12200/12200/12200 12202/12202/12202 12203/12203/12203 -f 12203/12203/12203 12202/12202/12202 12204/12204/12204 -f 12201/12201/12201 12205/12205/12205 12206/12206/12206 -f 12205/12205/12205 12201/12201/12201 12200/12200/12200 -f 12206/12206/12206 12205/12205/12205 12204/12204/12204 -f 12206/12206/12206 12204/12204/12204 12202/12202/12202 -v 18986.5 9575.99 344.7 -vt 0.196592 0.437345 -v 18986.5 9575.99 2069.7 -vt 0.182461 0.437345 -v 19106.5 9575.99 2069.7 -vt 0.182461 0.435697 -v 19106.5 9575.99 344.7 -vt 0.196592 0.435697 -o mesh2497 -s off -f 12207/12207/12207 12208/12208/12208 12209/12209/12209 -f 12207/12207/12207 12209/12209/12209 12210/12210/12210 -g charts -o chart0000 -s off -f 12207/12207/12207 12208/12208/12208 12209/12209/12209 -f 12207/12207/12207 12209/12209/12209 12210/12210/12210 -v 19031.5 10005.4 2069.7 -vt 0.581463 0.998763 -v 19031.5 10031.6 2069.7 -vt 0.581463 0.997939 -v 19031.5 10031.6 344.7 -vt 0.567332 0.997939 -v 19031.5 10005.4 344.7 -vt 0.567332 0.998763 -o mesh2498 -s off -f 12211/12211/12211 12212/12212/12212 12213/12213/12213 -f 12211/12211/12211 12213/12213/12213 12214/12214/12214 -g charts -o chart0000 -s off -f 12211/12211/12211 12212/12212/12212 12213/12213/12213 -f 12211/12211/12211 12213/12213/12213 12214/12214/12214 -v 19031.5 10031.6 2069.7 -vt 0.873233 0.745672 -v 19061.5 10031.6 2069.7 -vt 0.872402 0.745672 -v 19061.5 10031.6 344.7 -vt 0.872402 0.731657 -v 19031.5 10031.6 344.7 -vt 0.873233 0.731657 -o mesh2499 -s off -f 12215/12215/12215 12216/12216/12216 12217/12217/12217 -f 12215/12215/12215 12217/12217/12217 12218/12218/12218 -g charts -o chart0000 -s off -f 12215/12215/12215 12216/12216/12216 12217/12217/12217 -f 12215/12215/12215 12217/12217/12217 12218/12218/12218 -v 19061.5 9596.35 1217.32 -vt 0.0162095 0.22465 -v 19031.5 9596.35 1217.32 -vt 0.0170406 0.22465 -v 19031.5 9596.35 1197.08 -vt 0.0170406 0.225474 -v 19061.5 9596.35 1197.08 -vt 0.0162095 0.225474 -o mesh2500 -s off -f 12219/12219/12219 12220/12220/12220 12221/12221/12221 -f 12219/12219/12219 12221/12221/12221 12222/12222/12222 -g charts -o chart0000 -s off -f 12219/12219/12219 12220/12220/12220 12221/12221/12221 -f 12219/12219/12219 12221/12221/12221 12222/12222/12222 -v 19061.5 10461 1217.32 -vt 0.677057 0.933636 -v 19031.5 10461 1217.32 -vt 0.676226 0.933636 -v 19031.5 9596.35 1217.32 -vt 0.676226 0.926216 -v 19061.5 9596.35 1217.32 -vt 0.677057 0.926216 -o mesh2501 -s off -f 12223/12223/12223 12224/12224/12224 12225/12225/12225 -f 12223/12223/12223 12225/12225/12225 12226/12226/12226 -g charts -o chart0000 -s off -f 12223/12223/12223 12224/12224/12224 12225/12225/12225 -f 12223/12223/12223 12225/12225/12225 12226/12226/12226 -v 19031.5 10461 1217.32 -vt 0.120948 0.91385 -v 19031.5 10461 1197.08 -vt 0.120948 0.913026 -v 19031.5 9596.35 1197.08 -vt 0.113466 0.913026 -v 19031.5 9596.35 1217.32 -vt 0.113466 0.91385 -o mesh2502 -s off -f 12227/12227/12227 12228/12228/12228 12229/12229/12229 -f 12227/12227/12227 12229/12229/12229 12230/12230/12230 -g charts -o chart0000 -s off -f 12227/12227/12227 12228/12228/12228 12229/12229/12229 -f 12227/12227/12227 12229/12229/12229 12230/12230/12230 -v 19031.5 10461 1197.08 -vt 0.394431 0.891591 -v 19061.5 10461 1197.08 -vt 0.394431 0.890767 -v 19061.5 9596.35 1197.08 -vt 0.386949 0.890767 -v 19031.5 9596.35 1197.08 -vt 0.386949 0.891591 -o mesh2503 -s off -f 12231/12231/12231 12232/12232/12232 12233/12233/12233 -f 12231/12231/12231 12233/12233/12233 12234/12234/12234 -g charts -o chart0000 -s off -f 12231/12231/12231 12232/12232/12232 12233/12233/12233 -f 12231/12231/12231 12233/12233/12233 12234/12234/12234 -v 19061.5 10461 1197.08 -vt 0.410224 0.347485 -v 19061.5 10461 1217.32 -vt 0.410224 0.346661 -v 19061.5 9596.35 1217.32 -vt 0.402743 0.346661 -v 19061.5 9596.35 1197.08 -vt 0.402743 0.347485 -o mesh2504 -s off -f 12235/12235/12235 12236/12236/12236 12237/12237/12237 -f 12235/12235/12235 12237/12237/12237 12238/12238/12238 -g charts -o chart0000 -s off -f 12235/12235/12235 12236/12236/12236 12237/12237/12237 -f 12235/12235/12235 12237/12237/12237 12238/12238/12238 -v 19061.5 10005.4 2069.7 -vt 0.839983 0.0721351 -v 19031.5 10005.4 2069.7 -vt 0.839152 0.0721351 -v 19031.5 10005.4 344.7 -vt 0.839152 0.0581204 -v 19061.5 10005.4 344.7 -vt 0.839983 0.0581204 -o mesh2505 -s off -f 12239/12239/12239 12240/12240/12240 12241/12241/12241 -f 12239/12239/12239 12241/12241/12241 12242/12242/12242 -g charts -o chart0000 -s off -f 12239/12239/12239 12240/12240/12240 12241/12241/12241 -f 12239/12239/12239 12241/12241/12241 12242/12242/12242 -v 19061.5 10031.6 2069.7 -vt 0.914796 0.630255 -v 19061.5 10005.4 2069.7 -vt 0.914796 0.629431 -v 19061.5 10005.4 344.7 -vt 0.900665 0.629431 -v 19061.5 10031.6 344.7 -vt 0.900665 0.630255 -o mesh2506 -s off -f 12243/12243/12243 12244/12244/12244 12245/12245/12245 -f 12243/12243/12243 12245/12245/12245 12246/12246/12246 -g charts -o chart0000 -s off -f 12243/12243/12243 12244/12244/12244 12245/12245/12245 -f 12243/12243/12243 12245/12245/12245 12246/12246/12246 -v 18986.5 11728.5 247.2 -vt 0.93724 0.618714 -v 18986.5 11766 284.7 -vt 0.938071 0.619029 -v 18986.5 12808.5 247.2 -vt 0.93724 0.627782 -v 18986.5 12771 284.7 -vt 0.938071 0.627467 -o mesh2507 -s off -f 12247/12247/12247 12248/12248/12248 12249/12249/12249 -f 12250/12250/12250 12249/12249/12249 12248/12248/12248 -g charts -o chart0000 -s off -f 12247/12247/12247 12248/12248/12248 12249/12249/12249 -f 12250/12250/12250 12249/12249/12249 12248/12248/12248 -v 18986.5 11766 284.7 -vt 0.671547 0.826463 -v 18986.5 11728.5 247.2 -vt 0.671239 0.827288 -v 18986.5 11728.5 2167.2 -vt 0.687032 0.827288 -o mesh2508 -s off -f 12251/12251/12251 12252/12252/12252 12253/12253/12253 -g charts -o chart0000 -s off -f 12251/12251/12251 12252/12252/12252 12253/12253/12253 -v 18986.5 11766 284.7 -vt 0.866583 0.0441055 -v 18986.5 11728.5 2167.2 -vt 0.866583 0.0589447 -v 18986.5 11766 2129.7 -vt 0.865752 0.0586434 -o mesh2509 -s off -f 12254/12254/12254 12255/12255/12255 12256/12256/12256 -g charts -o chart0000 -s off -f 12254/12254/12254 12255/12255/12255 12256/12256/12256 -v 18986.5 11766 2129.7 -vt 0.46124 0.412613 -v 18986.5 11728.5 2167.2 -vt 0.460931 0.413438 -v 18986.5 12771 2129.7 -vt 0.469243 0.413438 -o mesh2510 -s off -f 12257/12257/12257 12258/12258/12258 12259/12259/12259 -g charts -o chart0000 -s off -f 12257/12257/12257 12258/12258/12258 12259/12259/12259 -v 18986.5 12808.5 247.2 -vt 0.918953 0.24526 -v 18986.5 12771 284.7 -vt 0.918644 0.244435 -v 18986.5 12808.5 2167.2 -vt 0.903159 0.24526 -o mesh2511 -s off -f 12260/12260/12260 12261/12261/12261 12262/12262/12262 -g charts -o chart0000 -s off -f 12260/12260/12260 12261/12261/12261 12262/12262/12262 -v 18986.5 12808.5 2167.2 -vt 0.913965 0.929514 -v 18986.5 12771 284.7 -vt 0.928928 0.929514 -v 18986.5 12771 2129.7 -vt 0.914269 0.928689 -o mesh2512 -s off -f 12263/12263/12263 12264/12264/12264 12265/12265/12265 -g charts -o chart0000 -s off -f 12263/12263/12263 12264/12264/12264 12265/12265/12265 -v 18986.5 12808.5 2167.2 -vt 0.839983 0.394476 -v 18986.5 12771 2129.7 -vt 0.839152 0.394161 -v 18986.5 11728.5 2167.2 -vt 0.839983 0.385408 -o mesh2513 -s off -f 12266/12266/12266 12267/12267/12267 12268/12268/12268 -g charts -o chart0000 -s off -f 12266/12266/12266 12267/12267/12267 12268/12268/12268 -v 19151.5 12808.5 247.2 -vt 0.931421 0.603875 -v 19151.5 12771 284.7 -vt 0.931104 0.60305 -v 19151.5 11728.5 247.2 -vt 0.922278 0.603875 -v 19151.5 11766 284.7 -vt 0.922595 0.60305 -o mesh2514 -s off -f 12269/12269/12269 12270/12270/12270 12271/12271/12271 -f 12272/12272/12272 12271/12271/12271 12270/12270/12270 -g charts -o chart0000 -s off -f 12269/12269/12269 12270/12270/12270 12271/12271/12271 -f 12272/12272/12272 12271/12271/12271 12270/12270/12270 -v 19151.5 12771 284.7 -vt 0.0195345 0.34944 -v 19151.5 12808.5 247.2 -vt 0.0203657 0.349134 -v 19151.5 12808.5 2167.2 -vt 0.0203657 0.364798 -o mesh2515 -s off -f 12273/12273/12273 12274/12274/12274 12275/12275/12275 -g charts -o chart0000 -s off -f 12273/12273/12273 12274/12274/12274 12275/12275/12275 -v 19151.5 12771 284.7 -vt 0.291355 0.795136 -v 19151.5 12808.5 2167.2 -vt 0.306317 0.795136 -v 19151.5 12771 2129.7 -vt 0.306014 0.794312 -o mesh2516 -s off -f 12276/12276/12276 12277/12277/12277 12278/12278/12278 -g charts -o chart0000 -s off -f 12276/12276/12276 12277/12277/12277 12278/12278/12278 -v 19151.5 12771 2129.7 -vt 0.247608 0.680544 -v 19151.5 12808.5 2167.2 -vt 0.247298 0.681368 -v 19151.5 11766 2129.7 -vt 0.255611 0.681368 -o mesh2517 -s off -f 12279/12279/12279 12280/12280/12280 12281/12281/12281 -g charts -o chart0000 -s off -f 12279/12279/12279 12280/12280/12280 12281/12281/12281 -v 19151.5 11728.5 247.2 -vt 0.992103 0.67972 -v 19151.5 11766 284.7 -vt 0.991795 0.678895 -v 19151.5 11728.5 2167.2 -vt 0.976309 0.679719 -o mesh2518 -s off -f 12282/12282/12282 12283/12283/12283 12284/12284/12284 -g charts -o chart0000 -s off -f 12282/12282/12282 12283/12283/12283 12284/12284/12284 -v 19151.5 11728.5 2167.2 -vt 0.627182 0.699505 -v 19151.5 11766 284.7 -vt 0.627182 0.714345 -v 19151.5 11766 2129.7 -vt 0.626351 0.699807 -o mesh2519 -s off -f 12285/12285/12285 12286/12286/12286 12287/12287/12287 -g charts -o chart0000 -s off -f 12285/12285/12285 12286/12286/12286 12287/12287/12287 -v 19151.5 11728.5 2167.2 -vt 0.5798 0.795136 -v 19151.5 11766 2129.7 -vt 0.578969 0.794821 -v 19151.5 12808.5 2167.2 -vt 0.5798 0.786068 -o mesh2520 -s off -f 12288/12288/12288 12289/12289/12289 12290/12290/12290 -g charts -o chart0000 -s off -f 12288/12288/12288 12289/12289/12289 12290/12290/12290 -v 18986.5 12808.5 2167.2 -vt 0.651288 0.955894 -v 18986.5 11728.5 2167.2 -vt 0.651288 0.964963 -v 19151.5 11728.5 2167.2 -vt 0.652951 0.964963 -v 19151.5 12808.5 2167.2 -vt 0.652951 0.955894 -o mesh2521 -s off -f 12291/12291/12291 12292/12292/12292 12293/12293/12293 -f 12291/12291/12291 12293/12293/12293 12294/12294/12294 -g charts -o chart0000 -s off -f 12291/12291/12291 12292/12292/12292 12293/12293/12293 -f 12291/12291/12291 12293/12293/12293 12294/12294/12294 -v 18986.5 11728.5 2167.2 -vt 0.112635 0.699505 -v 18986.5 11728.5 247.2 -vt 0.128429 0.699505 -v 19151.5 11728.5 247.2 -vt 0.128429 0.701154 -v 19151.5 11728.5 2167.2 -vt 0.112635 0.701154 -o mesh2522 -s off -f 12295/12295/12295 12296/12296/12296 12297/12297/12297 -f 12295/12295/12295 12297/12297/12297 12298/12298/12298 -g charts -o chart0000 -s off -f 12295/12295/12295 12296/12296/12296 12297/12297/12297 -f 12295/12295/12295 12297/12297/12297 12298/12298/12298 -v 18986.5 11728.5 247.2 -vt 0.515794 0.720115 -v 18986.5 12808.5 247.2 -vt 0.515794 0.711047 -v 19151.5 12808.5 247.2 -vt 0.514131 0.711047 -v 19151.5 11728.5 247.2 -vt 0.514131 0.720115 -o mesh2523 -s off -f 12299/12299/12299 12300/12300/12300 12301/12301/12301 -f 12299/12299/12299 12301/12301/12301 12302/12302/12302 -g charts -o chart0000 -s off -f 12299/12299/12299 12300/12300/12300 12301/12301/12301 -f 12299/12299/12299 12301/12301/12301 12302/12302/12302 -v 18986.5 12808.5 247.2 -vt 0.87739 0.963314 -v 18986.5 12808.5 2167.2 -vt 0.87739 0.94765 -v 19151.5 12808.5 2167.2 -vt 0.875727 0.94765 -v 19151.5 12808.5 247.2 -vt 0.875727 0.963314 -o mesh2524 -s off -f 12303/12303/12303 12304/12304/12304 12305/12305/12305 -f 12303/12303/12303 12305/12305/12305 12306/12306/12306 -g charts -o chart0000 -s off -f 12303/12303/12303 12304/12304/12304 12305/12305/12305 -f 12303/12303/12303 12305/12305/12305 12306/12306/12306 -v 19151.5 12771 284.7 -vt 0.690357 0.894889 -v 19106.5 12771 284.7 -vt 0.690357 0.894439 -v 19106.5 11766 284.7 -vt 0.682045 0.894439 -v 19151.5 11766 284.7 -vt 0.682045 0.894889 -v 18986.5 12771 284.7 -vt 0.690357 0.89324 -v 18986.5 11766 284.7 -vt 0.682045 0.89324 -o mesh2525 -s off -f 12307/12307/12307 12308/12308/12308 12309/12309/12309 -f 12307/12307/12307 12309/12309/12309 12310/12310/12310 -f 12311/12311/12311 12312/12312/12312 12309/12309/12309 -f 12311/12311/12311 12309/12309/12309 12308/12308/12308 -g charts -o chart0000 -s off -f 12307/12307/12307 12308/12308/12308 12309/12309/12309 -f 12307/12307/12307 12309/12309/12309 12310/12310/12310 -f 12311/12311/12311 12312/12312/12312 12309/12309/12309 -f 12311/12311/12311 12309/12309/12309 12308/12308/12308 -v 19151.5 11766 284.7 -vt 0.884871 0.255977 -v 19106.5 11766 284.7 -vt 0.885325 0.255977 -v 19106.5 11766 2129.7 -vt 0.885325 0.241138 -v 19151.5 11766 2129.7 -vt 0.884871 0.241138 -v 18986.5 11766 284.7 -vt 0.886534 0.255977 -v 18986.5 11766 2129.7 -vt 0.886534 0.241138 -o mesh2526 -s off -f 12313/12313/12313 12314/12314/12314 12315/12315/12315 -f 12313/12313/12313 12315/12315/12315 12316/12316/12316 -f 12317/12317/12317 12318/12318/12318 12315/12315/12315 -f 12317/12317/12317 12315/12315/12315 12314/12314/12314 -g charts -o chart0000 -s off -f 12313/12313/12313 12314/12314/12314 12315/12315/12315 -f 12313/12313/12313 12315/12315/12315 12316/12316/12316 -f 12317/12317/12317 12318/12318/12318 12315/12315/12315 -f 12317/12317/12317 12315/12315/12315 12314/12314/12314 -v 19151.5 11766 2129.7 -vt 0.952203 0.581616 -v 19106.5 11766 2129.7 -vt 0.952656 0.581616 -v 19106.5 12771 2129.7 -vt 0.952656 0.573372 -v 19151.5 12771 2129.7 -vt 0.952203 0.573372 -v 18986.5 11766 2129.7 -vt 0.953865 0.581616 -v 18986.5 12771 2129.7 -vt 0.953865 0.573372 -o mesh2527 -s off -f 12319/12319/12319 12320/12320/12320 12321/12321/12321 -f 12319/12319/12319 12321/12321/12321 12322/12322/12322 -f 12323/12323/12323 12324/12324/12324 12321/12321/12321 -f 12323/12323/12323 12321/12321/12321 12320/12320/12320 -g charts -o chart0000 -s off -f 12319/12319/12319 12320/12320/12320 12321/12321/12321 -f 12319/12319/12319 12321/12321/12321 12322/12322/12322 -f 12323/12323/12323 12324/12324/12324 12321/12321/12321 -f 12323/12323/12323 12321/12321/12321 12320/12320/12320 -v 19151.5 12771 2129.7 -vt 0.0286782 0.211459 -v 19106.5 12771 2129.7 -vt 0.0286782 0.211009 -v 19106.5 12771 284.7 -vt 0.0137157 0.211009 -v 19151.5 12771 284.7 -vt 0.0137157 0.211459 -v 18986.5 12771 2129.7 -vt 0.0286782 0.20981 -v 18986.5 12771 284.7 -vt 0.0137157 0.20981 -o mesh2528 -s off -f 12325/12325/12325 12326/12326/12326 12327/12327/12327 -f 12325/12325/12325 12327/12327/12327 12328/12328/12328 -f 12329/12329/12329 12330/12330/12330 12327/12327/12327 -f 12329/12329/12329 12327/12327/12327 12326/12326/12326 -g charts -o chart0000 -s off -f 12325/12325/12325 12326/12326/12326 12327/12327/12327 -f 12325/12325/12325 12327/12327/12327 12328/12328/12328 -f 12329/12329/12329 12330/12330/12330 12327/12327/12327 -f 12329/12329/12329 12327/12327/12327 12326/12326/12326 -v 19106.5 12771 284.7 -vt 0.802577 0.459604 -v 19106.5 12711 344.7 -vt 0.801746 0.459112 -v 19106.5 11766 284.7 -vt 0.802577 0.45136 -v 19106.5 11826 344.7 -vt 0.801746 0.451852 -o mesh2529 -s off -f 12331/12331/12331 12332/12332/12332 12333/12333/12333 -f 12334/12334/12334 12333/12333/12333 12332/12332/12332 -g charts -o chart0000 -s off -f 12331/12331/12331 12332/12332/12332 12333/12333/12333 -f 12334/12334/12334 12333/12333/12333 12332/12332/12332 -v 19106.5 12711 344.7 -vt 0.382448 0.837181 -v 19106.5 12771 284.7 -vt 0.381962 0.838005 -v 19106.5 12771 2129.7 -vt 0.396924 0.838005 -o mesh2530 -s off -f 12335/12335/12335 12336/12336/12336 12337/12337/12337 -g charts -o chart0000 -s off -f 12335/12335/12335 12336/12336/12336 12337/12337/12337 -v 19106.5 12711 344.7 -vt 0.982128 0.218879 -v 19106.5 12771 2129.7 -vt 0.982128 0.232894 -v 19106.5 12711 2069.7 -vt 0.981297 0.232407 -o mesh2531 -s off -f 12338/12338/12338 12339/12339/12339 12340/12340/12340 -g charts -o chart0000 -s off -f 12338/12338/12338 12339/12339/12339 12340/12340/12340 -v 19106.5 12711 2069.7 -vt 0.813055 0.496702 -v 19106.5 12771 2129.7 -vt 0.812552 0.497527 -v 19106.5 11826 2069.7 -vt 0.820033 0.497527 -o mesh2532 -s off -f 12341/12341/12341 12342/12342/12342 12343/12343/12343 -g charts -o chart0000 -s off -f 12341/12341/12341 12342/12342/12342 12343/12343/12343 -v 19106.5 11766 284.7 -vt 0.974647 0.749794 -v 19106.5 11826 344.7 -vt 0.97416 0.748969 -v 19106.5 11766 2129.7 -vt 0.959684 0.749794 -o mesh2533 -s off -f 12344/12344/12344 12345/12345/12345 12346/12346/12346 -g charts -o chart0000 -s off -f 12344/12344/12344 12345/12345/12345 12346/12346/12346 -v 19106.5 11766 2129.7 -vt 0.695345 0.892415 -v 19106.5 11826 344.7 -vt 0.709476 0.892415 -v 19106.5 11826 2069.7 -vt 0.695835 0.891591 -o mesh2534 -s off -f 12347/12347/12347 12348/12348/12348 12349/12349/12349 -g charts -o chart0000 -s off -f 12347/12347/12347 12348/12348/12348 12349/12349/12349 -v 19106.5 11766 2129.7 -vt 0.903159 0.285655 -v 19106.5 11826 2069.7 -vt 0.902662 0.284831 -v 19106.5 12771 2129.7 -vt 0.894846 0.285655 -o mesh2535 -s off -f 12350/12350/12350 12351/12351/12351 12352/12352/12352 -g charts -o chart0000 -s off -f 12350/12350/12350 12351/12351/12351 12352/12352/12352 -v 18986.5 11826 2069.7 -vt 0.378637 0.490107 -v 19031.5 12255.4 2069.7 -vt 0.375007 0.489489 -v 19106.5 11826 2069.7 -vt 0.378637 0.488458 -v 18986.5 12711 2069.7 -vt 0.371155 0.490107 -v 19031.5 12281.6 2069.7 -vt 0.374785 0.489489 -v 19061.5 12281.6 2069.7 -vt 0.374785 0.489077 -v 19061.5 12255.4 2069.7 -vt 0.375007 0.489077 -v 19106.5 12711 2069.7 -vt 0.371155 0.488458 -o mesh2536 -s off -f 12353/12353/12353 12354/12354/12354 12355/12355/12355 -f 12354/12354/12354 12353/12353/12353 12356/12356/12356 -f 12354/12354/12354 12356/12356/12356 12357/12357/12357 -f 12357/12357/12357 12356/12356/12356 12358/12358/12358 -f 12355/12355/12355 12359/12359/12359 12360/12360/12360 -f 12359/12359/12359 12355/12355/12355 12354/12354/12354 -f 12360/12360/12360 12359/12359/12359 12358/12358/12358 -f 12360/12360/12360 12358/12358/12358 12356/12356/12356 -g charts -o chart0000 -s off -f 12353/12353/12353 12354/12354/12354 12355/12355/12355 -f 12354/12354/12354 12353/12353/12353 12356/12356/12356 -f 12354/12354/12354 12356/12356/12356 12357/12357/12357 -f 12357/12357/12357 12356/12356/12356 12358/12358/12358 -f 12355/12355/12355 12359/12359/12359 12360/12360/12360 -f 12359/12359/12359 12355/12355/12355 12354/12354/12354 -f 12360/12360/12360 12359/12359/12359 12358/12358/12358 -f 12360/12360/12360 12358/12358/12358 12356/12356/12356 -v 19106.5 12711 2069.7 -vt 0.839983 0.315334 -v 19061.5 12711 1217.32 -vt 0.833001 0.315952 -v 19106.5 12711 344.7 -vt 0.825852 0.315334 -v 18986.5 12711 2069.7 -vt 0.839983 0.316983 -v 19031.5 12711 1217.32 -vt 0.833001 0.316364 -v 19031.5 12711 1197.08 -vt 0.832835 0.316364 -v 19061.5 12711 1197.08 -vt 0.832835 0.315952 -v 18986.5 12711 344.7 -vt 0.825852 0.316983 -o mesh2537 -s off -f 12361/12361/12361 12362/12362/12362 12363/12363/12363 -f 12362/12362/12362 12361/12361/12361 12364/12364/12364 -f 12362/12362/12362 12364/12364/12364 12365/12365/12365 -f 12365/12365/12365 12364/12364/12364 12366/12366/12366 -f 12363/12363/12363 12367/12367/12367 12368/12368/12368 -f 12367/12367/12367 12363/12363/12363 12362/12362/12362 -f 12368/12368/12368 12367/12367/12367 12366/12366/12366 -f 12368/12368/12368 12366/12366/12366 12364/12364/12364 -g charts -o chart0000 -s off -f 12361/12361/12361 12362/12362/12362 12363/12363/12363 -f 12362/12362/12362 12361/12361/12361 12364/12364/12364 -f 12362/12362/12362 12364/12364/12364 12365/12365/12365 -f 12365/12365/12365 12364/12364/12364 12366/12366/12366 -f 12363/12363/12363 12367/12367/12367 12368/12368/12368 -f 12367/12367/12367 12363/12363/12363 12362/12362/12362 -f 12368/12368/12368 12367/12367/12367 12366/12366/12366 -f 12368/12368/12368 12366/12366/12366 12364/12364/12364 -v 19106.5 11826 344.7 -vt 0.763508 0.993817 -v 19061.5 12255.4 344.7 -vt 0.759878 0.994435 -v 18986.5 11826 344.7 -vt 0.763508 0.995466 -v 19106.5 12711 344.7 -vt 0.756027 0.993817 -v 19061.5 12281.6 344.7 -vt 0.759656 0.994435 -v 19031.5 12281.6 344.7 -vt 0.759656 0.994847 -v 19031.5 12255.4 344.7 -vt 0.759878 0.994847 -v 18986.5 12711 344.7 -vt 0.756027 0.995466 -o mesh2538 -s off -f 12369/12369/12369 12370/12370/12370 12371/12371/12371 -f 12370/12370/12370 12369/12369/12369 12372/12372/12372 -f 12370/12370/12370 12372/12372/12372 12373/12373/12373 -f 12373/12373/12373 12372/12372/12372 12374/12374/12374 -f 12371/12371/12371 12375/12375/12375 12376/12376/12376 -f 12375/12375/12375 12371/12371/12371 12370/12370/12370 -f 12376/12376/12376 12375/12375/12375 12374/12374/12374 -f 12376/12376/12376 12374/12374/12374 12372/12372/12372 -g charts -o chart0000 -s off -f 12369/12369/12369 12370/12370/12370 12371/12371/12371 -f 12370/12370/12370 12369/12369/12369 12372/12372/12372 -f 12370/12370/12370 12372/12372/12372 12373/12373/12373 -f 12373/12373/12373 12372/12372/12372 12374/12374/12374 -f 12371/12371/12371 12375/12375/12375 12376/12376/12376 -f 12375/12375/12375 12371/12371/12371 12370/12370/12370 -f 12376/12376/12376 12375/12375/12375 12374/12374/12374 -f 12376/12376/12376 12374/12374/12374 12372/12372/12372 -v 18986.5 11826 344.7 -vt 0.97049 0.0680131 -v 18986.5 11826 2069.7 -vt 0.97049 0.0539984 -v 19106.5 11826 2069.7 -vt 0.968828 0.0539984 -v 19106.5 11826 344.7 -vt 0.968828 0.0680131 -o mesh2539 -s off -f 12377/12377/12377 12378/12378/12378 12379/12379/12379 -f 12377/12377/12377 12379/12379/12379 12380/12380/12380 -g charts -o chart0000 -s off -f 12377/12377/12377 12378/12378/12378 12379/12379/12379 -f 12377/12377/12377 12379/12379/12379 12380/12380/12380 -v 19031.5 12255.4 2069.7 -vt 0.904821 0.354081 -v 19031.5 12281.6 2069.7 -vt 0.90399 0.354081 -v 19031.5 12281.6 344.7 -vt 0.90399 0.340066 -v 19031.5 12255.4 344.7 -vt 0.904821 0.340066 -o mesh2540 -s off -f 12381/12381/12381 12382/12382/12382 12383/12383/12383 -f 12381/12381/12381 12383/12383/12383 12384/12384/12384 -g charts -o chart0000 -s off -f 12381/12381/12381 12382/12382/12382 12383/12383/12383 -f 12381/12381/12381 12383/12383/12383 12384/12384/12384 -v 19031.5 12281.6 2069.7 -vt 0.924771 0.206513 -v 19061.5 12281.6 2069.7 -vt 0.92394 0.206513 -v 19061.5 12281.6 344.7 -vt 0.92394 0.192498 -v 19031.5 12281.6 344.7 -vt 0.924771 0.192498 -o mesh2541 -s off -f 12385/12385/12385 12386/12386/12386 12387/12387/12387 -f 12385/12385/12385 12387/12387/12387 12388/12388/12388 -g charts -o chart0000 -s off -f 12385/12385/12385 12386/12386/12386 12387/12387/12387 -f 12385/12385/12385 12387/12387/12387 12388/12388/12388 -v 19061.5 11846.3 1217.32 -vt 0.986284 0.481863 -v 19031.5 11846.3 1217.32 -vt 0.987115 0.481863 -v 19031.5 11846.3 1197.08 -vt 0.987115 0.482687 -v 19061.5 11846.3 1197.08 -vt 0.986284 0.482687 -o mesh2542 -s off -f 12389/12389/12389 12390/12390/12390 12391/12391/12391 -f 12389/12389/12389 12391/12391/12391 12392/12392/12392 -g charts -o chart0000 -s off -f 12389/12389/12389 12390/12390/12390 12391/12391/12391 -f 12389/12389/12389 12391/12391/12391 12392/12392/12392 -v 19061.5 12711 1217.32 -vt 0.991272 0.753916 -v 19031.5 12711 1217.32 -vt 0.990441 0.753916 -v 19031.5 11846.3 1217.32 -vt 0.990441 0.746496 -v 19061.5 11846.3 1217.32 -vt 0.991272 0.746496 -o mesh2543 -s off -f 12393/12393/12393 12394/12394/12394 12395/12395/12395 -f 12393/12393/12393 12395/12395/12395 12396/12396/12396 -g charts -o chart0000 -s off -f 12393/12393/12393 12394/12394/12394 12395/12395/12395 -f 12393/12393/12393 12395/12395/12395 12396/12396/12396 -v 19031.5 12711 1217.32 -vt 0.960515 0.496702 -v 19031.5 12711 1197.08 -vt 0.959684 0.496702 -v 19031.5 11846.3 1197.08 -vt 0.959684 0.489283 -v 19031.5 11846.3 1217.32 -vt 0.960515 0.489283 -o mesh2544 -s off -f 12397/12397/12397 12398/12398/12398 12399/12399/12399 -f 12397/12397/12397 12399/12399/12399 12400/12400/12400 -g charts -o chart0000 -s off -f 12397/12397/12397 12398/12398/12398 12399/12399/12399 -f 12397/12397/12397 12399/12399/12399 12400/12400/12400 -v 19031.5 12711 1197.08 -vt 0.110141 0.401896 -v 19061.5 12711 1197.08 -vt 0.10931 0.401896 -v 19061.5 11846.3 1197.08 -vt 0.10931 0.394477 -v 19031.5 11846.3 1197.08 -vt 0.110141 0.394477 -o mesh2545 -s off -f 12401/12401/12401 12402/12402/12402 12403/12403/12403 -f 12401/12401/12401 12403/12403/12403 12404/12404/12404 -g charts -o chart0000 -s off -f 12401/12401/12401 12402/12402/12402 12403/12403/12403 -f 12401/12401/12401 12403/12403/12403 12404/12404/12404 -v 19061.5 12711 1197.08 -vt 0.704489 0.326875 -v 19061.5 12711 1217.32 -vt 0.703658 0.326875 -v 19061.5 11846.3 1217.32 -vt 0.703658 0.319456 -v 19061.5 11846.3 1197.08 -vt 0.704489 0.319456 -o mesh2546 -s off -f 12405/12405/12405 12406/12406/12406 12407/12407/12407 -f 12405/12405/12405 12407/12407/12407 12408/12408/12408 -g charts -o chart0000 -s off -f 12405/12405/12405 12406/12406/12406 12407/12407/12407 -f 12405/12405/12405 12407/12407/12407 12408/12408/12408 -v 19061.5 12255.4 2069.7 -vt 0.845802 0.405194 -v 19031.5 12255.4 2069.7 -vt 0.845802 0.404369 -v 19031.5 12255.4 344.7 -vt 0.831671 0.404369 -v 19061.5 12255.4 344.7 -vt 0.831671 0.405194 -o mesh2547 -s off -f 12409/12409/12409 12410/12410/12410 12411/12411/12411 -f 12409/12409/12409 12411/12411/12411 12412/12412/12412 -g charts -o chart0000 -s off -f 12409/12409/12409 12410/12410/12410 12411/12411/12411 -f 12409/12409/12409 12411/12411/12411 12412/12412/12412 -v 19061.5 12281.6 2069.7 -vt 0.679551 0.931162 -v 19061.5 12255.4 2069.7 -vt 0.67872 0.931162 -v 19061.5 12255.4 344.7 -vt 0.67872 0.917148 -v 19061.5 12281.6 344.7 -vt 0.679551 0.917148 -o mesh2548 -s off -f 12413/12413/12413 12414/12414/12414 12415/12415/12415 -f 12413/12413/12413 12415/12415/12415 12416/12416/12416 -g charts -o chart0000 -s off -f 12413/12413/12413 12414/12414/12414 12415/12415/12415 -f 12413/12413/12413 12415/12415/12415 12416/12416/12416 -v 18986.5 10603.5 247.2 -vt 0.918953 0.427453 -v 18986.5 10641 284.7 -vt 0.919784 0.427768 -v 18986.5 11683.5 247.2 -vt 0.918953 0.436521 -v 18986.5 11646 284.7 -vt 0.919784 0.436206 -o mesh2549 -s off -f 12417/12417/12417 12418/12418/12418 12419/12419/12419 -f 12420/12420/12420 12419/12419/12419 12418/12418/12418 -g charts -o chart0000 -s off -f 12417/12417/12417 12418/12418/12418 12419/12419/12419 -f 12420/12420/12420 12419/12419/12419 12418/12418/12418 -v 18986.5 10641 284.7 -vt 0.989609 0.576975 -v 18986.5 10603.5 247.2 -vt 0.99044 0.576669 -v 18986.5 10603.5 2167.2 -vt 0.99044 0.592333 -o mesh2550 -s off -f 12421/12421/12421 12422/12422/12422 12423/12423/12423 -g charts -o chart0000 -s off -f 12421/12421/12421 12422/12422/12422 12423/12423/12423 -v 18986.5 10641 284.7 -vt 0.4468 0.719291 -v 18986.5 10603.5 2167.2 -vt 0.461762 0.719291 -v 18986.5 10641 2129.7 -vt 0.461458 0.718467 -o mesh2551 -s off -f 12424/12424/12424 12425/12425/12425 12426/12426/12426 -g charts -o chart0000 -s off -f 12424/12424/12424 12425/12425/12425 12426/12426/12426 -v 18986.5 10641 2129.7 -vt 0.987116 0.518444 -v 18986.5 10603.5 2167.2 -vt 0.987947 0.518137 -v 18986.5 11646 2129.7 -vt 0.987947 0.526381 -o mesh2552 -s off -f 12427/12427/12427 12428/12428/12428 12429/12429/12429 -g charts -o chart0000 -s off -f 12427/12427/12427 12428/12428/12428 12429/12429/12429 -v 18986.5 11683.5 247.2 -vt 0.0012468 0.833058 -v 18986.5 11646 284.7 -vt 0.000415628 0.832753 -v 18986.5 11683.5 2167.2 -vt 0.0012468 0.817395 -o mesh2553 -s off -f 12430/12430/12430 12431/12431/12431 12432/12432/12432 -g charts -o chart0000 -s off -f 12430/12430/12430 12431/12431/12431 12432/12432/12432 -v 18986.5 11683.5 2167.2 -vt 0.988778 0.0375103 -v 18986.5 11646 284.7 -vt 0.988778 0.0523495 -v 18986.5 11646 2129.7 -vt 0.987947 0.0378118 -o mesh2554 -s off -f 12433/12433/12433 12434/12434/12434 12435/12435/12435 -g charts -o chart0000 -s off -f 12433/12433/12433 12434/12434/12434 12435/12435/12435 -v 18986.5 11683.5 2167.2 -vt 0.852452 0.986397 -v 18986.5 11646 2129.7 -vt 0.852135 0.985573 -v 18986.5 10603.5 2167.2 -vt 0.843308 0.986397 -o mesh2555 -s off -f 12436/12436/12436 12437/12437/12437 12438/12438/12438 -g charts -o chart0000 -s off -f 12436/12436/12436 12437/12437/12437 12438/12438/12438 -v 19151.5 11683.5 247.2 -vt 0.953865 0.489283 -v 19151.5 11646 284.7 -vt 0.953548 0.488458 -v 19151.5 10603.5 247.2 -vt 0.944722 0.489283 -v 19151.5 10641 284.7 -vt 0.945039 0.488458 -o mesh2556 -s off -f 12439/12439/12439 12440/12440/12440 12441/12441/12441 -f 12442/12442/12442 12441/12441/12441 12440/12440/12440 -g charts -o chart0000 -s off -f 12439/12439/12439 12440/12440/12440 12441/12441/12441 -f 12442/12442/12442 12441/12441/12441 12440/12440/12440 -v 19151.5 11646 284.7 -vt 0.392768 0.522565 -v 19151.5 11683.5 247.2 -vt 0.393599 0.522259 -v 19151.5 11683.5 2167.2 -vt 0.393599 0.537922 -o mesh2557 -s off -f 12443/12443/12443 12444/12444/12444 12445/12445/12445 -g charts -o chart0000 -s off -f 12443/12443/12443 12444/12444/12444 12445/12445/12445 -v 19151.5 11646 284.7 -vt 0.911471 0.290602 -v 19151.5 11683.5 2167.2 -vt 0.911471 0.305441 -v 19151.5 11646 2129.7 -vt 0.91064 0.30514 -o mesh2558 -s off -f 12446/12446/12446 12447/12447/12447 12448/12448/12448 -g charts -o chart0000 -s off -f 12446/12446/12446 12447/12447/12447 12448/12448/12448 -v 19151.5 11646 2129.7 -vt 0.0805255 0.65911 -v 19151.5 11683.5 2167.2 -vt 0.0802161 0.659934 -v 19151.5 10641 2129.7 -vt 0.0885286 0.659934 -o mesh2559 -s off -f 12449/12449/12449 12450/12450/12450 12451/12451/12451 -g charts -o chart0000 -s off -f 12449/12449/12449 12450/12450/12450 12451/12451/12451 -v 19151.5 10603.5 247.2 -vt 0.251455 0.639324 -v 19151.5 10641 284.7 -vt 0.251146 0.6385 -v 19151.5 10603.5 2167.2 -vt 0.235661 0.639324 -o mesh2560 -s off -f 12452/12452/12452 12453/12453/12453 12454/12454/12454 -g charts -o chart0000 -s off -f 12452/12452/12452 12453/12453/12453 12454/12454/12454 -v 19151.5 10603.5 2167.2 -vt 0.561513 0.909728 -v 19151.5 10641 284.7 -vt 0.561513 0.924567 -v 19151.5 10641 2129.7 -vt 0.560682 0.910029 -o mesh2561 -s off -f 12455/12455/12455 12456/12456/12456 12457/12457/12457 -g charts -o chart0000 -s off -f 12455/12455/12455 12456/12456/12456 12457/12457/12457 -v 19151.5 10603.5 2167.2 -vt 0.995428 0.197444 -v 19151.5 10641 2129.7 -vt 0.994597 0.197129 -v 19151.5 11683.5 2167.2 -vt 0.995428 0.188376 -o mesh2562 -s off -f 12458/12458/12458 12459/12459/12459 12460/12460/12460 -g charts -o chart0000 -s off -f 12458/12458/12458 12459/12459/12459 12460/12460/12460 -v 18986.5 11683.5 2167.2 -vt 0.593101 0.577494 -v 18986.5 10603.5 2167.2 -vt 0.602244 0.577494 -v 19151.5 10603.5 2167.2 -vt 0.602244 0.579143 -v 19151.5 11683.5 2167.2 -vt 0.593101 0.579143 -o mesh2563 -s off -f 12461/12461/12461 12462/12462/12462 12463/12463/12463 -f 12461/12461/12461 12463/12463/12463 12464/12464/12464 -g charts -o chart0000 -s off -f 12461/12461/12461 12462/12462/12462 12463/12463/12463 -f 12461/12461/12461 12463/12463/12463 12464/12464/12464 -v 18986.5 10603.5 2167.2 -vt 0.780964 0.535449 -v 18986.5 10603.5 247.2 -vt 0.780964 0.551113 -v 19151.5 10603.5 247.2 -vt 0.782627 0.551113 -v 19151.5 10603.5 2167.2 -vt 0.782627 0.535449 -o mesh2564 -s off -f 12465/12465/12465 12466/12466/12466 12467/12467/12467 -f 12465/12465/12465 12467/12467/12467 12468/12468/12468 -g charts -o chart0000 -s off -f 12465/12465/12465 12466/12466/12466 12467/12467/12467 -f 12465/12465/12465 12467/12467/12467 12468/12468/12468 -v 18986.5 10603.5 247.2 -vt 0.4601 0.886645 -v 18986.5 11683.5 247.2 -vt 0.4601 0.877576 -v 19151.5 11683.5 247.2 -vt 0.458437 0.877576 -v 19151.5 10603.5 247.2 -vt 0.458437 0.886645 -o mesh2565 -s off -f 12469/12469/12469 12470/12470/12470 12471/12471/12471 -f 12469/12469/12469 12471/12471/12471 12472/12472/12472 -g charts -o chart0000 -s off -f 12469/12469/12469 12470/12470/12470 12471/12471/12471 -f 12469/12469/12469 12471/12471/12471 12472/12472/12472 -v 18986.5 11683.5 247.2 -vt 0.972984 0.0663643 -v 18986.5 11683.5 2167.2 -vt 0.972984 0.0507007 -v 19151.5 11683.5 2167.2 -vt 0.971322 0.0507007 -v 19151.5 11683.5 247.2 -vt 0.971322 0.0663643 -o mesh2566 -s off -f 12473/12473/12473 12474/12474/12474 12475/12475/12475 -f 12473/12473/12473 12475/12475/12475 12476/12476/12476 -g charts -o chart0000 -s off -f 12473/12473/12473 12474/12474/12474 12475/12475/12475 -f 12473/12473/12473 12475/12475/12475 12476/12476/12476 -v 19151.5 11646 284.7 -vt 0.00706559 0.32028 -v 19106.5 11646 284.7 -vt 0.0066122 0.32028 -v 19106.5 10641 284.7 -vt 0.0066122 0.312036 -v 19151.5 10641 284.7 -vt 0.00706559 0.312036 -v 18986.5 11646 284.7 -vt 0.00540316 0.32028 -v 18986.5 10641 284.7 -vt 0.00540316 0.312036 -o mesh2567 -s off -f 12477/12477/12477 12478/12478/12478 12479/12479/12479 -f 12477/12477/12477 12479/12479/12479 12480/12480/12480 -f 12481/12481/12481 12482/12482/12482 12479/12479/12479 -f 12481/12481/12481 12479/12479/12479 12478/12478/12478 -g charts -o chart0000 -s off -f 12477/12477/12477 12478/12478/12478 12479/12479/12479 -f 12477/12477/12477 12479/12479/12479 12480/12480/12480 -f 12481/12481/12481 12482/12482/12482 12479/12479/12479 -f 12481/12481/12481 12479/12479/12479 12478/12478/12478 -v 19151.5 10641 284.7 -vt 0.89069 0.992993 -v 19106.5 10641 284.7 -vt 0.89069 0.993442 -v 19106.5 10641 2129.7 -vt 0.875727 0.993442 -v 19151.5 10641 2129.7 -vt 0.875727 0.992993 -v 18986.5 10641 284.7 -vt 0.89069 0.994641 -v 18986.5 10641 2129.7 -vt 0.875727 0.994641 -o mesh2568 -s off -f 12483/12483/12483 12484/12484/12484 12485/12485/12485 -f 12483/12483/12483 12485/12485/12485 12486/12486/12486 -f 12487/12487/12487 12488/12488/12488 12485/12485/12485 -f 12487/12487/12487 12485/12485/12485 12484/12484/12484 -g charts -o chart0000 -s off -f 12483/12483/12483 12484/12484/12484 12485/12485/12485 -f 12483/12483/12483 12485/12485/12485 12486/12486/12486 -f 12487/12487/12487 12488/12488/12488 12485/12485/12485 -f 12487/12487/12487 12485/12485/12485 12484/12484/12484 -v 19151.5 10641 2129.7 -vt 0.568163 0.566777 -v 19106.5 10641 2129.7 -vt 0.568616 0.566777 -v 19106.5 11646 2129.7 -vt 0.568616 0.558533 -v 19151.5 11646 2129.7 -vt 0.568163 0.558533 -v 18986.5 10641 2129.7 -vt 0.569825 0.566777 -v 18986.5 11646 2129.7 -vt 0.569825 0.558533 -o mesh2569 -s off -f 12489/12489/12489 12490/12490/12490 12491/12491/12491 -f 12489/12489/12489 12491/12491/12491 12492/12492/12492 -f 12493/12493/12493 12494/12494/12494 12491/12491/12491 -f 12493/12493/12493 12491/12491/12491 12490/12490/12490 -g charts -o chart0000 -s off -f 12489/12489/12489 12490/12490/12490 12491/12491/12491 -f 12489/12489/12489 12491/12491/12491 12492/12492/12492 -f 12493/12493/12493 12494/12494/12494 12491/12491/12491 -f 12493/12493/12493 12491/12491/12491 12490/12490/12490 -v 19151.5 11646 2129.7 -vt 0.618038 0.769579 -v 19106.5 11646 2129.7 -vt 0.618038 0.76913 -v 19106.5 11646 284.7 -vt 0.603076 0.76913 -v 19151.5 11646 284.7 -vt 0.603076 0.769579 -v 18986.5 11646 2129.7 -vt 0.618038 0.767931 -v 18986.5 11646 284.7 -vt 0.603076 0.767931 -o mesh2570 -s off -f 12495/12495/12495 12496/12496/12496 12497/12497/12497 -f 12495/12495/12495 12497/12497/12497 12498/12498/12498 -f 12499/12499/12499 12500/12500/12500 12497/12497/12497 -f 12499/12499/12499 12497/12497/12497 12496/12496/12496 -g charts -o chart0000 -s off -f 12495/12495/12495 12496/12496/12496 12497/12497/12497 -f 12495/12495/12495 12497/12497/12497 12498/12498/12498 -f 12499/12499/12499 12500/12500/12500 12497/12497/12497 -f 12499/12499/12499 12497/12497/12497 12496/12496/12496 -v 19106.5 11646 284.7 -vt 0.257273 0.965787 -v 19106.5 11586 344.7 -vt 0.256777 0.964963 -v 19106.5 10641 284.7 -vt 0.248961 0.965787 -v 19106.5 10701 344.7 -vt 0.249457 0.964963 -o mesh2571 -s off -f 12501/12501/12501 12502/12502/12502 12503/12503/12503 -f 12504/12504/12504 12503/12503/12503 12502/12502/12502 -g charts -o chart0000 -s off -f 12501/12501/12501 12502/12502/12502 12503/12503/12503 -f 12504/12504/12504 12503/12503/12503 12502/12502/12502 -v 19106.5 11586 344.7 -vt 0.786783 0.399081 -v 19106.5 11646 284.7 -vt 0.787614 0.398599 -v 19106.5 11646 2129.7 -vt 0.787614 0.413438 -o mesh2572 -s off -f 12505/12505/12505 12506/12506/12506 12507/12507/12507 -g charts -o chart0000 -s off -f 12505/12505/12505 12506/12506/12506 12507/12507/12507 -v 19106.5 11586 344.7 -vt 0.130091 0.917147 -v 19106.5 11646 2129.7 -vt 0.144223 0.917147 -v 19106.5 11586 2069.7 -vt 0.143732 0.916323 -o mesh2573 -s off -f 12508/12508/12508 12509/12509/12509 12510/12510/12510 -g charts -o chart0000 -s off -f 12508/12508/12508 12509/12509/12509 12510/12510/12510 -v 19106.5 11586 2069.7 -vt 0.489697 0.442292 -v 19106.5 11646 2129.7 -vt 0.489194 0.443116 -v 19106.5 10701 2069.7 -vt 0.496675 0.443116 -o mesh2574 -s off -f 12511/12511/12511 12512/12512/12512 12513/12513/12513 -g charts -o chart0000 -s off -f 12511/12511/12511 12512/12512/12512 12513/12513/12513 -v 19106.5 10641 284.7 -vt 0.834996 0.668178 -v 19106.5 10701 344.7 -vt 0.834509 0.667354 -v 19106.5 10641 2129.7 -vt 0.820033 0.668178 -o mesh2575 -s off -f 12514/12514/12514 12515/12515/12515 12516/12516/12516 -g charts -o chart0000 -s off -f 12514/12514/12514 12515/12515/12515 12516/12516/12516 -v 19106.5 10641 2129.7 -vt 0.954697 0.0713106 -v 19106.5 10701 344.7 -vt 0.968828 0.0713107 -v 19106.5 10701 2069.7 -vt 0.955187 0.0704864 -o mesh2576 -s off -f 12517/12517/12517 12518/12518/12518 12519/12519/12519 -g charts -o chart0000 -s off -f 12517/12517/12517 12518/12518/12518 12519/12519/12519 -v 19106.5 10641 2129.7 -vt 0.888196 0.260923 -v 19106.5 10701 2069.7 -vt 0.887365 0.260431 -v 19106.5 11646 2129.7 -vt 0.888196 0.252679 -o mesh2577 -s off -f 12520/12520/12520 12521/12521/12521 12522/12522/12522 -g charts -o chart0000 -s off -f 12520/12520/12520 12521/12521/12521 12522/12522/12522 -v 18986.5 10701 2069.7 -vt 0.251455 0.8108 -v 19031.5 11130.4 2069.7 -vt 0.247825 0.810181 -v 19106.5 10701 2069.7 -vt 0.251455 0.809151 -v 18986.5 11586 2069.7 -vt 0.243973 0.8108 -v 19031.5 11156.6 2069.7 -vt 0.247603 0.810181 -v 19061.5 11156.6 2069.7 -vt 0.247603 0.809769 -v 19061.5 11130.4 2069.7 -vt 0.247825 0.809769 -v 19106.5 11586 2069.7 -vt 0.243973 0.809151 -o mesh2578 -s off -f 12523/12523/12523 12524/12524/12524 12525/12525/12525 -f 12524/12524/12524 12523/12523/12523 12526/12526/12526 -f 12524/12524/12524 12526/12526/12526 12527/12527/12527 -f 12527/12527/12527 12526/12526/12526 12528/12528/12528 -f 12525/12525/12525 12529/12529/12529 12530/12530/12530 -f 12529/12529/12529 12525/12525/12525 12524/12524/12524 -f 12530/12530/12530 12529/12529/12529 12528/12528/12528 -f 12530/12530/12530 12528/12528/12528 12526/12526/12526 -g charts -o chart0000 -s off -f 12523/12523/12523 12524/12524/12524 12525/12525/12525 -f 12524/12524/12524 12523/12523/12523 12526/12526/12526 -f 12524/12524/12524 12526/12526/12526 12527/12527/12527 -f 12527/12527/12527 12526/12526/12526 12528/12528/12528 -f 12525/12525/12525 12529/12529/12529 12530/12530/12530 -f 12529/12529/12529 12525/12525/12525 12524/12524/12524 -f 12530/12530/12530 12529/12529/12529 12528/12528/12528 -f 12530/12530/12530 12528/12528/12528 12526/12526/12526 -v 19106.5 11586 2069.7 -vt 0.014547 0.855317 -v 19061.5 11586 1217.32 -vt 0.0151704 0.848392 -v 19106.5 11586 344.7 -vt 0.014547 0.841303 -v 18986.5 11586 2069.7 -vt 0.0162094 0.855317 -v 19031.5 11586 1217.32 -vt 0.015586 0.848392 -v 19031.5 11586 1197.08 -vt 0.015586 0.848228 -v 19061.5 11586 1197.08 -vt 0.0151704 0.848228 -v 18986.5 11586 344.7 -vt 0.0162094 0.841303 -o mesh2579 -s off -f 12531/12531/12531 12532/12532/12532 12533/12533/12533 -f 12532/12532/12532 12531/12531/12531 12534/12534/12534 -f 12532/12532/12532 12534/12534/12534 12535/12535/12535 -f 12535/12535/12535 12534/12534/12534 12536/12536/12536 -f 12533/12533/12533 12537/12537/12537 12538/12538/12538 -f 12537/12537/12537 12533/12533/12533 12532/12532/12532 -f 12538/12538/12538 12537/12537/12537 12536/12536/12536 -f 12538/12538/12538 12536/12536/12536 12534/12534/12534 -g charts -o chart0000 -s off -f 12531/12531/12531 12532/12532/12532 12533/12533/12533 -f 12532/12532/12532 12531/12531/12531 12534/12534/12534 -f 12532/12532/12532 12534/12534/12534 12535/12535/12535 -f 12535/12535/12535 12534/12534/12534 12536/12536/12536 -f 12533/12533/12533 12537/12537/12537 12538/12538/12538 -f 12537/12537/12537 12533/12533/12533 12532/12532/12532 -f 12538/12538/12538 12537/12537/12537 12536/12536/12536 -f 12538/12538/12538 12536/12536/12536 12534/12534/12534 -v 19106.5 10701 344.7 -vt 0.982959 0.833883 -v 19061.5 11130.4 344.7 -vt 0.983582 0.830283 -v 18986.5 10701 344.7 -vt 0.984622 0.833883 -v 19106.5 11586 344.7 -vt 0.982959 0.826463 -v 19061.5 11156.6 344.7 -vt 0.983582 0.830063 -v 19031.5 11156.6 344.7 -vt 0.983998 0.830063 -v 19031.5 11130.4 344.7 -vt 0.983998 0.830283 -v 18986.5 11586 344.7 -vt 0.984622 0.826463 -o mesh2580 -s off -f 12539/12539/12539 12540/12540/12540 12541/12541/12541 -f 12540/12540/12540 12539/12539/12539 12542/12542/12542 -f 12540/12540/12540 12542/12542/12542 12543/12543/12543 -f 12543/12543/12543 12542/12542/12542 12544/12544/12544 -f 12541/12541/12541 12545/12545/12545 12546/12546/12546 -f 12545/12545/12545 12541/12541/12541 12540/12540/12540 -f 12546/12546/12546 12545/12545/12545 12544/12544/12544 -f 12546/12546/12546 12544/12544/12544 12542/12542/12542 -g charts -o chart0000 -s off -f 12539/12539/12539 12540/12540/12540 12541/12541/12541 -f 12540/12540/12540 12539/12539/12539 12542/12542/12542 -f 12540/12540/12540 12542/12542/12542 12543/12543/12543 -f 12543/12543/12543 12542/12542/12542 12544/12544/12544 -f 12541/12541/12541 12545/12545/12545 12546/12546/12546 -f 12545/12545/12545 12541/12541/12541 12540/12540/12540 -f 12546/12546/12546 12545/12545/12545 12544/12544/12544 -f 12546/12546/12546 12544/12544/12544 12542/12542/12542 -v 18986.5 10701 344.7 -vt 0.376974 0.49258 -v 18986.5 10701 2069.7 -vt 0.362843 0.49258 -v 19106.5 10701 2069.7 -vt 0.362843 0.490932 -v 19106.5 10701 344.7 -vt 0.376974 0.490932 -o mesh2581 -s off -f 12547/12547/12547 12548/12548/12548 12549/12549/12549 -f 12547/12547/12547 12549/12549/12549 12550/12550/12550 -g charts -o chart0000 -s off -f 12547/12547/12547 12548/12548/12548 12549/12549/12549 -f 12547/12547/12547 12549/12549/12549 12550/12550/12550 -v 19031.5 11130.4 2069.7 -vt 0.989609 0.14798 -v 19031.5 11156.6 2069.7 -vt 0.989609 0.147156 -v 19031.5 11156.6 344.7 -vt 0.975478 0.147156 -v 19031.5 11130.4 344.7 -vt 0.975478 0.14798 -o mesh2582 -s off -f 12551/12551/12551 12552/12552/12552 12553/12553/12553 -f 12551/12551/12551 12553/12553/12553 12554/12554/12554 -g charts -o chart0000 -s off -f 12551/12551/12551 12552/12552/12552 12553/12553/12553 -f 12551/12551/12551 12553/12553/12553 12554/12554/12554 -v 19031.5 11156.6 2069.7 -vt 0.16916 0.656636 -v 19061.5 11156.6 2069.7 -vt 0.168329 0.656636 -v 19061.5 11156.6 344.7 -vt 0.168329 0.642622 -v 19031.5 11156.6 344.7 -vt 0.16916 0.642622 -o mesh2583 -s off -f 12555/12555/12555 12556/12556/12556 12557/12557/12557 -f 12555/12555/12555 12557/12557/12557 12558/12558/12558 -g charts -o chart0000 -s off -f 12555/12555/12555 12556/12556/12556 12557/12557/12557 -f 12555/12555/12555 12557/12557/12557 12558/12558/12558 -v 19061.5 10721.3 1217.32 -vt 0.938903 0.242786 -v 19031.5 10721.3 1217.32 -vt 0.938903 0.243611 -v 19031.5 10721.3 1197.08 -vt 0.939734 0.243611 -v 19061.5 10721.3 1197.08 -vt 0.939734 0.242786 -o mesh2584 -s off -f 12559/12559/12559 12560/12560/12560 12561/12561/12561 -f 12559/12559/12559 12561/12561/12561 12562/12562/12562 -g charts -o chart0000 -s off -f 12559/12559/12559 12560/12560/12560 12561/12561/12561 -f 12559/12559/12559 12561/12561/12561 12562/12562/12562 -v 19061.5 11586 1217.32 -vt 0.564838 0.94188 -v 19031.5 11586 1217.32 -vt 0.564007 0.94188 -v 19031.5 10721.3 1217.32 -vt 0.564007 0.93446 -v 19061.5 10721.3 1217.32 -vt 0.564838 0.93446 -o mesh2585 -s off -f 12563/12563/12563 12564/12564/12564 12565/12565/12565 -f 12563/12563/12563 12565/12565/12565 12566/12566/12566 -g charts -o chart0000 -s off -f 12563/12563/12563 12564/12564/12564 12565/12565/12565 -f 12563/12563/12563 12565/12565/12565 12566/12566/12566 -v 19031.5 11586 1217.32 -vt 0.694514 0.372218 -v 19031.5 11586 1197.08 -vt 0.693682 0.372218 -v 19031.5 10721.3 1197.08 -vt 0.693682 0.364798 -v 19031.5 10721.3 1217.32 -vt 0.694514 0.364798 -o mesh2586 -s off -f 12567/12567/12567 12568/12568/12568 12569/12569/12569 -f 12567/12567/12567 12569/12569/12569 12570/12570/12570 -g charts -o chart0000 -s off -f 12567/12567/12567 12568/12568/12568 12569/12569/12569 -f 12567/12567/12567 12569/12569/12569 12570/12570/12570 -v 19031.5 11586 1197.08 -vt 0.908977 0.138912 -v 19061.5 11586 1197.08 -vt 0.908146 0.138912 -v 19061.5 10721.3 1197.08 -vt 0.908146 0.131492 -v 19031.5 10721.3 1197.08 -vt 0.908977 0.131492 -o mesh2587 -s off -f 12571/12571/12571 12572/12572/12572 12573/12573/12573 -f 12571/12571/12571 12573/12573/12573 12574/12574/12574 -g charts -o chart0000 -s off -f 12571/12571/12571 12572/12572/12572 12573/12573/12573 -f 12571/12571/12571 12573/12573/12573 12574/12574/12574 -v 19061.5 11586 1197.08 -vt 0.651288 0.401072 -v 19061.5 11586 1217.32 -vt 0.651288 0.400247 -v 19061.5 10721.3 1217.32 -vt 0.643807 0.400247 -v 19061.5 10721.3 1197.08 -vt 0.643807 0.401072 -o mesh2588 -s off -f 12575/12575/12575 12576/12576/12576 12577/12577/12577 -f 12575/12575/12575 12577/12577/12577 12578/12578/12578 -g charts -o chart0000 -s off -f 12575/12575/12575 12576/12576/12576 12577/12577/12577 -f 12575/12575/12575 12577/12577/12577 12578/12578/12578 -v 19061.5 11130.4 2069.7 -vt 0.863258 0.998763 -v 19031.5 11130.4 2069.7 -vt 0.862427 0.998763 -v 19031.5 11130.4 344.7 -vt 0.862427 0.984749 -v 19061.5 11130.4 344.7 -vt 0.863258 0.984749 -o mesh2589 -s off -f 12579/12579/12579 12580/12580/12580 12581/12581/12581 -f 12579/12579/12579 12581/12581/12581 12582/12582/12582 -g charts -o chart0000 -s off -f 12579/12579/12579 12580/12580/12580 12581/12581/12581 -f 12579/12579/12579 12581/12581/12581 12582/12582/12582 -v 19061.5 11156.6 2069.7 -vt 0.966334 0.485161 -v 19061.5 11130.4 2069.7 -vt 0.966334 0.484336 -v 19061.5 11130.4 344.7 -vt 0.952203 0.484336 -v 19061.5 11156.6 344.7 -vt 0.952203 0.485161 -o mesh2590 -s off -f 12583/12583/12583 12584/12584/12584 12585/12585/12585 -f 12583/12583/12583 12585/12585/12585 12586/12586/12586 -g charts -o chart0000 -s off -f 12583/12583/12583 12584/12584/12584 12585/12585/12585 -f 12583/12583/12583 12585/12585/12585 12586/12586/12586 -v 18986.5 9478.49 3847.2 -vt 0.250623 0.65911 -v 18986.5 9515.99 3884.7 -vt 0.251455 0.659425 -v 18986.5 10558.5 3847.2 -vt 0.250623 0.668178 -v 18986.5 10521 3884.7 -vt 0.251455 0.667863 -o mesh2591 -s off -f 12587/12587/12587 12588/12588/12588 12589/12589/12589 -f 12590/12590/12590 12589/12589/12589 12588/12588/12588 -g charts -o chart0000 -s off -f 12587/12587/12587 12588/12588/12588 12589/12589/12589 -f 12590/12590/12590 12589/12589/12589 12588/12588/12588 -v 18986.5 9515.99 3884.7 -vt 0.604738 0.511848 -v 18986.5 9478.49 3847.2 -vt 0.605569 0.511542 -v 18986.5 9478.49 5767.2 -vt 0.605569 0.527205 -o mesh2592 -s off -f 12591/12591/12591 12592/12592/12592 12593/12593/12593 -g charts -o chart0000 -s off -f 12591/12591/12591 12592/12592/12592 12593/12593/12593 -v 18986.5 9515.99 3884.7 -vt 0.359518 0.60305 -v 18986.5 9478.49 5767.2 -vt 0.37448 0.60305 -v 18986.5 9515.99 5729.7 -vt 0.374176 0.602226 -o mesh2593 -s off -f 12594/12594/12594 12595/12595/12595 12596/12596/12596 -g charts -o chart0000 -s off -f 12594/12594/12594 12595/12595/12595 12596/12596/12596 -v 18986.5 9515.99 5729.7 -vt 0.455422 0.52803 -v 18986.5 9478.49 5767.2 -vt 0.455112 0.528854 -v 18986.5 10521 5729.7 -vt 0.463425 0.528854 -o mesh2594 -s off -f 12597/12597/12597 12598/12598/12598 12599/12599/12599 -g charts -o chart0000 -s off -f 12597/12597/12597 12598/12598/12598 12599/12599/12599 -v 18986.5 10558.5 3847.2 -vt 0.837489 0.39695 -v 18986.5 10521 3884.7 -vt 0.836658 0.396644 -v 18986.5 10558.5 5767.2 -vt 0.837489 0.381286 -o mesh2595 -s off -f 12600/12600/12600 12601/12601/12601 12602/12602/12602 -g charts -o chart0000 -s off -f 12600/12600/12600 12601/12601/12601 12602/12602/12602 -v 18986.5 10558.5 5767.2 -vt 0.838321 0.0539984 -v 18986.5 10521 3884.7 -vt 0.838321 0.0688375 -v 18986.5 10521 5729.7 -vt 0.83749 0.0542998 -o mesh2596 -s off -f 12603/12603/12603 12604/12604/12604 12605/12605/12605 -g charts -o chart0000 -s off -f 12603/12603/12603 12604/12604/12604 12605/12605/12605 -v 18986.5 10558.5 5767.2 -vt 0.194098 0.539571 -v 18986.5 10521 5729.7 -vt 0.193781 0.538747 -v 18986.5 9478.49 5767.2 -vt 0.184954 0.539571 -o mesh2597 -s off -f 12606/12606/12606 12607/12607/12607 12608/12608/12608 -g charts -o chart0000 -s off -f 12606/12606/12606 12607/12607/12607 12608/12608/12608 -v 19151.5 10558.5 3847.2 -vt 0.00540308 0.579143 -v 19151.5 10521 3884.7 -vt 0.0045719 0.578828 -v 19151.5 9478.49 3847.2 -vt 0.00540308 0.570074 -v 19151.5 9515.99 3884.7 -vt 0.0045719 0.570389 -o mesh2598 -s off -f 12609/12609/12609 12610/12610/12610 12611/12611/12611 -f 12612/12612/12612 12611/12611/12611 12610/12610/12610 -g charts -o chart0000 -s off -f 12609/12609/12609 12610/12610/12610 12611/12611/12611 -f 12612/12612/12612 12611/12611/12611 12610/12610/12610 -v 19151.5 10521 3884.7 -vt 0.852761 0.81657 -v 19151.5 10558.5 3847.2 -vt 0.852452 0.817395 -v 19151.5 10558.5 5767.2 -vt 0.868246 0.817395 -o mesh2599 -s off -f 12613/12613/12613 12614/12614/12614 12615/12615/12615 -g charts -o chart0000 -s off -f 12613/12613/12613 12614/12614/12614 12615/12615/12615 -v 19151.5 10521 3884.7 -vt 0.589776 0.553586 -v 19151.5 10558.5 5767.2 -vt 0.604738 0.553586 -v 19151.5 10521 5729.7 -vt 0.604434 0.552762 -o mesh2600 -s off -f 12616/12616/12616 12617/12617/12617 12618/12618/12618 -g charts -o chart0000 -s off -f 12616/12616/12616 12617/12617/12617 12618/12618/12618 -v 19151.5 10521 5729.7 -vt 0.9442 0.125721 -v 19151.5 10558.5 5767.2 -vt 0.94389 0.126546 -v 19151.5 9515.99 5729.7 -vt 0.952203 0.126546 -o mesh2601 -s off -f 12619/12619/12619 12620/12620/12620 12621/12621/12621 -g charts -o chart0000 -s off -f 12619/12619/12619 12620/12620/12620 12621/12621/12621 -v 19151.5 9478.49 3847.2 -vt 0.965503 0.302968 -v 19151.5 9515.99 3884.7 -vt 0.964672 0.302662 -v 19151.5 9478.49 5767.2 -vt 0.965503 0.287304 -o mesh2602 -s off -f 12622/12622/12622 12623/12623/12623 12624/12624/12624 -g charts -o chart0000 -s off -f 12622/12622/12622 12623/12623/12623 12624/12624/12624 -v 19151.5 9478.49 5767.2 -vt 0.201579 0.304617 -v 19151.5 9515.99 3884.7 -vt 0.216542 0.304617 -v 19151.5 9515.99 5729.7 -vt 0.201883 0.303792 -o mesh2603 -s off -f 12625/12625/12625 12626/12626/12626 12627/12627/12627 -g charts -o chart0000 -s off -f 12625/12625/12625 12626/12626/12626 12627/12627/12627 -v 19151.5 9478.49 5767.2 -vt 0.214879 0.508244 -v 19151.5 9515.99 5729.7 -vt 0.214048 0.507929 -v 19151.5 10558.5 5767.2 -vt 0.214879 0.499176 -o mesh2604 -s off -f 12628/12628/12628 12629/12629/12629 12630/12630/12630 -g charts -o chart0000 -s off -f 12628/12628/12628 12629/12629/12629 12630/12630/12630 -v 18986.5 10558.5 5767.2 -vt 0.414381 0.89324 -v 18986.5 9478.49 5767.2 -vt 0.423524 0.89324 -v 19151.5 9478.49 5767.2 -vt 0.423524 0.894889 -v 19151.5 10558.5 5767.2 -vt 0.414381 0.894889 -o mesh2605 -s off -f 12631/12631/12631 12632/12632/12632 12633/12633/12633 -f 12631/12631/12631 12633/12633/12633 12634/12634/12634 -g charts -o chart0000 -s off -f 12631/12631/12631 12632/12632/12632 12633/12633/12633 -f 12631/12631/12631 12633/12633/12633 12634/12634/12634 -v 18986.5 9478.49 5767.2 -vt 0.0835411 0.151278 -v 18986.5 9478.49 3847.2 -vt 0.0993349 0.151278 -v 19151.5 9478.49 3847.2 -vt 0.0993349 0.152927 -v 19151.5 9478.49 5767.2 -vt 0.0835411 0.152927 -o mesh2606 -s off -f 12635/12635/12635 12636/12636/12636 12637/12637/12637 -f 12635/12635/12635 12637/12637/12637 12638/12638/12638 -g charts -o chart0000 -s off -f 12635/12635/12635 12636/12636/12636 12637/12637/12637 -f 12635/12635/12635 12637/12637/12637 12638/12638/12638 -v 18986.5 9478.49 3847.2 -vt 0.85744 0.391179 -v 18986.5 10558.5 3847.2 -vt 0.848296 0.391179 -v 19151.5 10558.5 3847.2 -vt 0.848296 0.38953 -v 19151.5 9478.49 3847.2 -vt 0.85744 0.38953 -o mesh2607 -s off -f 12639/12639/12639 12640/12640/12640 12641/12641/12641 -f 12639/12639/12639 12641/12641/12641 12642/12642/12642 -g charts -o chart0000 -s off -f 12639/12639/12639 12640/12640/12640 12641/12641/12641 -f 12639/12639/12639 12641/12641/12641 12642/12642/12642 -v 18986.5 10558.5 3847.2 -vt 0.438487 0.418384 -v 18986.5 10558.5 5767.2 -vt 0.438487 0.402721 -v 19151.5 10558.5 5767.2 -vt 0.436825 0.402721 -v 19151.5 10558.5 3847.2 -vt 0.436825 0.418384 -o mesh2608 -s off -f 12643/12643/12643 12644/12644/12644 12645/12645/12645 -f 12643/12643/12643 12645/12645/12645 12646/12646/12646 -g charts -o chart0000 -s off -f 12643/12643/12643 12644/12644/12644 12645/12645/12645 -f 12643/12643/12643 12645/12645/12645 12646/12646/12646 -v 19151.5 10521 3884.7 -vt 0.0245219 0.843776 -v 19106.5 10521 3884.7 -vt 0.0240685 0.843776 -v 19106.5 9515.99 3884.7 -vt 0.0240685 0.835532 -v 19151.5 9515.99 3884.7 -vt 0.0245219 0.835532 -v 18986.5 10521 3884.7 -vt 0.0228595 0.843776 -v 18986.5 9515.99 3884.7 -vt 0.0228595 0.835532 -o mesh2609 -s off -f 12647/12647/12647 12648/12648/12648 12649/12649/12649 -f 12647/12647/12647 12649/12649/12649 12650/12650/12650 -f 12651/12651/12651 12652/12652/12652 12649/12649/12649 -f 12651/12651/12651 12649/12649/12649 12648/12648/12648 -g charts -o chart0000 -s off -f 12647/12647/12647 12648/12648/12648 12649/12649/12649 -f 12647/12647/12647 12649/12649/12649 12650/12650/12650 -f 12651/12651/12651 12652/12652/12652 12649/12649/12649 -f 12651/12651/12651 12649/12649/12649 12648/12648/12648 -v 19151.5 9515.99 3884.7 -vt 0.784289 0.926216 -v 19106.5 9515.99 3884.7 -vt 0.784289 0.926666 -v 19106.5 9515.99 5729.7 -vt 0.769327 0.926666 -v 19151.5 9515.99 5729.7 -vt 0.769327 0.926216 -v 18986.5 9515.99 3884.7 -vt 0.784289 0.927865 -v 18986.5 9515.99 5729.7 -vt 0.769327 0.927865 -o mesh2610 -s off -f 12653/12653/12653 12654/12654/12654 12655/12655/12655 -f 12653/12653/12653 12655/12655/12655 12656/12656/12656 -f 12657/12657/12657 12658/12658/12658 12655/12655/12655 -f 12657/12657/12657 12655/12655/12655 12654/12654/12654 -g charts -o chart0000 -s off -f 12653/12653/12653 12654/12654/12654 12655/12655/12655 -f 12653/12653/12653 12655/12655/12655 12656/12656/12656 -f 12657/12657/12657 12658/12658/12658 12655/12655/12655 -f 12657/12657/12657 12655/12655/12655 12654/12654/12654 -v 19151.5 9515.99 5729.7 -vt 0.79177 0.522259 -v 19106.5 9515.99 5729.7 -vt 0.79177 0.522708 -v 19106.5 10521 5729.7 -vt 0.783458 0.522708 -v 19151.5 10521 5729.7 -vt 0.783458 0.522259 -v 18986.5 9515.99 5729.7 -vt 0.79177 0.523908 -v 18986.5 10521 5729.7 -vt 0.783458 0.523908 -o mesh2611 -s off -f 12659/12659/12659 12660/12660/12660 12661/12661/12661 -f 12659/12659/12659 12661/12661/12661 12662/12662/12662 -f 12663/12663/12663 12664/12664/12664 12661/12661/12661 -f 12663/12663/12663 12661/12661/12661 12660/12660/12660 -g charts -o chart0000 -s off -f 12659/12659/12659 12660/12660/12660 12661/12661/12661 -f 12659/12659/12659 12661/12661/12661 12662/12662/12662 -f 12663/12663/12663 12664/12664/12664 12661/12661/12661 -f 12663/12663/12663 12661/12661/12661 12660/12660/12660 -v 19151.5 10521 5729.7 -vt 0.799252 0.571723 -v 19106.5 10521 5729.7 -vt 0.799252 0.571273 -v 19106.5 10521 3884.7 -vt 0.784289 0.571273 -v 19151.5 10521 3884.7 -vt 0.784289 0.571723 -v 18986.5 10521 5729.7 -vt 0.799252 0.570074 -v 18986.5 10521 3884.7 -vt 0.784289 0.570074 -o mesh2612 -s off -f 12665/12665/12665 12666/12666/12666 12667/12667/12667 -f 12665/12665/12665 12667/12667/12667 12668/12668/12668 -f 12669/12669/12669 12670/12670/12670 12667/12667/12667 -f 12669/12669/12669 12667/12667/12667 12666/12666/12666 -g charts -o chart0000 -s off -f 12665/12665/12665 12666/12666/12666 12667/12667/12667 -f 12665/12665/12665 12667/12667/12667 12668/12668/12668 -f 12669/12669/12669 12670/12670/12670 12667/12667/12667 -f 12669/12669/12669 12667/12667/12667 12666/12666/12666 -v 19106.5 10521 3884.7 -vt 0.858271 0.674773 -v 19106.5 10461 3944.7 -vt 0.857775 0.673949 -v 19106.5 9515.99 3884.7 -vt 0.849958 0.674773 -v 19106.5 9575.99 3944.7 -vt 0.850455 0.673949 -o mesh2613 -s off -f 12671/12671/12671 12672/12672/12672 12673/12673/12673 -f 12674/12674/12674 12673/12673/12673 12672/12672/12672 -g charts -o chart0000 -s off -f 12671/12671/12671 12672/12672/12672 12673/12673/12673 -f 12674/12674/12674 12673/12673/12673 12672/12672/12672 -v 19106.5 10461 3944.7 -vt 0.50298 0.992168 -v 19106.5 10521 3884.7 -vt 0.502494 0.992992 -v 19106.5 10521 5729.7 -vt 0.517456 0.992992 -o mesh2614 -s off -f 12675/12675/12675 12676/12676/12676 12677/12677/12677 -g charts -o chart0000 -s off -f 12675/12675/12675 12676/12676/12676 12677/12677/12677 -v 19106.5 10461 3944.7 -vt 0.711139 0.940231 -v 19106.5 10521 5729.7 -vt 0.711139 0.954246 -v 19106.5 10461 5669.7 -vt 0.710308 0.953759 -o mesh2615 -s off -f 12678/12678/12678 12679/12679/12679 12680/12680/12680 -g charts -o chart0000 -s off -f 12678/12678/12678 12679/12679/12679 12680/12680/12680 -v 19106.5 10461 5669.7 -vt 0.00706567 0.198768 -v 19106.5 10521 5729.7 -vt 0.00789684 0.198269 -v 19106.5 9575.99 5669.7 -vt 0.00789684 0.205688 -o mesh2616 -s off -f 12681/12681/12681 12682/12682/12682 12683/12683/12683 -g charts -o chart0000 -s off -f 12681/12681/12681 12682/12682/12682 12683/12683/12683 -v 19106.5 9515.99 3884.7 -vt 0.642976 0.686315 -v 19106.5 9575.99 3944.7 -vt 0.642489 0.685491 -v 19106.5 9515.99 5729.7 -vt 0.628013 0.686315 -o mesh2617 -s off -f 12684/12684/12684 12685/12685/12685 12686/12686/12686 -g charts -o chart0000 -s off -f 12684/12684/12684 12685/12685/12685 12686/12686/12686 -v 19106.5 9515.99 5729.7 -vt 0.64547 0.385408 -v 19106.5 9575.99 3944.7 -vt 0.64547 0.399423 -v 19106.5 9575.99 5669.7 -vt 0.644638 0.385895 -o mesh2618 -s off -f 12687/12687/12687 12688/12688/12688 12689/12689/12689 -g charts -o chart0000 -s off -f 12687/12687/12687 12688/12688/12688 12689/12689/12689 -v 19106.5 9515.99 5729.7 -vt 0.401912 0.506595 -v 19106.5 9575.99 5669.7 -vt 0.401416 0.505771 -v 19106.5 10521 5729.7 -vt 0.393599 0.506595 -o mesh2619 -s off -f 12690/12690/12690 12691/12691/12691 12692/12692/12692 -g charts -o chart0000 -s off -f 12690/12690/12690 12691/12691/12691 12692/12692/12692 -v 18986.5 9575.99 5669.7 -vt 0.410224 0.308739 -v 19031.5 10005.4 5669.7 -vt 0.406595 0.30812 -v 19106.5 9575.99 5669.7 -vt 0.410224 0.30709 -v 18986.5 10461 5669.7 -vt 0.402743 0.308739 -v 19031.5 10031.6 5669.7 -vt 0.406373 0.30812 -v 19061.5 10031.6 5669.7 -vt 0.406373 0.307708 -v 19061.5 10005.4 5669.7 -vt 0.406595 0.307708 -v 19106.5 10461 5669.7 -vt 0.402743 0.30709 -o mesh2620 -s off -f 12693/12693/12693 12694/12694/12694 12695/12695/12695 -f 12694/12694/12694 12693/12693/12693 12696/12696/12696 -f 12694/12694/12694 12696/12696/12696 12697/12697/12697 -f 12697/12697/12697 12696/12696/12696 12698/12698/12698 -f 12695/12695/12695 12699/12699/12699 12700/12700/12700 -f 12699/12699/12699 12695/12695/12695 12694/12694/12694 -f 12700/12700/12700 12699/12699/12699 12698/12698/12698 -f 12700/12700/12700 12698/12698/12698 12696/12696/12696 -g charts -o chart0000 -s off -f 12693/12693/12693 12694/12694/12694 12695/12695/12695 -f 12694/12694/12694 12693/12693/12693 12696/12696/12696 -f 12694/12694/12694 12696/12696/12696 12697/12697/12697 -f 12697/12697/12697 12696/12696/12696 12698/12698/12698 -f 12695/12695/12695 12699/12699/12699 12700/12700/12700 -f 12699/12699/12699 12695/12695/12695 12694/12694/12694 -f 12700/12700/12700 12699/12699/12699 12698/12698/12698 -f 12700/12700/12700 12698/12698/12698 12696/12696/12696 -v 19106.5 10461 5669.7 -vt 0.227348 0.434872 -v 19061.5 10461 4817.32 -vt 0.220365 0.43549 -v 19106.5 10461 3944.7 -vt 0.213217 0.434872 -v 18986.5 10461 5669.7 -vt 0.227348 0.436521 -v 19031.5 10461 4817.32 -vt 0.220365 0.435903 -v 19031.5 10461 4797.08 -vt 0.2202 0.435903 -v 19061.5 10461 4797.08 -vt 0.2202 0.43549 -v 18986.5 10461 3944.7 -vt 0.213217 0.436521 -o mesh2621 -s off -f 12701/12701/12701 12702/12702/12702 12703/12703/12703 -f 12702/12702/12702 12701/12701/12701 12704/12704/12704 -f 12702/12702/12702 12704/12704/12704 12705/12705/12705 -f 12705/12705/12705 12704/12704/12704 12706/12706/12706 -f 12703/12703/12703 12707/12707/12707 12708/12708/12708 -f 12707/12707/12707 12703/12703/12703 12702/12702/12702 -f 12708/12708/12708 12707/12707/12707 12706/12706/12706 -f 12708/12708/12708 12706/12706/12706 12704/12704/12704 -g charts -o chart0000 -s off -f 12701/12701/12701 12702/12702/12702 12703/12703/12703 -f 12702/12702/12702 12701/12701/12701 12704/12704/12704 -f 12702/12702/12702 12704/12704/12704 12705/12705/12705 -f 12705/12705/12705 12704/12704/12704 12706/12706/12706 -f 12703/12703/12703 12707/12707/12707 12708/12708/12708 -f 12707/12707/12707 12703/12703/12703 12702/12702/12702 -f 12708/12708/12708 12707/12707/12707 12706/12706/12706 -f 12708/12708/12708 12706/12706/12706 12704/12704/12704 -v 19106.5 9575.99 3944.7 -vt 0.688695 0.52061 -v 19061.5 10005.4 3944.7 -vt 0.685065 0.521228 -v 18986.5 9575.99 3944.7 -vt 0.688695 0.522259 -v 19106.5 10461 3944.7 -vt 0.681214 0.52061 -v 19061.5 10031.6 3944.7 -vt 0.684843 0.521228 -v 19031.5 10031.6 3944.7 -vt 0.684843 0.521641 -v 19031.5 10005.4 3944.7 -vt 0.685065 0.521641 -v 18986.5 10461 3944.7 -vt 0.681214 0.522259 -o mesh2622 -s off -f 12709/12709/12709 12710/12710/12710 12711/12711/12711 -f 12710/12710/12710 12709/12709/12709 12712/12712/12712 -f 12710/12710/12710 12712/12712/12712 12713/12713/12713 -f 12713/12713/12713 12712/12712/12712 12714/12714/12714 -f 12711/12711/12711 12715/12715/12715 12716/12716/12716 -f 12715/12715/12715 12711/12711/12711 12710/12710/12710 -f 12716/12716/12716 12715/12715/12715 12714/12714/12714 -f 12716/12716/12716 12714/12714/12714 12712/12712/12712 -g charts -o chart0000 -s off -f 12709/12709/12709 12710/12710/12710 12711/12711/12711 -f 12710/12710/12710 12709/12709/12709 12712/12712/12712 -f 12710/12710/12710 12712/12712/12712 12713/12713/12713 -f 12713/12713/12713 12712/12712/12712 12714/12714/12714 -f 12711/12711/12711 12715/12715/12715 12716/12716/12716 -f 12715/12715/12715 12711/12711/12711 12710/12710/12710 -f 12716/12716/12716 12715/12715/12715 12714/12714/12714 -f 12716/12716/12716 12714/12714/12714 12712/12712/12712 -v 18986.5 9575.99 3944.7 -vt 0.0145469 0.23042 -v 18986.5 9575.99 5669.7 -vt 0.0145469 0.216406 -v 19106.5 9575.99 5669.7 -vt 0.0128845 0.216406 -v 19106.5 9575.99 3944.7 -vt 0.0128845 0.23042 -o mesh2623 -s off -f 12717/12717/12717 12718/12718/12718 12719/12719/12719 -f 12717/12717/12717 12719/12719/12719 12720/12720/12720 -g charts -o chart0000 -s off -f 12717/12717/12717 12718/12718/12718 12719/12719/12719 -f 12717/12717/12717 12719/12719/12719 12720/12720/12720 -v 19031.5 10005.4 5669.7 -vt 0.833333 0.536274 -v 19031.5 10031.6 5669.7 -vt 0.833333 0.535449 -v 19031.5 10031.6 3944.7 -vt 0.819202 0.535449 -v 19031.5 10005.4 3944.7 -vt 0.819202 0.536274 -o mesh2624 -s off -f 12721/12721/12721 12722/12722/12722 12723/12723/12723 -f 12721/12721/12721 12723/12723/12723 12724/12724/12724 -g charts -o chart0000 -s off -f 12721/12721/12721 12722/12722/12722 12723/12723/12723 -f 12721/12721/12721 12723/12723/12723 12724/12724/12724 -v 19031.5 10031.6 5669.7 -vt 0.438487 0.434048 -v 19061.5 10031.6 5669.7 -vt 0.437656 0.434048 -v 19061.5 10031.6 3944.7 -vt 0.437656 0.420033 -v 19031.5 10031.6 3944.7 -vt 0.438487 0.420033 -o mesh2625 -s off -f 12725/12725/12725 12726/12726/12726 12727/12727/12727 -f 12725/12725/12725 12727/12727/12727 12728/12728/12728 -g charts -o chart0000 -s off -f 12725/12725/12725 12726/12726/12726 12727/12727/12727 -f 12725/12725/12725 12727/12727/12727 12728/12728/12728 -v 19061.5 9596.35 4817.32 -vt 0.465919 0.687139 -v 19031.5 9596.35 4817.32 -vt 0.465919 0.687964 -v 19031.5 9596.35 4797.08 -vt 0.46675 0.687964 -v 19061.5 9596.35 4797.08 -vt 0.46675 0.687139 -o mesh2626 -s off -f 12729/12729/12729 12730/12730/12730 12731/12731/12731 -f 12729/12729/12729 12731/12731/12731 12732/12732/12732 -g charts -o chart0000 -s off -f 12729/12729/12729 12730/12730/12730 12731/12731/12731 -f 12729/12729/12729 12731/12731/12731 12732/12732/12732 -v 19061.5 10461 4817.32 -vt 0.931421 0.94188 -v 19031.5 10461 4817.32 -vt 0.931421 0.941055 -v 19031.5 9596.35 4817.32 -vt 0.92394 0.941055 -v 19061.5 9596.35 4817.32 -vt 0.92394 0.94188 -o mesh2627 -s off -f 12733/12733/12733 12734/12734/12734 12735/12735/12735 -f 12733/12733/12733 12735/12735/12735 12736/12736/12736 -g charts -o chart0000 -s off -f 12733/12733/12733 12734/12734/12734 12735/12735/12735 -f 12733/12733/12733 12735/12735/12735 12736/12736/12736 -v 19031.5 10461 4817.32 -vt 0.982959 0.82399 -v 19031.5 10461 4797.08 -vt 0.982959 0.823166 -v 19031.5 9596.35 4797.08 -vt 0.975478 0.823166 -v 19031.5 9596.35 4817.32 -vt 0.975478 0.82399 -o mesh2628 -s off -f 12737/12737/12737 12738/12738/12738 12739/12739/12739 -f 12737/12737/12737 12739/12739/12739 12740/12740/12740 -g charts -o chart0000 -s off -f 12737/12737/12737 12738/12738/12738 12739/12739/12739 -f 12737/12737/12737 12739/12739/12739 12740/12740/12740 -v 19031.5 10461 4797.08 -vt 0.399418 0.93446 -v 19061.5 10461 4797.08 -vt 0.399418 0.933636 -v 19061.5 9596.35 4797.08 -vt 0.391937 0.933636 -v 19031.5 9596.35 4797.08 -vt 0.391937 0.93446 -o mesh2629 -s off -f 12741/12741/12741 12742/12742/12742 12743/12743/12743 -f 12741/12741/12741 12743/12743/12743 12744/12744/12744 -g charts -o chart0000 -s off -f 12741/12741/12741 12742/12742/12742 12743/12743/12743 -f 12741/12741/12741 12743/12743/12743 12744/12744/12744 -v 19061.5 10461 4797.08 -vt 0.342893 0.673124 -v 19061.5 10461 4817.32 -vt 0.342893 0.6723 -v 19061.5 9596.35 4817.32 -vt 0.335411 0.6723 -v 19061.5 9596.35 4797.08 -vt 0.335411 0.673124 -o mesh2630 -s off -f 12745/12745/12745 12746/12746/12746 12747/12747/12747 -f 12745/12745/12745 12747/12747/12747 12748/12748/12748 -g charts -o chart0000 -s off -f 12745/12745/12745 12746/12746/12746 12747/12747/12747 -f 12745/12745/12745 12747/12747/12747 12748/12748/12748 -v 19061.5 10005.4 5669.7 -vt 0.934746 0.157049 -v 19031.5 10005.4 5669.7 -vt 0.934746 0.156224 -v 19031.5 10005.4 3944.7 -vt 0.920615 0.156224 -v 19061.5 10005.4 3944.7 -vt 0.920615 0.157049 -o mesh2631 -s off -f 12749/12749/12749 12750/12750/12750 12751/12751/12751 -f 12749/12749/12749 12751/12751/12751 12752/12752/12752 -g charts -o chart0000 -s off -f 12749/12749/12749 12750/12750/12750 12751/12751/12751 -f 12749/12749/12749 12751/12751/12751 12752/12752/12752 -v 19061.5 10031.6 5669.7 -vt 0.932253 0.891591 -v 19061.5 10005.4 5669.7 -vt 0.932253 0.890767 -v 19061.5 10005.4 3944.7 -vt 0.918121 0.890767 -v 19061.5 10031.6 3944.7 -vt 0.918121 0.891591 -o mesh2632 -s off -f 12753/12753/12753 12754/12754/12754 12755/12755/12755 -f 12753/12753/12753 12755/12755/12755 12756/12756/12756 -g charts -o chart0000 -s off -f 12753/12753/12753 12754/12754/12754 12755/12755/12755 -f 12753/12753/12753 12755/12755/12755 12756/12756/12756 -v 18986.5 11728.5 3847.2 -vt 0.443475 0.932811 -v 18986.5 11766 3884.7 -vt 0.443792 0.933636 -v 18986.5 12808.5 3847.2 -vt 0.452618 0.932811 -v 18986.5 12771 3884.7 -vt 0.452301 0.933636 -o mesh2633 -s off -f 12757/12757/12757 12758/12758/12758 12759/12759/12759 -f 12760/12760/12760 12759/12759/12759 12758/12758/12758 -g charts -o chart0000 -s off -f 12757/12757/12757 12758/12758/12758 12759/12759/12759 -f 12760/12760/12760 12759/12759/12759 12758/12758/12758 -v 18986.5 11766 3884.7 -vt 0.904821 0.00813786 -v 18986.5 11728.5 3847.2 -vt 0.905652 0.00783182 -v 18986.5 11728.5 5767.2 -vt 0.905652 0.0234954 -o mesh2634 -s off -f 12761/12761/12761 12762/12762/12762 12763/12763/12763 -g charts -o chart0000 -s off -f 12761/12761/12761 12762/12762/12762 12763/12763/12763 -v 18986.5 11766 3884.7 -vt 0.691189 0.608821 -v 18986.5 11728.5 5767.2 -vt 0.706151 0.608821 -v 18986.5 11766 5729.7 -vt 0.705847 0.607997 -o mesh2635 -s off -f 12764/12764/12764 12765/12765/12765 12766/12766/12766 -g charts -o chart0000 -s off -f 12764/12764/12764 12765/12765/12765 12766/12766/12766 -v 18986.5 11766 5729.7 -vt 0.610866 0.535449 -v 18986.5 11728.5 5767.2 -vt 0.610557 0.536274 -v 18986.5 12771 5729.7 -vt 0.618869 0.536274 -o mesh2636 -s off -f 12767/12767/12767 12768/12768/12768 12769/12769/12769 -g charts -o chart0000 -s off -f 12767/12767/12767 12768/12768/12768 12769/12769/12769 -v 18986.5 12808.5 3847.2 -vt 0.36118 0.338417 -v 18986.5 12771 3884.7 -vt 0.360872 0.337593 -v 18986.5 12808.5 5767.2 -vt 0.345387 0.338417 -o mesh2637 -s off -f 12770/12770/12770 12771/12771/12771 12772/12772/12772 -g charts -o chart0000 -s off -f 12770/12770/12770 12771/12771/12771 12772/12772/12772 -v 18986.5 12808.5 5767.2 -vt 0.501662 0.632729 -v 18986.5 12771 3884.7 -vt 0.516625 0.632729 -v 18986.5 12771 5729.7 -vt 0.501966 0.631904 -o mesh2638 -s off -f 12773/12773/12773 12774/12774/12774 12775/12775/12775 -g charts -o chart0000 -s off -f 12773/12773/12773 12774/12774/12774 12775/12775/12775 -v 18986.5 12808.5 5767.2 -vt 0.869908 0.701978 -v 18986.5 12771 5729.7 -vt 0.869077 0.701664 -v 18986.5 11728.5 5767.2 -vt 0.869908 0.69291 -o mesh2639 -s off -f 12776/12776/12776 12777/12777/12777 12778/12778/12778 -g charts -o chart0000 -s off -f 12776/12776/12776 12777/12777/12777 12778/12778/12778 -v 19151.5 12808.5 3847.2 -vt 0.0511221 0.607172 -v 19151.5 12771 3884.7 -vt 0.0502909 0.606857 -v 19151.5 11728.5 3847.2 -vt 0.0511221 0.598104 -v 19151.5 11766 3884.7 -vt 0.0502909 0.598419 -o mesh2640 -s off -f 12779/12779/12779 12780/12780/12780 12781/12781/12781 -f 12782/12782/12782 12781/12781/12781 12780/12780/12780 -g charts -o chart0000 -s off -f 12779/12779/12779 12780/12780/12780 12781/12781/12781 -f 12782/12782/12782 12781/12781/12781 12780/12780/12780 -v 19151.5 12771 3884.7 -vt 0.345695 0.410965 -v 19151.5 12808.5 3847.2 -vt 0.345387 0.411789 -v 19151.5 12808.5 5767.2 -vt 0.36118 0.411789 -o mesh2641 -s off -f 12783/12783/12783 12784/12784/12784 12785/12785/12785 -g charts -o chart0000 -s off -f 12783/12783/12783 12784/12784/12784 12785/12785/12785 -v 19151.5 12771 3884.7 -vt 0.233167 0.889118 -v 19151.5 12808.5 5767.2 -vt 0.24813 0.889118 -v 19151.5 12771 5729.7 -vt 0.247826 0.888294 -o mesh2642 -s off -f 12786/12786/12786 12787/12787/12787 12788/12788/12788 -g charts -o chart0000 -s off -f 12786/12786/12786 12787/12787/12787 12788/12788/12788 -v 19151.5 12771 5729.7 -vt 0.629985 0.669002 -v 19151.5 12808.5 5767.2 -vt 0.629676 0.669827 -v 19151.5 11766 5729.7 -vt 0.637988 0.669827 -o mesh2643 -s off -f 12789/12789/12789 12790/12790/12790 12791/12791/12791 -g charts -o chart0000 -s off -f 12789/12789/12789 12790/12790/12790 12791/12791/12791 -v 19151.5 11728.5 3847.2 -vt 0.911471 0.619538 -v 19151.5 11766 3884.7 -vt 0.911163 0.618714 -v 19151.5 11728.5 5767.2 -vt 0.895677 0.619538 -o mesh2644 -s off -f 12792/12792/12792 12793/12793/12793 12794/12794/12794 -g charts -o chart0000 -s off -f 12792/12792/12792 12793/12793/12793 12794/12794/12794 -v 19151.5 11728.5 5767.2 -vt 0.97714 0.981451 -v 19151.5 11766 3884.7 -vt 0.97714 0.99629 -v 19151.5 11766 5729.7 -vt 0.976309 0.981752 -o mesh2645 -s off -f 12795/12795/12795 12796/12796/12796 12797/12797/12797 -g charts -o chart0000 -s off -f 12795/12795/12795 12796/12796/12796 12797/12797/12797 -v 19151.5 11728.5 5767.2 -vt 0.875727 0.734955 -v 19151.5 11766 5729.7 -vt 0.874896 0.73464 -v 19151.5 12808.5 5767.2 -vt 0.875727 0.725886 -o mesh2646 -s off -f 12798/12798/12798 12799/12799/12799 12800/12800/12800 -g charts -o chart0000 -s off -f 12798/12798/12798 12799/12799/12799 12800/12800/12800 -v 18986.5 12808.5 5767.2 -vt 0.801746 0.819868 -v 18986.5 11728.5 5767.2 -vt 0.810889 0.819868 -v 19151.5 11728.5 5767.2 -vt 0.810889 0.821517 -v 19151.5 12808.5 5767.2 -vt 0.801746 0.821517 -o mesh2647 -s off -f 12801/12801/12801 12802/12802/12802 12803/12803/12803 -f 12801/12801/12801 12803/12803/12803 12804/12804/12804 -g charts -o chart0000 -s off -f 12801/12801/12801 12802/12802/12802 12803/12803/12803 -f 12801/12801/12801 12803/12803/12803 12804/12804/12804 -v 18986.5 11728.5 5767.2 -vt 0.820033 0.510717 -v 18986.5 11728.5 3847.2 -vt 0.820033 0.526381 -v 19151.5 11728.5 3847.2 -vt 0.821696 0.526381 -v 19151.5 11728.5 5767.2 -vt 0.821696 0.510717 -o mesh2648 -s off -f 12805/12805/12805 12806/12806/12806 12807/12807/12807 -f 12805/12805/12805 12807/12807/12807 12808/12808/12808 -g charts -o chart0000 -s off -f 12805/12805/12805 12806/12806/12806 12807/12807/12807 -f 12805/12805/12805 12807/12807/12807 12808/12808/12808 -v 18986.5 11728.5 3847.2 -vt 0.32128 0.434048 -v 18986.5 12808.5 3847.2 -vt 0.312136 0.434048 -v 19151.5 12808.5 3847.2 -vt 0.312136 0.432399 -v 19151.5 11728.5 3847.2 -vt 0.32128 0.432399 -o mesh2649 -s off -f 12809/12809/12809 12810/12810/12810 12811/12811/12811 -f 12809/12809/12809 12811/12811/12811 12812/12812/12812 -g charts -o chart0000 -s off -f 12809/12809/12809 12810/12810/12810 12811/12811/12811 -f 12809/12809/12809 12811/12811/12811 12812/12812/12812 -v 18986.5 12808.5 3847.2 -vt 0.397756 0.440643 -v 18986.5 12808.5 5767.2 -vt 0.381962 0.440643 -v 19151.5 12808.5 5767.2 -vt 0.381962 0.438994 -v 19151.5 12808.5 3847.2 -vt 0.397756 0.438994 -o mesh2650 -s off -f 12813/12813/12813 12814/12814/12814 12815/12815/12815 -f 12813/12813/12813 12815/12815/12815 12816/12816/12816 -g charts -o chart0000 -s off -f 12813/12813/12813 12814/12814/12814 12815/12815/12815 -f 12813/12813/12813 12815/12815/12815 12816/12816/12816 -v 19151.5 12771 3884.7 -vt 0.12261 0.976504 -v 19106.5 12771 3884.7 -vt 0.122157 0.976504 -v 19106.5 11766 3884.7 -vt 0.122157 0.968261 -v 19151.5 11766 3884.7 -vt 0.12261 0.968261 -v 18986.5 12771 3884.7 -vt 0.120948 0.976504 -v 18986.5 11766 3884.7 -vt 0.120948 0.968261 -o mesh2651 -s off -f 12817/12817/12817 12818/12818/12818 12819/12819/12819 -f 12817/12817/12817 12819/12819/12819 12820/12820/12820 -f 12821/12821/12821 12822/12822/12822 12819/12819/12819 -f 12821/12821/12821 12819/12819/12819 12818/12818/12818 -g charts -o chart0000 -s off -f 12817/12817/12817 12818/12818/12818 12819/12819/12819 -f 12817/12817/12817 12819/12819/12819 12820/12820/12820 -f 12821/12821/12821 12822/12822/12822 12819/12819/12819 -f 12821/12821/12821 12819/12819/12819 12818/12818/12818 -v 19151.5 11766 3884.7 -vt 0.743558 0.648392 -v 19106.5 11766 3884.7 -vt 0.743558 0.648842 -v 19106.5 11766 5729.7 -vt 0.728595 0.648842 -v 19151.5 11766 5729.7 -vt 0.728595 0.648392 -v 18986.5 11766 3884.7 -vt 0.743558 0.650041 -v 18986.5 11766 5729.7 -vt 0.728595 0.650041 -o mesh2652 -s off -f 12823/12823/12823 12824/12824/12824 12825/12825/12825 -f 12823/12823/12823 12825/12825/12825 12826/12826/12826 -f 12827/12827/12827 12828/12828/12828 12825/12825/12825 -f 12827/12827/12827 12825/12825/12825 12824/12824/12824 -g charts -o chart0000 -s off -f 12823/12823/12823 12824/12824/12824 12825/12825/12825 -f 12823/12823/12823 12825/12825/12825 12826/12826/12826 -f 12827/12827/12827 12828/12828/12828 12825/12825/12825 -f 12827/12827/12827 12825/12825/12825 12824/12824/12824 -v 19151.5 11766 5729.7 -vt 0.305486 0.838829 -v 19106.5 11766 5729.7 -vt 0.305486 0.839279 -v 19106.5 12771 5729.7 -vt 0.297174 0.839279 -v 19151.5 12771 5729.7 -vt 0.297174 0.838829 -v 18986.5 11766 5729.7 -vt 0.305486 0.840478 -v 18986.5 12771 5729.7 -vt 0.297174 0.840478 -o mesh2653 -s off -f 12829/12829/12829 12830/12830/12830 12831/12831/12831 -f 12829/12829/12829 12831/12831/12831 12832/12832/12832 -f 12833/12833/12833 12834/12834/12834 12831/12831/12831 -f 12833/12833/12833 12831/12831/12831 12830/12830/12830 -g charts -o chart0000 -s off -f 12829/12829/12829 12830/12830/12830 12831/12831/12831 -f 12829/12829/12829 12831/12831/12831 12832/12832/12832 -f 12833/12833/12833 12834/12834/12834 12831/12831/12831 -f 12833/12833/12833 12831/12831/12831 12830/12830/12830 -v 19151.5 12771 5729.7 -vt 0.780133 0.40272 -v 19106.5 12771 5729.7 -vt 0.77968 0.40272 -v 19106.5 12771 3884.7 -vt 0.77968 0.387881 -v 19151.5 12771 3884.7 -vt 0.780133 0.387881 -v 18986.5 12771 5729.7 -vt 0.778471 0.40272 -v 18986.5 12771 3884.7 -vt 0.778471 0.387881 -o mesh2654 -s off -f 12835/12835/12835 12836/12836/12836 12837/12837/12837 -f 12835/12835/12835 12837/12837/12837 12838/12838/12838 -f 12839/12839/12839 12840/12840/12840 12837/12837/12837 -f 12839/12839/12839 12837/12837/12837 12836/12836/12836 -g charts -o chart0000 -s off -f 12835/12835/12835 12836/12836/12836 12837/12837/12837 -f 12835/12835/12835 12837/12837/12837 12838/12838/12838 -f 12839/12839/12839 12840/12840/12840 12837/12837/12837 -f 12839/12839/12839 12837/12837/12837 12836/12836/12836 -v 19106.5 12771 3884.7 -vt 0.756858 0.671476 -v 19106.5 12711 3944.7 -vt 0.756361 0.670651 -v 19106.5 11766 3884.7 -vt 0.748545 0.671476 -v 19106.5 11826 3944.7 -vt 0.749042 0.670651 -o mesh2655 -s off -f 12841/12841/12841 12842/12842/12842 12843/12843/12843 -f 12844/12844/12844 12843/12843/12843 12842/12842/12842 -g charts -o chart0000 -s off -f 12841/12841/12841 12842/12842/12842 12843/12843/12843 -f 12844/12844/12844 12843/12843/12843 12842/12842/12842 -v 19106.5 12711 3944.7 -vt 0.93724 0.841785 -v 19106.5 12771 3884.7 -vt 0.938071 0.841303 -v 19106.5 12771 5729.7 -vt 0.938071 0.856142 -o mesh2656 -s off -f 12845/12845/12845 12846/12846/12846 12847/12847/12847 -g charts -o chart0000 -s off -f 12845/12845/12845 12846/12846/12846 12847/12847/12847 -v 19106.5 12711 3944.7 -vt 0.777639 0.673949 -v 19106.5 12771 5729.7 -vt 0.79177 0.673949 -v 19106.5 12711 5669.7 -vt 0.79128 0.673124 -o mesh2657 -s off -f 12848/12848/12848 12849/12849/12849 12850/12850/12850 -g charts -o chart0000 -s off -f 12848/12848/12848 12849/12849/12849 12850/12850/12850 -v 19106.5 12711 5669.7 -vt 0.4867 0.432074 -v 19106.5 12771 5729.7 -vt 0.487531 0.431575 -v 19106.5 11826 5669.7 -vt 0.487531 0.438994 -o mesh2658 -s off -f 12851/12851/12851 12852/12852/12852 12853/12853/12853 -g charts -o chart0000 -s off -f 12851/12851/12851 12852/12852/12852 12853/12853/12853 -v 19106.5 11766 3884.7 -vt 0.378637 0.499175 -v 19106.5 11826 3944.7 -vt 0.37815 0.498351 -v 19106.5 11766 5729.7 -vt 0.363674 0.499175 -o mesh2659 -s off -f 12854/12854/12854 12855/12855/12855 12856/12856/12856 -g charts -o chart0000 -s off -f 12854/12854/12854 12855/12855/12855 12856/12856/12856 -v 19106.5 11766 5729.7 -vt 0.201579 0.663232 -v 19106.5 11826 3944.7 -vt 0.215711 0.663232 -v 19106.5 11826 5669.7 -vt 0.20207 0.662407 -o mesh2660 -s off -f 12857/12857/12857 12858/12858/12858 12859/12859/12859 -g charts -o chart0000 -s off -f 12857/12857/12857 12858/12858/12858 12859/12859/12859 -v 19106.5 11766 5729.7 -vt 0.226517 0.67972 -v 19106.5 11826 5669.7 -vt 0.225686 0.679227 -v 19106.5 12771 5729.7 -vt 0.226517 0.671476 -o mesh2661 -s off -f 12860/12860/12860 12861/12861/12861 12862/12862/12862 -g charts -o chart0000 -s off -f 12860/12860/12860 12861/12861/12861 12862/12862/12862 -v 18986.5 11826 5669.7 -vt 0.653782 0.396125 -v 19031.5 12255.4 5669.7 -vt 0.653159 0.392525 -v 19106.5 11826 5669.7 -vt 0.65212 0.396125 -v 18986.5 12711 5669.7 -vt 0.653782 0.388706 -v 19031.5 12281.6 5669.7 -vt 0.653159 0.392305 -v 19061.5 12281.6 5669.7 -vt 0.652743 0.392305 -v 19061.5 12255.4 5669.7 -vt 0.652743 0.392525 -v 19106.5 12711 5669.7 -vt 0.65212 0.388706 -o mesh2662 -s off -f 12863/12863/12863 12864/12864/12864 12865/12865/12865 -f 12864/12864/12864 12863/12863/12863 12866/12866/12866 -f 12864/12864/12864 12866/12866/12866 12867/12867/12867 -f 12867/12867/12867 12866/12866/12866 12868/12868/12868 -f 12865/12865/12865 12869/12869/12869 12870/12870/12870 -f 12869/12869/12869 12865/12865/12865 12864/12864/12864 -f 12870/12870/12870 12869/12869/12869 12868/12868/12868 -f 12870/12870/12870 12868/12868/12868 12866/12866/12866 -g charts -o chart0000 -s off -f 12863/12863/12863 12864/12864/12864 12865/12865/12865 -f 12864/12864/12864 12863/12863/12863 12866/12866/12866 -f 12864/12864/12864 12866/12866/12866 12867/12867/12867 -f 12867/12867/12867 12866/12866/12866 12868/12868/12868 -f 12865/12865/12865 12869/12869/12869 12870/12870/12870 -f 12869/12869/12869 12865/12865/12865 12864/12864/12864 -f 12870/12870/12870 12869/12869/12869 12868/12868/12868 -f 12870/12870/12870 12868/12868/12868 12866/12866/12866 -v 19106.5 12711 5669.7 -vt 0.713632 0.680544 -v 19061.5 12711 4817.32 -vt 0.70665 0.681162 -v 19106.5 12711 3944.7 -vt 0.699501 0.680544 -v 18986.5 12711 5669.7 -vt 0.713632 0.682193 -v 19031.5 12711 4817.32 -vt 0.70665 0.681575 -v 19031.5 12711 4797.08 -vt 0.706484 0.681575 -v 19061.5 12711 4797.08 -vt 0.706484 0.681162 -v 18986.5 12711 3944.7 -vt 0.699501 0.682193 -o mesh2663 -s off -f 12871/12871/12871 12872/12872/12872 12873/12873/12873 -f 12872/12872/12872 12871/12871/12871 12874/12874/12874 -f 12872/12872/12872 12874/12874/12874 12875/12875/12875 -f 12875/12875/12875 12874/12874/12874 12876/12876/12876 -f 12873/12873/12873 12877/12877/12877 12878/12878/12878 -f 12877/12877/12877 12873/12873/12873 12872/12872/12872 -f 12878/12878/12878 12877/12877/12877 12876/12876/12876 -f 12878/12878/12878 12876/12876/12876 12874/12874/12874 -g charts -o chart0000 -s off -f 12871/12871/12871 12872/12872/12872 12873/12873/12873 -f 12872/12872/12872 12871/12871/12871 12874/12874/12874 -f 12872/12872/12872 12874/12874/12874 12875/12875/12875 -f 12875/12875/12875 12874/12874/12874 12876/12876/12876 -f 12873/12873/12873 12877/12877/12877 12878/12878/12878 -f 12877/12877/12877 12873/12873/12873 12872/12872/12872 -f 12878/12878/12878 12877/12877/12877 12876/12876/12876 -f 12878/12878/12878 12876/12876/12876 12874/12874/12874 -v 19106.5 11826 3944.7 -vt 0.65877 0.973207 -v 19061.5 12255.4 3944.7 -vt 0.65514 0.973825 -v 18986.5 11826 3944.7 -vt 0.65877 0.974856 -v 19106.5 12711 3944.7 -vt 0.651288 0.973207 -v 19061.5 12281.6 3944.7 -vt 0.654918 0.973825 -v 19031.5 12281.6 3944.7 -vt 0.654918 0.974237 -v 19031.5 12255.4 3944.7 -vt 0.65514 0.974237 -v 18986.5 12711 3944.7 -vt 0.651288 0.974856 -o mesh2664 -s off -f 12879/12879/12879 12880/12880/12880 12881/12881/12881 -f 12880/12880/12880 12879/12879/12879 12882/12882/12882 -f 12880/12880/12880 12882/12882/12882 12883/12883/12883 -f 12883/12883/12883 12882/12882/12882 12884/12884/12884 -f 12881/12881/12881 12885/12885/12885 12886/12886/12886 -f 12885/12885/12885 12881/12881/12881 12880/12880/12880 -f 12886/12886/12886 12885/12885/12885 12884/12884/12884 -f 12886/12886/12886 12884/12884/12884 12882/12882/12882 -g charts -o chart0000 -s off -f 12879/12879/12879 12880/12880/12880 12881/12881/12881 -f 12880/12880/12880 12879/12879/12879 12882/12882/12882 -f 12880/12880/12880 12882/12882/12882 12883/12883/12883 -f 12883/12883/12883 12882/12882/12882 12884/12884/12884 -f 12881/12881/12881 12885/12885/12885 12886/12886/12886 -f 12885/12885/12885 12881/12881/12881 12880/12880/12880 -f 12886/12886/12886 12885/12885/12885 12884/12884/12884 -f 12886/12886/12886 12884/12884/12884 12882/12882/12882 -v 18986.5 11826 3944.7 -vt 0.381962 0.908079 -v 18986.5 11826 5669.7 -vt 0.36783 0.908079 -v 19106.5 11826 5669.7 -vt 0.36783 0.90643 -v 19106.5 11826 3944.7 -vt 0.381962 0.90643 -o mesh2665 -s off -f 12887/12887/12887 12888/12888/12888 12889/12889/12889 -f 12887/12887/12887 12889/12889/12889 12890/12890/12890 -g charts -o chart0000 -s off -f 12887/12887/12887 12888/12888/12888 12889/12889/12889 -f 12887/12887/12887 12889/12889/12889 12890/12890/12890 -v 19031.5 12255.4 5669.7 -vt 0.120116 0.403545 -v 19031.5 12281.6 5669.7 -vt 0.120116 0.402721 -v 19031.5 12281.6 3944.7 -vt 0.105985 0.402721 -v 19031.5 12255.4 3944.7 -vt 0.105985 0.403545 -o mesh2666 -s off -f 12891/12891/12891 12892/12892/12892 12893/12893/12893 -f 12891/12891/12891 12893/12893/12893 12894/12894/12894 -g charts -o chart0000 -s off -f 12891/12891/12891 12892/12892/12892 12893/12893/12893 -f 12891/12891/12891 12893/12893/12893 12894/12894/12894 -v 19031.5 12281.6 5669.7 -vt 0.619701 0.401072 -v 19061.5 12281.6 5669.7 -vt 0.618869 0.401072 -v 19061.5 12281.6 3944.7 -vt 0.618869 0.387057 -v 19031.5 12281.6 3944.7 -vt 0.619701 0.387057 -o mesh2667 -s off -f 12895/12895/12895 12896/12896/12896 12897/12897/12897 -f 12895/12895/12895 12897/12897/12897 12898/12898/12898 -g charts -o chart0000 -s off -f 12895/12895/12895 12896/12896/12896 12897/12897/12897 -f 12895/12895/12895 12897/12897/12897 12898/12898/12898 -v 19061.5 11846.3 4817.32 -vt 0.743558 0.749794 -v 19031.5 11846.3 4817.32 -vt 0.744389 0.749794 -v 19031.5 11846.3 4797.08 -vt 0.744389 0.750618 -v 19061.5 11846.3 4797.08 -vt 0.743558 0.750618 -o mesh2668 -s off -f 12899/12899/12899 12900/12900/12900 12901/12901/12901 -f 12899/12899/12899 12901/12901/12901 12902/12902/12902 -g charts -o chart0000 -s off -f 12899/12899/12899 12900/12900/12900 12901/12901/12901 -f 12899/12899/12899 12901/12901/12901 12902/12902/12902 -v 19061.5 12711 4817.32 -vt 0.969659 0.867683 -v 19031.5 12711 4817.32 -vt 0.968828 0.867683 -v 19031.5 11846.3 4817.32 -vt 0.968828 0.860264 -v 19061.5 11846.3 4817.32 -vt 0.969659 0.860264 -o mesh2669 -s off -f 12903/12903/12903 12904/12904/12904 12905/12905/12905 -f 12903/12903/12903 12905/12905/12905 12906/12906/12906 -g charts -o chart0000 -s off -f 12903/12903/12903 12904/12904/12904 12905/12905/12905 -f 12903/12903/12903 12905/12905/12905 12906/12906/12906 -v 19031.5 12711 4817.32 -vt 0.14256 0.543693 -v 19031.5 12711 4797.08 -vt 0.14256 0.542869 -v 19031.5 11846.3 4797.08 -vt 0.135079 0.542869 -v 19031.5 11846.3 4817.32 -vt 0.135079 0.543693 -o mesh2670 -s off -f 12907/12907/12907 12908/12908/12908 12909/12909/12909 -f 12907/12907/12907 12909/12909/12909 12910/12910/12910 -g charts -o chart0000 -s off -f 12907/12907/12907 12908/12908/12908 12909/12909/12909 -f 12907/12907/12907 12909/12909/12909 12910/12910/12910 -v 19031.5 12711 4797.08 -vt 0.413549 0.843776 -v 19061.5 12711 4797.08 -vt 0.412718 0.843776 -v 19061.5 11846.3 4797.08 -vt 0.412718 0.836356 -v 19031.5 11846.3 4797.08 -vt 0.413549 0.836356 -o mesh2671 -s off -f 12911/12911/12911 12912/12912/12912 12913/12913/12913 -f 12911/12911/12911 12913/12913/12913 12914/12914/12914 -g charts -o chart0000 -s off -f 12911/12911/12911 12912/12912/12912 12913/12913/12913 -f 12911/12911/12911 12913/12913/12913 12914/12914/12914 -v 19061.5 12711 4797.08 -vt 0.138404 0.346661 -v 19061.5 12711 4817.32 -vt 0.137573 0.346661 -v 19061.5 11846.3 4817.32 -vt 0.137573 0.339242 -v 19061.5 11846.3 4797.08 -vt 0.138404 0.339242 -o mesh2672 -s off -f 12915/12915/12915 12916/12916/12916 12917/12917/12917 -f 12915/12915/12915 12917/12917/12917 12918/12918/12918 -g charts -o chart0000 -s off -f 12915/12915/12915 12916/12916/12916 12917/12917/12917 -f 12915/12915/12915 12917/12917/12917 12918/12918/12918 -v 19061.5 12255.4 5669.7 -vt 0.753533 0.956719 -v 19031.5 12255.4 5669.7 -vt 0.753533 0.955894 -v 19031.5 12255.4 3944.7 -vt 0.739402 0.955894 -v 19061.5 12255.4 3944.7 -vt 0.739402 0.956719 -o mesh2673 -s off -f 12919/12919/12919 12920/12920/12920 12921/12921/12921 -f 12919/12919/12919 12921/12921/12921 12922/12922/12922 -g charts -o chart0000 -s off -f 12919/12919/12919 12920/12920/12920 12921/12921/12921 -f 12919/12919/12919 12921/12921/12921 12922/12922/12922 -v 19061.5 12281.6 5669.7 -vt 0.97049 0.957543 -v 19061.5 12255.4 5669.7 -vt 0.97049 0.956719 -v 19061.5 12255.4 3944.7 -vt 0.956359 0.956719 -v 19061.5 12281.6 3944.7 -vt 0.956359 0.957543 -o mesh2674 -s off -f 12923/12923/12923 12924/12924/12924 12925/12925/12925 -f 12923/12923/12923 12925/12925/12925 12926/12926/12926 -g charts -o chart0000 -s off -f 12923/12923/12923 12924/12924/12924 12925/12925/12925 -f 12923/12923/12923 12925/12925/12925 12926/12926/12926 -v 18986.5 10603.5 3847.2 -vt 0.653782 0.758862 -v 18986.5 10641 3884.7 -vt 0.654613 0.759177 -v 18986.5 11683.5 3847.2 -vt 0.653782 0.767931 -v 18986.5 11646 3884.7 -vt 0.654613 0.767616 -o mesh2675 -s off -f 12927/12927/12927 12928/12928/12928 12929/12929/12929 -f 12930/12930/12930 12929/12929/12929 12928/12928/12928 -g charts -o chart0000 -s off -f 12927/12927/12927 12928/12928/12928 12929/12929/12929 -f 12930/12930/12930 12929/12929/12929 12928/12928/12928 -v 18986.5 10641 3884.7 -vt 0.910117 0.776999 -v 18986.5 10603.5 3847.2 -vt 0.909809 0.777823 -v 18986.5 10603.5 5767.2 -vt 0.925603 0.777823 -o mesh2676 -s off -f 12931/12931/12931 12932/12932/12932 12933/12933/12933 -g charts -o chart0000 -s off -f 12931/12931/12931 12932/12932/12932 12933/12933/12933 -v 18986.5 10641 3884.7 -vt 0.914796 0.963314 -v 18986.5 10603.5 5767.2 -vt 0.929759 0.963314 -v 18986.5 10641 5729.7 -vt 0.929455 0.96249 -o mesh2677 -s off -f 12934/12934/12934 12935/12935/12935 12936/12936/12936 -g charts -o chart0000 -s off -f 12934/12934/12934 12935/12935/12935 12936/12936/12936 -v 18986.5 10641 5729.7 -vt 0.362012 0.924874 -v 18986.5 10603.5 5767.2 -vt 0.362843 0.924567 -v 18986.5 11646 5729.7 -vt 0.362843 0.932811 -o mesh2678 -s off -f 12937/12937/12937 12938/12938/12938 12939/12939/12939 -g charts -o chart0000 -s off -f 12937/12937/12937 12938/12938/12938 12939/12939/12939 -v 18986.5 11683.5 3847.2 -vt 0.130091 0.557708 -v 18986.5 11646 3884.7 -vt 0.12926 0.557402 -v 18986.5 11683.5 5767.2 -vt 0.130091 0.542045 -o mesh2679 -s off -f 12940/12940/12940 12941/12941/12941 12942/12942/12942 -g charts -o chart0000 -s off -f 12940/12940/12940 12941/12941/12941 12942/12942/12942 -v 18986.5 11683.5 5767.2 -vt 0.194098 0.297197 -v 18986.5 11646 3884.7 -vt 0.209061 0.297197 -v 18986.5 11646 5729.7 -vt 0.194402 0.296373 -o mesh2680 -s off -f 12943/12943/12943 12944/12944/12944 12945/12945/12945 -g charts -o chart0000 -s off -f 12943/12943/12943 12944/12944/12944 12945/12945/12945 -v 18986.5 11683.5 5767.2 -vt 0.792602 0.342539 -v 18986.5 11646 5729.7 -vt 0.791771 0.342224 -v 18986.5 10603.5 5767.2 -vt 0.792602 0.333471 -o mesh2681 -s off -f 12946/12946/12946 12947/12947/12947 12948/12948/12948 -g charts -o chart0000 -s off -f 12946/12946/12946 12947/12947/12947 12948/12948/12948 -v 19151.5 11683.5 3847.2 -vt 0.396093 0.658285 -v 19151.5 11646 3884.7 -vt 0.395262 0.65797 -v 19151.5 10603.5 3847.2 -vt 0.396093 0.649217 -v 19151.5 10641 3884.7 -vt 0.395262 0.649532 -o mesh2682 -s off -f 12949/12949/12949 12950/12950/12950 12951/12951/12951 -f 12952/12952/12952 12951/12951/12951 12950/12950/12950 -g charts -o chart0000 -s off -f 12949/12949/12949 12950/12950/12950 12951/12951/12951 -f 12952/12952/12952 12951/12951/12951 12950/12950/12950 -v 19151.5 11646 3884.7 -vt 0.572628 0.433223 -v 19151.5 11683.5 3847.2 -vt 0.572319 0.434048 -v 19151.5 11683.5 5767.2 -vt 0.588113 0.434048 -o mesh2683 -s off -f 12953/12953/12953 12954/12954/12954 12955/12955/12955 -g charts -o chart0000 -s off -f 12953/12953/12953 12954/12954/12954 12955/12955/12955 -v 19151.5 11646 3884.7 -vt 0.624688 0.768755 -v 19151.5 11683.5 5767.2 -vt 0.624688 0.783594 -v 19151.5 11646 5729.7 -vt 0.623857 0.783293 -o mesh2684 -s off -f 12956/12956/12956 12957/12957/12957 12958/12958/12958 -g charts -o chart0000 -s off -f 12956/12956/12956 12957/12957/12957 12958/12958/12958 -v 19151.5 11646 5729.7 -vt 0.620841 0.420033 -v 19151.5 11683.5 5767.2 -vt 0.620532 0.420857 -v 19151.5 10641 5729.7 -vt 0.628844 0.420857 -o mesh2685 -s off -f 12959/12959/12959 12960/12960/12960 12961/12961/12961 -g charts -o chart0000 -s off -f 12959/12959/12959 12960/12960/12960 12961/12961/12961 -v 19151.5 10603.5 3847.2 -vt 0.0793846 0.948475 -v 19151.5 10641 3884.7 -vt 0.0785536 0.948169 -v 19151.5 10603.5 5767.2 -vt 0.0793848 0.932811 -o mesh2686 -s off -f 12962/12962/12962 12963/12963/12963 12964/12964/12964 -g charts -o chart0000 -s off -f 12962/12962/12962 12963/12963/12963 12964/12964/12964 -v 19151.5 10603.5 5767.2 -vt 0.166667 0.612119 -v 19151.5 10641 3884.7 -vt 0.166667 0.626958 -v 19151.5 10641 5729.7 -vt 0.165835 0.61242 -o mesh2687 -s off -f 12965/12965/12965 12966/12966/12966 12967/12967/12967 -g charts -o chart0000 -s off -f 12965/12965/12965 12966/12966/12966 12967/12967/12967 -v 19151.5 10603.5 5767.2 -vt 0.86409 0.00288533 -v 19151.5 10641 5729.7 -vt 0.863772 0.00206101 -v 19151.5 11683.5 5767.2 -vt 0.854946 0.00288533 -o mesh2688 -s off -f 12968/12968/12968 12969/12969/12969 12970/12970/12970 -g charts -o chart0000 -s off -f 12968/12968/12968 12969/12969/12969 12970/12970/12970 -v 18986.5 11683.5 5767.2 -vt 0.0461347 0.970734 -v 18986.5 10603.5 5767.2 -vt 0.0552784 0.970734 -v 19151.5 10603.5 5767.2 -vt 0.0552784 0.972382 -v 19151.5 11683.5 5767.2 -vt 0.0461347 0.972382 -o mesh2689 -s off -f 12971/12971/12971 12972/12972/12972 12973/12973/12973 -f 12971/12971/12971 12973/12973/12973 12974/12974/12974 -g charts -o chart0000 -s off -f 12971/12971/12971 12972/12972/12972 12973/12973/12973 -f 12971/12971/12971 12973/12973/12973 12974/12974/12974 -v 18986.5 10603.5 5767.2 -vt 0.464256 0.669002 -v 18986.5 10603.5 3847.2 -vt 0.464256 0.684666 -v 19151.5 10603.5 3847.2 -vt 0.465918 0.684666 -v 19151.5 10603.5 5767.2 -vt 0.465918 0.669002 -o mesh2690 -s off -f 12975/12975/12975 12976/12976/12976 12977/12977/12977 -f 12975/12975/12975 12977/12977/12977 12978/12978/12978 -g charts -o chart0000 -s off -f 12975/12975/12975 12976/12976/12976 12977/12977/12977 -f 12975/12975/12975 12977/12977/12977 12978/12978/12978 -v 18986.5 10603.5 3847.2 -vt 0.156692 0.298021 -v 18986.5 11683.5 3847.2 -vt 0.147548 0.298021 -v 19151.5 11683.5 3847.2 -vt 0.147548 0.296373 -v 19151.5 10603.5 3847.2 -vt 0.156692 0.296373 -o mesh2691 -s off -f 12979/12979/12979 12980/12980/12980 12981/12981/12981 -f 12979/12979/12979 12981/12981/12981 12982/12982/12982 -g charts -o chart0000 -s off -f 12979/12979/12979 12980/12980/12980 12981/12981/12981 -f 12979/12979/12979 12981/12981/12981 12982/12982/12982 -v 18986.5 11683.5 3847.2 -vt 0.688695 0.750618 -v 18986.5 11683.5 5767.2 -vt 0.672901 0.750618 -v 19151.5 11683.5 5767.2 -vt 0.672901 0.748969 -v 19151.5 11683.5 3847.2 -vt 0.688695 0.748969 -o mesh2692 -s off -f 12983/12983/12983 12984/12984/12984 12985/12985/12985 -f 12983/12983/12983 12985/12985/12985 12986/12986/12986 -g charts -o chart0000 -s off -f 12983/12983/12983 12984/12984/12984 12985/12985/12985 -f 12983/12983/12983 12985/12985/12985 12986/12986/12986 -v 19151.5 11646 3884.7 -vt 0.878221 0.432399 -v 19106.5 11646 3884.7 -vt 0.877768 0.432399 -v 19106.5 10641 3884.7 -vt 0.877768 0.424155 -v 19151.5 10641 3884.7 -vt 0.878221 0.424155 -v 18986.5 11646 3884.7 -vt 0.876559 0.432399 -v 18986.5 10641 3884.7 -vt 0.876559 0.424155 -o mesh2693 -s off -f 12987/12987/12987 12988/12988/12988 12989/12989/12989 -f 12987/12987/12987 12989/12989/12989 12990/12990/12990 -f 12991/12991/12991 12992/12992/12992 12989/12989/12989 -f 12991/12991/12991 12989/12989/12989 12988/12988/12988 -g charts -o chart0000 -s off -f 12987/12987/12987 12988/12988/12988 12989/12989/12989 -f 12987/12987/12987 12989/12989/12989 12990/12990/12990 -f 12991/12991/12991 12992/12992/12992 12989/12989/12989 -f 12991/12991/12991 12989/12989/12989 12988/12988/12988 -v 19151.5 10641 3884.7 -vt 0.77847 0.315334 -v 19106.5 10641 3884.7 -vt 0.77847 0.315784 -v 19106.5 10641 5729.7 -vt 0.763508 0.315784 -v 19151.5 10641 5729.7 -vt 0.763508 0.315334 -v 18986.5 10641 3884.7 -vt 0.77847 0.316983 -v 18986.5 10641 5729.7 -vt 0.763508 0.316983 -o mesh2694 -s off -f 12993/12993/12993 12994/12994/12994 12995/12995/12995 -f 12993/12993/12993 12995/12995/12995 12996/12996/12996 -f 12997/12997/12997 12998/12998/12998 12995/12995/12995 -f 12997/12997/12997 12995/12995/12995 12994/12994/12994 -g charts -o chart0000 -s off -f 12993/12993/12993 12994/12994/12994 12995/12995/12995 -f 12993/12993/12993 12995/12995/12995 12996/12996/12996 -f 12997/12997/12997 12998/12998/12998 12995/12995/12995 -f 12997/12997/12997 12995/12995/12995 12994/12994/12994 -v 19151.5 10641 5729.7 -vt 0.795096 0.683017 -v 19106.5 10641 5729.7 -vt 0.795096 0.683467 -v 19106.5 11646 5729.7 -vt 0.786783 0.683467 -v 19151.5 11646 5729.7 -vt 0.786783 0.683017 -v 18986.5 10641 5729.7 -vt 0.795096 0.684666 -v 18986.5 11646 5729.7 -vt 0.786783 0.684666 -o mesh2695 -s off -f 12999/12999/12999 13000/13000/13000 13001/13001/13001 -f 12999/12999/12999 13001/13001/13001 13002/13002/13002 -f 13003/13003/13003 13004/13004/13004 13001/13001/13001 -f 13003/13003/13003 13001/13001/13001 13000/13000/13000 -g charts -o chart0000 -s off -f 12999/12999/12999 13000/13000/13000 13001/13001/13001 -f 12999/12999/12999 13001/13001/13001 13002/13002/13002 -f 13003/13003/13003 13004/13004/13004 13001/13001/13001 -f 13003/13003/13003 13001/13001/13001 13000/13000/13000 -v 19151.5 11646 5729.7 -vt 0.13591 0.298021 -v 19106.5 11646 5729.7 -vt 0.13591 0.297572 -v 19106.5 11646 3884.7 -vt 0.120948 0.297572 -v 19151.5 11646 3884.7 -vt 0.120948 0.298021 -v 18986.5 11646 5729.7 -vt 0.13591 0.296373 -v 18986.5 11646 3884.7 -vt 0.120948 0.296373 -o mesh2696 -s off -f 13005/13005/13005 13006/13006/13006 13007/13007/13007 -f 13005/13005/13005 13007/13007/13007 13008/13008/13008 -f 13009/13009/13009 13010/13010/13010 13007/13007/13007 -f 13009/13009/13009 13007/13007/13007 13006/13006/13006 -g charts -o chart0000 -s off -f 13005/13005/13005 13006/13006/13006 13007/13007/13007 -f 13005/13005/13005 13007/13007/13007 13008/13008/13008 -f 13009/13009/13009 13010/13010/13010 13007/13007/13007 -f 13009/13009/13009 13007/13007/13007 13006/13006/13006 -v 19106.5 11646 3884.7 -vt 0.391937 0.728359 -v 19106.5 11586 3944.7 -vt 0.391106 0.727867 -v 19106.5 10641 3884.7 -vt 0.391937 0.720115 -v 19106.5 10701 3944.7 -vt 0.391106 0.720608 -o mesh2697 -s off -f 13011/13011/13011 13012/13012/13012 13013/13013/13013 -f 13014/13014/13014 13013/13013/13013 13012/13012/13012 -g charts -o chart0000 -s off -f 13011/13011/13011 13012/13012/13012 13013/13013/13013 -f 13014/13014/13014 13013/13013/13013 13012/13012/13012 -v 19106.5 11586 3944.7 -vt 0.258936 0.901142 -v 19106.5 11646 3884.7 -vt 0.259767 0.90066 -v 19106.5 11646 5729.7 -vt 0.259767 0.915499 -o mesh2698 -s off -f 13015/13015/13015 13016/13016/13016 13017/13017/13017 -g charts -o chart0000 -s off -f 13015/13015/13015 13016/13016/13016 13017/13017/13017 -v 19106.5 11586 3944.7 -vt 0.666251 0.910552 -v 19106.5 11646 5729.7 -vt 0.680382 0.910552 -v 19106.5 11586 5669.7 -vt 0.679892 0.909728 -o mesh2699 -s off -f 13018/13018/13018 13019/13019/13019 13020/13020/13020 -g charts -o chart0000 -s off -f 13018/13018/13018 13019/13019/13019 13020/13020/13020 -v 19106.5 11586 5669.7 -vt 0.0644223 0.977004 -v 19106.5 11646 5729.7 -vt 0.0652535 0.976505 -v 19106.5 10701 5669.7 -vt 0.0652535 0.983924 -o mesh2700 -s off -f 13021/13021/13021 13022/13022/13022 13023/13023/13023 -g charts -o chart0000 -s off -f 13021/13021/13021 13022/13022/13022 13023/13023/13023 -v 19106.5 10641 3884.7 -vt 0.476725 0.94765 -v 19106.5 10701 3944.7 -vt 0.475894 0.947168 -v 19106.5 10641 5729.7 -vt 0.476725 0.932811 -o mesh2701 -s off -f 13024/13024/13024 13025/13025/13025 13026/13026/13026 -g charts -o chart0000 -s off -f 13024/13024/13024 13025/13025/13025 13026/13026/13026 -v 19106.5 10641 5729.7 -vt 0.0818786 0.669827 -v 19106.5 10701 3944.7 -vt 0.0960099 0.669827 -v 19106.5 10701 5669.7 -vt 0.0823691 0.669002 -o mesh2702 -s off -f 13027/13027/13027 13028/13028/13028 13029/13029/13029 -g charts -o chart0000 -s off -f 13027/13027/13027 13028/13028/13028 13029/13029/13029 -v 19106.5 10641 5729.7 -vt 0.179967 0.433223 -v 19106.5 10701 5669.7 -vt 0.17947 0.432399 -v 19106.5 11646 5729.7 -vt 0.171654 0.433223 -o mesh2703 -s off -f 13030/13030/13030 13031/13031/13031 13032/13032/13032 -g charts -o chart0000 -s off -f 13030/13030/13030 13031/13031/13031 13032/13032/13032 -v 18986.5 10701 5669.7 -vt 0.995428 0.0210222 -v 19031.5 11130.4 5669.7 -vt 0.994805 0.0174226 -v 19106.5 10701 5669.7 -vt 0.993766 0.0210222 -v 18986.5 11586 5669.7 -vt 0.995428 0.0136026 -v 19031.5 11156.6 5669.7 -vt 0.994805 0.0172024 -v 19061.5 11156.6 5669.7 -vt 0.994389 0.0172024 -v 19061.5 11130.4 5669.7 -vt 0.994389 0.0174226 -v 19106.5 11586 5669.7 -vt 0.993766 0.0136026 -o mesh2704 -s off -f 13033/13033/13033 13034/13034/13034 13035/13035/13035 -f 13034/13034/13034 13033/13033/13033 13036/13036/13036 -f 13034/13034/13034 13036/13036/13036 13037/13037/13037 -f 13037/13037/13037 13036/13036/13036 13038/13038/13038 -f 13035/13035/13035 13039/13039/13039 13040/13040/13040 -f 13039/13039/13039 13035/13035/13035 13034/13034/13034 -f 13040/13040/13040 13039/13039/13039 13038/13038/13038 -f 13040/13040/13040 13038/13038/13038 13036/13036/13036 -g charts -o chart0000 -s off -f 13033/13033/13033 13034/13034/13034 13035/13035/13035 -f 13034/13034/13034 13033/13033/13033 13036/13036/13036 -f 13034/13034/13034 13036/13036/13036 13037/13037/13037 -f 13037/13037/13037 13036/13036/13036 13038/13038/13038 -f 13035/13035/13035 13039/13039/13039 13040/13040/13040 -f 13039/13039/13039 13035/13035/13035 13034/13034/13034 -f 13040/13040/13040 13039/13039/13039 13038/13038/13038 -f 13040/13040/13040 13038/13038/13038 13036/13036/13036 -v 19106.5 11586 5669.7 -vt 0.966334 0.739901 -v 19061.5 11586 4817.32 -vt 0.959351 0.740519 -v 19106.5 11586 3944.7 -vt 0.952203 0.739901 -v 18986.5 11586 5669.7 -vt 0.966334 0.74155 -v 19031.5 11586 4817.32 -vt 0.959351 0.740932 -v 19031.5 11586 4797.08 -vt 0.959186 0.740932 -v 19061.5 11586 4797.08 -vt 0.959186 0.740519 -v 18986.5 11586 3944.7 -vt 0.952203 0.74155 -o mesh2705 -s off -f 13041/13041/13041 13042/13042/13042 13043/13043/13043 -f 13042/13042/13042 13041/13041/13041 13044/13044/13044 -f 13042/13042/13042 13044/13044/13044 13045/13045/13045 -f 13045/13045/13045 13044/13044/13044 13046/13046/13046 -f 13043/13043/13043 13047/13047/13047 13048/13048/13048 -f 13047/13047/13047 13043/13043/13043 13042/13042/13042 -f 13048/13048/13048 13047/13047/13047 13046/13046/13046 -f 13048/13048/13048 13046/13046/13046 13044/13044/13044 -g charts -o chart0000 -s off -f 13041/13041/13041 13042/13042/13042 13043/13043/13043 -f 13042/13042/13042 13041/13041/13041 13044/13044/13044 -f 13042/13042/13042 13044/13044/13044 13045/13045/13045 -f 13045/13045/13045 13044/13044/13044 13046/13046/13046 -f 13043/13043/13043 13047/13047/13047 13048/13048/13048 -f 13047/13047/13047 13043/13043/13043 13042/13042/13042 -f 13048/13048/13048 13047/13047/13047 13046/13046/13046 -f 13048/13048/13048 13046/13046/13046 13044/13044/13044 -v 19106.5 10701 3944.7 -vt 0.431837 0.293075 -v 19061.5 11130.4 3944.7 -vt 0.432461 0.289475 -v 18986.5 10701 3944.7 -vt 0.433499 0.293075 -v 19106.5 11586 3944.7 -vt 0.431837 0.285655 -v 19061.5 11156.6 3944.7 -vt 0.432461 0.289255 -v 19031.5 11156.6 3944.7 -vt 0.432876 0.289255 -v 19031.5 11130.4 3944.7 -vt 0.432876 0.289475 -v 18986.5 11586 3944.7 -vt 0.433499 0.285655 -o mesh2706 -s off -f 13049/13049/13049 13050/13050/13050 13051/13051/13051 -f 13050/13050/13050 13049/13049/13049 13052/13052/13052 -f 13050/13050/13050 13052/13052/13052 13053/13053/13053 -f 13053/13053/13053 13052/13052/13052 13054/13054/13054 -f 13051/13051/13051 13055/13055/13055 13056/13056/13056 -f 13055/13055/13055 13051/13051/13051 13050/13050/13050 -f 13056/13056/13056 13055/13055/13055 13054/13054/13054 -f 13056/13056/13056 13054/13054/13054 13052/13052/13052 -g charts -o chart0000 -s off -f 13049/13049/13049 13050/13050/13050 13051/13051/13051 -f 13050/13050/13050 13049/13049/13049 13052/13052/13052 -f 13050/13050/13050 13052/13052/13052 13053/13053/13053 -f 13053/13053/13053 13052/13052/13052 13054/13054/13054 -f 13051/13051/13051 13055/13055/13055 13056/13056/13056 -f 13055/13055/13055 13051/13051/13051 13050/13050/13050 -f 13056/13056/13056 13055/13055/13055 13054/13054/13054 -f 13056/13056/13056 13054/13054/13054 13052/13052/13052 -v 18986.5 10701 3944.7 -vt 0.726933 0.599753 -v 18986.5 10701 5669.7 -vt 0.712801 0.599753 -v 19106.5 10701 5669.7 -vt 0.712801 0.598104 -v 19106.5 10701 3944.7 -vt 0.726933 0.598104 -o mesh2707 -s off -f 13057/13057/13057 13058/13058/13058 13059/13059/13059 -f 13057/13057/13057 13059/13059/13059 13060/13060/13060 -g charts -o chart0000 -s off -f 13057/13057/13057 13058/13058/13058 13059/13059/13059 -f 13057/13057/13057 13059/13059/13059 13060/13060/13060 -v 19031.5 11130.4 5669.7 -vt 0.0286782 0.478565 -v 19031.5 11156.6 5669.7 -vt 0.0286782 0.477741 -v 19031.5 11156.6 3944.7 -vt 0.014547 0.477741 -v 19031.5 11130.4 3944.7 -vt 0.014547 0.478565 -o mesh2708 -s off -f 13061/13061/13061 13062/13062/13062 13063/13063/13063 -f 13061/13061/13061 13063/13063/13063 13064/13064/13064 -g charts -o chart0000 -s off -f 13061/13061/13061 13062/13062/13062 13063/13063/13063 -f 13061/13061/13061 13063/13063/13063 13064/13064/13064 -v 19031.5 11156.6 5669.7 -vt 0.357024 0.476092 -v 19061.5 11156.6 5669.7 -vt 0.356193 0.476092 -v 19061.5 11156.6 3944.7 -vt 0.356193 0.462077 -v 19031.5 11156.6 3944.7 -vt 0.357024 0.462077 -o mesh2709 -s off -f 13065/13065/13065 13066/13066/13066 13067/13067/13067 -f 13065/13065/13065 13067/13067/13067 13068/13068/13068 -g charts -o chart0000 -s off -f 13065/13065/13065 13066/13066/13066 13067/13067/13067 -f 13065/13065/13065 13067/13067/13067 13068/13068/13068 -v 19061.5 10721.3 4817.32 -vt 0.255611 0.997115 -v 19031.5 10721.3 4817.32 -vt 0.255611 0.997939 -v 19031.5 10721.3 4797.08 -vt 0.256442 0.997939 -v 19061.5 10721.3 4797.08 -vt 0.256442 0.997115 -o mesh2710 -s off -f 13069/13069/13069 13070/13070/13070 13071/13071/13071 -f 13069/13069/13069 13071/13071/13071 13072/13072/13072 -g charts -o chart0000 -s off -f 13069/13069/13069 13070/13070/13070 13071/13071/13071 -f 13069/13069/13069 13071/13071/13071 13072/13072/13072 -v 19061.5 11586 4817.32 -vt 0.68537 0.916323 -v 19031.5 11586 4817.32 -vt 0.68537 0.915499 -v 19031.5 10721.3 4817.32 -vt 0.677889 0.915499 -v 19061.5 10721.3 4817.32 -vt 0.677889 0.916323 -o mesh2711 -s off -f 13073/13073/13073 13074/13074/13074 13075/13075/13075 -f 13073/13073/13073 13075/13075/13075 13076/13076/13076 -g charts -o chart0000 -s off -f 13073/13073/13073 13074/13074/13074 13075/13075/13075 -f 13073/13073/13073 13075/13075/13075 13076/13076/13076 -v 19031.5 11586 4817.32 -vt 0.17581 0.63108 -v 19031.5 11586 4797.08 -vt 0.174979 0.63108 -v 19031.5 10721.3 4797.08 -vt 0.174979 0.62366 -v 19031.5 10721.3 4817.32 -vt 0.17581 0.62366 -o mesh2712 -s off -f 13077/13077/13077 13078/13078/13078 13079/13079/13079 -f 13077/13077/13077 13079/13079/13079 13080/13080/13080 -g charts -o chart0000 -s off -f 13077/13077/13077 13078/13078/13078 13079/13079/13079 -f 13077/13077/13077 13079/13079/13079 13080/13080/13080 -v 19031.5 11586 4797.08 -vt 0.958022 0.0614179 -v 19061.5 11586 4797.08 -vt 0.958022 0.0605936 -v 19061.5 10721.3 4797.08 -vt 0.95054 0.0605936 -v 19031.5 10721.3 4797.08 -vt 0.95054 0.0614179 -o mesh2713 -s off -f 13081/13081/13081 13082/13082/13082 13083/13083/13083 -f 13081/13081/13081 13083/13083/13083 13084/13084/13084 -g charts -o chart0000 -s off -f 13081/13081/13081 13082/13082/13082 13083/13083/13083 -f 13081/13081/13081 13083/13083/13083 13084/13084/13084 -v 19061.5 11586 4797.08 -vt 0.444306 0.250206 -v 19061.5 11586 4817.32 -vt 0.443475 0.250206 -v 19061.5 10721.3 4817.32 -vt 0.443475 0.242786 -v 19061.5 10721.3 4797.08 -vt 0.444306 0.242786 -o mesh2714 -s off -f 13085/13085/13085 13086/13086/13086 13087/13087/13087 -f 13085/13085/13085 13087/13087/13087 13088/13088/13088 -g charts -o chart0000 -s off -f 13085/13085/13085 13086/13086/13086 13087/13087/13087 -f 13085/13085/13085 13087/13087/13087 13088/13088/13088 -v 19061.5 11130.4 5669.7 -vt 0.927265 0.248557 -v 19031.5 11130.4 5669.7 -vt 0.927265 0.247733 -v 19031.5 11130.4 3944.7 -vt 0.913134 0.247733 -v 19061.5 11130.4 3944.7 -vt 0.913134 0.248557 -o mesh2715 -s off -f 13089/13089/13089 13090/13090/13090 13091/13091/13091 -f 13089/13089/13089 13091/13091/13091 13092/13092/13092 -g charts -o chart0000 -s off -f 13089/13089/13089 13090/13090/13090 13091/13091/13091 -f 13089/13089/13089 13091/13091/13091 13092/13092/13092 -v 19061.5 11156.6 5669.7 -vt 0.0544471 0.385408 -v 19061.5 11130.4 5669.7 -vt 0.0544471 0.384584 -v 19061.5 11130.4 3944.7 -vt 0.0403159 0.384584 -v 19061.5 11156.6 3944.7 -vt 0.0403159 0.385408 -o mesh2716 -s off -f 13093/13093/13093 13094/13094/13094 13095/13095/13095 -f 13093/13093/13093 13095/13095/13095 13096/13096/13096 -g charts -o chart0000 -s off -f 13093/13093/13093 13094/13094/13094 13095/13095/13095 -f 13093/13093/13093 13095/13095/13095 13096/13096/13096 -v 15236.5 24861 3899.7 -vt 0.98379 0.211459 -v 15199 24861 3937.2 -vt 0.983473 0.210635 -v 14156.5 24861 3899.7 -vt 0.974647 0.211459 -v 14194 24861 3937.2 -vt 0.974964 0.210635 -o mesh2717 -s off -f 13097/13097/13097 13098/13098/13098 13099/13099/13099 -f 13100/13100/13100 13099/13099/13099 13098/13098/13098 -g charts -o chart0000 -s off -f 13097/13097/13097 13098/13098/13098 13099/13099/13099 -f 13100/13100/13100 13099/13099/13099 13098/13098/13098 -v 15199 24861 3937.2 -vt 0.443475 0.222482 -v 15236.5 24861 3899.7 -vt 0.444306 0.222176 -v 15236.5 24861 5819.7 -vt 0.444306 0.23784 -o mesh2718 -s off -f 13101/13101/13101 13102/13102/13102 13103/13103/13103 -g charts -o chart0000 -s off -f 13101/13101/13101 13102/13102/13102 13103/13103/13103 -v 15199 24861 3937.2 -vt 0.11596 0.921269 -v 15236.5 24861 5819.7 -vt 0.130923 0.921269 -v 15199 24861 5782.2 -vt 0.130619 0.920445 -o mesh2719 -s off -f 13104/13104/13104 13105/13105/13105 13106/13106/13106 -g charts -o chart0000 -s off -f 13104/13104/13104 13105/13105/13105 13106/13106/13106 -v 15199 24861 5782.2 -vt 0.69202 0.311519 -v 15236.5 24861 5819.7 -vt 0.692851 0.311212 -v 14194 24861 5782.2 -vt 0.692851 0.319456 -o mesh2720 -s off -f 13107/13107/13107 13108/13108/13108 13109/13109/13109 -g charts -o chart0000 -s off -f 13107/13107/13107 13108/13108/13108 13109/13109/13109 -v 14156.5 24861 3899.7 -vt 0.918953 0.269992 -v 14194 24861 3937.2 -vt 0.918121 0.269686 -v 14156.5 24861 5819.7 -vt 0.918953 0.254328 -o mesh2721 -s off -f 13110/13110/13110 13111/13111/13111 13112/13112/13112 -g charts -o chart0000 -s off -f 13110/13110/13110 13111/13111/13111 13112/13112/13112 -v 14156.5 24861 5819.7 -vt 0.984622 0.91385 -v 14194 24861 3937.2 -vt 0.999584 0.91385 -v 14194 24861 5782.2 -vt 0.984926 0.913026 -o mesh2722 -s off -f 13113/13113/13113 13114/13114/13114 13115/13115/13115 -g charts -o chart0000 -s off -f 13113/13113/13113 13114/13114/13114 13115/13115/13115 -v 14156.5 24861 5819.7 -vt 0.495844 0.999588 -v 14194 24861 5782.2 -vt 0.495526 0.998763 -v 15236.5 24861 5819.7 -vt 0.4867 0.999588 -o mesh2723 -s off -f 13116/13116/13116 13117/13117/13117 13118/13118/13118 -g charts -o chart0000 -s off -f 13116/13116/13116 13117/13117/13117 13118/13118/13118 -v 14156.5 25026 3899.7 -vt 0.780133 0.289777 -v 14194 25026 3937.2 -vt 0.780964 0.290092 -v 15236.5 25026 3899.7 -vt 0.780133 0.298846 -v 15199 25026 3937.2 -vt 0.780964 0.298531 -o mesh2724 -s off -f 13119/13119/13119 13120/13120/13120 13121/13121/13121 -f 13122/13122/13122 13121/13121/13121 13120/13120/13120 -g charts -o chart0000 -s off -f 13119/13119/13119 13120/13120/13120 13121/13121/13121 -f 13122/13122/13122 13121/13121/13121 13120/13120/13120 -v 14194 25026 3937.2 -vt 0.917599 0.870981 -v 14156.5 25026 3899.7 -vt 0.91729 0.871805 -v 14156.5 25026 5819.7 -vt 0.933084 0.871805 -o mesh2725 -s off -f 13123/13123/13123 13124/13124/13124 13125/13125/13125 -g charts -o chart0000 -s off -f 13123/13123/13123 13124/13124/13124 13125/13125/13125 -v 14194 25026 3937.2 -vt 0.662095 0.615416 -v 14156.5 25026 5819.7 -vt 0.662095 0.630255 -v 14194 25026 5782.2 -vt 0.661264 0.629954 -o mesh2726 -s off -f 13126/13126/13126 13127/13127/13127 13128/13128/13128 -g charts -o chart0000 -s off -f 13126/13126/13126 13127/13127/13127 13128/13128/13128 -v 14194 25026 5782.2 -vt 0.832811 0.073784 -v 14156.5 25026 5819.7 -vt 0.832502 0.0746083 -v 15199 25026 5782.2 -vt 0.840815 0.0746083 -o mesh2727 -s off -f 13129/13129/13129 13130/13130/13130 13131/13131/13131 -g charts -o chart0000 -s off -f 13129/13129/13129 13130/13130/13130 13131/13131/13131 -v 15236.5 25026 3899.7 -vt 0.842477 0.337593 -v 15199 25026 3937.2 -vt 0.841646 0.337287 -v 15236.5 25026 5819.7 -vt 0.842477 0.321929 -o mesh2728 -s off -f 13132/13132/13132 13133/13133/13133 13134/13134/13134 -g charts -o chart0000 -s off -f 13132/13132/13132 13133/13133/13133 13134/13134/13134 -v 15236.5 25026 5819.7 -vt 0.213217 0.757213 -v 15199 25026 3937.2 -vt 0.228179 0.757213 -v 15199 25026 5782.2 -vt 0.213521 0.756389 -o mesh2729 -s off -f 13135/13135/13135 13136/13136/13136 13137/13137/13137 -g charts -o chart0000 -s off -f 13135/13135/13135 13136/13136/13136 13137/13137/13137 -v 15236.5 25026 5819.7 -vt 0.913965 0.898186 -v 15199 25026 5782.2 -vt 0.913134 0.897871 -v 14156.5 25026 5819.7 -vt 0.913965 0.889118 -o mesh2730 -s off -f 13138/13138/13138 13139/13139/13139 13140/13140/13140 -g charts -o chart0000 -s off -f 13138/13138/13138 13139/13139/13139 13140/13140/13140 -v 14156.5 24861 5819.7 -vt 0.655445 0.999588 -v 15236.5 24861 5819.7 -vt 0.646301 0.999588 -v 15236.5 25026 5819.7 -vt 0.646301 0.997939 -v 14156.5 25026 5819.7 -vt 0.655445 0.997939 -o mesh2731 -s off -f 13141/13141/13141 13142/13142/13142 13143/13143/13143 -f 13141/13141/13141 13143/13143/13143 13144/13144/13144 -g charts -o chart0000 -s off -f 13141/13141/13141 13142/13142/13142 13143/13143/13143 -f 13141/13141/13141 13143/13143/13143 13144/13144/13144 -v 15236.5 24861 5819.7 -vt 0.237323 0.499176 -v 15236.5 24861 3899.7 -vt 0.253117 0.499176 -v 15236.5 25026 3899.7 -vt 0.253117 0.500824 -v 15236.5 25026 5819.7 -vt 0.237323 0.500824 -o mesh2732 -s off -f 13145/13145/13145 13146/13146/13146 13147/13147/13147 -f 13145/13145/13145 13147/13147/13147 13148/13148/13148 -g charts -o chart0000 -s off -f 13145/13145/13145 13146/13146/13146 13147/13147/13147 -f 13145/13145/13145 13147/13147/13147 13148/13148/13148 -v 15236.5 24861 3899.7 -vt 0.0261845 0.367271 -v 14156.5 24861 3899.7 -vt 0.0261845 0.37634 -v 14156.5 25026 3899.7 -vt 0.027847 0.37634 -v 15236.5 25026 3899.7 -vt 0.027847 0.367271 -o mesh2733 -s off -f 13149/13149/13149 13150/13150/13150 13151/13151/13151 -f 13149/13149/13149 13151/13151/13151 13152/13152/13152 -g charts -o chart0000 -s off -f 13149/13149/13149 13150/13150/13150 13151/13151/13151 -f 13149/13149/13149 13151/13151/13151 13152/13152/13152 -v 14156.5 24861 3899.7 -vt 0.144223 0.914674 -v 14156.5 24861 5819.7 -vt 0.128429 0.914674 -v 14156.5 25026 5819.7 -vt 0.128429 0.913026 -v 14156.5 25026 3899.7 -vt 0.144223 0.913026 -o mesh2734 -s off -f 13153/13153/13153 13154/13154/13154 13155/13155/13155 -f 13153/13153/13153 13155/13155/13155 13156/13156/13156 -g charts -o chart0000 -s off -f 13153/13153/13153 13154/13154/13154 13155/13155/13155 -f 13153/13153/13153 13155/13155/13155 13156/13156/13156 -v 14194 25026 3937.2 -vt 0.253117 0.539571 -v 14194 24981 3937.2 -vt 0.253571 0.539571 -v 15199 24981 3937.2 -vt 0.253571 0.531327 -v 15199 25026 3937.2 -vt 0.253117 0.531327 -v 14194 24861 3937.2 -vt 0.25478 0.539571 -v 15199 24861 3937.2 -vt 0.25478 0.531327 -o mesh2735 -s off -f 13157/13157/13157 13158/13158/13158 13159/13159/13159 -f 13157/13157/13157 13159/13159/13159 13160/13160/13160 -f 13161/13161/13161 13162/13162/13162 13159/13159/13159 -f 13161/13161/13161 13159/13159/13159 13158/13158/13158 -g charts -o chart0000 -s off -f 13157/13157/13157 13158/13158/13158 13159/13159/13159 -f 13157/13157/13157 13159/13159/13159 13160/13160/13160 -f 13161/13161/13161 13162/13162/13162 13159/13159/13159 -f 13161/13161/13161 13159/13159/13159 13158/13158/13158 -v 15199 25026 3937.2 -vt 0.916459 0.0292663 -v 15199 24981 3937.2 -vt 0.916459 0.0297159 -v 15199 24981 5782.2 -vt 0.901496 0.0297159 -v 15199 25026 5782.2 -vt 0.901496 0.0292663 -v 15199 24861 3937.2 -vt 0.916459 0.030915 -v 15199 24861 5782.2 -vt 0.901496 0.030915 -o mesh2736 -s off -f 13163/13163/13163 13164/13164/13164 13165/13165/13165 -f 13163/13163/13163 13165/13165/13165 13166/13166/13166 -f 13167/13167/13167 13168/13168/13168 13165/13165/13165 -f 13167/13167/13167 13165/13165/13165 13164/13164/13164 -g charts -o chart0000 -s off -f 13163/13163/13163 13164/13164/13164 13165/13165/13165 -f 13163/13163/13163 13165/13165/13165 13166/13166/13166 -f 13167/13167/13167 13168/13168/13168 13165/13165/13165 -f 13167/13167/13167 13165/13165/13165 13164/13164/13164 -v 15199 25026 5782.2 -vt 0.287199 0.415086 -v 15199 24981 5782.2 -vt 0.287199 0.414637 -v 14194 24981 5782.2 -vt 0.278886 0.414637 -v 14194 25026 5782.2 -vt 0.278886 0.415086 -v 15199 24861 5782.2 -vt 0.287199 0.413438 -v 14194 24861 5782.2 -vt 0.278886 0.413438 -o mesh2737 -s off -f 13169/13169/13169 13170/13170/13170 13171/13171/13171 -f 13169/13169/13169 13171/13171/13171 13172/13172/13172 -f 13173/13173/13173 13174/13174/13174 13171/13171/13171 -f 13173/13173/13173 13171/13171/13171 13170/13170/13170 -g charts -o chart0000 -s off -f 13169/13169/13169 13170/13170/13170 13171/13171/13171 -f 13169/13169/13169 13171/13171/13171 13172/13172/13172 -f 13173/13173/13173 13174/13174/13174 13171/13171/13171 -f 13173/13173/13173 13171/13171/13171 13170/13170/13170 -v 14194 25026 5782.2 -vt 0.895677 0.630255 -v 14194 24981 5782.2 -vt 0.895677 0.629806 -v 14194 24981 3937.2 -vt 0.880715 0.629806 -v 14194 25026 3937.2 -vt 0.880715 0.630255 -v 14194 24861 5782.2 -vt 0.895677 0.628607 -v 14194 24861 3937.2 -vt 0.880715 0.628607 -o mesh2738 -s off -f 13175/13175/13175 13176/13176/13176 13177/13177/13177 -f 13175/13175/13175 13177/13177/13177 13178/13178/13178 -f 13179/13179/13179 13180/13180/13180 13177/13177/13177 -f 13179/13179/13179 13177/13177/13177 13176/13176/13176 -g charts -o chart0000 -s off -f 13175/13175/13175 13176/13176/13176 13177/13177/13177 -f 13175/13175/13175 13177/13177/13177 13178/13178/13178 -f 13179/13179/13179 13180/13180/13180 13177/13177/13177 -f 13179/13179/13179 13177/13177/13177 13176/13176/13176 -v 14194 24981 3937.2 -vt 0.505819 0.699505 -v 14254 24981 3997.2 -vt 0.506315 0.70033 -v 15199 24981 3937.2 -vt 0.514131 0.699505 -v 15139 24981 3997.2 -vt 0.513635 0.70033 -o mesh2739 -s off -f 13181/13181/13181 13182/13182/13182 13183/13183/13183 -f 13184/13184/13184 13183/13183/13183 13182/13182/13182 -g charts -o chart0000 -s off -f 13181/13181/13181 13182/13182/13182 13183/13183/13183 -f 13184/13184/13184 13183/13183/13183 13182/13182/13182 -v 14254 24981 3997.2 -vt 0.261916 0.931162 -v 14194 24981 3937.2 -vt 0.26143 0.931987 -v 14194 24981 5782.2 -vt 0.276392 0.931987 -o mesh2740 -s off -f 13185/13185/13185 13186/13186/13186 13187/13187/13187 -g charts -o chart0000 -s off -f 13185/13185/13185 13186/13186/13186 13187/13187/13187 -v 14254 24981 3997.2 -vt 0.714464 0.321105 -v 14194 24981 5782.2 -vt 0.714464 0.335119 -v 14254 24981 5722.2 -vt 0.713633 0.334633 -o mesh2741 -s off -f 13188/13188/13188 13189/13189/13189 13190/13190/13190 -g charts -o chart0000 -s off -f 13188/13188/13188 13189/13189/13189 13190/13190/13190 -v 14254 24981 5722.2 -vt 0.0768911 0.877251 -v 14194 24981 5782.2 -vt 0.0777222 0.876752 -v 15139 24981 5722.2 -vt 0.0777223 0.884171 -o mesh2742 -s off -f 13191/13191/13191 13192/13192/13192 13193/13193/13193 -g charts -o chart0000 -s off -f 13191/13191/13191 13192/13192/13192 13193/13193/13193 -v 15199 24981 3937.2 -vt 0.584788 0.305441 -v 15139 24981 3997.2 -vt 0.584301 0.304617 -v 15199 24981 5782.2 -vt 0.569825 0.305441 -o mesh2743 -s off -f 13194/13194/13194 13195/13195/13195 13196/13196/13196 -g charts -o chart0000 -s off -f 13194/13194/13194 13195/13195/13195 13196/13196/13196 -v 15199 24981 5782.2 -vt 0.677889 0.908903 -v 15139 24981 3997.2 -vt 0.69202 0.908903 -v 15139 24981 5722.2 -vt 0.678379 0.908079 -o mesh2744 -s off -f 13197/13197/13197 13198/13198/13198 13199/13199/13199 -g charts -o chart0000 -s off -f 13197/13197/13197 13198/13198/13198 13199/13199/13199 -v 15199 24981 5782.2 -vt 0.179967 0.894889 -v 15139 24981 5722.2 -vt 0.179136 0.894396 -v 14194 24981 5782.2 -vt 0.179967 0.886645 -o mesh2745 -s off -f 13200/13200/13200 13201/13201/13201 13202/13202/13202 -g charts -o chart0000 -s off -f 13200/13200/13200 13201/13201/13201 13202/13202/13202 -v 15139 24861 5722.2 -vt 0.947215 0.933636 -v 14709.6 24906 5722.2 -vt 0.943586 0.933017 -v 15139 24981 5722.2 -vt 0.947215 0.931987 -v 14254 24861 5722.2 -vt 0.939734 0.933636 -v 14683.4 24906 5722.2 -vt 0.943364 0.933017 -v 14683.4 24936 5722.2 -vt 0.943364 0.932605 -v 14709.6 24936 5722.2 -vt 0.943586 0.932605 -v 14254 24981 5722.2 -vt 0.939734 0.931987 -o mesh2746 -s off -f 13203/13203/13203 13204/13204/13204 13205/13205/13205 -f 13204/13204/13204 13203/13203/13203 13206/13206/13206 -f 13204/13204/13204 13206/13206/13206 13207/13207/13207 -f 13207/13207/13207 13206/13206/13206 13208/13208/13208 -f 13205/13205/13205 13209/13209/13209 13210/13210/13210 -f 13209/13209/13209 13205/13205/13205 13204/13204/13204 -f 13210/13210/13210 13209/13209/13209 13208/13208/13208 -f 13210/13210/13210 13208/13208/13208 13206/13206/13206 -g charts -o chart0000 -s off -f 13203/13203/13203 13204/13204/13204 13205/13205/13205 -f 13204/13204/13204 13203/13203/13203 13206/13206/13206 -f 13204/13204/13204 13206/13206/13206 13207/13207/13207 -f 13207/13207/13207 13206/13206/13206 13208/13208/13208 -f 13205/13205/13205 13209/13209/13209 13210/13210/13210 -f 13209/13209/13209 13205/13205/13205 13204/13204/13204 -f 13210/13210/13210 13209/13209/13209 13208/13208/13208 -f 13210/13210/13210 13208/13208/13208 13206/13206/13206 -v 14254 24981 5722.2 -vt 0.840815 0.385408 -v 14254 24936 4869.82 -vt 0.841438 0.378483 -v 14254 24981 3997.2 -vt 0.840815 0.371393 -v 14254 24861 5722.2 -vt 0.842477 0.385408 -v 14254 24906 4869.82 -vt 0.841854 0.378483 -v 14254 24906 4849.58 -vt 0.841854 0.378318 -v 14254 24936 4849.58 -vt 0.841438 0.378318 -v 14254 24861 3997.2 -vt 0.842477 0.371393 -o mesh2747 -s off -f 13211/13211/13211 13212/13212/13212 13213/13213/13213 -f 13212/13212/13212 13211/13211/13211 13214/13214/13214 -f 13212/13212/13212 13214/13214/13214 13215/13215/13215 -f 13215/13215/13215 13214/13214/13214 13216/13216/13216 -f 13213/13213/13213 13217/13217/13217 13218/13218/13218 -f 13217/13217/13217 13213/13213/13213 13212/13212/13212 -f 13218/13218/13218 13217/13217/13217 13216/13216/13216 -f 13218/13218/13218 13216/13216/13216 13214/13214/13214 -g charts -o chart0000 -s off -f 13211/13211/13211 13212/13212/13212 13213/13213/13213 -f 13212/13212/13212 13211/13211/13211 13214/13214/13214 -f 13212/13212/13212 13214/13214/13214 13215/13215/13215 -f 13215/13215/13215 13214/13214/13214 13216/13216/13216 -f 13213/13213/13213 13217/13217/13217 13218/13218/13218 -f 13217/13217/13217 13213/13213/13213 13212/13212/13212 -f 13218/13218/13218 13217/13217/13217 13216/13216/13216 -f 13218/13218/13218 13216/13216/13216 13214/13214/13214 -v 15139 24981 3997.2 -vt 0.830839 0.00535861 -v 14709.6 24936 3997.2 -vt 0.82721 0.00597689 -v 15139 24861 3997.2 -vt 0.830839 0.00700734 -v 14254 24981 3997.2 -vt 0.823358 0.00535861 -v 14683.4 24936 3997.2 -vt 0.826988 0.00597689 -v 14683.4 24906 3997.2 -vt 0.826988 0.00638907 -v 14709.6 24906 3997.2 -vt 0.82721 0.00638907 -v 14254 24861 3997.2 -vt 0.823358 0.00700734 -o mesh2748 -s off -f 13219/13219/13219 13220/13220/13220 13221/13221/13221 -f 13220/13220/13220 13219/13219/13219 13222/13222/13222 -f 13220/13220/13220 13222/13222/13222 13223/13223/13223 -f 13223/13223/13223 13222/13222/13222 13224/13224/13224 -f 13221/13221/13221 13225/13225/13225 13226/13226/13226 -f 13225/13225/13225 13221/13221/13221 13220/13220/13220 -f 13226/13226/13226 13225/13225/13225 13224/13224/13224 -f 13226/13226/13226 13224/13224/13224 13222/13222/13222 -g charts -o chart0000 -s off -f 13219/13219/13219 13220/13220/13220 13221/13221/13221 -f 13220/13220/13220 13219/13219/13219 13222/13222/13222 -f 13220/13220/13220 13222/13222/13222 13223/13223/13223 -f 13223/13223/13223 13222/13222/13222 13224/13224/13224 -f 13221/13221/13221 13225/13225/13225 13226/13226/13226 -f 13225/13225/13225 13221/13221/13221 13220/13220/13220 -f 13226/13226/13226 13225/13225/13225 13224/13224/13224 -f 13226/13226/13226 13224/13224/13224 13222/13222/13222 -v 15139 24861 3997.2 -vt 0.874065 0.0746083 -v 15139 24861 5722.2 -vt 0.874065 0.0605936 -v 15139 24981 5722.2 -vt 0.872402 0.0605936 -v 15139 24981 3997.2 -vt 0.872402 0.0746083 -o mesh2749 -s off -f 13227/13227/13227 13228/13228/13228 13229/13229/13229 -f 13227/13227/13227 13229/13229/13229 13230/13230/13230 -g charts -o chart0000 -s off -f 13227/13227/13227 13228/13228/13228 13229/13229/13229 -f 13227/13227/13227 13229/13229/13229 13230/13230/13230 -v 14709.6 24906 5722.2 -vt 0.864921 0.630255 -v 14683.4 24906 5722.2 -vt 0.864921 0.629431 -v 14683.4 24906 3997.2 -vt 0.85079 0.629431 -v 14709.6 24906 3997.2 -vt 0.85079 0.630255 -o mesh2750 -s off -f 13231/13231/13231 13232/13232/13232 13233/13233/13233 -f 13231/13231/13231 13233/13233/13233 13234/13234/13234 -g charts -o chart0000 -s off -f 13231/13231/13231 13232/13232/13232 13233/13233/13233 -f 13231/13231/13231 13233/13233/13233 13234/13234/13234 -v 14683.4 24906 5722.2 -vt 0.277224 0.484336 -v 14683.4 24936 5722.2 -vt 0.277224 0.483512 -v 14683.4 24936 3997.2 -vt 0.263092 0.483512 -v 14683.4 24906 3997.2 -vt 0.263092 0.484336 -o mesh2751 -s off -f 13235/13235/13235 13236/13236/13236 13237/13237/13237 -f 13235/13235/13235 13237/13237/13237 13238/13238/13238 -g charts -o chart0000 -s off -f 13235/13235/13235 13236/13236/13236 13237/13237/13237 -f 13235/13235/13235 13237/13237/13237 13238/13238/13238 -v 15118.6 24936 4869.82 -vt 0.525769 0.546167 -v 15118.6 24906 4869.82 -vt 0.525769 0.546991 -v 15118.6 24906 4849.58 -vt 0.5266 0.546991 -v 15118.6 24936 4849.58 -vt 0.5266 0.546167 -o mesh2752 -s off -f 13239/13239/13239 13240/13240/13240 13241/13241/13241 -f 13239/13239/13239 13241/13241/13241 13242/13242/13242 -g charts -o chart0000 -s off -f 13239/13239/13239 13240/13240/13240 13241/13241/13241 -f 13239/13239/13239 13241/13241/13241 13242/13242/13242 -v 14254 24936 4869.82 -vt 0.822527 0.531327 -v 14254 24906 4869.82 -vt 0.822527 0.532152 -v 15118.6 24906 4869.82 -vt 0.815046 0.532152 -v 15118.6 24936 4869.82 -vt 0.815046 0.531327 -o mesh2753 -s off -f 13243/13243/13243 13244/13244/13244 13245/13245/13245 -f 13243/13243/13243 13245/13245/13245 13246/13246/13246 -g charts -o chart0000 -s off -f 13243/13243/13243 13244/13244/13244 13245/13245/13245 -f 13243/13243/13243 13245/13245/13245 13246/13246/13246 -v 14254 24906 4869.82 -vt 0.663757 0.47197 -v 14254 24906 4849.58 -vt 0.663757 0.472795 -v 15118.6 24906 4849.58 -vt 0.656276 0.472795 -v 15118.6 24906 4869.82 -vt 0.656276 0.47197 -o mesh2754 -s off -f 13247/13247/13247 13248/13248/13248 13249/13249/13249 -f 13247/13247/13247 13249/13249/13249 13250/13250/13250 -g charts -o chart0000 -s off -f 13247/13247/13247 13248/13248/13248 13249/13249/13249 -f 13247/13247/13247 13249/13249/13249 13250/13250/13250 -v 14254 24906 4849.58 -vt 0.0735661 0.889942 -v 14254 24936 4849.58 -vt 0.0743973 0.889942 -v 15118.6 24936 4849.58 -vt 0.0743973 0.882523 -v 15118.6 24906 4849.58 -vt 0.0735661 0.882523 -o mesh2755 -s off -f 13251/13251/13251 13252/13252/13252 13253/13253/13253 -f 13251/13251/13251 13253/13253/13253 13254/13254/13254 -g charts -o chart0000 -s off -f 13251/13251/13251 13252/13252/13252 13253/13253/13253 -f 13251/13251/13251 13253/13253/13253 13254/13254/13254 -v 14254 24936 4849.58 -vt 0.00789692 0.566777 -v 14254 24936 4869.82 -vt 0.0087281 0.566777 -v 15118.6 24936 4869.82 -vt 0.0087281 0.559357 -v 15118.6 24936 4849.58 -vt 0.00789692 0.559357 -o mesh2756 -s off -f 13255/13255/13255 13256/13256/13256 13257/13257/13257 -f 13255/13255/13255 13257/13257/13257 13258/13258/13258 -g charts -o chart0000 -s off -f 13255/13255/13255 13256/13256/13256 13257/13257/13257 -f 13255/13255/13255 13257/13257/13257 13258/13258/13258 -v 14709.6 24936 5722.2 -vt 0.258936 0.946826 -v 14709.6 24906 5722.2 -vt 0.258936 0.946002 -v 14709.6 24906 3997.2 -vt 0.244805 0.946002 -v 14709.6 24936 3997.2 -vt 0.244805 0.946826 -o mesh2757 -s off -f 13259/13259/13259 13260/13260/13260 13261/13261/13261 -f 13259/13259/13259 13261/13261/13261 13262/13262/13262 -g charts -o chart0000 -s off -f 13259/13259/13259 13260/13260/13260 13261/13261/13261 -f 13259/13259/13259 13261/13261/13261 13262/13262/13262 -v 14683.4 24936 5722.2 -vt 0.26808 0.427453 -v 14709.6 24936 5722.2 -vt 0.26808 0.426628 -v 14709.6 24936 3997.2 -vt 0.253948 0.426628 -v 14683.4 24936 3997.2 -vt 0.253948 0.427453 -o mesh2758 -s off -f 13263/13263/13263 13264/13264/13264 13265/13265/13265 -f 13263/13263/13263 13265/13265/13265 13266/13266/13266 -g charts -o chart0000 -s off -f 13263/13263/13263 13264/13264/13264 13265/13265/13265 -f 13263/13263/13263 13265/13265/13265 13266/13266/13266 -v 12986.5 24861 3899.7 -vt 0.290524 0.794312 -v 12949 24861 3937.2 -vt 0.290206 0.793487 -v 11906.5 24861 3899.7 -vt 0.28138 0.794312 -v 11944 24861 3937.2 -vt 0.281697 0.793487 -o mesh2759 -s off -f 13267/13267/13267 13268/13268/13268 13269/13269/13269 -f 13270/13270/13270 13269/13269/13269 13268/13268/13268 -g charts -o chart0000 -s off -f 13267/13267/13267 13268/13268/13268 13269/13269/13269 -f 13270/13270/13270 13269/13269/13269 13268/13268/13268 -v 12949 24861 3937.2 -vt 0.990441 0.222482 -v 12986.5 24861 3899.7 -vt 0.991272 0.222176 -v 12986.5 24861 5819.7 -vt 0.991272 0.23784 -o mesh2760 -s off -f 13271/13271/13271 13272/13272/13272 13273/13273/13273 -g charts -o chart0000 -s off -f 13271/13271/13271 13272/13272/13272 13273/13273/13273 -v 12949 24861 3937.2 -vt 0.627182 0.676422 -v 12986.5 24861 5819.7 -vt 0.627182 0.691261 -v 12949 24861 5782.2 -vt 0.626351 0.69096 -o mesh2761 -s off -f 13274/13274/13274 13275/13275/13275 13276/13276/13276 -g charts -o chart0000 -s off -f 13274/13274/13274 13275/13275/13275 13276/13276/13276 -v 12949 24861 5782.2 -vt 0.97049 0.359334 -v 12986.5 24861 5819.7 -vt 0.971322 0.359027 -v 11944 24861 5782.2 -vt 0.971322 0.367271 -o mesh2762 -s off -f 13277/13277/13277 13278/13278/13278 13279/13279/13279 -g charts -o chart0000 -s off -f 13277/13277/13277 13278/13278/13278 13279/13279/13279 -v 11906.5 24861 3899.7 -vt 0.318786 0.431574 -v 11944 24861 3937.2 -vt 0.318478 0.43075 -v 11906.5 24861 5819.7 -vt 0.302993 0.431574 -o mesh2763 -s off -f 13280/13280/13280 13281/13281/13281 13282/13282/13282 -g charts -o chart0000 -s off -f 13280/13280/13280 13281/13281/13281 13282/13282/13282 -v 11906.5 24861 5819.7 -vt 0.107647 0.363149 -v 11944 24861 3937.2 -vt 0.107647 0.377988 -v 11944 24861 5782.2 -vt 0.106816 0.363451 -o mesh2764 -s off -f 13283/13283/13283 13284/13284/13284 13285/13285/13285 -g charts -o chart0000 -s off -f 13283/13283/13283 13284/13284/13284 13285/13285/13285 -v 11906.5 24861 5819.7 -vt 0.867415 0.166941 -v 11944 24861 5782.2 -vt 0.866584 0.166627 -v 12986.5 24861 5819.7 -vt 0.867415 0.157873 -o mesh2765 -s off -f 13286/13286/13286 13287/13287/13287 13288/13288/13288 -g charts -o chart0000 -s off -f 13286/13286/13286 13287/13287/13287 13288/13288/13288 -v 11906.5 25026 3899.7 -vt 0.387781 0.786068 -v 11944 25026 3937.2 -vt 0.388612 0.786382 -v 12986.5 25026 3899.7 -vt 0.387781 0.795136 -v 12949 25026 3937.2 -vt 0.388612 0.794821 -o mesh2766 -s off -f 13289/13289/13289 13290/13290/13290 13291/13291/13291 -f 13292/13292/13292 13291/13291/13291 13290/13290/13290 -g charts -o chart0000 -s off -f 13289/13289/13289 13290/13290/13290 13291/13291/13291 -f 13292/13292/13292 13291/13291/13291 13290/13290/13290 -v 11944 25026 3937.2 -vt 0.918953 0.485467 -v 11906.5 25026 3899.7 -vt 0.919784 0.485161 -v 11906.5 25026 5819.7 -vt 0.919784 0.500824 -o mesh2767 -s off -f 13293/13293/13293 13294/13294/13294 13295/13295/13295 -g charts -o chart0000 -s off -f 13293/13293/13293 13294/13294/13294 13295/13295/13295 -v 11944 25026 3937.2 -vt 0.802577 0.931162 -v 11906.5 25026 5819.7 -vt 0.817539 0.931162 -v 11944 25026 5782.2 -vt 0.817236 0.930338 -o mesh2768 -s off -f 13296/13296/13296 13297/13297/13297 13298/13298/13298 -g charts -o chart0000 -s off -f 13296/13296/13296 13297/13297/13297 13298/13298/13298 -v 11944 25026 5782.2 -vt 0.0414565 0.411789 -v 11906.5 25026 5819.7 -vt 0.0411471 0.412613 -v 12949 25026 5782.2 -vt 0.0494596 0.412613 -o mesh2769 -s off -f 13299/13299/13299 13300/13300/13300 13301/13301/13301 -g charts -o chart0000 -s off -f 13299/13299/13299 13300/13300/13300 13301/13301/13301 -v 12986.5 25026 3899.7 -vt 0.159185 0.682193 -v 12949 25026 3937.2 -vt 0.158354 0.681887 -v 12986.5 25026 5819.7 -vt 0.159185 0.666529 -o mesh2770 -s off -f 13302/13302/13302 13303/13303/13303 13304/13304/13304 -g charts -o chart0000 -s off -f 13302/13302/13302 13303/13303/13303 13304/13304/13304 -v 12986.5 25026 5819.7 -vt 0.949709 0.426628 -v 12949 25026 3937.2 -vt 0.964672 0.426628 -v 12949 25026 5782.2 -vt 0.950013 0.425804 -o mesh2771 -s off -f 13305/13305/13305 13306/13306/13306 13307/13307/13307 -g charts -o chart0000 -s off -f 13305/13305/13305 13306/13306/13306 13307/13307/13307 -v 12986.5 25026 5819.7 -vt 0.324605 0.560181 -v 12949 25026 5782.2 -vt 0.323774 0.559866 -v 11906.5 25026 5819.7 -vt 0.324605 0.551113 -o mesh2772 -s off -f 13308/13308/13308 13309/13309/13309 13310/13310/13310 -g charts -o chart0000 -s off -f 13308/13308/13308 13309/13309/13309 13310/13310/13310 -v 11906.5 24861 5819.7 -vt 0.0361595 0.742374 -v 12986.5 24861 5819.7 -vt 0.0361595 0.733306 -v 12986.5 25026 5819.7 -vt 0.0344971 0.733306 -v 11906.5 25026 5819.7 -vt 0.0344971 0.742374 -o mesh2773 -s off -f 13311/13311/13311 13312/13312/13312 13313/13313/13313 -f 13311/13311/13311 13313/13313/13313 13314/13314/13314 -g charts -o chart0000 -s off -f 13311/13311/13311 13312/13312/13312 13313/13313/13313 -f 13311/13311/13311 13313/13313/13313 13314/13314/13314 -v 12986.5 24861 5819.7 -vt 0.107648 0.884996 -v 12986.5 24861 3899.7 -vt 0.123441 0.884996 -v 12986.5 25026 3899.7 -vt 0.123441 0.886645 -v 12986.5 25026 5819.7 -vt 0.107648 0.886645 -o mesh2774 -s off -f 13315/13315/13315 13316/13316/13316 13317/13317/13317 -f 13315/13315/13315 13317/13317/13317 13318/13318/13318 -g charts -o chart0000 -s off -f 13315/13315/13315 13316/13316/13316 13317/13317/13317 -f 13315/13315/13315 13317/13317/13317 13318/13318/13318 -v 12986.5 24861 3899.7 -vt 0.388612 0.822341 -v 11906.5 24861 3899.7 -vt 0.397756 0.822341 -v 11906.5 25026 3899.7 -vt 0.397756 0.82399 -v 12986.5 25026 3899.7 -vt 0.388612 0.82399 -o mesh2775 -s off -f 13319/13319/13319 13320/13320/13320 13321/13321/13321 -f 13319/13319/13319 13321/13321/13321 13322/13322/13322 -g charts -o chart0000 -s off -f 13319/13319/13319 13320/13320/13320 13321/13321/13321 -f 13319/13319/13319 13321/13321/13321 13322/13322/13322 -v 11906.5 24861 3899.7 -vt 0.648795 0.877576 -v 11906.5 24861 5819.7 -vt 0.633001 0.877576 -v 11906.5 25026 5819.7 -vt 0.633001 0.875927 -v 11906.5 25026 3899.7 -vt 0.648795 0.875927 -o mesh2776 -s off -f 13323/13323/13323 13324/13324/13324 13325/13325/13325 -f 13323/13323/13323 13325/13325/13325 13326/13326/13326 -g charts -o chart0000 -s off -f 13323/13323/13323 13324/13324/13324 13325/13325/13325 -f 13323/13323/13323 13325/13325/13325 13326/13326/13326 -v 11944 25026 3937.2 -vt 0.076891 0.608821 -v 11944 24981 3937.2 -vt 0.076891 0.609271 -v 12949 24981 3937.2 -vt 0.0685786 0.609271 -v 12949 25026 3937.2 -vt 0.0685786 0.608821 -v 11944 24861 3937.2 -vt 0.076891 0.61047 -v 12949 24861 3937.2 -vt 0.0685786 0.61047 -o mesh2777 -s off -f 13327/13327/13327 13328/13328/13328 13329/13329/13329 -f 13327/13327/13327 13329/13329/13329 13330/13330/13330 -f 13331/13331/13331 13332/13332/13332 13329/13329/13329 -f 13331/13331/13331 13329/13329/13329 13328/13328/13328 -g charts -o chart0000 -s off -f 13327/13327/13327 13328/13328/13328 13329/13329/13329 -f 13327/13327/13327 13329/13329/13329 13330/13330/13330 -f 13331/13331/13331 13332/13332/13332 13329/13329/13329 -f 13331/13331/13331 13329/13329/13329 13328/13328/13328 -v 12949 25026 3937.2 -vt 0.65877 0.662407 -v 12949 24981 3937.2 -vt 0.659223 0.662407 -v 12949 24981 5782.2 -vt 0.659223 0.647568 -v 12949 25026 5782.2 -vt 0.65877 0.647568 -v 12949 24861 3937.2 -vt 0.660432 0.662407 -v 12949 24861 5782.2 -vt 0.660432 0.647568 -o mesh2778 -s off -f 13333/13333/13333 13334/13334/13334 13335/13335/13335 -f 13333/13333/13333 13335/13335/13335 13336/13336/13336 -f 13337/13337/13337 13338/13338/13338 13335/13335/13335 -f 13337/13337/13337 13335/13335/13335 13334/13334/13334 -g charts -o chart0000 -s off -f 13333/13333/13333 13334/13334/13334 13335/13335/13335 -f 13333/13333/13333 13335/13335/13335 13336/13336/13336 -f 13337/13337/13337 13338/13338/13338 13335/13335/13335 -f 13337/13337/13337 13335/13335/13335 13334/13334/13334 -v 12949 25026 5782.2 -vt 0.066916 0.611294 -v 12949 24981 5782.2 -vt 0.066916 0.610845 -v 11944 24981 5782.2 -vt 0.0586035 0.610845 -v 11944 25026 5782.2 -vt 0.0586035 0.611294 -v 12949 24861 5782.2 -vt 0.066916 0.609645 -v 11944 24861 5782.2 -vt 0.0586035 0.609645 -o mesh2779 -s off -f 13339/13339/13339 13340/13340/13340 13341/13341/13341 -f 13339/13339/13339 13341/13341/13341 13342/13342/13342 -f 13343/13343/13343 13344/13344/13344 13341/13341/13341 -f 13343/13343/13343 13341/13341/13341 13340/13340/13340 -g charts -o chart0000 -s off -f 13339/13339/13339 13340/13340/13340 13341/13341/13341 -f 13339/13339/13339 13341/13341/13341 13342/13342/13342 -f 13343/13343/13343 13344/13344/13344 13341/13341/13341 -f 13343/13343/13343 13341/13341/13341 13340/13340/13340 -v 11944 25026 5782.2 -vt 0.874065 0.401896 -v 11944 24981 5782.2 -vt 0.874065 0.401446 -v 11944 24981 3937.2 -vt 0.859102 0.401446 -v 11944 25026 3937.2 -vt 0.859102 0.401896 -v 11944 24861 5782.2 -vt 0.874065 0.400247 -v 11944 24861 3937.2 -vt 0.859102 0.400247 -o mesh2780 -s off -f 13345/13345/13345 13346/13346/13346 13347/13347/13347 -f 13345/13345/13345 13347/13347/13347 13348/13348/13348 -f 13349/13349/13349 13350/13350/13350 13347/13347/13347 -f 13349/13349/13349 13347/13347/13347 13346/13346/13346 -g charts -o chart0000 -s off -f 13345/13345/13345 13346/13346/13346 13347/13347/13347 -f 13345/13345/13345 13347/13347/13347 13348/13348/13348 -f 13349/13349/13349 13350/13350/13350 13347/13347/13347 -f 13349/13349/13349 13347/13347/13347 13346/13346/13346 -v 11944 24981 3937.2 -vt 0.894846 0.29967 -v 12004 24981 3997.2 -vt 0.895677 0.300162 -v 12949 24981 3937.2 -vt 0.894846 0.307914 -v 12889 24981 3997.2 -vt 0.895677 0.307422 -o mesh2781 -s off -f 13351/13351/13351 13352/13352/13352 13353/13353/13353 -f 13354/13354/13354 13353/13353/13353 13352/13352/13352 -g charts -o chart0000 -s off -f 13351/13351/13351 13352/13352/13352 13353/13353/13353 -f 13354/13354/13354 13353/13353/13353 13352/13352/13352 -v 12004 24981 3997.2 -vt 0.950196 0.944353 -v 11944 24981 3937.2 -vt 0.949709 0.945177 -v 11944 24981 5782.2 -vt 0.964672 0.945177 -o mesh2782 -s off -f 13355/13355/13355 13356/13356/13356 13357/13357/13357 -g charts -o chart0000 -s off -f 13355/13355/13355 13356/13356/13356 13357/13357/13357 -v 12004 24981 3997.2 -vt 0.871571 0.725886 -v 11944 24981 5782.2 -vt 0.871571 0.739901 -v 12004 24981 5722.2 -vt 0.87074 0.739415 -o mesh2783 -s off -f 13358/13358/13358 13359/13359/13359 13360/13360/13360 -g charts -o chart0000 -s off -f 13358/13358/13358 13359/13359/13359 13360/13360/13360 -v 12004 24981 5722.2 -vt 0.222361 0.746171 -v 11944 24981 5782.2 -vt 0.223192 0.745672 -v 12889 24981 5722.2 -vt 0.223192 0.753091 -o mesh2784 -s off -f 13361/13361/13361 13362/13362/13362 13363/13363/13363 -g charts -o chart0000 -s off -f 13361/13361/13361 13362/13362/13362 13363/13363/13363 -v 12949 24981 3937.2 -vt 0.4468 0.473619 -v 12889 24981 3997.2 -vt 0.445968 0.473136 -v 12949 24981 5782.2 -vt 0.4468 0.45878 -o mesh2785 -s off -f 13364/13364/13364 13365/13365/13365 13366/13366/13366 -g charts -o chart0000 -s off -f 13364/13364/13364 13365/13365/13365 13366/13366/13366 -v 12949 24981 5782.2 -vt 0.972153 0.655812 -v 12889 24981 3997.2 -vt 0.972153 0.669827 -v 12889 24981 5722.2 -vt 0.971322 0.656298 -o mesh2786 -s off -f 13367/13367/13367 13368/13368/13368 13369/13369/13369 -g charts -o chart0000 -s off -f 13367/13367/13367 13368/13368/13368 13369/13369/13369 -v 12949 24981 5782.2 -vt 0.717789 0.916323 -v 12889 24981 5722.2 -vt 0.716958 0.915831 -v 11944 24981 5782.2 -vt 0.717789 0.908079 -o mesh2787 -s off -f 13370/13370/13370 13371/13371/13371 13372/13372/13372 -g charts -o chart0000 -s off -f 13370/13370/13370 13371/13371/13371 13372/13372/13372 -v 12889 24861 5722.2 -vt 0.369493 0.557708 -v 12459.6 24906 5722.2 -vt 0.368869 0.554109 -v 12889 24981 5722.2 -vt 0.36783 0.557708 -v 12004 24861 5722.2 -vt 0.369493 0.550289 -v 12433.4 24906 5722.2 -vt 0.368869 0.553888 -v 12433.4 24936 5722.2 -vt 0.368454 0.553888 -v 12459.6 24936 5722.2 -vt 0.368454 0.554109 -v 12004 24981 5722.2 -vt 0.36783 0.550289 -o mesh2788 -s off -f 13373/13373/13373 13374/13374/13374 13375/13375/13375 -f 13374/13374/13374 13373/13373/13373 13376/13376/13376 -f 13374/13374/13374 13376/13376/13376 13377/13377/13377 -f 13377/13377/13377 13376/13376/13376 13378/13378/13378 -f 13375/13375/13375 13379/13379/13379 13380/13380/13380 -f 13379/13379/13379 13375/13375/13375 13374/13374/13374 -f 13380/13380/13380 13379/13379/13379 13378/13378/13378 -f 13380/13380/13380 13378/13378/13378 13376/13376/13376 -g charts -o chart0000 -s off -f 13373/13373/13373 13374/13374/13374 13375/13375/13375 -f 13374/13374/13374 13373/13373/13373 13376/13376/13376 -f 13374/13374/13374 13376/13376/13376 13377/13377/13377 -f 13377/13377/13377 13376/13376/13376 13378/13378/13378 -f 13375/13375/13375 13379/13379/13379 13380/13380/13380 -f 13379/13379/13379 13375/13375/13375 13374/13374/13374 -f 13380/13380/13380 13379/13379/13379 13378/13378/13378 -f 13380/13380/13380 13378/13378/13378 13376/13376/13376 -v 12004 24981 5722.2 -vt 0.173317 0.969909 -v 12004 24936 4869.82 -vt 0.166334 0.970528 -v 12004 24981 3997.2 -vt 0.159185 0.969909 -v 12004 24861 5722.2 -vt 0.173317 0.971558 -v 12004 24906 4869.82 -vt 0.166334 0.97094 -v 12004 24906 4849.58 -vt 0.166168 0.97094 -v 12004 24936 4849.58 -vt 0.166168 0.970528 -v 12004 24861 3997.2 -vt 0.159185 0.971558 -o mesh2789 -s off -f 13381/13381/13381 13382/13382/13382 13383/13383/13383 -f 13382/13382/13382 13381/13381/13381 13384/13384/13384 -f 13382/13382/13382 13384/13384/13384 13385/13385/13385 -f 13385/13385/13385 13384/13384/13384 13386/13386/13386 -f 13383/13383/13383 13387/13387/13387 13388/13388/13388 -f 13387/13387/13387 13383/13383/13383 13382/13382/13382 -f 13388/13388/13388 13387/13387/13387 13386/13386/13386 -f 13388/13388/13388 13386/13386/13386 13384/13384/13384 -g charts -o chart0000 -s off -f 13381/13381/13381 13382/13382/13382 13383/13383/13383 -f 13382/13382/13382 13381/13381/13381 13384/13384/13384 -f 13382/13382/13382 13384/13384/13384 13385/13385/13385 -f 13385/13385/13385 13384/13384/13384 13386/13386/13386 -f 13383/13383/13383 13387/13387/13387 13388/13388/13388 -f 13387/13387/13387 13383/13383/13383 13382/13382/13382 -f 13388/13388/13388 13387/13387/13387 13386/13386/13386 -f 13388/13388/13388 13386/13386/13386 13384/13384/13384 -v 12889 24981 3997.2 -vt 0.0203657 0.83141 -v 12459.6 24936 3997.2 -vt 0.016736 0.832028 -v 12889 24861 3997.2 -vt 0.0203657 0.833058 -v 12004 24981 3997.2 -vt 0.0128845 0.83141 -v 12433.4 24936 3997.2 -vt 0.0165142 0.832028 -v 12433.4 24906 3997.2 -vt 0.0165142 0.83244 -v 12459.6 24906 3997.2 -vt 0.016736 0.83244 -v 12004 24861 3997.2 -vt 0.0128845 0.833058 -o mesh2790 -s off -f 13389/13389/13389 13390/13390/13390 13391/13391/13391 -f 13390/13390/13390 13389/13389/13389 13392/13392/13392 -f 13390/13390/13390 13392/13392/13392 13393/13393/13393 -f 13393/13393/13393 13392/13392/13392 13394/13394/13394 -f 13391/13391/13391 13395/13395/13395 13396/13396/13396 -f 13395/13395/13395 13391/13391/13391 13390/13390/13390 -f 13396/13396/13396 13395/13395/13395 13394/13394/13394 -f 13396/13396/13396 13394/13394/13394 13392/13392/13392 -g charts -o chart0000 -s off -f 13389/13389/13389 13390/13390/13390 13391/13391/13391 -f 13390/13390/13390 13389/13389/13389 13392/13392/13392 -f 13390/13390/13390 13392/13392/13392 13393/13393/13393 -f 13393/13393/13393 13392/13392/13392 13394/13394/13394 -f 13391/13391/13391 13395/13395/13395 13396/13396/13396 -f 13395/13395/13395 13391/13391/13391 13390/13390/13390 -f 13396/13396/13396 13395/13395/13395 13394/13394/13394 -f 13396/13396/13396 13394/13394/13394 13392/13392/13392 -v 12889 24861 3997.2 -vt 0.541563 0.432399 -v 12889 24861 5722.2 -vt 0.527431 0.432399 -v 12889 24981 5722.2 -vt 0.527431 0.43075 -v 12889 24981 3997.2 -vt 0.541563 0.43075 -o mesh2791 -s off -f 13397/13397/13397 13398/13398/13398 13399/13399/13399 -f 13397/13397/13397 13399/13399/13399 13400/13400/13400 -g charts -o chart0000 -s off -f 13397/13397/13397 13398/13398/13398 13399/13399/13399 -f 13397/13397/13397 13399/13399/13399 13400/13400/13400 -v 12459.6 24906 5722.2 -vt 0.0087281 0.693734 -v 12433.4 24906 5722.2 -vt 0.00789692 0.693734 -v 12433.4 24906 3997.2 -vt 0.00789692 0.67972 -v 12459.6 24906 3997.2 -vt 0.0087281 0.67972 -o mesh2792 -s off -f 13401/13401/13401 13402/13402/13402 13403/13403/13403 -f 13401/13401/13401 13403/13403/13403 13404/13404/13404 -g charts -o chart0000 -s off -f 13401/13401/13401 13402/13402/13402 13403/13403/13403 -f 13401/13401/13401 13403/13403/13403 13404/13404/13404 -v 12433.4 24906 5722.2 -vt 0.402743 0.849546 -v 12433.4 24936 5722.2 -vt 0.402743 0.848722 -v 12433.4 24936 3997.2 -vt 0.388612 0.848722 -v 12433.4 24906 3997.2 -vt 0.388612 0.849546 -o mesh2793 -s off -f 13405/13405/13405 13406/13406/13406 13407/13407/13407 -f 13405/13405/13405 13407/13407/13407 13408/13408/13408 -g charts -o chart0000 -s off -f 13405/13405/13405 13406/13406/13406 13407/13407/13407 -f 13405/13405/13405 13407/13407/13407 13408/13408/13408 -v 12868.6 24936 4869.82 -vt 0.343724 0.971558 -v 12868.6 24906 4869.82 -vt 0.343724 0.972382 -v 12868.6 24906 4849.58 -vt 0.344555 0.972382 -v 12868.6 24936 4849.58 -vt 0.344555 0.971558 -o mesh2794 -s off -f 13409/13409/13409 13410/13410/13410 13411/13411/13411 -f 13409/13409/13409 13411/13411/13411 13412/13412/13412 -g charts -o chart0000 -s off -f 13409/13409/13409 13410/13410/13410 13411/13411/13411 -f 13409/13409/13409 13411/13411/13411 13412/13412/13412 -v 12004 24936 4869.82 -vt 0.507481 0.297197 -v 12004 24906 4869.82 -vt 0.507481 0.298021 -v 12868.6 24906 4869.82 -vt 0.5 0.298021 -v 12868.6 24936 4869.82 -vt 0.5 0.297197 -o mesh2795 -s off -f 13413/13413/13413 13414/13414/13414 13415/13415/13415 -f 13413/13413/13413 13415/13415/13415 13416/13416/13416 -g charts -o chart0000 -s off -f 13413/13413/13413 13414/13414/13414 13415/13415/13415 -f 13413/13413/13413 13415/13415/13415 13416/13416/13416 -v 12004 24906 4869.82 -vt 0.780964 0.463726 -v 12004 24906 4849.58 -vt 0.780964 0.464551 -v 12868.6 24906 4849.58 -vt 0.773483 0.464551 -v 12868.6 24906 4869.82 -vt 0.773483 0.463726 -o mesh2796 -s off -f 13417/13417/13417 13418/13418/13418 13419/13419/13419 -f 13417/13417/13417 13419/13419/13419 13420/13420/13420 -g charts -o chart0000 -s off -f 13417/13417/13417 13418/13418/13418 13419/13419/13419 -f 13417/13417/13417 13419/13419/13419 13420/13420/13420 -v 12004 24906 4849.58 -vt 0.194098 0.858615 -v 12004 24936 4849.58 -vt 0.194929 0.858615 -v 12868.6 24936 4849.58 -vt 0.194929 0.851195 -v 12868.6 24906 4849.58 -vt 0.194098 0.851195 -o mesh2797 -s off -f 13421/13421/13421 13422/13422/13422 13423/13423/13423 -f 13421/13421/13421 13423/13423/13423 13424/13424/13424 -g charts -o chart0000 -s off -f 13421/13421/13421 13422/13422/13422 13423/13423/13423 -f 13421/13421/13421 13423/13423/13423 13424/13424/13424 -v 12004 24936 4849.58 -vt 0.87074 0.234542 -v 12004 24936 4869.82 -vt 0.871571 0.234542 -v 12868.6 24936 4869.82 -vt 0.871571 0.227123 -v 12868.6 24936 4849.58 -vt 0.87074 0.227123 -o mesh2798 -s off -f 13425/13425/13425 13426/13426/13426 13427/13427/13427 -f 13425/13425/13425 13427/13427/13427 13428/13428/13428 -g charts -o chart0000 -s off -f 13425/13425/13425 13426/13426/13426 13427/13427/13427 -f 13425/13425/13425 13427/13427/13427 13428/13428/13428 -v 12459.6 24936 5722.2 -vt 0.736076 0.29967 -v 12459.6 24906 5722.2 -vt 0.736076 0.298846 -v 12459.6 24906 3997.2 -vt 0.721945 0.298846 -v 12459.6 24936 3997.2 -vt 0.721945 0.29967 -o mesh2799 -s off -f 13429/13429/13429 13430/13430/13430 13431/13431/13431 -f 13429/13429/13429 13431/13431/13431 13432/13432/13432 -g charts -o chart0000 -s off -f 13429/13429/13429 13430/13430/13430 13431/13431/13431 -f 13429/13429/13429 13431/13431/13431 13432/13432/13432 -v 12433.4 24936 5722.2 -vt 0.034497 0.208986 -v 12459.6 24936 5722.2 -vt 0.034497 0.208162 -v 12459.6 24936 3997.2 -vt 0.0203658 0.208162 -v 12433.4 24936 3997.2 -vt 0.0203658 0.208986 -o mesh2800 -s off -f 13433/13433/13433 13434/13434/13434 13435/13435/13435 -f 13433/13433/13433 13435/13435/13435 13436/13436/13436 -g charts -o chart0000 -s off -f 13433/13433/13433 13434/13434/13434 13435/13435/13435 -f 13433/13433/13433 13435/13435/13435 13436/13436/13436 -v 14111.5 24861 3899.7 -vt 0.464256 0.635202 -v 14074 24861 3937.2 -vt 0.463939 0.634378 -v 13031.5 24861 3899.7 -vt 0.455112 0.635202 -v 13069 24861 3937.2 -vt 0.45543 0.634378 -o mesh2801 -s off -f 13437/13437/13437 13438/13438/13438 13439/13439/13439 -f 13440/13440/13440 13439/13439/13439 13438/13438/13438 -g charts -o chart0000 -s off -f 13437/13437/13437 13438/13438/13438 13439/13439/13439 -f 13440/13440/13440 13439/13439/13439 13438/13438/13438 -v 14074 24861 3937.2 -vt 0.390274 0.731139 -v 14111.5 24861 3899.7 -vt 0.391106 0.730833 -v 14111.5 24861 5819.7 -vt 0.391106 0.746496 -o mesh2802 -s off -f 13441/13441/13441 13442/13442/13442 13443/13443/13443 -g charts -o chart0000 -s off -f 13441/13441/13441 13442/13442/13442 13443/13443/13443 -v 14074 24861 3937.2 -vt 0.315461 0.486809 -v 14111.5 24861 5819.7 -vt 0.330424 0.486809 -v 14074 24861 5782.2 -vt 0.33012 0.485985 -o mesh2803 -s off -f 13444/13444/13444 13445/13445/13445 13446/13446/13446 -g charts -o chart0000 -s off -f 13444/13444/13444 13445/13445/13445 13446/13446/13446 -v 14074 24861 5782.2 -vt 0.204382 0.998763 -v 14111.5 24861 5819.7 -vt 0.204073 0.999588 -v 13069 24861 5782.2 -vt 0.212386 0.999587 -o mesh2804 -s off -f 13447/13447/13447 13448/13448/13448 13449/13449/13449 -g charts -o chart0000 -s off -f 13447/13447/13447 13448/13448/13448 13449/13449/13449 -v 13031.5 24861 3899.7 -vt 0.581463 0.342539 -v 13069 24861 3937.2 -vt 0.581155 0.341715 -v 13031.5 24861 5819.7 -vt 0.565669 0.342539 -o mesh2805 -s off -f 13450/13450/13450 13451/13451/13451 13452/13452/13452 -g charts -o chart0000 -s off -f 13450/13450/13450 13451/13451/13451 13452/13452/13452 -v 13031.5 24861 5819.7 -vt 0.160017 0.61789 -v 13069 24861 3937.2 -vt 0.160016 0.632729 -v 13069 24861 5782.2 -vt 0.159185 0.618191 -o mesh2806 -s off -f 13453/13453/13453 13454/13454/13454 13455/13455/13455 -g charts -o chart0000 -s off -f 13453/13453/13453 13454/13454/13454 13455/13455/13455 -v 13031.5 24861 5819.7 -vt 0.238986 0.797609 -v 13069 24861 5782.2 -vt 0.238668 0.796785 -v 14111.5 24861 5819.7 -vt 0.229842 0.797609 -o mesh2807 -s off -f 13456/13456/13456 13457/13457/13457 13458/13458/13458 -g charts -o chart0000 -s off -f 13456/13456/13456 13457/13457/13457 13458/13458/13458 -v 13031.5 25026 3899.7 -vt 0.842477 0.191674 -v 13069 25026 3937.2 -vt 0.842795 0.192498 -v 14111.5 25026 3899.7 -vt 0.851621 0.191674 -v 14074 25026 3937.2 -vt 0.851303 0.192498 -o mesh2808 -s off -f 13459/13459/13459 13460/13460/13460 13461/13461/13461 -f 13462/13462/13462 13461/13461/13461 13460/13460/13460 -g charts -o chart0000 -s off -f 13459/13459/13459 13460/13460/13460 13461/13461/13461 -f 13462/13462/13462 13461/13461/13461 13460/13460/13460 -v 13069 25026 3937.2 -vt 0.794264 0.41127 -v 13031.5 25026 3899.7 -vt 0.795096 0.410965 -v 13031.5 25026 5819.7 -vt 0.795095 0.426628 -o mesh2809 -s off -f 13463/13463/13463 13464/13464/13464 13465/13465/13465 -g charts -o chart0000 -s off -f 13463/13463/13463 13464/13464/13464 13465/13465/13465 -v 13069 25026 3937.2 -vt 0.931421 0.233718 -v 13031.5 25026 5819.7 -vt 0.931421 0.248557 -v 13069 25026 5782.2 -vt 0.93059 0.248256 -o mesh2810 -s off -f 13466/13466/13466 13467/13467/13467 13468/13468/13468 -g charts -o chart0000 -s off -f 13466/13466/13466 13467/13467/13467 13468/13468/13468 -v 13069 25026 5782.2 -vt 0.398896 0.436521 -v 13031.5 25026 5819.7 -vt 0.398587 0.437345 -v 14074 25026 5782.2 -vt 0.406899 0.437345 -o mesh2811 -s off -f 13469/13469/13469 13470/13470/13470 13471/13471/13471 -g charts -o chart0000 -s off -f 13469/13469/13469 13470/13470/13470 13471/13471/13471 -v 14111.5 25026 3899.7 -vt 0.992934 0.456307 -v 14074 25026 3937.2 -vt 0.992103 0.456001 -v 14111.5 25026 5819.7 -vt 0.992934 0.440643 -o mesh2812 -s off -f 13472/13472/13472 13473/13473/13473 13474/13474/13474 -g charts -o chart0000 -s off -f 13472/13472/13472 13473/13473/13473 13474/13474/13474 -v 14111.5 25026 5819.7 -vt 0.332918 0.760511 -v 14074 25026 3937.2 -vt 0.34788 0.760511 -v 14074 25026 5782.2 -vt 0.333222 0.759687 -o mesh2813 -s off -f 13475/13475/13475 13476/13476/13476 13477/13477/13477 -g charts -o chart0000 -s off -f 13475/13475/13475 13476/13476/13476 13477/13477/13477 -v 14111.5 25026 5819.7 -vt 0.706151 0.347485 -v 14074 25026 5782.2 -vt 0.70532 0.347171 -v 13031.5 25026 5819.7 -vt 0.706151 0.338417 -o mesh2814 -s off -f 13478/13478/13478 13479/13479/13479 13480/13480/13480 -g charts -o chart0000 -s off -f 13478/13478/13478 13479/13479/13479 13480/13480/13480 -v 13031.5 24861 5819.7 -vt 0.799252 0.335119 -v 14111.5 24861 5819.7 -vt 0.799252 0.326051 -v 14111.5 25026 5819.7 -vt 0.797589 0.326051 -v 13031.5 25026 5819.7 -vt 0.797589 0.335119 -o mesh2815 -s off -f 13481/13481/13481 13482/13482/13482 13483/13483/13483 -f 13481/13481/13481 13483/13483/13483 13484/13484/13484 -g charts -o chart0000 -s off -f 13481/13481/13481 13482/13482/13482 13483/13483/13483 -f 13481/13481/13481 13483/13483/13483 13484/13484/13484 -v 14111.5 24861 5819.7 -vt 0.903159 0.624485 -v 14111.5 24861 3899.7 -vt 0.918953 0.624485 -v 14111.5 25026 3899.7 -vt 0.918953 0.626133 -v 14111.5 25026 5819.7 -vt 0.903159 0.626133 -o mesh2816 -s off -f 13485/13485/13485 13486/13486/13486 13487/13487/13487 -f 13485/13485/13485 13487/13487/13487 13488/13488/13488 -g charts -o chart0000 -s off -f 13485/13485/13485 13486/13486/13486 13487/13487/13487 -f 13485/13485/13485 13487/13487/13487 13488/13488/13488 -v 14111.5 24861 3899.7 -vt 0.021197 0.370569 -v 13031.5 24861 3899.7 -vt 0.021197 0.379637 -v 13031.5 25026 3899.7 -vt 0.0228594 0.379637 -v 14111.5 25026 3899.7 -vt 0.0228594 0.370569 -o mesh2817 -s off -f 13489/13489/13489 13490/13490/13490 13491/13491/13491 -f 13489/13489/13489 13491/13491/13491 13492/13492/13492 -g charts -o chart0000 -s off -f 13489/13489/13489 13490/13490/13490 13491/13491/13491 -f 13489/13489/13489 13491/13491/13491 13492/13492/13492 -v 13031.5 24861 3899.7 -vt 0.576475 0.567601 -v 13031.5 24861 5819.7 -vt 0.576475 0.551937 -v 13031.5 25026 5819.7 -vt 0.574813 0.551937 -v 13031.5 25026 3899.7 -vt 0.574813 0.567601 -o mesh2818 -s off -f 13493/13493/13493 13494/13494/13494 13495/13495/13495 -f 13493/13493/13493 13495/13495/13495 13496/13496/13496 -g charts -o chart0000 -s off -f 13493/13493/13493 13494/13494/13494 13495/13495/13495 -f 13493/13493/13493 13495/13495/13495 13496/13496/13496 -v 13069 25026 3937.2 -vt 0.847465 0.534625 -v 13069 24981 3937.2 -vt 0.847465 0.535075 -v 14074 24981 3937.2 -vt 0.839152 0.535075 -v 14074 25026 3937.2 -vt 0.839152 0.534625 -v 13069 24861 3937.2 -vt 0.847465 0.536274 -v 14074 24861 3937.2 -vt 0.839152 0.536274 -o mesh2819 -s off -f 13497/13497/13497 13498/13498/13498 13499/13499/13499 -f 13497/13497/13497 13499/13499/13499 13500/13500/13500 -f 13501/13501/13501 13502/13502/13502 13499/13499/13499 -f 13501/13501/13501 13499/13499/13499 13498/13498/13498 -g charts -o chart0000 -s off -f 13497/13497/13497 13498/13498/13498 13499/13499/13499 -f 13497/13497/13497 13499/13499/13499 13500/13500/13500 -f 13501/13501/13501 13502/13502/13502 13499/13499/13499 -f 13501/13501/13501 13499/13499/13499 13498/13498/13498 -v 14074 25026 3937.2 -vt 0.490025 0.34089 -v 14074 24981 3937.2 -vt 0.490025 0.34134 -v 14074 24981 5782.2 -vt 0.475062 0.34134 -v 14074 25026 5782.2 -vt 0.475062 0.34089 -v 14074 24861 3937.2 -vt 0.490025 0.342539 -v 14074 24861 5782.2 -vt 0.475062 0.342539 -o mesh2820 -s off -f 13503/13503/13503 13504/13504/13504 13505/13505/13505 -f 13503/13503/13503 13505/13505/13505 13506/13506/13506 -f 13507/13507/13507 13508/13508/13508 13505/13505/13505 -f 13507/13507/13507 13505/13505/13505 13504/13504/13504 -g charts -o chart0000 -s off -f 13503/13503/13503 13504/13504/13504 13505/13505/13505 -f 13503/13503/13503 13505/13505/13505 13506/13506/13506 -f 13507/13507/13507 13508/13508/13508 13505/13505/13505 -f 13507/13507/13507 13505/13505/13505 13504/13504/13504 -v 14074 25026 5782.2 -vt 0.358687 0.362325 -v 14074 24981 5782.2 -vt 0.358233 0.362325 -v 13069 24981 5782.2 -vt 0.358233 0.354081 -v 13069 25026 5782.2 -vt 0.358687 0.354081 -v 14074 24861 5782.2 -vt 0.357024 0.362325 -v 13069 24861 5782.2 -vt 0.357024 0.354081 -o mesh2821 -s off -f 13509/13509/13509 13510/13510/13510 13511/13511/13511 -f 13509/13509/13509 13511/13511/13511 13512/13512/13512 -f 13513/13513/13513 13514/13514/13514 13511/13511/13511 -f 13513/13513/13513 13511/13511/13511 13510/13510/13510 -g charts -o chart0000 -s off -f 13509/13509/13509 13510/13510/13510 13511/13511/13511 -f 13509/13509/13509 13511/13511/13511 13512/13512/13512 -f 13513/13513/13513 13514/13514/13514 13511/13511/13511 -f 13513/13513/13513 13511/13511/13511 13510/13510/13510 -v 13069 25026 5782.2 -vt 0.163342 0.314509 -v 13069 24981 5782.2 -vt 0.162888 0.314509 -v 13069 24981 3937.2 -vt 0.162888 0.29967 -v 13069 25026 3937.2 -vt 0.163342 0.29967 -v 13069 24861 5782.2 -vt 0.161679 0.314509 -v 13069 24861 3937.2 -vt 0.161679 0.29967 -o mesh2822 -s off -f 13515/13515/13515 13516/13516/13516 13517/13517/13517 -f 13515/13515/13515 13517/13517/13517 13518/13518/13518 -f 13519/13519/13519 13520/13520/13520 13517/13517/13517 -f 13519/13519/13519 13517/13517/13517 13516/13516/13516 -g charts -o chart0000 -s off -f 13515/13515/13515 13516/13516/13516 13517/13517/13517 -f 13515/13515/13515 13517/13517/13517 13518/13518/13518 -f 13519/13519/13519 13520/13520/13520 13517/13517/13517 -f 13519/13519/13519 13517/13517/13517 13516/13516/13516 -v 13069 24981 3937.2 -vt 0.876559 0.178483 -v 13129 24981 3997.2 -vt 0.87739 0.178975 -v 14074 24981 3937.2 -vt 0.876559 0.186727 -v 14014 24981 3997.2 -vt 0.87739 0.186235 -o mesh2823 -s off -f 13521/13521/13521 13522/13522/13522 13523/13523/13523 -f 13524/13524/13524 13523/13523/13523 13522/13522/13522 -g charts -o chart0000 -s off -f 13521/13521/13521 13522/13522/13522 13523/13523/13523 -f 13524/13524/13524 13523/13523/13523 13522/13522/13522 -v 13129 24981 3997.2 -vt 0.703313 0.714345 -v 13069 24981 3937.2 -vt 0.702826 0.715169 -v 13069 24981 5782.2 -vt 0.717789 0.715169 -o mesh2824 -s off -f 13525/13525/13525 13526/13526/13526 13527/13527/13527 -g charts -o chart0000 -s off -f 13525/13525/13525 13526/13526/13526 13527/13527/13527 -v 13129 24981 3997.2 -vt 0.810058 0.936109 -v 13069 24981 5782.2 -vt 0.824189 0.936109 -v 13129 24981 5722.2 -vt 0.823699 0.935284 -o mesh2825 -s off -f 13528/13528/13528 13529/13529/13529 13530/13530/13530 -g charts -o chart0000 -s off -f 13528/13528/13528 13529/13529/13529 13530/13530/13530 -v 13129 24981 5722.2 -vt 0.773155 0.899835 -v 13069 24981 5782.2 -vt 0.772652 0.900659 -v 14014 24981 5722.2 -vt 0.780133 0.900659 -o mesh2826 -s off -f 13531/13531/13531 13532/13532/13532 13533/13533/13533 -g charts -o chart0000 -s off -f 13531/13531/13531 13532/13532/13532 13533/13533/13533 -v 14074 24981 3937.2 -vt 0.933084 0.842951 -v 14014 24981 3997.2 -vt 0.932253 0.842469 -v 14074 24981 5782.2 -vt 0.933084 0.828112 -o mesh2827 -s off -f 13534/13534/13534 13535/13535/13535 13536/13536/13536 -g charts -o chart0000 -s off -f 13534/13534/13534 13535/13535/13535 13536/13536/13536 -v 14074 24981 5782.2 -vt 0.167498 0.539571 -v 14014 24981 3997.2 -vt 0.181629 0.539571 -v 14014 24981 5722.2 -vt 0.167988 0.538747 -o mesh2828 -s off -f 13537/13537/13537 13538/13538/13538 13539/13539/13539 -g charts -o chart0000 -s off -f 13537/13537/13537 13538/13538/13538 13539/13539/13539 -v 14074 24981 5782.2 -vt 0.810889 0.715993 -v 14014 24981 5722.2 -vt 0.810058 0.715501 -v 13069 24981 5782.2 -vt 0.810889 0.707749 -o mesh2829 -s off -f 13540/13540/13540 13541/13541/13541 13542/13542/13542 -g charts -o chart0000 -s off -f 13540/13540/13540 13541/13541/13541 13542/13542/13542 -v 14014 24861 5722.2 -vt 0.0893598 0.162819 -v 13584.6 24906 5722.2 -vt 0.0887364 0.15922 -v 14014 24981 5722.2 -vt 0.0876974 0.162819 -v 13129 24861 5722.2 -vt 0.0893598 0.1554 -v 13558.4 24906 5722.2 -vt 0.0887364 0.159 -v 13558.4 24936 5722.2 -vt 0.0883208 0.159 -v 13584.6 24936 5722.2 -vt 0.0883208 0.15922 -v 13129 24981 5722.2 -vt 0.0876974 0.1554 -o mesh2830 -s off -f 13543/13543/13543 13544/13544/13544 13545/13545/13545 -f 13544/13544/13544 13543/13543/13543 13546/13546/13546 -f 13544/13544/13544 13546/13546/13546 13547/13547/13547 -f 13547/13547/13547 13546/13546/13546 13548/13548/13548 -f 13545/13545/13545 13549/13549/13549 13550/13550/13550 -f 13549/13549/13549 13545/13545/13545 13544/13544/13544 -f 13550/13550/13550 13549/13549/13549 13548/13548/13548 -f 13550/13550/13550 13548/13548/13548 13546/13546/13546 -g charts -o chart0000 -s off -f 13543/13543/13543 13544/13544/13544 13545/13545/13545 -f 13544/13544/13544 13543/13543/13543 13546/13546/13546 -f 13544/13544/13544 13546/13546/13546 13547/13547/13547 -f 13547/13547/13547 13546/13546/13546 13548/13548/13548 -f 13545/13545/13545 13549/13549/13549 13550/13550/13550 -f 13549/13549/13549 13545/13545/13545 13544/13544/13544 -f 13550/13550/13550 13549/13549/13549 13548/13548/13548 -f 13550/13550/13550 13548/13548/13548 13546/13546/13546 -v 13129 24981 5722.2 -vt 0.63217 0.805029 -v 13129 24936 4869.82 -vt 0.632793 0.798104 -v 13129 24981 3997.2 -vt 0.63217 0.791014 -v 13129 24861 5722.2 -vt 0.633832 0.805029 -v 13129 24906 4869.82 -vt 0.633209 0.798104 -v 13129 24906 4849.58 -vt 0.633209 0.797939 -v 13129 24936 4849.58 -vt 0.632793 0.797939 -v 13129 24861 3997.2 -vt 0.633832 0.791014 -o mesh2831 -s off -f 13551/13551/13551 13552/13552/13552 13553/13553/13553 -f 13552/13552/13552 13551/13551/13551 13554/13554/13554 -f 13552/13552/13552 13554/13554/13554 13555/13555/13555 -f 13555/13555/13555 13554/13554/13554 13556/13556/13556 -f 13553/13553/13553 13557/13557/13557 13558/13558/13558 -f 13557/13557/13557 13553/13553/13553 13552/13552/13552 -f 13558/13558/13558 13557/13557/13557 13556/13556/13556 -f 13558/13558/13558 13556/13556/13556 13554/13554/13554 -g charts -o chart0000 -s off -f 13551/13551/13551 13552/13552/13552 13553/13553/13553 -f 13552/13552/13552 13551/13551/13551 13554/13554/13554 -f 13552/13552/13552 13554/13554/13554 13555/13555/13555 -f 13555/13555/13555 13554/13554/13554 13556/13556/13556 -f 13553/13553/13553 13557/13557/13557 13558/13558/13558 -f 13557/13557/13557 13553/13553/13553 13552/13552/13552 -f 13558/13558/13558 13557/13557/13557 13556/13556/13556 -f 13558/13558/13558 13556/13556/13556 13554/13554/13554 -v 14014 24981 3997.2 -vt 0.29468 0.995466 -v 13584.6 24936 3997.2 -vt 0.29105 0.996084 -v 14014 24861 3997.2 -vt 0.29468 0.997114 -v 13129 24981 3997.2 -vt 0.287199 0.995466 -v 13558.4 24936 3997.2 -vt 0.290828 0.996084 -v 13558.4 24906 3997.2 -vt 0.290828 0.996496 -v 13584.6 24906 3997.2 -vt 0.29105 0.996496 -v 13129 24861 3997.2 -vt 0.287199 0.997114 -o mesh2832 -s off -f 13559/13559/13559 13560/13560/13560 13561/13561/13561 -f 13560/13560/13560 13559/13559/13559 13562/13562/13562 -f 13560/13560/13560 13562/13562/13562 13563/13563/13563 -f 13563/13563/13563 13562/13562/13562 13564/13564/13564 -f 13561/13561/13561 13565/13565/13565 13566/13566/13566 -f 13565/13565/13565 13561/13561/13561 13560/13560/13560 -f 13566/13566/13566 13565/13565/13565 13564/13564/13564 -f 13566/13566/13566 13564/13564/13564 13562/13562/13562 -g charts -o chart0000 -s off -f 13559/13559/13559 13560/13560/13560 13561/13561/13561 -f 13560/13560/13560 13559/13559/13559 13562/13562/13562 -f 13560/13560/13560 13562/13562/13562 13563/13563/13563 -f 13563/13563/13563 13562/13562/13562 13564/13564/13564 -f 13561/13561/13561 13565/13565/13565 13566/13566/13566 -f 13565/13565/13565 13561/13561/13561 13560/13560/13560 -f 13566/13566/13566 13565/13565/13565 13564/13564/13564 -f 13566/13566/13566 13564/13564/13564 13562/13562/13562 -v 14014 24861 3997.2 -vt 0.510806 0.453833 -v 14014 24861 5722.2 -vt 0.496675 0.453833 -v 14014 24981 5722.2 -vt 0.496675 0.452185 -v 14014 24981 3997.2 -vt 0.510806 0.452185 -o mesh2833 -s off -f 13567/13567/13567 13568/13568/13568 13569/13569/13569 -f 13567/13567/13567 13569/13569/13569 13570/13570/13570 -g charts -o chart0000 -s off -f 13567/13567/13567 13568/13568/13568 13569/13569/13569 -f 13567/13567/13567 13569/13569/13569 13570/13570/13570 -v 13584.6 24906 5722.2 -vt 0.899002 0.0333882 -v 13558.4 24906 5722.2 -vt 0.899002 0.0325639 -v 13558.4 24906 3997.2 -vt 0.884871 0.0325639 -v 13584.6 24906 3997.2 -vt 0.884871 0.0333882 -o mesh2834 -s off -f 13571/13571/13571 13572/13572/13572 13573/13573/13573 -f 13571/13571/13571 13573/13573/13573 13574/13574/13574 -g charts -o chart0000 -s off -f 13571/13571/13571 13572/13572/13572 13573/13573/13573 -f 13571/13571/13571 13573/13573/13573 13574/13574/13574 -v 13558.4 24906 5722.2 -vt 0.754364 0.798434 -v 13558.4 24936 5722.2 -vt 0.754364 0.797609 -v 13558.4 24936 3997.2 -vt 0.740233 0.797609 -v 13558.4 24906 3997.2 -vt 0.740233 0.798434 -o mesh2835 -s off -f 13575/13575/13575 13576/13576/13576 13577/13577/13577 -f 13575/13575/13575 13577/13577/13577 13578/13578/13578 -g charts -o chart0000 -s off -f 13575/13575/13575 13576/13576/13576 13577/13577/13577 -f 13575/13575/13575 13577/13577/13577 13578/13578/13578 -v 13993.6 24936 4869.82 -vt 0.998753 0.388706 -v 13993.6 24906 4869.82 -vt 0.998753 0.38953 -v 13993.6 24906 4849.58 -vt 0.999584 0.38953 -v 13993.6 24936 4849.58 -vt 0.999584 0.388706 -o mesh2836 -s off -f 13579/13579/13579 13580/13580/13580 13581/13581/13581 -f 13579/13579/13579 13581/13581/13581 13582/13582/13582 -g charts -o chart0000 -s off -f 13579/13579/13579 13580/13580/13580 13581/13581/13581 -f 13579/13579/13579 13581/13581/13581 13582/13582/13582 -v 13129 24936 4869.82 -vt 0.0128844 0.244435 -v 13129 24906 4869.82 -vt 0.0128844 0.24526 -v 13993.6 24906 4869.82 -vt 0.00540316 0.24526 -v 13993.6 24936 4869.82 -vt 0.00540316 0.244435 -o mesh2837 -s off -f 13583/13583/13583 13584/13584/13584 13585/13585/13585 -f 13583/13583/13583 13585/13585/13585 13586/13586/13586 -g charts -o chart0000 -s off -f 13583/13583/13583 13584/13584/13584 13585/13585/13585 -f 13583/13583/13583 13585/13585/13585 13586/13586/13586 -v 13129 24906 4869.82 -vt 0.345386 0.612943 -v 13129 24906 4849.58 -vt 0.345386 0.613767 -v 13993.6 24906 4849.58 -vt 0.337905 0.613767 -v 13993.6 24906 4869.82 -vt 0.337905 0.612943 -o mesh2838 -s off -f 13587/13587/13587 13588/13588/13588 13589/13589/13589 -f 13587/13587/13587 13589/13589/13589 13590/13590/13590 -g charts -o chart0000 -s off -f 13587/13587/13587 13588/13588/13588 13589/13589/13589 -f 13587/13587/13587 13589/13589/13589 13590/13590/13590 -v 13129 24906 4849.58 -vt 0.503325 0.460429 -v 13129 24936 4849.58 -vt 0.503325 0.461253 -v 13993.6 24936 4849.58 -vt 0.495844 0.461253 -v 13993.6 24906 4849.58 -vt 0.495844 0.460429 -o mesh2839 -s off -f 13591/13591/13591 13592/13592/13592 13593/13593/13593 -f 13591/13591/13591 13593/13593/13593 13594/13594/13594 -g charts -o chart0000 -s off -f 13591/13591/13591 13592/13592/13592 13593/13593/13593 -f 13591/13591/13591 13593/13593/13593 13594/13594/13594 -v 13129 24936 4849.58 -vt 0.160848 0.697856 -v 13129 24936 4869.82 -vt 0.161679 0.697856 -v 13993.6 24936 4869.82 -vt 0.161679 0.690437 -v 13993.6 24936 4849.58 -vt 0.160848 0.690437 -o mesh2840 -s off -f 13595/13595/13595 13596/13596/13596 13597/13597/13597 -f 13595/13595/13595 13597/13597/13597 13598/13598/13598 -g charts -o chart0000 -s off -f 13595/13595/13595 13596/13596/13596 13597/13597/13597 -f 13595/13595/13595 13597/13597/13597 13598/13598/13598 -v 13584.6 24936 5722.2 -vt 0.952203 0.604699 -v 13584.6 24906 5722.2 -vt 0.951372 0.604699 -v 13584.6 24906 3997.2 -vt 0.951372 0.590684 -v 13584.6 24936 3997.2 -vt 0.952203 0.590684 -o mesh2841 -s off -f 13599/13599/13599 13600/13600/13600 13601/13601/13601 -f 13599/13599/13599 13601/13601/13601 13602/13602/13602 -g charts -o chart0000 -s off -f 13599/13599/13599 13600/13600/13600 13601/13601/13601 -f 13599/13599/13599 13601/13601/13601 13602/13602/13602 -v 13558.4 24936 5722.2 -vt 0.0353283 0.470321 -v 13584.6 24936 5722.2 -vt 0.0344971 0.470321 -v 13584.6 24936 3997.2 -vt 0.0344971 0.456307 -v 13558.4 24936 3997.2 -vt 0.0353283 0.456307 -o mesh2842 -s off -f 13603/13603/13603 13604/13604/13604 13605/13605/13605 -f 13603/13603/13603 13605/13605/13605 13606/13606/13606 -g charts -o chart0000 -s off -f 13603/13603/13603 13604/13604/13604 13605/13605/13605 -f 13603/13603/13603 13605/13605/13605 13606/13606/13606 -v -9431 16986 3539.7 -vt 0.223192 0.669827 -v -9468.5 16986 3577.2 -vt 0.222874 0.669002 -v -10511 16986 3539.7 -vt 0.214048 0.669827 -v -10473.5 16986 3577.2 -vt 0.214366 0.669002 -o mesh2843 -s off -f 13607/13607/13607 13608/13608/13608 13609/13609/13609 -f 13610/13610/13610 13609/13609/13609 13608/13608/13608 -g charts -o chart0000 -s off -f 13607/13607/13607 13608/13608/13608 13609/13609/13609 -f 13610/13610/13610 13609/13609/13609 13608/13608/13608 -v -9468.5 16986 3577.2 -vt 0.191913 0.48681 -v -9431 16986 3539.7 -vt 0.191604 0.487634 -v -9431 16986 5459.7 -vt 0.207398 0.487634 -o mesh2844 -s off -f 13611/13611/13611 13612/13612/13612 13613/13613/13613 -g charts -o chart0000 -s off -f 13611/13611/13611 13612/13612/13612 13613/13613/13613 -v -9468.5 16986 3577.2 -vt 0.16251 0.555235 -v -9431 16986 5459.7 -vt 0.16251 0.570074 -v -9468.5 16986 5422.2 -vt 0.161679 0.569773 -o mesh2845 -s off -f 13614/13614/13614 13615/13615/13615 13616/13616/13616 -g charts -o chart0000 -s off -f 13614/13614/13614 13615/13615/13615 13616/13616/13616 -v -9468.5 16986 5422.2 -vt 0.915628 0.256284 -v -9431 16986 5459.7 -vt 0.916459 0.255977 -v -10473.5 16986 5422.2 -vt 0.916459 0.264221 -o mesh2846 -s off -f 13617/13617/13617 13618/13618/13618 13619/13619/13619 -g charts -o chart0000 -s off -f 13617/13617/13617 13618/13618/13618 13619/13619/13619 -v -10511 16986 3539.7 -vt 0.223192 0.764633 -v -10473.5 16986 3577.2 -vt 0.222883 0.763809 -v -10511 16986 5459.7 -vt 0.207398 0.764633 -o mesh2847 -s off -f 13620/13620/13620 13621/13621/13621 13622/13622/13622 -g charts -o chart0000 -s off -f 13620/13620/13620 13621/13621/13621 13622/13622/13622 -v -10511 16986 5459.7 -vt 0.953034 0.919621 -v -10473.5 16986 3577.2 -vt 0.967997 0.919621 -v -10473.5 16986 5422.2 -vt 0.953338 0.918796 -o mesh2848 -s off -f 13623/13623/13623 13624/13624/13624 13625/13625/13625 -g charts -o chart0000 -s off -f 13623/13623/13623 13624/13624/13624 13625/13625/13625 -v -10511 16986 5459.7 -vt 0.447631 0.500824 -v -10473.5 16986 5422.2 -vt 0.4468 0.500509 -v -9431 16986 5459.7 -vt 0.447631 0.491756 -o mesh2849 -s off -f 13626/13626/13626 13627/13627/13627 13628/13628/13628 -g charts -o chart0000 -s off -f 13626/13626/13626 13627/13627/13627 13628/13628/13628 -v -10511 17151 3539.7 -vt 0.628013 0.767106 -v -10473.5 17151 3577.2 -vt 0.628844 0.767421 -v -9431 17151 3539.7 -vt 0.628013 0.776175 -v -9468.5 17151 3577.2 -vt 0.628844 0.77586 -o mesh2850 -s off -f 13629/13629/13629 13630/13630/13630 13631/13631/13631 -f 13632/13632/13632 13631/13631/13631 13630/13630/13630 -g charts -o chart0000 -s off -f 13629/13629/13629 13630/13630/13630 13631/13631/13631 -f 13632/13632/13632 13631/13631/13631 13630/13630/13630 -v -10473.5 17151 3577.2 -vt 0.46789 0.615416 -v -10511 17151 3539.7 -vt 0.467581 0.616241 -v -10511 17151 5459.7 -vt 0.483375 0.616241 -o mesh2851 -s off -f 13633/13633/13633 13634/13634/13634 13635/13635/13635 -g charts -o chart0000 -s off -f 13633/13633/13633 13634/13634/13634 13635/13635/13635 -v -10473.5 17151 3577.2 -vt 0.820033 0.470322 -v -10511 17151 5459.7 -vt 0.820033 0.485161 -v -10473.5 17151 5422.2 -vt 0.819202 0.484859 -o mesh2852 -s off -f 13636/13636/13636 13637/13637/13637 13638/13638/13638 -g charts -o chart0000 -s off -f 13636/13636/13636 13637/13637/13637 13638/13638/13638 -v -10473.5 17151 5422.2 -vt 0.938903 0.230727 -v -10511 17151 5459.7 -vt 0.939734 0.23042 -v -9468.5 17151 5422.2 -vt 0.939734 0.238664 -o mesh2853 -s off -f 13639/13639/13639 13640/13640/13640 13641/13641/13641 -g charts -o chart0000 -s off -f 13639/13639/13639 13640/13640/13640 13641/13641/13641 -v -9431 17151 3539.7 -vt 0.435993 0.297197 -v -9468.5 17151 3577.2 -vt 0.435162 0.296891 -v -9431 17151 5459.7 -vt 0.435993 0.281533 -o mesh2854 -s off -f 13642/13642/13642 13643/13643/13643 13644/13644/13644 -g charts -o chart0000 -s off -f 13642/13642/13642 13643/13643/13643 13644/13644/13644 -v -9431 17151 5459.7 -vt 0.885702 0.260099 -v -9468.5 17151 3577.2 -vt 0.885702 0.274938 -v -9468.5 17151 5422.2 -vt 0.884871 0.2604 -o mesh2855 -s off -f 13645/13645/13645 13646/13646/13646 13647/13647/13647 -g charts -o chart0000 -s off -f 13645/13645/13645 13646/13646/13646 13647/13647/13647 -v -9431 17151 5459.7 -vt 0.0253532 0.918796 -v -9468.5 17151 5422.2 -vt 0.0250356 0.917972 -v -10511 17151 5459.7 -vt 0.0162095 0.918796 -o mesh2856 -s off -f 13648/13648/13648 13649/13649/13649 13650/13650/13650 -g charts -o chart0000 -s off -f 13648/13648/13648 13649/13649/13649 13650/13650/13650 -v -10511 16986 5459.7 -vt 0.0561096 0.202391 -v -9431 16986 5459.7 -vt 0.0561096 0.193322 -v -9431 17151 5459.7 -vt 0.0544472 0.193322 -v -10511 17151 5459.7 -vt 0.0544472 0.202391 -o mesh2857 -s off -f 13651/13651/13651 13652/13652/13652 13653/13653/13653 -f 13651/13651/13651 13653/13653/13653 13654/13654/13654 -g charts -o chart0000 -s off -f 13651/13651/13651 13652/13652/13652 13653/13653/13653 -f 13651/13651/13651 13653/13653/13653 13654/13654/13654 -v -9431 16986 5459.7 -vt 0.215711 0.49258 -v -9431 16986 3539.7 -vt 0.215711 0.508244 -v -9431 17151 3539.7 -vt 0.217373 0.508244 -v -9431 17151 5459.7 -vt 0.217373 0.49258 -o mesh2858 -s off -f 13655/13655/13655 13656/13656/13656 13657/13657/13657 -f 13655/13655/13655 13657/13657/13657 13658/13658/13658 -g charts -o chart0000 -s off -f 13655/13655/13655 13656/13656/13656 13657/13657/13657 -f 13655/13655/13655 13657/13657/13657 13658/13658/13658 -v -9431 16986 3539.7 -vt 0.615544 0.593157 -v -10511 16986 3539.7 -vt 0.624688 0.593157 -v -10511 17151 3539.7 -vt 0.624688 0.594806 -v -9431 17151 3539.7 -vt 0.615544 0.594806 -o mesh2859 -s off -f 13659/13659/13659 13660/13660/13660 13661/13661/13661 -f 13659/13659/13659 13661/13661/13661 13662/13662/13662 -g charts -o chart0000 -s off -f 13659/13659/13659 13660/13660/13660 13661/13661/13661 -f 13659/13659/13659 13661/13661/13661 13662/13662/13662 -v -10511 16986 3539.7 -vt 0.911471 0.026793 -v -10511 16986 5459.7 -vt 0.911471 0.0111294 -v -10511 17151 5459.7 -vt 0.909809 0.0111294 -v -10511 17151 3539.7 -vt 0.909809 0.026793 -o mesh2860 -s off -f 13663/13663/13663 13664/13664/13664 13665/13665/13665 -f 13663/13663/13663 13665/13665/13665 13666/13666/13666 -g charts -o chart0000 -s off -f 13663/13663/13663 13664/13664/13664 13665/13665/13665 -f 13663/13663/13663 13665/13665/13665 13666/13666/13666 -v -10473.5 17151 3577.2 -vt 0.447631 0.547815 -v -10473.5 17106 3577.2 -vt 0.448084 0.547815 -v -9468.5 17106 3577.2 -vt 0.448084 0.539571 -v -9468.5 17151 3577.2 -vt 0.447631 0.539571 -v -10473.5 16986 3577.2 -vt 0.449293 0.547815 -v -9468.5 16986 3577.2 -vt 0.449293 0.539571 -o mesh2861 -s off -f 13667/13667/13667 13668/13668/13668 13669/13669/13669 -f 13667/13667/13667 13669/13669/13669 13670/13670/13670 -f 13671/13671/13671 13672/13672/13672 13669/13669/13669 -f 13671/13671/13671 13669/13669/13669 13668/13668/13668 -g charts -o chart0000 -s off -f 13667/13667/13667 13668/13668/13668 13669/13669/13669 -f 13667/13667/13667 13669/13669/13669 13670/13670/13670 -f 13671/13671/13671 13672/13672/13672 13669/13669/13669 -f 13671/13671/13671 13669/13669/13669 13668/13668/13668 -v -9468.5 17151 3577.2 -vt 0.0976724 0.66488 -v -9468.5 17106 3577.2 -vt 0.0976724 0.66533 -v -9468.5 17106 5422.2 -vt 0.0827099 0.66533 -v -9468.5 17151 5422.2 -vt 0.0827099 0.66488 -v -9468.5 16986 3577.2 -vt 0.0976724 0.666529 -v -9468.5 16986 5422.2 -vt 0.0827099 0.666529 -o mesh2862 -s off -f 13673/13673/13673 13674/13674/13674 13675/13675/13675 -f 13673/13673/13673 13675/13675/13675 13676/13676/13676 -f 13677/13677/13677 13678/13678/13678 13675/13675/13675 -f 13677/13677/13677 13675/13675/13675 13674/13674/13674 -g charts -o chart0000 -s off -f 13673/13673/13673 13674/13674/13674 13675/13675/13675 -f 13673/13673/13673 13675/13675/13675 13676/13676/13676 -f 13677/13677/13677 13678/13678/13678 13675/13675/13675 -f 13677/13677/13677 13675/13675/13675 13674/13674/13674 -v -9468.5 17151 5422.2 -vt 0.0128844 0.964138 -v -9468.5 17106 5422.2 -vt 0.012431 0.964138 -v -10473.5 17106 5422.2 -vt 0.012431 0.955894 -v -10473.5 17151 5422.2 -vt 0.0128844 0.955894 -v -9468.5 16986 5422.2 -vt 0.0112219 0.964138 -v -10473.5 16986 5422.2 -vt 0.0112219 0.955894 -o mesh2863 -s off -f 13679/13679/13679 13680/13680/13680 13681/13681/13681 -f 13679/13679/13679 13681/13681/13681 13682/13682/13682 -f 13683/13683/13683 13684/13684/13684 13681/13681/13681 -f 13683/13683/13683 13681/13681/13681 13680/13680/13680 -g charts -o chart0000 -s off -f 13679/13679/13679 13680/13680/13680 13681/13681/13681 -f 13679/13679/13679 13681/13681/13681 13682/13682/13682 -f 13683/13683/13683 13684/13684/13684 13681/13681/13681 -f 13683/13683/13683 13681/13681/13681 13680/13680/13680 -v -10473.5 17151 5422.2 -vt 0.265586 0.475268 -v -10473.5 17106 5422.2 -vt 0.265586 0.474818 -v -10473.5 17106 3577.2 -vt 0.250623 0.474818 -v -10473.5 17151 3577.2 -vt 0.250623 0.475268 -v -10473.5 16986 5422.2 -vt 0.265586 0.473619 -v -10473.5 16986 3577.2 -vt 0.250623 0.473619 -o mesh2864 -s off -f 13685/13685/13685 13686/13686/13686 13687/13687/13687 -f 13685/13685/13685 13687/13687/13687 13688/13688/13688 -f 13689/13689/13689 13690/13690/13690 13687/13687/13687 -f 13689/13689/13689 13687/13687/13687 13686/13686/13686 -g charts -o chart0000 -s off -f 13685/13685/13685 13686/13686/13686 13687/13687/13687 -f 13685/13685/13685 13687/13687/13687 13688/13688/13688 -f 13689/13689/13689 13690/13690/13690 13687/13687/13687 -f 13689/13689/13689 13687/13687/13687 13686/13686/13686 -v -10473.5 17106 3577.2 -vt 0.564007 0.92127 -v -10413.5 17106 3637.2 -vt 0.564838 0.921762 -v -9468.5 17106 3577.2 -vt 0.564007 0.929514 -v -9528.5 17106 3637.2 -vt 0.564838 0.929021 -o mesh2865 -s off -f 13691/13691/13691 13692/13692/13692 13693/13693/13693 -f 13694/13694/13694 13693/13693/13693 13692/13692/13692 -g charts -o chart0000 -s off -f 13691/13691/13691 13692/13692/13692 13693/13693/13693 -f 13694/13694/13694 13693/13693/13693 13692/13692/13692 -v -10413.5 17106 3637.2 -vt 0.891177 0.137263 -v -10473.5 17106 3577.2 -vt 0.89069 0.138087 -v -10473.5 17106 5422.2 -vt 0.905652 0.138087 -o mesh2866 -s off -f 13695/13695/13695 13696/13696/13696 13697/13697/13697 -g charts -o chart0000 -s off -f 13695/13695/13695 13696/13696/13696 13697/13697/13697 -v -10413.5 17106 3637.2 -vt 0.633832 0.65169 -v -10473.5 17106 5422.2 -vt 0.633832 0.665705 -v -10413.5 17106 5362.2 -vt 0.633001 0.665218 -o mesh2867 -s off -f 13698/13698/13698 13699/13699/13699 13700/13700/13700 -g charts -o chart0000 -s off -f 13698/13698/13698 13699/13699/13699 13700/13700/13700 -v -10413.5 17106 5362.2 -vt 0.387781 0.803055 -v -10473.5 17106 5422.2 -vt 0.388612 0.802556 -v -9528.5 17106 5362.2 -vt 0.388612 0.809975 -o mesh2868 -s off -f 13701/13701/13701 13702/13702/13702 13703/13703/13703 -g charts -o chart0000 -s off -f 13701/13701/13701 13702/13702/13702 13703/13703/13703 -v -9468.5 17106 3577.2 -vt 0.875727 0.0828523 -v -9528.5 17106 3637.2 -vt 0.874896 0.0823698 -v -9468.5 17106 5422.2 -vt 0.875727 0.0680132 -o mesh2869 -s off -f 13704/13704/13704 13705/13705/13705 13706/13706/13706 -g charts -o chart0000 -s off -f 13704/13704/13704 13705/13705/13705 13706/13706/13706 -v -9468.5 17106 5422.2 -vt 0.514963 0.537098 -v -9528.5 17106 3637.2 -vt 0.529094 0.537098 -v -9528.5 17106 5362.2 -vt 0.515453 0.536274 -o mesh2870 -s off -f 13707/13707/13707 13708/13708/13708 13709/13709/13709 -g charts -o chart0000 -s off -f 13707/13707/13707 13708/13708/13708 13709/13709/13709 -v -9468.5 17106 5422.2 -vt 0.58645 0.984748 -v -9528.5 17106 5362.2 -vt 0.585619 0.984256 -v -10473.5 17106 5422.2 -vt 0.58645 0.976505 -o mesh2871 -s off -f 13710/13710/13710 13711/13711/13711 13712/13712/13712 -g charts -o chart0000 -s off -f 13710/13710/13710 13711/13711/13711 13712/13712/13712 -v -9528.5 16986 5362.2 -vt 0.936409 0.65911 -v -9957.87 17031 5362.2 -vt 0.935785 0.65551 -v -9528.5 17106 5362.2 -vt 0.934746 0.65911 -v -10413.5 16986 5362.2 -vt 0.936409 0.65169 -v -9984.12 17031 5362.2 -vt 0.935785 0.65529 -v -9984.12 17061 5362.2 -vt 0.93537 0.65529 -v -9957.87 17061 5362.2 -vt 0.93537 0.65551 -v -10413.5 17106 5362.2 -vt 0.934746 0.65169 -o mesh2872 -s off -f 13713/13713/13713 13714/13714/13714 13715/13715/13715 -f 13714/13714/13714 13713/13713/13713 13716/13716/13716 -f 13714/13714/13714 13716/13716/13716 13717/13717/13717 -f 13717/13717/13717 13716/13716/13716 13718/13718/13718 -f 13715/13715/13715 13719/13719/13719 13720/13720/13720 -f 13719/13719/13719 13715/13715/13715 13714/13714/13714 -f 13720/13720/13720 13719/13719/13719 13718/13718/13718 -f 13720/13720/13720 13718/13718/13718 13716/13716/13716 -g charts -o chart0000 -s off -f 13713/13713/13713 13714/13714/13714 13715/13715/13715 -f 13714/13714/13714 13713/13713/13713 13716/13716/13716 -f 13714/13714/13714 13716/13716/13716 13717/13717/13717 -f 13717/13717/13717 13716/13716/13716 13718/13718/13718 -f 13715/13715/13715 13719/13719/13719 13720/13720/13720 -f 13719/13719/13719 13715/13715/13715 13714/13714/13714 -f 13720/13720/13720 13719/13719/13719 13718/13718/13718 -f 13720/13720/13720 13718/13718/13718 13716/13716/13716 -v -10413.5 17106 5362.2 -vt 0.224023 0.883347 -v -10413.5 17061 4509.82 -vt 0.224647 0.876422 -v -10413.5 17106 3637.2 -vt 0.224023 0.869332 -v -10413.5 16986 5362.2 -vt 0.225686 0.883347 -v -10413.5 17031 4509.82 -vt 0.225062 0.876422 -v -10413.5 17031 4489.58 -vt 0.225062 0.876257 -v -10413.5 17061 4489.58 -vt 0.224647 0.876257 -v -10413.5 16986 3637.2 -vt 0.225686 0.869332 -o mesh2873 -s off -f 13721/13721/13721 13722/13722/13722 13723/13723/13723 -f 13722/13722/13722 13721/13721/13721 13724/13724/13724 -f 13722/13722/13722 13724/13724/13724 13725/13725/13725 -f 13725/13725/13725 13724/13724/13724 13726/13726/13726 -f 13723/13723/13723 13727/13727/13727 13728/13728/13728 -f 13727/13727/13727 13723/13723/13723 13722/13722/13722 -f 13728/13728/13728 13727/13727/13727 13726/13726/13726 -f 13728/13728/13728 13726/13726/13726 13724/13724/13724 -g charts -o chart0000 -s off -f 13721/13721/13721 13722/13722/13722 13723/13723/13723 -f 13722/13722/13722 13721/13721/13721 13724/13724/13724 -f 13722/13722/13722 13724/13724/13724 13725/13725/13725 -f 13725/13725/13725 13724/13724/13724 13726/13726/13726 -f 13723/13723/13723 13727/13727/13727 13728/13728/13728 -f 13727/13727/13727 13723/13723/13723 13722/13722/13722 -f 13728/13728/13728 13727/13727/13727 13726/13726/13726 -f 13728/13728/13728 13726/13726/13726 13724/13724/13724 -v -9528.5 17106 3637.2 -vt 0.815046 0.0218466 -v -9957.87 17061 3637.2 -vt 0.815669 0.0182468 -v -9528.5 16986 3637.2 -vt 0.816708 0.0218466 -v -10413.5 17106 3637.2 -vt 0.815046 0.014427 -v -9984.12 17061 3637.2 -vt 0.815669 0.0180268 -v -9984.12 17031 3637.2 -vt 0.816085 0.0180268 -v -9957.87 17031 3637.2 -vt 0.816085 0.0182468 -v -10413.5 16986 3637.2 -vt 0.816708 0.014427 -o mesh2874 -s off -f 13729/13729/13729 13730/13730/13730 13731/13731/13731 -f 13730/13730/13730 13729/13729/13729 13732/13732/13732 -f 13730/13730/13730 13732/13732/13732 13733/13733/13733 -f 13733/13733/13733 13732/13732/13732 13734/13734/13734 -f 13731/13731/13731 13735/13735/13735 13736/13736/13736 -f 13735/13735/13735 13731/13731/13731 13730/13730/13730 -f 13736/13736/13736 13735/13735/13735 13734/13734/13734 -f 13736/13736/13736 13734/13734/13734 13732/13732/13732 -g charts -o chart0000 -s off -f 13729/13729/13729 13730/13730/13730 13731/13731/13731 -f 13730/13730/13730 13729/13729/13729 13732/13732/13732 -f 13730/13730/13730 13732/13732/13732 13733/13733/13733 -f 13733/13733/13733 13732/13732/13732 13734/13734/13734 -f 13731/13731/13731 13735/13735/13735 13736/13736/13736 -f 13735/13735/13735 13731/13731/13731 13730/13730/13730 -f 13736/13736/13736 13735/13735/13735 13734/13734/13734 -f 13736/13736/13736 13734/13734/13734 13732/13732/13732 -v -9528.5 16986 3637.2 -vt 0.524106 0.82399 -v -9528.5 16986 5362.2 -vt 0.509975 0.82399 -v -9528.5 17106 5362.2 -vt 0.509975 0.822341 -v -9528.5 17106 3637.2 -vt 0.524106 0.822341 -o mesh2875 -s off -f 13737/13737/13737 13738/13738/13738 13739/13739/13739 -f 13737/13737/13737 13739/13739/13739 13740/13740/13740 -g charts -o chart0000 -s off -f 13737/13737/13737 13738/13738/13738 13739/13739/13739 -f 13737/13737/13737 13739/13739/13739 13740/13740/13740 -v -9957.87 17031 5362.2 -vt 0.63882 0.815746 -v -9984.12 17031 5362.2 -vt 0.637988 0.815746 -v -9984.12 17031 3637.2 -vt 0.637988 0.801731 -v -9957.87 17031 3637.2 -vt 0.63882 0.801731 -o mesh2876 -s off -f 13741/13741/13741 13742/13742/13742 13743/13743/13743 -f 13741/13741/13741 13743/13743/13743 13744/13744/13744 -g charts -o chart0000 -s off -f 13741/13741/13741 13742/13742/13742 13743/13743/13743 -f 13741/13741/13741 13743/13743/13743 13744/13744/13744 -v -9984.12 17031 5362.2 -vt 0.333749 0.954246 -v -9984.12 17061 5362.2 -vt 0.332918 0.954246 -v -9984.12 17061 3637.2 -vt 0.332918 0.940231 -v -9984.12 17031 3637.2 -vt 0.333749 0.940231 -o mesh2877 -s off -f 13745/13745/13745 13746/13746/13746 13747/13747/13747 -f 13745/13745/13745 13747/13747/13747 13748/13748/13748 -g charts -o chart0000 -s off -f 13745/13745/13745 13746/13746/13746 13747/13747/13747 -f 13745/13745/13745 13747/13747/13747 13748/13748/13748 -v -9548.86 17061 4509.82 -vt 0.0120532 0.834707 -v -9548.86 17031 4509.82 -vt 0.0120532 0.835532 -v -9548.86 17031 4489.58 -vt 0.0128844 0.835532 -v -9548.86 17061 4489.58 -vt 0.0128844 0.834707 -o mesh2878 -s off -f 13749/13749/13749 13750/13750/13750 13751/13751/13751 -f 13749/13749/13749 13751/13751/13751 13752/13752/13752 -g charts -o chart0000 -s off -f 13749/13749/13749 13750/13750/13750 13751/13751/13751 -f 13749/13749/13749 13751/13751/13751 13752/13752/13752 -v -10413.5 17061 4509.82 -vt 0.406068 0.629431 -v -10413.5 17031 4509.82 -vt 0.406899 0.629431 -v -9548.86 17031 4509.82 -vt 0.406899 0.622012 -v -9548.86 17061 4509.82 -vt 0.406068 0.622012 -o mesh2879 -s off -f 13753/13753/13753 13754/13754/13754 13755/13755/13755 -f 13753/13753/13753 13755/13755/13755 13756/13756/13756 -g charts -o chart0000 -s off -f 13753/13753/13753 13754/13754/13754 13755/13755/13755 -f 13753/13753/13753 13755/13755/13755 13756/13756/13756 -v -10413.5 17031 4509.82 -vt 0.264755 0.985573 -v -10413.5 17031 4489.58 -vt 0.265586 0.985573 -v -9548.86 17031 4489.58 -vt 0.265586 0.978153 -v -9548.86 17031 4509.82 -vt 0.264755 0.978153 -o mesh2880 -s off -f 13757/13757/13757 13758/13758/13758 13759/13759/13759 -f 13757/13757/13757 13759/13759/13759 13760/13760/13760 -g charts -o chart0000 -s off -f 13757/13757/13757 13758/13758/13758 13759/13759/13759 -f 13757/13757/13757 13759/13759/13759 13760/13760/13760 -v -10413.5 17031 4489.58 -vt 0.651288 0.635202 -v -10413.5 17061 4489.58 -vt 0.651288 0.636026 -v -9548.86 17061 4489.58 -vt 0.643807 0.636026 -v -9548.86 17031 4489.58 -vt 0.643807 0.635202 -o mesh2881 -s off -f 13761/13761/13761 13762/13762/13762 13763/13763/13763 -f 13761/13761/13761 13763/13763/13763 13764/13764/13764 -g charts -o chart0000 -s off -f 13761/13761/13761 13762/13762/13762 13763/13763/13763 -f 13761/13761/13761 13763/13763/13763 13764/13764/13764 -v -10413.5 17061 4489.58 -vt 0.464256 0.99629 -v -10413.5 17061 4509.82 -vt 0.464256 0.997114 -v -9548.86 17061 4509.82 -vt 0.456775 0.997114 -v -9548.86 17061 4489.58 -vt 0.456775 0.99629 -o mesh2882 -s off -f 13765/13765/13765 13766/13766/13766 13767/13767/13767 -f 13765/13765/13765 13767/13767/13767 13768/13768/13768 -g charts -o chart0000 -s off -f 13765/13765/13765 13766/13766/13766 13767/13767/13767 -f 13765/13765/13765 13767/13767/13767 13768/13768/13768 -v -9957.87 17061 5362.2 -vt 0.440981 0.50742 -v -9957.87 17031 5362.2 -vt 0.44015 0.50742 -v -9957.87 17031 3637.2 -vt 0.44015 0.493405 -v -9957.87 17061 3637.2 -vt 0.440981 0.493405 -o mesh2883 -s off -f 13769/13769/13769 13770/13770/13770 13771/13771/13771 -f 13769/13769/13769 13771/13771/13771 13772/13772/13772 -g charts -o chart0000 -s off -f 13769/13769/13769 13770/13770/13770 13771/13771/13771 -f 13769/13769/13769 13771/13771/13771 13772/13772/13772 -v -9984.12 17061 5362.2 -vt 0.908146 0.993817 -v -9957.87 17061 5362.2 -vt 0.908146 0.992993 -v -9957.87 17061 3637.2 -vt 0.894015 0.992993 -v -9984.12 17061 3637.2 -vt 0.894015 0.993817 -o mesh2884 -s off -f 13773/13773/13773 13774/13774/13774 13775/13775/13775 -f 13773/13773/13773 13775/13775/13775 13776/13776/13776 -g charts -o chart0000 -s off -f 13773/13773/13773 13774/13774/13774 13775/13775/13775 -f 13773/13773/13773 13775/13775/13775 13776/13776/13776 -v -11681 16986 3539.7 -vt 0.790939 0.532976 -v -11718.5 16986 3577.2 -vt 0.790622 0.532152 -v -12761 16986 3539.7 -vt 0.781796 0.532976 -v -12723.5 16986 3577.2 -vt 0.782113 0.532152 -o mesh2885 -s off -f 13777/13777/13777 13778/13778/13778 13779/13779/13779 -f 13780/13780/13780 13779/13779/13779 13778/13778/13778 -g charts -o chart0000 -s off -f 13777/13777/13777 13778/13778/13778 13779/13779/13779 -f 13780/13780/13780 13779/13779/13779 13778/13778/13778 -v -11718.5 16986 3577.2 -vt 0.703966 0.593982 -v -11681 16986 3539.7 -vt 0.703658 0.594806 -v -11681 16986 5459.7 -vt 0.719451 0.594806 -o mesh2886 -s off -f 13781/13781/13781 13782/13782/13782 13783/13783/13783 -g charts -o chart0000 -s off -f 13781/13781/13781 13782/13782/13782 13783/13783/13783 -v -11718.5 16986 3577.2 -vt 0.0785536 0.60305 -v -11681 16986 5459.7 -vt 0.0935161 0.60305 -v -11718.5 16986 5422.2 -vt 0.0932122 0.602226 -o mesh2887 -s off -f 13784/13784/13784 13785/13785/13785 13786/13786/13786 -g charts -o chart0000 -s off -f 13784/13784/13784 13785/13785/13785 13786/13786/13786 -v -11718.5 16986 5422.2 -vt 0.675395 0.655294 -v -11681 16986 5459.7 -vt 0.676226 0.654988 -v -12723.5 16986 5422.2 -vt 0.676226 0.663232 -o mesh2888 -s off -f 13787/13787/13787 13788/13788/13788 13789/13789/13789 -g charts -o chart0000 -s off -f 13787/13787/13787 13788/13788/13788 13789/13789/13789 -v -12761 16986 3539.7 -vt 0.436825 0.27906 -v -12723.5 16986 3577.2 -vt 0.435993 0.278754 -v -12761 16986 5459.7 -vt 0.436825 0.263397 -o mesh2889 -s off -f 13790/13790/13790 13791/13791/13791 13792/13792/13792 -g charts -o chart0000 -s off -f 13790/13790/13790 13791/13791/13791 13792/13792/13792 -v -12761 16986 5459.7 -vt 0.810058 0.481039 -v -12723.5 16986 3577.2 -vt 0.810058 0.495878 -v -12723.5 16986 5422.2 -vt 0.809227 0.48134 -o mesh2890 -s off -f 13793/13793/13793 13794/13794/13794 13795/13795/13795 -g charts -o chart0000 -s off -f 13793/13793/13793 13794/13794/13794 13795/13795/13795 -v -12761 16986 5459.7 -vt 0.358687 0.933636 -v -12723.5 16986 5422.2 -vt 0.358369 0.932811 -v -11681 16986 5459.7 -vt 0.349543 0.933636 -o mesh2891 -s off -f 13796/13796/13796 13797/13797/13797 13798/13798/13798 -g charts -o chart0000 -s off -f 13796/13796/13796 13797/13797/13797 13798/13798/13798 -v -12761 17151 3539.7 -vt 0.729426 0.653339 -v -12723.5 17151 3577.2 -vt 0.729744 0.654163 -v -11681 17151 3539.7 -vt 0.73857 0.653339 -v -11718.5 17151 3577.2 -vt 0.738253 0.654163 -o mesh2892 -s off -f 13799/13799/13799 13800/13800/13800 13801/13801/13801 -f 13802/13802/13802 13801/13801/13801 13800/13800/13800 -g charts -o chart0000 -s off -f 13799/13799/13799 13800/13800/13800 13801/13801/13801 -f 13802/13802/13802 13801/13801/13801 13800/13800/13800 -v -12723.5 17151 3577.2 -vt 0.941397 0.621493 -v -12761 17151 3539.7 -vt 0.942228 0.621187 -v -12761 17151 5459.7 -vt 0.942228 0.636851 -o mesh2893 -s off -f 13803/13803/13803 13804/13804/13804 13805/13805/13805 -g charts -o chart0000 -s off -f 13803/13803/13803 13804/13804/13804 13805/13805/13805 -v -12723.5 17151 3577.2 -vt 0.731089 0.959192 -v -12761 17151 5459.7 -vt 0.746051 0.959192 -v -12723.5 17151 5422.2 -vt 0.745748 0.958368 -o mesh2894 -s off -f 13806/13806/13806 13807/13807/13807 13808/13808/13808 -g charts -o chart0000 -s off -f 13806/13806/13806 13807/13807/13807 13808/13808/13808 -v -12723.5 17151 5422.2 -vt 0.946384 0.207644 -v -12761 17151 5459.7 -vt 0.947215 0.207337 -v -11718.5 17151 5422.2 -vt 0.947215 0.215581 -o mesh2895 -s off -f 13809/13809/13809 13810/13810/13810 13811/13811/13811 -g charts -o chart0000 -s off -f 13809/13809/13809 13810/13810/13810 13811/13811/13811 -v -11681 17151 3539.7 -vt 0.704489 0.349959 -v -11718.5 17151 3577.2 -vt 0.703658 0.349653 -v -11681 17151 5459.7 -vt 0.704489 0.334295 -o mesh2896 -s off -f 13812/13812/13812 13813/13813/13813 13814/13814/13814 -g charts -o chart0000 -s off -f 13812/13812/13812 13813/13813/13813 13814/13814/13814 -v -11681 17151 5459.7 -vt 0.0369909 0.706925 -v -11718.5 17151 3577.2 -vt 0.0519534 0.706925 -v -11718.5 17151 5422.2 -vt 0.0372948 0.706101 -o mesh2897 -s off -f 13815/13815/13815 13816/13816/13816 13817/13817/13817 -g charts -o chart0000 -s off -f 13815/13815/13815 13816/13816/13816 13817/13817/13817 -v -11681 17151 5459.7 -vt 0.409393 0.545342 -v -11718.5 17151 5422.2 -vt 0.409076 0.544518 -v -12761 17151 5459.7 -vt 0.400249 0.545342 -o mesh2898 -s off -f 13818/13818/13818 13819/13819/13819 13820/13820/13820 -g charts -o chart0000 -s off -f 13818/13818/13818 13819/13819/13819 13820/13820/13820 -v -12761 16986 5459.7 -vt 0.720283 0.339241 -v -11681 16986 5459.7 -vt 0.720283 0.330173 -v -11681 17151 5459.7 -vt 0.71862 0.330173 -v -12761 17151 5459.7 -vt 0.71862 0.339241 -o mesh2899 -s off -f 13821/13821/13821 13822/13822/13822 13823/13823/13823 -f 13821/13821/13821 13823/13823/13823 13824/13824/13824 -g charts -o chart0000 -s off -f 13821/13821/13821 13822/13822/13822 13823/13823/13823 -f 13821/13821/13821 13823/13823/13823 13824/13824/13824 -v -11681 16986 5459.7 -vt 0.621363 0.537098 -v -11681 16986 3539.7 -vt 0.637157 0.537098 -v -11681 17151 3539.7 -vt 0.637157 0.538747 -v -11681 17151 5459.7 -vt 0.621363 0.538747 -o mesh2900 -s off -f 13825/13825/13825 13826/13826/13826 13827/13827/13827 -f 13825/13825/13825 13827/13827/13827 13828/13828/13828 -g charts -o chart0000 -s off -f 13825/13825/13825 13826/13826/13826 13827/13827/13827 -f 13825/13825/13825 13827/13827/13827 13828/13828/13828 -v -11681 16986 3539.7 -vt 0.00374065 0.697032 -v -12761 16986 3539.7 -vt 0.00374065 0.7061 -v -12761 17151 3539.7 -vt 0.00540308 0.7061 -v -11681 17151 3539.7 -vt 0.00540308 0.697032 -o mesh2901 -s off -f 13829/13829/13829 13830/13830/13830 13831/13831/13831 -f 13829/13829/13829 13831/13831/13831 13832/13832/13832 -g charts -o chart0000 -s off -f 13829/13829/13829 13830/13830/13830 13831/13831/13831 -f 13829/13829/13829 13831/13831/13831 13832/13832/13832 -v -12761 16986 3539.7 -vt 0.363674 0.666529 -v -12761 16986 5459.7 -vt 0.363674 0.650866 -v -12761 17151 5459.7 -vt 0.362012 0.650866 -v -12761 17151 3539.7 -vt 0.362012 0.666529 -o mesh2902 -s off -f 13833/13833/13833 13834/13834/13834 13835/13835/13835 -f 13833/13833/13833 13835/13835/13835 13836/13836/13836 -g charts -o chart0000 -s off -f 13833/13833/13833 13834/13834/13834 13835/13835/13835 -f 13833/13833/13833 13835/13835/13835 13836/13836/13836 -v -12723.5 17151 3577.2 -vt 0.867415 0.773701 -v -12723.5 17106 3577.2 -vt 0.867868 0.773701 -v -11718.5 17106 3577.2 -vt 0.867868 0.765458 -v -11718.5 17151 3577.2 -vt 0.867415 0.765458 -v -12723.5 16986 3577.2 -vt 0.869077 0.773701 -v -11718.5 16986 3577.2 -vt 0.869077 0.765458 -o mesh2903 -s off -f 13837/13837/13837 13838/13838/13838 13839/13839/13839 -f 13837/13837/13837 13839/13839/13839 13840/13840/13840 -f 13841/13841/13841 13842/13842/13842 13839/13839/13839 -f 13841/13841/13841 13839/13839/13839 13838/13838/13838 -g charts -o chart0000 -s off -f 13837/13837/13837 13838/13838/13838 13839/13839/13839 -f 13837/13837/13837 13839/13839/13839 13840/13840/13840 -f 13841/13841/13841 13842/13842/13842 13839/13839/13839 -f 13841/13841/13841 13839/13839/13839 13838/13838/13838 -v -11718.5 17151 3577.2 -vt 0.915628 0.13479 -v -11718.5 17106 3577.2 -vt 0.916081 0.13479 -v -11718.5 17106 5422.2 -vt 0.916081 0.119951 -v -11718.5 17151 5422.2 -vt 0.915628 0.119951 -v -11718.5 16986 3577.2 -vt 0.91729 0.13479 -v -11718.5 16986 5422.2 -vt 0.91729 0.119951 -o mesh2904 -s off -f 13843/13843/13843 13844/13844/13844 13845/13845/13845 -f 13843/13843/13843 13845/13845/13845 13846/13846/13846 -f 13847/13847/13847 13848/13848/13848 13845/13845/13845 -f 13847/13847/13847 13845/13845/13845 13844/13844/13844 -g charts -o chart0000 -s off -f 13843/13843/13843 13844/13844/13844 13845/13845/13845 -f 13843/13843/13843 13845/13845/13845 13846/13846/13846 -f 13847/13847/13847 13848/13848/13848 13845/13845/13845 -f 13847/13847/13847 13845/13845/13845 13844/13844/13844 -v -11718.5 17151 5422.2 -vt 0.0295095 0.204039 -v -11718.5 17106 5422.2 -vt 0.0295095 0.20359 -v -12723.5 17106 5422.2 -vt 0.021197 0.20359 -v -12723.5 17151 5422.2 -vt 0.021197 0.204039 -v -11718.5 16986 5422.2 -vt 0.0295095 0.202391 -v -12723.5 16986 5422.2 -vt 0.021197 0.202391 -o mesh2905 -s off -f 13849/13849/13849 13850/13850/13850 13851/13851/13851 -f 13849/13849/13849 13851/13851/13851 13852/13852/13852 -f 13853/13853/13853 13854/13854/13854 13851/13851/13851 -f 13853/13853/13853 13851/13851/13851 13850/13850/13850 -g charts -o chart0000 -s off -f 13849/13849/13849 13850/13850/13850 13851/13851/13851 -f 13849/13849/13849 13851/13851/13851 13852/13852/13852 -f 13853/13853/13853 13854/13854/13854 13851/13851/13851 -f 13853/13853/13853 13851/13851/13851 13850/13850/13850 -v -12723.5 17151 5422.2 -vt 0.0694097 0.89324 -v -12723.5 17106 5422.2 -vt 0.0689564 0.89324 -v -12723.5 17106 3577.2 -vt 0.0689564 0.878401 -v -12723.5 17151 3577.2 -vt 0.0694097 0.878401 -v -12723.5 16986 5422.2 -vt 0.0677473 0.89324 -v -12723.5 16986 3577.2 -vt 0.0677473 0.878401 -o mesh2906 -s off -f 13855/13855/13855 13856/13856/13856 13857/13857/13857 -f 13855/13855/13855 13857/13857/13857 13858/13858/13858 -f 13859/13859/13859 13860/13860/13860 13857/13857/13857 -f 13859/13859/13859 13857/13857/13857 13856/13856/13856 -g charts -o chart0000 -s off -f 13855/13855/13855 13856/13856/13856 13857/13857/13857 -f 13855/13855/13855 13857/13857/13857 13858/13858/13858 -f 13859/13859/13859 13860/13860/13860 13857/13857/13857 -f 13859/13859/13859 13857/13857/13857 13856/13856/13856 -v -12723.5 17106 3577.2 -vt 0.0153782 0.484336 -v -12663.5 17106 3637.2 -vt 0.0158745 0.485161 -v -11718.5 17106 3577.2 -vt 0.0236907 0.484336 -v -11778.5 17106 3637.2 -vt 0.0231944 0.485161 -o mesh2907 -s off -f 13861/13861/13861 13862/13862/13862 13863/13863/13863 -f 13864/13864/13864 13863/13863/13863 13862/13862/13862 -g charts -o chart0000 -s off -f 13861/13861/13861 13862/13862/13862 13863/13863/13863 -f 13864/13864/13864 13863/13863/13863 13862/13862/13862 -v -12663.5 17106 3637.2 -vt 0.985453 0.15176 -v -12723.5 17106 3577.2 -vt 0.986284 0.151278 -v -12723.5 17106 5422.2 -vt 0.986284 0.166117 -o mesh2908 -s off -f 13865/13865/13865 13866/13866/13866 13867/13867/13867 -g charts -o chart0000 -s off -f 13865/13865/13865 13866/13866/13866 13867/13867/13867 -v -12663.5 17106 3637.2 -vt 0.736908 0.999588 -v -12723.5 17106 5422.2 -vt 0.751039 0.999588 -v -12663.5 17106 5362.2 -vt 0.750549 0.998763 -o mesh2909 -s off -f 13868/13868/13868 13869/13869/13869 13870/13870/13870 -g charts -o chart0000 -s off -f 13868/13868/13868 13869/13869/13869 13870/13870/13870 -v -12663.5 17106 5362.2 -vt 0.704992 0.678895 -v -12723.5 17106 5422.2 -vt 0.704489 0.67972 -v -11778.5 17106 5362.2 -vt 0.71197 0.67972 -o mesh2910 -s off -f 13871/13871/13871 13872/13872/13872 13873/13873/13873 -g charts -o chart0000 -s off -f 13871/13871/13871 13872/13872/13872 13873/13873/13873 -v -11718.5 17106 3577.2 -vt 0.450125 0.326875 -v -11778.5 17106 3637.2 -vt 0.449293 0.326393 -v -11718.5 17106 5422.2 -vt 0.450125 0.312036 -o mesh2911 -s off -f 13874/13874/13874 13875/13875/13875 13876/13876/13876 -g charts -o chart0000 -s off -f 13874/13874/13874 13875/13875/13875 13876/13876/13876 -v -11718.5 17106 5422.2 -vt 0.32793 0.490931 -v -11778.5 17106 3637.2 -vt 0.342061 0.490931 -v -11778.5 17106 5362.2 -vt 0.328421 0.490107 -o mesh2912 -s off -f 13877/13877/13877 13878/13878/13878 13879/13879/13879 -g charts -o chart0000 -s off -f 13877/13877/13877 13878/13878/13878 13879/13879/13879 -v -11718.5 17106 5422.2 -vt 0.767664 0.857791 -v -11778.5 17106 5362.2 -vt 0.766833 0.857298 -v -12723.5 17106 5422.2 -vt 0.767664 0.849547 -o mesh2913 -s off -f 13880/13880/13880 13881/13881/13881 13882/13882/13882 -g charts -o chart0000 -s off -f 13880/13880/13880 13881/13881/13881 13882/13882/13882 -v -11778.5 16986 5362.2 -vt 0.285536 0.995466 -v -12207.9 17031 5362.2 -vt 0.281906 0.994847 -v -11778.5 17106 5362.2 -vt 0.285536 0.993817 -v -12663.5 16986 5362.2 -vt 0.278055 0.995466 -v -12234.1 17031 5362.2 -vt 0.281685 0.994847 -v -12234.1 17061 5362.2 -vt 0.281685 0.994435 -v -12207.9 17061 5362.2 -vt 0.281906 0.994435 -v -12663.5 17106 5362.2 -vt 0.278055 0.993817 -o mesh2914 -s off -f 13883/13883/13883 13884/13884/13884 13885/13885/13885 -f 13884/13884/13884 13883/13883/13883 13886/13886/13886 -f 13884/13884/13884 13886/13886/13886 13887/13887/13887 -f 13887/13887/13887 13886/13886/13886 13888/13888/13888 -f 13885/13885/13885 13889/13889/13889 13890/13890/13890 -f 13889/13889/13889 13885/13885/13885 13884/13884/13884 -f 13890/13890/13890 13889/13889/13889 13888/13888/13888 -f 13890/13890/13890 13888/13888/13888 13886/13886/13886 -g charts -o chart0000 -s off -f 13883/13883/13883 13884/13884/13884 13885/13885/13885 -f 13884/13884/13884 13883/13883/13883 13886/13886/13886 -f 13884/13884/13884 13886/13886/13886 13887/13887/13887 -f 13887/13887/13887 13886/13886/13886 13888/13888/13888 -f 13885/13885/13885 13889/13889/13889 13890/13890/13890 -f 13889/13889/13889 13885/13885/13885 13884/13884/13884 -f 13890/13890/13890 13889/13889/13889 13888/13888/13888 -f 13890/13890/13890 13888/13888/13888 13886/13886/13886 -v -12663.5 17106 5362.2 -vt 0.757689 0.914674 -v -12663.5 17061 4509.82 -vt 0.750706 0.915293 -v -12663.5 17106 3637.2 -vt 0.743558 0.914674 -v -12663.5 16986 5362.2 -vt 0.757689 0.916323 -v -12663.5 17031 4509.82 -vt 0.750706 0.915705 -v -12663.5 17031 4489.58 -vt 0.750541 0.915705 -v -12663.5 17061 4489.58 -vt 0.750541 0.915293 -v -12663.5 16986 3637.2 -vt 0.743558 0.916323 -o mesh2915 -s off -f 13891/13891/13891 13892/13892/13892 13893/13893/13893 -f 13892/13892/13892 13891/13891/13891 13894/13894/13894 -f 13892/13892/13892 13894/13894/13894 13895/13895/13895 -f 13895/13895/13895 13894/13894/13894 13896/13896/13896 -f 13893/13893/13893 13897/13897/13897 13898/13898/13898 -f 13897/13897/13897 13893/13893/13893 13892/13892/13892 -f 13898/13898/13898 13897/13897/13897 13896/13896/13896 -f 13898/13898/13898 13896/13896/13896 13894/13894/13894 -g charts -o chart0000 -s off -f 13891/13891/13891 13892/13892/13892 13893/13893/13893 -f 13892/13892/13892 13891/13891/13891 13894/13894/13894 -f 13892/13892/13892 13894/13894/13894 13895/13895/13895 -f 13895/13895/13895 13894/13894/13894 13896/13896/13896 -f 13893/13893/13893 13897/13897/13897 13898/13898/13898 -f 13897/13897/13897 13893/13893/13893 13892/13892/13892 -f 13898/13898/13898 13897/13897/13897 13896/13896/13896 -f 13898/13898/13898 13896/13896/13896 13894/13894/13894 -v -11778.5 17106 3637.2 -vt 0.840815 0.321105 -v -12207.9 17061 3637.2 -vt 0.841438 0.317505 -v -11778.5 16986 3637.2 -vt 0.842477 0.321105 -v -12663.5 17106 3637.2 -vt 0.840815 0.313685 -v -12234.1 17061 3637.2 -vt 0.841438 0.317285 -v -12234.1 17031 3637.2 -vt 0.841854 0.317285 -v -12207.9 17031 3637.2 -vt 0.841854 0.317505 -v -12663.5 16986 3637.2 -vt 0.842477 0.313685 -o mesh2916 -s off -f 13899/13899/13899 13900/13900/13900 13901/13901/13901 -f 13900/13900/13900 13899/13899/13899 13902/13902/13902 -f 13900/13900/13900 13902/13902/13902 13903/13903/13903 -f 13903/13903/13903 13902/13902/13902 13904/13904/13904 -f 13901/13901/13901 13905/13905/13905 13906/13906/13906 -f 13905/13905/13905 13901/13901/13901 13900/13900/13900 -f 13906/13906/13906 13905/13905/13905 13904/13904/13904 -f 13906/13906/13906 13904/13904/13904 13902/13902/13902 -g charts -o chart0000 -s off -f 13899/13899/13899 13900/13900/13900 13901/13901/13901 -f 13900/13900/13900 13899/13899/13899 13902/13902/13902 -f 13900/13900/13900 13902/13902/13902 13903/13903/13903 -f 13903/13903/13903 13902/13902/13902 13904/13904/13904 -f 13901/13901/13901 13905/13905/13905 13906/13906/13906 -f 13905/13905/13905 13901/13901/13901 13900/13900/13900 -f 13906/13906/13906 13905/13905/13905 13904/13904/13904 -f 13906/13906/13906 13904/13904/13904 13902/13902/13902 -v -11778.5 16986 3637.2 -vt 0.900665 0.866035 -v -11778.5 16986 5362.2 -vt 0.886534 0.866035 -v -11778.5 17106 5362.2 -vt 0.886534 0.864386 -v -11778.5 17106 3637.2 -vt 0.900665 0.864386 -o mesh2917 -s off -f 13907/13907/13907 13908/13908/13908 13909/13909/13909 -f 13907/13907/13907 13909/13909/13909 13910/13910/13910 -g charts -o chart0000 -s off -f 13907/13907/13907 13908/13908/13908 13909/13909/13909 -f 13907/13907/13907 13909/13909/13909 13910/13910/13910 -v -12207.9 17031 5362.2 -vt 0.949709 0.1554 -v -12234.1 17031 5362.2 -vt 0.949709 0.154575 -v -12234.1 17031 3637.2 -vt 0.935578 0.154575 -v -12207.9 17031 3637.2 -vt 0.935578 0.1554 -o mesh2918 -s off -f 13911/13911/13911 13912/13912/13912 13913/13913/13913 -f 13911/13911/13911 13913/13913/13913 13914/13914/13914 -g charts -o chart0000 -s off -f 13911/13911/13911 13912/13912/13912 13913/13913/13913 -f 13911/13911/13911 13913/13913/13913 13914/13914/13914 -v -12234.1 17031 5362.2 -vt 0.161679 0.552762 -v -12234.1 17061 5362.2 -vt 0.160848 0.552762 -v -12234.1 17061 3637.2 -vt 0.160848 0.538747 -v -12234.1 17031 3637.2 -vt 0.161679 0.538747 -o mesh2919 -s off -f 13915/13915/13915 13916/13916/13916 13917/13917/13917 -f 13915/13915/13915 13917/13917/13917 13918/13918/13918 -g charts -o chart0000 -s off -f 13915/13915/13915 13916/13916/13916 13917/13917/13917 -f 13915/13915/13915 13917/13917/13917 13918/13918/13918 -v -11798.9 17061 4509.82 -vt 0.664589 0.748969 -v -11798.9 17031 4509.82 -vt 0.664589 0.749794 -v -11798.9 17031 4489.58 -vt 0.66542 0.749794 -v -11798.9 17061 4489.58 -vt 0.66542 0.748969 -o mesh2920 -s off -f 13919/13919/13919 13920/13920/13920 13921/13921/13921 -f 13919/13919/13919 13921/13921/13921 13922/13922/13922 -g charts -o chart0000 -s off -f 13919/13919/13919 13920/13920/13920 13921/13921/13921 -f 13919/13919/13919 13921/13921/13921 13922/13922/13922 -v -12663.5 17061 4509.82 -vt 0.899834 0.874279 -v -12663.5 17031 4509.82 -vt 0.900665 0.874279 -v -11798.9 17031 4509.82 -vt 0.900665 0.866859 -v -11798.9 17061 4509.82 -vt 0.899834 0.866859 -o mesh2921 -s off -f 13923/13923/13923 13924/13924/13924 13925/13925/13925 -f 13923/13923/13923 13925/13925/13925 13926/13926/13926 -g charts -o chart0000 -s off -f 13923/13923/13923 13924/13924/13924 13925/13925/13925 -f 13923/13923/13923 13925/13925/13925 13926/13926/13926 -v -12663.5 17031 4509.82 -vt 0.795096 0.573372 -v -12663.5 17031 4489.58 -vt 0.795096 0.574196 -v -11798.9 17031 4489.58 -vt 0.787614 0.574196 -v -11798.9 17031 4509.82 -vt 0.787614 0.573372 -o mesh2922 -s off -f 13927/13927/13927 13928/13928/13928 13929/13929/13929 -f 13927/13927/13927 13929/13929/13929 13930/13930/13930 -g charts -o chart0000 -s off -f 13927/13927/13927 13928/13928/13928 13929/13929/13929 -f 13927/13927/13927 13929/13929/13929 13930/13930/13930 -v -12663.5 17031 4489.58 -vt 0.924771 0.903957 -v -12663.5 17061 4489.58 -vt 0.924771 0.904781 -v -11798.9 17061 4489.58 -vt 0.91729 0.904781 -v -11798.9 17031 4489.58 -vt 0.91729 0.903957 -o mesh2923 -s off -f 13931/13931/13931 13932/13932/13932 13933/13933/13933 -f 13931/13931/13931 13933/13933/13933 13934/13934/13934 -g charts -o chart0000 -s off -f 13931/13931/13931 13932/13932/13932 13933/13933/13933 -f 13931/13931/13931 13933/13933/13933 13934/13934/13934 -v -12663.5 17061 4489.58 -vt 0.64547 0.824814 -v -12663.5 17061 4509.82 -vt 0.646301 0.824814 -v -11798.9 17061 4509.82 -vt 0.646301 0.817395 -v -11798.9 17061 4489.58 -vt 0.64547 0.817395 -o mesh2924 -s off -f 13935/13935/13935 13936/13936/13936 13937/13937/13937 -f 13935/13935/13935 13937/13937/13937 13938/13938/13938 -g charts -o chart0000 -s off -f 13935/13935/13935 13936/13936/13936 13937/13937/13937 -f 13935/13935/13935 13937/13937/13937 13938/13938/13938 -v -12207.9 17061 5362.2 -vt 0.741064 0.926216 -v -12207.9 17031 5362.2 -vt 0.741064 0.925392 -v -12207.9 17031 3637.2 -vt 0.726933 0.925392 -v -12207.9 17061 3637.2 -vt 0.726933 0.926216 -o mesh2925 -s off -f 13939/13939/13939 13940/13940/13940 13941/13941/13941 -f 13939/13939/13939 13941/13941/13941 13942/13942/13942 -g charts -o chart0000 -s off -f 13939/13939/13939 13940/13940/13940 13941/13941/13941 -f 13939/13939/13939 13941/13941/13941 13942/13942/13942 -v -12234.1 17061 5362.2 -vt 0.657107 0.864386 -v -12207.9 17061 5362.2 -vt 0.656276 0.864386 -v -12207.9 17061 3637.2 -vt 0.656276 0.850371 -v -12234.1 17061 3637.2 -vt 0.657107 0.850371 -o mesh2926 -s off -f 13943/13943/13943 13944/13944/13944 13945/13945/13945 -f 13943/13943/13943 13945/13945/13945 13946/13946/13946 -g charts -o chart0000 -s off -f 13943/13943/13943 13944/13944/13944 13945/13945/13945 -f 13943/13943/13943 13945/13945/13945 13946/13946/13946 -v -10556 16986 3539.7 -vt 0.872402 0.411789 -v -10593.5 16986 3577.2 -vt 0.871571 0.411474 -v -11636 16986 3539.7 -vt 0.872402 0.402721 -v -11598.5 16986 3577.2 -vt 0.871571 0.403035 -o mesh2927 -s off -f 13947/13947/13947 13948/13948/13948 13949/13949/13949 -f 13950/13950/13950 13949/13949/13949 13948/13948/13948 -g charts -o chart0000 -s off -f 13947/13947/13947 13948/13948/13948 13949/13949/13949 -f 13950/13950/13950 13949/13949/13949 13948/13948/13948 -v -10593.5 16986 3577.2 -vt 0.863567 0.537923 -v -10556 16986 3539.7 -vt 0.863259 0.538747 -v -10556 16986 5459.7 -vt 0.879052 0.538747 -o mesh2928 -s off -f 13951/13951/13951 13952/13952/13952 13953/13953/13953 -g charts -o chart0000 -s off -f 13951/13951/13951 13952/13952/13952 13953/13953/13953 -v -10593.5 16986 3577.2 -vt 0.898171 0.27906 -v -10556 16986 5459.7 -vt 0.913134 0.27906 -v -10593.5 16986 5422.2 -vt 0.91283 0.278236 -o mesh2929 -s off -f 13954/13954/13954 13955/13955/13955 13956/13956/13956 -g charts -o chart0000 -s off -f 13954/13954/13954 13955/13955/13955 13956/13956/13956 -v -10593.5 16986 5422.2 -vt 0.251455 0.528337 -v -10556 16986 5459.7 -vt 0.252286 0.52803 -v -11598.5 16986 5422.2 -vt 0.252286 0.536274 -o mesh2930 -s off -f 13957/13957/13957 13958/13958/13958 13959/13959/13959 -g charts -o chart0000 -s off -f 13957/13957/13957 13958/13958/13958 13959/13959/13959 -v -11636 16986 3539.7 -vt 0.992934 0.575845 -v -11598.5 16986 3577.2 -vt 0.992103 0.575539 -v -11636 16986 5459.7 -vt 0.992934 0.560181 -o mesh2931 -s off -f 13960/13960/13960 13961/13961/13961 13962/13962/13962 -g charts -o chart0000 -s off -f 13960/13960/13960 13961/13961/13961 13962/13962/13962 -v -11636 16986 5459.7 -vt 0.901496 0.591509 -v -11598.5 16986 3577.2 -vt 0.901496 0.606348 -v -11598.5 16986 5422.2 -vt 0.900665 0.59181 -o mesh2932 -s off -f 13963/13963/13963 13964/13964/13964 13965/13965/13965 -g charts -o chart0000 -s off -f 13963/13963/13963 13964/13964/13964 13965/13965/13965 -v -11636 16986 5459.7 -vt 0.416874 0.967436 -v -11598.5 16986 5422.2 -vt 0.416557 0.966612 -v -10556 16986 5459.7 -vt 0.407731 0.967436 -o mesh2933 -s off -f 13966/13966/13966 13967/13967/13967 13968/13968/13968 -g charts -o chart0000 -s off -f 13966/13966/13966 13967/13967/13967 13968/13968/13968 -v -11636 17151 3539.7 -vt 0.775977 0.908904 -v -11598.5 17151 3577.2 -vt 0.776294 0.909728 -v -10556 17151 3539.7 -vt 0.78512 0.908904 -v -10593.5 17151 3577.2 -vt 0.784803 0.909728 -o mesh2934 -s off -f 13969/13969/13969 13970/13970/13970 13971/13971/13971 -f 13972/13972/13972 13971/13971/13971 13970/13970/13970 -g charts -o chart0000 -s off -f 13969/13969/13969 13970/13970/13970 13971/13971/13971 -f 13972/13972/13972 13971/13971/13971 13970/13970/13970 -v -11598.5 17151 3577.2 -vt 0.017872 0.837487 -v -11636 17151 3539.7 -vt 0.0187032 0.837181 -v -11636 17151 5459.7 -vt 0.018703 0.852844 -o mesh2935 -s off -f 13973/13973/13973 13974/13974/13974 13975/13975/13975 -g charts -o chart0000 -s off -f 13973/13973/13973 13974/13974/13974 13975/13975/13975 -v -11598.5 17151 3577.2 -vt 0.727764 0.961665 -v -11636 17151 5459.7 -vt 0.727764 0.976504 -v -11598.5 17151 5422.2 -vt 0.726933 0.976203 -o mesh2936 -s off -f 13976/13976/13976 13977/13977/13977 13978/13978/13978 -g charts -o chart0000 -s off -f 13976/13976/13976 13977/13977/13977 13978/13978/13978 -v -11598.5 17151 5422.2 -vt 0.996259 0.833365 -v -11636 17151 5459.7 -vt 0.997091 0.833059 -v -10593.5 17151 5422.2 -vt 0.997091 0.841302 -o mesh2937 -s off -f 13979/13979/13979 13980/13980/13980 13981/13981/13981 -g charts -o chart0000 -s off -f 13979/13979/13979 13980/13980/13980 13981/13981/13981 -v -10556 17151 3539.7 -vt 0.0552783 0.218879 -v -10593.5 17151 3577.2 -vt 0.0544472 0.218573 -v -10556 17151 5459.7 -vt 0.0552784 0.203215 -o mesh2938 -s off -f 13982/13982/13982 13983/13983/13983 13984/13984/13984 -g charts -o chart0000 -s off -f 13982/13982/13982 13983/13983/13983 13984/13984/13984 -v -10556 17151 5459.7 -vt 0.237323 0.523908 -v -10593.5 17151 3577.2 -vt 0.252286 0.523908 -v -10593.5 17151 5422.2 -vt 0.237627 0.523083 -o mesh2939 -s off -f 13985/13985/13985 13986/13986/13986 13987/13987/13987 -g charts -o chart0000 -s off -f 13985/13985/13985 13986/13986/13986 13987/13987/13987 -v -10556 17151 5459.7 -vt 0.71862 0.833058 -v -10593.5 17151 5422.2 -vt 0.718302 0.832234 -v -11636 17151 5459.7 -vt 0.709476 0.833058 -o mesh2940 -s off -f 13988/13988/13988 13989/13989/13989 13990/13990/13990 -g charts -o chart0000 -s off -f 13988/13988/13988 13989/13989/13989 13990/13990/13990 -v -11636 16986 5459.7 -vt 0.913965 0.287304 -v -10556 16986 5459.7 -vt 0.904821 0.287304 -v -10556 17151 5459.7 -vt 0.904821 0.285655 -v -11636 17151 5459.7 -vt 0.913965 0.285655 -o mesh2941 -s off -f 13991/13991/13991 13992/13992/13992 13993/13993/13993 -f 13991/13991/13991 13993/13993/13993 13994/13994/13994 -g charts -o chart0000 -s off -f 13991/13991/13991 13992/13992/13992 13993/13993/13993 -f 13991/13991/13991 13993/13993/13993 13994/13994/13994 -v -10556 16986 5459.7 -vt 0.138404 0.967436 -v -10556 16986 3539.7 -vt 0.154198 0.967436 -v -10556 17151 3539.7 -vt 0.154198 0.969085 -v -10556 17151 5459.7 -vt 0.138404 0.969085 -o mesh2942 -s off -f 13995/13995/13995 13996/13996/13996 13997/13997/13997 -f 13995/13995/13995 13997/13997/13997 13998/13998/13998 -g charts -o chart0000 -s off -f 13995/13995/13995 13996/13996/13996 13997/13997/13997 -f 13995/13995/13995 13997/13997/13997 13998/13998/13998 -v -10556 16986 3539.7 -vt 0.276392 0.828112 -v -11636 16986 3539.7 -vt 0.285536 0.828112 -v -11636 17151 3539.7 -vt 0.285536 0.829761 -v -10556 17151 3539.7 -vt 0.276392 0.829761 -o mesh2943 -s off -f 13999/13999/13999 14000/14000/14000 14001/14001/14001 -f 13999/13999/13999 14001/14001/14001 14002/14002/14002 -g charts -o chart0000 -s off -f 13999/13999/13999 14000/14000/14000 14001/14001/14001 -f 13999/13999/13999 14001/14001/14001 14002/14002/14002 -v -11636 16986 3539.7 -vt 0.271405 0.695383 -v -11636 16986 5459.7 -vt 0.271405 0.67972 -v -11636 17151 5459.7 -vt 0.269742 0.67972 -v -11636 17151 3539.7 -vt 0.269742 0.695383 -o mesh2944 -s off -f 14003/14003/14003 14004/14004/14004 14005/14005/14005 -f 14003/14003/14003 14005/14005/14005 14006/14006/14006 -g charts -o chart0000 -s off -f 14003/14003/14003 14004/14004/14004 14005/14005/14005 -f 14003/14003/14003 14005/14005/14005 14006/14006/14006 -v -11598.5 17151 3577.2 -vt 0.608063 0.592333 -v -11598.5 17106 3577.2 -vt 0.608063 0.592783 -v -10593.5 17106 3577.2 -vt 0.599751 0.592783 -v -10593.5 17151 3577.2 -vt 0.599751 0.592333 -v -11598.5 16986 3577.2 -vt 0.608063 0.593982 -v -10593.5 16986 3577.2 -vt 0.599751 0.593982 -o mesh2945 -s off -f 14007/14007/14007 14008/14008/14008 14009/14009/14009 -f 14007/14007/14007 14009/14009/14009 14010/14010/14010 -f 14011/14011/14011 14012/14012/14012 14009/14009/14009 -f 14011/14011/14011 14009/14009/14009 14008/14008/14008 -g charts -o chart0000 -s off -f 14007/14007/14007 14008/14008/14008 14009/14009/14009 -f 14007/14007/14007 14009/14009/14009 14010/14010/14010 -f 14011/14011/14011 14012/14012/14012 14009/14009/14009 -f 14011/14011/14011 14009/14009/14009 14008/14008/14008 -v -10593.5 17151 3577.2 -vt 0.375312 0.296373 -v -10593.5 17106 3577.2 -vt 0.375312 0.296822 -v -10593.5 17106 5422.2 -vt 0.360349 0.296822 -v -10593.5 17151 5422.2 -vt 0.360349 0.296373 -v -10593.5 16986 3577.2 -vt 0.375312 0.298021 -v -10593.5 16986 5422.2 -vt 0.360349 0.298021 -o mesh2946 -s off -f 14013/14013/14013 14014/14014/14014 14015/14015/14015 -f 14013/14013/14013 14015/14015/14015 14016/14016/14016 -f 14017/14017/14017 14018/14018/14018 14015/14015/14015 -f 14017/14017/14017 14015/14015/14015 14014/14014/14014 -g charts -o chart0000 -s off -f 14013/14013/14013 14014/14014/14014 14015/14015/14015 -f 14013/14013/14013 14015/14015/14015 14016/14016/14016 -f 14017/14017/14017 14018/14018/14018 14015/14015/14015 -f 14017/14017/14017 14015/14015/14015 14014/14014/14014 -v -10593.5 17151 5422.2 -vt 0.710307 0.920445 -v -10593.5 17106 5422.2 -vt 0.709854 0.920445 -v -11598.5 17106 5422.2 -vt 0.709854 0.912201 -v -11598.5 17151 5422.2 -vt 0.710307 0.912201 -v -10593.5 16986 5422.2 -vt 0.708645 0.920445 -v -11598.5 16986 5422.2 -vt 0.708645 0.912201 -o mesh2947 -s off -f 14019/14019/14019 14020/14020/14020 14021/14021/14021 -f 14019/14019/14019 14021/14021/14021 14022/14022/14022 -f 14023/14023/14023 14024/14024/14024 14021/14021/14021 -f 14023/14023/14023 14021/14021/14021 14020/14020/14020 -g charts -o chart0000 -s off -f 14019/14019/14019 14020/14020/14020 14021/14021/14021 -f 14019/14019/14019 14021/14021/14021 14022/14022/14022 -f 14023/14023/14023 14024/14024/14024 14021/14021/14021 -f 14023/14023/14023 14021/14021/14021 14020/14020/14020 -v -11598.5 17151 5422.2 -vt 0.913134 0.283182 -v -11598.5 17106 5422.2 -vt 0.913134 0.282732 -v -11598.5 17106 3577.2 -vt 0.898171 0.282732 -v -11598.5 17151 3577.2 -vt 0.898171 0.283182 -v -11598.5 16986 5422.2 -vt 0.913134 0.281533 -v -11598.5 16986 3577.2 -vt 0.898171 0.281533 -o mesh2948 -s off -f 14025/14025/14025 14026/14026/14026 14027/14027/14027 -f 14025/14025/14025 14027/14027/14027 14028/14028/14028 -f 14029/14029/14029 14030/14030/14030 14027/14027/14027 -f 14029/14029/14029 14027/14027/14027 14026/14026/14026 -g charts -o chart0000 -s off -f 14025/14025/14025 14026/14026/14026 14027/14027/14027 -f 14025/14025/14025 14027/14027/14027 14028/14028/14028 -f 14029/14029/14029 14030/14030/14030 14027/14027/14027 -f 14029/14029/14029 14027/14027/14027 14026/14026/14026 -v -11598.5 17106 3577.2 -vt 0.73857 0.673124 -v -11538.5 17106 3637.2 -vt 0.739066 0.673949 -v -10593.5 17106 3577.2 -vt 0.746883 0.673124 -v -10653.5 17106 3637.2 -vt 0.746386 0.673949 -o mesh2949 -s off -f 14031/14031/14031 14032/14032/14032 14033/14033/14033 -f 14034/14034/14034 14033/14033/14033 14032/14032/14032 -g charts -o chart0000 -s off -f 14031/14031/14031 14032/14032/14032 14033/14033/14033 -f 14034/14034/14034 14033/14033/14033 14032/14032/14032 -v -11538.5 17106 3637.2 -vt 0.433986 0.612119 -v -11598.5 17106 3577.2 -vt 0.4335 0.612943 -v -11598.5 17106 5422.2 -vt 0.448462 0.612943 -o mesh2950 -s off -f 14035/14035/14035 14036/14036/14036 14037/14037/14037 -g charts -o chart0000 -s off -f 14035/14035/14035 14036/14036/14036 14037/14037/14037 -v -11538.5 17106 3637.2 -vt 0.786783 0.316158 -v -11598.5 17106 5422.2 -vt 0.800914 0.316158 -v -11538.5 17106 5362.2 -vt 0.800424 0.315334 -o mesh2951 -s off -f 14038/14038/14038 14039/14039/14039 14040/14040/14040 -g charts -o chart0000 -s off -f 14038/14038/14038 14039/14039/14039 14040/14040/14040 -v -11538.5 17106 5362.2 -vt 0.468084 0.453833 -v -11598.5 17106 5422.2 -vt 0.467581 0.454658 -v -10653.5 17106 5362.2 -vt 0.475062 0.454658 -o mesh2952 -s off -f 14041/14041/14041 14042/14042/14042 14043/14043/14043 -g charts -o chart0000 -s off -f 14041/14041/14041 14042/14042/14042 14043/14043/14043 -v -10593.5 17106 3577.2 -vt 0.654613 0.637675 -v -10653.5 17106 3637.2 -vt 0.654127 0.636851 -v -10593.5 17106 5422.2 -vt 0.639651 0.637675 -o mesh2953 -s off -f 14044/14044/14044 14045/14045/14045 14046/14046/14046 -g charts -o chart0000 -s off -f 14044/14044/14044 14045/14045/14045 14046/14046/14046 -v -10593.5 17106 5422.2 -vt 0.628013 0.744023 -v -10653.5 17106 3637.2 -vt 0.628013 0.758038 -v -10653.5 17106 5362.2 -vt 0.627182 0.744509 -o mesh2954 -s off -f 14047/14047/14047 14048/14048/14048 14049/14049/14049 -g charts -o chart0000 -s off -f 14047/14047/14047 14048/14048/14048 14049/14049/14049 -v -10593.5 17106 5422.2 -vt 0.244805 0.607997 -v -10653.5 17106 5362.2 -vt 0.244308 0.607172 -v -11598.5 17106 5422.2 -vt 0.236492 0.607997 -o mesh2955 -s off -f 14050/14050/14050 14051/14051/14051 14052/14052/14052 -g charts -o chart0000 -s off -f 14050/14050/14050 14051/14051/14051 14052/14052/14052 -v -10653.5 16986 5362.2 -vt 0.178304 0.995466 -v -11082.9 17031 5362.2 -vt 0.174674 0.994847 -v -10653.5 17106 5362.2 -vt 0.178304 0.993817 -v -11538.5 16986 5362.2 -vt 0.170823 0.995466 -v -11109.1 17031 5362.2 -vt 0.174453 0.994847 -v -11109.1 17061 5362.2 -vt 0.174453 0.994435 -v -11082.9 17061 5362.2 -vt 0.174674 0.994435 -v -11538.5 17106 5362.2 -vt 0.170823 0.993817 -o mesh2956 -s off -f 14053/14053/14053 14054/14054/14054 14055/14055/14055 -f 14054/14054/14054 14053/14053/14053 14056/14056/14056 -f 14054/14054/14054 14056/14056/14056 14057/14057/14057 -f 14057/14057/14057 14056/14056/14056 14058/14058/14058 -f 14055/14055/14055 14059/14059/14059 14060/14060/14060 -f 14059/14059/14059 14055/14055/14055 14054/14054/14054 -f 14060/14060/14060 14059/14059/14059 14058/14058/14058 -f 14060/14060/14060 14058/14058/14058 14056/14056/14056 -g charts -o chart0000 -s off -f 14053/14053/14053 14054/14054/14054 14055/14055/14055 -f 14054/14054/14054 14053/14053/14053 14056/14056/14056 -f 14054/14054/14054 14056/14056/14056 14057/14057/14057 -f 14057/14057/14057 14056/14056/14056 14058/14058/14058 -f 14055/14055/14055 14059/14059/14059 14060/14060/14060 -f 14059/14059/14059 14055/14055/14055 14054/14054/14054 -f 14060/14060/14060 14059/14059/14059 14058/14058/14058 -f 14060/14060/14060 14058/14058/14058 14056/14056/14056 -v -11538.5 17106 5362.2 -vt 0.971322 0.489283 -v -11538.5 17061 4509.82 -vt 0.971945 0.482358 -v -11538.5 17106 3637.2 -vt 0.971322 0.475268 -v -11538.5 16986 5362.2 -vt 0.972984 0.489283 -v -11538.5 17031 4509.82 -vt 0.972361 0.482358 -v -11538.5 17031 4489.58 -vt 0.972361 0.482193 -v -11538.5 17061 4489.58 -vt 0.971945 0.482193 -v -11538.5 16986 3637.2 -vt 0.972984 0.475268 -o mesh2957 -s off -f 14061/14061/14061 14062/14062/14062 14063/14063/14063 -f 14062/14062/14062 14061/14061/14061 14064/14064/14064 -f 14062/14062/14062 14064/14064/14064 14065/14065/14065 -f 14065/14065/14065 14064/14064/14064 14066/14066/14066 -f 14063/14063/14063 14067/14067/14067 14068/14068/14068 -f 14067/14067/14067 14063/14063/14063 14062/14062/14062 -f 14068/14068/14068 14067/14067/14067 14066/14066/14066 -f 14068/14068/14068 14066/14066/14066 14064/14064/14064 -g charts -o chart0000 -s off -f 14061/14061/14061 14062/14062/14062 14063/14063/14063 -f 14062/14062/14062 14061/14061/14061 14064/14064/14064 -f 14062/14062/14062 14064/14064/14064 14065/14065/14065 -f 14065/14065/14065 14064/14064/14064 14066/14066/14066 -f 14063/14063/14063 14067/14067/14067 14068/14068/14068 -f 14067/14067/14067 14063/14063/14063 14062/14062/14062 -f 14068/14068/14068 14067/14067/14067 14066/14066/14066 -f 14068/14068/14068 14066/14066/14066 14064/14064/14064 -v -10653.5 17106 3637.2 -vt 0.612219 0.594806 -v -11082.9 17061 3637.2 -vt 0.612843 0.591206 -v -10653.5 16986 3637.2 -vt 0.613882 0.594806 -v -11538.5 17106 3637.2 -vt 0.612219 0.587387 -v -11109.1 17061 3637.2 -vt 0.612843 0.590986 -v -11109.1 17031 3637.2 -vt 0.613259 0.590986 -v -11082.9 17031 3637.2 -vt 0.613259 0.591206 -v -11538.5 16986 3637.2 -vt 0.613882 0.587387 -o mesh2958 -s off -f 14069/14069/14069 14070/14070/14070 14071/14071/14071 -f 14070/14070/14070 14069/14069/14069 14072/14072/14072 -f 14070/14070/14070 14072/14072/14072 14073/14073/14073 -f 14073/14073/14073 14072/14072/14072 14074/14074/14074 -f 14071/14071/14071 14075/14075/14075 14076/14076/14076 -f 14075/14075/14075 14071/14071/14071 14070/14070/14070 -f 14076/14076/14076 14075/14075/14075 14074/14074/14074 -f 14076/14076/14076 14074/14074/14074 14072/14072/14072 -g charts -o chart0000 -s off -f 14069/14069/14069 14070/14070/14070 14071/14071/14071 -f 14070/14070/14070 14069/14069/14069 14072/14072/14072 -f 14070/14070/14070 14072/14072/14072 14073/14073/14073 -f 14073/14073/14073 14072/14072/14072 14074/14074/14074 -f 14071/14071/14071 14075/14075/14075 14076/14076/14076 -f 14075/14075/14075 14071/14071/14071 14070/14070/14070 -f 14076/14076/14076 14075/14075/14075 14074/14074/14074 -f 14076/14076/14076 14074/14074/14074 14072/14072/14072 -v -10653.5 16986 3637.2 -vt 0.0926849 0.584089 -v -10653.5 16986 5362.2 -vt 0.0785536 0.584089 -v -10653.5 17106 5362.2 -vt 0.0785536 0.58244 -v -10653.5 17106 3637.2 -vt 0.0926849 0.58244 -o mesh2959 -s off -f 14077/14077/14077 14078/14078/14078 14079/14079/14079 -f 14077/14077/14077 14079/14079/14079 14080/14080/14080 -g charts -o chart0000 -s off -f 14077/14077/14077 14078/14078/14078 14079/14079/14079 -f 14077/14077/14077 14079/14079/14079 14080/14080/14080 -v -11082.9 17031 5362.2 -vt 0.362843 0.47939 -v -11109.1 17031 5362.2 -vt 0.362012 0.47939 -v -11109.1 17031 3637.2 -vt 0.362012 0.465375 -v -11082.9 17031 3637.2 -vt 0.362843 0.465375 -o mesh2960 -s off -f 14081/14081/14081 14082/14082/14082 14083/14083/14083 -f 14081/14081/14081 14083/14083/14083 14084/14084/14084 -g charts -o chart0000 -s off -f 14081/14081/14081 14082/14082/14082 14083/14083/14083 -f 14081/14081/14081 14083/14083/14083 14084/14084/14084 -v -11109.1 17031 5362.2 -vt 0.582294 0.340066 -v -11109.1 17061 5362.2 -vt 0.582294 0.339242 -v -11109.1 17061 3637.2 -vt 0.568163 0.339242 -v -11109.1 17031 3637.2 -vt 0.568163 0.340066 -o mesh2961 -s off -f 14085/14085/14085 14086/14086/14086 14087/14087/14087 -f 14085/14085/14085 14087/14087/14087 14088/14088/14088 -g charts -o chart0000 -s off -f 14085/14085/14085 14086/14086/14086 14087/14087/14087 -f 14085/14085/14085 14087/14087/14087 14088/14088/14088 -v -10673.9 17061 4509.82 -vt 0.695345 0.633553 -v -10673.9 17031 4509.82 -vt 0.696176 0.633553 -v -10673.9 17031 4489.58 -vt 0.696176 0.634377 -v -10673.9 17061 4489.58 -vt 0.695345 0.634377 -o mesh2962 -s off -f 14089/14089/14089 14090/14090/14090 14091/14091/14091 -f 14089/14089/14089 14091/14091/14091 14092/14092/14092 -g charts -o chart0000 -s off -f 14089/14089/14089 14090/14090/14090 14091/14091/14091 -f 14089/14089/14089 14091/14091/14091 14092/14092/14092 -v -11538.5 17061 4509.82 -vt 0.996259 0.949299 -v -11538.5 17031 4509.82 -vt 0.997091 0.949299 -v -10673.9 17031 4509.82 -vt 0.997091 0.94188 -v -10673.9 17061 4509.82 -vt 0.996259 0.94188 -o mesh2963 -s off -f 14093/14093/14093 14094/14094/14094 14095/14095/14095 -f 14093/14093/14093 14095/14095/14095 14096/14096/14096 -g charts -o chart0000 -s off -f 14093/14093/14093 14094/14094/14094 14095/14095/14095 -f 14093/14093/14093 14095/14095/14095 14096/14096/14096 -v -11538.5 17031 4509.82 -vt 0.695345 0.714345 -v -11538.5 17031 4489.58 -vt 0.695345 0.715169 -v -10673.9 17031 4489.58 -vt 0.687864 0.715169 -v -10673.9 17031 4509.82 -vt 0.687864 0.714345 -o mesh2964 -s off -f 14097/14097/14097 14098/14098/14098 14099/14099/14099 -f 14097/14097/14097 14099/14099/14099 14100/14100/14100 -g charts -o chart0000 -s off -f 14097/14097/14097 14098/14098/14098 14099/14099/14099 -f 14097/14097/14097 14099/14099/14099 14100/14100/14100 -v -11538.5 17031 4489.58 -vt 0.899002 0.615416 -v -11538.5 17061 4489.58 -vt 0.899834 0.615416 -v -10673.9 17061 4489.58 -vt 0.899834 0.607997 -v -10673.9 17031 4489.58 -vt 0.899002 0.607997 -o mesh2965 -s off -f 14101/14101/14101 14102/14102/14102 14103/14103/14103 -f 14101/14101/14101 14103/14103/14103 14104/14104/14104 -g charts -o chart0000 -s off -f 14101/14101/14101 14102/14102/14102 14103/14103/14103 -f 14101/14101/14101 14103/14103/14103 14104/14104/14104 -v -11538.5 17061 4489.58 -vt 0.770158 0.537923 -v -11538.5 17061 4509.82 -vt 0.770158 0.538747 -v -10673.9 17061 4509.82 -vt 0.762677 0.538747 -v -10673.9 17061 4489.58 -vt 0.762677 0.537923 -o mesh2966 -s off -f 14105/14105/14105 14106/14106/14106 14107/14107/14107 -f 14105/14105/14105 14107/14107/14107 14108/14108/14108 -g charts -o chart0000 -s off -f 14105/14105/14105 14106/14106/14106 14107/14107/14107 -f 14105/14105/14105 14107/14107/14107 14108/14108/14108 -v -11082.9 17061 5362.2 -vt 0.317124 0.748145 -v -11082.9 17031 5362.2 -vt 0.317124 0.747321 -v -11082.9 17031 3637.2 -vt 0.302993 0.747321 -v -11082.9 17061 3637.2 -vt 0.302993 0.748145 -o mesh2967 -s off -f 14109/14109/14109 14110/14110/14110 14111/14111/14111 -f 14109/14109/14109 14111/14111/14111 14112/14112/14112 -g charts -o chart0000 -s off -f 14109/14109/14109 14110/14110/14110 14111/14111/14111 -f 14109/14109/14109 14111/14111/14111 14112/14112/14112 -v -11109.1 17061 5362.2 -vt 0.912302 0.138087 -v -11082.9 17061 5362.2 -vt 0.911471 0.138087 -v -11082.9 17061 3637.2 -vt 0.911471 0.124073 -v -11109.1 17061 3637.2 -vt 0.912302 0.124073 -o mesh2968 -s off -f 14113/14113/14113 14114/14114/14114 14115/14115/14115 -f 14113/14113/14113 14115/14115/14115 14116/14116/14116 -g charts -o chart0000 -s off -f 14113/14113/14113 14114/14114/14114 14115/14115/14115 -f 14113/14113/14113 14115/14115/14115 14116/14116/14116 -v -9441.35 17706 284.7 -vt 0.93059 0.697856 -v -9478.85 17706 322.2 -vt 0.930273 0.697032 -v -10521.3 17706 284.7 -vt 0.921446 0.697856 -v -10483.8 17706 322.2 -vt 0.921764 0.697032 -o mesh2969 -s off -f 14117/14117/14117 14118/14118/14118 14119/14119/14119 -f 14120/14120/14120 14119/14119/14119 14118/14118/14118 -g charts -o chart0000 -s off -f 14117/14117/14117 14118/14118/14118 14119/14119/14119 -f 14120/14120/14120 14119/14119/14119 14118/14118/14118 -v -9478.85 17706 322.2 -vt 0.160017 0.309045 -v -9441.35 17706 284.7 -vt 0.160848 0.308739 -v -9441.35 17706 2204.7 -vt 0.160848 0.324402 -o mesh2970 -s off -f 14121/14121/14121 14122/14122/14122 14123/14123/14123 -g charts -o chart0000 -s off -f 14121/14121/14121 14122/14122/14122 14123/14123/14123 -v -9478.85 17706 322.2 -vt 0.603907 0.969909 -v -9441.35 17706 2204.7 -vt 0.618869 0.969909 -v -9478.85 17706 2167.2 -vt 0.618565 0.969085 -o mesh2971 -s off -f 14124/14124/14124 14125/14125/14125 14126/14126/14126 -g charts -o chart0000 -s off -f 14124/14124/14124 14125/14125/14125 14126/14126/14126 -v -9478.85 17706 2167.2 -vt 0.231505 0.499482 -v -9441.35 17706 2204.7 -vt 0.232336 0.499176 -v -10483.8 17706 2167.2 -vt 0.232336 0.50742 -o mesh2972 -s off -f 14127/14127/14127 14128/14128/14128 14129/14129/14129 -g charts -o chart0000 -s off -f 14127/14127/14127 14128/14128/14128 14129/14129/14129 -v -10521.3 17706 284.7 -vt 0.163342 0.704452 -v -10483.8 17706 322.2 -vt 0.16251 0.704146 -v -10521.3 17706 2204.7 -vt 0.163342 0.688788 -o mesh2973 -s off -f 14130/14130/14130 14131/14131/14131 14132/14132/14132 -g charts -o chart0000 -s off -f 14130/14130/14130 14131/14131/14131 14132/14132/14132 -v -10521.3 17706 2204.7 -vt 0.567332 0.948475 -v -10483.8 17706 322.2 -vt 0.567332 0.963314 -v -10483.8 17706 2167.2 -vt 0.5665 0.948776 -o mesh2974 -s off -f 14133/14133/14133 14134/14134/14134 14135/14135/14135 -g charts -o chart0000 -s off -f 14133/14133/14133 14134/14134/14134 14135/14135/14135 -v -10521.3 17706 2204.7 -vt 0.776808 0.897362 -v -10483.8 17706 2167.2 -vt 0.776491 0.896537 -v -9441.35 17706 2204.7 -vt 0.767664 0.897362 -o mesh2975 -s off -f 14136/14136/14136 14137/14137/14137 14138/14138/14138 -g charts -o chart0000 -s off -f 14136/14136/14136 14137/14137/14137 14138/14138/14138 -v -10521.3 17871 284.7 -vt 0.150873 0.323578 -v -10483.8 17871 322.2 -vt 0.151704 0.323893 -v -9441.35 17871 284.7 -vt 0.150873 0.332646 -v -9478.85 17871 322.2 -vt 0.151704 0.332331 -o mesh2976 -s off -f 14139/14139/14139 14140/14140/14140 14141/14141/14141 -f 14142/14142/14142 14141/14141/14141 14140/14140/14140 -g charts -o chart0000 -s off -f 14139/14139/14139 14140/14140/14140 14141/14141/14141 -f 14142/14142/14142 14141/14141/14141 14140/14140/14140 -v -10483.8 17871 322.2 -vt 0.463425 0.94301 -v -10521.3 17871 284.7 -vt 0.464256 0.942704 -v -10521.3 17871 2204.7 -vt 0.464256 0.958368 -o mesh2977 -s off -f 14143/14143/14143 14144/14144/14144 14145/14145/14145 -g charts -o chart0000 -s off -f 14143/14143/14143 14144/14144/14144 14145/14145/14145 -v -10483.8 17871 322.2 -vt 0.0286783 0.70033 -v -10521.3 17871 2204.7 -vt 0.0436408 0.70033 -v -10483.8 17871 2167.2 -vt 0.043337 0.699505 -o mesh2978 -s off -f 14146/14146/14146 14147/14147/14147 14148/14148/14148 -g charts -o chart0000 -s off -f 14146/14146/14146 14147/14147/14147 14148/14148/14148 -v -10483.8 17871 2167.2 -vt 0.499478 0.447238 -v -10521.3 17871 2204.7 -vt 0.499169 0.448063 -v -9478.85 17871 2167.2 -vt 0.507481 0.448063 -o mesh2979 -s off -f 14149/14149/14149 14150/14150/14150 14151/14151/14151 -g charts -o chart0000 -s off -f 14149/14149/14149 14150/14150/14150 14151/14151/14151 -v -9441.35 17871 284.7 -vt 0.317124 0.546166 -v -9478.85 17871 322.2 -vt 0.316293 0.545861 -v -9441.35 17871 2204.7 -vt 0.317124 0.530503 -o mesh2980 -s off -f 14152/14152/14152 14153/14153/14153 14154/14154/14154 -g charts -o chart0000 -s off -f 14152/14152/14152 14153/14153/14153 14154/14154/14154 -v -9441.35 17871 2204.7 -vt 0.343724 0.413438 -v -9478.85 17871 322.2 -vt 0.358687 0.413438 -v -9478.85 17871 2167.2 -vt 0.344028 0.412613 -o mesh2981 -s off -f 14155/14155/14155 14156/14156/14156 14157/14157/14157 -g charts -o chart0000 -s off -f 14155/14155/14155 14156/14156/14156 14157/14157/14157 -v -9441.35 17871 2204.7 -vt 0.993765 0.912201 -v -9478.85 17871 2167.2 -vt 0.993448 0.911377 -v -10521.3 17871 2204.7 -vt 0.984622 0.912201 -o mesh2982 -s off -f 14158/14158/14158 14159/14159/14159 14160/14160/14160 -g charts -o chart0000 -s off -f 14158/14158/14158 14159/14159/14159 14160/14160/14160 -v -10521.3 17706 2204.7 -vt 0.00290931 0.843776 -v -9441.35 17706 2204.7 -vt 0.00290931 0.834707 -v -9441.35 17871 2204.7 -vt 0.00124688 0.834707 -v -10521.3 17871 2204.7 -vt 0.00124688 0.843776 -o mesh2983 -s off -f 14161/14161/14161 14162/14162/14162 14163/14163/14163 -f 14161/14161/14161 14163/14163/14163 14164/14164/14164 -g charts -o chart0000 -s off -f 14161/14161/14161 14162/14162/14162 14163/14163/14163 -f 14161/14161/14161 14163/14163/14163 14164/14164/14164 -v -9441.35 17706 2204.7 -vt 0.0137157 0.249382 -v -9441.35 17706 284.7 -vt 0.0137157 0.265045 -v -9441.35 17871 284.7 -vt 0.0153781 0.265045 -v -9441.35 17871 2204.7 -vt 0.0153781 0.249382 -o mesh2984 -s off -f 14165/14165/14165 14166/14166/14166 14167/14167/14167 -f 14165/14165/14165 14167/14167/14167 14168/14168/14168 -g charts -o chart0000 -s off -f 14165/14165/14165 14166/14166/14166 14167/14167/14167 -f 14165/14165/14165 14167/14167/14167 14168/14168/14168 -v -9441.35 17706 284.7 -vt 0.119285 0.35573 -v -10521.3 17706 284.7 -vt 0.128429 0.35573 -v -10521.3 17871 284.7 -vt 0.128429 0.357378 -v -9441.35 17871 284.7 -vt 0.119285 0.357378 -o mesh2985 -s off -f 14169/14169/14169 14170/14170/14170 14171/14171/14171 -f 14169/14169/14169 14171/14171/14171 14172/14172/14172 -g charts -o chart0000 -s off -f 14169/14169/14169 14170/14170/14170 14171/14171/14171 -f 14169/14169/14169 14171/14171/14171 14172/14172/14172 -v -10521.3 17706 284.7 -vt 0.948878 0.853669 -v -10521.3 17706 2204.7 -vt 0.948878 0.838005 -v -10521.3 17871 2204.7 -vt 0.947215 0.838005 -v -10521.3 17871 284.7 -vt 0.947215 0.853669 -o mesh2986 -s off -f 14173/14173/14173 14174/14174/14174 14175/14175/14175 -f 14173/14173/14173 14175/14175/14175 14176/14176/14176 -g charts -o chart0000 -s off -f 14173/14173/14173 14174/14174/14174 14175/14175/14175 -f 14173/14173/14173 14175/14175/14175 14176/14176/14176 -v -10483.8 17871 322.2 -vt 0.0810474 0.933636 -v -10483.8 17826 322.2 -vt 0.0815008 0.933636 -v -9478.85 17826 322.2 -vt 0.0815008 0.925392 -v -9478.85 17871 322.2 -vt 0.0810474 0.925392 -v -10483.8 17706 322.2 -vt 0.0827098 0.933636 -v -9478.85 17706 322.2 -vt 0.0827098 0.925392 -o mesh2987 -s off -f 14177/14177/14177 14178/14178/14178 14179/14179/14179 -f 14177/14177/14177 14179/14179/14179 14180/14180/14180 -f 14181/14181/14181 14182/14182/14182 14179/14179/14179 -f 14181/14181/14181 14179/14179/14179 14178/14178/14178 -g charts -o chart0000 -s off -f 14177/14177/14177 14178/14178/14178 14179/14179/14179 -f 14177/14177/14177 14179/14179/14179 14180/14180/14180 -f 14181/14181/14181 14182/14182/14182 14179/14179/14179 -f 14181/14181/14181 14179/14179/14179 14178/14178/14178 -v -9478.85 17871 322.2 -vt 0.300499 0.988871 -v -9478.85 17826 322.2 -vt 0.300499 0.98932 -v -9478.85 17826 2167.2 -vt 0.285536 0.98932 -v -9478.85 17871 2167.2 -vt 0.285536 0.988871 -v -9478.85 17706 322.2 -vt 0.300499 0.990519 -v -9478.85 17706 2167.2 -vt 0.285536 0.990519 -o mesh2988 -s off -f 14183/14183/14183 14184/14184/14184 14185/14185/14185 -f 14183/14183/14183 14185/14185/14185 14186/14186/14186 -f 14187/14187/14187 14188/14188/14188 14185/14185/14185 -f 14187/14187/14187 14185/14185/14185 14184/14184/14184 -g charts -o chart0000 -s off -f 14183/14183/14183 14184/14184/14184 14185/14185/14185 -f 14183/14183/14183 14185/14185/14185 14186/14186/14186 -f 14187/14187/14187 14188/14188/14188 14185/14185/14185 -f 14187/14187/14187 14185/14185/14185 14184/14184/14184 -v -9478.85 17871 2167.2 -vt 0.779302 0.988046 -v -9478.85 17826 2167.2 -vt 0.779302 0.987596 -v -10483.8 17826 2167.2 -vt 0.770989 0.987596 -v -10483.8 17871 2167.2 -vt 0.770989 0.988046 -v -9478.85 17706 2167.2 -vt 0.779302 0.986397 -v -10483.8 17706 2167.2 -vt 0.770989 0.986397 -o mesh2989 -s off -f 14189/14189/14189 14190/14190/14190 14191/14191/14191 -f 14189/14189/14189 14191/14191/14191 14192/14192/14192 -f 14193/14193/14193 14194/14194/14194 14191/14191/14191 -f 14193/14193/14193 14191/14191/14191 14190/14190/14190 -g charts -o chart0000 -s off -f 14189/14189/14189 14190/14190/14190 14191/14191/14191 -f 14189/14189/14189 14191/14191/14191 14192/14192/14192 -f 14193/14193/14193 14194/14194/14194 14191/14191/14191 -f 14193/14193/14193 14191/14191/14191 14190/14190/14190 -v -10483.8 17871 2167.2 -vt 0.776808 0.298846 -v -10483.8 17826 2167.2 -vt 0.776808 0.298396 -v -10483.8 17826 322.2 -vt 0.761845 0.298396 -v -10483.8 17871 322.2 -vt 0.761845 0.298846 -v -10483.8 17706 2167.2 -vt 0.776808 0.297197 -v -10483.8 17706 322.2 -vt 0.761845 0.297197 -o mesh2990 -s off -f 14195/14195/14195 14196/14196/14196 14197/14197/14197 -f 14195/14195/14195 14197/14197/14197 14198/14198/14198 -f 14199/14199/14199 14200/14200/14200 14197/14197/14197 -f 14199/14199/14199 14197/14197/14197 14196/14196/14196 -g charts -o chart0000 -s off -f 14195/14195/14195 14196/14196/14196 14197/14197/14197 -f 14195/14195/14195 14197/14197/14197 14198/14198/14198 -f 14199/14199/14199 14200/14200/14200 14197/14197/14197 -f 14199/14199/14199 14197/14197/14197 14196/14196/14196 -v -10483.8 17826 322.2 -vt 0.189111 0.895713 -v -10423.8 17826 382.2 -vt 0.189607 0.896537 -v -9478.85 17826 322.2 -vt 0.197423 0.895713 -v -9538.85 17826 382.2 -vt 0.196927 0.896537 -o mesh2991 -s off -f 14201/14201/14201 14202/14202/14202 14203/14203/14203 -f 14204/14204/14204 14203/14203/14203 14202/14202/14202 -g charts -o chart0000 -s off -f 14201/14201/14201 14202/14202/14202 14203/14203/14203 -f 14204/14204/14204 14203/14203/14203 14202/14202/14202 -v -10423.8 17826 382.2 -vt 0.326754 0.79019 -v -10483.8 17826 322.2 -vt 0.326268 0.791014 -v -10483.8 17826 2167.2 -vt 0.34123 0.791014 -o mesh2992 -s off -f 14205/14205/14205 14206/14206/14206 14207/14207/14207 -g charts -o chart0000 -s off -f 14205/14205/14205 14206/14206/14206 14207/14207/14207 -v -10423.8 17826 382.2 -vt 0.4335 0.819868 -v -10483.8 17826 2167.2 -vt 0.447631 0.819868 -v -10423.8 17826 2107.2 -vt 0.44714 0.819044 -o mesh2993 -s off -f 14208/14208/14208 14209/14209/14209 14210/14210/14210 -g charts -o chart0000 -s off -f 14208/14208/14208 14209/14209/14209 14210/14210/14210 -v -10423.8 17826 2107.2 -vt 0.484709 0.626958 -v -10483.8 17826 2167.2 -vt 0.484206 0.627782 -v -9538.85 17826 2107.2 -vt 0.491687 0.627782 -o mesh2994 -s off -f 14211/14211/14211 14212/14212/14212 14213/14213/14213 -g charts -o chart0000 -s off -f 14211/14211/14211 14212/14212/14212 14213/14213/14213 -v -9478.85 17826 322.2 -vt 0.802577 0.783594 -v -9538.85 17826 382.2 -vt 0.801746 0.783112 -v -9478.85 17826 2167.2 -vt 0.802577 0.768755 -o mesh2995 -s off -f 14214/14214/14214 14215/14215/14215 14216/14216/14216 -g charts -o chart0000 -s off -f 14214/14214/14214 14215/14215/14215 14216/14216/14216 -v -9478.85 17826 2167.2 -vt 0.697007 0.71352 -v -9538.85 17826 382.2 -vt 0.711139 0.71352 -v -9538.85 17826 2107.2 -vt 0.697498 0.712696 -o mesh2996 -s off -f 14217/14217/14217 14218/14218/14218 14219/14219/14219 -g charts -o chart0000 -s off -f 14217/14217/14217 14218/14218/14218 14219/14219/14219 -v -9478.85 17826 2167.2 -vt 0.968828 0.682193 -v -9538.85 17826 2107.2 -vt 0.967997 0.681701 -v -10483.8 17826 2167.2 -vt 0.968828 0.673949 -o mesh2997 -s off -f 14220/14220/14220 14221/14221/14221 14222/14222/14222 -g charts -o chart0000 -s off -f 14220/14220/14220 14221/14221/14221 14222/14222/14222 -v -9538.85 17706 2107.2 -vt 0.995428 0.497527 -v -9968.23 17751 2107.2 -vt 0.994804 0.493927 -v -9538.85 17826 2107.2 -vt 0.993766 0.497527 -v -10423.8 17706 2107.2 -vt 0.995428 0.490107 -v -9994.48 17751 2107.2 -vt 0.994804 0.493707 -v -9994.48 17781 2107.2 -vt 0.994389 0.493707 -v -9968.23 17781 2107.2 -vt 0.994389 0.493927 -v -10423.8 17826 2107.2 -vt 0.993766 0.490107 -o mesh2998 -s off -f 14223/14223/14223 14224/14224/14224 14225/14225/14225 -f 14224/14224/14224 14223/14223/14223 14226/14226/14226 -f 14224/14224/14224 14226/14226/14226 14227/14227/14227 -f 14227/14227/14227 14226/14226/14226 14228/14228/14228 -f 14225/14225/14225 14229/14229/14229 14230/14230/14230 -f 14229/14229/14229 14225/14225/14225 14224/14224/14224 -f 14230/14230/14230 14229/14229/14229 14228/14228/14228 -f 14230/14230/14230 14228/14228/14228 14226/14226/14226 -g charts -o chart0000 -s off -f 14223/14223/14223 14224/14224/14224 14225/14225/14225 -f 14224/14224/14224 14223/14223/14223 14226/14226/14226 -f 14224/14224/14224 14226/14226/14226 14227/14227/14227 -f 14227/14227/14227 14226/14226/14226 14228/14228/14228 -f 14225/14225/14225 14229/14229/14229 14230/14230/14230 -f 14229/14229/14229 14225/14225/14225 14224/14224/14224 -f 14230/14230/14230 14229/14229/14229 14228/14228/14228 -f 14230/14230/14230 14228/14228/14228 14226/14226/14226 -v -10423.8 17826 2107.2 -vt 0.0827098 0.682193 -v -10423.8 17781 1254.82 -vt 0.0757272 0.682811 -v -10423.8 17826 382.2 -vt 0.0685786 0.682193 -v -10423.8 17706 2107.2 -vt 0.0827098 0.683842 -v -10423.8 17751 1254.82 -vt 0.0757272 0.683223 -v -10423.8 17751 1234.58 -vt 0.0755613 0.683223 -v -10423.8 17781 1234.58 -vt 0.0755613 0.682811 -v -10423.8 17706 382.2 -vt 0.0685786 0.683842 -o mesh2999 -s off -f 14231/14231/14231 14232/14232/14232 14233/14233/14233 -f 14232/14232/14232 14231/14231/14231 14234/14234/14234 -f 14232/14232/14232 14234/14234/14234 14235/14235/14235 -f 14235/14235/14235 14234/14234/14234 14236/14236/14236 -f 14233/14233/14233 14237/14237/14237 14238/14238/14238 -f 14237/14237/14237 14233/14233/14233 14232/14232/14232 -f 14238/14238/14238 14237/14237/14237 14236/14236/14236 -f 14238/14238/14238 14236/14236/14236 14234/14234/14234 -g charts -o chart0000 -s off -f 14231/14231/14231 14232/14232/14232 14233/14233/14233 -f 14232/14232/14232 14231/14231/14231 14234/14234/14234 -f 14232/14232/14232 14234/14234/14234 14235/14235/14235 -f 14235/14235/14235 14234/14234/14234 14236/14236/14236 -f 14233/14233/14233 14237/14237/14237 14238/14238/14238 -f 14237/14237/14237 14233/14233/14233 14232/14232/14232 -f 14238/14238/14238 14237/14237/14237 14236/14236/14236 -f 14238/14238/14238 14236/14236/14236 14234/14234/14234 -v -9538.85 17826 382.2 -vt 0.00706567 0.527205 -v -9968.23 17781 382.2 -vt 0.00768919 0.523606 -v -9538.85 17706 382.2 -vt 0.0087281 0.527205 -v -10423.8 17826 382.2 -vt 0.00706567 0.519786 -v -9994.48 17781 382.2 -vt 0.00768919 0.523385 -v -9994.48 17751 382.2 -vt 0.00810469 0.523385 -v -9968.23 17751 382.2 -vt 0.00810469 0.523606 -v -10423.8 17706 382.2 -vt 0.0087281 0.519786 -o mesh3000 -s off -f 14239/14239/14239 14240/14240/14240 14241/14241/14241 -f 14240/14240/14240 14239/14239/14239 14242/14242/14242 -f 14240/14240/14240 14242/14242/14242 14243/14243/14243 -f 14243/14243/14243 14242/14242/14242 14244/14244/14244 -f 14241/14241/14241 14245/14245/14245 14246/14246/14246 -f 14245/14245/14245 14241/14241/14241 14240/14240/14240 -f 14246/14246/14246 14245/14245/14245 14244/14244/14244 -f 14246/14246/14246 14244/14244/14244 14242/14242/14242 -g charts -o chart0000 -s off -f 14239/14239/14239 14240/14240/14240 14241/14241/14241 -f 14240/14240/14240 14239/14239/14239 14242/14242/14242 -f 14240/14240/14240 14242/14242/14242 14243/14243/14243 -f 14243/14243/14243 14242/14242/14242 14244/14244/14244 -f 14241/14241/14241 14245/14245/14245 14246/14246/14246 -f 14245/14245/14245 14241/14241/14241 14240/14240/14240 -f 14246/14246/14246 14245/14245/14245 14244/14244/14244 -f 14246/14246/14246 14244/14244/14244 14242/14242/14242 -v -9538.85 17706 382.2 -vt 0.0303407 0.736603 -v -9538.85 17706 2107.2 -vt 0.0162095 0.736603 -v -9538.85 17826 2107.2 -vt 0.0162095 0.734955 -v -9538.85 17826 382.2 -vt 0.0303407 0.734955 -o mesh3001 -s off -f 14247/14247/14247 14248/14248/14248 14249/14249/14249 -f 14247/14247/14247 14249/14249/14249 14250/14250/14250 -g charts -o chart0000 -s off -f 14247/14247/14247 14248/14248/14248 14249/14249/14249 -f 14247/14247/14247 14249/14249/14249 14250/14250/14250 -v -9968.23 17751 2107.2 -vt 0.835827 0.971558 -v -9994.48 17751 2107.2 -vt 0.835827 0.970734 -v -9994.48 17751 382.2 -vt 0.821696 0.970734 -v -9968.23 17751 382.2 -vt 0.821696 0.971558 -o mesh3002 -s off -f 14251/14251/14251 14252/14252/14252 14253/14253/14253 -f 14251/14251/14251 14253/14253/14253 14254/14254/14254 -g charts -o chart0000 -s off -f 14251/14251/14251 14252/14252/14252 14253/14253/14253 -f 14251/14251/14251 14253/14253/14253 14254/14254/14254 -v -9994.48 17751 2107.2 -vt 0.0644222 0.197444 -v -9994.48 17781 2107.2 -vt 0.063591 0.197444 -v -9994.48 17781 382.2 -vt 0.063591 0.18343 -v -9994.48 17751 382.2 -vt 0.0644222 0.18343 -o mesh3003 -s off -f 14255/14255/14255 14256/14256/14256 14257/14257/14257 -f 14255/14255/14255 14257/14257/14257 14258/14258/14258 -g charts -o chart0000 -s off -f 14255/14255/14255 14256/14256/14256 14257/14257/14257 -f 14255/14255/14255 14257/14257/14257 14258/14258/14258 -v -9559.21 17781 1254.82 -vt 0.407731 0.598928 -v -9559.21 17751 1254.82 -vt 0.407731 0.599753 -v -9559.21 17751 1234.58 -vt 0.408562 0.599753 -v -9559.21 17781 1234.58 -vt 0.408562 0.598928 -o mesh3004 -s off -f 14259/14259/14259 14260/14260/14260 14261/14261/14261 -f 14259/14259/14259 14261/14261/14261 14262/14262/14262 -g charts -o chart0000 -s off -f 14259/14259/14259 14260/14260/14260 14261/14261/14261 -f 14259/14259/14259 14261/14261/14261 14262/14262/14262 -v -10423.8 17781 1254.82 -vt 0.405237 0.547815 -v -10423.8 17751 1254.82 -vt 0.405237 0.54864 -v -9559.21 17751 1254.82 -vt 0.397756 0.54864 -v -9559.21 17781 1254.82 -vt 0.397756 0.547815 -o mesh3005 -s off -f 14263/14263/14263 14264/14264/14264 14265/14265/14265 -f 14263/14263/14263 14265/14265/14265 14266/14266/14266 -g charts -o chart0000 -s off -f 14263/14263/14263 14264/14264/14264 14265/14265/14265 -f 14263/14263/14263 14265/14265/14265 14266/14266/14266 -v -10423.8 17751 1254.82 -vt 0.503325 0.978978 -v -10423.8 17751 1234.58 -vt 0.503325 0.979802 -v -9559.21 17751 1234.58 -vt 0.495844 0.979802 -v -9559.21 17751 1254.82 -vt 0.495844 0.978978 -o mesh3006 -s off -f 14267/14267/14267 14268/14268/14268 14269/14269/14269 -f 14267/14267/14267 14269/14269/14269 14270/14270/14270 -g charts -o chart0000 -s off -f 14267/14267/14267 14268/14268/14268 14269/14269/14269 -f 14267/14267/14267 14269/14269/14269 14270/14270/14270 -v -10423.8 17751 1234.58 -vt 0.0743973 0.938582 -v -10423.8 17781 1234.58 -vt 0.0752285 0.938582 -v -9559.21 17781 1234.58 -vt 0.0752285 0.931162 -v -9559.21 17751 1234.58 -vt 0.0743973 0.931162 -o mesh3007 -s off -f 14271/14271/14271 14272/14272/14272 14273/14273/14273 -f 14271/14271/14271 14273/14273/14273 14274/14274/14274 -g charts -o chart0000 -s off -f 14271/14271/14271 14272/14272/14272 14273/14273/14273 -f 14271/14271/14271 14273/14273/14273 14274/14274/14274 -v -10423.8 17781 1234.58 -vt 0.257273 0.493405 -v -10423.8 17781 1254.82 -vt 0.257273 0.494229 -v -9559.21 17781 1254.82 -vt 0.249792 0.494229 -v -9559.21 17781 1234.58 -vt 0.249792 0.493405 -o mesh3008 -s off -f 14275/14275/14275 14276/14276/14276 14277/14277/14277 -f 14275/14275/14275 14277/14277/14277 14278/14278/14278 -g charts -o chart0000 -s off -f 14275/14275/14275 14276/14276/14276 14277/14277/14277 -f 14275/14275/14275 14277/14277/14277 14278/14278/14278 -v -9968.23 17781 2107.2 -vt 0.844971 0.673949 -v -9968.23 17751 2107.2 -vt 0.844971 0.673124 -v -9968.23 17751 382.2 -vt 0.83084 0.673124 -v -9968.23 17781 382.2 -vt 0.83084 0.673949 -o mesh3009 -s off -f 14279/14279/14279 14280/14280/14280 14281/14281/14281 -f 14279/14279/14279 14281/14281/14281 14282/14282/14282 -g charts -o chart0000 -s off -f 14279/14279/14279 14280/14280/14280 14281/14281/14281 -f 14279/14279/14279 14281/14281/14281 14282/14282/14282 -v -9994.48 17781 2107.2 -vt 0.572319 0.34831 -v -9968.23 17781 2107.2 -vt 0.572319 0.347486 -v -9968.23 17781 382.2 -vt 0.558188 0.347486 -v -9994.48 17781 382.2 -vt 0.558188 0.34831 -o mesh3010 -s off -f 14283/14283/14283 14284/14284/14284 14285/14285/14285 -f 14283/14283/14283 14285/14285/14285 14286/14286/14286 -g charts -o chart0000 -s off -f 14283/14283/14283 14284/14284/14284 14285/14285/14285 -f 14283/14283/14283 14285/14285/14285 14286/14286/14286 -v -11691.3 17706 284.7 -vt 0.87074 0.30709 -v -11728.8 17706 322.2 -vt 0.869909 0.306775 -v -12771.3 17706 284.7 -vt 0.87074 0.298021 -v -12733.8 17706 322.2 -vt 0.869909 0.298336 -o mesh3011 -s off -f 14287/14287/14287 14288/14288/14288 14289/14289/14289 -f 14290/14290/14290 14289/14289/14289 14288/14288/14288 -g charts -o chart0000 -s off -f 14287/14287/14287 14288/14288/14288 14289/14289/14289 -f 14290/14290/14290 14289/14289/14289 14288/14288/14288 -v -11728.8 17706 322.2 -vt 0.707814 0.631386 -v -11691.3 17706 284.7 -vt 0.708645 0.63108 -v -11691.3 17706 2204.7 -vt 0.708645 0.646744 -o mesh3012 -s off -f 14291/14291/14291 14292/14292/14292 14293/14293/14293 -g charts -o chart0000 -s off -f 14291/14291/14291 14292/14292/14292 14293/14293/14293 -v -11728.8 17706 322.2 -vt 0.194929 0.976504 -v -11691.3 17706 2204.7 -vt 0.209892 0.976504 -v -11728.8 17706 2167.2 -vt 0.209588 0.97568 -o mesh3013 -s off -f 14294/14294/14294 14295/14295/14295 14296/14296/14296 -g charts -o chart0000 -s off -f 14294/14294/14294 14295/14295/14295 14296/14296/14296 -v -11728.8 17706 2167.2 -vt 0.347358 0.849547 -v -11691.3 17706 2204.7 -vt 0.347049 0.850371 -v -12733.8 17706 2167.2 -vt 0.355362 0.850371 -o mesh3014 -s off -f 14297/14297/14297 14298/14298/14298 14299/14299/14299 -g charts -o chart0000 -s off -f 14297/14297/14297 14298/14298/14298 14299/14299/14299 -v -12771.3 17706 284.7 -vt 0.885702 0.174361 -v -12733.8 17706 322.2 -vt 0.884871 0.174055 -v -12771.3 17706 2204.7 -vt 0.885702 0.158697 -o mesh3015 -s off -f 14300/14300/14300 14301/14301/14301 14302/14302/14302 -g charts -o chart0000 -s off -f 14300/14300/14300 14301/14301/14301 14302/14302/14302 -v -12771.3 17706 2204.7 -vt 0.90399 0.532152 -v -12733.8 17706 322.2 -vt 0.90399 0.546991 -v -12733.8 17706 2167.2 -vt 0.903159 0.532453 -o mesh3016 -s off -f 14303/14303/14303 14304/14304/14304 14305/14305/14305 -g charts -o chart0000 -s off -f 14303/14303/14303 14304/14304/14304 14305/14305/14305 -v -12771.3 17706 2204.7 -vt 0.992103 0.662407 -v -12733.8 17706 2167.2 -vt 0.991785 0.661583 -v -11691.3 17706 2204.7 -vt 0.982959 0.662407 -o mesh3017 -s off -f 14306/14306/14306 14307/14307/14307 14308/14308/14308 -g charts -o chart0000 -s off -f 14306/14306/14306 14307/14307/14307 14308/14308/14308 -v -12771.3 17871 284.7 -vt 0.330424 0.978978 -v -12733.8 17871 322.2 -vt 0.330741 0.979802 -v -11691.3 17871 284.7 -vt 0.339568 0.978978 -v -11728.8 17871 322.2 -vt 0.33925 0.979802 -o mesh3018 -s off -f 14309/14309/14309 14310/14310/14310 14311/14311/14311 -f 14312/14312/14312 14311/14311/14311 14310/14310/14310 -g charts -o chart0000 -s off -f 14309/14309/14309 14310/14310/14310 14311/14311/14311 -f 14312/14312/14312 14311/14311/14311 14310/14310/14310 -v -12733.8 17871 322.2 -vt 0.353176 0.668178 -v -12771.3 17871 284.7 -vt 0.352868 0.669002 -v -12771.3 17871 2204.7 -vt 0.368662 0.669002 -o mesh3019 -s off -f 14313/14313/14313 14314/14314/14314 14315/14315/14315 -g charts -o chart0000 -s off -f 14313/14313/14313 14314/14314/14314 14315/14315/14315 -v -12733.8 17871 322.2 -vt 0.371155 0.851195 -v -12771.3 17871 2204.7 -vt 0.386118 0.851195 -v -12733.8 17871 2167.2 -vt 0.385814 0.850371 -o mesh3020 -s off -f 14316/14316/14316 14317/14317/14317 14318/14318/14318 -g charts -o chart0000 -s off -f 14316/14316/14316 14317/14317/14317 14318/14318/14318 -v -12733.8 17871 2167.2 -vt 0.871571 0.132624 -v -12771.3 17871 2204.7 -vt 0.872402 0.132317 -v -11728.8 17871 2167.2 -vt 0.872402 0.140561 -o mesh3021 -s off -f 14319/14319/14319 14320/14320/14320 14321/14321/14321 -g charts -o chart0000 -s off -f 14319/14319/14319 14320/14320/14320 14321/14321/14321 -v -11691.3 17871 284.7 -vt 0.273067 0.490107 -v -11728.8 17871 322.2 -vt 0.272759 0.489283 -v -11691.3 17871 2204.7 -vt 0.257273 0.490107 -o mesh3022 -s off -f 14322/14322/14322 14323/14323/14323 14324/14324/14324 -g charts -o chart0000 -s off -f 14322/14322/14322 14323/14323/14323 14324/14324/14324 -v -11691.3 17871 2204.7 -vt 0.96384 0.567601 -v -11728.8 17871 322.2 -vt 0.96384 0.58244 -v -11728.8 17871 2167.2 -vt 0.963009 0.567902 -o mesh3023 -s off -f 14325/14325/14325 14326/14326/14326 14327/14327/14327 -g charts -o chart0000 -s off -f 14325/14325/14325 14326/14326/14326 14327/14327/14327 -v -11691.3 17871 2204.7 -vt 0.125935 0.54122 -v -11728.8 17871 2167.2 -vt 0.125617 0.540396 -v -12771.3 17871 2204.7 -vt 0.116791 0.54122 -o mesh3024 -s off -f 14328/14328/14328 14329/14329/14329 14330/14330/14330 -g charts -o chart0000 -s off -f 14328/14328/14328 14329/14329/14329 14330/14330/14330 -v -12771.3 17706 2204.7 -vt 0.183292 0.396125 -v -11691.3 17706 2204.7 -vt 0.183292 0.387057 -v -11691.3 17871 2204.7 -vt 0.181629 0.387057 -v -12771.3 17871 2204.7 -vt 0.181629 0.396125 -o mesh3025 -s off -f 14331/14331/14331 14332/14332/14332 14333/14333/14333 -f 14331/14331/14331 14333/14333/14333 14334/14334/14334 -g charts -o chart0000 -s off -f 14331/14331/14331 14332/14332/14332 14333/14333/14333 -f 14331/14331/14331 14333/14333/14333 14334/14334/14334 -v -11691.3 17706 2204.7 -vt 0.569825 0.992993 -v -11691.3 17706 284.7 -vt 0.585619 0.992993 -v -11691.3 17871 284.7 -vt 0.585619 0.994641 -v -11691.3 17871 2204.7 -vt 0.569825 0.994641 -o mesh3026 -s off -f 14335/14335/14335 14336/14336/14336 14337/14337/14337 -f 14335/14335/14335 14337/14337/14337 14338/14338/14338 -g charts -o chart0000 -s off -f 14335/14335/14335 14336/14336/14336 14337/14337/14337 -f 14335/14335/14335 14337/14337/14337 14338/14338/14338 -v -11691.3 17706 284.7 -vt 0.316293 0.997939 -v -12771.3 17706 284.7 -vt 0.325436 0.997939 -v -12771.3 17871 284.7 -vt 0.325436 0.999588 -v -11691.3 17871 284.7 -vt 0.316293 0.999588 -o mesh3027 -s off -f 14339/14339/14339 14340/14340/14340 14341/14341/14341 -f 14339/14339/14339 14341/14341/14341 14342/14342/14342 -g charts -o chart0000 -s off -f 14339/14339/14339 14340/14340/14340 14341/14341/14341 -f 14339/14339/14339 14341/14341/14341 14342/14342/14342 -v -12771.3 17706 284.7 -vt 0.972153 0.515664 -v -12771.3 17706 2204.7 -vt 0.972153 0.5 -v -12771.3 17871 2204.7 -vt 0.97049 0.5 -v -12771.3 17871 284.7 -vt 0.97049 0.515664 -o mesh3028 -s off -f 14343/14343/14343 14344/14344/14344 14345/14345/14345 -f 14343/14343/14343 14345/14345/14345 14346/14346/14346 -g charts -o chart0000 -s off -f 14343/14343/14343 14344/14344/14344 14345/14345/14345 -f 14343/14343/14343 14345/14345/14345 14346/14346/14346 -v -12733.8 17871 322.2 -vt 0.214048 0.849547 -v -12733.8 17826 322.2 -vt 0.214048 0.849996 -v -11728.8 17826 322.2 -vt 0.205736 0.849996 -v -11728.8 17871 322.2 -vt 0.205736 0.849547 -v -12733.8 17706 322.2 -vt 0.214048 0.851195 -v -11728.8 17706 322.2 -vt 0.205736 0.851195 -o mesh3029 -s off -f 14347/14347/14347 14348/14348/14348 14349/14349/14349 -f 14347/14347/14347 14349/14349/14349 14350/14350/14350 -f 14351/14351/14351 14352/14352/14352 14349/14349/14349 -f 14351/14351/14351 14349/14349/14349 14348/14348/14348 -g charts -o chart0000 -s off -f 14347/14347/14347 14348/14348/14348 14349/14349/14349 -f 14347/14347/14347 14349/14349/14349 14350/14350/14350 -f 14351/14351/14351 14352/14352/14352 14349/14349/14349 -f 14351/14351/14351 14349/14349/14349 14348/14348/14348 -v -11728.8 17871 322.2 -vt 0.118454 0.678071 -v -11728.8 17826 322.2 -vt 0.118454 0.678521 -v -11728.8 17826 2167.2 -vt 0.103491 0.678521 -v -11728.8 17871 2167.2 -vt 0.103491 0.678071 -v -11728.8 17706 322.2 -vt 0.118454 0.67972 -v -11728.8 17706 2167.2 -vt 0.103491 0.67972 -o mesh3030 -s off -f 14353/14353/14353 14354/14354/14354 14355/14355/14355 -f 14353/14353/14353 14355/14355/14355 14356/14356/14356 -f 14357/14357/14357 14358/14358/14358 14355/14355/14355 -f 14357/14357/14357 14355/14355/14355 14354/14354/14354 -g charts -o chart0000 -s off -f 14353/14353/14353 14354/14354/14354 14355/14355/14355 -f 14353/14353/14353 14355/14355/14355 14356/14356/14356 -f 14357/14357/14357 14358/14358/14358 14355/14355/14355 -f 14357/14357/14357 14355/14355/14355 14354/14354/14354 -v -11728.8 17871 2167.2 -vt 0.997922 0.930338 -v -11728.8 17826 2167.2 -vt 0.997468 0.930338 -v -12733.8 17826 2167.2 -vt 0.997468 0.922094 -v -12733.8 17871 2167.2 -vt 0.997922 0.922094 -v -11728.8 17706 2167.2 -vt 0.996259 0.930338 -v -12733.8 17706 2167.2 -vt 0.996259 0.922094 -o mesh3031 -s off -f 14359/14359/14359 14360/14360/14360 14361/14361/14361 -f 14359/14359/14359 14361/14361/14361 14362/14362/14362 -f 14363/14363/14363 14364/14364/14364 14361/14361/14361 -f 14363/14363/14363 14361/14361/14361 14360/14360/14360 -g charts -o chart0000 -s off -f 14359/14359/14359 14360/14360/14360 14361/14361/14361 -f 14359/14359/14359 14361/14361/14361 14362/14362/14362 -f 14363/14363/14363 14364/14364/14364 14361/14361/14361 -f 14363/14363/14363 14361/14361/14361 14360/14360/14360 -v -12733.8 17871 2167.2 -vt 0.224854 0.452185 -v -12733.8 17826 2167.2 -vt 0.224854 0.451735 -v -12733.8 17826 322.2 -vt 0.209892 0.451735 -v -12733.8 17871 322.2 -vt 0.209892 0.452185 -v -12733.8 17706 2167.2 -vt 0.224854 0.450536 -v -12733.8 17706 322.2 -vt 0.209892 0.450536 -o mesh3032 -s off -f 14365/14365/14365 14366/14366/14366 14367/14367/14367 -f 14365/14365/14365 14367/14367/14367 14368/14368/14368 -f 14369/14369/14369 14370/14370/14370 14367/14367/14367 -f 14369/14369/14369 14367/14367/14367 14366/14366/14366 -g charts -o chart0000 -s off -f 14365/14365/14365 14366/14366/14366 14367/14367/14367 -f 14365/14365/14365 14367/14367/14367 14368/14368/14368 -f 14369/14369/14369 14370/14370/14370 14367/14367/14367 -f 14369/14369/14369 14367/14367/14367 14366/14366/14366 -v -12733.8 17826 322.2 -vt 0.968828 0.65911 -v -12673.8 17826 382.2 -vt 0.969659 0.659602 -v -11728.8 17826 322.2 -vt 0.968828 0.667354 -v -11788.8 17826 382.2 -vt 0.969659 0.666861 -o mesh3033 -s off -f 14371/14371/14371 14372/14372/14372 14373/14373/14373 -f 14374/14374/14374 14373/14373/14373 14372/14372/14372 -g charts -o chart0000 -s off -f 14371/14371/14371 14372/14372/14372 14373/14373/14373 -f 14374/14374/14374 14373/14373/14373 14372/14372/14372 -v -12673.8 17826 382.2 -vt 0.968483 0.312861 -v -12733.8 17826 322.2 -vt 0.967997 0.313685 -v -12733.8 17826 2167.2 -vt 0.982959 0.313685 -o mesh3034 -s off -f 14375/14375/14375 14376/14376/14376 14377/14377/14377 -g charts -o chart0000 -s off -f 14375/14375/14375 14376/14376/14376 14377/14377/14377 -v -12673.8 17826 382.2 -vt 0.908146 0.00700742 -v -12733.8 17826 2167.2 -vt 0.908146 0.0210222 -v -12673.8 17826 2107.2 -vt 0.907315 0.0205358 -o mesh3035 -s off -f 14378/14378/14378 14379/14379/14379 14380/14380/14380 -g charts -o chart0000 -s off -f 14378/14378/14378 14379/14379/14379 14380/14380/14380 -v -12673.8 17826 2107.2 -vt 0.977644 0.206513 -v -12733.8 17826 2167.2 -vt 0.97714 0.207337 -v -11788.8 17826 2107.2 -vt 0.984622 0.207337 -o mesh3036 -s off -f 14381/14381/14381 14382/14382/14382 14383/14383/14383 -g charts -o chart0000 -s off -f 14381/14381/14381 14382/14382/14382 14383/14383/14383 -v -11728.8 17826 322.2 -vt 0.790939 0.410964 -v -11788.8 17826 382.2 -vt 0.790108 0.410482 -v -11728.8 17826 2167.2 -vt 0.790939 0.396125 -o mesh3037 -s off -f 14384/14384/14384 14385/14385/14385 14386/14386/14386 -g charts -o chart0000 -s off -f 14384/14384/14384 14385/14385/14385 14386/14386/14386 -v -11728.8 17826 2167.2 -vt 0.886534 0.203215 -v -11788.8 17826 382.2 -vt 0.886534 0.21723 -v -11788.8 17826 2107.2 -vt 0.885702 0.203702 -o mesh3038 -s off -f 14387/14387/14387 14388/14388/14388 14389/14389/14389 -g charts -o chart0000 -s off -f 14387/14387/14387 14388/14388/14388 14389/14389/14389 -v -11728.8 17826 2167.2 -vt 0.65212 0.912201 -v -11788.8 17826 2107.2 -vt 0.651288 0.911709 -v -12733.8 17826 2167.2 -vt 0.65212 0.903957 -o mesh3039 -s off -f 14390/14390/14390 14391/14391/14391 14392/14392/14392 -g charts -o chart0000 -s off -f 14390/14390/14390 14391/14391/14391 14392/14392/14392 -v -11788.8 17706 2107.2 -vt 0.894846 0.681368 -v -12218.2 17751 2107.2 -vt 0.891216 0.68075 -v -11788.8 17826 2107.2 -vt 0.894846 0.67972 -v -12673.8 17706 2107.2 -vt 0.887365 0.681368 -v -12244.5 17751 2107.2 -vt 0.890995 0.68075 -v -12244.5 17781 2107.2 -vt 0.890995 0.680338 -v -12218.2 17781 2107.2 -vt 0.891216 0.680338 -v -12673.8 17826 2107.2 -vt 0.887365 0.67972 -o mesh3040 -s off -f 14393/14393/14393 14394/14394/14394 14395/14395/14395 -f 14394/14394/14394 14393/14393/14393 14396/14396/14396 -f 14394/14394/14394 14396/14396/14396 14397/14397/14397 -f 14397/14397/14397 14396/14396/14396 14398/14398/14398 -f 14395/14395/14395 14399/14399/14399 14400/14400/14400 -f 14399/14399/14399 14395/14395/14395 14394/14394/14394 -f 14400/14400/14400 14399/14399/14399 14398/14398/14398 -f 14400/14400/14400 14398/14398/14398 14396/14396/14396 -g charts -o chart0000 -s off -f 14393/14393/14393 14394/14394/14394 14395/14395/14395 -f 14394/14394/14394 14393/14393/14393 14396/14396/14396 -f 14394/14394/14394 14396/14396/14396 14397/14397/14397 -f 14397/14397/14397 14396/14396/14396 14398/14398/14398 -f 14395/14395/14395 14399/14399/14399 14400/14400/14400 -f 14399/14399/14399 14395/14395/14395 14394/14394/14394 -f 14400/14400/14400 14399/14399/14399 14398/14398/14398 -f 14400/14400/14400 14398/14398/14398 14396/14396/14396 -v -12673.8 17826 2107.2 -vt 0.947215 0.555235 -v -12673.8 17781 1254.82 -vt 0.940233 0.555853 -v -12673.8 17826 382.2 -vt 0.933084 0.555235 -v -12673.8 17706 2107.2 -vt 0.947215 0.556884 -v -12673.8 17751 1254.82 -vt 0.940233 0.556265 -v -12673.8 17751 1234.58 -vt 0.940067 0.556265 -v -12673.8 17781 1234.58 -vt 0.940067 0.555853 -v -12673.8 17706 382.2 -vt 0.933084 0.556884 -o mesh3041 -s off -f 14401/14401/14401 14402/14402/14402 14403/14403/14403 -f 14402/14402/14402 14401/14401/14401 14404/14404/14404 -f 14402/14402/14402 14404/14404/14404 14405/14405/14405 -f 14405/14405/14405 14404/14404/14404 14406/14406/14406 -f 14403/14403/14403 14407/14407/14407 14408/14408/14408 -f 14407/14407/14407 14403/14403/14403 14402/14402/14402 -f 14408/14408/14408 14407/14407/14407 14406/14406/14406 -f 14408/14408/14408 14406/14406/14406 14404/14404/14404 -g charts -o chart0000 -s off -f 14401/14401/14401 14402/14402/14402 14403/14403/14403 -f 14402/14402/14402 14401/14401/14401 14404/14404/14404 -f 14402/14402/14402 14404/14404/14404 14405/14405/14405 -f 14405/14405/14405 14404/14404/14404 14406/14406/14406 -f 14403/14403/14403 14407/14407/14407 14408/14408/14408 -f 14407/14407/14407 14403/14403/14403 14402/14402/14402 -f 14408/14408/14408 14407/14407/14407 14406/14406/14406 -f 14408/14408/14408 14406/14406/14406 14404/14404/14404 -v -11788.8 17826 382.2 -vt 0.899834 0.573372 -v -12218.2 17781 382.2 -vt 0.900457 0.569772 -v -11788.8 17706 382.2 -vt 0.901496 0.573372 -v -12673.8 17826 382.2 -vt 0.899834 0.565952 -v -12244.5 17781 382.2 -vt 0.900457 0.569552 -v -12244.5 17751 382.2 -vt 0.900873 0.569552 -v -12218.2 17751 382.2 -vt 0.900873 0.569772 -v -12673.8 17706 382.2 -vt 0.901496 0.565952 -o mesh3042 -s off -f 14409/14409/14409 14410/14410/14410 14411/14411/14411 -f 14410/14410/14410 14409/14409/14409 14412/14412/14412 -f 14410/14410/14410 14412/14412/14412 14413/14413/14413 -f 14413/14413/14413 14412/14412/14412 14414/14414/14414 -f 14411/14411/14411 14415/14415/14415 14416/14416/14416 -f 14415/14415/14415 14411/14411/14411 14410/14410/14410 -f 14416/14416/14416 14415/14415/14415 14414/14414/14414 -f 14416/14416/14416 14414/14414/14414 14412/14412/14412 -g charts -o chart0000 -s off -f 14409/14409/14409 14410/14410/14410 14411/14411/14411 -f 14410/14410/14410 14409/14409/14409 14412/14412/14412 -f 14410/14410/14410 14412/14412/14412 14413/14413/14413 -f 14413/14413/14413 14412/14412/14412 14414/14414/14414 -f 14411/14411/14411 14415/14415/14415 14416/14416/14416 -f 14415/14415/14415 14411/14411/14411 14410/14410/14410 -f 14416/14416/14416 14415/14415/14415 14414/14414/14414 -f 14416/14416/14416 14414/14414/14414 14412/14412/14412 -v -11788.8 17706 382.2 -vt 0.510806 0.977329 -v -11788.8 17706 2107.2 -vt 0.496675 0.977329 -v -11788.8 17826 2107.2 -vt 0.496675 0.97568 -v -11788.8 17826 382.2 -vt 0.510806 0.97568 -o mesh3043 -s off -f 14417/14417/14417 14418/14418/14418 14419/14419/14419 -f 14417/14417/14417 14419/14419/14419 14420/14420/14420 -g charts -o chart0000 -s off -f 14417/14417/14417 14418/14418/14418 14419/14419/14419 -f 14417/14417/14417 14419/14419/14419 14420/14420/14420 -v -12218.2 17751 2107.2 -vt 0.310474 0.45878 -v -12244.5 17751 2107.2 -vt 0.310474 0.457955 -v -12244.5 17751 382.2 -vt 0.296342 0.457955 -v -12218.2 17751 382.2 -vt 0.296342 0.45878 -o mesh3044 -s off -f 14421/14421/14421 14422/14422/14422 14423/14423/14423 -f 14421/14421/14421 14423/14423/14423 14424/14424/14424 -g charts -o chart0000 -s off -f 14421/14421/14421 14422/14422/14422 14423/14423/14423 -f 14421/14421/14421 14423/14423/14423 14424/14424/14424 -v -12244.5 17751 2107.2 -vt 0.813383 0.577494 -v -12244.5 17781 2107.2 -vt 0.812552 0.577494 -v -12244.5 17781 382.2 -vt 0.812552 0.563479 -v -12244.5 17751 382.2 -vt 0.813383 0.563479 -o mesh3045 -s off -f 14425/14425/14425 14426/14426/14426 14427/14427/14427 -f 14425/14425/14425 14427/14427/14427 14428/14428/14428 -g charts -o chart0000 -s off -f 14425/14425/14425 14426/14426/14426 14427/14427/14427 -f 14425/14425/14425 14427/14427/14427 14428/14428/14428 -v -11809.2 17781 1254.82 -vt 0.55985 0.858615 -v -11809.2 17751 1254.82 -vt 0.55985 0.859439 -v -11809.2 17751 1234.58 -vt 0.560682 0.859439 -v -11809.2 17781 1234.58 -vt 0.560682 0.858615 -o mesh3046 -s off -f 14429/14429/14429 14430/14430/14430 14431/14431/14431 -f 14429/14429/14429 14431/14431/14431 14432/14432/14432 -g charts -o chart0000 -s off -f 14429/14429/14429 14430/14430/14430 14431/14431/14431 -f 14429/14429/14429 14431/14431/14431 14432/14432/14432 -v -12673.8 17781 1254.82 -vt 0.32793 0.566777 -v -12673.8 17751 1254.82 -vt 0.328761 0.566777 -v -11809.2 17751 1254.82 -vt 0.328761 0.559357 -v -11809.2 17781 1254.82 -vt 0.32793 0.559357 -o mesh3047 -s off -f 14433/14433/14433 14434/14434/14434 14435/14435/14435 -f 14433/14433/14433 14435/14435/14435 14436/14436/14436 -g charts -o chart0000 -s off -f 14433/14433/14433 14434/14434/14434 14435/14435/14435 -f 14433/14433/14433 14435/14435/14435 14436/14436/14436 -v -12673.8 17751 1254.82 -vt 0.969659 0.856966 -v -12673.8 17751 1234.58 -vt 0.97049 0.856966 -v -11809.2 17751 1234.58 -vt 0.97049 0.849547 -v -11809.2 17751 1254.82 -vt 0.969659 0.849547 -o mesh3048 -s off -f 14437/14437/14437 14438/14438/14438 14439/14439/14439 -f 14437/14437/14437 14439/14439/14439 14440/14440/14440 -g charts -o chart0000 -s off -f 14437/14437/14437 14438/14438/14438 14439/14439/14439 -f 14437/14437/14437 14439/14439/14439 14440/14440/14440 -v -12673.8 17751 1234.58 -vt 0.207398 0.979802 -v -12673.8 17781 1234.58 -vt 0.207398 0.980626 -v -11809.2 17781 1234.58 -vt 0.199917 0.980626 -v -11809.2 17751 1234.58 -vt 0.199917 0.979802 -o mesh3049 -s off -f 14441/14441/14441 14442/14442/14442 14443/14443/14443 -f 14441/14441/14441 14443/14443/14443 14444/14444/14444 -g charts -o chart0000 -s off -f 14441/14441/14441 14442/14442/14442 14443/14443/14443 -f 14441/14441/14441 14443/14443/14443 14444/14444/14444 -v -12673.8 17781 1234.58 -vt 0.196592 0.440643 -v -12673.8 17781 1254.82 -vt 0.196592 0.441467 -v -11809.2 17781 1254.82 -vt 0.189111 0.441467 -v -11809.2 17781 1234.58 -vt 0.189111 0.440643 -o mesh3050 -s off -f 14445/14445/14445 14446/14446/14446 14447/14447/14447 -f 14445/14445/14445 14447/14447/14447 14448/14448/14448 -g charts -o chart0000 -s off -f 14445/14445/14445 14446/14446/14446 14447/14447/14447 -f 14445/14445/14445 14447/14447/14447 14448/14448/14448 -v -12218.2 17781 2107.2 -vt 0.283042 0.997114 -v -12218.2 17751 2107.2 -vt 0.283042 0.99629 -v -12218.2 17751 382.2 -vt 0.268911 0.99629 -v -12218.2 17781 382.2 -vt 0.268911 0.997114 -o mesh3051 -s off -f 14449/14449/14449 14450/14450/14450 14451/14451/14451 -f 14449/14449/14449 14451/14451/14451 14452/14452/14452 -g charts -o chart0000 -s off -f 14449/14449/14449 14450/14450/14450 14451/14451/14451 -f 14449/14449/14449 14451/14451/14451 14452/14452/14452 -v -12244.5 17781 2107.2 -vt 0.366999 0.591509 -v -12218.2 17781 2107.2 -vt 0.366168 0.591509 -v -12218.2 17781 382.2 -vt 0.366168 0.577494 -v -12244.5 17781 382.2 -vt 0.366999 0.577494 -o mesh3052 -s off -f 14453/14453/14453 14454/14454/14454 14455/14455/14455 -f 14453/14453/14453 14455/14455/14455 14456/14456/14456 -g charts -o chart0000 -s off -f 14453/14453/14453 14454/14454/14454 14455/14455/14455 -f 14453/14453/14453 14455/14455/14455 14456/14456/14456 -v -10566.3 17706 284.7 -vt 0.627182 0.799258 -v -10603.8 17706 322.2 -vt 0.626351 0.798943 -v -11646.3 17706 284.7 -vt 0.627182 0.79019 -v -11608.8 17706 322.2 -vt 0.626351 0.790505 -o mesh3053 -s off -f 14457/14457/14457 14458/14458/14458 14459/14459/14459 -f 14460/14460/14460 14459/14459/14459 14458/14458/14458 -g charts -o chart0000 -s off -f 14457/14457/14457 14458/14458/14458 14459/14459/14459 -f 14460/14460/14460 14459/14459/14459 14458/14458/14458 -v -10603.8 17706 322.2 -vt 0.455112 0.904263 -v -10566.3 17706 284.7 -vt 0.455943 0.903957 -v -10566.3 17706 2204.7 -vt 0.455943 0.919621 -o mesh3054 -s off -f 14461/14461/14461 14462/14462/14462 14463/14463/14463 -g charts -o chart0000 -s off -f 14461/14461/14461 14462/14462/14462 14463/14463/14463 -v -10603.8 17706 322.2 -vt 0.948046 0.177659 -v -10566.3 17706 2204.7 -vt 0.948046 0.192498 -v -10603.8 17706 2167.2 -vt 0.947215 0.192196 -o mesh3055 -s off -f 14464/14464/14464 14465/14465/14465 14466/14466/14466 -g charts -o chart0000 -s off -f 14464/14464/14464 14465/14465/14465 14466/14466/14466 -v -10603.8 17706 2167.2 -vt 0.184432 0.886645 -v -10566.3 17706 2204.7 -vt 0.184123 0.887469 -v -11608.8 17706 2167.2 -vt 0.192435 0.887469 -o mesh3056 -s off -f 14467/14467/14467 14468/14468/14468 14469/14469/14469 -g charts -o chart0000 -s off -f 14467/14467/14467 14468/14468/14468 14469/14469/14469 -v -11646.3 17706 284.7 -vt 0.687032 0.375515 -v -11608.8 17706 322.2 -vt 0.686724 0.374691 -v -11646.3 17706 2204.7 -vt 0.671239 0.375515 -o mesh3057 -s off -f 14470/14470/14470 14471/14471/14471 14472/14472/14472 -g charts -o chart0000 -s off -f 14470/14470/14470 14471/14471/14471 14472/14472/14472 -v -11646.3 17706 2204.7 -vt 0.12926 0.54122 -v -11608.8 17706 322.2 -vt 0.144223 0.54122 -v -11608.8 17706 2167.2 -vt 0.129564 0.540396 -o mesh3058 -s off -f 14473/14473/14473 14474/14474/14474 14475/14475/14475 -g charts -o chart0000 -s off -f 14473/14473/14473 14474/14474/14474 14475/14475/14475 -v -11646.3 17706 2204.7 -vt 0.332918 0.34089 -v -11608.8 17706 2167.2 -vt 0.3326 0.340066 -v -10566.3 17706 2204.7 -vt 0.323774 0.34089 -o mesh3059 -s off -f 14476/14476/14476 14477/14477/14477 14478/14478/14478 -g charts -o chart0000 -s off -f 14476/14476/14476 14477/14477/14477 14478/14478/14478 -v -11646.3 17871 284.7 -vt 0.0810474 0.48681 -v -11608.8 17871 322.2 -vt 0.0813648 0.487634 -v -10566.3 17871 284.7 -vt 0.0901911 0.48681 -v -10603.8 17871 322.2 -vt 0.0898736 0.487634 -o mesh3060 -s off -f 14479/14479/14479 14480/14480/14480 14481/14481/14481 -f 14482/14482/14482 14481/14481/14481 14480/14480/14480 -g charts -o chart0000 -s off -f 14479/14479/14479 14480/14480/14480 14481/14481/14481 -f 14482/14482/14482 14481/14481/14481 14480/14480/14480 -v -11608.8 17871 322.2 -vt 0.603076 0.51597 -v -11646.3 17871 284.7 -vt 0.603907 0.515664 -v -11646.3 17871 2204.7 -vt 0.603907 0.531327 -o mesh3061 -s off -f 14483/14483/14483 14484/14484/14484 14485/14485/14485 -g charts -o chart0000 -s off -f 14483/14483/14483 14484/14484/14484 14485/14485/14485 -v -11608.8 17871 322.2 -vt 0.346218 0.992168 -v -11646.3 17871 2204.7 -vt 0.36118 0.992168 -v -11608.8 17871 2167.2 -vt 0.360876 0.991344 -o mesh3062 -s off -f 14486/14486/14486 14487/14487/14487 14488/14488/14488 -g charts -o chart0000 -s off -f 14486/14486/14486 14487/14487/14487 14488/14488/14488 -v -11608.8 17871 2167.2 -vt 0.866062 0.673949 -v -11646.3 17871 2204.7 -vt 0.865752 0.674773 -v -10603.8 17871 2167.2 -vt 0.874065 0.674773 -o mesh3063 -s off -f 14489/14489/14489 14490/14490/14490 14491/14491/14491 -g charts -o chart0000 -s off -f 14489/14489/14489 14490/14490/14490 14491/14491/14491 -v -10566.3 17871 284.7 -vt 0.344555 0.432399 -v -10603.8 17871 322.2 -vt 0.344247 0.431575 -v -10566.3 17871 2204.7 -vt 0.328761 0.432399 -o mesh3064 -s off -f 14492/14492/14492 14493/14493/14493 14494/14494/14494 -g charts -o chart0000 -s off -f 14492/14492/14492 14493/14493/14493 14494/14494/14494 -v -10566.3 17871 2204.7 -vt 0.0353283 0.427453 -v -10603.8 17871 322.2 -vt 0.0353283 0.442292 -v -10603.8 17871 2167.2 -vt 0.0344971 0.427754 -o mesh3065 -s off -f 14495/14495/14495 14496/14496/14496 14497/14497/14497 -g charts -o chart0000 -s off -f 14495/14495/14495 14496/14496/14496 14497/14497/14497 -v -10566.3 17871 2204.7 -vt 0.913134 0.243611 -v -10603.8 17871 2167.2 -vt 0.912816 0.242786 -v -11646.3 17871 2204.7 -vt 0.90399 0.243611 -o mesh3066 -s off -f 14498/14498/14498 14499/14499/14499 14500/14500/14500 -g charts -o chart0000 -s off -f 14498/14498/14498 14499/14499/14499 14500/14500/14500 -v -11646.3 17706 2204.7 -vt 0.485037 0.597279 -v -10566.3 17706 2204.7 -vt 0.475894 0.597279 -v -10566.3 17871 2204.7 -vt 0.475894 0.595631 -v -11646.3 17871 2204.7 -vt 0.485037 0.595631 -o mesh3067 -s off -f 14501/14501/14501 14502/14502/14502 14503/14503/14503 -f 14501/14501/14501 14503/14503/14503 14504/14504/14504 -g charts -o chart0000 -s off -f 14501/14501/14501 14502/14502/14502 14503/14503/14503 -f 14501/14501/14501 14503/14503/14503 14504/14504/14504 -v -10566.3 17706 2204.7 -vt 0.901496 0.994641 -v -10566.3 17706 284.7 -vt 0.91729 0.994641 -v -10566.3 17871 284.7 -vt 0.91729 0.99629 -v -10566.3 17871 2204.7 -vt 0.901496 0.99629 -o mesh3068 -s off -f 14505/14505/14505 14506/14506/14506 14507/14507/14507 -f 14505/14505/14505 14507/14507/14507 14508/14508/14508 -g charts -o chart0000 -s off -f 14505/14505/14505 14506/14506/14506 14507/14507/14507 -f 14505/14505/14505 14507/14507/14507 14508/14508/14508 -v -10566.3 17706 284.7 -vt 0.470906 0.701979 -v -11646.3 17706 284.7 -vt 0.470906 0.711047 -v -11646.3 17871 284.7 -vt 0.472568 0.711047 -v -10566.3 17871 284.7 -vt 0.472568 0.701979 -o mesh3069 -s off -f 14509/14509/14509 14510/14510/14510 14511/14511/14511 -f 14509/14509/14509 14511/14511/14511 14512/14512/14512 -g charts -o chart0000 -s off -f 14509/14509/14509 14510/14510/14510 14511/14511/14511 -f 14509/14509/14509 14511/14511/14511 14512/14512/14512 -v -11646.3 17706 284.7 -vt 0.948046 0.272465 -v -11646.3 17706 2204.7 -vt 0.932253 0.272465 -v -11646.3 17871 2204.7 -vt 0.932253 0.270816 -v -11646.3 17871 284.7 -vt 0.948046 0.270816 -o mesh3070 -s off -f 14513/14513/14513 14514/14514/14514 14515/14515/14515 -f 14513/14513/14513 14515/14515/14515 14516/14516/14516 -g charts -o chart0000 -s off -f 14513/14513/14513 14514/14514/14514 14515/14515/14515 -f 14513/14513/14513 14515/14515/14515 14516/14516/14516 -v -11608.8 17871 322.2 -vt 0.834165 0.781121 -v -11608.8 17826 322.2 -vt 0.834165 0.781571 -v -10603.8 17826 322.2 -vt 0.825852 0.781571 -v -10603.8 17871 322.2 -vt 0.825852 0.781121 -v -11608.8 17706 322.2 -vt 0.834165 0.78277 -v -10603.8 17706 322.2 -vt 0.825852 0.78277 -o mesh3071 -s off -f 14517/14517/14517 14518/14518/14518 14519/14519/14519 -f 14517/14517/14517 14519/14519/14519 14520/14520/14520 -f 14521/14521/14521 14522/14522/14522 14519/14519/14519 -f 14521/14521/14521 14519/14519/14519 14518/14518/14518 -g charts -o chart0000 -s off -f 14517/14517/14517 14518/14518/14518 14519/14519/14519 -f 14517/14517/14517 14519/14519/14519 14520/14520/14520 -f 14521/14521/14521 14522/14522/14522 14519/14519/14519 -f 14521/14521/14521 14519/14519/14519 14518/14518/14518 -v -10603.8 17871 322.2 -vt 0.825852 0.200742 -v -10603.8 17826 322.2 -vt 0.826305 0.200742 -v -10603.8 17826 2167.2 -vt 0.826305 0.185903 -v -10603.8 17871 2167.2 -vt 0.825852 0.185903 -v -10603.8 17706 322.2 -vt 0.827514 0.200742 -v -10603.8 17706 2167.2 -vt 0.827514 0.185903 -o mesh3072 -s off -f 14523/14523/14523 14524/14524/14524 14525/14525/14525 -f 14523/14523/14523 14525/14525/14525 14526/14526/14526 -f 14527/14527/14527 14528/14528/14528 14525/14525/14525 -f 14527/14527/14527 14525/14525/14525 14524/14524/14524 -g charts -o chart0000 -s off -f 14523/14523/14523 14524/14524/14524 14525/14525/14525 -f 14523/14523/14523 14525/14525/14525 14526/14526/14526 -f 14527/14527/14527 14528/14528/14528 14525/14525/14525 -f 14527/14527/14527 14525/14525/14525 14524/14524/14524 -v -10603.8 17871 2167.2 -vt 0.159185 0.304617 -v -10603.8 17826 2167.2 -vt 0.158732 0.304617 -v -11608.8 17826 2167.2 -vt 0.158732 0.296373 -v -11608.8 17871 2167.2 -vt 0.159185 0.296373 -v -10603.8 17706 2167.2 -vt 0.157523 0.304617 -v -11608.8 17706 2167.2 -vt 0.157523 0.296373 -o mesh3073 -s off -f 14529/14529/14529 14530/14530/14530 14531/14531/14531 -f 14529/14529/14529 14531/14531/14531 14532/14532/14532 -f 14533/14533/14533 14534/14534/14534 14531/14531/14531 -f 14533/14533/14533 14531/14531/14531 14530/14530/14530 -g charts -o chart0000 -s off -f 14529/14529/14529 14530/14530/14530 14531/14531/14531 -f 14529/14529/14529 14531/14531/14531 14532/14532/14532 -f 14533/14533/14533 14534/14534/14534 14531/14531/14531 -f 14533/14533/14533 14531/14531/14531 14530/14530/14530 -v -11608.8 17871 2167.2 -vt 0.515794 0.450536 -v -11608.8 17826 2167.2 -vt 0.515794 0.450086 -v -11608.8 17826 322.2 -vt 0.500831 0.450086 -v -11608.8 17871 322.2 -vt 0.500831 0.450536 -v -11608.8 17706 2167.2 -vt 0.515794 0.448887 -v -11608.8 17706 322.2 -vt 0.500831 0.448887 -o mesh3074 -s off -f 14535/14535/14535 14536/14536/14536 14537/14537/14537 -f 14535/14535/14535 14537/14537/14537 14538/14538/14538 -f 14539/14539/14539 14540/14540/14540 14537/14537/14537 -f 14539/14539/14539 14537/14537/14537 14536/14536/14536 -g charts -o chart0000 -s off -f 14535/14535/14535 14536/14536/14536 14537/14537/14537 -f 14535/14535/14535 14537/14537/14537 14538/14538/14538 -f 14539/14539/14539 14540/14540/14540 14537/14537/14537 -f 14539/14539/14539 14537/14537/14537 14536/14536/14536 -v -11608.8 17826 322.2 -vt 0.954697 0.648392 -v -11548.8 17826 382.2 -vt 0.955193 0.649217 -v -10603.8 17826 322.2 -vt 0.963009 0.648392 -v -10663.8 17826 382.2 -vt 0.962513 0.649217 -o mesh3075 -s off -f 14541/14541/14541 14542/14542/14542 14543/14543/14543 -f 14544/14544/14544 14543/14543/14543 14542/14542/14542 -g charts -o chart0000 -s off -f 14541/14541/14541 14542/14542/14542 14543/14543/14543 -f 14544/14544/14544 14543/14543/14543 14542/14542/14542 -v -11548.8 17826 382.2 -vt 0.115129 0.92505 -v -11608.8 17826 322.2 -vt 0.11596 0.924567 -v -11608.8 17826 2167.2 -vt 0.11596 0.939406 -o mesh3076 -s off -f 14545/14545/14545 14546/14546/14546 14547/14547/14547 -g charts -o chart0000 -s off -f 14545/14545/14545 14546/14546/14546 14547/14547/14547 -v -11548.8 17826 382.2 -vt 0.430175 0.976504 -v -11608.8 17826 2167.2 -vt 0.444306 0.976504 -v -11548.8 17826 2107.2 -vt 0.443815 0.97568 -o mesh3077 -s off -f 14548/14548/14548 14549/14549/14549 14550/14550/14550 -g charts -o chart0000 -s off -f 14548/14548/14548 14549/14549/14549 14550/14550/14550 -v -11548.8 17826 2107.2 -vt 0.680885 0.587387 -v -11608.8 17826 2167.2 -vt 0.680382 0.588211 -v -10663.8 17826 2107.2 -vt 0.687864 0.588211 -o mesh3078 -s off -f 14551/14551/14551 14552/14552/14552 14553/14553/14553 -g charts -o chart0000 -s off -f 14551/14551/14551 14552/14552/14552 14553/14553/14553 -v -10603.8 17826 322.2 -vt 0.647132 0.702803 -v -10663.8 17826 382.2 -vt 0.646645 0.701979 -v -10603.8 17826 2167.2 -vt 0.63217 0.702803 -o mesh3079 -s off -f 14554/14554/14554 14555/14555/14555 14556/14556/14556 -g charts -o chart0000 -s off -f 14554/14554/14554 14555/14555/14555 14556/14556/14556 -v -10603.8 17826 2167.2 -vt 0.96384 0.5338 -v -10663.8 17826 382.2 -vt 0.977972 0.5338 -v -10663.8 17826 2107.2 -vt 0.964331 0.532976 -o mesh3080 -s off -f 14557/14557/14557 14558/14558/14558 14559/14559/14559 -g charts -o chart0000 -s off -f 14557/14557/14557 14558/14558/14558 14559/14559/14559 -v -10603.8 17826 2167.2 -vt 0.613882 0.786892 -v -10663.8 17826 2107.2 -vt 0.613051 0.7864 -v -11608.8 17826 2167.2 -vt 0.613882 0.778648 -o mesh3081 -s off -f 14560/14560/14560 14561/14561/14561 14562/14562/14562 -g charts -o chart0000 -s off -f 14560/14560/14560 14561/14561/14561 14562/14562/14562 -v -10663.8 17706 2107.2 -vt 0.580632 0.897362 -v -11093.2 17751 2107.2 -vt 0.577002 0.896744 -v -10663.8 17826 2107.2 -vt 0.580632 0.895713 -v -11548.8 17706 2107.2 -vt 0.57315 0.897362 -v -11119.5 17751 2107.2 -vt 0.57678 0.896744 -v -11119.5 17781 2107.2 -vt 0.57678 0.896331 -v -11093.2 17781 2107.2 -vt 0.577002 0.896331 -v -11548.8 17826 2107.2 -vt 0.57315 0.895713 -o mesh3082 -s off -f 14563/14563/14563 14564/14564/14564 14565/14565/14565 -f 14564/14564/14564 14563/14563/14563 14566/14566/14566 -f 14564/14564/14564 14566/14566/14566 14567/14567/14567 -f 14567/14567/14567 14566/14566/14566 14568/14568/14568 -f 14565/14565/14565 14569/14569/14569 14570/14570/14570 -f 14569/14569/14569 14565/14565/14565 14564/14564/14564 -f 14570/14570/14570 14569/14569/14569 14568/14568/14568 -f 14570/14570/14570 14568/14568/14568 14566/14566/14566 -g charts -o chart0000 -s off -f 14563/14563/14563 14564/14564/14564 14565/14565/14565 -f 14564/14564/14564 14563/14563/14563 14566/14566/14566 -f 14564/14564/14564 14566/14566/14566 14567/14567/14567 -f 14567/14567/14567 14566/14566/14566 14568/14568/14568 -f 14565/14565/14565 14569/14569/14569 14570/14570/14570 -f 14569/14569/14569 14565/14565/14565 14564/14564/14564 -f 14570/14570/14570 14569/14569/14569 14568/14568/14568 -f 14570/14570/14570 14568/14568/14568 14566/14566/14566 -v -11548.8 17826 2107.2 -vt 0.994597 0.787716 -v -11548.8 17781 1254.82 -vt 0.99522 0.780791 -v -11548.8 17826 382.2 -vt 0.994597 0.773702 -v -11548.8 17706 2107.2 -vt 0.996259 0.787716 -v -11548.8 17751 1254.82 -vt 0.995636 0.780791 -v -11548.8 17751 1234.58 -vt 0.995636 0.780627 -v -11548.8 17781 1234.58 -vt 0.99522 0.780627 -v -11548.8 17706 382.2 -vt 0.996259 0.773702 -o mesh3083 -s off -f 14571/14571/14571 14572/14572/14572 14573/14573/14573 -f 14572/14572/14572 14571/14571/14571 14574/14574/14574 -f 14572/14572/14572 14574/14574/14574 14575/14575/14575 -f 14575/14575/14575 14574/14574/14574 14576/14576/14576 -f 14573/14573/14573 14577/14577/14577 14578/14578/14578 -f 14577/14577/14577 14573/14573/14573 14572/14572/14572 -f 14578/14578/14578 14577/14577/14577 14576/14576/14576 -f 14578/14578/14578 14576/14576/14576 14574/14574/14574 -g charts -o chart0000 -s off -f 14571/14571/14571 14572/14572/14572 14573/14573/14573 -f 14572/14572/14572 14571/14571/14571 14574/14574/14574 -f 14572/14572/14572 14574/14574/14574 14575/14575/14575 -f 14575/14575/14575 14574/14574/14574 14576/14576/14576 -f 14573/14573/14573 14577/14577/14577 14578/14578/14578 -f 14577/14577/14577 14573/14573/14573 14572/14572/14572 -f 14578/14578/14578 14577/14577/14577 14576/14576/14576 -f 14578/14578/14578 14576/14576/14576 14574/14574/14574 -v -10663.8 17826 382.2 -vt 0.00290939 0.805029 -v -11093.2 17781 382.2 -vt 0.00353276 0.801429 -v -10663.8 17706 382.2 -vt 0.00457182 0.805029 -v -11548.8 17826 382.2 -vt 0.00290939 0.797609 -v -11119.5 17781 382.2 -vt 0.00353276 0.801209 -v -11119.5 17751 382.2 -vt 0.00394845 0.801209 -v -11093.2 17751 382.2 -vt 0.00394845 0.801429 -v -11548.8 17706 382.2 -vt 0.00457182 0.797609 -o mesh3084 -s off -f 14579/14579/14579 14580/14580/14580 14581/14581/14581 -f 14580/14580/14580 14579/14579/14579 14582/14582/14582 -f 14580/14580/14580 14582/14582/14582 14583/14583/14583 -f 14583/14583/14583 14582/14582/14582 14584/14584/14584 -f 14581/14581/14581 14585/14585/14585 14586/14586/14586 -f 14585/14585/14585 14581/14581/14581 14580/14580/14580 -f 14586/14586/14586 14585/14585/14585 14584/14584/14584 -f 14586/14586/14586 14584/14584/14584 14582/14582/14582 -g charts -o chart0000 -s off -f 14579/14579/14579 14580/14580/14580 14581/14581/14581 -f 14580/14580/14580 14579/14579/14579 14582/14582/14582 -f 14580/14580/14580 14582/14582/14582 14583/14583/14583 -f 14583/14583/14583 14582/14582/14582 14584/14584/14584 -f 14581/14581/14581 14585/14585/14585 14586/14586/14586 -f 14585/14585/14585 14581/14581/14581 14580/14580/14580 -f 14586/14586/14586 14585/14585/14585 14584/14584/14584 -f 14586/14586/14586 14584/14584/14584 14582/14582/14582 -v -10663.8 17706 382.2 -vt 0.834996 0.538747 -v -10663.8 17706 2107.2 -vt 0.820864 0.538747 -v -10663.8 17826 2107.2 -vt 0.820864 0.537098 -v -10663.8 17826 382.2 -vt 0.834996 0.537098 -o mesh3085 -s off -f 14587/14587/14587 14588/14588/14588 14589/14589/14589 -f 14587/14587/14587 14589/14589/14589 14590/14590/14590 -g charts -o chart0000 -s off -f 14587/14587/14587 14588/14588/14588 14589/14589/14589 -f 14587/14587/14587 14589/14589/14589 14590/14590/14590 -v -11093.2 17751 2107.2 -vt 0.00623433 0.631904 -v -11119.5 17751 2107.2 -vt 0.00540316 0.631904 -v -11119.5 17751 382.2 -vt 0.00540316 0.61789 -v -11093.2 17751 382.2 -vt 0.00623433 0.61789 -o mesh3086 -s off -f 14591/14591/14591 14592/14592/14592 14593/14593/14593 -f 14591/14591/14591 14593/14593/14593 14594/14594/14594 -g charts -o chart0000 -s off -f 14591/14591/14591 14592/14592/14592 14593/14593/14593 -f 14591/14591/14591 14593/14593/14593 14594/14594/14594 -v -11119.5 17751 2107.2 -vt 0.648795 0.714345 -v -11119.5 17781 2107.2 -vt 0.648795 0.71352 -v -11119.5 17781 382.2 -vt 0.634663 0.71352 -v -11119.5 17751 382.2 -vt 0.634663 0.714345 -o mesh3087 -s off -f 14595/14595/14595 14596/14596/14596 14597/14597/14597 -f 14595/14595/14595 14597/14597/14597 14598/14598/14598 -g charts -o chart0000 -s off -f 14595/14595/14595 14596/14596/14596 14597/14597/14597 -f 14595/14595/14595 14597/14597/14597 14598/14598/14598 -v -10684.2 17781 1254.82 -vt 0.926434 0.600577 -v -10684.2 17751 1254.82 -vt 0.927265 0.600577 -v -10684.2 17751 1234.58 -vt 0.927265 0.601401 -v -10684.2 17781 1234.58 -vt 0.926434 0.601401 -o mesh3088 -s off -f 14599/14599/14599 14600/14600/14600 14601/14601/14601 -f 14599/14599/14599 14601/14601/14601 14602/14602/14602 -g charts -o chart0000 -s off -f 14599/14599/14599 14600/14600/14600 14601/14601/14601 -f 14599/14599/14599 14601/14601/14601 14602/14602/14602 -v -11548.8 17781 1254.82 -vt 0.798421 0.694559 -v -11548.8 17751 1254.82 -vt 0.799252 0.694559 -v -10684.2 17751 1254.82 -vt 0.799252 0.687139 -v -10684.2 17781 1254.82 -vt 0.798421 0.687139 -o mesh3089 -s off -f 14603/14603/14603 14604/14604/14604 14605/14605/14605 -f 14603/14603/14603 14605/14605/14605 14606/14606/14606 -g charts -o chart0000 -s off -f 14603/14603/14603 14604/14604/14604 14605/14605/14605 -f 14603/14603/14603 14605/14605/14605 14606/14606/14606 -v -11548.8 17751 1254.82 -vt 0.227348 0.453009 -v -11548.8 17751 1234.58 -vt 0.227348 0.453833 -v -10684.2 17751 1234.58 -vt 0.219867 0.453833 -v -10684.2 17751 1254.82 -vt 0.219867 0.453009 -o mesh3090 -s off -f 14607/14607/14607 14608/14608/14608 14609/14609/14609 -f 14607/14607/14607 14609/14609/14609 14610/14610/14610 -g charts -o chart0000 -s off -f 14607/14607/14607 14608/14608/14608 14609/14609/14609 -f 14607/14607/14607 14609/14609/14609 14610/14610/14610 -v -11548.8 17751 1234.58 -vt 0.994597 0.218879 -v -11548.8 17781 1234.58 -vt 0.995428 0.218879 -v -10684.2 17781 1234.58 -vt 0.995428 0.211459 -v -10684.2 17751 1234.58 -vt 0.994597 0.211459 -o mesh3091 -s off -f 14611/14611/14611 14612/14612/14612 14613/14613/14613 -f 14611/14611/14611 14613/14613/14613 14614/14614/14614 -g charts -o chart0000 -s off -f 14611/14611/14611 14612/14612/14612 14613/14613/14613 -f 14611/14611/14611 14613/14613/14613 14614/14614/14614 -v -11548.8 17781 1234.58 -vt 0.988778 0.756389 -v -11548.8 17781 1254.82 -vt 0.989609 0.756389 -v -10684.2 17781 1254.82 -vt 0.989609 0.748969 -v -10684.2 17781 1234.58 -vt 0.988778 0.748969 -o mesh3092 -s off -f 14615/14615/14615 14616/14616/14616 14617/14617/14617 -f 14615/14615/14615 14617/14617/14617 14618/14618/14618 -g charts -o chart0000 -s off -f 14615/14615/14615 14616/14616/14616 14617/14617/14617 -f 14615/14615/14615 14617/14617/14617 14618/14618/14618 -v -11093.2 17781 2107.2 -vt 0.238155 0.890767 -v -11093.2 17751 2107.2 -vt 0.238155 0.889942 -v -11093.2 17751 382.2 -vt 0.224023 0.889942 -v -11093.2 17781 382.2 -vt 0.224023 0.890767 -o mesh3093 -s off -f 14619/14619/14619 14620/14620/14620 14621/14621/14621 -f 14619/14619/14619 14621/14621/14621 14622/14622/14622 -g charts -o chart0000 -s off -f 14619/14619/14619 14620/14620/14620 14621/14621/14621 -f 14619/14619/14619 14621/14621/14621 14622/14622/14622 -v -11119.5 17781 2107.2 -vt 0.647963 0.607172 -v -11093.2 17781 2107.2 -vt 0.647963 0.606348 -v -11093.2 17781 382.2 -vt 0.633832 0.606348 -v -11119.5 17781 382.2 -vt 0.633832 0.607172 -o mesh3094 -s off -f 14623/14623/14623 14624/14624/14624 14625/14625/14625 -f 14623/14623/14623 14625/14625/14625 14626/14626/14626 -g charts -o chart0000 -s off -f 14623/14623/14623 14624/14624/14624 14625/14625/14625 -f 14623/14623/14623 14625/14625/14625 14626/14626/14626 diff --git a/src/bin/CMakeLists.txt b/src/bin/CMakeLists.txt old mode 100755 new mode 100644 index e48fcaef..656c8ec7 --- a/src/bin/CMakeLists.txt +++ b/src/bin/CMakeLists.txt @@ -9,6 +9,7 @@ if(GEOGRAM_WITH_GRAPHICS) if(GEOGRAM_WITH_LUA) add_subdirectory(geocod) endif() + add_subdirectory(geoshade) endif() if(GEOGRAM_WITH_VORPALINE) diff --git a/src/bin/fpg/CMakeLists.txt b/src/bin/fpg/CMakeLists.txt index c03c31ff..1b9ffcbe 100755 --- a/src/bin/fpg/CMakeLists.txt +++ b/src/bin/fpg/CMakeLists.txt @@ -1,8 +1,8 @@ vor_reset_warning_level() - +set(APP_NAME mcc) aux_source_directories(SOURCES "" .) include_directories(.) -vor_add_executable(mcc ${SOURCES}) -target_link_libraries(mcc geogram) +vor_add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram) -set_target_properties(mcc PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/bin/geobox/main.cpp b/src/bin/geobox/main.cpp index 59cdb987..c0bbecff 100644 --- a/src/bin/geobox/main.cpp +++ b/src/bin/geobox/main.cpp @@ -43,7 +43,7 @@ * */ -#include +#include #include #include @@ -76,23 +76,22 @@ namespace { /** * \brief GeoBoxApplication constructor. - * \param[in] argc , argv command line arguments copied from main() - * \param[in] usage the usage string - * \see CmdLine::parse() */ - GeoBoxApplication( - int argc, char** argv, const std::string& usage - ) : SimpleMeshApplication(argc, argv, usage) { - GEO::CmdLine::import_arg_group("co3ne"); + GeoBoxApplication() : SimpleMeshApplication("GeoBox") { + } + + void geogram_initialize(int argc, char** argv) override { + GEO::initialize(); + GEO::CmdLine::import_arg_group("co3ne"); GEO::CmdLine::import_arg_group("pre"); GEO::CmdLine::import_arg_group("post"); GEO::CmdLine::import_arg_group("remesh"); GEO::CmdLine::import_arg_group("opt"); GEO::CmdLine::import_arg_group("tet"); - } - + SimpleMeshApplication::geogram_initialize(argc, argv); + } - virtual void draw_about() { + void draw_about() override { ImGui::Separator(); if(ImGui::BeginMenu("About...")) { ImGui::Text( @@ -100,9 +99,10 @@ namespace { " The geometry processing toolbox\n" "\n" ); + float sz = float(280.0 * std::min(scaling(), 2.0)); ImGui::Image( convert_to_ImTextureID(geogram_logo_texture_), - ImVec2(256.0f * scaling(), 256.0f * scaling()) + ImVec2(sz, sz) ); ImGui::Text( "\n" @@ -146,7 +146,7 @@ namespace { * \brief Draws and manages the menus and the commands. * \details Overloads Application::draw_application_menus() */ - virtual void draw_application_menus() { + void draw_application_menus() override { if(ImGui::BeginMenu("Points")) { if(ImGui::MenuItem("smooth point set")) { GEO::Command::set_current( @@ -903,7 +903,7 @@ namespace { } int main(int argc, char** argv) { - GeoBoxApplication app(argc, argv, ""); - app.start(); + GeoBoxApplication app; + app.start(argc, argv); return 0; } diff --git a/src/bin/geocod/CMakeLists.txt b/src/bin/geocod/CMakeLists.txt index b1c2b068..ef7e1c50 100755 --- a/src/bin/geocod/CMakeLists.txt +++ b/src/bin/geocod/CMakeLists.txt @@ -1,9 +1,10 @@ include(${PROJECT_SOURCE_DIR}/cmake/opengl.cmake) +set(APP_NAME geocod) aux_source_directories(SOURCES "" .) aux_source_directories(SOURCES "lua" lua) -add_executable(geocod ${SOURCES}) -target_link_libraries(geocod geogram_gfx geogram ${GLFW_LIBRARIES}) -install_runtime_targets(geocod) +add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram_gfx geogram ${GLFW_LIBRARIES}) +install_runtime_targets(${APP_NAME}) -set_target_properties(geocod PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/bin/geocod/lua/embed_lua_files.sh b/src/bin/geocod/lua/embed_lua_files.sh index fa1c8b63..7cc7de42 100755 --- a/src/bin/geocod/lua/embed_lua_files.sh +++ b/src/bin/geocod/lua/embed_lua_files.sh @@ -8,11 +8,11 @@ templates/pixel_program.lua templates/turtle_program.lua examples/arbre.lua examples/flake.lua -examples/sierpinski.lua examples/sponge.lua examples/creeper.lua examples/plotter.lua examples/maison.lua +examples/radis.lua games/hackman.lua games/labyrinthe.lua games/asteroids.lua diff --git a/src/bin/geocod/lua/embedded_lua_files.cpp b/src/bin/geocod/lua/embedded_lua_files.cpp index 3ffce1ee..493c33b6 100644 --- a/src/bin/geocod/lua/embedded_lua_files.cpp +++ b/src/bin/geocod/lua/embedded_lua_files.cpp @@ -406,56 +406,11 @@ void register_embedded_lua_files() { " tr(90) \n" " GLUP.Enable(GLUP.VERTEX_COLORS) \n" " GLUP.Disable(GLUP.LIGHTING) \n" - " pcol(\"white\") \n" + " pcol(\"gray\") \n" " Flake(5) \n" "end \n" ); - register_embedded_lua_file("examples/sierpinski.lua", - "require(\"turtle\") \n" - " \n" - " \n" - "function Sierpinski(a, level) \n" - " if level==0 then \n" - " pd() \n" - " for i=1,3,1 do \n" - " fd(a) \n" - " tl(120) \n" - " end \n" - " pu() \n" - " else \n" - " Sierpinski(a/2, level - 1) \n" - " pu() \n" - " fd(a/2) \n" - " pd() \n" - " Sierpinski(a/2, level - 1) \n" - " pu() \n" - " tl(120) \n" - " fd(a/2) \n" - " tr(120) \n" - " pd() \n" - " Sierpinski(a/2, level - 1) \n" - " pu() \n" - " -- We should return home! \n" - " pd() \n" - " tl(60) \n" - " bk(a/2) \n" - " tr(60) \n" - " pu() \n" - " end \n" - "end \n" - " \n" - " \n" - "function GLUP.draw_scene() \n" - " home() \n" - " pwidth(0.2) \n" - " GLUP.Enable(GLUP.VERTEX_COLORS) \n" - " GLUP.Disable(GLUP.LIGHTING) \n" - " pcol(\"white\") \n" - " Sierpinski(100,5) \n" - "end \n" - ); - register_embedded_lua_file("examples/sponge.lua", "require(\"pixel\") \n" " \n" @@ -736,6 +691,557 @@ void register_embedded_lua_files() { "end \n" ); + register_embedded_lua_file("examples/radis.lua", + "require(\"pixel\") \n" + " \n" + " \n" + "function GLUP.draw_scene() \n" + " radis=math.floor(GLUP.ElapsedTime()*4) % 4 \n" + " if radis==0 then \n" + " draw_radis0(0,0) \n" + " elseif radis==1 then \n" + " draw_radis1(0,0) \n" + " elseif radis==2 then \n" + " draw_radis2(0,0) \n" + " elseif radis==3 then \n" + " draw_radis3(0,0) \n" + " end \n" + "end \n" + " \n" + "function draw_radis0(x,y) \n" + " pixBegin() \n" + " GLUP.Disable(GLUP.DRAW_MESH) \n" + " col(0,0,0) \n" + " pix(x+1,y+10) \n" + " pix(x+2,y+10) \n" + " pix(x+6,y+10) \n" + " pix(x+7,y+10) \n" + " pix(x+8,y+10) \n" + " pix(x+0,y+9) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+1,y+9) \n" + " pix(x+2,y+9) \n" + " col(0,0,0) \n" + " pix(x+3,y+9) \n" + " pix(x+5,y+9) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+6,y+9) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+9) \n" + " col(0.952941,0.380392,0.380392) \n" + " pix(x+8,y+9) \n" + " col(0,0,0) \n" + " pix(x+9,y+9) \n" + " pix(x+1,y+8) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+2,y+8) \n" + " pix(x+3,y+8) \n" + " col(0,0,0) \n" + " pix(x+4,y+8) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+5,y+8) \n" + " pix(x+6,y+8) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+8) \n" + " col(0,0,0) \n" + " pix(x+8,y+8) \n" + " col(0.952941,0.560784,0.560784) \n" + " pix(x+9,y+8) \n" + " col(0,0,0) \n" + " pix(x+10,y+8) \n" + " pix(x+11,y+8) \n" + " pix(x+0,y+7) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+1,y+7) \n" + " pix(x+2,y+7) \n" + " pix(x+3,y+7) \n" + " col(0,0,0) \n" + " pix(x+4,y+7) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+5,y+7) \n" + " pix(x+6,y+7) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+7) \n" + " col(0.952941,0.380392,0.380392) \n" + " pix(x+8,y+7) \n" + " col(0.952941,0.560784,0.560784) \n" + " pix(x+9,y+7) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+10,y+7) \n" + " pix(x+11,y+7) \n" + " col(0,0,0) \n" + " pix(x+12,y+7) \n" + " pix(x+1,y+6) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+2,y+6) \n" + " pix(x+3,y+6) \n" + " col(0,0,0) \n" + " pix(x+4,y+6) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+5,y+6) \n" + " pix(x+6,y+6) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+6) \n" + " col(0.952941,0.380392,0.380392) \n" + " pix(x+8,y+6) \n" + " col(0.952941,0.560784,0.560784) \n" + " pix(x+9,y+6) \n" + " col(0,0,0) \n" + " pix(x+10,y+6) \n" + " pix(x+11,y+6) \n" + " pix(x+0,y+5) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+1,y+5) \n" + " pix(x+2,y+5) \n" + " col(0,0,0) \n" + " pix(x+3,y+5) \n" + " pix(x+5,y+5) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+6,y+5) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+5) \n" + " col(0.952941,0.380392,0.380392) \n" + " pix(x+8,y+5) \n" + " col(0,0,0) \n" + " pix(x+9,y+5) \n" + " pix(x+1,y+4) \n" + " pix(x+2,y+4) \n" + " pix(x+6,y+4) \n" + " pix(x+7,y+4) \n" + " pix(x+8,y+4) \n" + " pix(x+5,y+3) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+6,y+3) \n" + " col(0,0,0) \n" + " pix(x+7,y+3) \n" + " pix(x+5,y+2) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+6,y+2) \n" + " col(0,0,0) \n" + " pix(x+7,y+2) \n" + " pix(x+5,y+1) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+6,y+1) \n" + " pix(x+7,y+1) \n" + " col(0,0,0) \n" + " pix(x+8,y+1) \n" + " pix(x+6,y+0) \n" + " pix(x+7,y+0) \n" + " pixEnd() \n" + "end \n" + " \n" + "function draw_radis1(x,y) \n" + " pixBegin() \n" + " col(0,0,0) \n" + " pix(x+1,y+11) \n" + " pix(x+2,y+11) \n" + " pix(x+6,y+11) \n" + " pix(x+7,y+11) \n" + " pix(x+8,y+11) \n" + " pix(x+0,y+10) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+1,y+10) \n" + " pix(x+2,y+10) \n" + " col(0,0,0) \n" + " pix(x+3,y+10) \n" + " pix(x+5,y+10) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+6,y+10) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+10) \n" + " col(0.952941,0.380392,0.380392) \n" + " pix(x+8,y+10) \n" + " col(0,0,0) \n" + " pix(x+9,y+10) \n" + " pix(x+1,y+9) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+2,y+9) \n" + " pix(x+3,y+9) \n" + " col(0,0,0) \n" + " pix(x+4,y+9) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+5,y+9) \n" + " pix(x+6,y+9) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+9) \n" + " col(0,0,0) \n" + " pix(x+8,y+9) \n" + " col(0.952941,0.560784,0.560784) \n" + " pix(x+9,y+9) \n" + " col(0,0,0) \n" + " pix(x+10,y+9) \n" + " pix(x+11,y+9) \n" + " pix(x+0,y+8) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+1,y+8) \n" + " pix(x+2,y+8) \n" + " pix(x+3,y+8) \n" + " col(0,0,0) \n" + " pix(x+4,y+8) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+5,y+8) \n" + " pix(x+6,y+8) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+8) \n" + " col(0.952941,0.380392,0.380392) \n" + " pix(x+8,y+8) \n" + " col(0.952941,0.560784,0.560784) \n" + " pix(x+9,y+8) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+10,y+8) \n" + " pix(x+11,y+8) \n" + " col(0,0,0) \n" + " pix(x+12,y+8) \n" + " pix(x+1,y+7) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+2,y+7) \n" + " pix(x+3,y+7) \n" + " col(0,0,0) \n" + " pix(x+4,y+7) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+5,y+7) \n" + " pix(x+6,y+7) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+7) \n" + " col(0.952941,0.380392,0.380392) \n" + " pix(x+8,y+7) \n" + " col(0.952941,0.560784,0.560784) \n" + " pix(x+9,y+7) \n" + " col(0,0,0) \n" + " pix(x+10,y+7) \n" + " pix(x+11,y+7) \n" + " pix(x+0,y+6) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+1,y+6) \n" + " pix(x+2,y+6) \n" + " col(0,0,0) \n" + " pix(x+3,y+6) \n" + " pix(x+5,y+6) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+6,y+6) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+6) \n" + " col(0.952941,0.380392,0.380392) \n" + " pix(x+8,y+6) \n" + " col(0,0,0) \n" + " pix(x+9,y+6) \n" + " pix(x+1,y+5) \n" + " pix(x+2,y+5) \n" + " pix(x+5,y+5) \n" + " pix(x+6,y+5) \n" + " pix(x+7,y+5) \n" + " pix(x+8,y+5) \n" + " pix(x+4,y+4) \n" + " col(0.752941,0.752941,0.752941) \n" + " pix(x+5,y+4) \n" + " col(0,0,0) \n" + " pix(x+6,y+4) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+7,y+4) \n" + " col(0,0,0) \n" + " pix(x+8,y+4) \n" + " pix(x+10,y+4) \n" + " pix(x+3,y+3) \n" + " col(0.752941,0.752941,0.752941) \n" + " pix(x+4,y+3) \n" + " col(0,0,0) \n" + " pix(x+5,y+3) \n" + " pix(x+7,y+3) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+8,y+3) \n" + " col(0,0,0) \n" + " pix(x+9,y+3) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+10,y+3) \n" + " col(0,0,0) \n" + " pix(x+11,y+3) \n" + " pix(x+2,y+2) \n" + " col(0.752941,0.752941,0.752941) \n" + " pix(x+3,y+2) \n" + " col(0,0,0) \n" + " pix(x+4,y+2) \n" + " pix(x+8,y+2) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+9,y+2) \n" + " col(0,0,0) \n" + " pix(x+10,y+2) \n" + " pix(x+3,y+1) \n" + " col(0.752941,0.752941,0.752941) \n" + " pix(x+4,y+1) \n" + " col(0,0,0) \n" + " pix(x+5,y+1) \n" + " pix(x+9,y+1) \n" + " pix(x+4,y+0) \n" + " pixEnd() \n" + "end \n" + " \n" + "function draw_radis2(x,y) \n" + " pixBegin() \n" + " col(0,0,0) \n" + " pix(x+1,y+10) \n" + " pix(x+2,y+10) \n" + " pix(x+6,y+10) \n" + " pix(x+7,y+10) \n" + " pix(x+8,y+10) \n" + " pix(x+0,y+9) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+1,y+9) \n" + " pix(x+2,y+9) \n" + " col(0,0,0) \n" + " pix(x+3,y+9) \n" + " pix(x+5,y+9) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+6,y+9) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+9) \n" + " col(0.952941,0.380392,0.380392) \n" + " pix(x+8,y+9) \n" + " col(0,0,0) \n" + " pix(x+9,y+9) \n" + " pix(x+1,y+8) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+2,y+8) \n" + " pix(x+3,y+8) \n" + " col(0,0,0) \n" + " pix(x+4,y+8) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+5,y+8) \n" + " pix(x+6,y+8) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+8) \n" + " col(0,0,0) \n" + " pix(x+8,y+8) \n" + " col(0.952941,0.560784,0.560784) \n" + " pix(x+9,y+8) \n" + " col(0,0,0) \n" + " pix(x+10,y+8) \n" + " pix(x+11,y+8) \n" + " pix(x+0,y+7) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+1,y+7) \n" + " pix(x+2,y+7) \n" + " pix(x+3,y+7) \n" + " col(0,0,0) \n" + " pix(x+4,y+7) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+5,y+7) \n" + " pix(x+6,y+7) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+7) \n" + " col(0.952941,0.380392,0.380392) \n" + " pix(x+8,y+7) \n" + " col(0.952941,0.560784,0.560784) \n" + " pix(x+9,y+7) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+10,y+7) \n" + " pix(x+11,y+7) \n" + " col(0,0,0) \n" + " pix(x+12,y+7) \n" + " pix(x+1,y+6) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+2,y+6) \n" + " pix(x+3,y+6) \n" + " col(0,0,0) \n" + " pix(x+4,y+6) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+5,y+6) \n" + " pix(x+6,y+6) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+6) \n" + " col(0.952941,0.380392,0.380392) \n" + " pix(x+8,y+6) \n" + " col(0.952941,0.560784,0.560784) \n" + " pix(x+9,y+6) \n" + " col(0,0,0) \n" + " pix(x+10,y+6) \n" + " pix(x+11,y+6) \n" + " pix(x+0,y+5) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+1,y+5) \n" + " pix(x+2,y+5) \n" + " col(0,0,0) \n" + " pix(x+3,y+5) \n" + " pix(x+5,y+5) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+6,y+5) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+5) \n" + " col(0.952941,0.380392,0.380392) \n" + " pix(x+8,y+5) \n" + " col(0,0,0) \n" + " pix(x+9,y+5) \n" + " pix(x+1,y+4) \n" + " pix(x+2,y+4) \n" + " pix(x+6,y+4) \n" + " pix(x+7,y+4) \n" + " pix(x+8,y+4) \n" + " pix(x+5,y+3) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+6,y+3) \n" + " col(0,0,0) \n" + " pix(x+7,y+3) \n" + " pix(x+5,y+2) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+6,y+2) \n" + " col(0,0,0) \n" + " pix(x+7,y+2) \n" + " pix(x+5,y+1) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+6,y+1) \n" + " pix(x+7,y+1) \n" + " col(0,0,0) \n" + " pix(x+8,y+1) \n" + " pix(x+6,y+0) \n" + " pix(x+7,y+0) \n" + " pixEnd() \n" + "end \n" + " \n" + "function draw_radis3(x,y) \n" + " pixBegin() \n" + " col(0,0,0) \n" + " pix(x+1,y+11) \n" + " pix(x+2,y+11) \n" + " pix(x+6,y+11) \n" + " pix(x+7,y+11) \n" + " pix(x+8,y+11) \n" + " pix(x+0,y+10) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+1,y+10) \n" + " pix(x+2,y+10) \n" + " col(0,0,0) \n" + " pix(x+3,y+10) \n" + " pix(x+5,y+10) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+6,y+10) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+10) \n" + " col(0.952941,0.380392,0.380392) \n" + " pix(x+8,y+10) \n" + " col(0,0,0) \n" + " pix(x+9,y+10) \n" + " pix(x+1,y+9) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+2,y+9) \n" + " pix(x+3,y+9) \n" + " col(0,0,0) \n" + " pix(x+4,y+9) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+5,y+9) \n" + " pix(x+6,y+9) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+9) \n" + " col(0,0,0) \n" + " pix(x+8,y+9) \n" + " col(0.952941,0.560784,0.560784) \n" + " pix(x+9,y+9) \n" + " col(0,0,0) \n" + " pix(x+10,y+9) \n" + " pix(x+11,y+9) \n" + " pix(x+0,y+8) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+1,y+8) \n" + " pix(x+2,y+8) \n" + " pix(x+3,y+8) \n" + " col(0,0,0) \n" + " pix(x+4,y+8) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+5,y+8) \n" + " pix(x+6,y+8) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+8) \n" + " col(0.952941,0.380392,0.380392) \n" + " pix(x+8,y+8) \n" + " col(0.952941,0.560784,0.560784) \n" + " pix(x+9,y+8) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+10,y+8) \n" + " pix(x+11,y+8) \n" + " col(0,0,0) \n" + " pix(x+12,y+8) \n" + " pix(x+1,y+7) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+2,y+7) \n" + " pix(x+3,y+7) \n" + " col(0,0,0) \n" + " pix(x+4,y+7) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+5,y+7) \n" + " pix(x+6,y+7) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+7) \n" + " col(0.952941,0.380392,0.380392) \n" + " pix(x+8,y+7) \n" + " col(0.952941,0.560784,0.560784) \n" + " pix(x+9,y+7) \n" + " col(0,0,0) \n" + " pix(x+10,y+7) \n" + " pix(x+11,y+7) \n" + " pix(x+0,y+6) \n" + " col(0.180392,0.65098,0.0862745) \n" + " pix(x+1,y+6) \n" + " pix(x+2,y+6) \n" + " col(0,0,0) \n" + " pix(x+3,y+6) \n" + " pix(x+5,y+6) \n" + " col(0.952941,0.133333,0.133333) \n" + " pix(x+6,y+6) \n" + " col(0.952941,0.239216,0.239216) \n" + " pix(x+7,y+6) \n" + " col(0.952941,0.380392,0.380392) \n" + " pix(x+8,y+6) \n" + " col(0,0,0) \n" + " pix(x+9,y+6) \n" + " pix(x+1,y+5) \n" + " pix(x+2,y+5) \n" + " pix(x+5,y+5) \n" + " pix(x+6,y+5) \n" + " pix(x+7,y+5) \n" + " pix(x+8,y+5) \n" + " pix(x+4,y+4) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+5,y+4) \n" + " col(0,0,0) \n" + " pix(x+6,y+4) \n" + " col(0.752941,0.752941,0.752941) \n" + " pix(x+7,y+4) \n" + " col(0,0,0) \n" + " pix(x+8,y+4) \n" + " pix(x+10,y+4) \n" + " pix(x+3,y+3) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+4,y+3) \n" + " col(0,0,0) \n" + " pix(x+5,y+3) \n" + " pix(x+7,y+3) \n" + " col(0.752941,0.752941,0.752941) \n" + " pix(x+8,y+3) \n" + " col(0,0,0) \n" + " pix(x+9,y+3) \n" + " col(0.752941,0.752941,0.752941) \n" + " pix(x+10,y+3) \n" + " col(0,0,0) \n" + " pix(x+11,y+3) \n" + " pix(x+2,y+2) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+3,y+2) \n" + " col(0,0,0) \n" + " pix(x+4,y+2) \n" + " pix(x+8,y+2) \n" + " col(0.752941,0.752941,0.752941) \n" + " pix(x+9,y+2) \n" + " col(0,0,0) \n" + " pix(x+10,y+2) \n" + " pix(x+3,y+1) \n" + " col(0.952941,0.952941,0.952941) \n" + " pix(x+4,y+1) \n" + " col(0,0,0) \n" + " pix(x+5,y+1) \n" + " pix(x+9,y+1) \n" + " pix(x+4,y+0) \n" + " pixEnd() \n" + "end \n" + ); + register_embedded_lua_file("games/hackman.lua", "require(\"pixel\") \n" " \n" diff --git a/src/bin/geocod/lua/examples/flake.lua b/src/bin/geocod/lua/examples/flake.lua old mode 100755 new mode 100644 index 98c11cd1..2b37f9e8 --- a/src/bin/geocod/lua/examples/flake.lua +++ b/src/bin/geocod/lua/examples/flake.lua @@ -34,6 +34,6 @@ function GLUP.draw_scene() tr(90) GLUP.Enable(GLUP.VERTEX_COLORS) GLUP.Disable(GLUP.LIGHTING) - pcol("white") + pcol("gray") Flake(5) end diff --git a/src/bin/geocod/lua/examples/radis.lua b/src/bin/geocod/lua/examples/radis.lua new file mode 100644 index 00000000..eaf7cd10 --- /dev/null +++ b/src/bin/geocod/lua/examples/radis.lua @@ -0,0 +1,548 @@ +require("pixel") + + +function GLUP.draw_scene() + radis=math.floor(GLUP.ElapsedTime()*4) % 4 + if radis==0 then + draw_radis0(0,0) + elseif radis==1 then + draw_radis1(0,0) + elseif radis==2 then + draw_radis2(0,0) + elseif radis==3 then + draw_radis3(0,0) + end +end + +function draw_radis0(x,y) + pixBegin() + GLUP.Disable(GLUP.DRAW_MESH) + col(0,0,0) + pix(x+1,y+10) + pix(x+2,y+10) + pix(x+6,y+10) + pix(x+7,y+10) + pix(x+8,y+10) + pix(x+0,y+9) + col(0.180392,0.65098,0.0862745) + pix(x+1,y+9) + pix(x+2,y+9) + col(0,0,0) + pix(x+3,y+9) + pix(x+5,y+9) + col(0.952941,0.133333,0.133333) + pix(x+6,y+9) + col(0.952941,0.239216,0.239216) + pix(x+7,y+9) + col(0.952941,0.380392,0.380392) + pix(x+8,y+9) + col(0,0,0) + pix(x+9,y+9) + pix(x+1,y+8) + col(0.180392,0.65098,0.0862745) + pix(x+2,y+8) + pix(x+3,y+8) + col(0,0,0) + pix(x+4,y+8) + col(0.952941,0.133333,0.133333) + pix(x+5,y+8) + pix(x+6,y+8) + col(0.952941,0.239216,0.239216) + pix(x+7,y+8) + col(0,0,0) + pix(x+8,y+8) + col(0.952941,0.560784,0.560784) + pix(x+9,y+8) + col(0,0,0) + pix(x+10,y+8) + pix(x+11,y+8) + pix(x+0,y+7) + col(0.180392,0.65098,0.0862745) + pix(x+1,y+7) + pix(x+2,y+7) + pix(x+3,y+7) + col(0,0,0) + pix(x+4,y+7) + col(0.952941,0.133333,0.133333) + pix(x+5,y+7) + pix(x+6,y+7) + col(0.952941,0.239216,0.239216) + pix(x+7,y+7) + col(0.952941,0.380392,0.380392) + pix(x+8,y+7) + col(0.952941,0.560784,0.560784) + pix(x+9,y+7) + col(0.952941,0.952941,0.952941) + pix(x+10,y+7) + pix(x+11,y+7) + col(0,0,0) + pix(x+12,y+7) + pix(x+1,y+6) + col(0.180392,0.65098,0.0862745) + pix(x+2,y+6) + pix(x+3,y+6) + col(0,0,0) + pix(x+4,y+6) + col(0.952941,0.133333,0.133333) + pix(x+5,y+6) + pix(x+6,y+6) + col(0.952941,0.239216,0.239216) + pix(x+7,y+6) + col(0.952941,0.380392,0.380392) + pix(x+8,y+6) + col(0.952941,0.560784,0.560784) + pix(x+9,y+6) + col(0,0,0) + pix(x+10,y+6) + pix(x+11,y+6) + pix(x+0,y+5) + col(0.180392,0.65098,0.0862745) + pix(x+1,y+5) + pix(x+2,y+5) + col(0,0,0) + pix(x+3,y+5) + pix(x+5,y+5) + col(0.952941,0.133333,0.133333) + pix(x+6,y+5) + col(0.952941,0.239216,0.239216) + pix(x+7,y+5) + col(0.952941,0.380392,0.380392) + pix(x+8,y+5) + col(0,0,0) + pix(x+9,y+5) + pix(x+1,y+4) + pix(x+2,y+4) + pix(x+6,y+4) + pix(x+7,y+4) + pix(x+8,y+4) + pix(x+5,y+3) + col(0.952941,0.952941,0.952941) + pix(x+6,y+3) + col(0,0,0) + pix(x+7,y+3) + pix(x+5,y+2) + col(0.952941,0.952941,0.952941) + pix(x+6,y+2) + col(0,0,0) + pix(x+7,y+2) + pix(x+5,y+1) + col(0.952941,0.952941,0.952941) + pix(x+6,y+1) + pix(x+7,y+1) + col(0,0,0) + pix(x+8,y+1) + pix(x+6,y+0) + pix(x+7,y+0) + pixEnd() +end + +function draw_radis1(x,y) + pixBegin() + col(0,0,0) + pix(x+1,y+11) + pix(x+2,y+11) + pix(x+6,y+11) + pix(x+7,y+11) + pix(x+8,y+11) + pix(x+0,y+10) + col(0.180392,0.65098,0.0862745) + pix(x+1,y+10) + pix(x+2,y+10) + col(0,0,0) + pix(x+3,y+10) + pix(x+5,y+10) + col(0.952941,0.133333,0.133333) + pix(x+6,y+10) + col(0.952941,0.239216,0.239216) + pix(x+7,y+10) + col(0.952941,0.380392,0.380392) + pix(x+8,y+10) + col(0,0,0) + pix(x+9,y+10) + pix(x+1,y+9) + col(0.180392,0.65098,0.0862745) + pix(x+2,y+9) + pix(x+3,y+9) + col(0,0,0) + pix(x+4,y+9) + col(0.952941,0.133333,0.133333) + pix(x+5,y+9) + pix(x+6,y+9) + col(0.952941,0.239216,0.239216) + pix(x+7,y+9) + col(0,0,0) + pix(x+8,y+9) + col(0.952941,0.560784,0.560784) + pix(x+9,y+9) + col(0,0,0) + pix(x+10,y+9) + pix(x+11,y+9) + pix(x+0,y+8) + col(0.180392,0.65098,0.0862745) + pix(x+1,y+8) + pix(x+2,y+8) + pix(x+3,y+8) + col(0,0,0) + pix(x+4,y+8) + col(0.952941,0.133333,0.133333) + pix(x+5,y+8) + pix(x+6,y+8) + col(0.952941,0.239216,0.239216) + pix(x+7,y+8) + col(0.952941,0.380392,0.380392) + pix(x+8,y+8) + col(0.952941,0.560784,0.560784) + pix(x+9,y+8) + col(0.952941,0.952941,0.952941) + pix(x+10,y+8) + pix(x+11,y+8) + col(0,0,0) + pix(x+12,y+8) + pix(x+1,y+7) + col(0.180392,0.65098,0.0862745) + pix(x+2,y+7) + pix(x+3,y+7) + col(0,0,0) + pix(x+4,y+7) + col(0.952941,0.133333,0.133333) + pix(x+5,y+7) + pix(x+6,y+7) + col(0.952941,0.239216,0.239216) + pix(x+7,y+7) + col(0.952941,0.380392,0.380392) + pix(x+8,y+7) + col(0.952941,0.560784,0.560784) + pix(x+9,y+7) + col(0,0,0) + pix(x+10,y+7) + pix(x+11,y+7) + pix(x+0,y+6) + col(0.180392,0.65098,0.0862745) + pix(x+1,y+6) + pix(x+2,y+6) + col(0,0,0) + pix(x+3,y+6) + pix(x+5,y+6) + col(0.952941,0.133333,0.133333) + pix(x+6,y+6) + col(0.952941,0.239216,0.239216) + pix(x+7,y+6) + col(0.952941,0.380392,0.380392) + pix(x+8,y+6) + col(0,0,0) + pix(x+9,y+6) + pix(x+1,y+5) + pix(x+2,y+5) + pix(x+5,y+5) + pix(x+6,y+5) + pix(x+7,y+5) + pix(x+8,y+5) + pix(x+4,y+4) + col(0.752941,0.752941,0.752941) + pix(x+5,y+4) + col(0,0,0) + pix(x+6,y+4) + col(0.952941,0.952941,0.952941) + pix(x+7,y+4) + col(0,0,0) + pix(x+8,y+4) + pix(x+10,y+4) + pix(x+3,y+3) + col(0.752941,0.752941,0.752941) + pix(x+4,y+3) + col(0,0,0) + pix(x+5,y+3) + pix(x+7,y+3) + col(0.952941,0.952941,0.952941) + pix(x+8,y+3) + col(0,0,0) + pix(x+9,y+3) + col(0.952941,0.952941,0.952941) + pix(x+10,y+3) + col(0,0,0) + pix(x+11,y+3) + pix(x+2,y+2) + col(0.752941,0.752941,0.752941) + pix(x+3,y+2) + col(0,0,0) + pix(x+4,y+2) + pix(x+8,y+2) + col(0.952941,0.952941,0.952941) + pix(x+9,y+2) + col(0,0,0) + pix(x+10,y+2) + pix(x+3,y+1) + col(0.752941,0.752941,0.752941) + pix(x+4,y+1) + col(0,0,0) + pix(x+5,y+1) + pix(x+9,y+1) + pix(x+4,y+0) + pixEnd() +end + +function draw_radis2(x,y) + pixBegin() + col(0,0,0) + pix(x+1,y+10) + pix(x+2,y+10) + pix(x+6,y+10) + pix(x+7,y+10) + pix(x+8,y+10) + pix(x+0,y+9) + col(0.180392,0.65098,0.0862745) + pix(x+1,y+9) + pix(x+2,y+9) + col(0,0,0) + pix(x+3,y+9) + pix(x+5,y+9) + col(0.952941,0.133333,0.133333) + pix(x+6,y+9) + col(0.952941,0.239216,0.239216) + pix(x+7,y+9) + col(0.952941,0.380392,0.380392) + pix(x+8,y+9) + col(0,0,0) + pix(x+9,y+9) + pix(x+1,y+8) + col(0.180392,0.65098,0.0862745) + pix(x+2,y+8) + pix(x+3,y+8) + col(0,0,0) + pix(x+4,y+8) + col(0.952941,0.133333,0.133333) + pix(x+5,y+8) + pix(x+6,y+8) + col(0.952941,0.239216,0.239216) + pix(x+7,y+8) + col(0,0,0) + pix(x+8,y+8) + col(0.952941,0.560784,0.560784) + pix(x+9,y+8) + col(0,0,0) + pix(x+10,y+8) + pix(x+11,y+8) + pix(x+0,y+7) + col(0.180392,0.65098,0.0862745) + pix(x+1,y+7) + pix(x+2,y+7) + pix(x+3,y+7) + col(0,0,0) + pix(x+4,y+7) + col(0.952941,0.133333,0.133333) + pix(x+5,y+7) + pix(x+6,y+7) + col(0.952941,0.239216,0.239216) + pix(x+7,y+7) + col(0.952941,0.380392,0.380392) + pix(x+8,y+7) + col(0.952941,0.560784,0.560784) + pix(x+9,y+7) + col(0.952941,0.952941,0.952941) + pix(x+10,y+7) + pix(x+11,y+7) + col(0,0,0) + pix(x+12,y+7) + pix(x+1,y+6) + col(0.180392,0.65098,0.0862745) + pix(x+2,y+6) + pix(x+3,y+6) + col(0,0,0) + pix(x+4,y+6) + col(0.952941,0.133333,0.133333) + pix(x+5,y+6) + pix(x+6,y+6) + col(0.952941,0.239216,0.239216) + pix(x+7,y+6) + col(0.952941,0.380392,0.380392) + pix(x+8,y+6) + col(0.952941,0.560784,0.560784) + pix(x+9,y+6) + col(0,0,0) + pix(x+10,y+6) + pix(x+11,y+6) + pix(x+0,y+5) + col(0.180392,0.65098,0.0862745) + pix(x+1,y+5) + pix(x+2,y+5) + col(0,0,0) + pix(x+3,y+5) + pix(x+5,y+5) + col(0.952941,0.133333,0.133333) + pix(x+6,y+5) + col(0.952941,0.239216,0.239216) + pix(x+7,y+5) + col(0.952941,0.380392,0.380392) + pix(x+8,y+5) + col(0,0,0) + pix(x+9,y+5) + pix(x+1,y+4) + pix(x+2,y+4) + pix(x+6,y+4) + pix(x+7,y+4) + pix(x+8,y+4) + pix(x+5,y+3) + col(0.952941,0.952941,0.952941) + pix(x+6,y+3) + col(0,0,0) + pix(x+7,y+3) + pix(x+5,y+2) + col(0.952941,0.952941,0.952941) + pix(x+6,y+2) + col(0,0,0) + pix(x+7,y+2) + pix(x+5,y+1) + col(0.952941,0.952941,0.952941) + pix(x+6,y+1) + pix(x+7,y+1) + col(0,0,0) + pix(x+8,y+1) + pix(x+6,y+0) + pix(x+7,y+0) + pixEnd() +end + +function draw_radis3(x,y) + pixBegin() + col(0,0,0) + pix(x+1,y+11) + pix(x+2,y+11) + pix(x+6,y+11) + pix(x+7,y+11) + pix(x+8,y+11) + pix(x+0,y+10) + col(0.180392,0.65098,0.0862745) + pix(x+1,y+10) + pix(x+2,y+10) + col(0,0,0) + pix(x+3,y+10) + pix(x+5,y+10) + col(0.952941,0.133333,0.133333) + pix(x+6,y+10) + col(0.952941,0.239216,0.239216) + pix(x+7,y+10) + col(0.952941,0.380392,0.380392) + pix(x+8,y+10) + col(0,0,0) + pix(x+9,y+10) + pix(x+1,y+9) + col(0.180392,0.65098,0.0862745) + pix(x+2,y+9) + pix(x+3,y+9) + col(0,0,0) + pix(x+4,y+9) + col(0.952941,0.133333,0.133333) + pix(x+5,y+9) + pix(x+6,y+9) + col(0.952941,0.239216,0.239216) + pix(x+7,y+9) + col(0,0,0) + pix(x+8,y+9) + col(0.952941,0.560784,0.560784) + pix(x+9,y+9) + col(0,0,0) + pix(x+10,y+9) + pix(x+11,y+9) + pix(x+0,y+8) + col(0.180392,0.65098,0.0862745) + pix(x+1,y+8) + pix(x+2,y+8) + pix(x+3,y+8) + col(0,0,0) + pix(x+4,y+8) + col(0.952941,0.133333,0.133333) + pix(x+5,y+8) + pix(x+6,y+8) + col(0.952941,0.239216,0.239216) + pix(x+7,y+8) + col(0.952941,0.380392,0.380392) + pix(x+8,y+8) + col(0.952941,0.560784,0.560784) + pix(x+9,y+8) + col(0.952941,0.952941,0.952941) + pix(x+10,y+8) + pix(x+11,y+8) + col(0,0,0) + pix(x+12,y+8) + pix(x+1,y+7) + col(0.180392,0.65098,0.0862745) + pix(x+2,y+7) + pix(x+3,y+7) + col(0,0,0) + pix(x+4,y+7) + col(0.952941,0.133333,0.133333) + pix(x+5,y+7) + pix(x+6,y+7) + col(0.952941,0.239216,0.239216) + pix(x+7,y+7) + col(0.952941,0.380392,0.380392) + pix(x+8,y+7) + col(0.952941,0.560784,0.560784) + pix(x+9,y+7) + col(0,0,0) + pix(x+10,y+7) + pix(x+11,y+7) + pix(x+0,y+6) + col(0.180392,0.65098,0.0862745) + pix(x+1,y+6) + pix(x+2,y+6) + col(0,0,0) + pix(x+3,y+6) + pix(x+5,y+6) + col(0.952941,0.133333,0.133333) + pix(x+6,y+6) + col(0.952941,0.239216,0.239216) + pix(x+7,y+6) + col(0.952941,0.380392,0.380392) + pix(x+8,y+6) + col(0,0,0) + pix(x+9,y+6) + pix(x+1,y+5) + pix(x+2,y+5) + pix(x+5,y+5) + pix(x+6,y+5) + pix(x+7,y+5) + pix(x+8,y+5) + pix(x+4,y+4) + col(0.952941,0.952941,0.952941) + pix(x+5,y+4) + col(0,0,0) + pix(x+6,y+4) + col(0.752941,0.752941,0.752941) + pix(x+7,y+4) + col(0,0,0) + pix(x+8,y+4) + pix(x+10,y+4) + pix(x+3,y+3) + col(0.952941,0.952941,0.952941) + pix(x+4,y+3) + col(0,0,0) + pix(x+5,y+3) + pix(x+7,y+3) + col(0.752941,0.752941,0.752941) + pix(x+8,y+3) + col(0,0,0) + pix(x+9,y+3) + col(0.752941,0.752941,0.752941) + pix(x+10,y+3) + col(0,0,0) + pix(x+11,y+3) + pix(x+2,y+2) + col(0.952941,0.952941,0.952941) + pix(x+3,y+2) + col(0,0,0) + pix(x+4,y+2) + pix(x+8,y+2) + col(0.752941,0.752941,0.752941) + pix(x+9,y+2) + col(0,0,0) + pix(x+10,y+2) + pix(x+3,y+1) + col(0.952941,0.952941,0.952941) + pix(x+4,y+1) + col(0,0,0) + pix(x+5,y+1) + pix(x+9,y+1) + pix(x+4,y+0) + pixEnd() +end diff --git a/src/bin/geocod/lua/examples/sierpinski.lua b/src/bin/geocod/lua/examples/sierpinski.lua old mode 100755 new mode 100644 index 1853d137..faa4ac41 --- a/src/bin/geocod/lua/examples/sierpinski.lua +++ b/src/bin/geocod/lua/examples/sierpinski.lua @@ -37,6 +37,6 @@ function GLUP.draw_scene() pwidth(0.2) GLUP.Enable(GLUP.VERTEX_COLORS) GLUP.Disable(GLUP.LIGHTING) - pcol("white") + pcol("gray") Sierpinski(100,5) end diff --git a/src/bin/geocod/main.cpp b/src/bin/geocod/main.cpp index 41b190c8..be3cb24c 100644 --- a/src/bin/geocod/main.cpp +++ b/src/bin/geocod/main.cpp @@ -43,7 +43,7 @@ * */ -#include +#include #include #include #include @@ -67,39 +67,36 @@ namespace { * GLUP primitives and glup_viewer application * framework. */ - class GeoCodApplication : public Application { + class GeoCodApplication : public SimpleApplication { public: /** * \brief GeoCodApplication constructor. */ - GeoCodApplication( - int argc, char** argv, - const std::string& usage - ) : Application(argc, argv, usage) { - save_dialog_.set_default_filename("hello.lua"); + GeoCodApplication() : SimpleApplication("geocod") { + set_default_filename("hello.lua"); init_graphics_called_ = false; + use_text_editor_ = true; text_editor_was_visible_ = false; // Define the 3d region that we want to display // (xmin, ymin, zmin, xmax, ymax, zmax) - glup_viewer_set_region_of_interest( - 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f - ); + set_region_of_interest(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); register_embedded_lua_files(); exec_command("require(\"preamble\")"); + console_->show_command_prompt(); } /** * \brief GeoCodApplication destructor. */ - virtual ~GeoCodApplication() { + ~GeoCodApplication() override { } /** * \brief Displays and handles the GUI for object properties. * \details Overloads Application::draw_object_properties(). */ - virtual void draw_object_properties() { + void draw_object_properties() override { if(!lua_error_occured_) { exec_command("imgui.draw_object_properties()"); } @@ -109,7 +106,7 @@ namespace { * \brief Draws the scene according to currently set primitive and * drawing modes. */ - virtual void draw_scene() { + void draw_scene() override { if(text_editor_was_visible_ && !text_editor_visible_) { run_program(); } @@ -125,8 +122,8 @@ namespace { * is called as soon as the OpenGL context is ready for rendering. It * is meant to initialize the graphic objects used by the application. */ - virtual void init_graphics() { - Application::init_graphics(); + void GL_initialize() override { + SimpleApplication::GL_initialize(); if(!lua_error_occured_) { exec_command("GLUP.init_graphics()"); } @@ -152,7 +149,7 @@ namespace { } - virtual void draw_fileops_menu() { + virtual void draw_fileops_menu() override { if(ImGui::BeginMenu("New...")) { if(ImGui::MenuItem("empty file")) { text_editor_.clear(); @@ -179,10 +176,13 @@ namespace { if(ImGui::BeginMenu("Load internal lib...")) { ImGui::MenuItem("These files are those", nullptr, false, false); ImGui::MenuItem( - "that are read by require(\"...\")", nullptr, false, false + "that are read by require(\"...\")", + nullptr, false, false ); - ImGui::MenuItem("You cannot modify them", nullptr, false, false); - ImGui::MenuItem("(but you can take a look)", nullptr, false, false); + ImGui::MenuItem("You cannot modify them", + nullptr, false, false); + ImGui::MenuItem("(but you can take a look)", + nullptr, false, false); ImGui::Separator(); embedded_files_menu("lib/"); ImGui::EndMenu(); @@ -202,7 +202,7 @@ namespace { if(!lua_error_occured_ && init_graphics_called_) { exec_command("GLUP.init_graphics()"); } - glup_viewer_enable(GLUP_VIEWER_IDLE_REDRAW); + start_animation(); } /** @@ -211,7 +211,7 @@ namespace { * Application::draw_application_menus(). It can be used to create * additional menus in the main menu bar. */ - virtual void draw_application_menus() { + void draw_application_menus() override { if(!lua_error_occured_) { exec_command("imgui.draw_application_menus()"); } @@ -220,7 +220,7 @@ namespace { /** * \copydoc Application::load() */ - virtual bool load(const std::string& filename) { + bool load(const std::string& filename) override { text_editor_.load(filename); run_program(); current_file_ = filename; @@ -230,7 +230,7 @@ namespace { /** * \copydoc Application::save() */ - virtual bool save(const std::string& filename) { + bool save(const std::string& filename) override { text_editor_.save(filename); current_file_ = filename; return true; @@ -239,21 +239,42 @@ namespace { /** * \copydoc Application::supported_read_file_extensions() */ - virtual std::string supported_read_file_extensions() { + std::string supported_read_file_extensions() override { return "lua"; } /** * \copydoc Application::supported_write_file_extensions() */ - virtual std::string supported_write_file_extensions() { + std::string supported_write_file_extensions() override { return "lua"; } /** - * \copydoc Application::on_key_pressed() + * \copydoc SimpleApplication::key_callback */ - virtual bool on_key_pressed(const char* c) { + void key_callback( + int key, int scancode, int action, int mods + ) override { + SimpleApplication::key_callback(key, scancode, action, mods); + const char* k_str = key_to_string(key); + // Get string from printable character + // (note: with GLFW, this does not interpret the key mapping, + // so Q and A are swapped on a French keyboard...) + if(*k_str == '\0') { + static char buff[2]; + k_str = buff; + buff[0] = char(key); + buff[1] = '\0'; + } + if(action == 1) { + on_key_pressed(k_str); + } else if(action == 0) { + on_key_released(k_str); + } + } + + bool on_key_pressed(const char* c) { if(!strcmp(c,"F5")) { run_program(); } else if(!strcmp(c,"F2") && current_file_ != "") { @@ -271,10 +292,7 @@ namespace { return true; } - /** - * \copydoc Application::on_key_released() - */ - virtual bool on_key_released(const char* c) { + bool on_key_released(const char* c) { exec_command( ( std::string("imgui.on_key_released(\"") + c + "\")" @@ -284,13 +302,21 @@ namespace { } protected: - virtual void draw_viewer_properties() { - if(ImGui::Button("run program [F5]", ImVec2(-1,0))) { + void draw_viewer_properties() override { + if(ImGui::Button( + "run", + ImVec2(-ImGui::GetContentRegionAvailWidth()/2.0f,0.0f)) + ) { run_program(); } - Application::draw_viewer_properties(); + ImGui::SameLine(); + if(ImGui::Button("edit", ImVec2(-1.0f, 0.0f))) { + text_editor_visible_ = !text_editor_visible_; + } + ImGui::Separator(); + SimpleApplication::draw_viewer_properties(); } - + private: bool init_graphics_called_; bool text_editor_was_visible_; @@ -299,7 +325,7 @@ namespace { } int main(int argc, char** argv) { - GeoCodApplication app(argc, argv, ""); - app.start(); + GeoCodApplication app; + app.start(argc, argv); return 0; } diff --git a/src/bin/geodump/CMakeLists.txt b/src/bin/geodump/CMakeLists.txt index 49c97e58..7edb1ec1 100755 --- a/src/bin/geodump/CMakeLists.txt +++ b/src/bin/geodump/CMakeLists.txt @@ -1,7 +1,8 @@ +set(APP_NAME geodump) aux_source_directories(SOURCES "" .) -vor_add_executable(geodump ${SOURCES}) -target_link_libraries(geodump geogram) -install_runtime_targets(geodump) +vor_add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram) +install_runtime_targets(${APP_NAME}) -set_target_properties(geodump PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/bin/geoshade/CMakeLists.txt b/src/bin/geoshade/CMakeLists.txt new file mode 100755 index 00000000..430c4724 --- /dev/null +++ b/src/bin/geoshade/CMakeLists.txt @@ -0,0 +1,10 @@ +include(${PROJECT_SOURCE_DIR}/cmake/opengl.cmake) +set(APP_NAME geoshade) + +aux_source_directories(SOURCES "" .) +aux_source_directories(SOURCES "glsl" glsl) +add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram_gfx geogram ${GLFW_LIBRARIES}) +install_runtime_targets(${APP_NAME}) + +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/bin/geoshade/glsl/ShaderToy/AlloyPlatedVoronoi.glsl b/src/bin/geoshade/glsl/ShaderToy/AlloyPlatedVoronoi.glsl new file mode 100644 index 00000000..708b38b1 --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/AlloyPlatedVoronoi.glsl @@ -0,0 +1,335 @@ +/* + + Alloy Plated Voronoi + -------------------- + + This was originally a rigid scrolling example, but I thought the movement looked more + interesting. Obviously, hard, fluid alloy doesn't make a lot of physical sense, so if the + situation really messes with your sense of correctness, uncomment the "RIGID_SCOLL" + define... or just pretend it's futuristic alien alloy from another dimension. :D + + From a technical perspective, it's a couple of smooth Voronoi layers (based on IQ's + article below), split into fractional contours then bump mapped. Hardly cutting edge, + and not all that exciting. One of the things that did require some effort was producing + the succinct smooth borders with enough quality to allow for pronounced bump mapping + with minimal artifacts. The results are sufficient, but there are probably more efficent + ways to achieve the same. + + I was going for a tarnished silver kind of look. Not sure whether it worked, but it looks + shiny, so that's good enough for me. :) When I first started taking an interest in graphics, + my idea of producing a metallic looking object was to render it flat grey, then add some + ambient lighting... Yes, I was "that" naive. :D + + These days, I apply a little more science, but a lot of it is still made up. Specular + lighting and fake reflections help add to the illusion, but I find that ramping the diffuse + light to a few powers tends to work best. Also, to give the light more angularity, I + accentuated the bump mapping more than I usually would. + + + + + Similar Examples: + + Voronoi - smooth - iq + https://www.shadertoy.com/view/ldB3zc + + // Great accompanying article. + http://www.iquilezles.org/www/articles/smoothvoronoi/smoothvoronoi.htm + + + // A cleaner, more simplistic rendering. + Smooth Voronoi Contours - Shane + https://www.shadertoy.com/view/4sdXDX + + +*/ + +//#define RIGID_SCROLL + +// Gradient factor. See the "func" function. It's a fudge factor used to make the contour lines appear +// unison in width. It's a mildly expensive calulation, and I'm reusing it, so it's global. I'll try to +// localize it later. +float gF; + +//float sFract(float x, float sm){ float fx = fract(x); return fx - smoothstep(fwidth(x)*sm, 0., 1. - fx); } +//float sFract(float x, float sm){ float fx = fract(x); return min(fx, fx*(1. - fx)/gF/sm); }//fwidth(x) + +// Based on Ollj's smooth "fract" formula. +float sFract(float x, float sm){ + + // Extra smoothing factor. "1" is the norm. + const float sf = .5; + + // The hardware "fwidth" is cheap, but you could take the expensive route and + // calculate it by hand if more quality was required. + vec2 u = vec2(x, fwidth(x)*sf*sm); + + // Ollj's original formula with a transcendental term omitted. + u.x = fract(u.x); + u += (1. - 2.*u)*step(u.y, u.x); + return clamp(1. - u.x/u.y, 0., 1.); // Cos term ommitted. +} + + + +float sFloor(float x){ return x - sFract(x, 1.); } // Only works for nonnegative "x," which is fine here. + + +// Standard hue rotation formula with a bit of streamlining. +vec3 rotHue(vec3 p, float a){ + + vec2 cs = sin(vec2(1.570796, 0) + a); + + mat3 hr = mat3(0.299, 0.587, 0.114, 0.299, 0.587, 0.114, 0.299, 0.587, 0.114) + + mat3(0.701, -0.587, -0.114, -0.299, 0.413, -0.114, -0.300, -0.588, 0.886) * cs.x + + mat3(0.168, 0.330, -0.497, -0.328, 0.035, 0.292, 1.250, -1.050, -0.203) * cs.y; + + return clamp(p*hr, 0., 1.); +} + + +// Standard 2x2 hash algorithm. +vec2 hash22(vec2 p) { + + // Faster, but probaly doesn't disperse things as nicely as other methods. + float n = sin(dot(p, vec2(41, 289))); + p = fract(vec2(2097152, 262144)*n); + #ifdef RIGID_SCROLL + return p - .5; + #else + return cos(p*6.283 + iTime)*.5; + //return abs(fract(p+ iTime*.25)-.5)*2. - .5; // Snooker. + //return abs(cos(p*6.283 + iTime))*.5; // Bounce. + #endif + +} + + +// vec3 to vec3 hash algorithm. +vec3 hash33(vec3 p) { + + // Faster, but doesn't disperse things quite as nicely as the block below it. However, when framerate + // is an issue, and it often is, this is the one to use. Basically, it's a tweaked amalgamation I put + // together, based on a couple of other random algorithms I've seen around... so use it with caution, + // because I make a tonne of mistakes. :) + float n = sin(dot(p, vec3(7, 157, 113))); + return fract(vec3(2097152, 262144, 32768)*n)*2. - 1.; // return fract(vec3(64, 8, 1)*32768.0*n)*2.-1.; + + // I'll assume the following came from IQ. + //p = vec3( dot(p, vec3(127.1, 311.7, 74.7)), dot(p, vec3(269.5, 183.3, 246.1)), dot(p, vec3(113.5, 271.9, 124.6))); + //return (fract(sin(p)*43758.5453)*2. - 1.); + +} + + + +// Cheap, streamlined 3D Simplex noise... of sorts. I cut a few corners, so it's not perfect, but it's +// artifact free and does the job. I gave it a different name, so that it wouldn't be mistaken for +// the real thing. +// +// Credits: Ken Perlin, the inventor of Simplex noise, of course. Stefan Gustavson's paper - +// "Simplex Noise Demystified," IQ, other "ShaderToy.com" people, etc. +float tetraNoise(in vec3 p){ + + // Skewing the cubic grid, then determining the first vertice and fractional position. + vec3 i = floor(p + dot(p, vec3(0.333333)) ); p -= i - dot(i, vec3(0.166666)) ; + + // Breaking the skewed cube into tetrahedra with partitioning planes, then determining which side of the + // intersecting planes the skewed point is on. Ie: Determining which tetrahedron the point is in. + vec3 i1 = step(p.yzx, p), i2 = max(i1, 1.0-i1.zxy); i1 = min(i1, 1.0-i1.zxy); + + // Using the above to calculate the other three vertices. Now we have all four tetrahedral vertices. + vec3 p1 = p - i1 + 0.166666, p2 = p - i2 + 0.333333, p3 = p - 0.5; + + + // 3D simplex falloff. + vec4 v = max(0.5 - vec4(dot(p,p), dot(p1,p1), dot(p2,p2), dot(p3,p3)), 0.0); + + // Dotting the fractional position with a random vector generated for each corner -in order to determine + // the weighted contribution distribution... Kind of. Just for the record, you can do a non-gradient, value + // version that works almost as well. + vec4 d = vec4(dot(p, hash33(i)), dot(p1, hash33(i + i1)), dot(p2, hash33(i + i2)), dot(p3, hash33(i + 1.))); + + + // Simplex noise... Not really, but close enough. :) + return clamp(dot(d, v*v*v*8.)*1.732 + .5, 0., 1.); // Not sure if clamping is necessary. Might be overkill. + +} + + + +// Smooth Voronoi. I'm not sure who came up with the original, but I think IQ +// was behind this particular algorithm. It's just like the regular Voronoi +// algorithm, but instead of determining the minimum distance, you accumulate +// values - analogous to adding metaball field values. The result is a nice +// smooth pattern. The "falloff" variable is a smoothing factor of sorts. +// +float smoothVoronoi(vec2 p, float falloff) { + + vec2 ip = floor(p); p -= ip; + + float d = 1., res = 0.; + + for(int i=-1; i<=2; i++) { + for(int j=-1; j<=2; j++) { + + vec2 b = vec2(i, j); + + vec2 v = b - p + hash22(ip + b); + + d = max(dot(v,v), 1e-8); + + res += 1./pow(d, falloff ); + //res += exp( -16.*d ); // Alternate version. + } + } + + return pow(1./res, .5/falloff); + //return clamp((-(1./16.)*log(res) + .1)/1.1, 0., 1.); // Alternate version. +} + + + +// 2D function we'll be creating the fractional contours for. +float func2D(vec2 p){ + + #ifdef RIGID_SCROLL + p += vec2(-.2, 0)*iTime; // Scrolling. + #endif + + return smoothVoronoi(p*2., 4.)*.66 + smoothVoronoi(p*6., 4.)*.34; + +} + +// For fractional countours, something like "fract(func(p)*layers" will work, but the results +// are aliased, so a smooth "fract" function needs to be applied. For nice, even contour lines, +// the functional curvature needs to be taken into account. Hence the "fxr" and "fyb" samples. +float func(vec2 p){ + + float f = func2D(p); // Function value. + + // Samples in the X and Y directions to even up the contour lines according to curvature. + vec2 e = vec2(8./iResolution.y, 0); + float fxr = func2D(p - e.xy); + float fyb = func2D(p - e.yx); + + // Gradient factor. Four samples would be better, but I'm trying to save some calculations. + // I made "gF" global, for reuse purposes, but I'll try to rectify that later. See the "sFract" + // function. Press pause, then set "gF" to a constant, like ".04," to see what it does. + // This example would be a lot faster if "gF" was set to a constant (since the two samples + // above wouldn't be necessary), so if you like that aesthetic more, then that's the way to go. + gF = length(f - vec2(fxr, fyb)); + + const float palNum = 12.; // 12 contour lines. + return sFract(f*palNum, 4.); // 4 is a smoothing factor. Getting the balance right can be frustrating. + +} + +// Simple environment mapping. Pass the reflected vector in and create some +// colored noise with it. +vec3 envMap(vec3 rd){ + + + float c = tetraNoise(rd*3.)*.57 + tetraNoise(rd*6.)*.28 + tetraNoise(rd*12.)*.15; // Noise value. + c = smoothstep(.4, 1., c); // Darken and add contast for more of a spotlight look. + + vec3 col = vec3(c*c*c, c*c, c); // Simple, cool coloring. + //vec3 col = vec3(min(c*1.5, 1.), pow(c, 2.5), pow(c, 12.)); // Warm color. + + // Mix in the reverse color to tone it down and return. + return mix(col, col.zxy, rd*.25 + .25); + +} + + + +void mainImage(out vec4 fragColor, in vec2 fragCoord){ + + // Screen coordinates. + vec2 u = (fragCoord.xy - iResolution.xy*.5)/iResolution.y; + + // Function value. + float f = func(u); + float ssd = func2D(u); // Saving the unpalettized noise value to add a little gradient to the color, etc. + + // Four sample values around the original. Used for edging and highlighting. Note the "1.5" factor in a + // couple of samples. I was playing around and liked it more that way, but you can take it out if you want. + vec2 e = vec2(2./450., 0); + float fxl = func(u + e.xy*1.5); + float fxr = func(u - e.xy); + float fyt = func(u + e.yx*1.5); + float fyb = func(u - e.yx); + + // Colorizing the the function value. + vec3 col = vec3(.5); + + // Applying some color and hue rotation based on fractional layer and position. Designed to coincide + // with the "func" function. + const float palNum2 = 12.; + float fi = (1. - clamp(sFloor(ssd*(palNum2))/(palNum2 - 1.), 0., 1.)); + fi = mod(fi, 4./12.); + + if(fi>3./12.) { + // Extra color layers. I found it a bit much. + //col *= vec3(1, .18, .28); + //col = rotHue(col, mod(iTime/3. + 3.14159, 6.2831853) + (length(u*vec2(3., 5.)))); + col *= .25; + } + else if(fi>2./12.) { + + col *= vec3(1, .18, .28); + col = rotHue(col, mod(iTime/4., 6.2831853) + (length(u*vec2(2.5, 4.5))));// + iTime*.5 + } + + // Adding a bit of noise for a bit more authenticity. + vec3 u3 = vec3(u, f); // Fake height, "ssd," according to function value. + #ifdef RIGID_SCROLL + u3.xy += vec2(-.2, 0)*iTime; // Scrolling. + #endif + col = min(col*.8 + tetraNoise(u3*128.)*.4, 1.); + + + + // Extra highlighting to shine up the edges. Purely for aesthetics. Not based on science. :) + col += vec3(.5, .7, 1)*(max(f - fyt, 0.) + max(f - fxl, 0.))*1.*ssd*2.; + + + vec3 rd = normalize(vec3(u, 1)); // Unit direction vector. + vec3 n = normalize(vec3(0, 0, -1) + vec3(fxr - fxl, fyb - fyt, 0)/e.x/1.4*.01); // Bumped normal. + vec3 ld = (vec3(.25, .25, -1.) - vec3(u, 0)); // Light direction - Position minus surface point. + + float dist = length(ld); // Light distance. + float atten = 1./(1. + dist*dist*.25); // Light attenuation. + + ld /= dist; // Normalizing the light dirction vector. + + + float diff = max(dot(ld, n), 0.); // Diffuse. + diff = pow(diff, 4.)*.66 + pow(diff, 8.)*.34; // Ramped diffuse - for shininess. + float spec = pow(max(dot(reflect(ld, n), rd), 0.), 8.); // Specular. + float fres = pow(clamp(dot(rd, n) + 1., 0., 1.), 3.); // Fresnel. + + // Combining the above terms to produce the lit color. + col = col*(diff*2. + .125) + vec3(1, .7, .3)*spec*2. + vec3(.25, .5, 1)*fres*2.; + //col += vec3(.5, .7, 1)*diff*diff*.5; // Too much shine. :) + + + // Fake environment mapping for that reflective look. + col += (col*.65 + .35)*envMap(reflect(rd, vec3(0, 0, -1)*.25 + n*.75))*2.; + + // Attenuating, then adding some brown shadowing for a subtle tarnished look. + col *= atten*(vec3(f, pow(f, 1.1), pow(f, 1.2))*.85 + .15); + + + // col *= vec3(1.2, .95, .8); // Bronze, copper... kind of. + + + // Subtle, bluish vignette. + //u = fragCoord/iResolution.xy; + //col = mix(vec3(0, .1, 1), col, pow( 16.0*u.x*u.y*(1.0-u.x)*(1.0-u.y) , .125)*.15 + .85); + + + // Rough gamma correction. + fragColor = vec4(sqrt(clamp(col, 0., 1.)), 1); + +} diff --git a/src/bin/geoshade/glsl/ShaderToy/AndromedaJewel.glsl b/src/bin/geoshade/glsl/ShaderToy/AndromedaJewel.glsl new file mode 100644 index 00000000..d9edb099 --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/AndromedaJewel.glsl @@ -0,0 +1,81 @@ +#define pi 3.14159265359 +//this noise stuff is from iq thanks +float hash (vec2 v) { + v = floor(v); + return fract(67.3249*sin(17.1234*length(v-vec2(34.14,123.)))); +} +float noise (vec2 v) { + vec4 n = vec4(floor(v),ceil(v)); + vec4 h = vec4(hash(n.xy),hash(n.zy),hash(n.xw),hash(n.zw)); + return mix(mix(h.x,h.y,v.x-n.x),mix(h.z,h.w,v.x-n.x),v.y-n.y); +} +mat2 r (float a) { + float s = sin(a), c = cos(a); + return mat2(s,-c,c,s); +} +float no (vec2 v) { + float c = 0.; + for (int i = 1; i < 10; i++) { + v = 2.*r(0.2944*pi)*v; + c += 0.2*noise(v)/(1.+length(sin(0.5*v))); + } + return c; +} +// flow stuff is from trirop https://www.shadertoy.com/view/MsScWD very cool +vec2 ff (vec2 v) { + float n = 1.+0.5*noise(v); + return + sign(v.y-0.5)*50.*vec2(n*sin(1.4*v.y),0.)/(v.y+3.5)+ + .1*vec2(sin(-12.*v.y*n),cos(13.*v.x))+ + 1.8*vec2(cos(-6.*v.y),sin(4.*v.x))+ + 1.2*vec2(sin(-1.4*v.y),cos(1.5*v.x))+ + 2.0*vec2(sin(-.5*v.y),cos(.6*v.x))+ + 0.8*vec2(sin(-.2*v.y),cos(.2*v.x*n)) + ;} +bool star = false; +vec2 mouse; +void sphere (inout vec3 p, inout vec3 d) { + float r = .7, dp = dot(d,p), pp = dot(p,p), det = dp*dp+r*r-pp; + if (det < 0.) star = true; + float x = -dp+sqrt(det); + p = (p+d*x); + d = reflect(normalize(p),d); +} + +vec3 surface (vec2 uv) { + vec3 col = 0.*vec3(7.-abs(uv.y))*no (uv); + for (int i = 0; i < 45; i++) { + uv += 0.01*(2.+1.5*sin(.1*iTime))*ff(uv); + } + float j = no(0.1*uv*pi); + vec3 c = sin(j*vec3(1,2,3)); + col += abs(mix(c*c*c,vec3(j),abs(1.-uv.y/7.5))); + return col; +} +vec3 stars (vec2 v) { + return vec3(pow(1.35*no(0.1*iTime+5.*mouse+3.*v/dot(v,v)),7.)); +} +void mainImage( out vec4 fragColor, in vec2 U ) +{ + vec2 uv = (2.*U-iResolution.xy)/iResolution.y; + float q = 1.2+0.1*min(17.,iTime); + vec3 p = vec3(0,0,-q); + vec3 d = normalize(vec3(uv,4.)); + mouse = iMouse.xy/iResolution.xy; + p.yz = r(-mouse.y+0.7*pi)*p.yz; + d.yz = r(-mouse.y+0.7*pi)*d.yz; + p.zx = r(mouse.x+0.25*pi)*p.zx; + d.zx = r(mouse.x+0.25*pi)*d.zx; + vec3 col; + sphere(p,d); + if (star) { + col = stars(uv); + } else { + col = 0.8*surface(8.*vec2(atan(d.z,d.x)+0.01*iTime*min(iTime,17.),acos(d.y))); + float sh = dot(d,normalize(vec3(1,0,-1))); + col *= sh+0.4; + } + float l = length(uv-vec2(0.2,0))*q; + col = col+.09*vec3(0.5,0.7,1.)*(uv.x+0.5)*exp(-0.01*l*l*l*l)*q; + fragColor = vec4(col,1); +} \ No newline at end of file diff --git a/src/bin/geoshade/glsl/ShaderToy/Circuits.glsl b/src/bin/geoshade/glsl/ShaderToy/Circuits.glsl new file mode 100644 index 00000000..0a96653c --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/Circuits.glsl @@ -0,0 +1,57 @@ +#define time iTime*.02 + + +#define width .005 +float zoom = .18; + +float shape=0.; +vec3 color=vec3(0.),randcol; + +void formula(vec2 z, float c) { + float minit=0.; + float o,ot2,ot=ot2=1000.; + for (int i=0; i<9; i++) { + z=abs(z)/clamp(dot(z,z),.1,.5)-c; + float l=length(z); + o=min(max(abs(min(z.x,z.y)),-l+.25),abs(l-.25)); + ot=min(ot,o); + ot2=min(l*.1,ot2); + minit=max(minit,float(i)*(1.-abs(sign(ot-o)))); + } + minit+=1.; + float w=width*minit*2.; + float circ=pow(max(0.,w-ot2)/w,6.); + shape+=max(pow(max(0.,w-ot)/w,.25),circ); + vec3 col=normalize(.3+texture(iChannel1,vec2(minit*.1)).rgb); + color+=col*(.4+mod(minit/9.-time*10.+ot2*2.,1.)*1.6); + color+=vec3(1.,.7,.3)*circ*(10.-minit)*3.*smoothstep(0.,.5,.15+texture(iChannel0,vec2(.0,1.)).x-.5); +} + + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 pos = fragCoord.xy / iResolution.xy - .5; + pos.x*=iResolution.x/iResolution.y; + vec2 uv=pos; + float sph = length(uv); sph = sqrt(1. - sph*sph)*1.5; // curve for spheric distortion + uv=normalize(vec3(uv,sph)).xy; + float a=time+mod(time,1.)*.5; + vec2 luv=uv; + float b=a*5.48535; +// zoom*=1.+sin(time*3.758123)*.8; + uv*=mat2(cos(b),sin(b),-sin(b),cos(b)); + uv+=vec2(sin(a),cos(a*.5))*8.; + uv*=zoom; + float pix=.5/iResolution.x*zoom/sph; + float dof=max(1.,(10.-mod(time,1.)/.01)); + float c=1.5+mod(floor(time),6.)*.125; + for (int aa=0; aa<36; aa++) { + vec2 aauv=floor(vec2(float(aa)/6.,mod(float(aa),6.))); + formula(uv+aauv*pix*dof,c); + } + shape/=36.; color/=36.; + vec3 colo=mix(vec3(.15),color,shape)*(1.-length(pos))*min(1.,abs(.5-mod(time+.5,1.))*10.); + colo*=vec3(1.2,1.1,1.0); + fragColor = vec4(colo,1.0); +} + diff --git a/src/bin/geoshade/glsl/ShaderToy/ContouredLayers.glsl b/src/bin/geoshade/glsl/ShaderToy/ContouredLayers.glsl new file mode 100644 index 00000000..5cde68a3 --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/ContouredLayers.glsl @@ -0,0 +1,365 @@ +/* + + Contoured Layers + ---------------- + + Constructing some concise contoured layers, then applying various edge and shading + effects to produce some faux depth. Technically, that's what is happening here, but + this example was mainly put together as a means to demonstrate various layering + effects, like strokes, highlights, shadows, etc. No 3D was harmed during the making + of this example. :) + + I love those contoured noise-based paper layer images that various graphic artists + from places like Adobe distribute with their applications. Most consist of some + antialised noise layers rendered in a flat tone with drop shadows for each. The + fancier ones sometimes include highlighted edges, etc, which is what I've put + together here. None of it is difficult to produce, provided you're happy with + concept of smoothing layers at a particular threshold with respect to the field + derivative. + + I put in a few diferent aesthetic options to try, just to show how much something + like a simple palette change, drop shadow, etc, can effect the overall feel. + Anyway, feel free to play around with the defines below. At some stage, I might + render some icons and allow the various options to be manipulated via the mouse, + but for now, this will suffice. + + I also have a few raymarched 3D versions that I'll put up at a later date. + + +*/ + +// Dropping down a blurry dark layer to give a fake ambient occlusion effect. +// It's subtle, but gives things a bit more depth. However, turning it off gives +// a crisper look. I guess it depends what you're after. +#define FAKE_AO + +// Controur strokes are great for that hand drawn look, or just to give some definition +// to geometry. This one is dark, but it can be any color. +#define STROKE + +// Highlights, to give the impression that light is hitting the surface. +#define HILIGHT + +// Shadows: There aren't too many times when I wouldn't want shadows, but I can think +// of a few. If expense if a problem, you can fake it with a thicker AO layer, but it's +// not quite the same. +#define SHADOW + +// Include the metallic texture. I overuse this particular texture, but it's the only +// one on Shadertoy with a fine enough grade on it. I'm hoping more subtle textures +// will get added at some stage. :) +// #define TEXTURED + +// Running a cheap hatch-like algorithm over the layers for a bit of extra texture. +#define HATCH + +// Very subtle paper grain. It's pretty simple, and I think it came from one of +// Flockaroo's examples. +#define PAPER_GRAIN + +// Palette: It's amazing how something as simple as color choice can effect the feel +// of an image. +// Settings: Greyscale: 0, Red: 1, Blue: 2, Earth: 3, Pink and grey: 4. +#define PALETTE 3 + + + + +// Standard 2D rotation formula. +mat2 rot2(in float a){ float c = cos(a), s = sin(a); return mat2(c, -s, s, c); } + +// vec3 to float hash. +float hash21( vec2 p ){ + + return fract(sin(dot(p, vec2(41, 289)))*45758.5453); + + //p.x = fract(sin(dot(p, vec2(1, 113)))*45758.5453); + //return sin(p.x*6.2831853 + iTime); +} + +// vec2 to vec2 hash. +vec2 hash22(vec2 p) { + + // Faster, but doesn't disperse things quite as nicely. However, when framerate + // is an issue, and it often is, this is a good one to use. Basically, it's a tweaked + // amalgamation I put together, based on a couple of other random algorithms I've + // seen around... so use it with caution, because I make a tonne of mistakes. :) + float n = sin(dot(p, vec2(1, 113))); + //return fract(vec2(262144, 32768)*n)*2. - 1.; + + // Animated. + p = fract(vec2(262144, 32768)*n); + // Note the ".45," insted of ".5" that you'd expect to see. When edging, it can open + // up the cells ever so slightly for a more even spread. In fact, lower numbers work + // even better, but then the random movement would become too restricted. Zero would + // give you square cells. + return sin( p*6.2831853 + iTime); + +} + + + +// Cheap and nasty 2D smooth noise function with inbuilt hash function -- based on IQ's +// original. Very trimmed down. In fact, I probably went a little overboard. I think it +// might also degrade with large time values, but that's not an issue here. +float n2D(vec2 p) { + + vec2 i = floor(p); p -= i; p *= p*(3. - p*2.); + + return dot(mat2(fract(sin(vec4(0, 1, 113, 114) + dot(i, vec2(1, 113)))*43758.5453))* + vec2(1. - p.y, p.y), vec2(1. - p.x, p.x) ); + +} + + +// Based on IQ's gradient noise formula. +float n2D3G( in vec2 p ){ + + vec2 i = floor(p); p -= i; + + vec4 v; + v.x = dot(hash22(i), p); + v.y = dot(hash22(i + vec2(1, 0)), p - vec2(1, 0)); + v.z = dot(hash22(i + vec2(0, 1)), p - vec2(0, 1)); + v.w = dot(hash22(i + 1.), p - 1.); + +#if 1 + // Quintic interpolation. + p = p*p*p*(p*(p*6. - 15.) + 10.); +#else + // Cubic interpolation. + p = p*p*(3. - 2.*p); +#endif + + return mix(mix(v.x, v.y, p.x), mix(v.z, v.w, p.x), p.y); + //return v.x + p.x*(v.y - v.x) + p.y*(v.z - v.x) + p.x*p.y*(v.x - v.y - v.z + v.w); +} + + + +// The map function. Just two layers of gradient noise. Way more interesting +// functions are possible, but we're keeping things simple. +float map(vec3 p, float i){ + + return n2D3G(p.xy*3.)*.66 + n2D3G(p.xy*6.)*.34 + i/10.*1. - .15; + +} + + +// 2D derivative function. +vec3 getNormal(in vec3 p, float m, float i) { + + vec2 e = vec2(.001, 0); + + // Four extra samples. Slightly better, but not really needed here. + //return (vec3(map(p + e.xyy, i) - map(p - e.xyy, i), map(p + e.yxy, i) - map(p - e.yxy, i), 0.))/e.x*.7071; + + // Three samples, but only two extra sample calculations. + return (vec3(m - map(p - e.xyy, i), m - map(p - e.yxy, i), 0.))/e.x*1.4142; +} + +// The map layer and its derivative. To produce constant width layer edges, the derivative +// is necessary, so the distance field value and the derivative at the point is returned. +vec4 mapLayer(in vec3 p, float i){ + + vec4 d; + + d.x = map(p, i); // Distance field value. + + d.yzw = getNormal(p, d.x, i); // Derivative. + + return d; + +} + + + +// Layer color. Based on the shade, layer number and smoothing factor. +vec3 getCol(vec2 p, float sh, float fi, float sf){ + + // Color. + vec3 col; + + + #if PALETTE == 0 + // Light attenuation palette. + col = vec3(1)*(1. - .75/(1. + sh*sh*2.)); + //col = vec3(sh*sh*.65 + .22); + //col = vec3(sh*.5 + .2); + // Etc. + #elif PALETTE == 1 + col = pow(min(vec3(1.5, 1, 1)*(sh*.35 + .6), 1.), vec3(1, 3, 16)); + if(fi==0.) col = vec3(.35, .05, .3); + col = mix(col.xzy, col, sh*.5 + .5); + #elif PALETTE == 2 + col = pow(min(vec3(1.5, 1, 1)*(sh*.35 + .6), 1.), vec3(1, 3, 16)); + if(fi==0.) col = vec3(.6, .2, .07); + col = mix(col.xzy, col, sh*.5 + .5).zyx; + #elif PALETTE == 3 + if(fi==0.) col = vec3(.25, .52, .75); + if(fi==1.) col = vec3(.8, .8, .6); + if(fi==2.) col = vec3(.75, .6, .5); + if(fi==3.) col = vec3(.6, .58, .5); + if(fi==4.) col = vec3(.5, .72, .4); + if(fi==5.) col = vec3(.65, .85, .5); + #else + if(mod(fi, 2.)<.5) col = vec3(.25, .15, .2); + else col = vec3(1, .15, .4)*.8; + #endif + + + #ifdef TEXTURED + vec3 tx = texture(iChannel0, p + hash21(vec2(sh, fi))).xyz; tx *= tx; + col = min(col*tx*3., 1.); + #endif + + + return col; + +} + + +void mainImage(out vec4 fragColor, in vec2 fragCoord){ + + + // Aspect correct screen coordinates. Setting a minumum resolution on the + // fullscreen setting in an attempt to keep things relatively crisp. + float res = min(iResolution.y, 700.); + vec2 uv = (fragCoord - iResolution.xy*.5)/res; + + // Scaling and translation. + vec2 p = uv + vec2(0.1, 0.1)*iTime; + + // Resolution based smoothing factor. Later, the contour derivative will + // be factored in. + float sf = 1./iResolution.y; + + // Initialize to the first layer color. + vec3 col = getCol(p, 0., 0., sf); + + // Previous layer variable. + float pL = 0.; + + + // Random looking diagonal hatch lines. + vec2 u2 = p*res/16.; + float hatch = clamp(sin((u2.x - u2.y)*3.14159*200.)*2. + .5, 0., 1.); // Diagonal lines. + float hRnd = hash21(floor(u2*6.) + .73); + if(hRnd>.66) hatch = hRnd; // Slight randomization of the diagonal lines. + #ifdef TEXTURED + hatch = hatch*.75 + .5; // Stronger hatching for the textured version. + #else + hatch = hatch*.5 + .75; + #endif + + #ifndef HATCH + hatch = 1.; + #endif + + // Applying the cross hatch. + col *= hatch; + + // Number of layers. + int lNum = 5; + float flNum = 5.; + + + for(int i = 0; i0.0) c=vec4(0,0,0,0); else + if (0.0/6.00.2) color.a=0.0; + return color; +} + + +// Raymarching and 2D graphics + +vec3 raymarch(in vec3 from, in vec3 dir) + +{ + edge=0.; + vec3 p, norm; + float d=100.; + float totdist=0.; + for (int i=0; idet && totdist<25.0) { + p=from+totdist*dir; + d=de(p); + det=detail*exp(.13*totdist); + totdist+=d; + } + } + vec3 col=vec3(0.); + p-=(det-d)*dir; + norm=normal(p); +#ifdef SHOWONLYEDGES + col=1.-vec3(edge); // show wireframe version +#else + col=(1.-abs(norm))*max(0.,1.-edge*.8); // set normal as color with dark edges +#endif + totdist=clamp(totdist,0.,26.); + dir.y-=.02; +// float sunsize=7.-max(0.,texture(iChannel0,vec2(.6,.2)).x)*5.; // responsive sun size + float sunsize=7.; + float an=atan(dir.x,dir.y)+iTime*1.5; // angle for drawing and rotating sun + float s=pow(clamp(1.0-length(dir.xy)*sunsize-abs(.2-mod(an,.4)),0.,1.),.1); // sun + float sb=pow(clamp(1.0-length(dir.xy)*(sunsize-.2)-abs(.2-mod(an,.4)),0.,1.),.1); // sun border + float sg=pow(clamp(1.0-length(dir.xy)*(sunsize-4.5)-.5*abs(.2-mod(an,.4)),0.,1.),3.); // sun rays + float y=mix(.45,1.2,pow(smoothstep(0.,1.,.75-dir.y),2.))*(1.-sb*.5); // gradient sky + + // set up background with sky and sun + vec3 backg=vec3(0.5,0.,1.)*((1.-s)*(1.-sg)*y+(1.-sb)*sg*vec3(1.,.8,0.15)*3.); + backg+=vec3(1.,.9,.1)*s; + backg=max(backg,sg*vec3(1.,.9,.5)); + + col=mix(vec3(1.,.9,.3),col,exp(-.004*totdist*totdist));// distant fading to sun color + if (totdist>25.) col=backg; // hit background + col=pow(col,vec3(GAMMA))*BRIGHTNESS; + col=mix(vec3(length(col)),col,SATURATION); +#ifdef SHOWONLYEDGES + col=1.-vec3(length(col)); +#else + col*=vec3(1.,.9,.85); +#ifdef NYAN + dir.yx*=rot(dir.x); + vec2 ncatpos=(dir.xy+vec2(-3.+mod(-t,6.),-.27)); + vec4 ncat=nyan(ncatpos*5.); + vec4 rain=rainbow(ncatpos*10.+vec2(.8,.5)); + if (totdist>8.) col=mix(col,max(vec3(.2),rain.xyz),rain.a*.9); + if (totdist>8.) col=mix(col,max(vec3(.2),ncat.xyz),ncat.a*.9); +#endif +#endif + return col; +} + +// get camera position +vec3 move(inout vec3 dir) { + vec3 go=path(t); + vec3 adv=path(t+.7); + float hd=de(adv); + vec3 advec=normalize(adv-go); + float an=adv.x-go.x; an*=min(1.,abs(adv.z-go.z))*sign(adv.z-go.z)*.7; + dir.xy*=mat2(cos(an),sin(an),-sin(an),cos(an)); + an=advec.y*1.7; + dir.yz*=mat2(cos(an),sin(an),-sin(an),cos(an)); + an=atan(advec.x,advec.z); + dir.xz*=mat2(cos(an),sin(an),-sin(an),cos(an)); + return go; +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 uv = fragCoord.xy / iResolution.xy*2.-1.; + vec2 oriuv=uv; + uv.y*=iResolution.y/iResolution.x; + vec2 mouse=(iMouse.xy/iResolution.xy-.5)*3.; + if (iMouse.z<1.) mouse=vec2(0.,-0.05); + float fov=.9-max(0.,.7-iTime*.3); + vec3 dir=normalize(vec3(uv*fov,1.)); + dir.yz*=rot(mouse.y); + dir.xz*=rot(mouse.x); + vec3 from=origin+move(dir); + vec3 color=raymarch(from,dir); + #ifdef BORDER + color=mix(vec3(0.),color,pow(max(0.,.95-length(oriuv*oriuv*oriuv*vec2(1.05,1.1))),.3)); + #endif + fragColor = vec4(color,1.); +} + diff --git a/src/bin/geoshade/glsl/ShaderToy/GeodesicTiling.glsl b/src/bin/geoshade/glsl/ShaderToy/GeodesicTiling.glsl new file mode 100644 index 00000000..ff60aa22 --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/GeodesicTiling.glsl @@ -0,0 +1,708 @@ +#define MODEL_ROTATION vec2(.3, .25) +#define CAMERA_ROTATION vec2(.5, .5) + +// 0: Defaults +// 1: Model +// 2: Camera +#define MOUSE_CONTROL 1 + +//#define DEBUG + +// 1, 2, or 3 +//#define LOOP 1 + + +// -------------------------------------------------------- +// HG_SDF +// https://www.shadertoy.com/view/Xs3GRB +// -------------------------------------------------------- + +void pR(inout vec2 p, float a) { + p = cos(a)*p + sin(a)*vec2(p.y, -p.x); +} + +float pReflect(inout vec3 p, vec3 planeNormal, float offset) { + float t = dot(p, planeNormal)+offset; + if (t < 0.) { + p = p - (2.*t)*planeNormal; + } + return sign(t); +} + +float smax(float a, float b, float r) { + float m = max(a, b); + if ((-a < r) && (-b < r)) { + return max(m, -(r - sqrt((r+a)*(r+a) + (r+b)*(r+b)))); + } else { + return m; + } +} + + +// -------------------------------------------------------- +// Icosahedron domain mirroring +// Adapted from knighty https://www.shadertoy.com/view/MsKGzw +// -------------------------------------------------------- + +#define PI 3.14159265359 + +vec3 facePlane; +vec3 uPlane; +vec3 vPlane; + +int Type=5; +vec3 nc; +vec3 pab; +vec3 pbc; +vec3 pca; + +void initIcosahedron() {//setup folding planes and vertex + float cospin=cos(PI/float(Type)), scospin=sqrt(0.75-cospin*cospin); + nc=vec3(-0.5,-cospin,scospin);//3rd folding plane. The two others are xz and yz planes + pbc=vec3(scospin,0.,0.5);//No normalization in order to have 'barycentric' coordinates work evenly + pca=vec3(0.,scospin,cospin); + pbc=normalize(pbc); pca=normalize(pca);//for slightly better DE. In reality it's not necesary to apply normalization :) + pab=vec3(0,0,1); + + facePlane = pca; + uPlane = cross(vec3(1,0,0), facePlane); + vPlane = vec3(1,0,0); +} + +void pModIcosahedron(inout vec3 p) { + p = abs(p); + pReflect(p, nc, 0.); + p.xy = abs(p.xy); + pReflect(p, nc, 0.); + p.xy = abs(p.xy); + pReflect(p, nc, 0.); +} + + +// -------------------------------------------------------- +// Triangle tiling +// Adapted from mattz https://www.shadertoy.com/view/4d2GzV +// -------------------------------------------------------- + +const float sqrt3 = 1.7320508075688772; +const float i3 = 0.5773502691896258; + +const mat2 cart2hex = mat2(1, 0, i3, 2. * i3); +const mat2 hex2cart = mat2(1, 0, -.5, .5 * sqrt3); + +#define PHI (1.618033988749895) +#define TAU 6.283185307179586 + +struct TriPoints { + vec2 a; + vec2 b; + vec2 c; + vec2 center; + vec2 ab; + vec2 bc; + vec2 ca; +}; + +TriPoints closestTriPoints(vec2 p) { + vec2 pTri = cart2hex * p; + vec2 pi = floor(pTri); + vec2 pf = fract(pTri); + + float split1 = step(pf.y, pf.x); + float split2 = step(pf.x, pf.y); + + vec2 a = vec2(split1, 1); + vec2 b = vec2(1, split2); + vec2 c = vec2(0, 0); + + a += pi; + b += pi; + c += pi; + + a = hex2cart * a; + b = hex2cart * b; + c = hex2cart * c; + + vec2 center = (a + b + c) / 3.; + + vec2 ab = (a + b) / 2.; + vec2 bc = (b + c) / 2.; + vec2 ca = (c + a) / 2.; + + return TriPoints(a, b, c, center, ab, bc, ca); +} + + +// -------------------------------------------------------- +// Geodesic tiling +// -------------------------------------------------------- + +struct TriPoints3D { + vec3 a; + vec3 b; + vec3 c; + vec3 center; + vec3 ab; + vec3 bc; + vec3 ca; +}; + +vec3 intersection(vec3 n, vec3 planeNormal, float planeOffset) { + float denominator = dot(planeNormal, n); + float t = (dot(vec3(0), planeNormal ) + planeOffset) / -denominator; + return n * t; +} + +//// Edge length of an icosahedron with an inscribed sphere of radius of 1 +//float edgeLength = 1. / ((sqrt(3.) / 12.) * (3. + sqrt(5.))); +//// Inner radius of the icosahedron's face +//float faceRadius = (1./6.) * sqrt(3.) * edgeLength; +float faceRadius = 0.3819660112501051; + +// 2D coordinates on the icosahedron face +vec2 icosahedronFaceCoordinates(vec3 p) { + vec3 pn = normalize(p); + vec3 i = intersection(pn, facePlane, -1.); + return vec2(dot(i, uPlane), dot(i, vPlane)); +} + +// Project 2D icosahedron face coordinates onto a sphere +vec3 faceToSphere(vec2 facePoint) { + return normalize(facePlane + (uPlane * facePoint.x) + (vPlane * facePoint.y)); +} + +TriPoints3D geodesicTriPoints(vec3 p, float subdivisions) { + // Get 2D cartesian coordiantes on that face + vec2 uv = icosahedronFaceCoordinates(p); + + // Get points on the nearest triangle tile + float uvScale = subdivisions / faceRadius / 2.; + TriPoints points = closestTriPoints(uv * uvScale); + + // Project 2D triangle coordinates onto a sphere + vec3 a = faceToSphere(points.a / uvScale); + vec3 b = faceToSphere(points.b / uvScale); + vec3 c = faceToSphere(points.c / uvScale); + vec3 center = faceToSphere(points.center / uvScale); + vec3 ab = faceToSphere(points.ab / uvScale); + vec3 bc = faceToSphere(points.bc / uvScale); + vec3 ca = faceToSphere(points.ca / uvScale); + + return TriPoints3D(a, b, c, center, ab, bc, ca); +} + + +// -------------------------------------------------------- +// Spectrum colour palette +// IQ https://www.shadertoy.com/view/ll2GD3 +// -------------------------------------------------------- + +vec3 pal( in float t, in vec3 a, in vec3 b, in vec3 c, in vec3 d ) { + return a + b*cos( 6.28318*(c*t+d) ); +} + +vec3 spectrum(float n) { + return pal( n, vec3(0.5,0.5,0.5),vec3(0.5,0.5,0.5),vec3(1.0,1.0,1.0),vec3(0.0,0.33,0.67) ); +} + + +// -------------------------------------------------------- +// Model/Camera Rotation +// -------------------------------------------------------- + +mat3 sphericalMatrix(float theta, float phi) { + float cx = cos(theta); + float cy = cos(phi); + float sx = sin(theta); + float sy = sin(phi); + return mat3( + cy, -sy * -sx, -sy * cx, + 0, cx, sx, + sy, cy * -sx, cy * cx + ); +} + +mat3 mouseRotation(bool enable, vec2 xy) { + if (enable) { + vec2 mouse = iMouse.xy / iResolution.xy; + + if (mouse.x != 0. && mouse.y != 0.) { + xy.x = mouse.x; + xy.y = mouse.y; + } + } + float rx, ry; + + rx = (xy.y + .5) * PI; + ry = (-xy.x) * 2. * PI; + + return sphericalMatrix(rx, ry); +} + +mat3 modelRotation() { + mat3 m = mouseRotation(MOUSE_CONTROL==1, MODEL_ROTATION); + return m; +} + +mat3 cameraRotation() { + mat3 m = mouseRotation(MOUSE_CONTROL==2, CAMERA_ROTATION); + return m; +} + + +// -------------------------------------------------------- +// Animation +// -------------------------------------------------------- + +const float SCENE_DURATION = 6.; +const float CROSSFADE_DURATION = 2.; + +float time; + +struct HexSpec { + float roundTop; + float roundCorner; + float height; + float thickness; + float gap; +}; + +HexSpec newHexSpec(float subdivisions) { + return HexSpec( + .05 / subdivisions, + .1 / subdivisions, + 2., + 2., + .005 + ); +} + +// Animation 1 + +float animSubdivisions1() { + return mix(2.4, 3.4, cos(time * PI) * .5 + .5); +} + +HexSpec animHex1(vec3 hexCenter, float subdivisions) { + HexSpec spec = newHexSpec(subdivisions); + + float offset = time * 3. * PI; + offset -= subdivisions; + float blend = dot(hexCenter, pca); + blend = cos(blend * 30. + offset) * .5 + .5; + spec.height = mix(1.75, 2., blend); + + spec.thickness = spec.height; + + return spec; +} + +// Animation 2 + +float animSubdivisions2() { + return mix(1., 2.3, sin(time * PI/2.) * .5 + .5); +} + +HexSpec animHex2(vec3 hexCenter, float subdivisions) { + HexSpec spec = newHexSpec(subdivisions); + + float blend = hexCenter.y; + spec.height = mix(1.6, 2., sin(blend * 10. + time * PI) * .5 + .5); + + spec.roundTop = .02 / subdivisions; + spec.roundCorner = .09 / subdivisions; + spec.thickness = spec.roundTop * 4.; + spec.gap = .01; + + return spec; +} + +// Animation 3 + +float animSubdivisions3() { + return 5.; +} + +HexSpec animHex3(vec3 hexCenter, float subdivisions) { + HexSpec spec = newHexSpec(subdivisions); + + float blend = acos(dot(hexCenter, pab)) * 10.; + blend = cos(blend + time * PI) * .5 + .5; + spec.gap = mix(.01, .4, blend) / subdivisions; + + spec.thickness = spec.roundTop * 2.; + + return spec; +} + +// Transition between animations + +float sineInOut(float t) { + return -0.5 * (cos(PI * t) - 1.0); +} + +float transitionValues(float a, float b, float c) { + #ifdef LOOP + #if LOOP == 1 + return a; + #endif + #if LOOP == 2 + return b; + #endif + #if LOOP == 3 + return c; + #endif + #endif + float t = time / SCENE_DURATION; + float scene = floor(mod(t, 3.)); + float blend = fract(t); + float delay = (SCENE_DURATION - CROSSFADE_DURATION) / SCENE_DURATION; + blend = max(blend - delay, 0.) / (1. - delay); + blend = sineInOut(blend); + float ab = mix(a, b, blend); + float bc = mix(b, c, blend); + float cd = mix(c, a, blend); + float result = mix(ab, bc, min(scene, 1.)); + result = mix(result, cd, max(scene - 1., 0.)); + return result; +} + +HexSpec transitionHexSpecs(HexSpec a, HexSpec b, HexSpec c) { + float roundTop = transitionValues(a.roundTop, b.roundTop, c.roundTop); + float roundCorner = transitionValues(a.roundCorner, b.roundCorner, c.roundCorner); + float height = transitionValues(a.height, b.height, c.height); + float thickness = transitionValues(a.thickness, b.thickness, c.thickness); + float gap = transitionValues(a.gap, b.gap, c.gap); + return HexSpec(roundTop, roundCorner, height, thickness, gap); +} + + +// -------------------------------------------------------- +// Modelling +// -------------------------------------------------------- + +const vec3 FACE_COLOR = vec3(.9,.9,1.); +const vec3 BACK_COLOR = vec3(.1,.1,.15); +const vec3 BACKGROUND_COLOR = vec3(.0, .005, .03); + +struct Model { + float dist; + vec3 albedo; + float glow; +}; + +Model hexModel( + vec3 p, + vec3 hexCenter, + vec3 edgeA, + vec3 edgeB, + HexSpec spec +) { + float d; + + float edgeADist = dot(p, edgeA) + spec.gap; + float edgeBDist = dot(p, edgeB) - spec.gap; + float edgeDist = smax(edgeADist, -edgeBDist, spec.roundCorner); + + float outerDist = length(p) - spec.height; + d = smax(edgeDist, outerDist, spec.roundTop); + + float innerDist = length(p) - spec.height + spec.thickness; + d = smax(d, -innerDist, spec.roundTop); + + vec3 color; + + float faceBlend = (spec.height - length(p)) / spec.thickness; + faceBlend = clamp(faceBlend, 0., 1.); + color = mix(FACE_COLOR, BACK_COLOR, step(.5, faceBlend)); + + vec3 edgeColor = spectrum(dot(hexCenter, pca) * 5. + length(p) + .8); + float edgeBlend = smoothstep(-.04, -.005, edgeDist); + color = mix(color, edgeColor, edgeBlend); + + return Model(d, color, edgeBlend); +} + +// checks to see which intersection is closer +Model opU( Model m1, Model m2 ){ + if (m1.dist < m2.dist) { + return m1; + } else { + return m2; + } +} + +Model geodesicModel(vec3 p) { + + pModIcosahedron(p); + + float subdivisions = transitionValues( + animSubdivisions1(), + animSubdivisions2(), + animSubdivisions3() + ); + TriPoints3D points = geodesicTriPoints(p, subdivisions); + + vec3 edgeAB = normalize(cross(points.center, points.ab)); + vec3 edgeBC = normalize(cross(points.center, points.bc)); + vec3 edgeCA = normalize(cross(points.center, points.ca)); + + Model model, part; + HexSpec spec; + + spec = transitionHexSpecs( + animHex1(points.b, subdivisions), + animHex2(points.b, subdivisions), + animHex3(points.b, subdivisions) + ); + part = hexModel(p, points.b, edgeAB, edgeBC, spec); + model = part; + + spec = transitionHexSpecs( + animHex1(points.c, subdivisions), + animHex2(points.c, subdivisions), + animHex3(points.c, subdivisions) + ); + part = hexModel(p, points.c, edgeBC, edgeCA, spec); + model = opU(model, part); + + spec = transitionHexSpecs( + animHex1(points.a, subdivisions), + animHex2(points.a, subdivisions), + animHex3(points.a, subdivisions) + ); + part = hexModel(p, points.a, edgeCA, edgeAB, spec); + model = opU(model, part); + + return model; +} + +Model map( vec3 p ){ + mat3 m = modelRotation(); + p *= m; + #ifndef LOOP + pR(p.xz, time * PI/16.); + #endif + Model model = geodesicModel(p); + return model; +} + +// -------------------------------------------------------- +// LIGHTING +// Adapted from IQ https://www.shadertoy.com/view/Xds3zN +// -------------------------------------------------------- + +vec3 doLighting(Model model, vec3 pos, vec3 nor, vec3 ref, vec3 rd) { + vec3 lightPos = normalize(vec3(.5,.5,-1.)); + vec3 backLightPos = normalize(vec3(-.5,-.3,1)); + vec3 ambientPos = vec3(0,1,0); + + vec3 lig = lightPos; + float amb = clamp((dot(nor, ambientPos) + 1.) / 2., 0., 1.); + float dif = clamp( dot( nor, lig ), 0.0, 1.0 ); + float bac = pow(clamp(dot(nor, backLightPos), 0., 1.), 1.5); + float fre = pow( clamp(1.0+dot(nor,rd),0.0,1.0), 2.0 ); + + vec3 lin = vec3(0.0); + lin += 1.20 * dif * vec3(.9); + lin += 0.80 * amb * vec3(.5, .7, .8); + lin += 0.30 * bac * vec3(.25); + lin += 0.20 * fre * vec3(1); + + vec3 albedo = model.albedo; + vec3 col = mix(albedo * lin, albedo, model.glow); + + return col; +} + + +// -------------------------------------------------------- +// Ray Marching +// Adapted from cabbibo https://www.shadertoy.com/view/Xl2XWt +// -------------------------------------------------------- + +const float MAX_TRACE_DISTANCE = 8.; // max trace distance +const float INTERSECTION_PRECISION = .001; // precision of the intersection +const int NUM_OF_TRACE_STEPS = 100; +const float FUDGE_FACTOR = .9; // Default is 1, reduce to fix overshoots + +struct CastRay { + vec3 origin; + vec3 direction; +}; + +struct Ray { + vec3 origin; + vec3 direction; + float len; +}; + +struct Hit { + Ray ray; + Model model; + vec3 pos; + bool isBackground; + vec3 normal; + vec3 color; +}; + +vec3 calcNormal( in vec3 pos ){ + vec3 eps = vec3( 0.001, 0.0, 0.0 ); + vec3 nor = vec3( + map(pos+eps.xyy).dist - map(pos-eps.xyy).dist, + map(pos+eps.yxy).dist - map(pos-eps.yxy).dist, + map(pos+eps.yyx).dist - map(pos-eps.yyx).dist ); + return normalize(nor); +} + +Hit raymarch(CastRay castRay){ + + float currentDist = INTERSECTION_PRECISION * 2.0; + Model model; + + Ray ray = Ray(castRay.origin, castRay.direction, 0.); + + for( int i=0; i< NUM_OF_TRACE_STEPS ; i++ ){ + if (currentDist < INTERSECTION_PRECISION || ray.len > MAX_TRACE_DISTANCE) { + break; + } + model = map(ray.origin + ray.direction * ray.len); + currentDist = model.dist; + ray.len += currentDist * FUDGE_FACTOR; + } + + bool isBackground = false; + vec3 pos = vec3(0); + vec3 normal = vec3(0); + vec3 color = vec3(0); + + if (ray.len > MAX_TRACE_DISTANCE) { + isBackground = true; + } else { + pos = ray.origin + ray.direction * ray.len; + normal = calcNormal(pos); + } + + return Hit(ray, model, pos, isBackground, normal, color); +} + + +// -------------------------------------------------------- +// Rendering +// -------------------------------------------------------- + +void shadeSurface(inout Hit hit){ + + vec3 color = BACKGROUND_COLOR; + + if (hit.isBackground) { + hit.color = color; + return; + } + + vec3 ref = reflect(hit.ray.direction, hit.normal); + + #ifdef DEBUG + color = hit.normal * 0.5 + 0.5; + #else + color = doLighting( + hit.model, + hit.pos, + hit.normal, + ref, + hit.ray.direction + ); + #endif + + hit.color = color; +} + +vec3 render(Hit hit){ + shadeSurface(hit); + return hit.color; +} + + +// -------------------------------------------------------- +// Camera +// https://www.shadertoy.com/view/Xl2XWt +// -------------------------------------------------------- + +mat3 calcLookAtMatrix( in vec3 ro, in vec3 ta, in float roll ) +{ + vec3 ww = normalize( ta - ro ); + vec3 uu = normalize( cross(ww,vec3(sin(roll),cos(roll),0.0) ) ); + vec3 vv = normalize( cross(uu,ww)); + return mat3( uu, vv, ww ); +} + +void doCamera(out vec3 camPos, out vec3 camTar, out float camRoll, in float time, in vec2 mouse) { + float dist = 5.5; + camRoll = 0.; + camTar = vec3(0,0,0); + camPos = vec3(0,0,-dist); + camPos *= cameraRotation(); + camPos += camTar; +} + + +// -------------------------------------------------------- +// Gamma +// https://www.shadertoy.com/view/Xds3zN +// -------------------------------------------------------- + +const float GAMMA = 2.2; + +vec3 gamma(vec3 color, float g) { + return pow(color, vec3(g)); +} + +vec3 linearToScreen(vec3 linearRGB) { + return gamma(linearRGB, 1.0 / GAMMA); +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + time = iTime; + + #ifdef LOOP + #if LOOP == 1 + time = mod(time, 2.); + #endif + #if LOOP == 2 + time = mod(time, 4.); + #endif + #if LOOP == 3 + time = mod(time, 2.); + #endif + #endif + + initIcosahedron(); + + vec2 p = (-iResolution.xy + 2.0*fragCoord.xy)/iResolution.y; + vec2 m = iMouse.xy / iResolution.xy; + + vec3 camPos = vec3( 0., 0., 2.); + vec3 camTar = vec3( 0. , 0. , 0. ); + float camRoll = 0.; + + // camera movement + doCamera(camPos, camTar, camRoll, iTime, m); + + // camera matrix + mat3 camMat = calcLookAtMatrix( camPos, camTar, camRoll ); // 0.0 is the camera roll + + // create view ray + vec3 rd = normalize( camMat * vec3(p.xy,2.0) ); // 2.0 is the lens length + + Hit hit = raymarch(CastRay(camPos, rd)); + + vec3 color = render(hit); + + #ifndef DEBUG + color = linearToScreen(color); + #endif + + fragColor = vec4(color,1.0); +} + diff --git a/src/bin/geoshade/glsl/ShaderToy/Geomechanical.glsl b/src/bin/geoshade/glsl/ShaderToy/Geomechanical.glsl new file mode 100644 index 00000000..24ceee5a --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/Geomechanical.glsl @@ -0,0 +1,712 @@ +// Author : Sebastien Berube +// Created : March 2015 +// Modified : Jan 2016 +// +// Composition made from a repeated hexagon prism pattern. +// Hexagon prism distance function had to be modified to smooth out vertical edges. +// +// Sources: +// Inigo Quilez +// http://iquilezles.org/www/articles/distfunctions/distfunctions.htm +// http://iquilezles.org/www/articles/raymarchingdf/raymarchingdf.htm +// For those interested in the origin of sphere tracing: +// Sphere Tracing: A Geometric Method for the Antialiased Ray Tracing of Implicit Surfaces (1994) +// http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.3825 +// Spline +// http://www.lighthouse3d.com/tutorials/maths/catmull-rom-spline/ +// +// License : Creative Commons Non-commercial (NC) license +// + +//---------------------- +// Constants +const float PI = 3.14159; +const float SCALE = 1.0; +const float MAX_DIST = 1000.0; +const float FLOOR_HEIGHT = 0.0; +const float X_REPEAT_DIST = 0.90*SCALE; +const float Z_REPEAT_DIST = 1.05*SCALE; +const float PRIM_HEIGHT = 1.0; +const float HEX_HALF_WIDTH = 0.26*SCALE; +const float GEOMETRY_DISPLACEMENT = 1.00; +float g_time; + +struct AnimationChannels +{ + float material_roughness; //[0-1 range] + float geometry_width; //[0-1 range] + float geometry_scale; //[0-1 range] + float geometry_displacement;//[0-1 range] + float geometry_smoothness; //[0-1 range] + vec3 camPos; //[IR range] + vec3 camLookAt; //[IR range] +}; +AnimationChannels g_animationChannels; + +//Material ID enum +const int MATERIALID_NONE = 0; +const int MATERIALID_FLOOR = 1; +const int MATERIALID_SKY = 2; +const int MATERIALID_PLASTIC = 3; +const int MATERIALID_METAL = 4; + +//Debug flag enum +const int DEBUG_RAYLEN = 0; +const int DEBUG_GEODIST = 1; +const int DEBUG_NORMAL = 2; +const int DEBUG_MATID = 3; + +float fDEBUG = 0.1; + +//Defines +#define saturate(x) clamp(x,0.0,1.0) +//---------------------- +// Camera +struct Cam { vec3 R; vec3 U; vec3 D; vec3 o; float lens; float zoom; }; //Right, Up, Direction, origin +Cam CAM_lookAt(vec3 target, float pitchAngleRad, float dist, float theta); +Cam CAM_mouseLookAt(vec3 at, float dst); +Cam CAM_animate(vec2 uv, float fTime); +vec3 CAM_getRay(Cam cam, vec2 uv); + +//---------------------- +// Post Process +vec3 POST_ProcessFX(vec3 c, vec2 uv); + +//---------------------- +// Analytic Intersections +float RAYINTERSEC_plane(vec3 o, vec3 d, vec3 po, vec3 pn) +{ + return dot(po-o,pn)/dot(d,pn); +} + +struct repeatInfo +{ + vec3 smpl; //object-space, cyclic + vec3 anchor; //world space +}; + +#define normalized_wave(a) (0.5*a+0.5) +repeatInfo DF_repeatHex(vec3 p) +{ + //Repetition + float xRepeatDist = X_REPEAT_DIST; + float zRepeatDist = Z_REPEAT_DIST*0.5; + float latticeX = (fract(p.x/xRepeatDist+0.5)-0.5)*xRepeatDist; + float latticeY = (fract(p.z/zRepeatDist+0.5)-0.5)*zRepeatDist; + vec2 anchorPosXZ = p.xz-vec2(latticeX,latticeY); + p.x = latticeX; //Cyclic coords. + p.z = latticeY; + + //Variation + float period = fract(g_time/30.)*3.0; + float theta = period*2.0*PI; + float overallAmplitude = normalized_wave(-cos(theta)); //Overall amplitude modulation + float waveAmplitude = g_animationChannels.geometry_displacement + *normalized_wave(sin(anchorPosXZ.x+anchorPosXZ.y+theta*4.0)); + float primHeight = FLOOR_HEIGHT+overallAmplitude*waveAmplitude; + + repeatInfo outData; + outData.anchor = vec3(anchorPosXZ[0], primHeight, anchorPosXZ[1]); + outData.smpl = p; + + return outData; +} + +#define zclamp(a) max(a,0.0) //Clamp negative values at zero +float DF_RoundedHex( vec3 p, float width, float height) +{ + //Modified version (smooth edges) of the exagon prism found here: + //http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm + float smoothRadius = g_animationChannels.geometry_smoothness*0.2; + width -= smoothRadius*2.0; + + //Hexagon prism constructed using X,Y,Z symmetry. + //Only quadrant 1 needs to be solved, but the joining diagonal to quadrant IV is also + //required for distance blending (see db). + p = abs(p); + + //Hexagonal edge distances : + //Note : [.8666,0.5] = [sin(PI/3,cos(PI/3)] -> Hexagon edges rotation coeff (60 degrees). + float da = (p.x*0.866025+p.z*0.5)-width; //quadrant I diagonal edge distance + float db = (p.x*0.866025-p.z*0.5)-width; //quadrant IV diagonal edge distance (needed for blending) + float dc = p.z-width; //upper distance + + vec3 d = zclamp(vec3(da,db,dc)); + //Note: this is not an euclidian length, therefore this operation slightly distorts our distance field. + //Yet, it is harmless to convergence, and does the smoothing job quite well. + float dw = length(d)-smoothRadius; //hexagonal part smoothness (blending at 60 deg) + float dh = p.y-height; + + //Now that we have xz distance(dw) and y distance (dh), we can compute the distance + //for the given isovalue (the smoothing radius). + //Note : internal distance (maxX,maxY,maxZ) is also used to genereate internal signed dist, + // helping convergence when overstepping (very frequent with domain repetition). + float externalDistance = length(zclamp(vec2(dh,dw)))-smoothRadius; //Smoothed, unsigned + float internalDistance = max(max(da,dc),dh); //Sharp, signed. + return min(externalDistance,internalDistance); +} + +struct DF_out +{ + float d; + int matID; + vec3 objectPos; +}; + +//The distance field composition. +//::DF_composition +DF_out DF_composition( in vec3 pos ) +{ + //Explanation: + //http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm + DF_out oFloor; + DF_out oHexA; + DF_out oHexB; + + oHexA.matID = MATERIALID_PLASTIC; + repeatInfo infoA = DF_repeatHex(pos-vec3(0)); + oHexA.objectPos = infoA.anchor; + oHexA.d = DF_RoundedHex( infoA.smpl-vec3(0,infoA.anchor.y,0), + g_animationChannels.geometry_width*HEX_HALF_WIDTH, PRIM_HEIGHT ); + + oHexB.matID = MATERIALID_PLASTIC; + repeatInfo infoB = DF_repeatHex(pos-vec3(X_REPEAT_DIST*0.5,0, Z_REPEAT_DIST*0.25)); + oHexB.objectPos = infoB.anchor; + oHexB.d = DF_RoundedHex( infoB.smpl-vec3(0,infoB.anchor.y,0), + g_animationChannels.geometry_width*HEX_HALF_WIDTH, PRIM_HEIGHT ); + + if(oHexA.d + vec3 F0 = abs ((1.0 - n) / (1.0 + n)); + return F0 + (1.-F0) * pow( 1. - VdotH, 5.); + // +} + +vec3 PBR_ABL_Equation(vec3 V, vec3 L, vec3 N, float roughness, float metallic, vec3 ior_n, vec3 ior_k) +{ + roughness = max(roughness,0.01); + + vec3 H = normalize(L+V); + float NdotH = dot(N,H);//Nn.H; + float NdotL = dot(N,L);//Nn.Ln; + float VdotH = dot(V,H);//Vn.H; + float NdotV = dot(N,V);//Nn.Vn; + + //Distribution term + //This D value is an approximation of the probability for a given light to bounce into the viewing vector direction. + //It is not necessarily 100% mathematically/physically correct : this is still just a function which has a curve that decently + //matches the physical distribution. + // + float PI = 3.14159; + float alpha2 = roughness * roughness; + float NoH2 = NdotH * NdotH; + float den = NoH2*(alpha2-1.0)+1.0; + float D = (NdotH>0.)?alpha2/(PI*den*den):0.0; + // + + //Fresnel term + vec3 F = PBR_Fresnel_Schlick_Dielectric(ior_n, VdotH); + + //Geometric term + // + float Gk = (roughness+1.)*(roughness+1.)/8.; //<-Disney's modification for ABL + float Gl = max(NdotL,0.)/(NdotL*(1.0-Gk)+Gk); + float Gv = max(NdotV,0.)/(NdotV*(1.0-Gk)+Gk); + float G = Gl*Gv; + // + + //The PBR equation seen pretty much everywhere: + // + // + float softTr = 0.2; // Valid range : [0.001-0.25]. Will reduce reflexivity on edges if too high. + //Personal addition : This parameter softens up the transition at grazing angles (otherwise too sharp IMHO). + vec3 Rs = D*F*G / (4.*NdotV*NdotL*(1.0-softTr)+softTr); + // + + return Rs; +} + +#define saturate(x) clamp(x,0.0,1.0) +vec3 MAT_Plastic(TraceData traceData, vec3 cDiff, vec3 N, vec3 V, vec3 L0, vec3 L1, float dfao, float dfss0, float dfss1) +{ + vec3 col = vec3(0); + + float fRoughness = g_animationChannels.material_roughness; + + //Ambient directional contribution (3x): + // color*directionalContribution() + //This give a basic "ambient" shading, which varies with normal angle + vec3 cAmb = vec3(0.26,0.24,0.23)*vec3(0.5+0.5*dot(traceData.normal,vec3(+0.08,1,+0.1))) + + vec3(0.25,0.25,0.30)*vec3(0.5+0.5*dot(traceData.normal,vec3(-0.28,1,-0.17))) + + vec3(0.19,0.25,0.30)*vec3(0.5+0.5*dot(traceData.normal,vec3(+0.28,1,-0.27))); + //2 x PBR lights + vec3 CL0 = PBR_HDRremap(vec3(1))*PBR_ABL_Equation(V,L0,traceData.normal, fRoughness, 0., vec3(F_DIELECTRIC_PLASTIC), vec3(0)); + vec3 CL1 = PBR_HDRremap(vec3(1))*PBR_ABL_Equation(V,L1,traceData.normal, fRoughness, 0., vec3(F_DIELECTRIC_PLASTIC), vec3(0)); + + col = cAmb*dfao; + col *= saturate(0.30+fRoughness*0.5+0.2*(dfss0+dfss1)); + col += (dfss0+fRoughness*0.25)*CL0; + col += (dfss1+fRoughness*0.25)*CL1; + + return col*0.75; +} + +float SAMPLER_trilinear(vec3 p) +{ + //Noise layering trick from Inigo Quilez. + //See this for more explanation: https://www.shadertoy.com/view/Ms3SRr + const float TEXTURE_RES = 256.0; //Noise texture resolution + p *= TEXTURE_RES; //Computation in pixel space (1 unit = 1 pixel) + vec3 pixCoord = floor(p);//Pixel coord, integer [0,1,2,3...256...] + vec3 t = p-pixCoord; //Pixel interpolation position, linear range [0-1] (fractional part) + t = (3.0 - 2.0 * t) * t * t; //interpolant easing function : linear->cubic + vec2 layer_translation = -pixCoord.y*vec2(37.0,17.0)/TEXTURE_RES; //noise volume stacking trick : g layer = r layer shifted by (37x17 pixels -> this is no keypad smashing, but the actual translation embedded in the noise texture). +// vec2 layer1_layer2 = texture(iChannel0,layer_translation+(pixCoord.xz+t.xz+0.5)/TEXTURE_RES,-100.0).xy; //Note : +0.5 to fall right on pixel center + vec2 layer1_layer2 = vec2(0.0, 0.0); + return mix( layer1_layer2.x, layer1_layer2.y, t.y ); //Layer interpolation (trilinear/volumetric) +} + +float MAT_remap_angle_probability(float x_01) +{ + //cos(jitter) is used to alter probabilty distribution : + //it remaps an evenly distributed function into another + //one where closer angles are more probable, and wider + //angles are less probable. + return (1.0-cos(x_01*PI/2.0)); +} + +vec3 MAT_addFog(float travelDist, in vec3 color, in vec3 p, in vec3 c_atmosphere) +{ + float a = 0.08; + float NORMALIZATION_TERM = log((1.+a)/a); + float da = travelDist/50.0; + da = log((da+a)/a)/NORMALIZATION_TERM; + vec3 FinalColor = mix(color,c_atmosphere,saturate(da)); + return FinalColor; +} + +//::MAT_apply +vec4 MAT_apply(vec3 pos, TraceData traceData) +{ + vec3 c_atmosphere = mix(vec3(0.87,0.94,1.0),vec3(0.6,0.80,1.0),clamp(3.0*pos.y/length(pos.xz),0.,1.)); + + if(traceData.matID==MATERIALID_SKY) + { + return vec4(c_atmosphere,1.0); + } + + vec4 col = vec4(0); + vec3 N = traceData.normal; + vec3 V = normalize(-traceData.rayDir); + vec3 L0 = normalize(vec3(0.5,1.2,0.3)); + vec3 L1 = normalize(vec3(-L0.x,L0.y,-L0.z+0.5)); + + // + float fNoiseAmplitude = 0.4; + float jitter_01 = SAMPLER_trilinear(pos*10.0+g_time*50.0); + float t = MAT_remap_angle_probability(jitter_01)*fNoiseAmplitude; + vec3 Na = vec3(N.xz*mat2(cos(t),sin(t),-sin(t),cos(t)),N.y).xzy; //Rotate(t) + jitter_01 = SAMPLER_trilinear(5.0+pos*9.11); + t = MAT_remap_angle_probability(jitter_01)*fNoiseAmplitude; + vec3 Nb = vec3(N.xz*mat2(cos(t),-sin(t),sin(t),cos(t)),N.y).xzy; //Rotate(-t) + float dfaoA = RAYMARCH_DFAO( pos, Na, 0.02); + float dfaoB = RAYMARCH_DFAO( pos, Nb, 0.02); + float dfaoAveraged = 0.5*(dfaoA+dfaoB); + // + + float dfss0 = RAYMARCH_DFSS( pos+L0*0.01, L0, 0.2); + float dfss1 = RAYMARCH_DFSS( pos+L1*0.01, L1, 0.2); + + if(traceData.matID==MATERIALID_PLASTIC) + { + col.rgb = MAT_Plastic(traceData, vec3(1), N, V, L0, L1, dfaoAveraged, dfss0, dfss1); + } + + col.rgb = MAT_addFog(traceData.rayLen*0.3, col.rgb, pos, c_atmosphere); + + return col; +} + +float TRACE_zprime(vec3 o, vec3 d) +{ + float geometryCeiling = FLOOR_HEIGHT+PRIM_HEIGHT + +g_animationChannels.geometry_displacement*GEOMETRY_DISPLACEMENT; + float t = RAYINTERSEC_plane(o, d, vec3(0,geometryCeiling,0), vec3(0,1,0)); + return (t<0.0)?MAX_DIST:t; + return t; +} + +//o=ray origin, d=ray direction +//::TRACE_geometry +TraceData TRACE_geometry(vec3 o, vec3 d) +{ + //Raymarching (the expensive function) + TraceData dfTrace; + float rayLen = RAYMARCH_isosurface(o,d,0.0); + vec3 dfHitPosition = o+rayLen*d; + + //Additional sample, to gather material ID and other info + //(we want that stuff coompiled out of the raymarching loop, it clutters the code and might slow things down) + DF_out compInfo = DF_composition( dfHitPosition ); + rayLen += compInfo.d; + dfHitPosition = o+rayLen*d; + + dfTrace.rayLen = rayLen; + dfTrace.matID = compInfo.matID; + dfTrace.objectPos = compInfo.objectPos; + dfTrace.geoDist = compInfo.d; + dfTrace.rayDir = d; + dfTrace.normal = normalize(DF_gradient(dfHitPosition)); + + return dfTrace; +} + +vec3 TRACE_debug(TraceData traceData, int elemID) +{ + if(elemID==DEBUG_RAYLEN) return vec3(log(traceData.rayLen)*0.2); + if(elemID==DEBUG_GEODIST) return vec3(traceData.geoDist); + if(elemID==DEBUG_NORMAL) return traceData.normal; + if(elemID==DEBUG_MATID) return traceData.matID==MATERIALID_PLASTIC?vec3(1): + vec3(traceData.matID==MATERIALID_FLOOR?1:0, + traceData.matID==MATERIALID_METAL?1:0, + traceData.matID==MATERIALID_SKY?1:0); + return vec3(0); +} + +const int SPLINE_POINT_COUNT = 8; +struct SPLINE_CtrlPts +{ + vec4 p[SPLINE_POINT_COUNT]; +}; +vec4 SPLINE_PointArray(int i, SPLINE_CtrlPts ctrlPts) +{ + //Just a way to get around the fact global arrays do not support random index access. + //(only texture/resources) + if(i==0 || i==SPLINE_POINT_COUNT ) return ctrlPts.p[0]; + if(i==1 || i==SPLINE_POINT_COUNT+1) return ctrlPts.p[1]; + if(i==2 || i==SPLINE_POINT_COUNT+2) return ctrlPts.p[2]; + if(i==3) return ctrlPts.p[3]; + if(i==4) return ctrlPts.p[4]; + if(i==5) return ctrlPts.p[5]; + if(i==6) return ctrlPts.p[6]; + if(i==7) return ctrlPts.p[7]; + return vec4(0); +} + +vec4 SPLINE_catmullRom(float fTime, SPLINE_CtrlPts ctrlPts) +{ + float t = fract(fTime); + const float n = float(SPLINE_POINT_COUNT); + + int idxOffset = int(t*n); + vec4 p1 = SPLINE_PointArray(idxOffset,ctrlPts); + vec4 p2 = SPLINE_PointArray(idxOffset+1,ctrlPts); + vec4 p3 = SPLINE_PointArray(idxOffset+2,ctrlPts); + vec4 p4 = SPLINE_PointArray(idxOffset+3,ctrlPts); + + //For some reason, fract(t) returns garbage on my machine with small values of t. + //return fract(n*t); + //Using this below yields the same results, minus the glitches. + t *= n; + t = (t-float(int(t))); + + //A classic catmull-rom + //e.g. + //http://steve.hollasch.net/cgindex/curves/catmull-rom.html + //http://www.lighthouse3d.com/tutorials/maths/catmull-rom-spline/ + vec4 val = 0.5 * ((-p1 + 3.*p2 -3.*p3 + p4)*t*t*t + + (2.*p1 -5.*p2 + 4.*p3 - p4)*t*t + + (-p1+p3)*t + + 2.*p2); + return val; +} + +void ANIM_main(float fTime) +{ + float t1 = 0.010*fTime; + float t2 = 0.010*fTime+0.03; + + SPLINE_CtrlPts cameraPosKeyFrames; //100 sec cycle. + // DATA: PosX,PosY,PosZ,Tilt + cameraPosKeyFrames.p[1] = vec4(10.0,2.70,05.0,1.90); //t=00.0s + cameraPosKeyFrames.p[2] = vec4(16.0,3.30,08.5,1.00); //t=12.5s + cameraPosKeyFrames.p[3] = vec4(20.0,6.80,05.0,2.97); //t=25.0s + cameraPosKeyFrames.p[4] = vec4(40.0,3.40,17.5,0.82); //t=37.5s + cameraPosKeyFrames.p[5] = vec4(30.0,3.10,27.5,1.97); //t=50.0s + cameraPosKeyFrames.p[6] = vec4(25.0,3.20,22.5,1.93); //t=62.5s + cameraPosKeyFrames.p[7] = vec4(15.0,3.00,24.5,1.95); //t=75.0s + cameraPosKeyFrames.p[0] = vec4(05.0,2.80,12.5,1.20); //t=87.5s + vec4 cameraPos = SPLINE_catmullRom(t1,cameraPosKeyFrames); + vec4 cameraDir = normalize(SPLINE_catmullRom(t2,cameraPosKeyFrames)-cameraPos); + + SPLINE_CtrlPts geometryKeyFrames; //25 sec cycle. + // DATA: round,width,roughness,displacement + geometryKeyFrames.p[1] = vec4(0.070,1.000,0.30,1.000); //t=00.0s + geometryKeyFrames.p[2] = vec4(0.090,0.900,0.50,0.900); //t=01.25s + geometryKeyFrames.p[3] = vec4(0.080,1.000,0.20,1.000); //t=02.50s + geometryKeyFrames.p[4] = vec4(0.150,0.970,0.50,0.990); //t=03.75s + geometryKeyFrames.p[5] = vec4(0.090,0.820,0.50,0.820); //t=05.00s + geometryKeyFrames.p[6] = vec4(0.110,0.970,0.50,0.990); //t=06.25s + geometryKeyFrames.p[7] = vec4(0.050,0.930,0.50,0.930); //t=07.50s + geometryKeyFrames.p[0] = vec4(0.120,0.950,0.50,0.980); //t=08.75s + vec4 geoPose = SPLINE_catmullRom(t1*25.0,geometryKeyFrames); + + g_animationChannels.camPos = cameraPos.xyz; + g_animationChannels.camLookAt = cameraPos.xyz+cameraDir.xyz-vec3(0,cameraPos.w,0); + g_animationChannels.geometry_smoothness = geoPose[0]; + g_animationChannels.material_roughness = 0.45; + g_animationChannels.geometry_width = geoPose[1]; + g_animationChannels.geometry_displacement = GEOMETRY_DISPLACEMENT; +} + +vec3 TRACE_main( vec3 o, vec3 dir, vec2 uv) +{ + float fRemainingAlpha = 1.0; + float zStart = TRACE_zprime(o, dir); + vec3 pt = o+dir*zStart; + vec3 ptGeo = vec3(0); + + TraceData geometryTraceData; + if(zStart< MAX_DIST) + { + geometryTraceData = TRACE_geometry(pt, dir); + geometryTraceData.rayLen += zStart; + ptGeo = o+dir*geometryTraceData.rayLen; + } + else + { + geometryTraceData.rayLen = MAX_DIST; + geometryTraceData.matID = MATERIALID_SKY; + geometryTraceData.objectPos = pt; + geometryTraceData.geoDist = 0.0; + geometryTraceData.rayDir = dir; + ptGeo = pt; + } + + //return TRACE_debug(geometryTraceData, DEBUG_RAYLEN); //OK + //return TRACE_debug(geometryTraceData, DEBUG_GEODIST); //OK + //return TRACE_debug(geometryTraceData, DEBUG_NORMAL); //OK + //return TRACE_debug(geometryTraceData, DEBUG_MATID); //OK + + vec4 cFinal = MAT_apply(ptGeo,geometryTraceData); + + return cFinal.rgb; +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + g_time = iTime+2.6; //Time offset for better preview + vec2 uv = (fragCoord.xy-0.5*iResolution.xy) / iResolution.xx; + + float fTime = g_time+2.1; + ANIM_main(fTime); + + Cam cam = CAM_animate(uv,fTime); + vec3 d = CAM_getRay(cam,uv); + vec3 c = TRACE_main(cam.o, d, uv); + + //No supersampling required for most PostProcessFX. + c = POST_ProcessFX(c,uv); + + fragColor = vec4(c,1.0); +} + +vec3 POST_ProcessFX(vec3 c, vec2 uv) +{ + //Vignetting + float lensRadius = 0.65; + uv /= lensRadius; + float sin2 = uv.x*uv.x+uv.y*uv.y; + float cos2 = 1.0-min(sin2*sin2,1.0); + float cos4 = cos2*cos2; + c *= cos4; + + //Gamma + c = pow(c,vec3(0.4545)); + return c; +} + +//---------------------- +// Camera +//::CAM +Cam CAM_animate(vec2 uv, float fTime) +{ + Cam cam; + cam.o = g_animationChannels.camPos; + cam.D = normalize(g_animationChannels.camLookAt-cam.o); + cam.R = normalize(cross(cam.D,vec3(0,1,0))); + cam.U = normalize(cross(cam.R,cam.D)); + cam.lens = 1.2+0.3*sin(fTime*0.1); + cam.zoom = 3.0+sin(fTime*0.1)/cam.lens; + return cam; +} + +vec3 CAM_getRay(Cam cam,vec2 uv) +{ + uv = cam.lens*uv/(cam.lens-length(uv)*length(uv)); + uv *= cam.zoom; + return normalize(uv.x*cam.R+uv.y*cam.U+cam.D); +} + diff --git a/src/bin/geoshade/glsl/ShaderToy/HexFlow.glsl b/src/bin/geoshade/glsl/ShaderToy/HexFlow.glsl new file mode 100644 index 00000000..593113a1 --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/HexFlow.glsl @@ -0,0 +1,459 @@ +/* + + Hexagonal Maze Flow + ------------------- + + I've been playing around with hexagonal grids lately. It's possible to make all kinds of + interesting things with them. I'll eventually tire of hexagons and get back to what I'm + supposed to be doing, but for now, here's a maze with a flowing polkadot snake-like + pattern running through it... I'm not really sure what it is either. :) + + It has an impossible geometry feel to it, and is rendered in an oldschool kind of game + style. It was pretty easy to produce: Obtain some hexagonal grid cell coordinates and + corresponding ID, render some lines, shapes, and a few arcs for the Truchet component, + apply some shading, etc. + + It was more of an exercise in applying layers in the right order than anything else. One + of the things that might be of interest is the flowing Truchet pattern. Producing a + flowing hexagonal Truchet isn't much different to producing a square one. In fact, it's + easier - in the sense that you don't have to reverse directions from cell to cell. + + However, one of the downsides is that it's not immediately obvious how to apply UV + coordinates - I think BigWings mentioned this, and I concur. :) I got around the problem + by ensuring that the texture pattern had the appropriate symmetry and applying hybrid + polar coordinates. By that, I mean, I wrapped the polar angles across the arc boundaries + and used that for one coordinate, then used the Truchet distance field itself for the + other... + + Roughly speaking, it's not much different to a circle: In that situation, you use the + familiar polar coordinates (r = length(u), a = atan(u.y, u.x)). The only difference in + this case is that you use a modified radial coordinate (r = min(min(r1, r2), r3)) - or + to put it another way, you use the distance field value... It's a bit difficult to + explain, but easy to perform. When I get time, I'm going to produce a more robust Truchet + texturing example. + + + Related references: + + // You can't do a hexagonal grid example without referencing this. :) Very stylish. + Hexagons - distance - iq + https://www.shadertoy.com/view/Xd2GR3 + + + // Simpler hexagonal grid example that attempts to explain the grid setup used to produce + // the pattern here. + // + Minimal Hexagonal Grid - Shane + https://www.shadertoy.com/view/Xljczw + +*/ + +// Interlaced variation - Interesting, but patched together in a hurry. +#define INTERLACING + +// A quick hack to get rid of the winding overlay - in order to show the maze only. +//#define MAZE_ONLY + + + +// Helper vector. If you're doing anything that involves regular triangles or hexagons, the +// 30-60-90 triangle will be involved in some way, which has sides of 1, sqrt(3) and 2. +const vec2 s = vec2(1, 1.7320508); + +// Standard vec2 to float hash - Based on IQ's original. +float hash21(vec2 p){ return fract(sin(dot(p, vec2(141.173, 289.927)))*43758.5453); } + + +// Standard 2D rotation formula. +mat2 r2(in float a){ float c = cos(a), s = sin(a); return mat2(c, -s, s, c); } + + +// The 2D hexagonal isosuface function: If you were to render a horizontal line and one that +// slopes at 60 degrees, mirror, then combine them, you'd arrive at the following. +float hex(in vec2 p){ + + p = abs(p); + + // Below is equivalent to: + //return max(p.x*.5 + p.y*.866025, p.x); + + return max(dot(p, s*.5), p.x); // Hexagon. + +} + +// This function returns the hexagonal grid coordinate for the grid cell, and the corresponding +// hexagon cell ID - in the form of the central hexagonal point. That's basically all you need to +// produce a hexagonal grid. +// +// When working with 2D, I guess it's not that important to streamline this particular function. +// However, if you need to raymarch a hexagonal grid, the number of operations tend to matter. +// This one has minimal setup, one "floor" call, a couple of "dot" calls, a ternary operator, etc. +// To use it to raymarch, you'd have to double up on everything - in order to deal with +// overlapping fields from neighboring cells, so the fewer operations the better. +vec4 getHex(vec2 p){ + + // The hexagon centers: Two sets of repeat hexagons are required to fill in the space, and + // the two sets are stored in a "vec4" in order to group some calculations together. The hexagon + // center we'll eventually use will depend upon which is closest to the current point. Since + // the central hexagon point is unique, it doubles as the unique hexagon ID. + vec4 hC = floor(vec4(p, p - vec2(.5, 1))/s.xyxy) + .5; + + // Centering the coordinates with the hexagon centers above. + vec4 h = vec4(p - hC.xy*s, p - (hC.zw + .5)*s); + + // Nearest hexagon center (with respect to p) to the current point. In other words, when + // "h.xy" is zero, we're at the center. We're also returning the corresponding hexagon ID - + // in the form of the hexagonal central point. Note that a random constant has been added to + // "hC.zw" to further distinguish it from "hC.xy." + // + // On a side note, I sometimes compare hex distances, but I noticed that Iomateron compared + // the Euclidian version, which seems neater, so I've adopted that. + return dot(h.xy, h.xy).5) p.y = -p.y; + + + + // Determining the closest of the three arcs to the current point, the keeping a copy + // of the vector used to produce it. That way, you'll know just to render that particular + // decorated arc, lines, etc - instead of all three. + const float r = 1.; + const float th = .2; // Arc thickness. + + // Arc one. + q = p - vec2(0, r)/s; + vec3 da = vec3(q, dfPol(q)); + + // Arc two. "r2" could be hardcoded, but this is a relatively cheap 2D example. + q = r2(3.14159*2./3.)*p - vec2(0, r)/s; + vec3 db = vec3(q, dfPol(q)); + + // Arc three. + q = r2(3.14159*4./3.)*p - vec2(0, r)/s; + vec3 dc = vec3(q, dfPol(q)); + + // Compare distance fields, and return the vector used to produce the closest one. + vec3 q3 = da.z.5 && lRnd.x<.5) hLines2 *= smoothstep(0., .02, ln); + if(lRnd.x>.5) hLines2 *= dMask; + #else + if(rnd>.5) hLines2 *= smoothstep(0., .02, ln); + hLines2 *= dMask; + #endif + bg = mix(bg, vec3(0), hLines2*tr); + + float eDist3 = hex(h3.xy); + float hLines3 = smoothstep(0., .02, eDist3 - .5 + .02); + #ifdef INTERLACING + if(rnd<=.5 && lRnd.x>.5) hLines3 *= smoothstep(0., .02, ln); + if(lRnd.x>.5) hLines3 *= dMask; + #else + if(rnd<=.5) hLines3 *= smoothstep(0., .02, ln); + hLines3 *= dMask; + #endif + bg = mix(bg, vec3(0), hLines3*tr); + + + // Using the two off-centered hex coordinates to give the background a bit of highlighting. + float shade = max(1.25 - dot(h2.xy, h2.xy)*2., 0.); + shade = min(shade, max(dot(h3.xy, h3.xy)*3. + .25, 0.)); + bg = mix(bg, vec3(0), (1.-shade)*.5); + + // I wanted to change the colors of everything at the last minute. It's pretty hacky, so + // when I'm feeling less lazy, I'll tidy it up. :) + vec3 dotCol = bg.zyx*vec3(1.5, .4, .4); + vec3 bCol = mix(bg.zyx, bg.yyy, .25); + bg = mix(bg.yyy, bg.zyx, .25); + + + // Under the random threshold, and we draw the lines under the Truchet pattern. + #ifdef INTERLACING + if(lRnd.x>.5){ + bg = mix(bg, vec3(0), (1. - smoothstep(0., .015, lnBord))); + bg = mix(bg, bCol, (1. - smoothstep(0., .015, ln))); + // Center lines. + bg = mix(bg, vec3(0), smoothstep(0., .02, eDist3 - .5 + .02)*tr); + } + #else + bg = mix(bg, vec3(0), (1. - smoothstep(0., .015, lnBord))); + bg = mix(bg, bCol, (1. - smoothstep(0., .015, ln))); + #endif + + + + // Apply the Truchet shadow to the background. + bg = mix(bg, vec3(0), (1. - smoothstep(0., .07, d))*.5); + + + // Place the Truchet field to the background, with some additional shading to give it a + // slightly rounded, raised feel. + vec3 col = mix(bg, vec3(1)*max(-d*3. + .7, 0.), (1. - dMask)*.65); + + + // Apply the moving dot pattern to the Truchet. + //dotCol = mix(dotCol, dotCol.xzy, dot(sin(u*3.14159*2. - cos(u.yx*3.14159*2.)*3.14159), vec2(.25)) + .5); + col = mix(col, vec3(0), (1. - dMask)*(1. - smoothstep(0., .02, d2))); + col = mix(col, dotCol, (1. - dMask)*(1. - smoothstep(0., .02, d2 + .125))); + + // Truchet border. + col = mix(col, vec3(0), 1. - smoothstep(0., .015, dBord)); + + #ifdef INTERLACING + // Over the random threshold, and we draw the lines over the Truchet. + if(lRnd.x<=.5){ + col = mix(col, vec3(0), (1. - smoothstep(0., .015, lnBord))); + col = mix(col, bCol, (1. - smoothstep(0., .015, ln))); + // Center lines. + col = mix(col, vec3(0), smoothstep(0., .02, eDist2 - .5 + .02)*tr); + } + #endif + + + + + // Using the offset hex values for a bit of fake 3D highlighting. + //if(rnd>.5) h3.y = -h3.y; // All raised edges. Spoils the mild 3D illusion. + #ifdef INTERLACING + float trSn = max(dMask, 1. - smoothstep(0., .015, lnBord))*.75 + .25; + #else + float trSn = dMask*.75 + .25; + #endif + col = mix(col, vec3(0), trSn*(1. - hex(s/2.+h2.xy))); + col = mix(col, vec3(0), trSn*(1. - hex(s/2.-h3.xy))); + + + // Using the edge distance to produce some repeat contour lines. Standard stuff. + //if (rnd>.5) h.xy = -h.yx; + //float cont = clamp(cos(hex(h.xy)*6.283*12.)*1.5 + 1.25, 0., 1.); + //col = mix(col, vec3(0), (1. - smoothstep(0., .015, ln))*(smoothstep(0., .015, d))*(1.-cont)*.5); + + + // Very basic hatch line effect. + float gr = dot(col, vec3(.299, .587, .114)); + float hatch = (gr<.45)? clamp(sin((sc.x - sc.y)*3.14159*40.)*2. + 1.5, 0., 1.) : 1.; + float hatch2 = (gr<.25)? clamp(sin((sc.x + sc.y)*3.14159*40.)*2. + 1.5, 0., 1.) : 1.; + + col *= min(hatch, hatch2)*.5 + .5; + col *= clamp(sin((sc.x - sc.y)*3.14159*80.)*1.5 + .75, 0., 1.)*.25 + 1.; + + + // Subtle vignette. + u = fragCoord/iResolution.xy; + col *= pow(16.*u.x*u.y*(1. - u.x)*(1. - u.y) , .125) + .25; + // Colored varation. + //col = mix(pow(min(vec3(1.5, 1, 1)*col, 1.), vec3(1, 3, 16)), col, + //pow(16.*u.x*u.y*(1. - u.x)*(1. - u.y) , .25)*.75 + .25); + + + + // Rough gamma correction. + fragColor = vec4(sqrt(max(col, 0.)), 1); + +} + + + diff --git a/src/bin/geoshade/glsl/ShaderToy/JellyTubes.glsl b/src/bin/geoshade/glsl/ShaderToy/JellyTubes.glsl new file mode 100644 index 00000000..06b6b902 --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/JellyTubes.glsl @@ -0,0 +1,127 @@ +#define AA 2 // Square root of the number of anti-aliasing samples to make. + +vec2 intersectSphere(vec3 ro, vec3 rd, vec3 org, float rad) +{ + float a = dot(rd, rd); + float b = 2. * dot(rd, ro - org); + float c = dot(ro - org, ro - org) - rad * rad; + float desc = b * b - 4. * a * c; + if (desc < 0.) + return vec2(1, 0); + + return vec2((-b - sqrt(desc)) / (2. * a), (-b + sqrt(desc)) / (2. * a)); +} + +vec2 intersectCylinder(vec2 ro, vec2 rd, vec2 org, float rad) +{ + return intersectSphere(vec3(ro, 0), vec3(rd, 0), vec3(org, 0), rad); +} + +vec3 nn = vec3(0); +float u = 0.; + +vec3 tr2(vec3 o, vec3 r, vec2 t) +{ + o += r * (1e-4 + .5 - o.y) / r.y; + for(int i = 0; i < 38; ++i) + { + vec3 c = vec3(floor(o.x), 0, floor(o.z)); + + vec3 ofs = vec3(cos(c.z) * .1, 0, cos(c.x) * .1); + + float rad = .3+cos(c.x) * .1; + ofs.x = cos(t.y * 8. + c.z * 2.5) * rad / 4.; + + float h = -(cos(c.x + 3. + c.z * 65.) * .5 + .5) * 11.8; + + u = h; + + float ht = (h - o.y) / r.y; + float ft = (-2.2 - o.y) / r.y; + + vec2 cyl = intersectCylinder(o.xz, r.xz, (c + ofs).xz + .5, rad); + vec2 sph = intersectSphere(o, r, (c + ofs) + .5 + vec3(0, -.5 + h, 0), rad); + + cyl.x = max(cyl.x, ht); + + if(sph.x < cyl.x && sph.y > 0. && sph.x < sph.y) + { + nn = normalize(o + r * sph.x - ((c + ofs) + .5 + vec3(0, -.5 + h, 0))); + return o + r * sph.x; + } + + if((cyl.x < sph.y || sph.x >= sph.y) && cyl.y > 0. && cyl.x < cyl.y) + { + nn.xz = o.xz + r.xz * cyl.x - ((c + ofs).xz + .5); + nn.y = 0.; + nn = normalize(nn); + return o + r * cyl.x; + } + + c.xz = ((c.xz + max(sign(r.xz), 0.)) - o.xz) / r.xz; + float t = (dot(c.xz, step(c.xz, c.zx)) + 1e-4); + // if(ft 1.0) ms = (2.*iMouse.xy - iResolution.xy)/iResolution.xy; + a = sin(vec2(1.5707963, 0) - ms.x); + rM = mat2(a, -a.y, a.x); + rd.xz = rd.xz*rM; + a = sin(vec2(1.5707963, 0) - ms.y); + rM = mat2(a, -a.y, a.x); + rd.yz = rd.yz*rM; + + + + // Raymarching. + const float FAR = 50.0; + float t = 0.0, h; + for(int i = 0; i < 96; i++){ + + h = map(ro+rd*t); + // Note the "t*b + a" addition. Basically, we're putting less emphasis on accuracy, as + // "t" increases. It's a cheap trick that works in most situations... Not all, though. + if(abs(h)<0.001*(t*.75 + .25) || t>FAR) break;//*(t*.5 + 1.) + t += h*.75; + //t += step(.5, t)*h*.25 + h*.5; + + } + + // Initialize the scene color. + vec3 col = vec3(0); + + // Scene hit, so color the pixel. + if(t1.5){ + + // Grey out the limestone wall color. + col = vec3(1)*dot(col*.7+.2, vec3(.299, .587, .114)); + // Add some fake reflection. Not reliable, but it's subtle. + rCol = tex3D(iChannel0, (pOffs + reflect(rd, nor))*ts, nor); + col += rCol*.25 + spot*.25; + spe2 = spe*spe*.25; // Ramp up the global specular a bit. + + } + + // If just the screen has been hit, apply some extra properties, then draw the screen image. + // I could just write "saveObjID == 3.," but I get a little paranoid where floats are concerned. :) + if(saveObjID>2.5){ + + // For the screen image, we're interested in the offset height and depth positions. Ie: pOffs.zy. + + // Pixelized dot pattern shade. + float c = dotPattern(pOffs.zy*36.+.5); + + // Applying some color to the shade. + col = vec3(min(c*1.5, 1.), pow(c, 2.5), pow(c, 12.)); + // Mixing the colors around a little. Made up. + col = mix(col.zyx, col, sin(dot(pos, vec3(.333))*3.14159*6.)*.34+.66); + + // Individual screen ID or sorts. + float id = hash(dot(floor(pOffs + vec3(.0, .5, .5)), vec3(7, 157, 113))); + + // Use the screen ID to give it a different random hue. + col = rotHue(col, floor(id*12.)/12.*6.283/2.); + + col += rCol*rCol*.5; // Screen reflection. + + dif += .5; // Make the screen appear self illuminating, but increasing the diffuse. + spe += .25; + + } + + // Combining everything together to produce the scene color. + col *= (dif + .25 + spot*.5 + vec3(.25, .3, .5)*spe) + spe2; + col *= occ; // Applying occlusion. + + + } + + // Applying some very slight fog in the distance. This is technically an inside scene... + // Or is it underground... Who cares, it's just a shader. :) + col = mix(min(col, 1.), vec3(0), 1.-exp(-t*t/FAR/FAR*15.));//smoothstep(0., FAR-20., t) + + // Done. + fragColor = vec4(col, 1.0); + +} + diff --git a/src/bin/geoshade/glsl/ShaderToy/QuadTreeTruchet.glsl b/src/bin/geoshade/glsl/ShaderToy/QuadTreeTruchet.glsl new file mode 100644 index 00000000..1fa51f9f --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/QuadTreeTruchet.glsl @@ -0,0 +1,435 @@ +/* + + Quadtree Truchet + ---------------- + + A multiscale, multitile, overlapped, weaved Truchet pattern -- However, since + that description is a little verbose, I figured that a quadtree Truchet was as + good a description as any. :) The mild weave effect is provided via the + "INCLUDE_LINE_TILES" define. + + In order to produce a varied looking Truchet pattern, there are a couple of + simple things you can try: One is to use more than one tile, and the other is + to stitch weaved tiles together to produce a cool under-over effect. There are + a few examples on Shadertoy of each, which are easy enough to find -- Just do + a search for "Truchet" and look for the multitile and weaved examples. + + Lesser known variations include using Truchet tiles that overlap one another, + and stitching together multiscaled tiles -- usually on something like a quadtree + grid. This example uses elements of all of the aforementioned. + + In the past, I've combined two non-overlapping tile scales, but had never + considered taking it beyond that... until I came across Christopher Carlson's + article, "Multi-Scale Truchet Patterns." If you follow the link below and refer + to the construction process, you'll see that the idea behind it is almost + rundimentary. As a consequence, I figured that it'd take me five minutes to put + the ideas into pixel shader form. Unfortunately, they say the dumber you are, + the more overconfident you'll be, and to cut a long story short... It took me + longer than five minutes. :D + + The code below is somewhat obfuscated and strewn with defines - The defines are + my fault, since I wanted to provide a few rendering options. However, the + remaining complication boils down to the necessity to render overlapping tiles + on a repeat quadtree grid in an environment that doesn't allow random pixel + access. The only example along those lines I could find on here was IQ's + hierachical Voronoi demonstration, which is pretty cool, but I needed to render + things in a way that involved less nesting, which complicated things. + + Either way, the idea is pretty simple: Construct a grid, randomly render some + Truchet tiles, subdivide the remaining squares into four, randomly render some + more tiles in reverse color order, then continue ad infinitum. By the way, I + constructed this on the fly using the best method I could think of at the time. + However, if anyone out there has a more elegant solution, feel free to post it. :) + + Naturally, the idea can be extended to 3D. Three levels with this particular + setup might be a little slow. However, two levels using a non overlapping tile + is definitely doable, so I intend to produce an example along those lines in the + near future. + + + Based on the following: + + Multi-Scale Truchet Patterns - Christopher Carlson + https://christophercarlson.com/portfolio/multi-scale-truchet-patterns/ + Linking paper containing more detail: + http://archive.bridgesmathart.org/2018/bridges2018-39.pdf + + Quadtree Related: + + // Considers overlap. + https://www.shadertoy.com/view/Xll3zX + Voronoi - hierarchical - IQ + + // No overlap, but I really like this one. + SDF Raymarch Quadtree - Paniq + https://www.shadertoy.com/view/MlffW8 + + // Multilevel, and nice and simple. + quadtree - 4 - FabriceNeyret2 + https://www.shadertoy.com/view/ltlyRH + +*/ + + +// DEFINES: Feel free to try them out. + +// Default colored setting. Not applicable when using the stacked tiles option. +// When turned off, the color is white. +#define SPECTRUM_COLORED + +// Showing the different tile layers stacked on top of one another. Aesthetically, I prefer +// this more, because it has a raised look about it. However, you can't make out the general +// pattern as well, so it's off by default. +//#define STACKED_TILES + +// Pink -- Less bland than white, and has a velvety feel... Gets overridden by the spectrum +// color option, so only works when "SPECTRUM_COLORED" is commented out. +//#define PINK + +// This option produces art deco looking patterns, which are probably more interesting, but +// I wanted the default pattern to be more simplistic. +//#define INCLUDE_LINE_TILES + + + +// vec2 to vec2 hash. +vec2 hash22(vec2 p) { + + // Faster, but doesn't disperse things quite as nicely. However, when framerate + // is an issue, and it often is, this is a good one to use. Basically, it's a tweaked + // amalgamation I put together, based on a couple of other random algorithms I've + // seen around... so use it with caution, because I make a tonne of mistakes. :) + float n = sin(dot(p, vec2(57, 27))); + + return fract(vec2(262144, 32768)*n); + + /* + // Animated. + p = fract(vec2(262144, 32768)*n); + // Note the ".35," insted of ".5" that you'd expect to see. . + return sin(p*6.2831853 + iTime/2.)*.24; + */ +} + +// Standard 2D rotation formula. +mat2 r2(in float a){ float c = cos(a), s = sin(a); return mat2(c, s, -s, c); } + +/* +// IQ's 2D unsigned box formula. +float sBox(vec2 p, vec2 b){ return length(max(abs(p) - b, 0.)); } + +// IQ's 2D signed box formula. +float sBoxU(vec2 p, vec2 b){ + + vec2 d = abs(p) - b; + return min(max(d.x, d.y), 0.) + length(max(d, 0.)); +} +*/ + +void mainImage(out vec4 fragColor, in vec2 fragCoord){ + + // Screen coordinates. + vec2 uv = (fragCoord - iResolution.xy*.5)/iResolution.y; + + // Scaling, rotation and transalation. + vec2 oP = uv*5.; + oP *= r2(sin(iTime/8.)*3.14159/8.); + oP -= vec2(cos(iTime/8.)*0., -iTime); + + + // Distance field values -- One for each color. They're "vec4"s to hold the three + // layers and an an unused spare. The other is for the grid. + vec4 d = vec4(1e5), d2 = vec4(1e5), grid = vec4(1e5); + + // Final entry needs to fill in the rest, so you give it a 100% chance of success. + // I'd rather not say how long it took me to figure that out. :D + vec2 rndTh[3] = vec2[3]( vec2(.5, .35), vec2(.5, .7), vec2(.5, 1)); + + + // The scale dimentions. Gets multiplied by two each iteration. + float dim = 1.; + + + + // If you didn't need to worry about overlap, you wouldn't need to consider neighboring + // cell rendering, which would make this far less complicated - One loop and a break. + + // Three tile levels. + for(int k=0; k<3; k++){ + + // Base cell ID. + vec2 ip = floor(oP*dim); + + + for(int j=-1; j<=1; j++){ + for(int i=-1; i<=1; i++){ + + // The neighboring cell ID. + vec2 rndIJ = hash22(ip + vec2(i, j)); + + // The cell IDs for the previous dimension, or dimensions, as the case may be. + // Because the tiles overlap, rendering order matters. In this case, the tiles + // need to laid down from largest (k = 0) to smallest (k = 2). If a large tile + // has taken up the space, you need to check on the next iterations and skip -- + // so as not to lay smaller tiles over the larger ones. + // + // So why not just break from the loop? Unfortunately, there are neighboring + // cells to check, and the IDs need to be calculated from the perspective of + // each cell neighbor... Yeah, I'm confused too. You can either take my word + // for it, or better yet, come up with a more elegant solution. :) + vec2 rndIJ2 = hash22(floor((ip + vec2(i, j))/2.)); + vec2 rndIJ4 = hash22(floor((ip + vec2(i, j))/4.)); + + // If the previous large tile has been rendered, continue. + if(k==1 && rndIJ2.y.35){ + c2 = abs(length(p - vec2(.5, -.5)/dim) - .5/dim) - .5/3./dim; + } + else{ + // Circles at the mid boundary lines -- instead of an arc. + // c2 = 1e5; // In some situations, just this would work. + c2 = length(p - vec2(.5, 0)/dim) - .5/3./dim; + c2 = min(c2, length(p - vec2(0, -.5)/dim) - .5/3./dim); + } + + + // Randomly overiding some arcs with lines. + #ifdef INCLUDE_LINE_TILES + if(fract(rndIJ.x*113.467 + .51)<.35){ + c = abs(p.x) - .5/3./dim; + } + if(fract(rndIJ.y*113.467 + .51)<.35){ + c2 = abs(p.y) - .5/3./dim; + } + #endif + + + // Truch arcs, lines, or dots -- as the case may be. + float truchet = min(c, c2); + + // Carving out a mild channel around the line to give a faux weave effect. + #ifdef INCLUDE_LINE_TILES + float lne = abs(c - .5/6./dim + .5/12./dim) - .5/12./dim; + truchet = max(truchet, -lne); + #endif + + // Each tile has two colors. This is the first, and it's rendered on top. + c = min(c3, max(square, truchet)); + d[k] = min(d[k], c); // Tile color one. + + + // TILE COLOR TWO. + // Repeat trick, to render four circles at the grid vertices. + p = abs(p) - .5/dim; + float l = length(p); + // Four circles at the grid vertices and the square. + c = min(l - 1./3./dim, square); + //c = max(c, -truchet); + //c = max(c, -c3); + d2[k] = min(d2[k], c); // Tile color two. + + // Rendering some circles at the actual grid vertices. Mouse down to see it. + grid.y = min(grid.y, l - .5/9./dim); //.05/(dim*.35 + .65) + grid.z = min(grid.z, l); + + + } + + + + } + } + + + dim *= 2.; + + + } + + + // The scene color. Initiated to grey. + vec3 col = vec3(.25); + + + // Just a simple lined pattern. + float pat3 = clamp(sin((oP.x - oP.y)*6.283*iResolution.y/24.)*1. + .9, 0., 1.)*.25 + .75; + // Resolution based falloff... Insert "too may different devices these days" rant here. :D + float fo = 5./iResolution.y; + + + // Tile colors. + vec3 pCol2 = vec3(.125); + vec3 pCol1 = vec3(1); + + //The spectrum color option overides the pink option. + #ifdef SPECTRUM_COLORED + pCol1 = vec3(.7, 1.4, .4); + #else + // Pink version. + #ifdef PINK + pCol1 = mix(vec3(1, .1, .2), vec3(1, .1, .5), uv.y*.5 + .5);; + pCol2 = vec3(.1, .02, .06); + #endif + #endif + + + + + #ifdef STACKED_TILES + // I provided this as an option becaue I thought it might be useful + // to see the tile layering process. + + float pw = .02; + d -= pw/2.; + d2 -= pw/2.; + + // Render each two-colored tile, switching colors on alternating iterations. + for (int k=0; k<3; k++){ + + col = mix(col, vec3(0), (1. - smoothstep(0., fo*5., d2[k]))*.35); + col = mix(col, vec3(0), 1. - smoothstep(0., fo, d2[k])); + col = mix(col, pCol2, 1. - smoothstep(0., fo, d2[k] + pw)); + + col = mix(col, vec3(0), (1. - smoothstep(0., fo*5., d[k]))*.35); + col = mix(col, vec3(0), 1. - smoothstep(0., fo, d[k])); + col = mix(col, pCol1, 1. - smoothstep(0., fo, d[k] + pw)); + + vec3 temp = pCol1; pCol1 = pCol2; pCol2 = temp; + } + + col *= pat3; + + #else + + // Combining the tile layers into a continuous surface. I'd like to say that + // I applied years of topological knowledge to arrive at this, but like most + // things, I threw a bunch of formulas at the screen in frustration until I + // fluked the solution. :D There was a bit of logic applied though. :) + d.x = max(d2.x, -d.x); + d.x = min(max(d.x, -d2.y), d.y); + d.x = max(min(d.x, d2.z), -d.z); + + // A couple of distance field patterns and a shade. + float pat = clamp(-sin(d.x*6.283*20.) - .0, 0., 1.); + float pat2 = clamp(sin(d.x*6.283*16.)*1. + .9, 0., 1.)*.3 + .7; + float sh = clamp(.75 + d.x*2., 0., 1.); + + #ifdef SPECTRUM_COLORED + + col *= pat; + + // Render the combined shape. + d.x = -(d.x + .03); + + col = mix(col, vec3(0), (1. - smoothstep(0., fo*5., d.x))); + col = mix(col, vec3(0), 1. - smoothstep(0., fo, d.x)); + col = mix(col, vec3(.8, 1.2, .6), 1. - smoothstep(0., fo*2., d.x + .02)); + col = mix(col, vec3(0), 1. - smoothstep(0., fo*2., d.x + .03)); + col = mix(col, vec3(.7, 1.4, .4)*pat2, 1. - smoothstep(0., fo*2., d.x + .05)); + + col *= sh; + + #else + + //d.x -= .01; + col = pCol1; + + // Render the combined shape. + col = mix(col, vec3(0), (1. - smoothstep(0., fo*5., d.x))*.35); + col = mix(col, vec3(0), 1. - smoothstep(0., fo, d.x)); + col = mix(col, pCol2, 1. - smoothstep(0., fo, d.x + .02)); + + + col *= pat3; // Line decroation. + #endif + + #endif + + + + // Mild spotlight. + col *= max(1.15 - length(uv)*.5, 0.); + + + // Click the left mouse button to show the underlying quadtree grid structure. It's + // helpful to see the cell borders to see the random tile constructions. + if(iMouse.z>0.){ + + + vec3 vCol1 = vec3(.8, 1, .7); + vec3 vCol2 = vec3(1, .7, .4); + + #ifdef PINK + vCol1 = vCol1.zxy; + vCol2 = vCol2.zyx; + #endif + + // Grid lines. + vec3 bg = col; + col = mix(col, vec3(0), (1. - smoothstep(0., .02, grid.x - .02))*.7); + col = mix(col, vCol1 + bg/2., 1. - smoothstep(0., .015, grid.x)); + + // Circles on the grid vertices. + float fo = .5/iResolution.y/grid.z; + col = mix(col, vec3(0), (1. - smoothstep(0., fo*3., grid.y - .02))*.5); + col = mix(col, vec3(0), 1. - smoothstep(0., fo, grid.y - .02)); + col = mix(col, vCol2, 1. - smoothstep(0., fo, grid.y)); + col = mix(col, vec3(0), 1. - smoothstep(0., fo, grid.z - .001)); + } + + + // Mix the colors, if the spectrum option is chosen. + #ifdef SPECTRUM_COLORED + col = mix(col, col.yxz, uv.y*.75 + .5); //.zxy + col = mix(col, col.zxy, uv.x*.7 + .5); //.zxy + #endif + + + // Rough gamma correction, and output to the screen. + fragColor = vec4(sqrt(max(col, 0.)), 1); +} diff --git a/src/bin/geoshade/glsl/ShaderToy/RayMarchingPrimitives.glsl b/src/bin/geoshade/glsl/ShaderToy/RayMarchingPrimitives.glsl new file mode 100644 index 00000000..3cf13723 --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/RayMarchingPrimitives.glsl @@ -0,0 +1,405 @@ +// The MIT License +// Copyright © 2013 Inigo Quilez +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +// A list of useful distance function to simple primitives, and an example on how to +// do some interesting boolean operations, repetition and displacement. +// +// More info here: http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm + +// make this 1 is your machine is too slow +#define AA 1 + +//------------------------------------------------------------------ + +float sdPlane( in vec3 p ) +{ + return p.y; +} + +float sdSphere( in vec3 p, in float s ) +{ + return length(p)-s; +} + +float sdBox( in vec3 p, in vec3 b ) +{ + vec3 d = abs(p) - b; + return min(max(d.x,max(d.y,d.z)),0.0) + length(max(d,0.0)); +} + +float sdEllipsoid( in vec3 p, in vec3 r ) +{ + return (length( p/r ) - 1.0) * min(min(r.x,r.y),r.z); +} + +float udRoundBox( in vec3 p, in vec3 b, in float r ) +{ + return length(max(abs(p)-b,0.0))-r; +} + +float sdTorus( in vec3 p, in vec2 t ) +{ + return length( vec2(length(p.xz)-t.x,p.y) )-t.y; +} + +float sdHexPrism( vec3 p, vec2 h ) +{ + vec3 q = abs(p); +#if 0 + return max(q.z-h.y,max((q.x*0.866025+q.y*0.5),q.y)-h.x); +#else + float d1 = q.z-h.y; + float d2 = max((q.x*0.866025+q.y*0.5),q.y)-h.x; + return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.); +#endif +} + +float sdCapsule( vec3 p, vec3 a, vec3 b, float r ) +{ + vec3 pa = p-a, ba = b-a; + float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 ); + return length( pa - ba*h ) - r; +} + +float sdEquilateralTriangle( in vec2 p ) +{ + const float k = sqrt(3.0); + p.x = abs(p.x) - 1.0; + p.y = p.y + 1.0/k; + if( p.x + k*p.y > 0.0 ) p = vec2( p.x - k*p.y, -k*p.x - p.y )/2.0; + p.x += 2.0 - 2.0*clamp( (p.x+2.0)/2.0, 0.0, 1.0 ); + return -length(p)*sign(p.y); +} + +float sdTriPrism( vec3 p, vec2 h ) +{ + vec3 q = abs(p); + float d1 = q.z-h.y; +#if 1 + // distance bound + float d2 = max(q.x*0.866025+p.y*0.5,-p.y)-h.x*0.5; +#else + // correct distance + h.x *= 0.866025; + float d2 = sdEquilateralTriangle(p.xy/h.x)*h.x; +#endif + return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.); +} + +float sdCylinder( vec3 p, vec2 h ) +{ + vec2 d = abs(vec2(length(p.xz),p.y)) - h; + return min(max(d.x,d.y),0.0) + length(max(d,0.0)); +} + +float sdCone( in vec3 p, in vec3 c ) +{ + vec2 q = vec2( length(p.xz), p.y ); + float d1 = -q.y-c.z; + float d2 = max( dot(q,c.xy), q.y); + return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.); +} + +float sdConeSection( in vec3 p, in float h, in float r1, in float r2 ) +{ + float d1 = -p.y - h; + float q = p.y - h; + float si = 0.5*(r1-r2)/h; + float d2 = max( sqrt( dot(p.xz,p.xz)*(1.0-si*si)) + q*si - r2, q ); + return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.); +} + +float sdPryamid4(vec3 p, vec3 h ) // h = { cos a, sin a, height } +{ + // Tetrahedron = Octahedron - Cube + float box = sdBox( p - vec3(0,-2.0*h.z,0), vec3(2.0*h.z) ); + + float d = 0.0; + d = max( d, abs( dot(p, vec3( -h.x, h.y, 0 )) )); + d = max( d, abs( dot(p, vec3( h.x, h.y, 0 )) )); + d = max( d, abs( dot(p, vec3( 0, h.y, h.x )) )); + d = max( d, abs( dot(p, vec3( 0, h.y,-h.x )) )); + float octa = d - h.z; + return max(-box,octa); // Subtraction + } + +float length2( vec2 p ) +{ + return sqrt( p.x*p.x + p.y*p.y ); +} + +float length6( vec2 p ) +{ + p = p*p*p; p = p*p; + return pow( p.x + p.y, 1.0/6.0 ); +} + +float length8( vec2 p ) +{ + p = p*p; p = p*p; p = p*p; + return pow( p.x + p.y, 1.0/8.0 ); +} + +float sdTorus82( vec3 p, vec2 t ) +{ + vec2 q = vec2(length2(p.xz)-t.x,p.y); + return length8(q)-t.y; +} + +float sdTorus88( vec3 p, vec2 t ) +{ + vec2 q = vec2(length8(p.xz)-t.x,p.y); + return length8(q)-t.y; +} + +float sdCylinder6( vec3 p, vec2 h ) +{ + return max( length6(p.xz)-h.x, abs(p.y)-h.y ); +} + +//------------------------------------------------------------------ + +float opS( float d1, float d2 ) +{ + return max(-d2,d1); +} + +vec2 opU( vec2 d1, vec2 d2 ) +{ + return (d1.x0.0 ) tmax = min( tmax, tp1 ); + float tp2 = (1.6-ro.y)/rd.y; if( tp2>0.0 ) { if( ro.y>1.6 ) tmin = max( tmin, tp2 ); + else tmax = min( tmax, tp2 ); } +#endif + + float t = tmin; + float m = -1.0; + for( int i=0; i<64; i++ ) + { + float precis = 0.0005*t; + vec2 res = map( ro+rd*t ); + if( res.xtmax ) break; + t += res.x; + m = res.y; + } + + if( t>tmax ) m=-1.0; + return vec2( t, m ); +} + + +float calcSoftshadow( in vec3 ro, in vec3 rd, in float mint, in float tmax ) +{ + float res = 1.0; + float t = mint; + for( int i=0; i<16; i++ ) + { + float h = map( ro + rd*t ).x; + res = min( res, 8.0*h/t ); + t += clamp( h, 0.02, 0.10 ); + if( h<0.001 || t>tmax ) break; + } + return clamp( res, 0.0, 1.0 ); +} + +vec3 calcNormal( in vec3 pos ) +{ + vec2 e = vec2(1.0,-1.0)*0.5773*0.0005; + return normalize( e.xyy*map( pos + e.xyy ).x + + e.yyx*map( pos + e.yyx ).x + + e.yxy*map( pos + e.yxy ).x + + e.xxx*map( pos + e.xxx ).x ); + /* + vec3 eps = vec3( 0.0005, 0.0, 0.0 ); + vec3 nor = vec3( + map(pos+eps.xyy).x - map(pos-eps.xyy).x, + map(pos+eps.yxy).x - map(pos-eps.yxy).x, + map(pos+eps.yyx).x - map(pos-eps.yyx).x ); + return normalize(nor); + */ +} + +float calcAO( in vec3 pos, in vec3 nor ) +{ + float occ = 0.0; + float sca = 1.0; + for( int i=0; i<5; i++ ) + { + float hr = 0.01 + 0.12*float(i)/4.0; + vec3 aopos = nor * hr + pos; + float dd = map( aopos ).x; + occ += -(dd-hr)*sca; + sca *= 0.95; + } + return clamp( 1.0 - 3.0*occ, 0.0, 1.0 ); +} + +// http://iquilezles.org/www/articles/checkerfiltering/checkerfiltering.htm +float checkersGradBox( in vec2 p ) +{ + // filter kernel + vec2 w = fwidth(p) + 0.001; + // analytical integral (box filter) + vec2 i = 2.0*(abs(fract((p-0.5*w)*0.5)-0.5)-abs(fract((p+0.5*w)*0.5)-0.5))/w; + // xor pattern + return 0.5 - 0.5*i.x*i.y; +} + +vec3 render( in vec3 ro, in vec3 rd ) +{ + vec3 col = vec3(0.7, 0.9, 1.0) +rd.y*0.8; + vec2 res = castRay(ro,rd); + float t = res.x; + float m = res.y; + if( m>-0.5 ) + { + vec3 pos = ro + t*rd; + vec3 nor = calcNormal( pos ); + vec3 ref = reflect( rd, nor ); + + // material + col = 0.45 + 0.35*sin( vec3(0.05,0.08,0.10)*(m-1.0) ); + if( m<1.5 ) + { + + float f = checkersGradBox( 5.0*pos.xz ); + col = 0.3 + f*vec3(0.1); + } + + // lighitng + float occ = calcAO( pos, nor ); + vec3 lig = normalize( vec3(-0.4, 0.7, -0.6) ); + vec3 hal = normalize( lig-rd ); + float amb = clamp( 0.5+0.5*nor.y, 0.0, 1.0 ); + float dif = clamp( dot( nor, lig ), 0.0, 1.0 ); + float bac = clamp( dot( nor, normalize(vec3(-lig.x,0.0,-lig.z))), 0.0, 1.0 )*clamp( 1.0-pos.y,0.0,1.0); + float dom = smoothstep( -0.1, 0.1, ref.y ); + float fre = pow( clamp(1.0+dot(nor,rd),0.0,1.0), 2.0 ); + + dif *= calcSoftshadow( pos, lig, 0.02, 2.5 ); + dom *= calcSoftshadow( pos, ref, 0.02, 2.5 ); + + float spe = pow( clamp( dot( nor, hal ), 0.0, 1.0 ),16.0)* + dif * + (0.04 + 0.96*pow( clamp(1.0+dot(hal,rd),0.0,1.0), 5.0 )); + + vec3 lin = vec3(0.0); + lin += 1.30*dif*vec3(1.00,0.80,0.55); + lin += 0.40*amb*vec3(0.40,0.60,1.00)*occ; + lin += 0.50*dom*vec3(0.40,0.60,1.00)*occ; + lin += 0.50*bac*vec3(0.25,0.25,0.25)*occ; + lin += 0.25*fre*vec3(1.00,1.00,1.00)*occ; + col = col*lin; + col += 10.00*spe*vec3(1.00,0.90,0.70); + + col = mix( col, vec3(0.8,0.9,1.0), 1.0-exp( -0.0002*t*t*t ) ); + } + + return vec3( clamp(col,0.0,1.0) ); +} + +mat3 setCamera( in vec3 ro, in vec3 ta, float cr ) +{ + vec3 cw = normalize(ta-ro); + vec3 cp = vec3(sin(cr), cos(cr),0.0); + vec3 cu = normalize( cross(cw,cp) ); + vec3 cv = normalize( cross(cu,cw) ); + return mat3( cu, cv, cw ); +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 mo = iMouse.xy/iResolution.xy; + float time = 15.0 + iTime; + + + vec3 tot = vec3(0.0); +#if AA>1 + for( int m=0; m1 + } + tot /= float(AA*AA); +#endif + + + fragColor = vec4( tot, 1.0 ); +} + diff --git a/src/bin/geoshade/glsl/ShaderToy/RoundedVoronoiEdges.glsl b/src/bin/geoshade/glsl/ShaderToy/RoundedVoronoiEdges.glsl new file mode 100644 index 00000000..8c5c6c96 --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/RoundedVoronoiEdges.glsl @@ -0,0 +1,142 @@ +/* + Rounded Voronoi Borders + ----------------------- + + Fabrice came up with an interesting formula to produce more evenly distributed Voronoi values. + I'm sure there are more interesting ways to use it, but I like the fact that it facilitates + the creation of more rounded looking borders. I'm sure there are more sophisticated ways to + produce more accurate borders, but Fabrice's version is simple and elegant. + + The process is explained below. The link to the original is below also. + + I didn't want to cloud the example with too much window dressing, so just for fun, I tried + to pretty it up by using as little code as possible. + + // 2D version + 2D trabeculum - FabriceNeyret2 + https://www.shadertoy.com/view/4dKSDV + + // 3D version + hypertexture - trabeculum - FabriceNeyret2 + https://www.shadertoy.com/view/ltj3Dc + + // Straight borders - accurate geometric solution. + Voronoi - distances - iq + https://www.shadertoy.com/view/ldl3W8 + +*/ + +// vec2 to vec2 hash. +vec2 hash22(vec2 p) { + + // Faster, but doesn't disperse things quite as nicely as other combinations. :) + float n = sin(dot(p, vec2(41, 289))); + //return fract(vec2(262144, 32768)*n)*.75 + .25; + + // Animated. + p = fract(vec2(262144, 32768)*n); + return sin( p*6.2831853 + iTime )*.35 + .65; + +} + +// IQ's polynomial-based smooth minimum function. +float smin( float a, float b, float k ){ + + float h = clamp(.5 + .5*(b - a)/k, 0., 1.); + return mix(b, a, h) - k*h*(1. - h); +} + +// 2D 3rd-order Voronoi: This is just a rehash of Fabrice Neyret's version, which is in +// turn based on IQ's original. I've simplified it slightly, and tidied up the "if-statements," +// but the clever bit at the end came from Fabrice. +// +// Using a bit of science and art, Fabrice came up with the following formula to produce a more +// rounded, evenly distributed, cellular value: + +// d1, d2, d3 - First, second and third closest points (nodes). +// val = 1./(1./(d2 - d1) + 1./(d3 - d1)); +// +float Voronoi(in vec2 p){ + + vec2 g = floor(p), o; p -= g; + + vec3 d = vec3(1); // 1.4, etc. + + float r = 0.; + + for(int y = -1; y <= 1; y++){ + for(int x = -1; x <= 1; x++){ + + o = vec2(x, y); + o += hash22(g + o) - p; + + r = dot(o, o); + + // 1st, 2nd and 3rd nearest squared distances. + d.z = max(d.x, max(d.y, min(d.z, r))); // 3rd. + d.y = max(d.x, min(d.y, r)); // 2nd. + d.x = min(d.x, r); // Closest. + + } + } + + d = sqrt(d); // Squared distance to distance. + + // Fabrice's formula. + return min(2./(1./max(d.y - d.x, .001) + 1./max(d.z - d.x, .001)), 1.); + // Dr2's variation - See "Voronoi Of The Week": https://www.shadertoy.com/view/lsjBz1 + //return min(smin(d.z, d.y, .2) - d.x, 1.); + +} + +vec2 hMap(vec2 uv){ + + // Plain Voronoi value. We're saving it and returning it to use when coloring. + // It's a little less tidy, but saves the need for recalculation later. + float h = Voronoi(uv*6.); + + // Adding some bordering and returning the result as the height map value. + float c = smoothstep(0., fwidth(h)*2., h - .09)*h; + c += (1.-smoothstep(0., fwidth(h)*3., h - .22))*c*.5; + + // Returning the rounded border Voronoi, and the straight Voronoi values. + return vec2(c, h); + +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ){ + + // Moving screen coordinates. + vec2 uv = fragCoord/iResolution.y + vec2(-.2, .05)*iTime; + + // Obtain the height map (rounded Voronoi border) value, then another nearby. + vec2 c = hMap(uv); + vec2 c2 = hMap(uv + .004); + + // Take a factored difference of the values above to obtain a very, very basic gradient value. + // Ie. - a measurement of the bumpiness, or bump value. + float b = max(c2.x - c.x, 0.)*16.; + + // Use the height map value to produce some color. It's all made up on the spot, so don't pay it + // too much attention. + // + vec3 col = vec3(1, .05, .25)*c.x; // Red base. + float sv = Voronoi(uv*16. + c.y)*.66 + (1.-Voronoi(uv*48. + c.y*2.))*.34; // Finer overlay pattern. + col = col*.85 + vec3(1, .7, .5)*sv*sqrt(sv)*.3; // Mix in a little of the overlay. + col += (1. - col)*(1.-smoothstep(0., fwidth(c.y)*3., c.y - .22))*c.x; // Highlighting the border. + col *= col; // Ramping up the contrast, simply because the deeper color seems to look better. + + // Taking a pattern sample a little off to the right, ramping it up, then combining a bit of it + // with the color above. The result is the flecks of yellowy orange that you see. There's no physics + // behind it, but the offset tricks your eyes into believing something's happening. :) + sv = col.x*Voronoi(uv*6. + .5); + col += vec3(.7, 1, .3)*pow(sv, 4.)*8.; + + // Apply the bump - or a powered variation of it - to the color for a bit of highlighting. + col += vec3(.5, .7, 1)*(b*b*.5 + b*b*b*b*.5); + + + // Basic gamma correction + fragColor = vec4(sqrt(clamp(col, 0., 1.)), 1); + +} diff --git a/src/bin/geoshade/glsl/ShaderToy/RounderVoronoi.glsl b/src/bin/geoshade/glsl/ShaderToy/RounderVoronoi.glsl new file mode 100644 index 00000000..8216ad15 --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/RounderVoronoi.glsl @@ -0,0 +1,243 @@ +// ST_MODE = "ShaderToy mode". Do not undefine. It is here for PolyCube compatibility. +#define ST_MODE + +// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. +// by Tomasz Dobrowolski' 2018 + +// Use mouse (X/Y) to control two smoothness parameters. + +// PolyCube edition: +// http://polycu.be/edit/?h=X3sd5D + +// This is continuation of a quest to formulate +// smooth and continuous across whole domain +// distance function to edges of random Voronoi cells. + +// I just had a very simple idea today (2018-02-03) +// how to make this function continuous and smooth +// at non-zero distance at the same time, and it works! +// See "voronoi_rounder" function for details. + +// My previous shader with analysis of discontinuities +// in Shane's attempt. +// https://www.shadertoy.com/view/MdSfzD + +// Shane's original shader. +// https://www.shadertoy.com/view/lsSfz1 + +// My previous attempt to optimize distance to edges. +// https://www.shadertoy.com/view/llG3zy + +// Smooth cell noise function by TinyTexel. +// https://www.shadertoy.com/view/MdByzD + +// Play with some options (1 = enable, 0 = disable). +#define DOMAIN_DEFORM 0 +#define ANIMATE 1 + +// How far cells can go off center during animation (must be <= .5) +#define ANIMATE_D .45 + +// Points cannot be closer than sqrt(EPSILON) +#define EPSILON .00001 + +#ifdef ST_MODE +#define template_time iTime +#endif + +vec2 hash2(vec2 p) +{ + #if 1 + // Dave Hoskin's hash as in https://www.shadertoy.com/view/4djSRW + vec3 p3 = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973)); + p3 += dot(p3, p3.yzx+19.19); + vec2 o = fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y)); + #else + // Texture-based + vec2 o = texture( iChannel0, (p+0.5)/256.0, -100.0 ).xy; + #endif + #if ANIMATE + o = 0.5 + ANIMATE_D*sin( template_time*.5 + o*6.2831853 ); + #endif + return o; +} + +// Commutative smin function taken +// from Alex Evans aka Statix talk +// http://media.lolrus.mediamolecule.com/AlexEvans_SIGGRAPH-2015.pdf +// credited to Dave Smith @media molecule +float smin(float a, float b, float r) +{ +#if 0 + // Preventing division by zero. + float f = max(0.,1.-abs(b-a)/max(1e-32,r)); +#else + float f = max(0.,1.-abs(b-a)/r); +#endif + return min(a,b) - r*.25*f*f; +} + +// Smooth abs. +// This one is equivalent to -smin(x, -x, r) - r*.25 +float sabs(float x, float r) +{ + float f = max(0.,1.-abs(x + x)/r); + return abs(x) + r*.25*(f*f - 1.); +} + +// This is bullet-proof version of finding closest point +// in 4x4 area around query point "q". +// In fact 12 cells (4x4 without corners) would be enough, +// but it's less elegant to implement. +// We pass n=|q|, f=q-n, as an optimization. +float closest( in vec2 n, in vec2 f, out vec2 mr, out vec2 mg ) +{ + // take half-cell position + vec2 h = step(.5,f) - 2.; + vec2 n2 = n + h; + vec2 f2 = f - h; + + float md = 8.0; + + //---------------------------------- + // first pass: regular voronoi + //---------------------------------- + for( int j=0; j<=3; j++ ) + for( int i=0; i<=3; i++ ) + { + vec2 g = vec2(float(i),float(j)); + vec2 o = hash2( n2 + g ); + vec2 r = g + o - f2; + float d = dot(r,r); + + if( dEPSILON ) // skip the same cell + { + float d = dot( 0.5*(mr+r), normalize(r-mr) ); + + // The whole trick to get continuous function + // across whole domain and smooth at non-zero distance + // is to use smooth minimum (as usual) + // and multiple smoothness factor by distance, + // so it becomes minimum at zero distance. + // Simple as that! + // If you keep smoothness factor constant (i.e. multiple by "s" only), + // the distance function becomes discontinuous + // (see https://www.shadertoy.com/view/MdSfzD). + md = smin(d, md, s*d); + } + } + + // Totally empirical compensation for + // smoothing scaling side-effect. + md *= .5 + s; + + // At the end do some smooth abs + // on the distance value. + // This is really optional, since distance function + // is already continuous, but we can get extra + // smoothness from it. + md = sabs(md, e); + + return vec3( md, mr ); +} + +#ifdef ST_MODE +vec3 plot( vec2 p, float ss ) +{ +#else +vec3 plot( vec2 p ) +{ + float ss = template_tr.z; +#endif +#ifdef ST_MODE + float s = clamp(iMouse.x/iResolution.x,.0,1.)*.95+.05; + float e = max(.01,iMouse.y/iResolution.y)*.5; + if (length(iMouse.xy) < .5) { + s = .5; + e = .005; + } +#else + const float s = .5; + const float e = .01; +#endif + vec3 c = voronoi_rounder(p, s, e); + + const float pd = 40.; +#if 0 + vec3 norm = normalize(vec3(dFdx(c.x),dFdy(c.x),ss*1.5)); + float fw1 = fwidth(c.x); +#else + const vec2 eps = vec2(.001,0); + float fdx = (voronoi_rounder(p + eps.xy, s, e).x - c.x)/eps.x; + float fdy = (voronoi_rounder(p + eps.yx, s, e).x - c.x)/eps.x; + vec3 norm = normalize(vec3(fdx, fdy, 1.5)); + float fw1 = (abs(fdx) + abs(fdy))*ss; +#endif + float fw2 = fw1*(pd/3.141592653589793*2.7); + + const float f0 = sin(.7/pd); + float f = sin(c.x*pd-.7); + float od = abs(f); + vec3 ldir = normalize(vec3(-.2,-.3,.6)); + float dd = dot(norm,ldir); + float rd = pow(max(0.,reflect(-ldir,norm).z),16.); + float ld = dd*dd*.7+.35; + float c0 = c.x*.7-step(0.,f)*.05+.6; + float c1 = c.x*.7+.33; + vec3 col = mix(vec3(c0*ld+rd*.23), vec3(c1*ld), smoothstep(fw2,0.,od)*.7); + col = mix(col, vec3(.1,.15,.1), smoothstep(f0+fw1,f0,c.x)*.5); + col = sqrt(col)*1.5-.53; // some final grading + return col; +} + +#ifdef ST_MODE +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + float sc = step(0.5, iResolution.y)*2. + 3.; // scale differently for fullscreen + float ss = sc / iResolution.y; // size of 1 pixel + vec2 uv = (fragCoord.xy - iResolution.xy*.5) * ss; + fragColor = vec4(plot(uv, ss), 1.); +} +#endif diff --git a/src/bin/geoshade/glsl/ShaderToy/SiggraphLogo.glsl b/src/bin/geoshade/glsl/ShaderToy/SiggraphLogo.glsl new file mode 100644 index 00000000..69a02aed --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/SiggraphLogo.glsl @@ -0,0 +1,139 @@ +// Created by inigo quilez - iq/2013 +// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. + +vec2 disp( in vec3 p ) +{ + return vec2( pow( 0.5 + 0.5*cos( 1.0*iTime ), 2.0 ), + pow( 0.5 + 0.5*cos( 25.0*p.x + 1.5*iTime)* + sin( 25.0*p.y + 2.0*iTime )* + sin( 25.0*p.z + 1.0*iTime ), 3.0) ); +} + +float obj( in vec3 p ) +{ + vec3 ax = vec3(-2.0,2.0,1.0)/3.0; + vec3 ce = vec3(0.0,-0.2,-0.2); + + float d1 = dot(p,ax) - 0.1; + float d2 = length(p) - 1.0; + float d3 = length( p-ce - ax*dot(p-ce,ax)) - 1.0; + + return max( max( d1, d2 ), -d3 ); +} + +vec2 map( in vec3 p ) +{ + float d1 = obj( p ); + float d2 = obj( p*vec3(-1.0,-1.0,1.0) ); + + vec2 res = vec2( d1, 0.0 ); + if( d2-0.5 ) + { + // geometry + vec3 pos = ro + tmat.x*rd; + vec3 nor = calcNormal(pos); + vec3 ref = reflect(rd,nor); + vec3 lig = normalize(vec3(-0.6,0.5,0.2)); + vec2 dis = disp( pos ); + + // lights + float con = 1.0; + float amb = 0.5 + 0.5*nor.y; + float dif = max(dot(nor,lig),0.0); + float bac = max(0.2 + 0.8*dot(nor,vec3(-lig.x,lig.y,-lig.z)),0.0); + float rim = pow(1.0+dot(nor,rd),8.0); + float spe = pow(clamp(dot(lig,ref),0.0,1.0),8.0); + float occ = mix( 1.0, 0.9 + 3.0*dis.y, dis.x ); + + // shadow + float sh = softshadow( pos, lig, 0.01, 8.0 ); + dif *= sh; + spe *= sh; + rim *= sh; + + col = 0.10*con*vec3(1.0)*occ; + col += 1.00*dif*vec3(1.0,0.8,0.6); + col += 0.40*bac*vec3(1.0)*occ; + col += 0.25*amb*vec3(0.6,0.8,1.0)*occ; + + // material + col *= mix( vec3(0.7,0.1,0.1), vec3(0.0,0.2,1.0), tmat.y ); + + // speculars + col += 0.50*spe*vec3(1.0); + col += 1.00*rim*vec3(1.0); + + // gamma + col = sqrt(col); + } + + + fragColor = vec4( col,1.0 ); +} \ No newline at end of file diff --git a/src/bin/geoshade/glsl/ShaderToy/TentacleObject.glsl b/src/bin/geoshade/glsl/ShaderToy/TentacleObject.glsl new file mode 100644 index 00000000..17b952e7 --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/TentacleObject.glsl @@ -0,0 +1,279 @@ +// Spherical Fibonnacci points, as described by Benjamin Keinert, Matthias Innmann, +// Michael Sanger and Marc Stamminger in their paper (below) + +//================================================================================================= +// http://lgdv.cs.fau.de/uploads/publications/spherical_fibonacci_mapping_opt.pdf +//================================================================================================= +const float PI = 3.14159265359; +const float PHI = 1.61803398875; + +// Originally from https://www.shadertoy.com/view/lllXz4 +// Modified by fizzer to put out the vector q. +vec2 inverseSF( vec3 p, float n, out vec3 outq ) +{ + float m = 1.0 - 1.0/n; + + float phi = min(atan(p.y, p.x), PI), cosTheta = p.z; + + float k = max(2.0, floor( log(n * PI * sqrt(5.0) * (1.0 - cosTheta*cosTheta))/ log(PHI+1.0))); + float Fk = pow(PHI, k)/sqrt(5.0); + vec2 F = vec2( round(Fk), round(Fk * PHI) ); // k, k+1 + + vec2 ka = 2.0*F/n; + vec2 kb = 2.0*PI*( fract((F+1.0)*PHI) - (PHI-1.0) ); + + mat2 iB = mat2( ka.y, -ka.x, + kb.y, -kb.x ) / (ka.y*kb.x - ka.x*kb.y); + + vec2 c = floor( iB * vec2(phi, cosTheta - m)); + float d = 8.0; + float j = 0.0; + for( int s=0; s<4; s++ ) + { + vec2 uv = vec2( float(s-2*(s/2)), float(s/2) ); + + float i = round(dot(F, uv + c)); + + float phi = 2.0*PI*fract(i*PHI); + float cosTheta = m - 2.0*i/n; + float sinTheta = sqrt(1.0 - cosTheta*cosTheta); + + vec3 q = vec3( cos(phi)*sinTheta, sin(phi)*sinTheta, cosTheta ); + float squaredDistance = dot(q-p, q-p); + if (squaredDistance < d) + { + outq = q; + d = squaredDistance; + j = i; + } + } + return vec2( j, sqrt(d) ); +} + +vec2 intersectSphere(vec3 ro, vec3 rd, vec3 org, float rad) +{ + float a = dot(rd, rd); + float b = 2. * dot(rd, ro - org); + float c = dot(ro - org, ro - org) - rad * rad; + float desc = b * b - 4. * a * c; + if (desc < 0.) + return vec2(1, 0); + + return vec2((-b - sqrt(desc)) / (2. * a), (-b + sqrt(desc)) / (2. * a)); +} + +// polynomial smooth min (k = 0.1); +// from iq: https://www.iquilezles.org/www/articles/smin/smin.htm +float smin( float a, float b, float k ) +{ + float h = clamp( 0.5+0.5*(b-a)/k, 0.0, 1.0 ); + return mix( b, a, h ) - k*h*(1.0-h); +} + +//float smin(float a,float b,float k){ return -log2(exp2(-k*a)+exp2(-k*b))/k;}//from iq +float smax(float a,float b,float k){ return -smin(-a,-b,k);} + +mat3 rotX(float a) +{ + return mat3(1., 0., 0., + 0., cos(a), sin(a), + 0., -sin(a), cos(a)); +} + +mat3 rotY(float a) +{ + return mat3(cos(a), 0., sin(a), + 0., 1., 0., + -sin(a), 0., cos(a)); +} + +mat3 rotZ(float a) +{ + return mat3(cos(a), sin(a), 0., + -sin(a), cos(a), 0., + 0., 0., 1.); +} + +// Anti-aliasing samples count sqrt +#define AA 2 + +float time; + +// Rotation matrix for spherical layer. +mat3 rot(float r) +{ + float t = time - r * 2.; + float s = .5 + .5 * r; + return rotX(cos(t / 1.5) * s) * rotY(sin(t / 3.) * s); +} + +// Scene SDF +float dist(vec3 p) +{ + const float precis = 35.0; + + vec3 op = p; + + p = rot(length(p)) * p; + + // Rotational velocity estimation. + float diff = distance(p, rot(length(op) - 1e-2) * op); + + // A scaling factor based on the rotational velocity to + // simulate a 'bunching up' of the tentacles when they are spinning fast. + float k = max(1e-3, 1. + diff * 1.); + + p *= k; + op *= k; + + vec3 q; + vec2 sf = inverseSF( normalize(p), precis, q ); + + q *= k; + + float d = length(p); + + // Alternating tentacle lengths based on spiral point ID. + float r3 = (mod(sf.x, 3.) < 1.) ? 1. : 1.45; + float r2 = r3 / k; + + d = smax(sf.y - diff * 2.2 - .04 / dot(p, p), d - r3, 32. / 200.); + + // Add spheres at the ends of the tentacles using the unrotated + // sample space, to keep them spherical. + q = transpose(rot(r2 + .05)) * q; + d = smin(d, length(op - q * r2) - .1, 32. / 200.); + + return min(d * .6 / k, .2); +} + +// A special field which is only applied when extracing surface normals. +float bump(vec3 p) +{ + return 0.0; +} + +vec3 getNormal(vec3 p) +{ + // Here the epsilon used for scene normal extraction is larger than the detailed + // bump epsilon. The larger geometry epsilon results in a smoothing effect which helps + // to blend the bases of the tentacles together. + + const vec2 eps = vec2(1e-1, 0); + const vec2 eps2 = vec2(1e-3, 0); + return normalize(vec3(dist(p + eps.xyy) + bump(p + eps2.xyy) - dist(p - eps.xyy) - bump(p - eps2.xyy), + dist(p + eps.yxy) + bump(p + eps2.yxy) - dist(p - eps.yxy) - bump(p - eps2.yxy), + dist(p + eps.yyx) + bump(p + eps2.yyx) - dist(p - eps.yyx) - bump(p - eps2.yyx))); +} + +// Pyramid waveform +float tri(float x) +{ + return min(fract(x) * 2., 2. - 2. * fract(x)); +} + +vec3 render(vec2 fragCoord) +{ + // Jittered time sample for motionblur + time = iTime + texelFetch(iChannel1, ivec2(fragCoord * 2.) & 1023, 0).r * .025; + + vec3 fragColor = vec3(0); + + vec2 uv = fragCoord / iResolution.xy * 2. - 1.; + uv.x *= iResolution.x / iResolution.y; + + vec3 ro = vec3(0, 0, 3), rd = normalize(vec3(uv, -1.8)); + + ro.y += sin(time / 4.) * .03; + ro.x += sin(time / 5.) * .03; + + // Clip to a bounding sphere + vec2 spheret = intersectSphere(ro, rd, vec3(0), 1.6); + + // Background colour + vec3 bg = vec3(.75) * mix(vec3(.5, .5, 1.), vec3(1), .6) * (1. - smoothstep(0., 7., length(uv))); + + if(spheret.x > spheret.y) + return bg; + + float t = spheret.x; + float maxt = spheret.y; + + // Raymarch + for(int i = 0; i < 80; ++i) + { + float d = dist(ro + rd * t); + if(abs(d) < 1e-4 || t > maxt) + break; + t += d; + } + + if(t > maxt) + { + fragColor.rgb = bg; + } + else + { + vec3 rp = ro + rd * t; + vec3 n = getNormal(rp); + vec3 r = reflect(rd, n); + float l = length(rp); + float fr = clamp(1. - dot(n, -rd), 0., 1.); + + // Apply some fake shadowing to the specular highlight and the backlight, + // by simulating a spherical occluder for the 'body' at the center of the object. + float bodyR = .5; + float cone = cos(atan(bodyR / l)); + + float specshad = 1. - smoothstep(-.1, .1, dot(r, normalize(vec3(0) - rp)) - cone) * 1.; + float specshad2 = 1. - smoothstep(-.3, .3, dot(r, normalize(vec3(0) - rp)) - cone) * 1.; + + // Backlight / fake SSS + fragColor.rgb = bg * mix(vec3(.2, .5, 1.) / 2., vec3(1., .9, .8).bgr, specshad2 * pow(fr, .8)); + + // Fake AO from center of body + fragColor.rgb *= vec3(pow(mix(.5 + .5 * dot(n, normalize(vec3(0) - rp)), 1., smoothstep(0., 1.5, l)), .5)); + + // Slight AO / diffuse bleeding + fragColor.rgb *= mix(vec3(.75,1.,.75), vec3(1), smoothstep(0.1, .8, l)); + + vec3 c = fragColor.rgb; + + // Blue / green alternating pattern + fragColor.rgb = mix(c.bbb * vec3(.5,1.,.5), fragColor.rgb, smoothstep(.3, .7, tri(l * 4.))); + + // Yellow tips + fragColor.rgb = mix(fragColor.rgb, c.bbb * vec3(1,1,.5), smoothstep(1.4, 1.5, l)); + + // Yellow tips self-illumination + fragColor.rgb += vec3(1,1,.4) * smoothstep(1.4, 1.5, l) * .11; + + // Specular highlight + fragColor.rgb += specshad * .9 * smoothstep(.4, .7, dot(r, normalize(vec3(1)))) * fr; + + // Mist + fragColor.rgb += vec3(mix(vec3(.5, .5, 1.), vec3(0), exp(-t / 25.))); + } + + return fragColor; +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + fragColor.rgb = vec3(0); + + // Anti-aliasing sample loop + for(int y = 0; y < AA; ++y) + for(int x = 0; x < AA; ++x) + { + fragColor.rgb += clamp(render(fragCoord + vec2(x, y) / float(AA)), 0., 1.); + } + + fragColor.rgb /= float(AA * AA); + + // Contrast + fragColor.rgb = (fragColor.rgb * 1.2 - .05); + + // Clamp, gamma, dither + fragColor.rgb = pow(clamp(fragColor.rgb, 0., 1.), vec3(1. / 2.2)) + texelFetch(iChannel1, ivec2(fragCoord) & 1023, 0).gba / 200.; +} diff --git a/src/bin/geoshade/glsl/ShaderToy/ThePopularShader.glsl b/src/bin/geoshade/glsl/ShaderToy/ThePopularShader.glsl new file mode 100644 index 00000000..db154fd1 --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/ThePopularShader.glsl @@ -0,0 +1,394 @@ +#define USE_IQ_SMIN 0 + +float time; + +vec2 leg0[3]; +vec2 leg1[3]; + +vec2 arm0[3]; +vec2 arm1[3]; + +float wlen=15.0; +float bob; +float wc_scale=0.5; +float scroll; +float scene_scale=15.0; + +// Finds the entry and exit points of a 2D ray with a circle of radius 1 +// centered at the origin. +vec2 intersectCircle(vec2 ro, vec2 rd) +{ + float a = dot(rd, rd); + float b = 2.0 * dot(rd, ro); + float ds = b * b - 4.0 * a * (dot(ro, ro) - 1.0); + + if(ds < 0.0) + return vec2(1e3); + + return ((-b - sqrt(ds) * vec2(-1.0, 1.0))) / (2.0 * a); +} + +mat3 rotateXMat(float a) +{ + return mat3(1.0, 0.0, 0.0, 0.0, cos(a), -sin(a), 0.0, sin(a), cos(a)); +} + +mat3 rotateYMat(float a) +{ + return mat3(cos(a), 0.0, -sin(a), 0.0, 1.0, 0.0, sin(a), 0.0, cos(a)); +} + +// Adapted from https://www.shadertoy.com/view/ldlGR7 +vec2 solve( vec2 p, float l1, float l2, float side ) +{ + vec2 q = p*( 0.5 + 0.5*(l1*l1-l2*l2)/dot(p,p) ); + + float s = l1*l1/dot(q,q) - 1.0; + + if( s<0.0 ) return vec2(-100.0); + + return q + q.yx*vec2(-1.0,1.0)*side*sqrt( s ); +} + +// Returns a pyramid-like periodic signal. +float pyramid(float x) +{ + x = fract(x); + return min(x * 2.0, (1.0 - x) * 2.0); +} + +// Returns a semicircular periodic signal. +float circ(float x) +{ + x = fract(x) * 2.0 - 1.0; + return sqrt(1.0 - x * x); +} + +#if USE_IQ_SMIN +float smin(float a,float b,float k){ return -log(exp(-k*a)+exp(-k*b))/k;}//from iq +#else +// http://www.johndcook.com/blog/2010/01/20/how-to-compute-the-soft-maximum/ +float smin(in float a, in float b, in float k) { return a - log(1.0+exp(k*(a-b))) / k; } +#endif + +float mp(float x) +{ + float y=0.3; + return clamp((pyramid(x)-0.5)*2.0-0.4,-y,y); +} + +float mosaic(vec3 p) +{ + // Disabled because it causes a compilation failure due to time-out or size limit. + return 0.0;//max(mp(p.y*10.0),mp(p.z*10.0))*0.01; +} +/* +mat3 transpose(mat3 m) +{ + return mat3(vec3(m[0].x,m[1].x,m[2].x), + vec3(m[0].y,m[1].y,m[2].y), + vec3(m[0].z,m[1].z,m[2].z)); +}*/ + +float capsuleDist(vec3 p,vec3 o,vec3 d,float h0,float h1,float r0,float r1) +{ + vec3 u=cross(d,vec3(1.0,0.0,0.0)); + vec3 v=cross(u,d); + u=cross(v,d); + mat3 m=transpose(mat3(normalize(u),normalize(v),normalize(d))); + d=normalize(d); + float t=clamp(dot(p-o,d),h0,h1); + vec3 np=o+t*d; + return distance(np,p)-mix(r0,r1,t)+mosaic(m*(p-o)); +} + +float boxDist(vec3 p,vec3 s,float r) +{ + return length(max(vec3(0.0),abs(p)-s))-r+mosaic(p); +} + +float sphereDist(vec3 p,vec3 o,float r) +{ + return distance(p,o)-r+mosaic(p-o); +} + +float sceneDist(vec3 p) +{ + float d=1e3; + + p+=vec3(0.0,0.07,0.0)*scene_scale; + p=rotateYMat(3.1415926*0.5)*p; + + p.z+=cos(p.y*2.0+time)*0.1; + float tm=fract(time*wc_scale*2.0-0.1); + p.x-=(smoothstep(0.0,0.3,tm)-smoothstep(0.4,1.0,tm))*smoothstep(0.5,2.0,p.y)*0.2+scroll; + + // Leg 0 + { + float g=0.08; + vec3 o=vec3(0.0,0.0,0.2); + float d0=capsuleDist(p+o,vec3(leg0[0],0.0),vec3(leg0[1]-leg0[0],0.0),0.0,1.0-g,0.1,0.1); + float d1=capsuleDist(p+o,vec3(leg0[1],0.0),vec3(leg0[2]-leg0[1],0.0),g,1.0,0.1,0.2); + d=min(d,smin(d0,d1,15.0)); + } + + // Leg 1 + { + float g=0.08; + vec3 o=vec3(0.0,0.0,-0.2); + float d0=capsuleDist(p+o,vec3(leg1[0],0.0),vec3(leg1[1]-leg1[0],0.0),0.0,1.0-g,0.1,0.1); + float d1=capsuleDist(p+o,vec3(leg1[1],0.0),vec3(leg1[2]-leg1[1],0.0),g,1.0,0.1,0.2); + d=min(d,smin(d0,d1,15.0)); + } + + p.y-=bob; + + // Arm 0 + { + float g=0.08; + vec3 o=vec3(0.0,0.0,0.4); + mat3 m=rotateXMat(-0.3)*rotateYMat((cos((time*wc_scale+0.5)*3.1415926*2.0)-0.6)*0.5); + float d0=capsuleDist(p+o,vec3(arm0[0],0.0),m*vec3(arm0[1]-arm0[0],0.0),0.0,0.7-g,0.03,0.03); + float d1=capsuleDist(p+o,vec3(arm0[0],0.0)+m*vec3(arm0[1]-arm0[0],0.0),m*vec3(arm0[2]-arm0[1],0.0),g,0.7,0.03,0.06); + d=min(d,smin(d0,d1,15.0)); + } + + // Arm 1 + { + float g=0.08; + vec3 o=vec3(0.0,0.0,-0.4); + mat3 m=rotateXMat(0.3)*rotateYMat(-(cos(time*wc_scale*3.1415926*2.0)-0.6)*0.5); + float d0=capsuleDist(p+o,vec3(arm1[0],0.0),m*vec3(arm1[1]-arm1[0],0.0),0.0,0.7-g,0.03,0.03); + float d1=capsuleDist(p+o,vec3(arm1[0],0.0)+m*vec3(arm1[1]-arm1[0],0.0),m*vec3(arm1[2]-arm1[1],0.0),g,0.7,0.03,0.06); + d=min(d,smin(d0,d1,15.0)); + } + + // Torso + d=smin(d,boxDist(p+vec3(0.0,-0.7,0.0),vec3(0.05,0.7,0.15),0.1),15.0); + d=smin(d,boxDist(p+vec3(-0.1,-1.1,0.0),vec3(0.05,0.2,0.15)*0.1,0.1),5.0); + + // Head + d=smin(d,sphereDist(p,vec3(0.0,1.825,0.0),0.2),15.0); + + + return d; +} + +vec3 sceneNorm(vec3 p) +{ + p*=scene_scale; + float c=sceneDist(p); + float e=1e-3; + return normalize(vec3(sceneDist(p+vec3(e,0,0))-c, + sceneDist(p+vec3(0,e,0))-c, + sceneDist(p+vec3(0,0,e))-c)); +} + +float robot(vec3 ro,vec3 rd) +{ + float t=0.0; + float tm; + + tm=time*wc_scale; + + leg0[0]=vec2(0.0,bob); + leg0[2]=vec2(pyramid(tm)-0.3,-1.8+0.3*circ(tm*2.0)*step(fract(tm),0.5)); + leg0[1]=(leg0[0]+solve(leg0[2]-leg0[0],1.0,1.0,1.0)); + + arm1[0]=vec2(0.0,1.4); + arm1[2]=vec2(pyramid(tm)-0.3,0.1+pow(pyramid(tm),2.0)*0.7); + arm1[1]=(arm1[0]+solve(arm1[2]-arm1[0],0.7,0.7,-1.0)); + + tm+=0.5; + + leg1[0]=vec2(0.0,bob); + leg1[2]=vec2(pyramid(tm)-0.3,-1.8+0.3*circ(tm*2.0)*step(fract(tm),0.5)); + leg1[1]=(leg1[0]+solve(leg1[2]-leg1[0],1.0,1.0,1.0)); + + arm0[0]=vec2(0.0,1.4); + arm0[2]=vec2(pyramid(tm)-0.3,0.1+pow(pyramid(tm),2.0)*0.7); + arm0[1]=(arm0[0]+solve(arm0[2]-arm0[0],0.7,0.7,-1.0)); + + float rt=1e4; + + ro*=scene_scale; + rd*=scene_scale; + + for(int i=0;i<15;i+=1) + { + vec3 rp=ro+rd*t; + + float d=sceneDist(rp); + + if(d<1e-2) + { + rt=t; + } + + t+=d/scene_scale; + } + + + return rt; +} + + +vec2 unitSquareInterval(vec2 ro, vec2 rd) +{ + vec2 slabs0 = (vec2(+1.0) - ro) / rd; + vec2 slabs1 = (vec2(-1.0) - ro) / rd; + + vec2 mins = min(slabs0, slabs1); + vec2 maxs = max(slabs0, slabs1); + + return vec2(max(mins.x, mins.y), + min(maxs.x, maxs.y)); +} + +vec3 squaresColours(vec2 p) +{ + p+=vec2(time*0.2); + + vec3 orange=vec3(1.0,0.4,0.1)*2.0; + vec3 purple=vec3(1.0,0.2,0.5)*0.8; + + float l=pow(0.5+0.5*cos(p.x*7.0+cos(p.y)*8.0)*sin(p.y*2.0),4.0)*2.0; + vec3 c=pow(l*(mix(orange,purple,0.5+0.5*cos(p.x*40.0+sin(p.y*10.0)*3.0))+ + mix(orange,purple,0.5+0.5*cos(p.x*20.0+sin(p.y*3.0)*3.0))),vec3(1.2))*0.7; + + c+=vec3(1.0,0.8,0.4)*pow(0.5+0.5*cos(p.x*20.0)*sin(p.y*12.0),20.0)*2.0; + + c+=vec3(0.1,0.5+0.5*cos(p*20.0))*vec3(0.05,0.1,0.4).bgr*0.7; + + return c; +} + +vec3 squaresTex(vec2 p,float border) +{ + float sm=0.02; + vec2 res=vec2(8.0); + vec2 ip=floor(p*res)/res; + vec2 fp=fract(p*res); + float m=1.0-max(smoothstep(border-sm,border,abs(fp.x-0.5)),smoothstep(border-sm,border,abs(fp.y-0.5))); + m+=1.0-smoothstep(0.0,0.56,distance(fp,vec2(0.5))); + return m*squaresColours(ip); +} + +vec3 room(vec3 ro,vec3 rd,out vec3 rp,out vec3 n) +{ + vec2 box_size=vec2(1.0,5.0+3.0/8.0); + + vec2 cp=vec2(0.0),ct=vec2(1e3); + + for(int i=0;i<4;i+=1) + { + float cr=0.03; + vec2 tcp=vec2(2.5/8.0*float(-1),float(i)-2.0+0.5/8.0); + vec2 tct=intersectCircle((ro.xz-tcp)/cr,rd.xz/cr); + + if(tct.y > 0.0 && tct.y 0.0 && tct.yabs(rp.y*box_size.y)) + n.xy=vec2(rp.x/abs(rp.x),0.0); + else + n.xy=vec2(0.0,rp.y/abs(rp.y)); + + if(ct.y1e-8){ + + // Using the the distance "sDist" above to calculate the surface position. Ie: sp = ro + rd*t; + // I've hardcoded "ro" to reduce line count. Note that "ro.xy" is centered on zero. The cheap + // ray-intersection formula above relies on that. + vec3 sp = vec3(0.0, 0.0, iTime*2.) + rd*sDist; + + // The surface normal. Based on the derivative of the surface description function. See above. + //vec3 sn = normalize(vec3(-sp.xy, 0.)); // Cylinder normal. + vec3 sn = normalize(-sign(sp)*vec3(pow(abs(sp.xy)*scale, vec2(power-1.)), 0.)); // Minkowski normal. + + // Bump mapping. + // + // I wanted to make this example as simple as possible, but it's only a few extra lines. Note the larger + // "eps" number. Increasing the value spreads the samples out, which effectively blurs the result, thus + // reducing the jaggies. The downside is loss of bump precision, which isn't noticeable in this particular + // example. Decrease the value to "0.001" to see what I'm talking about. + const vec2 eps = vec2(0.025, 0.); + float c = Voronesque(sp*2.5); // Base value. Used below to color the surface. + // 3D gradient vector... of sorts. Based on the bump function. In this case, Voronoi. + vec3 gr = (vec3(Voronesque((sp-eps.xyy)*2.5), Voronesque((sp-eps.yxy)*2.5), Voronesque((sp-eps.yyx)*2.5))-c)/eps.x; + gr -= sn*dot(sn, gr); // There's a reason for this... but I need more room. :) + sn = normalize(sn + gr*0.1); // Combining the bump gradient vector with the object surface normal. + + // Lighting. + // + // The light is hovering just in front of the viewer. + vec3 lp = vec3(0.0, 0.0, iTime*2. + 3.); + vec3 ld = lp - sp; // Light direction. + float dist = max(length(ld), 0.001); // Distance from light to the surface. + ld /= dist; // Use the distance to normalize "ld." + + // Light attenuation, based on the distance above. + float atten = min(1.0/max(0.75 + dist*0.25 + dist*dist*0.05, 0.001), 1.0); + + + float diff = max(dot(sn, ld), 0.); // Diffuse light value. + float spec = pow(max(dot(reflect(-ld, sn), -rd), 0.), 16.); // Specular highlighting. + // Adding some fake, reflective environment information. + float ref = Voronesque((sp + reflect(rd, sn)*0.5)*2.5); + + // Coloring the surface with the Voronesque function that is used to bump the surface. See "bump mapping" above. + vec3 objCol = vec3(min(c*1.5, 1.), pow(c, 2.5), pow(c, 12.)); // Cheap, but effective, red palette. + //vec3 objCol = vec3(c*c*0.9, c, c*c*0.4); // Cheap green palette. + //vec3 objCol = vec3(pow(c, 1.6), pow(c, 1.7), c); // Purpley blue. + //vec3 objCol = vec3(c); // Grey scale. + + // Using the values above to produce the final color. + //col = (objCol*(diff + ref*0.25 + 0.25) + vec3(1., 0.8, 0.9)*ref*0.25 + spec*vec3(0.75, 0.9, 1.))*atten; + col = (objCol*(vec3(1.0, 0.97, 0.92)*diff + ref*0.5 + 0.25) + vec3(1., 0.8, 0.9)*ref*0.3 + vec3(1., 0.9, 0.7)*spec)*atten; + //col = ((vec3(1.0, 0.97, 0.92)*diff + ref*0.5 + 0.25)*c + vec3(1., 0.8, 0.9)*ref*0.3 + vec3(0.75, 0.9, 1.)*spec)*atten; + + + //} + + fragColor = vec4(min(col, 1.), 1.); +} + diff --git a/src/bin/geoshade/glsl/ShaderToy/VoxelPacMan.glsl b/src/bin/geoshade/glsl/ShaderToy/VoxelPacMan.glsl new file mode 100644 index 00000000..bd234fc5 --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/VoxelPacMan.glsl @@ -0,0 +1,295 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// GGGG IIIII AAA N N TTTTT PPPP AAA CCCC M M AAA N N // +// G I A A NN N T P P A A C MM MM A A NN N // +// G GG I AAAAA N N N T PPPP AAAAA C --- M M M AAAAA N N N // +// G G I A A N NN T P A A C M M A A N NN // +// GGGG IIIII A A N N T P A A CCCC M M A A N N // +// // +/////////////////////////////////////////////////////////////////////////////// + +// Parameters +#define VOXEL_RESOLUTION 1.5 +#define VOXEL_LIGHTING +#define SHADOW +#define GROUND +#define GHOST +#define MOUSE +#define HSV2RGB_FAST + +#define CAMERA_FOCAL_LENGTH 2.0 +#define DELTA 0.01 +#define RAY_LENGTH_MAX 500.0 +#define RAY_STEP_MAX 100.0 +#define AMBIENT 0.2 +#define SPECULAR_POWER 2.0 +#define SPECULAR_INTENSITY 0.3 +#define SHADOW_LENGTH 150.0 +#define SHADOW_POWER 3.0 +#define FADE_POWER 1.0 +#define BACKGROUND 0.7 +#define GLOW 0.4 +#define GAMMA 0.8 + +// Math constants +#define PI 3.14159265359 +#define SQRT3 1.73205080757 + +// Global variable to handle the glow effect +float glowCounter; + +// PRNG (from https://www.shadertoy.com/view/4djSRW) +float rand (in vec3 seed) { + seed = fract (seed * vec3 (5.3983, 5.4427, 6.9371)); + seed += dot (seed.yzx, seed.xyz + vec3 (21.5351, 14.3137, 15.3219)); + return fract (seed.x * seed.y * seed.z * 95.4337); +} + +// Distance to the voxel +float distVoxel (in vec3 p) { + + // Update the glow counter + ++glowCounter; + + // Rounded box + const float voxelRadius = 0.25; + return length (max (abs (p) - 0.5 + voxelRadius, 0.0)) - voxelRadius; +} + +// Distance to the scene and color of the closest point +vec2 distScene (in vec3 p, out vec3 P) { + + // Update the glow counter + ++glowCounter; + + // Scaling + p *= VOXEL_RESOLUTION; + + // Velocity, period of the waves, spacing of the gums + float v = VOXEL_RESOLUTION * floor (iTime * 100.0 / VOXEL_RESOLUTION); + const float k1 = 0.05; + const float k2 = 60.0; + + // Giant Pac-Man + float body = length (p); + body = max (body - 32.0, 27.0 - body); + float eyes = 6.0 - length (vec3 (abs (p.x) - 12.5, p.y - 19.5, p.z - 20.0)); + float mouthAngle = PI * (0.07 + 0.07 * cos (2.0 * v * PI / k2)); + float mouthTop = dot (p, vec3 (0.0, -cos (mouthAngle), sin (mouthAngle))) - 2.0; + mouthAngle *= 2.5; + float mouthBottom = dot (p, vec3 (0.0, cos (mouthAngle), sin (mouthAngle))); + float pacMan = max (max (body, eyes), min (mouthTop, mouthBottom)); + vec2 d = vec2 (pacMan, 0.13); + P = p; + + // Gums + vec3 q = vec3 (p.xy, mod (p.z + v, k2) - k2 * 0.5); + float gum = max (length (q) - 6.0, -p.z); + if (gum < d.x) { + d = vec2 (gum, 0.35); + P = q; + } + + // Ground + #ifdef GROUND + q = vec3 (p.xy, p.z + v); + float ground = (q.y + 50.0 + 14.0 * cos (q.x * k1) * cos (q.z * k1)) * 0.7; + if (ground < d.x) { + d = vec2 (ground, 0.55); + P = q; + } + #endif + + // Ghost + #ifdef GHOST + v = VOXEL_RESOLUTION * floor ((130.0 + 60.0 * cos (iTime * 3.0)) / VOXEL_RESOLUTION); + q = vec3 (p.xy, p.z + v); + body = length (vec3 (q.x, max (q.y - 4.0, 0.0), q.z)); + body = max (body - 28.0, 22.0 - body); + eyes = 8.0 - length (vec3 (abs (q.x) - 12.0, q.y - 10.0, q.z - 22.0)); + float bottom = (q.y + 28.0 + 4.0 * cos (p.x * 0.4) * cos (p.z * 0.4)) * 0.7; + float ghost = max (max (body, eyes), -bottom); + if (ghost < d.x) { + d = vec2 (ghost, 0.76); + P = q; + } + #endif + + // Scaling + d.x /= VOXEL_RESOLUTION; + return d; +} + +// Distance to the (voxelized?) scene +vec4 dist (inout vec3 p, in vec3 ray, in float voxelized, in float rayLengthMax) { + vec3 P = p; + vec2 d = vec2 (1.0 / 0.0, 0.0); + float rayLength = 0.0; + float rayLengthInVoxel = 0.0; + float rayLengthCheckVoxel = 0.0; + vec3 raySign = sign (ray); + vec3 rayDeltaVoxel = raySign / ray; + for (float rayStep = 0.0; rayStep < RAY_STEP_MAX; ++rayStep) { + if (rayLength < rayLengthInVoxel) { + d.x = distVoxel (fract (p + 0.5) - 0.5); + if (d.x < DELTA) { + break; + } + } else if (rayLength < rayLengthCheckVoxel) { + vec3 rayDelta = (0.5 - raySign * (fract (p + 0.5) - 0.5)) * rayDeltaVoxel; + float dNext = min (rayDelta.x, min (rayDelta.y, rayDelta.z)); + d = distScene (floor (p + 0.5), P); + if (d.x < 0.0) { + rayDelta = rayDeltaVoxel - rayDelta; + d.x = max (rayLengthInVoxel - rayLength, DELTA - min (rayDelta.x, min (rayDelta.y, rayDelta.z))); + rayLengthInVoxel = rayLength + dNext; + } else { + d.x = DELTA + dNext; + } + } else { + d = distScene (p, P); + if (voxelized > 0.5) { + if (d.x < SQRT3 * 0.5) { + rayLengthCheckVoxel = rayLength + abs (d.x) + SQRT3 * 0.5; + d.x = max (rayLengthInVoxel - rayLength + DELTA, d.x - SQRT3 * 0.5); + } + } else if (d.x < DELTA) { + break; + } + } + rayLength += d.x; + if (rayLength > rayLengthMax) { + break; + } + p += d.x * ray; + } + return vec4 (d, rayLength, rand (P)); +} + +// Normal at a given point +vec3 normal (in vec3 p, in float voxelized) { + vec2 h = vec2 (DELTA, -DELTA); + vec3 n; + if (voxelized > 0.5) { + p = fract (p + 0.5) - 0.5; + n = h.xxx * distVoxel (p + h.xxx) + + h.xyy * distVoxel (p + h.xyy) + + h.yxy * distVoxel (p + h.yxy) + + h.yyx * distVoxel (p + h.yyx); + } else { + n = h.xxx * distScene (p + h.xxx, n).x + + h.xyy * distScene (p + h.xyy, n).x + + h.yxy * distScene (p + h.yxy, n).x + + h.yyx * distScene (p + h.yyx, n).x; + } + return normalize (n); +} + +// HSV to RGB +vec3 hsv2rgb (in vec3 hsv) { + #ifdef HSV2RGB_SAFE + hsv.yz = clamp (hsv.yz, 0.0, 1.0); + #endif + #ifdef HSV2RGB_FAST + return hsv.z * (1.0 + 0.5 * hsv.y * (cos (2.0 * PI * (hsv.x + vec3 (0.0, 2.0 / 3.0, 1.0 / 3.0))) - 1.0)); + #else + return hsv.z * (1.0 + hsv.y * clamp (abs (fract (hsv.x + vec3 (0.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 2.0, -1.0, 0.0)); + #endif +} + +// Main function +void mainImage (out vec4 fragColor, in vec2 fragCoord) { + + // Get the fragment + vec2 frag = (2.0 * fragCoord.xy - iResolution.xy) / iResolution.y; + + // Define the rendering mode + float modeTiming = iTime * 0.234; + float modeAngle = PI * cos (iTime * 0.2); + modeAngle = dot (frag - vec2 (cos (iTime * 2.0), 0.0), vec2 (cos (modeAngle), sin (modeAngle))); + float modeVoxel = step (0.5, fract (modeTiming / (4.0 * PI))); + modeTiming = cos (modeTiming); + float mode3D = smoothstep (0.8, 0.5, modeTiming); + float modeSwitch = smoothstep (0.995, 1.0, modeTiming) + smoothstep (0.02, 0.0, abs (modeAngle)) * (1.0 - modeVoxel); + modeVoxel += step (0.0, modeAngle) * (1.0 - modeVoxel); + + // Define the ray corresponding to this fragment + vec3 ray = normalize (vec3 (frag, mix (8.0, CAMERA_FOCAL_LENGTH, mode3D))); + + // Compute the orientation of the camera + float yawAngle = PI * (1.2 + 0.2 * cos (iTime * 0.5)); + float pitchAngle = PI * (0.1 * cos (iTime * 0.3) - 0.05); + #ifdef MOUSE + yawAngle += 4.0 * PI * iMouse.x / iResolution.x; + pitchAngle += PI * 0.3 * (1.0 - iMouse.y / iResolution.y); + #endif + yawAngle = mix (PI * 1.5, yawAngle, mode3D); + pitchAngle *= mode3D; + + float cosYaw = cos (yawAngle); + float sinYaw = sin (yawAngle); + float cosPitch = cos (pitchAngle); + float sinPitch = sin (pitchAngle); + + mat3 cameraOrientation; + cameraOrientation [0] = vec3 (cosYaw, 0.0, -sinYaw); + cameraOrientation [1] = vec3 (sinYaw * sinPitch, cosPitch, cosYaw * sinPitch); + cameraOrientation [2] = vec3 (sinYaw * cosPitch, -sinPitch, cosYaw * cosPitch); + + ray = cameraOrientation * ray; + + // Compute the origin of the ray + float cameraDist = mix (300.0, 95.0 + 50.0 * cos (iTime * 0.8), mode3D); + vec3 origin = (vec3 (0.0, 0.0, 40.0 * sin (iTime * 0.2)) - cameraOrientation [2] * cameraDist) / VOXEL_RESOLUTION; + + // Compute the distance to the scene + glowCounter = 0.0; + vec4 d = dist (origin, ray, modeVoxel, RAY_LENGTH_MAX / VOXEL_RESOLUTION); + + // Set the background color + vec3 finalColor = hsv2rgb (vec3 (0.2 * ray.y + 0.4 * modeVoxel - 0.37, 1.0, mode3D * BACKGROUND)); + vec3 glowColor = GLOW * vec3 (1.0, 0.3, 0.0) * glowCounter / RAY_STEP_MAX; + if (d.x < DELTA) { + + // Set the object color + vec3 color = hsv2rgb (vec3 (d.y + 0.1 * d.w * modeVoxel, 0.5 + 0.5 * modeVoxel, 1.0)); + + // Lighting + vec3 l = normalize (mix (vec3 (1.0, 0.0, 0.0), vec3 (1.25 + cos (iTime * 0.2), 1.0, 1.0), mode3D)); + #ifdef VOXEL_LIGHTING + if (modeVoxel > 0.5) { + vec3 n = normal (floor (origin + 0.5), 0.0); + float diffuse = max (0.0, dot (n, l)); + float specular = pow (max (0.0, dot (reflect (ray, n), l)), SPECULAR_POWER) * SPECULAR_INTENSITY; + color = (AMBIENT + diffuse) * color + specular; + } + #endif + vec3 n = normal (origin, modeVoxel); + float diffuse = dot (n, l); + float specular; + if (diffuse < 0.0) { + diffuse = 0.0; + specular = 0.0; + } else { + specular = pow (max (0.0, dot (reflect (ray, n), l)), SPECULAR_POWER) * SPECULAR_INTENSITY; + #ifdef SHADOW + origin += n * DELTA * 2.0; + vec4 shadow = dist (origin, l, modeVoxel, SHADOW_LENGTH / VOXEL_RESOLUTION); + if (shadow.x < DELTA) { + shadow.z = pow (min (1.0, shadow.z * VOXEL_RESOLUTION / SHADOW_LENGTH), SHADOW_POWER); + diffuse *= shadow.z; + specular *= shadow.z; + } + #endif + } + color = (AMBIENT + diffuse) * color + specular; + + // Fading + float fade = pow (max (0.0, 1.0 - d.z * VOXEL_RESOLUTION / RAY_LENGTH_MAX), FADE_POWER); + finalColor = mix (finalColor, color, fade); + } + + // Set the fragment color + finalColor = mix (pow (finalColor, vec3 (GAMMA)) + glowColor, vec3 (1.0), modeSwitch); + fragColor = vec4 (finalColor, 1.0); +} diff --git a/src/bin/geoshade/glsl/ShaderToy/Voxels.glsl b/src/bin/geoshade/glsl/ShaderToy/Voxels.glsl new file mode 100644 index 00000000..099cb3e2 --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/Voxels.glsl @@ -0,0 +1,333 @@ +// voxels! +// @simesgreen + +// CSG operations +float _union(float a, float b) +{ + return min(a, b); +} + +float intersect(float a, float b) +{ + return max(a, b); +} + +float diff(float a, float b) +{ + return max(a, -b); +} + +// primitive functions +// these all return the distance to the surface from a given point + +float plane(vec3 p, vec3 planeN, vec3 planePos) +{ + return dot(p - planePos, planeN); +} + +float box( vec3 p, vec3 b ) +{ + vec3 d = abs(p) - b; + return min(max(d.x,max(d.y,d.z)),0.0) + + length(max(d,0.0)); +} + +float sphere(vec3 p, float r) +{ + return length(p) - r; +} + +// http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm + +float sdCone( vec3 p, vec2 c ) +{ + // c must be normalized + float q = length(p.xz); + return dot(c, vec2(q, p.y)); +} + +float sdTorus( vec3 p, vec2 t ) +{ + vec2 q = vec2(length(p.xz)-t.x,p.y); + return length(q)-t.y; +} + +// transforms +vec3 rotateX(vec3 p, float a) +{ + float sa = sin(a); + float ca = cos(a); + vec3 r; + r.x = p.x; + r.y = ca*p.y - sa*p.z; + r.z = sa*p.y + ca*p.z; + return r; +} + +vec3 rotateY(vec3 p, float a) +{ + float sa = sin(a); + float ca = cos(a); + vec3 r; + r.x = ca*p.x + sa*p.z; + r.y = p.y; + r.z = -sa*p.x + ca*p.z; + return r; +} + +// distance to scene +float scene(vec3 p) +{ + float d; + //d = box(p, vec3(1.0)); + //p.z += sin(time)*1.5; + //d = diff( d, sphere(p, sin(time*0.5)*1.5) ); + + //d = sphere(p, 1.0); + d = sphere(p, sin(iTime)*0.5+0.5); + + vec3 pr = p - vec3(1.5, 0.0, 0.0); + pr = rotateX(pr, iTime); + pr = rotateY(pr, iTime*0.3); + d= _union(d, diff(box(pr , vec3(0.6)), sphere(pr, 0.7)) ); + + //d = _union(d, sdCone(p + vec3(1.5, -0.5, 0.0), vec2(1.0, 0.5))); + pr = p + vec3(1.5, 0.0, 0.0); + pr = rotateX(pr, iTime); + d = _union(d, sdTorus(pr, vec2(0.5, 0.25))); + + d = _union(d, plane(p, vec3(0.0, 1.0, 0.0), vec3(0.0, -1.0, 0.0)) ); + return d; +} + +// calculate scene normal +vec3 sceneNormal(vec3 pos ) +{ + float eps = 0.0001; + vec3 n; +#if 0 + n.x = scene( vec3(pos.x+eps, pos.y, pos.z) ) - scene( vec3(pos.x-eps, pos.y, pos.z) ); + n.y = scene( vec3(pos.x, pos.y+eps, pos.z) ) - scene( vec3(pos.x, pos.y-eps, pos.z) ); + n.z = scene( vec3(pos.x, pos.y, pos.z+eps) ) - scene( vec3(pos.x, pos.y, pos.z-eps) ); +#else + float d = scene(pos); + n.x = scene( vec3(pos.x+eps, pos.y, pos.z) ) - d; + n.y = scene( vec3(pos.x, pos.y+eps, pos.z) ) - d; + n.z = scene( vec3(pos.x, pos.y, pos.z+eps) ) - d; +#endif + return normalize(n); +} + +// ambient occlusion approximation +float ambientOcclusion(vec3 p, vec3 n) +{ + const int steps = 3; + const float delta = 0.5; + + float a = 0.0; + float weight = 1.0; + for(int i=1; i<=steps; i++) { + float d = (float(i) / float(steps)) * delta; + a += weight*(d - scene(p + n*d)); + weight *= 0.5; + } + return clamp(1.0 - a, 0.0, 1.0); +} + +// lighting +vec3 shade(vec3 pos, vec3 n, vec3 eyePos) +{ + const vec3 lightPos = vec3(4.0, 3.0, 5.0); + const vec3 color = vec3(1.0, 1.0, 0.0); + const float shininess = 40.0; + + vec3 l = normalize(lightPos - pos); + vec3 v = normalize(eyePos - pos); + vec3 h = normalize(v + l); + float diff = dot(n, l); + float spec = max(0.0, pow(dot(n, h), shininess)) * float(diff > 0.0); + diff = max(0.0, diff); + //diff = 0.5+0.5*diff; + + float fresnel = pow(1.0 - dot(n, v), 5.0); + float ao = ambientOcclusion(pos, n); + +// return vec3(diff); +// return vec3(diff*ao)*color + vec3(spec + fresnel*0.5); + return vec3(diff*ao)*color; +// return vec3(diff*ao)*color + vec3(spec); +// return vec3(ao); +// return vec3(fresnel); +} + +// trace ray using sphere tracing +vec3 trace(vec3 ro, vec3 rd, out bool hit) +{ + const int maxSteps = 128; + const float hitThreshold = 0.001; + hit = false; + vec3 pos = ro; + vec3 hitPos = ro; + + for(int i=0; i 0.0, rd.y > 0.0, rd.z > 0.0); + vec3 tMax = (voxelToWorld(nearestVoxel) - ro) / rd; + vec3 tDelta = voxelSize / abs(rd); + + vec3 hitVoxel = voxel; + + hit = false; + float hitT = 0.0; + for(int i=0; i= size.width) || + (voxel.y < 0) || (voxel.y >= size.height) || + (voxel.z < 0) || (voxel.z >= size.depth)) { + break; + } +#endif + } + + //return voxelToWorld(hitVoxel); + return ro + hitT*rd; +} + + +vec3 background(vec3 rd) +{ + //return mix(vec3(1.0), vec3(0.0), rd.y); + return mix(vec3(1.0, 1.0, 1.0), vec3(0.0, 0.5, 1.0), abs(rd.y)); + //return vec3(0.0); +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 pixel = (fragCoord.xy / iResolution.xy)*2.0-1.0; + + // compute ray origin and direction + float asp = iResolution.x / iResolution.y; + vec3 rd = normalize(vec3(asp*pixel.x, pixel.y, -2.0)); + vec3 ro = vec3(0.0, 0.0, 4.0); + ro += rd*2.0; + + vec2 mouse = iMouse.xy / iResolution.xy; + + vec2 a = vec2(0.0, 0.0); + if (iMouse.x > 0.0) { + a.x = -(1.0 - mouse.y)*1.5; + a.y = 4.5 -(mouse.x-0.5)*3.0; + } + + rd = rotateX(rd, a.x); + ro = rotateX(ro, a.x); + + rd = rotateY(rd, a.y); + ro = rotateY(ro, a.y); + + // trace ray + bool hit; + //vec3 pos = trace(ro, rd, hit); + vec3 n; + vec3 pos = voxelTrace(ro, rd, hit, n); + + vec3 rgb; + if(hit) + { + // calc normal + //vec3 n = sceneNormal(pos); + + // shade + rgb = shade(pos, n, ro); + +#if 0 + // reflection + vec3 v = normalize(ro - pos); + float fresnel = 0.1 + 0.9*pow(1.0 - dot(n, v), 5.0); + + ro = pos + n*0.2; // offset to avoid self-intersection + rd = reflect(-v, n); + //pos = trace(ro, rd, hit); + pos = voxelTrace(ro, rd, hit, n); + + if (hit) { + //vec3 n = sceneNormal(pos); + rgb += shade(pos, n, ro) * vec3(fresnel); + } else { + rgb += background(rd) * vec3(fresnel); + } +#endif + + } else { + rgb = background(rd); + } + + // vignetting + //rgb *= 0.5+0.5*smoothstep(2.0, 0.5, dot(pixel, pixel)); + + fragColor=vec4(rgb, 1.0); +} diff --git a/src/bin/geoshade/glsl/ShaderToy/rabbit.glsl b/src/bin/geoshade/glsl/ShaderToy/rabbit.glsl new file mode 100644 index 00000000..cdfc22cc --- /dev/null +++ b/src/bin/geoshade/glsl/ShaderToy/rabbit.glsl @@ -0,0 +1,213 @@ +float time; + +// polynomial smooth min (k = 0.1) (from IQ) +float smin( float a, float b, float k ) +{ + float h = clamp( 0.5+0.5*(b-a)/k, 0.0, 1.0 ); + return mix( b, a, h ) - k*h*(1.0-h); +} + + +float smax(float a,float b, float k) +{ + return -smin(-a,-b,k); +} + +mat2 rotmat(float a) +{ + return mat2(cos(a),sin(a),-sin(a),cos(a)); +} + +float cylinder(vec3 p,vec3 dir,float h,float r) +{ + float t=dot(p,dir); + float d=distance(p,dir*t); + return length(max(abs(vec2(d,t))-vec2(r,h),vec2(0))); + d=max(d,-t); + d=max(d,t-h); + return d; +} + +float pupdist=1e4; + +float rabdist(vec3 p) +{ + float an=.5*.5*2.*6. +iMouse.x/iResolution.x*6.; + p.xz=mat2(cos(an),sin(an),sin(an),-cos(an))*p.xz; + + float time2=time*2.4; + + p.y+=2.3; + p.xy*=rotmat(cos(time2+1.)*.04); + p.y-=2.3; + + vec3 op=p; + + vec3 p2=p; + p2.xy*=rotmat(cos(time2)*.1); + + vec3 p3=p; + p3.xy*=rotmat(cos(time2-.0-length(p)/2.)*.13); + + float d=1e4; + p.x=abs(p.x); + p2.x=abs(p2.x); + p3.x=abs(p3.x); + + d=smin(length(p2-vec3(-.75,0.,-.1))-.4,length(p2-vec3(.75,0.,-.1))-.5,2.); + d=smin(d,length(p2-vec3(0,0.4,-.1))-.9,1.6); + d+=.1; + // ears 1 + d=smin(d,distance(vec3(.7,clamp(p3.y,0.,2.2),0.),p3.xyz)-.4,.14); + d=smax(d,-(length(p3-vec3(.7,1.7,-0.5))-.5),.2); + + d=smin(d,distance(vec3(0.,clamp(p.y,-1.6,-1.1),0.),p.xyz)-.6,.04); + d=smin(d,distance(vec3(.3,clamp(p.y,-2.6,-1.5),0.),p.xyz)-.3,.1); + d=smin(d,distance(vec3(0.,-1.5,-.2),p)-.5+cos(time*3.)*.03,.4); + + // ears 2 + d=smin(d,distance(vec3(1.1,2.3,-.1),p3)-.2,.8); + + // tail + d=smin(d,distance(vec3(0,-1.7,.6),p)-.3,.1); + + vec3 q=vec3(0.35,.4,-1); + + if(mod(time-1.,4.)>.04) + { + d=smax(d,-(cylinder(p2-q,normalize(q-p2),.3,.1)-.0001),.05); + d=smin(d,(length(p2-q*.9)-.2),.24); + + // eye pupils + if(op.x>0.) + pupdist=(length(p2-vec3(.39,.32,-1.))-.2); + else + pupdist=(length(p2-vec3(.28,.32,-1.02))-.2); + + d=smin(d,pupdist,.005); + } + + // nose + d=smin(d,(length(p2-vec3(0,.1,-1.02))-.2),.02); + + float d3=smax(-(length(p-vec3(-.05,-.29,-1.02))-.1),-(length(p-vec3(.05,-.29,-1.02))-.1),.1); + + float d2=max(p2.z,distance(p2,vec3(clamp(p2.x,0.,.3),-.2,clamp(p2.z,-2.,2.)))+.01); + + float time4=time/8.; + float gg=smoothstep(0.,1.,clamp((min(fract(time4),1.-fract(time4))-.25)*64.,0.,1.)); + d=smax(d,mix(-d2,d3,gg),.1); + + // tooth + d=min(d,(length(p-vec3(.0,-.2,-1.02))-.08)); + + p.y+=.2; + p.xy*=rotmat(.4+cos(time2*2.)*.02); + + // arms + float armd=smin(distance(vec3(.2,clamp(p.y,-1.8,-0.),0.),p.xyz)-.2, + distance(p,vec3(0.2,-1.7,0))-.2,.2); + + d=smin(d,armd,.05); + + return d; +} + +float floordist(vec3 p) +{ + return p.y+2.85; +} + +float f(vec3 p) +{ + return min(rabdist(p),floordist(p)); +} + +float sceneDist(vec3 p) { return f(p); } + +vec3 sceneNorm(vec3 p) +{ + vec3 e=vec3(1e-2,0,0); + float d = sceneDist(p); + return normalize(vec3(sceneDist(p + e.xyy) - d, sceneDist(p + e.yxy) - d, + sceneDist(p + e.yyx) - d)); +} + + +// from simon green and others +float ambientOcclusion(vec3 p, vec3 n) +{ + const int steps = 18; + const float delta = 1.5; + + float a = 0.0; + float weight = .5; + for(int i=1; i<=steps; i++) { + float d = (float(i) / float(steps)) * delta; + a += weight*(d - sceneDist(p + n*d)); + weight *= 0.6; + } + return clamp(1.0 - a, 0.0, 1.0); +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 uv = (fragCoord/iResolution.xy * 2. - 1.) * .75; + uv.x *= iResolution.x / iResolution.y; + vec2 vt=uv; + float an; + time=iTime; + + vec3 ro=vec3(0.,-.1,-8.+iMouse.y/iResolution.y*2.); + vec3 rd=normalize(vec3(uv,1.8)); + + + float s=20.; + + float t=2.,d=0.; + for(int i=0;i<120;++i) + { + d=f(ro+rd*t); + if(d<1e-4)break; + if(t>50.)break; + t+=d; + } + + float d2=f(ro+rd*t+normalize(vec3(1,2,-2))*5e-2); + float l=.5+.5*(d2-d)/5e-2; + + vec3 rp=(ro+rd*t); + + vec3 n=sceneNorm(rp); + + vec3 col=vec3(1); + + col*=mix(.1,1.,smoothstep(0.0,.01,pupdist)); + + vec3 bcol=vec3(1,.4,.18); + + if(floordist(rp).99999) + { + col*=pow(ambientOcclusion(rp,n),1.); + col*=mix(.7,1.,smoothstep(0.,2.,length(rp.xz))); + } + else + { + // vec3 r=reflect(rd,n); + // col += texture(iChannel0, r).rgb*.2*pow(clamp(0.,1.,1.-dot(-rd,n)),2.); + // col*=pow(ambientOcclusion(rp,n),2.); + } + + fragColor.rgb=max(col,0.); + fragColor.rgb=sqrt(fragColor.rgb+.01); +} + + diff --git a/src/bin/geoshade/glsl/course/raytrace_step1.glsl b/src/bin/geoshade/glsl/course/raytrace_step1.glsl new file mode 100644 index 00000000..aa92ee4f --- /dev/null +++ b/src/bin/geoshade/glsl/course/raytrace_step1.glsl @@ -0,0 +1,78 @@ +const float FARAWAY=1e30; +const float EPSILON=1e-6; + +struct Camera { + vec3 Obs; + vec3 View; + vec3 Up; + vec3 Horiz; + float H; + float W; + float z; +}; + +struct Ray { + vec3 Origin; + vec3 Dir; +}; + +Camera camera(in vec3 Obs, in vec3 LookAt, in float aperture) { + Camera C; + C.Obs = Obs; + C.View = normalize(LookAt - Obs); + C.Horiz = normalize(cross(vec3(0.0, 0.0, 1.0), C.View)); + C.Up = cross(C.View, C.Horiz); + C.W = float(iResolution.x); + C.H = float(iResolution.y); + C.z = (C.H/2.0) / tan((aperture * 3.1415 / 180.0) / 2.0); + return C; +} + +Ray launch(in Camera C, in vec2 XY) { + return Ray( + C.Obs, + C.z*C.View+(XY.x-C.W/2.0)*C.Horiz+(XY.y-C.H/2.0)*C.Up + ); +} + + +struct Sphere { + vec3 Center; + float R; +}; + +bool intersect_sphere(in Ray R, in Sphere S, out float t) { + vec3 CO = R.Origin - S.Center; + float a = dot(R.Dir, R.Dir); + float b = 2.0*dot(R.Dir, CO); + float c = dot(CO, CO) - S.R*S.R; + float delta = b*b - 4.0*a*c; + if(delta < 0.0) { + return false; + } + t = (-b-sqrt(delta)) / (2.0*a); + return true; +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) { + + Camera C = camera( + vec3(2.0, 2.0, 1.5), + vec3(0.5, 0.5, 0.5), + 50.0 + ); + Ray R = launch(C, fragCoord); + Sphere S = Sphere(vec3(0.0, 0.0, 0.0), 0.5); + + fragColor = vec4(0.5, 0.5, 1.0, 1.0); + + float t; + if(intersect_sphere(R,S,t)) { + fragColor = vec4(1.0, 1.0, 1.0, 1.0); + } + +} + + + + diff --git a/src/bin/geoshade/glsl/course/raytrace_step2.glsl b/src/bin/geoshade/glsl/course/raytrace_step2.glsl new file mode 100644 index 00000000..844fb5a7 --- /dev/null +++ b/src/bin/geoshade/glsl/course/raytrace_step2.glsl @@ -0,0 +1,92 @@ +const float FARAWAY=1e30; +const float EPSILON=1e-6; + +struct Camera { + vec3 Obs; + vec3 View; + vec3 Up; + vec3 Horiz; + float H; + float W; + float z; +}; + +struct Ray { + vec3 Origin; + vec3 Dir; +}; + +Camera camera(in vec3 Obs, in vec3 LookAt, in float aperture) { + Camera C; + C.Obs = Obs; + C.View = normalize(LookAt - Obs); + C.Horiz = normalize(cross(vec3(0.0, 0.0, 1.0), C.View)); + C.Up = cross(C.View, C.Horiz); + C.W = float(iResolution.x); + C.H = float(iResolution.y); + C.z = (C.H/2.0) / tan((aperture * 3.1415 / 180.0) / 2.0); + return C; +} + +Ray launch(in Camera C, in vec2 XY) { + return Ray( + C.Obs, + C.z*C.View+(XY.x-C.W/2.0)*C.Horiz+(XY.y-C.H/2.0)*C.Up + ); +} + +struct Sphere { + vec3 Center; + float R; +}; + +bool intersect_sphere(in Ray R, in Sphere S, out float t) { + vec3 CO = R.Origin - S.Center; + float a = dot(R.Dir, R.Dir); + float b = 2.0*dot(R.Dir, CO); + float c = dot(CO, CO) - S.R*S.R; + float delta = b*b - 4.0*a*c; + if(delta < 0.0) { + return false; + } + t = (-b-sqrt(delta)) / (2.0*a); + return true; +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) { + + float alpha = float(iFrame)/30.0; + float s = sin(alpha); + float c = cos(alpha); + + + Camera C = camera( + vec3(2.0, 2.0, 1.5), + vec3(0.5, 0.5, 0.5), + 50.0 + ); + Ray R = launch(C, fragCoord); + Sphere S1 = Sphere(vec3(0.0, 0.0, 0.0), 0.5); + Sphere S2 = Sphere(vec3(0.7*c, 0.7*s, 0.0), 0.3); + + fragColor = vec4(0.5, 0.5, 1.0, 1.0); + + float t = FARAWAY; + float t1; + if(intersect_sphere(R,S1,t1) && t1 < t) { + fragColor = vec4(1.0, 1.0, 1.0, 1.0); + t = t1; + } + float t2; + if(intersect_sphere(R,S2,t2) && t2 < t) { + fragColor = vec4(1.0, 0.0, 0.0, 1.0); + t = t2; + } + + +} + + + + + diff --git a/src/bin/geoshade/glsl/course/raytrace_step3.glsl b/src/bin/geoshade/glsl/course/raytrace_step3.glsl new file mode 100644 index 00000000..328c05b3 --- /dev/null +++ b/src/bin/geoshade/glsl/course/raytrace_step3.glsl @@ -0,0 +1,168 @@ +const float FARAWAY=1e30; +const float EPSILON=1e-3; + +struct Camera { + vec3 Obs; + vec3 View; + vec3 Up; + vec3 Horiz; + float H; + float W; + float z; +}; + +struct Ray { + vec3 Origin; + vec3 Dir; +}; + +Camera camera(in vec3 Obs, in vec3 LookAt, in float aperture) { + Camera C; + C.Obs = Obs; + C.View = normalize(LookAt - Obs); + C.Horiz = normalize(cross(vec3(0.0, 0.0, 1.0), C.View)); + C.Up = cross(C.View, C.Horiz); + C.W = float(iResolution.x); + C.H = float(iResolution.y); + C.z = (C.H/2.0) / tan((aperture * 3.1415 / 180.0) / 2.0); + return C; +} + +Ray launch(in Camera C, in vec2 XY) { + return Ray( + C.Obs, + C.z*C.View+(XY.x-C.W/2.0)*C.Horiz+(XY.y-C.H/2.0)*C.Up + ); +} + +struct Sphere { + vec3 Center; + float R; +}; + +struct Material { + vec3 Kd; // diffuse color + vec3 Ke; // emissive color +}; + +Material diffuse(in vec3 Kd) { + return Material(Kd, vec3(0.0, 0.0, 0.0)); +} + +Material light(in vec3 Ke) { + return Material(vec3(0.0, 0.0, 0.0), Ke); +} + +struct Object { + Sphere sphere; + Material material; +}; + +Object scene[3]; + +void init_scene() { + float beta = float(iFrame)/30.0; + float s = sin(beta); + float c = cos(beta); + + scene[0] = Object( + Sphere(vec3(0.0, 0.0, 0.0),0.5), + diffuse(vec3(1.0, 1.0, 1.0)) + ); + + scene[1] = Object( + Sphere(vec3(0.7*s, 0.7*c, 0.0),0.1), + diffuse(vec3(1.0, 0.0, 0.0)) + ); + + scene[2] = Object( + Sphere(vec3(5.0, 0.0, 3.0),0.02), + light(vec3(1.0, 1.0, 1.0)) + ); + +// scene[3] = Object( +// Sphere(vec3(1.5, 0.0, 1.5),0.02), +// light(vec3(1.0, 1.0, 1.0)) +// ); + + +} + +bool intersect_sphere(in Ray R, in Sphere S, out float t) { + vec3 CO = R.Origin - S.Center; + float a = dot(R.Dir, R.Dir); + float b = 2.0*dot(R.Dir, CO); + float c = dot(CO, CO) - S.R*S.R; + float delta = b*b - 4.0*a*c; + if(delta < 0.0) { + return false; + } + t = (-b-sqrt(delta)) / (2.0*a); + return true; +} + +vec3 lighting(in vec3 P, in vec3 N, in Material material) { + if(material.Ke != vec3(0.0, 0.0, 0.0)) { + return material.Ke; + } + + vec3 result = vec3(0.0, 0.0, 0.0); + + for(int i=0; i EPSILON && t < 1.0 + ) { + return true; + } + } + return false; +} + +vec3 lighting(in vec3 P, in vec3 N, in Material material) { + if(material.Ke != vec3(0.0, 0.0, 0.0)) { + return material.Ke; + } + + vec3 result = vec3(0.0, 0.0, 0.0); + + for(int i=0; i EPSILON && t < 1.0 + ) { + return true; + } + } + return false; +} + +vec3 lighting(in vec3 P, in vec3 N, in Material material) { + if(material.Ke != vec3(0.0, 0.0, 0.0)) { + return material.Ke; + } + + vec3 result = vec3(0.0, 0.0, 0.0); + + for(int i=0; i EPSILON && t < 1.0 + ) { + return true; + } + } + return false; +} + +vec3 lighting(in vec3 P, in vec3 N, in Material material) { + if(material.Ke != vec3(0.0, 0.0, 0.0)) { + return material.Ke; + } + + vec3 result = vec3(0.0, 0.0, 0.0); + + for(int i=0; i EPSILON && cur_t > 0.0 + ) { + t = cur_t; + P = R.Origin + t*R.Dir; + N = normalize(P - scene[i].sphere.Center); + material = scene[i].material; + } + } + return (t != FARAWAY); +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) { + + init_scene(); + + Camera C = camera( + vec3(2.0, 2.0, 1.5), + vec3(0.5, 0.5, 0.5), + 50.0 + ); + Ray R = launch(C, fragCoord); + + + fragColor = vec4(0.5, 0.5, 1.0, 1.0); + + + vec3 P; // Point courant + vec3 N; // Normale + Material material; // Couleur + + if(nearest_intersection(R, P, N, material)) { + fragColor.rgb = lighting(P,N,material); + if(material.Kr != zero3) { + vec3 Kr = material.Kr; + R = reflect_ray(R, P, N); + if(nearest_intersection(R, P, N, material)) { + fragColor.rgb = + Kr*lighting(P,N,material); + } else { + fragColor = vec4(0.5, 0.5, 1.0, 1.0); + } + + } + } + +} + + + + + + + + diff --git a/src/bin/geoshade/glsl/course/raytrace_step7.glsl b/src/bin/geoshade/glsl/course/raytrace_step7.glsl new file mode 100644 index 00000000..b1e0b508 --- /dev/null +++ b/src/bin/geoshade/glsl/course/raytrace_step7.glsl @@ -0,0 +1,324 @@ +const float FARAWAY=1e30; +const float EPSILON=1e-6; + +// The viewing parameters +// Gathers all parameters needed to launch primary rays +struct Camera { + vec3 Obs; // The position of the observer + vec3 View; // Unit vector, points to the target + vec3 Up; // Unit vector, vertical direction + vec3 Horiz; // Unit vector, horizontal direction + float H; // Screen height in pixels + float W; // Screen width in pixel + float z; // offset of the screen along View +}; + +// \brief A ray, in parametric form. +struct Ray { + vec3 Origin; + vec3 Dir; +}; + +// \brief Initializes a Camera +// \param[in] Obs the position of the observer +// \param[in] Target the point that will be in the center +// \param[in] aperture the aperture angle in degrees +// \return the initialized Camera +Camera camera(in vec3 Obs, in vec3 Target, in float aperture) { + Camera C; + C.Obs = Obs; + C.View = normalize(Target - Obs); + C.Horiz = normalize(cross(vec3(0.0, 0.0, 1.0), C.View)); + C.Up = cross(C.View, C.Horiz); + C.W = float(iResolution.x); + C.H = float(iResolution.y); + C.z = (C.H/2.0) / tan((aperture * 3.1415 / 180.0) / 2.0); + return C; +} + +// \brief Launches a primary Ray +// \param[in] C the Camera +// \param[in] XY the pixel coordinates in [0,W-1] x [0,H-1] +Ray launch(in Camera C, in vec2 XY) { + return Ray( + C.Obs, + C.z*C.View+(XY.x-C.W/2.0)*C.Horiz+(XY.y-C.H/2.0)*C.Up + ); +} + +// \brief A sphere, defined by its center and radius +struct Sphere { + vec3 Center; + float R; +}; + +// \brief Material gathers all shading properties +struct Material { + vec3 Kd; // diffuse color + vec3 Ke; // emissive color + vec3 Kr; // reflective material + float checker; // checkerboard size + vec3 Ks; // specular + float s; // specular factor +}; + +// \brief Shorthand for the zero vector +const vec3 zero3 = vec3(0.0, 0.0, 0.0); + +// \brief Creates a diffuse material +// \param[in] Kd the diffuse color +// \return the created Material +Material diffuse(in vec3 Kd) { + return Material(Kd, zero3, zero3, 0.0, zero3, 0.0); +} + +// \brief Creates a light (emissive) material +// \param[in] Ke the color of the light +// \return the created Material +Material light(in vec3 Ke) { + return Material(zero3, Ke, zero3, 0.0, zero3, 0.0); +} + +// \brief Creates a mirror material +// \param[in] Kd the diffuse color +// \param[in] Kr the reflection coefficient +// \return the created Material +Material mirror(in vec3 Kd, in vec3 Kr) { + return Material( + Kd, zero3, Kr, 0.0, vec3(1.0, 1.0, 1.0), 30.0 + ); +} + +// \brief Creates a shiny material +// \param[in] Kd the diffuse color +// \param[in] Ks the specular coefficient +// \return the created Material +Material shiny(in vec3 Kd, in vec3 Ks) { + return Material(Kd, zero3, zero3, 0.0, Ks, 30.0); +} + +// \brief Creates a checkerboard material +// \param[in] Kd the diffuse color +// \param[in] sz size of the checkers +// \return the created Material +Material checkerboard(in vec3 Kd, in float sz) { + return Material(Kd, zero3, zero3, sz, zero3, 0.0); +} + +// \brief An Object, with a shape (Sphere) and a Material +struct Object { + Sphere sphere; + Material material; +}; + +// \brief The scene is stored in a global array +Object scene[23]; + +// \brief Initializes the scene +void init_scene() { + + scene[0] = Object( + Sphere(vec3(0.0, 0.0, 0.0),0.5), + mirror(vec3(0.2, 0.5, 0.2), vec3(0.5, 0.5, 0.5)) + ); + + scene[1] = Object( + Sphere(vec3(0.0, 0.0, -10000.0),9999.5), + checkerboard(vec3(1.0, 0.2, 0.5), 0.5) + ); + + scene[2] = Object( + Sphere(vec3(1.0, 0.0, 1.0),0.02), + light(vec3(1.0, 1.0, 1.0)) + ); + + for(int i=0; i<20; ++i) { + float beta = float(iFrame)/30.0 + float(i)*6.28/19.0; + float s = sin(beta); + float c = cos(beta); + + scene[i+3] = Object( + Sphere(vec3(0.7*s, 0.7*c, 0.0),0.1), + mirror(vec3(1.0, 0.7, 0.7), vec3(0.3, 0.3, 0.3)) + ); + } +} + +// \brief Computes a Ray Sphere intersection +// \param[in] R the Ray +// \param[in] S the Sphere +// \param[out] t the intersection parameter +// \retval true if there was an intersection +// \retval false otherwise +bool intersect_sphere(in Ray R, in Sphere S, out float t) { + vec3 CO = R.Origin - S.Center; + float a = dot(R.Dir, R.Dir); + float b = 2.0*dot(R.Dir, CO); + float c = dot(CO, CO) - S.R*S.R; + float delta = b*b - 4.0*a*c; + if(delta < 0.0) { + return false; + } + t = (-b-sqrt(delta)) / (2.0*a); + return true; +} + +// \brief Computes a reflected Ray +// \param[in] I the incident Ray +// \param[in] P the point at which the reflection occurs +// \param[in] N the normal at P +// \return the reflected Ray +Ray reflect_ray(in Ray I, in vec3 P, in vec3 N) { + return Ray( + P, + -2.0*dot(N,I.Dir)*N + I.Dir + ); +} + +// \brief Tests whether a Ray is in shadow +// \param[in] R a Ray that connects a point to a lightsource +// \retval true if the point is in shadow w.r.t. the lightsource +// \retval false otherwise +bool shadow(in Ray R) { + for(int i=0; i EPSILON && t < 1.0 + ) { + return true; + } + } + return false; +} + +// \brief Computes the lighting +// \param[in] P the intersection point +// \param[in] N the normal to the intersected surface at P +// \param[in] material the material +// \param[in] Ray the incident Ray +// \return the computed color +vec3 lighting( + in vec3 P, in vec3 N, in Material material, in Ray R +) { + + // If it is a lightsource, then return its color + // (and we are done) + if(material.Ke != vec3(0.0, 0.0, 0.0)) { + return material.Ke; + } + + vec3 result = vec3(0.0, 0.0, 0.0); + + // Compute the influence of all lightsources + for(int i=0; i 0.0) { + Kd = vec3(1.0, 1.0, 1.0) - Kd; + } + result += lamb * Kd * scene[i].material.Ke; + + // Specular lighting + if(material.Ks != zero3) { + vec3 Er = 2.0*dot(N,E)*N - E; + vec3 View = R.Origin - P; + float spec=max(dot(Er,View),0.0); + spec /= sqrt(dot(Er,Er)*dot(View,View)); + spec = pow(spec, material.s); + result += + spec * material.Ks * scene[i].material.Ke; + } + } + } + } + + return result; +} + +// \brief Computes the nearest intersection along a Ray +// \param[in] R the ray +// \param[out] P the intersection point +// \param[out] N the normal to the intersected surface at P +// \param[out] material the material of the intersected object +bool nearest_intersection( + in Ray R, + out vec3 P, out vec3 N, out Material material +) { + const float FARAWAY=1e30; + float t = FARAWAY; + + for(int i=0; i EPSILON + ) { + t = cur_t; + P = R.Origin + t*R.Dir; + N = normalize(P - scene[i].sphere.Center); + material = scene[i].material; + } + } + return (t != FARAWAY); +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) { + + // Yes, it is a bit stupid to call this for each pixel, + // but well, does not cost that much... + init_scene(); + + float beta = float(iFrame)/150.0; + float s = sin(beta); + float c = cos(beta); + + // Initialize the Camera (and make it orbit around the + // origin) + Camera C = camera( + vec3(2.0*c, 2.0*s, 1.0), + vec3(0.5, 0.5, 0.5), + 50.0 + ); + + // Lauch the primary ray that corresponds to this pixel + Ray R = launch(C, fragCoord); + + + fragColor = vec4(0.0, 0.0, 0.0, 1.0); + + vec3 P; // Current intersected point + vec3 N; // Normal to the intersected object at P + Material material; // Material of the intersected object + + // Compute up to 5 ray bounces + vec3 Kr_cumul = vec3(1.0, 1.0, 1.0); + for(int k=0; k<5; ++k) { + if(nearest_intersection(R, P, N, material)) { + fragColor.rgb += Kr_cumul * lighting(P,N,material,R); + if(material.Kr == zero3) { + break; + } + Kr_cumul *= material.Kr; + R = reflect_ray(R, P, N); + } else { + fragColor.rgb += Kr_cumul * vec3(0.5, 0.5, 1.0); + break; + } + } +} + + + + + + diff --git a/src/bin/geoshade/glsl/course/raytrace_step8.glsl b/src/bin/geoshade/glsl/course/raytrace_step8.glsl new file mode 100644 index 00000000..89f3e575 --- /dev/null +++ b/src/bin/geoshade/glsl/course/raytrace_step8.glsl @@ -0,0 +1,377 @@ +const float FARAWAY=1e30; +const float EPSILON=1e-5; + +// The viewing parameters +// Gathers all parameters needed to launch primary rays +struct Camera { + vec3 Obs; // The position of the observer + vec3 View; // Unit vector, points to the target + vec3 Up; // Unit vector, vertical direction + vec3 Horiz; // Unit vector, horizontal direction + float H; // Screen height in pixels + float W; // Screen width in pixel + float z; // offset of the screen along View +}; + +// \brief A ray, in parametric form. +struct Ray { + vec3 Origin; + vec3 Dir; +}; + +// \brief Initializes a Camera +// \param[in] Obs the position of the observer +// \param[in] Target the point that will be in the center +// \param[in] aperture the aperture angle in degrees +// \return the initialized Camera +Camera camera(in vec3 Obs, in vec3 Target, in float aperture) { + Camera C; + C.Obs = Obs; + C.View = normalize(Target - Obs); + C.Horiz = normalize(cross(vec3(0.0, 0.0, 1.0), C.View)); + C.Up = cross(C.View, C.Horiz); + C.W = float(iResolution.x); + C.H = float(iResolution.y); + C.z = (C.H/2.0) / tan((aperture * 3.1415 / 180.0) / 2.0); + return C; +} + +// \brief Launches a primary Ray +// \param[in] C the Camera +// \param[in] XY the pixel coordinates in [0,W-1] x [0,H-1] +Ray launch(in Camera C, in vec2 XY) { + return Ray( + C.Obs, + C.z*C.View+(XY.x-C.W/2.0)*C.Horiz+(XY.y-C.H/2.0)*C.Up + ); +} + +// \brief A sphere, defined by its center and radius +struct Sphere { + vec3 Center; + float R; +}; + +// \brief Material gathers all shading properties +struct Material { + vec3 Kd; // diffuse color + vec3 Ke; // emissive color + vec3 Kr; // reflective material + float checker; // checkerboard size + vec3 Ks; // specular + float s; // specular factor + vec3 Kt; // transmission + float n; // refraction index +}; + +// \brief Shorthand for the zero vector +const vec3 zero3 = vec3(0.0, 0.0, 0.0); + +// \brief Creates a diffuse material +// \param[in] Kd the diffuse color +// \return the created Material +Material diffuse(in vec3 Kd) { + return Material(Kd, zero3, zero3, 0.0, zero3, 0.0, zero3, 0.0); +} + +// \brief Creates a light (emissive) material +// \param[in] Ke the color of the light +// \return the created Material +Material light(in vec3 Ke) { + return Material(zero3, Ke, zero3, 0.0, zero3, 0.0, zero3, 0.0); +} + +// \brief Creates a mirror material +// \param[in] Kd the diffuse color +// \param[in] Kr the reflection coefficient +// \return the created Material +Material mirror(in vec3 Kd, in vec3 Kr) { + return Material( + Kd, zero3, Kr, 0.0, vec3(1.0, 1.0, 1.0), 30.0, zero3, 0.0 + ); +} + +Material transparent(in vec3 Kd, in vec3 Kt) { + return Material( + Kd, zero3, zero3, 0.0, vec3(1.0, 1.0, 1.0), 30.0, Kt, 0.9 + ); +} + + + +// \brief Creates a shiny material +// \param[in] Kd the diffuse color +// \param[in] Ks the specular coefficient +// \return the created Material +Material shiny(in vec3 Kd, in vec3 Ks) { + return Material(Kd, zero3, zero3, 0.0, Ks, 30.0, zero3, 0.0); +} + +// \brief Creates a checkerboard material +// \param[in] Kd the diffuse color +// \param[in] sz size of the checkers +// \return the created Material +Material checkerboard(in vec3 Kd, in float sz) { + return Material(Kd, zero3, zero3, sz, zero3, 0.0, zero3, 0.0); +} + +// \brief An Object, with a shape (Sphere) and a Material +struct Object { + Sphere sphere; + Material material; +}; + +// \brief The scene is stored in a global array +Object scene[23]; + +// \brief Initializes the scene +void init_scene() { + + scene[0] = Object( + Sphere(vec3(0.0, 0.0, 0.0),0.5), + // transparent(vec3(0.2, 0.5, 0.2), vec3(0.3, 0.7, 1.0)) + mirror(vec3(0.2, 0.5, 0.2), vec3(0.9, 0.9, 0.9)) + ); + + scene[1] = Object( + Sphere(vec3(0.0, 0.0, -10000.0),9999.5), + checkerboard(vec3(1.0, 0.2, 0.5), 0.1) + ); + + scene[2] = Object( + Sphere(vec3(1.0, 0.0, 1.0),0.02), + light(vec3(1.0, 1.0, 1.0)) + ); + + for(int i=0; i<20; ++i) { + float beta = float(iFrame)/30.0 + float(i)*6.28/19.0; + float s = sin(beta); + float c = cos(beta); + + scene[i+3] = Object( + Sphere(vec3(0.7*s, 0.7*c, 0.0),0.1), + (((i >> 2) & 1) == 0) ? + mirror(vec3(0.2, 0.5, 0.2), vec3(0.9, 0.9, 0.9)) + : + transparent(vec3(0.2, 0.5, 0.2), vec3(0.3, 0.3, 1.0)) + ); + } +} + +// \brief Computes a Ray Sphere intersection +// \param[in] R the Ray +// \param[in] S the Sphere +// \param[out] t the intersection parameter +// \retval true if there was an intersection +// \retval false otherwise +bool intersect_sphere(in Ray R, in Sphere S, out float t) { + vec3 CO = R.Origin - S.Center; + float a = dot(R.Dir, R.Dir); + float b = 2.0*dot(R.Dir, CO); + float c = dot(CO, CO) - S.R*S.R; + float delta = b*b - 4.0*a*c; + if(delta < 0.0) { + return false; + } + t = (-b-sqrt(delta)) / (2.0*a); + return true; +} + +bool intersect_sphere_2(in Ray R, in Sphere S, out float t) { + vec3 CO = R.Origin - S.Center; + float a = dot(R.Dir, R.Dir); + float b = 2.0*dot(R.Dir, CO); + float c = dot(CO, CO) - S.R*S.R; + float delta = b*b - 4.0*a*c; + if(delta < 0.0) { + return false; + } + t = (-b+sqrt(delta)) / (2.0*a); + return true; +} + + + +// \brief Computes a reflected Ray +// \param[in] I the incident Ray +// \param[in] P the point at which the reflection occurs +// \param[in] N the normal at P +// \return the reflected Ray +Ray reflect_ray(in Ray I, in vec3 P, in vec3 N) { + return Ray( + P, + -2.0*dot(N,I.Dir)*N + I.Dir + ); +} + +Ray refract_ray(in Ray I, in vec3 P, in vec3 N, in float n) { + return Ray( + P, + refract(normalize(I.Dir), N, n) + ); +} + +// \brief Tests whether a Ray is in shadow +// \param[in] R a Ray that connects a point to a lightsource +// \retval true if the point is in shadow w.r.t. the lightsource +// \retval false otherwise +bool shadow(in Ray R) { + for(int i=0; i EPSILON && t < 1.0 + ) { + return true; + } + } + return false; +} + +// \brief Computes the lighting +// \param[in] P the intersection point +// \param[in] N the normal to the intersected surface at P +// \param[in] material the material +// \param[in] Ray the incident Ray +// \return the computed color +vec3 lighting( + in vec3 P, in vec3 N, in Material material, in Ray R +) { + + // If it is a lightsource, then return its color + // (and we are done) + if(material.Ke != vec3(0.0, 0.0, 0.0)) { + return material.Ke; + } + + vec3 result = vec3(0.0, 0.0, 0.0); + + // Compute the influence of all lightsources + for(int i=0; i 0.0) { + Kd = vec3(1.0, 1.0, 1.0) - Kd; + } + result += lamb * Kd * scene[i].material.Ke; + + // Specular lighting + if(material.Ks != zero3) { + vec3 Er = 2.0*dot(N,E)*N - E; + vec3 View = R.Origin - P; + float spec=max(dot(Er,View),0.0); + spec /= sqrt(dot(Er,Er)*dot(View,View)); + spec = pow(spec, material.s); + result += + spec * material.Ks * scene[i].material.Ke; + } + } + } + } + + return result; +} + +// \brief Computes the nearest intersection along a Ray +// \param[in] R the ray +// \param[out] P the intersection point +// \param[out] N the normal to the intersected surface at P +// \param[out] material the material of the intersected object +bool nearest_intersection( + in Ray R, + out vec3 P, out vec3 N, out Material material +) { + const float FARAWAY=1e30; + float t = FARAWAY; + + for(int i=0; i EPSILON + ) { + t = cur_t; + P = R.Origin + t*R.Dir; + N = normalize(P - scene[i].sphere.Center); + material = scene[i].material; + } else if( + intersect_sphere_2(R, scene[i].sphere, cur_t) + && cur_t < t && cur_t > EPSILON + ) { + t = cur_t; + P = R.Origin + t*R.Dir; + N = -normalize(P - scene[i].sphere.Center); + material = scene[i].material; + material.n = 1.0 / material.n; + material.Kt = vec3(1.0, 1.0, 1.0) * pow(length(R.Dir) / (4.0*t), 2.0); + } + } + return (t != FARAWAY); +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) { + + // Yes, it is a bit stupid to call this for each pixel, + // but well, does not cost that much... + init_scene(); + + float beta = float(iFrame)/150.0; + float s = sin(beta); + float c = cos(beta); + + // Initialize the Camera (and make it orbit around the + // origin) + Camera C = camera( + vec3(2.0*c, 2.0*s, 0.5), + vec3(0.5, 0.5, 0.5), + 50.0 + ); + + // Lauch the primary ray that corresponds to this pixel + Ray R = launch(C, fragCoord); + + + fragColor = vec4(0.0, 0.0, 0.0, 1.0); + + vec3 P; // Current intersected point + vec3 N; // Normal to the intersected object at P + Material material; // Material of the intersected object + + // Compute up to 5 ray bounces + vec3 Kr_cumul = vec3(1.0, 1.0, 1.0); + for(int k=0; k<5; ++k) { + if(nearest_intersection(R, P, N, material)) { + fragColor.rgb += Kr_cumul * lighting(P,N,material,R); + if(material.Kr != zero3) { + Kr_cumul *= material.Kr; + R = reflect_ray(R, P, N); + } else if(material.Kt != zero3) { + Kr_cumul *= material.Kt; + R = refract_ray(R, P, N, material.n); + } else { + break; + } + } else { + fragColor.rgb += Kr_cumul * vec3(0.5, 0.5, 1.0); + break; + } + } +} + + + + + + + + + diff --git a/src/bin/geoshade/glsl/embed_glsl_files.sh b/src/bin/geoshade/glsl/embed_glsl_files.sh new file mode 100755 index 00000000..95e1a21d --- /dev/null +++ b/src/bin/geoshade/glsl/embed_glsl_files.sh @@ -0,0 +1,60 @@ +#!/bin/sh + +glsl_files=" + course/raytrace_step1.glsl + course/raytrace_step2.glsl + course/raytrace_step3.glsl + course/raytrace_step4.glsl + course/raytrace_step5.glsl + course/raytrace_step6.glsl + course/raytrace_step7.glsl +ShaderToy/AlloyPlatedVoronoi.glsl +ShaderToy/AndromedaJewel.glsl +ShaderToy/Circuits.glsl +ShaderToy/ContouredLayers.glsl +ShaderToy/FractalLand.glsl +ShaderToy/GeodesicTiling.glsl +ShaderToy/Geomechanical.glsl +ShaderToy/HexFlow.glsl +ShaderToy/JellyTubes.glsl +ShaderToy/MengerTunnel.glsl +ShaderToy/QuadTreeTruchet.glsl +ShaderToy/rabbit.glsl +ShaderToy/RayMarchingPrimitives.glsl +ShaderToy/RoundedVoronoiEdges.glsl +ShaderToy/RounderVoronoi.glsl +ShaderToy/SiggraphLogo.glsl +ShaderToy/TentacleObject.glsl +ShaderToy/ThePopularShader.glsl +ShaderToy/TracedMinkwskiTube.glsl +ShaderToy/VoxelPacMan.glsl +ShaderToy/Voxels.glsl +" + +cat < + +void register_embedded_glsl_file( + const char* filename, const char* body +); +void register_embedded_glsl_files(void); + +void register_embedded_glsl_files() { +EOF + +for f in $glsl_files +do + echo " register_embedded_glsl_file(\"$f\"," + cat $f | sed -e 's|\\|\\\\|' \ + -e 's|"|\\\"|g' \ + -e 's|^| \"|' \ + -e 's| *$|\\n\"|' + echo " );" + echo +done + +echo "}" diff --git a/src/bin/geoshade/glsl/embedded_glsl_files.cpp b/src/bin/geoshade/glsl/embedded_glsl_files.cpp new file mode 100644 index 00000000..54214e94 --- /dev/null +++ b/src/bin/geoshade/glsl/embedded_glsl_files.cpp @@ -0,0 +1,7965 @@ +/* + * This file was automatically generated, do not edit. + */ + +#include + +void register_embedded_glsl_file( + const char* filename, const char* body +); +void register_embedded_glsl_files(void); + +void register_embedded_glsl_files() { + register_embedded_glsl_file("course/raytrace_step1.glsl", + "const float FARAWAY=1e30;\n" + "const float EPSILON=1e-6;\n" + "\n" + "struct Camera {\n" + " vec3 Obs;\n" + " vec3 View;\n" + " vec3 Up;\n" + " vec3 Horiz;\n" + " float H;\n" + " float W;\n" + " float z;\n" + "};\n" + "\n" + "struct Ray {\n" + " vec3 Origin;\n" + " vec3 Dir;\n" + "};\n" + "\n" + "Camera camera(in vec3 Obs, in vec3 LookAt, in float aperture) {\n" + " Camera C;\n" + " C.Obs = Obs;\n" + " C.View = normalize(LookAt - Obs);\n" + " C.Horiz = normalize(cross(vec3(0.0, 0.0, 1.0), C.View));\n" + " C.Up = cross(C.View, C.Horiz);\n" + " C.W = float(iResolution.x);\n" + " C.H = float(iResolution.y);\n" + " C.z = (C.H/2.0) / tan((aperture * 3.1415 / 180.0) / 2.0);\n" + " return C;\n" + "}\n" + "\n" + "Ray launch(in Camera C, in vec2 XY) {\n" + " return Ray(\n" + " C.Obs,\n" + " C.z*C.View+(XY.x-C.W/2.0)*C.Horiz+(XY.y-C.H/2.0)*C.Up\n" + " );\n" + "}\n" + "\n" + "\n" + "struct Sphere {\n" + " vec3 Center;\n" + " float R;\n" + "};\n" + "\n" + "bool intersect_sphere(in Ray R, in Sphere S, out float t) {\n" + " vec3 CO = R.Origin - S.Center;\n" + " float a = dot(R.Dir, R.Dir);\n" + " float b = 2.0*dot(R.Dir, CO);\n" + " float c = dot(CO, CO) - S.R*S.R;\n" + " float delta = b*b - 4.0*a*c;\n" + " if(delta < 0.0) {\n" + " return false;\n" + " }\n" + " t = (-b-sqrt(delta)) / (2.0*a);\n" + " return true;\n" + "}\n" + "\n" + "void mainImage( out vec4 fragColor, in vec2 fragCoord ) {\n" + "\n" + " Camera C = camera(\n" + " vec3(2.0, 2.0, 1.5),\n" + " vec3(0.5, 0.5, 0.5),\n" + " 50.0\n" + " );\n" + " Ray R = launch(C, fragCoord);\n" + " Sphere S = Sphere(vec3(0.0, 0.0, 0.0), 0.5);\n" + "\n" + " fragColor = vec4(0.5, 0.5, 1.0, 1.0);\n" + "\n" + " float t;\n" + " if(intersect_sphere(R,S,t)) {\n" + " fragColor = vec4(1.0, 1.0, 1.0, 1.0);\n" + " }\n" + "\n" + "}\n" + "\n" + "\n" + "\n" + "\n" + ); + + register_embedded_glsl_file("course/raytrace_step2.glsl", + "const float FARAWAY=1e30;\n" + "const float EPSILON=1e-6;\n" + "\n" + "struct Camera {\n" + " vec3 Obs;\n" + " vec3 View;\n" + " vec3 Up;\n" + " vec3 Horiz;\n" + " float H;\n" + " float W;\n" + " float z;\n" + "};\n" + "\n" + "struct Ray {\n" + " vec3 Origin;\n" + " vec3 Dir;\n" + "};\n" + "\n" + "Camera camera(in vec3 Obs, in vec3 LookAt, in float aperture) {\n" + " Camera C;\n" + " C.Obs = Obs;\n" + " C.View = normalize(LookAt - Obs);\n" + " C.Horiz = normalize(cross(vec3(0.0, 0.0, 1.0), C.View));\n" + " C.Up = cross(C.View, C.Horiz);\n" + " C.W = float(iResolution.x);\n" + " C.H = float(iResolution.y);\n" + " C.z = (C.H/2.0) / tan((aperture * 3.1415 / 180.0) / 2.0);\n" + " return C;\n" + "}\n" + "\n" + "Ray launch(in Camera C, in vec2 XY) {\n" + " return Ray(\n" + " C.Obs,\n" + " C.z*C.View+(XY.x-C.W/2.0)*C.Horiz+(XY.y-C.H/2.0)*C.Up\n" + " );\n" + "}\n" + "\n" + "struct Sphere {\n" + " vec3 Center;\n" + " float R;\n" + "};\n" + "\n" + "bool intersect_sphere(in Ray R, in Sphere S, out float t) {\n" + " vec3 CO = R.Origin - S.Center;\n" + " float a = dot(R.Dir, R.Dir);\n" + " float b = 2.0*dot(R.Dir, CO);\n" + " float c = dot(CO, CO) - S.R*S.R;\n" + " float delta = b*b - 4.0*a*c;\n" + " if(delta < 0.0) {\n" + " return false;\n" + " }\n" + " t = (-b-sqrt(delta)) / (2.0*a);\n" + " return true;\n" + "}\n" + "\n" + "void mainImage( out vec4 fragColor, in vec2 fragCoord ) {\n" + "\n" + " float alpha = float(iFrame)/30.0;\n" + " float s = sin(alpha);\n" + " float c = cos(alpha);\n" + "\n" + "\n" + " Camera C = camera(\n" + " vec3(2.0, 2.0, 1.5),\n" + " vec3(0.5, 0.5, 0.5),\n" + " 50.0\n" + " );\n" + " Ray R = launch(C, fragCoord);\n" + " Sphere S1 = Sphere(vec3(0.0, 0.0, 0.0), 0.5);\n" + " Sphere S2 = Sphere(vec3(0.7*c, 0.7*s, 0.0), 0.3);\n" + "\n" + " fragColor = vec4(0.5, 0.5, 1.0, 1.0);\n" + "\n" + " float t = FARAWAY;\n" + " float t1;\n" + " if(intersect_sphere(R,S1,t1) && t1 < t) {\n" + " fragColor = vec4(1.0, 1.0, 1.0, 1.0);\n" + " t = t1;\n" + " }\n" + " float t2;\n" + " if(intersect_sphere(R,S2,t2) && t2 < t) {\n" + " fragColor = vec4(1.0, 0.0, 0.0, 1.0);\n" + " t = t2;\n" + " }\n" + "\n" + "\n" + "}\n" + "\n" + "\n" + "\n" + "\n" + "\n" + ); + + register_embedded_glsl_file("course/raytrace_step3.glsl", + "const float FARAWAY=1e30;\n" + "const float EPSILON=1e-3;\n" + "\n" + "struct Camera {\n" + " vec3 Obs;\n" + " vec3 View;\n" + " vec3 Up;\n" + " vec3 Horiz;\n" + " float H;\n" + " float W;\n" + " float z;\n" + "};\n" + "\n" + "struct Ray {\n" + " vec3 Origin;\n" + " vec3 Dir;\n" + "};\n" + "\n" + "Camera camera(in vec3 Obs, in vec3 LookAt, in float aperture) {\n" + " Camera C;\n" + " C.Obs = Obs;\n" + " C.View = normalize(LookAt - Obs);\n" + " C.Horiz = normalize(cross(vec3(0.0, 0.0, 1.0), C.View));\n" + " C.Up = cross(C.View, C.Horiz);\n" + " C.W = float(iResolution.x);\n" + " C.H = float(iResolution.y);\n" + " C.z = (C.H/2.0) / tan((aperture * 3.1415 / 180.0) / 2.0);\n" + " return C;\n" + "}\n" + "\n" + "Ray launch(in Camera C, in vec2 XY) {\n" + " return Ray(\n" + " C.Obs,\n" + " C.z*C.View+(XY.x-C.W/2.0)*C.Horiz+(XY.y-C.H/2.0)*C.Up\n" + " );\n" + "}\n" + "\n" + "struct Sphere {\n" + " vec3 Center;\n" + " float R;\n" + "};\n" + "\n" + "struct Material {\n" + " vec3 Kd; // diffuse color\n" + " vec3 Ke; // emissive color\n" + "};\n" + "\n" + "Material diffuse(in vec3 Kd) {\n" + " return Material(Kd, vec3(0.0, 0.0, 0.0));\n" + "}\n" + "\n" + "Material light(in vec3 Ke) {\n" + " return Material(vec3(0.0, 0.0, 0.0), Ke);\n" + "}\n" + "\n" + "struct Object {\n" + " Sphere sphere;\n" + " Material material;\n" + "};\n" + "\n" + "Object scene[3];\n" + "\n" + "void init_scene() {\n" + " float beta = float(iFrame)/30.0;\n" + " float s = sin(beta);\n" + " float c = cos(beta);\n" + "\n" + " scene[0] = Object(\n" + " Sphere(vec3(0.0, 0.0, 0.0),0.5),\n" + " diffuse(vec3(1.0, 1.0, 1.0))\n" + " );\n" + "\n" + " scene[1] = Object(\n" + " Sphere(vec3(0.7*s, 0.7*c, 0.0),0.1),\n" + " diffuse(vec3(1.0, 0.0, 0.0))\n" + " );\n" + "\n" + " scene[2] = Object(\n" + " Sphere(vec3(5.0, 0.0, 3.0),0.02),\n" + " light(vec3(1.0, 1.0, 1.0))\n" + " );\n" + "\n" + "// scene[3] = Object(\n" + "// Sphere(vec3(1.5, 0.0, 1.5),0.02),\n" + "// light(vec3(1.0, 1.0, 1.0))\n" + "// );\n" + "\n" + "\n" + "}\n" + "\n" + "bool intersect_sphere(in Ray R, in Sphere S, out float t) {\n" + " vec3 CO = R.Origin - S.Center;\n" + " float a = dot(R.Dir, R.Dir);\n" + " float b = 2.0*dot(R.Dir, CO);\n" + " float c = dot(CO, CO) - S.R*S.R;\n" + " float delta = b*b - 4.0*a*c;\n" + " if(delta < 0.0) {\n" + " return false;\n" + " }\n" + " t = (-b-sqrt(delta)) / (2.0*a);\n" + " return true;\n" + "}\n" + "\n" + "vec3 lighting(in vec3 P, in vec3 N, in Material material) {\n" + " if(material.Ke != vec3(0.0, 0.0, 0.0)) {\n" + " return material.Ke;\n" + " }\n" + "\n" + " vec3 result = vec3(0.0, 0.0, 0.0);\n" + "\n" + " for(int i=0; i EPSILON && t < 1.0\n" + " ) {\n" + " return true;\n" + " }\n" + " }\n" + " return false;\n" + "}\n" + "\n" + "vec3 lighting(in vec3 P, in vec3 N, in Material material) {\n" + " if(material.Ke != vec3(0.0, 0.0, 0.0)) {\n" + " return material.Ke;\n" + " }\n" + "\n" + " vec3 result = vec3(0.0, 0.0, 0.0);\n" + "\n" + " for(int i=0; i EPSILON && t < 1.0\n" + " ) {\n" + " return true;\n" + " }\n" + " }\n" + " return false;\n" + "}\n" + "\n" + "vec3 lighting(in vec3 P, in vec3 N, in Material material) {\n" + " if(material.Ke != vec3(0.0, 0.0, 0.0)) {\n" + " return material.Ke;\n" + " }\n" + "\n" + " vec3 result = vec3(0.0, 0.0, 0.0);\n" + "\n" + " for(int i=0; i EPSILON && t < 1.0\n" + " ) {\n" + " return true;\n" + " }\n" + " }\n" + " return false;\n" + "}\n" + "\n" + "vec3 lighting(in vec3 P, in vec3 N, in Material material) {\n" + " if(material.Ke != vec3(0.0, 0.0, 0.0)) {\n" + " return material.Ke;\n" + " }\n" + "\n" + " vec3 result = vec3(0.0, 0.0, 0.0);\n" + "\n" + " for(int i=0; i EPSILON && cur_t > 0.0\n" + " ) {\n" + " t = cur_t;\n" + " P = R.Origin + t*R.Dir;\n" + " N = normalize(P - scene[i].sphere.Center);\n" + " material = scene[i].material;\n" + " }\n" + " }\n" + " return (t != FARAWAY);\n" + "}\n" + "\n" + "void mainImage( out vec4 fragColor, in vec2 fragCoord ) {\n" + "\n" + " init_scene();\n" + "\n" + " Camera C = camera(\n" + " vec3(2.0, 2.0, 1.5),\n" + " vec3(0.5, 0.5, 0.5),\n" + " 50.0\n" + " );\n" + " Ray R = launch(C, fragCoord);\n" + "\n" + "\n" + " fragColor = vec4(0.5, 0.5, 1.0, 1.0);\n" + "\n" + "\n" + " vec3 P; // Point courant\n" + " vec3 N; // Normale\n" + " Material material; // Couleur\n" + "\n" + " if(nearest_intersection(R, P, N, material)) {\n" + " fragColor.rgb = lighting(P,N,material);\n" + " if(material.Kr != zero3) {\n" + " vec3 Kr = material.Kr;\n" + " R = reflect_ray(R, P, N);\n" + " if(nearest_intersection(R, P, N, material)) {\n" + " fragColor.rgb =\n" + " Kr*lighting(P,N,material);\n" + " } else {\n" + " fragColor = vec4(0.5, 0.5, 1.0, 1.0);\n" + " }\n" + "\n" + " }\n" + " }\n" + "\n" + "}\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + ); + + register_embedded_glsl_file("course/raytrace_step7.glsl", + "const float FARAWAY=1e30;\n" + "const float EPSILON=1e-6;\n" + "\n" + "// The viewing parameters\n" + "// Gathers all parameters needed to launch primary rays\n" + "struct Camera {\n" + " vec3 Obs; // The position of the observer\n" + " vec3 View; // Unit vector, points to the target\n" + " vec3 Up; // Unit vector, vertical direction\n" + " vec3 Horiz; // Unit vector, horizontal direction\n" + " float H; // Screen height in pixels\n" + " float W; // Screen width in pixel\n" + " float z; // offset of the screen along View\n" + "};\n" + "\n" + "// \\brief A ray, in parametric form.\n" + "struct Ray {\n" + " vec3 Origin;\n" + " vec3 Dir;\n" + "};\n" + "\n" + "// \\brief Initializes a Camera\n" + "// \\param[in] Obs the position of the observer\n" + "// \\param[in] Target the point that will be in the center\n" + "// \\param[in] aperture the aperture angle in degrees\n" + "// \\return the initialized Camera\n" + "Camera camera(in vec3 Obs, in vec3 Target, in float aperture) {\n" + " Camera C;\n" + " C.Obs = Obs;\n" + " C.View = normalize(Target - Obs);\n" + " C.Horiz = normalize(cross(vec3(0.0, 0.0, 1.0), C.View));\n" + " C.Up = cross(C.View, C.Horiz);\n" + " C.W = float(iResolution.x);\n" + " C.H = float(iResolution.y);\n" + " C.z = (C.H/2.0) / tan((aperture * 3.1415 / 180.0) / 2.0);\n" + " return C;\n" + "}\n" + "\n" + "// \\brief Launches a primary Ray\n" + "// \\param[in] C the Camera\n" + "// \\param[in] XY the pixel coordinates in [0,W-1] x [0,H-1]\n" + "Ray launch(in Camera C, in vec2 XY) {\n" + " return Ray(\n" + " C.Obs,\n" + " C.z*C.View+(XY.x-C.W/2.0)*C.Horiz+(XY.y-C.H/2.0)*C.Up\n" + " );\n" + "}\n" + "\n" + "// \\brief A sphere, defined by its center and radius\n" + "struct Sphere {\n" + " vec3 Center;\n" + " float R;\n" + "};\n" + "\n" + "// \\brief Material gathers all shading properties\n" + "struct Material {\n" + " vec3 Kd; // diffuse color\n" + " vec3 Ke; // emissive color\n" + " vec3 Kr; // reflective material\n" + " float checker; // checkerboard size\n" + " vec3 Ks; // specular\n" + " float s; // specular factor\n" + "};\n" + "\n" + "// \\brief Shorthand for the zero vector\n" + "const vec3 zero3 = vec3(0.0, 0.0, 0.0);\n" + "\n" + "// \\brief Creates a diffuse material\n" + "// \\param[in] Kd the diffuse color\n" + "// \\return the created Material\n" + "Material diffuse(in vec3 Kd) {\n" + " return Material(Kd, zero3, zero3, 0.0, zero3, 0.0);\n" + "}\n" + "\n" + "// \\brief Creates a light (emissive) material\n" + "// \\param[in] Ke the color of the light\n" + "// \\return the created Material\n" + "Material light(in vec3 Ke) {\n" + " return Material(zero3, Ke, zero3, 0.0, zero3, 0.0);\n" + "}\n" + "\n" + "// \\brief Creates a mirror material\n" + "// \\param[in] Kd the diffuse color\n" + "// \\param[in] Kr the reflection coefficient\n" + "// \\return the created Material\n" + "Material mirror(in vec3 Kd, in vec3 Kr) {\n" + " return Material(\n" + " Kd, zero3, Kr, 0.0, vec3(1.0, 1.0, 1.0), 30.0\n" + " );\n" + "}\n" + "\n" + "// \\brief Creates a shiny material\n" + "// \\param[in] Kd the diffuse color\n" + "// \\param[in] Ks the specular coefficient\n" + "// \\return the created Material\n" + "Material shiny(in vec3 Kd, in vec3 Ks) {\n" + " return Material(Kd, zero3, zero3, 0.0, Ks, 30.0);\n" + "}\n" + "\n" + "// \\brief Creates a checkerboard material\n" + "// \\param[in] Kd the diffuse color\n" + "// \\param[in] sz size of the checkers\n" + "// \\return the created Material\n" + "Material checkerboard(in vec3 Kd, in float sz) {\n" + " return Material(Kd, zero3, zero3, sz, zero3, 0.0);\n" + "}\n" + "\n" + "// \\brief An Object, with a shape (Sphere) and a Material\n" + "struct Object {\n" + " Sphere sphere;\n" + " Material material;\n" + "};\n" + "\n" + "// \\brief The scene is stored in a global array\n" + "Object scene[23];\n" + "\n" + "// \\brief Initializes the scene\n" + "void init_scene() {\n" + "\n" + " scene[0] = Object(\n" + " Sphere(vec3(0.0, 0.0, 0.0),0.5),\n" + " mirror(vec3(0.2, 0.5, 0.2), vec3(0.5, 0.5, 0.5))\n" + " );\n" + "\n" + " scene[1] = Object(\n" + " Sphere(vec3(0.0, 0.0, -10000.0),9999.5),\n" + " checkerboard(vec3(1.0, 0.2, 0.5), 0.5)\n" + " );\n" + "\n" + " scene[2] = Object(\n" + " Sphere(vec3(1.0, 0.0, 1.0),0.02),\n" + " light(vec3(1.0, 1.0, 1.0))\n" + " );\n" + "\n" + " for(int i=0; i<20; ++i) {\n" + " float beta = float(iFrame)/30.0 + float(i)*6.28/19.0;\n" + " float s = sin(beta);\n" + " float c = cos(beta);\n" + "\n" + " scene[i+3] = Object(\n" + " Sphere(vec3(0.7*s, 0.7*c, 0.0),0.1),\n" + " mirror(vec3(1.0, 0.7, 0.7), vec3(0.3, 0.3, 0.3))\n" + " );\n" + " }\n" + "}\n" + "\n" + "// \\brief Computes a Ray Sphere intersection\n" + "// \\param[in] R the Ray\n" + "// \\param[in] S the Sphere\n" + "// \\param[out] t the intersection parameter\n" + "// \\retval true if there was an intersection\n" + "// \\retval false otherwise\n" + "bool intersect_sphere(in Ray R, in Sphere S, out float t) {\n" + " vec3 CO = R.Origin - S.Center;\n" + " float a = dot(R.Dir, R.Dir);\n" + " float b = 2.0*dot(R.Dir, CO);\n" + " float c = dot(CO, CO) - S.R*S.R;\n" + " float delta = b*b - 4.0*a*c;\n" + " if(delta < 0.0) {\n" + " return false;\n" + " }\n" + " t = (-b-sqrt(delta)) / (2.0*a);\n" + " return true;\n" + "}\n" + "\n" + "// \\brief Computes a reflected Ray\n" + "// \\param[in] I the incident Ray\n" + "// \\param[in] P the point at which the reflection occurs\n" + "// \\param[in] N the normal at P\n" + "// \\return the reflected Ray\n" + "Ray reflect_ray(in Ray I, in vec3 P, in vec3 N) {\n" + " return Ray(\n" + " P,\n" + " -2.0*dot(N,I.Dir)*N + I.Dir\n" + " );\n" + "}\n" + "\n" + "// \\brief Tests whether a Ray is in shadow\n" + "// \\param[in] R a Ray that connects a point to a lightsource\n" + "// \\retval true if the point is in shadow w.r.t. the lightsource\n" + "// \\retval false otherwise\n" + "bool shadow(in Ray R) {\n" + " for(int i=0; i EPSILON && t < 1.0\n" + " ) {\n" + " return true;\n" + " }\n" + " }\n" + " return false;\n" + "}\n" + "\n" + "// \\brief Computes the lighting\n" + "// \\param[in] P the intersection point\n" + "// \\param[in] N the normal to the intersected surface at P\n" + "// \\param[in] material the material\n" + "// \\param[in] Ray the incident Ray\n" + "// \\return the computed color\n" + "vec3 lighting(\n" + " in vec3 P, in vec3 N, in Material material, in Ray R\n" + ") {\n" + "\n" + " // If it is a lightsource, then return its color\n" + " // (and we are done)\n" + " if(material.Ke != vec3(0.0, 0.0, 0.0)) {\n" + " return material.Ke;\n" + " }\n" + "\n" + " vec3 result = vec3(0.0, 0.0, 0.0);\n" + "\n" + " // Compute the influence of all lightsources\n" + " for(int i=0; i 0.0) {\n" + " Kd = vec3(1.0, 1.0, 1.0) - Kd;\n" + " }\n" + " result += lamb * Kd * scene[i].material.Ke;\n" + "\n" + " // Specular lighting\n" + " if(material.Ks != zero3) {\n" + " vec3 Er = 2.0*dot(N,E)*N - E;\n" + " vec3 View = R.Origin - P;\n" + " float spec=max(dot(Er,View),0.0);\n" + " spec /= sqrt(dot(Er,Er)*dot(View,View));\n" + " spec = pow(spec, material.s);\n" + " result +=\n" + " spec * material.Ks * scene[i].material.Ke;\n" + " }\n" + " }\n" + " }\n" + " }\n" + "\n" + " return result;\n" + "}\n" + "\n" + "// \\brief Computes the nearest intersection along a Ray\n" + "// \\param[in] R the ray\n" + "// \\param[out] P the intersection point\n" + "// \\param[out] N the normal to the intersected surface at P\n" + "// \\param[out] material the material of the intersected object\n" + "bool nearest_intersection(\n" + " in Ray R,\n" + " out vec3 P, out vec3 N, out Material material\n" + ") {\n" + " const float FARAWAY=1e30;\n" + " float t = FARAWAY;\n" + "\n" + " for(int i=0; i EPSILON\n" + " ) {\n" + " t = cur_t;\n" + " P = R.Origin + t*R.Dir;\n" + " N = normalize(P - scene[i].sphere.Center);\n" + " material = scene[i].material;\n" + " }\n" + " }\n" + " return (t != FARAWAY);\n" + "}\n" + "\n" + "void mainImage( out vec4 fragColor, in vec2 fragCoord ) {\n" + "\n" + " // Yes, it is a bit stupid to call this for each pixel,\n" + " // but well, does not cost that much...\n" + " init_scene();\n" + "\n" + " float beta = float(iFrame)/150.0;\n" + " float s = sin(beta);\n" + " float c = cos(beta);\n" + "\n" + " // Initialize the Camera (and make it orbit around the\n" + " // origin)\n" + " Camera C = camera(\n" + " vec3(2.0*c, 2.0*s, 1.0),\n" + " vec3(0.5, 0.5, 0.5),\n" + " 50.0\n" + " );\n" + "\n" + " // Lauch the primary ray that corresponds to this pixel\n" + " Ray R = launch(C, fragCoord);\n" + "\n" + "\n" + " fragColor = vec4(0.0, 0.0, 0.0, 1.0);\n" + "\n" + " vec3 P; // Current intersected point\n" + " vec3 N; // Normal to the intersected object at P\n" + " Material material; // Material of the intersected object\n" + "\n" + " // Compute up to 5 ray bounces\n" + " vec3 Kr_cumul = vec3(1.0, 1.0, 1.0);\n" + " for(int k=0; k<5; ++k) {\n" + " if(nearest_intersection(R, P, N, material)) {\n" + " fragColor.rgb += Kr_cumul * lighting(P,N,material,R);\n" + " if(material.Kr == zero3) {\n" + " break;\n" + " }\n" + " Kr_cumul *= material.Kr;\n" + " R = reflect_ray(R, P, N);\n" + " } else {\n" + " fragColor.rgb += Kr_cumul * vec3(0.5, 0.5, 1.0);\n" + " break;\n" + " }\n" + " }\n" + "}\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + ); + + register_embedded_glsl_file("ShaderToy/AlloyPlatedVoronoi.glsl", + "/*\n" + "\n" + " Alloy Plated Voronoi\n" + " --------------------\n" + "\n" + " This was originally a rigid scrolling example, but I thought the movement looked more\n" + " interesting. Obviously, hard, fluid alloy doesn't make a lot of physical sense, so if the\n" + " situation really messes with your sense of correctness, uncomment the \"RIGID_SCOLL\"\n" + " define... or just pretend it's futuristic alien alloy from another dimension. :D\n" + "\n" + " From a technical perspective, it's a couple of smooth Voronoi layers (based on IQ's\n" + " article below), split into fractional contours then bump mapped. Hardly cutting edge,\n" + " and not all that exciting. One of the things that did require some effort was producing\n" + " the succinct smooth borders with enough quality to allow for pronounced bump mapping\n" + " with minimal artifacts. The results are sufficient, but there are probably more efficent\n" + " ways to achieve the same.\n" + "\n" + " I was going for a tarnished silver kind of look. Not sure whether it worked, but it looks\n" + " shiny, so that's good enough for me. :) When I first started taking an interest in graphics,\n" + " my idea of producing a metallic looking object was to render it flat grey, then add some\n" + " ambient lighting... Yes, I was \"that\" naive. :D\n" + "\n" + " These days, I apply a little more science, but a lot of it is still made up. Specular\n" + " lighting and fake reflections help add to the illusion, but I find that ramping the diffuse\n" + " light to a few powers tends to work best. Also, to give the light more angularity, I\n" + " accentuated the bump mapping more than I usually would.\n" + "\n" + " \n" + " \n" + "\n" + " Similar Examples:\n" + "\n" + " Voronoi - smooth - iq\n" + " https://www.shadertoy.com/view/ldB3zc\n" + "\n" + " // Great accompanying article.\n" + " http://www.iquilezles.org/www/articles/smoothvoronoi/smoothvoronoi.htm\n" + "\n" + "\n" + " // A cleaner, more simplistic rendering.\n" + " Smooth Voronoi Contours - Shane\n" + " https://www.shadertoy.com/view/4sdXDX\n" + "\n" + "\n" + "*/\n" + "\n" + "//#define RIGID_SCROLL\n" + "\n" + "// Gradient factor. See the \"func\" function. It's a fudge factor used to make the contour lines appear\n" + "// unison in width. It's a mildly expensive calulation, and I'm reusing it, so it's global. I'll try to\n" + "// localize it later.\n" + "float gF;\n" + "\n" + "//float sFract(float x, float sm){ float fx = fract(x); return fx - smoothstep(fwidth(x)*sm, 0., 1. - fx); }\n" + "//float sFract(float x, float sm){ float fx = fract(x); return min(fx, fx*(1. - fx)/gF/sm); }//fwidth(x)\n" + "\n" + "// Based on Ollj's smooth \"fract\" formula.\n" + "float sFract(float x, float sm){\n" + "\n" + " // Extra smoothing factor. \"1\" is the norm.\n" + " const float sf = .5;\n" + "\n" + " // The hardware \"fwidth\" is cheap, but you could take the expensive route and\n" + " // calculate it by hand if more quality was required.\n" + " vec2 u = vec2(x, fwidth(x)*sf*sm);\n" + "\n" + " // Ollj's original formula with a transcendental term omitted.\n" + " u.x = fract(u.x);\n" + " u += (1. - 2.*u)*step(u.y, u.x);\n" + " return clamp(1. - u.x/u.y, 0., 1.); // Cos term ommitted.\n" + "}\n" + "\n" + "\n" + "\n" + "float sFloor(float x){ return x - sFract(x, 1.); } // Only works for nonnegative \"x,\" which is fine here.\n" + "\n" + "\n" + "// Standard hue rotation formula with a bit of streamlining.\n" + "vec3 rotHue(vec3 p, float a){\n" + "\n" + " vec2 cs = sin(vec2(1.570796, 0) + a);\n" + "\n" + " mat3 hr = mat3(0.299, 0.587, 0.114, 0.299, 0.587, 0.114, 0.299, 0.587, 0.114) +\n" + " mat3(0.701, -0.587, -0.114, -0.299, 0.413, -0.114, -0.300, -0.588, 0.886) * cs.x +\n" + " mat3(0.168, 0.330, -0.497, -0.328, 0.035, 0.292, 1.250, -1.050, -0.203) * cs.y;\n" + " \n" + " return clamp(p*hr, 0., 1.);\n" + "}\n" + "\n" + "\n" + "// Standard 2x2 hash algorithm.\n" + "vec2 hash22(vec2 p) {\n" + "\n" + " // Faster, but probaly doesn't disperse things as nicely as other methods.\n" + " float n = sin(dot(p, vec2(41, 289)));\n" + " p = fract(vec2(2097152, 262144)*n);\n" + " #ifdef RIGID_SCROLL\n" + " return p - .5;\n" + " #else\n" + " return cos(p*6.283 + iTime)*.5;\n" + " //return abs(fract(p+ iTime*.25)-.5)*2. - .5; // Snooker.\n" + " //return abs(cos(p*6.283 + iTime))*.5; // Bounce.\n" + " #endif\n" + "\n" + "}\n" + "\n" + "\n" + "// vec3 to vec3 hash algorithm.\n" + "vec3 hash33(vec3 p) {\n" + "\n" + " // Faster, but doesn't disperse things quite as nicely as the block below it. However, when framerate\n" + " // is an issue, and it often is, this is the one to use. Basically, it's a tweaked amalgamation I put\n" + " // together, based on a couple of other random algorithms I've seen around... so use it with caution,\n" + " // because I make a tonne of mistakes. :)\n" + " float n = sin(dot(p, vec3(7, 157, 113)));\n" + " return fract(vec3(2097152, 262144, 32768)*n)*2. - 1.; // return fract(vec3(64, 8, 1)*32768.0*n)*2.-1.;\n" + "\n" + " // I'll assume the following came from IQ.\n" + " //p = vec3( dot(p, vec3(127.1, 311.7, 74.7)), dot(p, vec3(269.5, 183.3, 246.1)), dot(p, vec3(113.5, 271.9, 124.6)));\n" + " //return (fract(sin(p)*43758.5453)*2. - 1.);\n" + "\n" + "}\n" + "\n" + "\n" + "\n" + "// Cheap, streamlined 3D Simplex noise... of sorts. I cut a few corners, so it's not perfect, but it's\n" + "// artifact free and does the job. I gave it a different name, so that it wouldn't be mistaken for\n" + "// the real thing.\n" + "//\n" + "// Credits: Ken Perlin, the inventor of Simplex noise, of course. Stefan Gustavson's paper -\n" + "// \"Simplex Noise Demystified,\" IQ, other \"ShaderToy.com\" people, etc.\n" + "float tetraNoise(in vec3 p){\n" + "\n" + " // Skewing the cubic grid, then determining the first vertice and fractional position.\n" + " vec3 i = floor(p + dot(p, vec3(0.333333)) ); p -= i - dot(i, vec3(0.166666)) ;\n" + "\n" + " // Breaking the skewed cube into tetrahedra with partitioning planes, then determining which side of the\n" + " // intersecting planes the skewed point is on. Ie: Determining which tetrahedron the point is in.\n" + " vec3 i1 = step(p.yzx, p), i2 = max(i1, 1.0-i1.zxy); i1 = min(i1, 1.0-i1.zxy);\n" + "\n" + " // Using the above to calculate the other three vertices. Now we have all four tetrahedral vertices.\n" + " vec3 p1 = p - i1 + 0.166666, p2 = p - i2 + 0.333333, p3 = p - 0.5;\n" + "\n" + "\n" + " // 3D simplex falloff.\n" + " vec4 v = max(0.5 - vec4(dot(p,p), dot(p1,p1), dot(p2,p2), dot(p3,p3)), 0.0);\n" + "\n" + " // Dotting the fractional position with a random vector generated for each corner -in order to determine\n" + " // the weighted contribution distribution... Kind of. Just for the record, you can do a non-gradient, value\n" + " // version that works almost as well.\n" + " vec4 d = vec4(dot(p, hash33(i)), dot(p1, hash33(i + i1)), dot(p2, hash33(i + i2)), dot(p3, hash33(i + 1.)));\n" + "\n" + "\n" + " // Simplex noise... Not really, but close enough. :)\n" + " return clamp(dot(d, v*v*v*8.)*1.732 + .5, 0., 1.); // Not sure if clamping is necessary. Might be overkill.\n" + "\n" + "}\n" + "\n" + "\n" + "\n" + "// Smooth Voronoi. I'm not sure who came up with the original, but I think IQ\n" + "// was behind this particular algorithm. It's just like the regular Voronoi\n" + "// algorithm, but instead of determining the minimum distance, you accumulate\n" + "// values - analogous to adding metaball field values. The result is a nice\n" + "// smooth pattern. The \"falloff\" variable is a smoothing factor of sorts.\n" + "//\n" + "float smoothVoronoi(vec2 p, float falloff) {\n" + "\n" + " vec2 ip = floor(p); p -= ip;\n" + " \n" + " float d = 1., res = 0.;\n" + " \n" + " for(int i=-1; i<=2; i++) {\n" + " for(int j=-1; j<=2; j++) {\n" + "\n" + " vec2 b = vec2(i, j);\n" + "\n" + " vec2 v = b - p + hash22(ip + b);\n" + "\n" + " d = max(dot(v,v), 1e-8);\n" + " \n" + " res += 1./pow(d, falloff );\n" + " //res += exp( -16.*d ); // Alternate version.\n" + " }\n" + " }\n" + "\n" + " return pow(1./res, .5/falloff);\n" + " //return clamp((-(1./16.)*log(res) + .1)/1.1, 0., 1.); // Alternate version.\n" + "}\n" + "\n" + "\n" + "\n" + "// 2D function we'll be creating the fractional contours for.\n" + "float func2D(vec2 p){\n" + "\n" + " #ifdef RIGID_SCROLL\n" + " p += vec2(-.2, 0)*iTime; // Scrolling.\n" + " #endif\n" + "\n" + " return smoothVoronoi(p*2., 4.)*.66 + smoothVoronoi(p*6., 4.)*.34;\n" + "\n" + "}\n" + "\n" + "// For fractional countours, something like \"fract(func(p)*layers\" will work, but the results\n" + "// are aliased, so a smooth \"fract\" function needs to be applied. For nice, even contour lines,\n" + "// the functional curvature needs to be taken into account. Hence the \"fxr\" and \"fyb\" samples.\n" + "float func(vec2 p){\n" + "\n" + " float f = func2D(p); // Function value.\n" + "\n" + " // Samples in the X and Y directions to even up the contour lines according to curvature.\n" + " vec2 e = vec2(8./iResolution.y, 0);\n" + " float fxr = func2D(p - e.xy);\n" + " float fyb = func2D(p - e.yx);\n" + "\n" + " // Gradient factor. Four samples would be better, but I'm trying to save some calculations.\n" + " // I made \"gF\" global, for reuse purposes, but I'll try to rectify that later. See the \"sFract\"\n" + " // function. Press pause, then set \"gF\" to a constant, like \".04,\" to see what it does.\n" + " // This example would be a lot faster if \"gF\" was set to a constant (since the two samples\n" + " // above wouldn't be necessary), so if you like that aesthetic more, then that's the way to go.\n" + " gF = length(f - vec2(fxr, fyb));\n" + "\n" + " const float palNum = 12.; // 12 contour lines.\n" + " return sFract(f*palNum, 4.); // 4 is a smoothing factor. Getting the balance right can be frustrating.\n" + "\n" + "}\n" + "\n" + "// Simple environment mapping. Pass the reflected vector in and create some\n" + "// colored noise with it.\n" + "vec3 envMap(vec3 rd){\n" + "\n" + "\n" + " float c = tetraNoise(rd*3.)*.57 + tetraNoise(rd*6.)*.28 + tetraNoise(rd*12.)*.15; // Noise value.\n" + " c = smoothstep(.4, 1., c); // Darken and add contast for more of a spotlight look.\n" + "\n" + " vec3 col = vec3(c*c*c, c*c, c); // Simple, cool coloring.\n" + " //vec3 col = vec3(min(c*1.5, 1.), pow(c, 2.5), pow(c, 12.)); // Warm color.\n" + "\n" + " // Mix in the reverse color to tone it down and return.\n" + " return mix(col, col.zxy, rd*.25 + .25);\n" + "\n" + "}\n" + "\n" + "\n" + "\n" + "void mainImage(out vec4 fragColor, in vec2 fragCoord){\n" + "\n" + " // Screen coordinates.\n" + " vec2 u = (fragCoord.xy - iResolution.xy*.5)/iResolution.y;\n" + "\n" + " // Function value.\n" + " float f = func(u);\n" + " float ssd = func2D(u); // Saving the unpalettized noise value to add a little gradient to the color, etc.\n" + "\n" + " // Four sample values around the original. Used for edging and highlighting. Note the \"1.5\" factor in a\n" + " // couple of samples. I was playing around and liked it more that way, but you can take it out if you want.\n" + " vec2 e = vec2(2./450., 0);\n" + " float fxl = func(u + e.xy*1.5);\n" + " float fxr = func(u - e.xy);\n" + " float fyt = func(u + e.yx*1.5);\n" + " float fyb = func(u - e.yx);\n" + "\n" + " // Colorizing the the function value.\n" + " vec3 col = vec3(.5);\n" + "\n" + " // Applying some color and hue rotation based on fractional layer and position. Designed to coincide\n" + " // with the \"func\" function.\n" + " const float palNum2 = 12.;\n" + " float fi = (1. - clamp(sFloor(ssd*(palNum2))/(palNum2 - 1.), 0., 1.));\n" + " fi = mod(fi, 4./12.);\n" + "\n" + " if(fi>3./12.) {\n" + " // Extra color layers. I found it a bit much.\n" + " //col *= vec3(1, .18, .28);\n" + " //col = rotHue(col, mod(iTime/3. + 3.14159, 6.2831853) + (length(u*vec2(3., 5.))));\n" + " col *= .25;\n" + " }\n" + " else if(fi>2./12.) {\n" + "\n" + " col *= vec3(1, .18, .28);\n" + " col = rotHue(col, mod(iTime/4., 6.2831853) + (length(u*vec2(2.5, 4.5))));// + iTime*.5\n" + " }\n" + "\n" + " // Adding a bit of noise for a bit more authenticity.\n" + " vec3 u3 = vec3(u, f); // Fake height, \"ssd,\" according to function value.\n" + " #ifdef RIGID_SCROLL\n" + " u3.xy += vec2(-.2, 0)*iTime; // Scrolling.\n" + " #endif\n" + " col = min(col*.8 + tetraNoise(u3*128.)*.4, 1.);\n" + "\n" + "\n" + "\n" + " // Extra highlighting to shine up the edges. Purely for aesthetics. Not based on science. :)\n" + " col += vec3(.5, .7, 1)*(max(f - fyt, 0.) + max(f - fxl, 0.))*1.*ssd*2.;\n" + "\n" + "\n" + " vec3 rd = normalize(vec3(u, 1)); // Unit direction vector.\n" + " vec3 n = normalize(vec3(0, 0, -1) + vec3(fxr - fxl, fyb - fyt, 0)/e.x/1.4*.01); // Bumped normal.\n" + " vec3 ld = (vec3(.25, .25, -1.) - vec3(u, 0)); // Light direction - Position minus surface point.\n" + "\n" + " float dist = length(ld); // Light distance.\n" + " float atten = 1./(1. + dist*dist*.25); // Light attenuation.\n" + "\n" + " ld /= dist; // Normalizing the light dirction vector.\n" + "\n" + "\n" + " float diff = max(dot(ld, n), 0.); // Diffuse.\n" + " diff = pow(diff, 4.)*.66 + pow(diff, 8.)*.34; // Ramped diffuse - for shininess.\n" + " float spec = pow(max(dot(reflect(ld, n), rd), 0.), 8.); // Specular.\n" + " float fres = pow(clamp(dot(rd, n) + 1., 0., 1.), 3.); // Fresnel.\n" + "\n" + " // Combining the above terms to produce the lit color.\n" + " col = col*(diff*2. + .125) + vec3(1, .7, .3)*spec*2. + vec3(.25, .5, 1)*fres*2.;\n" + " //col += vec3(.5, .7, 1)*diff*diff*.5; // Too much shine. :)\n" + "\n" + "\n" + " // Fake environment mapping for that reflective look.\n" + " col += (col*.65 + .35)*envMap(reflect(rd, vec3(0, 0, -1)*.25 + n*.75))*2.;\n" + "\n" + " // Attenuating, then adding some brown shadowing for a subtle tarnished look.\n" + " col *= atten*(vec3(f, pow(f, 1.1), pow(f, 1.2))*.85 + .15);\n" + "\n" + "\n" + " // col *= vec3(1.2, .95, .8); // Bronze, copper... kind of.\n" + "\n" + "\n" + " // Subtle, bluish vignette.\n" + " //u = fragCoord/iResolution.xy;\n" + " //col = mix(vec3(0, .1, 1), col, pow( 16.0*u.x*u.y*(1.0-u.x)*(1.0-u.y) , .125)*.15 + .85);\n" + "\n" + " \n" + " // Rough gamma correction.\n" + " fragColor = vec4(sqrt(clamp(col, 0., 1.)), 1);\n" + "\n" + "}\n" + ); + + register_embedded_glsl_file("ShaderToy/AndromedaJewel.glsl", + "#define pi 3.14159265359\n" + "//this noise stuff is from iq thanks\n" + "float hash (vec2 v) {\n" + " v = floor(v);\n" + " return fract(67.3249*sin(17.1234*length(v-vec2(34.14,123.))));\n" + "}\n" + "float noise (vec2 v) {\n" + " vec4 n = vec4(floor(v),ceil(v));\n" + " vec4 h = vec4(hash(n.xy),hash(n.zy),hash(n.xw),hash(n.zw));\n" + " return mix(mix(h.x,h.y,v.x-n.x),mix(h.z,h.w,v.x-n.x),v.y-n.y);\n" + "}\n" + "mat2 r (float a) {\n" + " float s = sin(a), c = cos(a);\n" + " return mat2(s,-c,c,s);\n" + "}\n" + "float no (vec2 v) {\n" + " float c = 0.;\n" + " for (int i = 1; i < 10; i++) {\n" + " v = 2.*r(0.2944*pi)*v;\n" + " c += 0.2*noise(v)/(1.+length(sin(0.5*v)));\n" + " }\n" + " return c;\n" + "}\n" + "// flow stuff is from trirop https://www.shadertoy.com/view/MsScWD very cool\n" + "vec2 ff (vec2 v) {\n" + " float n = 1.+0.5*noise(v);\n" + " return\n" + " sign(v.y-0.5)*50.*vec2(n*sin(1.4*v.y),0.)/(v.y+3.5)+\n" + " .1*vec2(sin(-12.*v.y*n),cos(13.*v.x))+\n" + " 1.8*vec2(cos(-6.*v.y),sin(4.*v.x))+\n" + " 1.2*vec2(sin(-1.4*v.y),cos(1.5*v.x))+\n" + " 2.0*vec2(sin(-.5*v.y),cos(.6*v.x))+\n" + " 0.8*vec2(sin(-.2*v.y),cos(.2*v.x*n))\n" + " ;}\n" + "bool star = false;\n" + "vec2 mouse;\n" + "void sphere (inout vec3 p, inout vec3 d) {\n" + " float r = .7, dp = dot(d,p), pp = dot(p,p), det = dp*dp+r*r-pp;\n" + " if (det < 0.) star = true;\n" + " float x = -dp+sqrt(det);\n" + " p = (p+d*x);\n" + " d = reflect(normalize(p),d);\n" + "}\n" + "\n" + "vec3 surface (vec2 uv) {\n" + " vec3 col = 0.*vec3(7.-abs(uv.y))*no (uv);\n" + " for (int i = 0; i < 45; i++) {\n" + " uv += 0.01*(2.+1.5*sin(.1*iTime))*ff(uv);\n" + " }\n" + " float j = no(0.1*uv*pi);\n" + " vec3 c = sin(j*vec3(1,2,3));\n" + " col += abs(mix(c*c*c,vec3(j),abs(1.-uv.y/7.5)));\n" + " return col;\n" + "}\n" + "vec3 stars (vec2 v) {\n" + " return vec3(pow(1.35*no(0.1*iTime+5.*mouse+3.*v/dot(v,v)),7.));\n" + "}\n" + "void mainImage( out vec4 fragColor, in vec2 U )\n" + "{\n" + " vec2 uv = (2.*U-iResolution.xy)/iResolution.y;\n" + " float q = 1.2+0.1*min(17.,iTime);\n" + " vec3 p = vec3(0,0,-q);\n" + " vec3 d = normalize(vec3(uv,4.));\n" + " mouse = iMouse.xy/iResolution.xy;\n" + " p.yz = r(-mouse.y+0.7*pi)*p.yz;\n" + " d.yz = r(-mouse.y+0.7*pi)*d.yz;\n" + " p.zx = r(mouse.x+0.25*pi)*p.zx;\n" + " d.zx = r(mouse.x+0.25*pi)*d.zx;\n" + " vec3 col;\n" + " sphere(p,d);\n" + " if (star) {\n" + " col = stars(uv);\n" + " } else {\n" + " col = 0.8*surface(8.*vec2(atan(d.z,d.x)+0.01*iTime*min(iTime,17.),acos(d.y)));\n" + " float sh = dot(d,normalize(vec3(1,0,-1)));\n" + " col *= sh+0.4;\n" + " }\n" + " float l = length(uv-vec2(0.2,0))*q;\n" + " col = col+.09*vec3(0.5,0.7,1.)*(uv.x+0.5)*exp(-0.01*l*l*l*l)*q;\n" + " fragColor = vec4(col,1);\n" + "}\n" ); + + register_embedded_glsl_file("ShaderToy/Circuits.glsl", + "#define time iTime*.02\n" + "\n" + "\n" + "#define width .005\n" + "float zoom = .18;\n" + "\n" + "float shape=0.;\n" + "vec3 color=vec3(0.),randcol;\n" + "\n" + "void formula(vec2 z, float c) {\n" + " float minit=0.;\n" + " float o,ot2,ot=ot2=1000.;\n" + " for (int i=0; i<9; i++) {\n" + " z=abs(z)/clamp(dot(z,z),.1,.5)-c;\n" + " float l=length(z);\n" + " o=min(max(abs(min(z.x,z.y)),-l+.25),abs(l-.25));\n" + " ot=min(ot,o);\n" + " ot2=min(l*.1,ot2);\n" + " minit=max(minit,float(i)*(1.-abs(sign(ot-o))));\n" + " }\n" + " minit+=1.;\n" + " float w=width*minit*2.;\n" + " float circ=pow(max(0.,w-ot2)/w,6.);\n" + " shape+=max(pow(max(0.,w-ot)/w,.25),circ);\n" + " vec3 col=normalize(.3+texture(iChannel1,vec2(minit*.1)).rgb);\n" + " color+=col*(.4+mod(minit/9.-time*10.+ot2*2.,1.)*1.6);\n" + " color+=vec3(1.,.7,.3)*circ*(10.-minit)*3.*smoothstep(0.,.5,.15+texture(iChannel0,vec2(.0,1.)).x-.5);\n" + "}\n" + "\n" + "\n" + "void mainImage( out vec4 fragColor, in vec2 fragCoord )\n" + "{\n" + " vec2 pos = fragCoord.xy / iResolution.xy - .5;\n" + " pos.x*=iResolution.x/iResolution.y;\n" + " vec2 uv=pos;\n" + " float sph = length(uv); sph = sqrt(1. - sph*sph)*1.5; // curve for spheric distortion\n" + " uv=normalize(vec3(uv,sph)).xy;\n" + " float a=time+mod(time,1.)*.5;\n" + " vec2 luv=uv;\n" + " float b=a*5.48535;\n" + "// zoom*=1.+sin(time*3.758123)*.8;\n" + " uv*=mat2(cos(b),sin(b),-sin(b),cos(b));\n" + " uv+=vec2(sin(a),cos(a*.5))*8.;\n" + " uv*=zoom;\n" + " float pix=.5/iResolution.x*zoom/sph;\n" + " float dof=max(1.,(10.-mod(time,1.)/.01));\n" + " float c=1.5+mod(floor(time),6.)*.125;\n" + " for (int aa=0; aa<36; aa++) {\n" + " vec2 aauv=floor(vec2(float(aa)/6.,mod(float(aa),6.)));\n" + " formula(uv+aauv*pix*dof,c);\n" + " }\n" + " shape/=36.; color/=36.;\n" + " vec3 colo=mix(vec3(.15),color,shape)*(1.-length(pos))*min(1.,abs(.5-mod(time+.5,1.))*10.); \n" + " colo*=vec3(1.2,1.1,1.0);\n" + " fragColor = vec4(colo,1.0);\n" + "}\n" + "\n" + ); + + register_embedded_glsl_file("ShaderToy/ContouredLayers.glsl", + "/*\n" + "\n" + " Contoured Layers\n" + " ----------------\n" + "\n" + " Constructing some concise contoured layers, then applying various edge and shading\n" + " effects to produce some faux depth. Technically, that's what is happening here, but\n" + " this example was mainly put together as a means to demonstrate various layering\n" + " effects, like strokes, highlights, shadows, etc. No 3D was harmed during the making\n" + " of this example. :)\n" + "\n" + " I love those contoured noise-based paper layer images that various graphic artists\n" + " from places like Adobe distribute with their applications. Most consist of some\n" + " antialised noise layers rendered in a flat tone with drop shadows for each. The\n" + " fancier ones sometimes include highlighted edges, etc, which is what I've put\n" + " together here. None of it is difficult to produce, provided you're happy with\n" + " concept of smoothing layers at a particular threshold with respect to the field\n" + " derivative.\n" + "\n" + " I put in a few diferent aesthetic options to try, just to show how much something\n" + " like a simple palette change, drop shadow, etc, can effect the overall feel.\n" + " Anyway, feel free to play around with the defines below. At some stage, I might\n" + " render some icons and allow the various options to be manipulated via the mouse,\n" + " but for now, this will suffice.\n" + "\n" + " I also have a few raymarched 3D versions that I'll put up at a later date. \n" + "\n" + "\n" + "*/\n" + "\n" + "// Dropping down a blurry dark layer to give a fake ambient occlusion effect.\n" + "// It's subtle, but gives things a bit more depth. However, turning it off gives\n" + "// a crisper look. I guess it depends what you're after.\n" + "#define FAKE_AO\n" + "\n" + "// Controur strokes are great for that hand drawn look, or just to give some definition\n" + "// to geometry. This one is dark, but it can be any color.\n" + "#define STROKE\n" + "\n" + "// Highlights, to give the impression that light is hitting the surface.\n" + "#define HILIGHT\n" + "\n" + "// Shadows: There aren't too many times when I wouldn't want shadows, but I can think\n" + "// of a few. If expense if a problem, you can fake it with a thicker AO layer, but it's\n" + "// not quite the same.\n" + "#define SHADOW\n" + "\n" + "// Include the metallic texture. I overuse this particular texture, but it's the only\n" + "// one on Shadertoy with a fine enough grade on it. I'm hoping more subtle textures\n" + "// will get added at some stage. :)\n" + "// #define TEXTURED\n" + "\n" + "// Running a cheap hatch-like algorithm over the layers for a bit of extra texture.\n" + "#define HATCH\n" + "\n" + "// Very subtle paper grain. It's pretty simple, and I think it came from one of\n" + "// Flockaroo's examples.\n" + "#define PAPER_GRAIN\n" + "\n" + "// Palette: It's amazing how something as simple as color choice can effect the feel\n" + "// of an image.\n" + "// Settings: Greyscale: 0, Red: 1, Blue: 2, Earth: 3, Pink and grey: 4.\n" + "#define PALETTE 3\n" + "\n" + "\n" + "\n" + "\n" + "// Standard 2D rotation formula.\n" + "mat2 rot2(in float a){ float c = cos(a), s = sin(a); return mat2(c, -s, s, c); }\n" + "\n" + "// vec3 to float hash.\n" + "float hash21( vec2 p ){\n" + "\n" + " return fract(sin(dot(p, vec2(41, 289)))*45758.5453);\n" + "\n" + " //p.x = fract(sin(dot(p, vec2(1, 113)))*45758.5453);\n" + " //return sin(p.x*6.2831853 + iTime);\n" + "}\n" + "\n" + "// vec2 to vec2 hash.\n" + "vec2 hash22(vec2 p) {\n" + "\n" + " // Faster, but doesn't disperse things quite as nicely. However, when framerate\n" + " // is an issue, and it often is, this is a good one to use. Basically, it's a tweaked\n" + " // amalgamation I put together, based on a couple of other random algorithms I've\n" + " // seen around... so use it with caution, because I make a tonne of mistakes. :)\n" + " float n = sin(dot(p, vec2(1, 113)));\n" + " //return fract(vec2(262144, 32768)*n)*2. - 1.;\n" + "\n" + " // Animated.\n" + " p = fract(vec2(262144, 32768)*n);\n" + " // Note the \".45,\" insted of \".5\" that you'd expect to see. When edging, it can open\n" + " // up the cells ever so slightly for a more even spread. In fact, lower numbers work\n" + " // even better, but then the random movement would become too restricted. Zero would\n" + " // give you square cells.\n" + " return sin( p*6.2831853 + iTime);\n" + "\n" + "}\n" + "\n" + "\n" + "\n" + "// Cheap and nasty 2D smooth noise function with inbuilt hash function -- based on IQ's\n" + "// original. Very trimmed down. In fact, I probably went a little overboard. I think it\n" + "// might also degrade with large time values, but that's not an issue here.\n" + "float n2D(vec2 p) {\n" + "\n" + " vec2 i = floor(p); p -= i; p *= p*(3. - p*2.);\n" + "\n" + " return dot(mat2(fract(sin(vec4(0, 1, 113, 114) + dot(i, vec2(1, 113)))*43758.5453))*\n" + " vec2(1. - p.y, p.y), vec2(1. - p.x, p.x) );\n" + "\n" + "}\n" + "\n" + "\n" + "// Based on IQ's gradient noise formula.\n" + "float n2D3G( in vec2 p ){\n" + "\n" + " vec2 i = floor(p); p -= i;\n" + "\n" + " vec4 v;\n" + " v.x = dot(hash22(i), p);\n" + " v.y = dot(hash22(i + vec2(1, 0)), p - vec2(1, 0));\n" + " v.z = dot(hash22(i + vec2(0, 1)), p - vec2(0, 1));\n" + " v.w = dot(hash22(i + 1.), p - 1.);\n" + "\n" + "#if 1\n" + " // Quintic interpolation.\n" + " p = p*p*p*(p*(p*6. - 15.) + 10.);\n" + "#else\n" + " // Cubic interpolation.\n" + " p = p*p*(3. - 2.*p);\n" + "#endif\n" + "\n" + " return mix(mix(v.x, v.y, p.x), mix(v.z, v.w, p.x), p.y);\n" + " //return v.x + p.x*(v.y - v.x) + p.y*(v.z - v.x) + p.x*p.y*(v.x - v.y - v.z + v.w);\n" + "}\n" + "\n" + "\n" + "\n" + "// The map function. Just two layers of gradient noise. Way more interesting\n" + "// functions are possible, but we're keeping things simple.\n" + "float map(vec3 p, float i){\n" + "\n" + " return n2D3G(p.xy*3.)*.66 + n2D3G(p.xy*6.)*.34 + i/10.*1. - .15;\n" + "\n" + "}\n" + "\n" + "\n" + "// 2D derivative function.\n" + "vec3 getNormal(in vec3 p, float m, float i) {\n" + " \n" + " vec2 e = vec2(.001, 0);\n" + "\n" + " // Four extra samples. Slightly better, but not really needed here.\n" + " //return (vec3(map(p + e.xyy, i) - map(p - e.xyy, i), map(p + e.yxy, i) - map(p - e.yxy, i), 0.))/e.x*.7071;\n" + "\n" + " // Three samples, but only two extra sample calculations.\n" + " return (vec3(m - map(p - e.xyy, i), m - map(p - e.yxy, i), 0.))/e.x*1.4142;\n" + "}\n" + "\n" + "// The map layer and its derivative. To produce constant width layer edges, the derivative\n" + "// is necessary, so the distance field value and the derivative at the point is returned.\n" + "vec4 mapLayer(in vec3 p, float i){\n" + "\n" + " vec4 d;\n" + "\n" + " d.x = map(p, i); // Distance field value.\n" + "\n" + " d.yzw = getNormal(p, d.x, i); // Derivative.\n" + "\n" + " return d;\n" + "\n" + "}\n" + "\n" + "\n" + "\n" + "// Layer color. Based on the shade, layer number and smoothing factor.\n" + "vec3 getCol(vec2 p, float sh, float fi, float sf){\n" + "\n" + " // Color.\n" + " vec3 col;\n" + "\n" + "\n" + " #if PALETTE == 0\n" + " // Light attenuation palette.\n" + " col = vec3(1)*(1. - .75/(1. + sh*sh*2.));\n" + " //col = vec3(sh*sh*.65 + .22);\n" + " //col = vec3(sh*.5 + .2);\n" + " // Etc.\n" + " #elif PALETTE == 1\n" + " col = pow(min(vec3(1.5, 1, 1)*(sh*.35 + .6), 1.), vec3(1, 3, 16));\n" + " if(fi==0.) col = vec3(.35, .05, .3);\n" + " col = mix(col.xzy, col, sh*.5 + .5);\n" + " #elif PALETTE == 2\n" + " col = pow(min(vec3(1.5, 1, 1)*(sh*.35 + .6), 1.), vec3(1, 3, 16));\n" + " if(fi==0.) col = vec3(.6, .2, .07);\n" + " col = mix(col.xzy, col, sh*.5 + .5).zyx;\n" + " #elif PALETTE == 3\n" + " if(fi==0.) col = vec3(.25, .52, .75);\n" + " if(fi==1.) col = vec3(.8, .8, .6);\n" + " if(fi==2.) col = vec3(.75, .6, .5);\n" + " if(fi==3.) col = vec3(.6, .58, .5);\n" + " if(fi==4.) col = vec3(.5, .72, .4);\n" + " if(fi==5.) col = vec3(.65, .85, .5);\n" + " #else\n" + " if(mod(fi, 2.)<.5) col = vec3(.25, .15, .2);\n" + " else col = vec3(1, .15, .4)*.8;\n" + " #endif\n" + "\n" + "\n" + " #ifdef TEXTURED\n" + " vec3 tx = texture(iChannel0, p + hash21(vec2(sh, fi))).xyz; tx *= tx;\n" + " col = min(col*tx*3., 1.);\n" + " #endif\n" + "\n" + "\n" + " return col;\n" + "\n" + "}\n" + "\n" + "\n" + "void mainImage(out vec4 fragColor, in vec2 fragCoord){\n" + "\n" + "\n" + " // Aspect correct screen coordinates. Setting a minumum resolution on the\n" + " // fullscreen setting in an attempt to keep things relatively crisp.\n" + " float res = min(iResolution.y, 700.);\n" + " vec2 uv = (fragCoord - iResolution.xy*.5)/res;\n" + "\n" + " // Scaling and translation.\n" + " vec2 p = uv + vec2(0.1, 0.1)*iTime;\n" + "\n" + " // Resolution based smoothing factor. Later, the contour derivative will\n" + " // be factored in.\n" + " float sf = 1./iResolution.y;\n" + "\n" + " // Initialize to the first layer color.\n" + " vec3 col = getCol(p, 0., 0., sf);\n" + "\n" + " // Previous layer variable.\n" + " float pL = 0.;\n" + "\n" + "\n" + " // Random looking diagonal hatch lines.\n" + " vec2 u2 = p*res/16.;\n" + " float hatch = clamp(sin((u2.x - u2.y)*3.14159*200.)*2. + .5, 0., 1.); // Diagonal lines.\n" + " float hRnd = hash21(floor(u2*6.) + .73);\n" + " if(hRnd>.66) hatch = hRnd; // Slight randomization of the diagonal lines.\n" + " #ifdef TEXTURED\n" + " hatch = hatch*.75 + .5; // Stronger hatching for the textured version.\n" + " #else\n" + " hatch = hatch*.5 + .75;\n" + " #endif\n" + "\n" + " #ifndef HATCH\n" + " hatch = 1.;\n" + " #endif\n" + "\n" + " // Applying the cross hatch.\n" + " col *= hatch;\n" + "\n" + " // Number of layers.\n" + " int lNum = 5;\n" + " float flNum = 5.;\n" + "\n" + "\n" + " for(int i = 0; i0.0) c=vec4(0,0,0,0); else\n" + " if (0.0/6.00.2) color.a=0.0;\n" + " return color;\n" + "}\n" + "\n" + "\n" + "// Raymarching and 2D graphics\n" + "\n" + "vec3 raymarch(in vec3 from, in vec3 dir)\n" + "\n" + "{\n" + " edge=0.;\n" + " vec3 p, norm;\n" + " float d=100.;\n" + " float totdist=0.;\n" + " for (int i=0; idet && totdist<25.0) {\n" + " p=from+totdist*dir;\n" + " d=de(p);\n" + " det=detail*exp(.13*totdist);\n" + " totdist+=d;\n" + " }\n" + " }\n" + " vec3 col=vec3(0.);\n" + " p-=(det-d)*dir;\n" + " norm=normal(p);\n" + "#ifdef SHOWONLYEDGES\n" + " col=1.-vec3(edge); // show wireframe version\n" + "#else\n" + " col=(1.-abs(norm))*max(0.,1.-edge*.8); // set normal as color with dark edges\n" + "#endif \n" + " totdist=clamp(totdist,0.,26.);\n" + " dir.y-=.02;\n" + "// float sunsize=7.-max(0.,texture(iChannel0,vec2(.6,.2)).x)*5.; // responsive sun size\n" + " float sunsize=7.;\n" + " float an=atan(dir.x,dir.y)+iTime*1.5; // angle for drawing and rotating sun\n" + " float s=pow(clamp(1.0-length(dir.xy)*sunsize-abs(.2-mod(an,.4)),0.,1.),.1); // sun\n" + " float sb=pow(clamp(1.0-length(dir.xy)*(sunsize-.2)-abs(.2-mod(an,.4)),0.,1.),.1); // sun border\n" + " float sg=pow(clamp(1.0-length(dir.xy)*(sunsize-4.5)-.5*abs(.2-mod(an,.4)),0.,1.),3.); // sun rays\n" + " float y=mix(.45,1.2,pow(smoothstep(0.,1.,.75-dir.y),2.))*(1.-sb*.5); // gradient sky\n" + " \n" + " // set up background with sky and sun\n" + " vec3 backg=vec3(0.5,0.,1.)*((1.-s)*(1.-sg)*y+(1.-sb)*sg*vec3(1.,.8,0.15)*3.);\n" + " backg+=vec3(1.,.9,.1)*s;\n" + " backg=max(backg,sg*vec3(1.,.9,.5));\n" + " \n" + " col=mix(vec3(1.,.9,.3),col,exp(-.004*totdist*totdist));// distant fading to sun color\n" + " if (totdist>25.) col=backg; // hit background\n" + " col=pow(col,vec3(GAMMA))*BRIGHTNESS;\n" + " col=mix(vec3(length(col)),col,SATURATION);\n" + "#ifdef SHOWONLYEDGES\n" + " col=1.-vec3(length(col));\n" + "#else\n" + " col*=vec3(1.,.9,.85);\n" + "#ifdef NYAN\n" + " dir.yx*=rot(dir.x);\n" + " vec2 ncatpos=(dir.xy+vec2(-3.+mod(-t,6.),-.27));\n" + " vec4 ncat=nyan(ncatpos*5.);\n" + " vec4 rain=rainbow(ncatpos*10.+vec2(.8,.5));\n" + " if (totdist>8.) col=mix(col,max(vec3(.2),rain.xyz),rain.a*.9);\n" + " if (totdist>8.) col=mix(col,max(vec3(.2),ncat.xyz),ncat.a*.9);\n" + "#endif\n" + "#endif\n" + " return col;\n" + "}\n" + "\n" + "// get camera position\n" + "vec3 move(inout vec3 dir) {\n" + " vec3 go=path(t);\n" + " vec3 adv=path(t+.7);\n" + " float hd=de(adv);\n" + " vec3 advec=normalize(adv-go);\n" + " float an=adv.x-go.x; an*=min(1.,abs(adv.z-go.z))*sign(adv.z-go.z)*.7;\n" + " dir.xy*=mat2(cos(an),sin(an),-sin(an),cos(an));\n" + " an=advec.y*1.7;\n" + " dir.yz*=mat2(cos(an),sin(an),-sin(an),cos(an));\n" + " an=atan(advec.x,advec.z);\n" + " dir.xz*=mat2(cos(an),sin(an),-sin(an),cos(an));\n" + " return go;\n" + "}\n" + "\n" + "void mainImage( out vec4 fragColor, in vec2 fragCoord )\n" + "{\n" + " vec2 uv = fragCoord.xy / iResolution.xy*2.-1.;\n" + " vec2 oriuv=uv;\n" + " uv.y*=iResolution.y/iResolution.x;\n" + " vec2 mouse=(iMouse.xy/iResolution.xy-.5)*3.;\n" + " if (iMouse.z<1.) mouse=vec2(0.,-0.05);\n" + " float fov=.9-max(0.,.7-iTime*.3);\n" + " vec3 dir=normalize(vec3(uv*fov,1.));\n" + " dir.yz*=rot(mouse.y);\n" + " dir.xz*=rot(mouse.x);\n" + " vec3 from=origin+move(dir);\n" + " vec3 color=raymarch(from,dir);\n" + " #ifdef BORDER\n" + " color=mix(vec3(0.),color,pow(max(0.,.95-length(oriuv*oriuv*oriuv*vec2(1.05,1.1))),.3));\n" + " #endif\n" + " fragColor = vec4(color,1.);\n" + "}\n" + "\n" + ); + + register_embedded_glsl_file("ShaderToy/GeodesicTiling.glsl", + "#define MODEL_ROTATION vec2(.3, .25)\n" + "#define CAMERA_ROTATION vec2(.5, .5)\n" + "\n" + "// 0: Defaults\n" + "// 1: Model\n" + "// 2: Camera\n" + "#define MOUSE_CONTROL 1\n" + "\n" + "//#define DEBUG\n" + "\n" + "// 1, 2, or 3\n" + "//#define LOOP 1\n" + "\n" + "\n" + "// --------------------------------------------------------\n" + "// HG_SDF\n" + "// https://www.shadertoy.com/view/Xs3GRB\n" + "// --------------------------------------------------------\n" + "\n" + "void pR(inout vec2 p, float a) {\n" + " p = cos(a)*p + sin(a)*vec2(p.y, -p.x);\n" + "}\n" + "\n" + "float pReflect(inout vec3 p, vec3 planeNormal, float offset) {\n" + " float t = dot(p, planeNormal)+offset;\n" + " if (t < 0.) {\n" + " p = p - (2.*t)*planeNormal;\n" + " }\n" + " return sign(t);\n" + "}\n" + "\n" + "float smax(float a, float b, float r) {\n" + " float m = max(a, b);\n" + " if ((-a < r) && (-b < r)) {\n" + " return max(m, -(r - sqrt((r+a)*(r+a) + (r+b)*(r+b))));\n" + " } else {\n" + " return m;\n" + " }\n" + "}\n" + "\n" + "\n" + "// --------------------------------------------------------\n" + "// Icosahedron domain mirroring\n" + "// Adapted from knighty https://www.shadertoy.com/view/MsKGzw\n" + "// --------------------------------------------------------\n" + "\n" + "#define PI 3.14159265359\n" + "\n" + "vec3 facePlane;\n" + "vec3 uPlane;\n" + "vec3 vPlane;\n" + "\n" + "int Type=5;\n" + "vec3 nc;\n" + "vec3 pab;\n" + "vec3 pbc;\n" + "vec3 pca;\n" + "\n" + "void initIcosahedron() {//setup folding planes and vertex\n" + " float cospin=cos(PI/float(Type)), scospin=sqrt(0.75-cospin*cospin);\n" + " nc=vec3(-0.5,-cospin,scospin);//3rd folding plane. The two others are xz and yz planes\n" + " pbc=vec3(scospin,0.,0.5);//No normalization in order to have 'barycentric' coordinates work evenly\n" + " pca=vec3(0.,scospin,cospin);\n" + " pbc=normalize(pbc); pca=normalize(pca);//for slightly better DE. In reality it's not necesary to apply normalization :)\n" + " pab=vec3(0,0,1);\n" + "\n" + " facePlane = pca;\n" + " uPlane = cross(vec3(1,0,0), facePlane);\n" + " vPlane = vec3(1,0,0);\n" + "}\n" + "\n" + "void pModIcosahedron(inout vec3 p) {\n" + " p = abs(p);\n" + " pReflect(p, nc, 0.);\n" + " p.xy = abs(p.xy);\n" + " pReflect(p, nc, 0.);\n" + " p.xy = abs(p.xy);\n" + " pReflect(p, nc, 0.);\n" + "}\n" + "\n" + "\n" + "// --------------------------------------------------------\n" + "// Triangle tiling\n" + "// Adapted from mattz https://www.shadertoy.com/view/4d2GzV\n" + "// --------------------------------------------------------\n" + "\n" + "const float sqrt3 = 1.7320508075688772;\n" + "const float i3 = 0.5773502691896258;\n" + "\n" + "const mat2 cart2hex = mat2(1, 0, i3, 2. * i3);\n" + "const mat2 hex2cart = mat2(1, 0, -.5, .5 * sqrt3);\n" + "\n" + "#define PHI (1.618033988749895)\n" + "#define TAU 6.283185307179586\n" + "\n" + "struct TriPoints {\n" + " vec2 a;\n" + " vec2 b;\n" + " vec2 c;\n" + " vec2 center;\n" + " vec2 ab;\n" + " vec2 bc;\n" + " vec2 ca;\n" + "};\n" + "\n" + "TriPoints closestTriPoints(vec2 p) {\n" + " vec2 pTri = cart2hex * p;\n" + " vec2 pi = floor(pTri);\n" + " vec2 pf = fract(pTri);\n" + "\n" + " float split1 = step(pf.y, pf.x);\n" + " float split2 = step(pf.x, pf.y);\n" + "\n" + " vec2 a = vec2(split1, 1);\n" + " vec2 b = vec2(1, split2);\n" + " vec2 c = vec2(0, 0);\n" + "\n" + " a += pi;\n" + " b += pi;\n" + " c += pi;\n" + "\n" + " a = hex2cart * a;\n" + " b = hex2cart * b;\n" + " c = hex2cart * c;\n" + "\n" + " vec2 center = (a + b + c) / 3.;\n" + "\n" + " vec2 ab = (a + b) / 2.;\n" + " vec2 bc = (b + c) / 2.;\n" + " vec2 ca = (c + a) / 2.;\n" + "\n" + " return TriPoints(a, b, c, center, ab, bc, ca);\n" + "}\n" + "\n" + "\n" + "// --------------------------------------------------------\n" + "// Geodesic tiling\n" + "// --------------------------------------------------------\n" + "\n" + "struct TriPoints3D {\n" + " vec3 a;\n" + " vec3 b;\n" + " vec3 c;\n" + " vec3 center;\n" + " vec3 ab;\n" + " vec3 bc;\n" + " vec3 ca;\n" + "};\n" + "\n" + "vec3 intersection(vec3 n, vec3 planeNormal, float planeOffset) {\n" + " float denominator = dot(planeNormal, n);\n" + " float t = (dot(vec3(0), planeNormal ) + planeOffset) / -denominator;\n" + " return n * t;\n" + "}\n" + "\n" + "//// Edge length of an icosahedron with an inscribed sphere of radius of 1\n" + "//float edgeLength = 1. / ((sqrt(3.) / 12.) * (3. + sqrt(5.)));\n" + "//// Inner radius of the icosahedron's face\n" + "//float faceRadius = (1./6.) * sqrt(3.) * edgeLength;\n" + "float faceRadius = 0.3819660112501051;\n" + "\n" + "// 2D coordinates on the icosahedron face\n" + "vec2 icosahedronFaceCoordinates(vec3 p) {\n" + " vec3 pn = normalize(p);\n" + " vec3 i = intersection(pn, facePlane, -1.);\n" + " return vec2(dot(i, uPlane), dot(i, vPlane));\n" + "}\n" + "\n" + "// Project 2D icosahedron face coordinates onto a sphere\n" + "vec3 faceToSphere(vec2 facePoint) {\n" + " return normalize(facePlane + (uPlane * facePoint.x) + (vPlane * facePoint.y));\n" + "}\n" + "\n" + "TriPoints3D geodesicTriPoints(vec3 p, float subdivisions) {\n" + " // Get 2D cartesian coordiantes on that face\n" + " vec2 uv = icosahedronFaceCoordinates(p);\n" + "\n" + " // Get points on the nearest triangle tile\n" + " float uvScale = subdivisions / faceRadius / 2.;\n" + " TriPoints points = closestTriPoints(uv * uvScale);\n" + "\n" + " // Project 2D triangle coordinates onto a sphere\n" + " vec3 a = faceToSphere(points.a / uvScale);\n" + " vec3 b = faceToSphere(points.b / uvScale);\n" + " vec3 c = faceToSphere(points.c / uvScale);\n" + " vec3 center = faceToSphere(points.center / uvScale);\n" + " vec3 ab = faceToSphere(points.ab / uvScale);\n" + " vec3 bc = faceToSphere(points.bc / uvScale);\n" + " vec3 ca = faceToSphere(points.ca / uvScale);\n" + "\n" + " return TriPoints3D(a, b, c, center, ab, bc, ca);\n" + "}\n" + "\n" + "\n" + "// --------------------------------------------------------\n" + "// Spectrum colour palette\n" + "// IQ https://www.shadertoy.com/view/ll2GD3\n" + "// --------------------------------------------------------\n" + "\n" + "vec3 pal( in float t, in vec3 a, in vec3 b, in vec3 c, in vec3 d ) {\n" + " return a + b*cos( 6.28318*(c*t+d) );\n" + "}\n" + "\n" + "vec3 spectrum(float n) {\n" + " return pal( n, vec3(0.5,0.5,0.5),vec3(0.5,0.5,0.5),vec3(1.0,1.0,1.0),vec3(0.0,0.33,0.67) );\n" + "}\n" + "\n" + "\n" + "// --------------------------------------------------------\n" + "// Model/Camera Rotation\n" + "// --------------------------------------------------------\n" + "\n" + "mat3 sphericalMatrix(float theta, float phi) {\n" + " float cx = cos(theta);\n" + " float cy = cos(phi);\n" + " float sx = sin(theta);\n" + " float sy = sin(phi);\n" + " return mat3(\n" + " cy, -sy * -sx, -sy * cx,\n" + " 0, cx, sx,\n" + " sy, cy * -sx, cy * cx\n" + " );\n" + "}\n" + "\n" + "mat3 mouseRotation(bool enable, vec2 xy) {\n" + " if (enable) {\n" + " vec2 mouse = iMouse.xy / iResolution.xy;\n" + "\n" + " if (mouse.x != 0. && mouse.y != 0.) {\n" + " xy.x = mouse.x;\n" + " xy.y = mouse.y;\n" + " }\n" + " }\n" + " float rx, ry;\n" + "\n" + " rx = (xy.y + .5) * PI;\n" + " ry = (-xy.x) * 2. * PI;\n" + "\n" + " return sphericalMatrix(rx, ry);\n" + "}\n" + "\n" + "mat3 modelRotation() {\n" + " mat3 m = mouseRotation(MOUSE_CONTROL==1, MODEL_ROTATION);\n" + " return m;\n" + "}\n" + "\n" + "mat3 cameraRotation() {\n" + " mat3 m = mouseRotation(MOUSE_CONTROL==2, CAMERA_ROTATION);\n" + " return m;\n" + "}\n" + "\n" + "\n" + "// --------------------------------------------------------\n" + "// Animation\n" + "// --------------------------------------------------------\n" + "\n" + "const float SCENE_DURATION = 6.;\n" + "const float CROSSFADE_DURATION = 2.;\n" + "\n" + "float time;\n" + "\n" + "struct HexSpec {\n" + " float roundTop;\n" + " float roundCorner;\n" + " float height;\n" + " float thickness;\n" + " float gap;\n" + "};\n" + "\n" + "HexSpec newHexSpec(float subdivisions) {\n" + " return HexSpec(\n" + " .05 / subdivisions,\n" + " .1 / subdivisions,\n" + " 2.,\n" + " 2.,\n" + " .005\n" + " );\n" + "}\n" + "\n" + "// Animation 1\n" + "\n" + "float animSubdivisions1() {\n" + " return mix(2.4, 3.4, cos(time * PI) * .5 + .5);\n" + "}\n" + "\n" + "HexSpec animHex1(vec3 hexCenter, float subdivisions) {\n" + " HexSpec spec = newHexSpec(subdivisions);\n" + "\n" + " float offset = time * 3. * PI;\n" + " offset -= subdivisions;\n" + " float blend = dot(hexCenter, pca);\n" + " blend = cos(blend * 30. + offset) * .5 + .5;\n" + " spec.height = mix(1.75, 2., blend);\n" + "\n" + " spec.thickness = spec.height;\n" + "\n" + " return spec;\n" + "}\n" + "\n" + "// Animation 2\n" + "\n" + "float animSubdivisions2() {\n" + " return mix(1., 2.3, sin(time * PI/2.) * .5 + .5);\n" + "}\n" + "\n" + "HexSpec animHex2(vec3 hexCenter, float subdivisions) {\n" + " HexSpec spec = newHexSpec(subdivisions);\n" + "\n" + " float blend = hexCenter.y;\n" + " spec.height = mix(1.6, 2., sin(blend * 10. + time * PI) * .5 + .5);\n" + "\n" + " spec.roundTop = .02 / subdivisions;\n" + " spec.roundCorner = .09 / subdivisions;\n" + " spec.thickness = spec.roundTop * 4.;\n" + " spec.gap = .01;\n" + "\n" + " return spec;\n" + "}\n" + "\n" + "// Animation 3\n" + "\n" + "float animSubdivisions3() {\n" + " return 5.;\n" + "}\n" + "\n" + "HexSpec animHex3(vec3 hexCenter, float subdivisions) {\n" + " HexSpec spec = newHexSpec(subdivisions);\n" + "\n" + " float blend = acos(dot(hexCenter, pab)) * 10.;\n" + " blend = cos(blend + time * PI) * .5 + .5;\n" + " spec.gap = mix(.01, .4, blend) / subdivisions;\n" + "\n" + " spec.thickness = spec.roundTop * 2.;\n" + "\n" + " return spec;\n" + "}\n" + "\n" + "// Transition between animations\n" + "\n" + "float sineInOut(float t) {\n" + " return -0.5 * (cos(PI * t) - 1.0);\n" + "}\n" + "\n" + "float transitionValues(float a, float b, float c) {\n" + " #ifdef LOOP\n" + " #if LOOP == 1\n" + " return a;\n" + " #endif\n" + " #if LOOP == 2\n" + " return b;\n" + " #endif\n" + " #if LOOP == 3\n" + " return c;\n" + " #endif\n" + " #endif\n" + " float t = time / SCENE_DURATION;\n" + " float scene = floor(mod(t, 3.));\n" + " float blend = fract(t);\n" + " float delay = (SCENE_DURATION - CROSSFADE_DURATION) / SCENE_DURATION;\n" + " blend = max(blend - delay, 0.) / (1. - delay);\n" + " blend = sineInOut(blend);\n" + " float ab = mix(a, b, blend);\n" + " float bc = mix(b, c, blend);\n" + " float cd = mix(c, a, blend);\n" + " float result = mix(ab, bc, min(scene, 1.));\n" + " result = mix(result, cd, max(scene - 1., 0.));\n" + " return result;\n" + "}\n" + "\n" + "HexSpec transitionHexSpecs(HexSpec a, HexSpec b, HexSpec c) {\n" + " float roundTop = transitionValues(a.roundTop, b.roundTop, c.roundTop);\n" + " float roundCorner = transitionValues(a.roundCorner, b.roundCorner, c.roundCorner);\n" + " float height = transitionValues(a.height, b.height, c.height);\n" + " float thickness = transitionValues(a.thickness, b.thickness, c.thickness);\n" + " float gap = transitionValues(a.gap, b.gap, c.gap);\n" + " return HexSpec(roundTop, roundCorner, height, thickness, gap);\n" + "}\n" + "\n" + "\n" + "// --------------------------------------------------------\n" + "// Modelling\n" + "// --------------------------------------------------------\n" + "\n" + "const vec3 FACE_COLOR = vec3(.9,.9,1.);\n" + "const vec3 BACK_COLOR = vec3(.1,.1,.15);\n" + "const vec3 BACKGROUND_COLOR = vec3(.0, .005, .03);\n" + "\n" + "struct Model {\n" + " float dist;\n" + " vec3 albedo;\n" + " float glow;\n" + "};\n" + "\n" + "Model hexModel(\n" + " vec3 p,\n" + " vec3 hexCenter,\n" + " vec3 edgeA,\n" + " vec3 edgeB,\n" + " HexSpec spec\n" + ") {\n" + " float d;\n" + "\n" + " float edgeADist = dot(p, edgeA) + spec.gap;\n" + " float edgeBDist = dot(p, edgeB) - spec.gap;\n" + " float edgeDist = smax(edgeADist, -edgeBDist, spec.roundCorner);\n" + "\n" + " float outerDist = length(p) - spec.height;\n" + " d = smax(edgeDist, outerDist, spec.roundTop);\n" + "\n" + " float innerDist = length(p) - spec.height + spec.thickness;\n" + " d = smax(d, -innerDist, spec.roundTop);\n" + "\n" + " vec3 color;\n" + "\n" + " float faceBlend = (spec.height - length(p)) / spec.thickness;\n" + " faceBlend = clamp(faceBlend, 0., 1.);\n" + " color = mix(FACE_COLOR, BACK_COLOR, step(.5, faceBlend));\n" + "\n" + " vec3 edgeColor = spectrum(dot(hexCenter, pca) * 5. + length(p) + .8);\n" + " float edgeBlend = smoothstep(-.04, -.005, edgeDist);\n" + " color = mix(color, edgeColor, edgeBlend);\n" + "\n" + " return Model(d, color, edgeBlend);\n" + "}\n" + "\n" + "// checks to see which intersection is closer\n" + "Model opU( Model m1, Model m2 ){\n" + " if (m1.dist < m2.dist) {\n" + " return m1;\n" + " } else {\n" + " return m2;\n" + " }\n" + "}\n" + "\n" + "Model geodesicModel(vec3 p) {\n" + "\n" + " pModIcosahedron(p);\n" + "\n" + " float subdivisions = transitionValues(\n" + " animSubdivisions1(),\n" + " animSubdivisions2(),\n" + " animSubdivisions3()\n" + " );\n" + " TriPoints3D points = geodesicTriPoints(p, subdivisions);\n" + "\n" + " vec3 edgeAB = normalize(cross(points.center, points.ab));\n" + " vec3 edgeBC = normalize(cross(points.center, points.bc));\n" + " vec3 edgeCA = normalize(cross(points.center, points.ca));\n" + "\n" + " Model model, part;\n" + " HexSpec spec;\n" + "\n" + " spec = transitionHexSpecs(\n" + " animHex1(points.b, subdivisions),\n" + " animHex2(points.b, subdivisions),\n" + " animHex3(points.b, subdivisions)\n" + " );\n" + " part = hexModel(p, points.b, edgeAB, edgeBC, spec);\n" + " model = part;\n" + "\n" + " spec = transitionHexSpecs(\n" + " animHex1(points.c, subdivisions),\n" + " animHex2(points.c, subdivisions),\n" + " animHex3(points.c, subdivisions)\n" + " );\n" + " part = hexModel(p, points.c, edgeBC, edgeCA, spec);\n" + " model = opU(model, part);\n" + "\n" + " spec = transitionHexSpecs(\n" + " animHex1(points.a, subdivisions),\n" + " animHex2(points.a, subdivisions),\n" + " animHex3(points.a, subdivisions)\n" + " );\n" + " part = hexModel(p, points.a, edgeCA, edgeAB, spec);\n" + " model = opU(model, part);\n" + "\n" + " return model;\n" + "}\n" + "\n" + "Model map( vec3 p ){\n" + " mat3 m = modelRotation();\n" + " p *= m;\n" + " #ifndef LOOP\n" + " pR(p.xz, time * PI/16.);\n" + " #endif\n" + " Model model = geodesicModel(p);\n" + " return model;\n" + "}\n" + "\n" + "// --------------------------------------------------------\n" + "// LIGHTING\n" + "// Adapted from IQ https://www.shadertoy.com/view/Xds3zN\n" + "// --------------------------------------------------------\n" + "\n" + "vec3 doLighting(Model model, vec3 pos, vec3 nor, vec3 ref, vec3 rd) {\n" + " vec3 lightPos = normalize(vec3(.5,.5,-1.));\n" + " vec3 backLightPos = normalize(vec3(-.5,-.3,1));\n" + " vec3 ambientPos = vec3(0,1,0);\n" + "\n" + " vec3 lig = lightPos;\n" + " float amb = clamp((dot(nor, ambientPos) + 1.) / 2., 0., 1.);\n" + " float dif = clamp( dot( nor, lig ), 0.0, 1.0 );\n" + " float bac = pow(clamp(dot(nor, backLightPos), 0., 1.), 1.5);\n" + " float fre = pow( clamp(1.0+dot(nor,rd),0.0,1.0), 2.0 );\n" + "\n" + " vec3 lin = vec3(0.0);\n" + " lin += 1.20 * dif * vec3(.9);\n" + " lin += 0.80 * amb * vec3(.5, .7, .8);\n" + " lin += 0.30 * bac * vec3(.25);\n" + " lin += 0.20 * fre * vec3(1);\n" + "\n" + " vec3 albedo = model.albedo;\n" + " vec3 col = mix(albedo * lin, albedo, model.glow);\n" + "\n" + " return col;\n" + "}\n" + "\n" + "\n" + "// --------------------------------------------------------\n" + "// Ray Marching\n" + "// Adapted from cabbibo https://www.shadertoy.com/view/Xl2XWt\n" + "// --------------------------------------------------------\n" + "\n" + "const float MAX_TRACE_DISTANCE = 8.; // max trace distance\n" + "const float INTERSECTION_PRECISION = .001; // precision of the intersection\n" + "const int NUM_OF_TRACE_STEPS = 100;\n" + "const float FUDGE_FACTOR = .9; // Default is 1, reduce to fix overshoots\n" + "\n" + "struct CastRay {\n" + " vec3 origin;\n" + " vec3 direction;\n" + "};\n" + "\n" + "struct Ray {\n" + " vec3 origin;\n" + " vec3 direction;\n" + " float len;\n" + "};\n" + "\n" + "struct Hit {\n" + " Ray ray;\n" + " Model model;\n" + " vec3 pos;\n" + " bool isBackground;\n" + " vec3 normal;\n" + " vec3 color;\n" + "};\n" + "\n" + "vec3 calcNormal( in vec3 pos ){\n" + " vec3 eps = vec3( 0.001, 0.0, 0.0 );\n" + " vec3 nor = vec3(\n" + " map(pos+eps.xyy).dist - map(pos-eps.xyy).dist,\n" + " map(pos+eps.yxy).dist - map(pos-eps.yxy).dist,\n" + " map(pos+eps.yyx).dist - map(pos-eps.yyx).dist );\n" + " return normalize(nor);\n" + "}\n" + "\n" + "Hit raymarch(CastRay castRay){\n" + "\n" + " float currentDist = INTERSECTION_PRECISION * 2.0;\n" + " Model model;\n" + "\n" + " Ray ray = Ray(castRay.origin, castRay.direction, 0.);\n" + "\n" + " for( int i=0; i< NUM_OF_TRACE_STEPS ; i++ ){\n" + " if (currentDist < INTERSECTION_PRECISION || ray.len > MAX_TRACE_DISTANCE) {\n" + " break;\n" + " }\n" + " model = map(ray.origin + ray.direction * ray.len);\n" + " currentDist = model.dist;\n" + " ray.len += currentDist * FUDGE_FACTOR;\n" + " }\n" + "\n" + " bool isBackground = false;\n" + " vec3 pos = vec3(0);\n" + " vec3 normal = vec3(0);\n" + " vec3 color = vec3(0);\n" + "\n" + " if (ray.len > MAX_TRACE_DISTANCE) {\n" + " isBackground = true;\n" + " } else {\n" + " pos = ray.origin + ray.direction * ray.len;\n" + " normal = calcNormal(pos);\n" + " }\n" + "\n" + " return Hit(ray, model, pos, isBackground, normal, color);\n" + "}\n" + "\n" + "\n" + "// --------------------------------------------------------\n" + "// Rendering\n" + "// --------------------------------------------------------\n" + "\n" + "void shadeSurface(inout Hit hit){\n" + "\n" + " vec3 color = BACKGROUND_COLOR;\n" + "\n" + " if (hit.isBackground) {\n" + " hit.color = color;\n" + " return;\n" + " }\n" + "\n" + " vec3 ref = reflect(hit.ray.direction, hit.normal);\n" + "\n" + " #ifdef DEBUG\n" + " color = hit.normal * 0.5 + 0.5;\n" + " #else\n" + " color = doLighting(\n" + " hit.model,\n" + " hit.pos,\n" + " hit.normal,\n" + " ref,\n" + " hit.ray.direction\n" + " );\n" + " #endif\n" + "\n" + " hit.color = color;\n" + "}\n" + "\n" + "vec3 render(Hit hit){\n" + " shadeSurface(hit);\n" + " return hit.color;\n" + "}\n" + "\n" + "\n" + "// --------------------------------------------------------\n" + "// Camera\n" + "// https://www.shadertoy.com/view/Xl2XWt\n" + "// --------------------------------------------------------\n" + "\n" + "mat3 calcLookAtMatrix( in vec3 ro, in vec3 ta, in float roll )\n" + "{\n" + " vec3 ww = normalize( ta - ro );\n" + " vec3 uu = normalize( cross(ww,vec3(sin(roll),cos(roll),0.0) ) );\n" + " vec3 vv = normalize( cross(uu,ww));\n" + " return mat3( uu, vv, ww );\n" + "}\n" + "\n" + "void doCamera(out vec3 camPos, out vec3 camTar, out float camRoll, in float time, in vec2 mouse) {\n" + " float dist = 5.5;\n" + " camRoll = 0.;\n" + " camTar = vec3(0,0,0);\n" + " camPos = vec3(0,0,-dist);\n" + " camPos *= cameraRotation();\n" + " camPos += camTar;\n" + "}\n" + "\n" + "\n" + "// --------------------------------------------------------\n" + "// Gamma\n" + "// https://www.shadertoy.com/view/Xds3zN\n" + "// --------------------------------------------------------\n" + "\n" + "const float GAMMA = 2.2;\n" + "\n" + "vec3 gamma(vec3 color, float g) {\n" + " return pow(color, vec3(g));\n" + "}\n" + "\n" + "vec3 linearToScreen(vec3 linearRGB) {\n" + " return gamma(linearRGB, 1.0 / GAMMA);\n" + "}\n" + "\n" + "void mainImage( out vec4 fragColor, in vec2 fragCoord )\n" + "{\n" + " time = iTime;\n" + "\n" + " #ifdef LOOP\n" + " #if LOOP == 1\n" + " time = mod(time, 2.);\n" + " #endif\n" + " #if LOOP == 2\n" + " time = mod(time, 4.);\n" + " #endif\n" + " #if LOOP == 3\n" + " time = mod(time, 2.);\n" + " #endif\n" + " #endif\n" + "\n" + " initIcosahedron();\n" + "\n" + " vec2 p = (-iResolution.xy + 2.0*fragCoord.xy)/iResolution.y;\n" + " vec2 m = iMouse.xy / iResolution.xy;\n" + "\n" + " vec3 camPos = vec3( 0., 0., 2.);\n" + " vec3 camTar = vec3( 0. , 0. , 0. );\n" + " float camRoll = 0.;\n" + "\n" + " // camera movement\n" + " doCamera(camPos, camTar, camRoll, iTime, m);\n" + "\n" + " // camera matrix\n" + " mat3 camMat = calcLookAtMatrix( camPos, camTar, camRoll ); // 0.0 is the camera roll\n" + "\n" + " // create view ray\n" + " vec3 rd = normalize( camMat * vec3(p.xy,2.0) ); // 2.0 is the lens length\n" + "\n" + " Hit hit = raymarch(CastRay(camPos, rd));\n" + "\n" + " vec3 color = render(hit);\n" + "\n" + " #ifndef DEBUG\n" + " color = linearToScreen(color);\n" + " #endif\n" + "\n" + " fragColor = vec4(color,1.0);\n" + "}\n" + "\n" + ); + + register_embedded_glsl_file("ShaderToy/Geomechanical.glsl", + "// Author : Sebastien Berube\n" + "// Created : March 2015\n" + "// Modified : Jan 2016\n" + "//\n" + "// Composition made from a repeated hexagon prism pattern.\n" + "// Hexagon prism distance function had to be modified to smooth out vertical edges.\n" + "//\n" + "// Sources:\n" + "// Inigo Quilez\n" + "// http://iquilezles.org/www/articles/distfunctions/distfunctions.htm\n" + "// http://iquilezles.org/www/articles/raymarchingdf/raymarchingdf.htm\n" + "// For those interested in the origin of sphere tracing:\n" + "// Sphere Tracing: A Geometric Method for the Antialiased Ray Tracing of Implicit Surfaces (1994)\n" + "// http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.3825\n" + "// Spline\n" + "// http://www.lighthouse3d.com/tutorials/maths/catmull-rom-spline/\n" + "//\n" + "// License : Creative Commons Non-commercial (NC) license\n" + "//\n" + "\n" + "//----------------------\n" + "// Constants\n" + "const float PI = 3.14159;\n" + "const float SCALE = 1.0;\n" + "const float MAX_DIST = 1000.0;\n" + "const float FLOOR_HEIGHT = 0.0;\n" + "const float X_REPEAT_DIST = 0.90*SCALE;\n" + "const float Z_REPEAT_DIST = 1.05*SCALE;\n" + "const float PRIM_HEIGHT = 1.0;\n" + "const float HEX_HALF_WIDTH = 0.26*SCALE;\n" + "const float GEOMETRY_DISPLACEMENT = 1.00;\n" + "float g_time;\n" + "\n" + "struct AnimationChannels\n" + "{\n" + " float material_roughness; //[0-1 range]\n" + " float geometry_width; //[0-1 range]\n" + " float geometry_scale; //[0-1 range]\n" + " float geometry_displacement;//[0-1 range]\n" + " float geometry_smoothness; //[0-1 range]\n" + " vec3 camPos; //[IR range]\n" + " vec3 camLookAt; //[IR range]\n" + "};\n" + "AnimationChannels g_animationChannels;\n" + "\n" + "//Material ID enum\n" + "const int MATERIALID_NONE = 0;\n" + "const int MATERIALID_FLOOR = 1;\n" + "const int MATERIALID_SKY = 2;\n" + "const int MATERIALID_PLASTIC = 3;\n" + "const int MATERIALID_METAL = 4;\n" + "\n" + "//Debug flag enum\n" + "const int DEBUG_RAYLEN = 0;\n" + "const int DEBUG_GEODIST = 1;\n" + "const int DEBUG_NORMAL = 2;\n" + "const int DEBUG_MATID = 3;\n" + "\n" + "float fDEBUG = 0.1;\n" + "\n" + "//Defines\n" + "#define saturate(x) clamp(x,0.0,1.0)\n" + "//----------------------\n" + "// Camera\n" + "struct Cam { vec3 R; vec3 U; vec3 D; vec3 o; float lens; float zoom; }; //Right, Up, Direction, origin\n" + "Cam CAM_lookAt(vec3 target, float pitchAngleRad, float dist, float theta);\n" + "Cam CAM_mouseLookAt(vec3 at, float dst);\n" + "Cam CAM_animate(vec2 uv, float fTime);\n" + "vec3 CAM_getRay(Cam cam, vec2 uv);\n" + "\n" + "//----------------------\n" + "// Post Process\n" + "vec3 POST_ProcessFX(vec3 c, vec2 uv);\n" + "\n" + "//----------------------\n" + "// Analytic Intersections\n" + "float RAYINTERSEC_plane(vec3 o, vec3 d, vec3 po, vec3 pn)\n" + "{\n" + " return dot(po-o,pn)/dot(d,pn);\n" + "}\n" + "\n" + "struct repeatInfo\n" + "{\n" + " vec3 smpl; //object-space, cyclic\n" + " vec3 anchor; //world space\n" + "};\n" + "\n" + "#define normalized_wave(a) (0.5*a+0.5)\n" + "repeatInfo DF_repeatHex(vec3 p)\n" + "{\n" + " //Repetition\n" + " float xRepeatDist = X_REPEAT_DIST;\n" + " float zRepeatDist = Z_REPEAT_DIST*0.5;\n" + " float latticeX = (fract(p.x/xRepeatDist+0.5)-0.5)*xRepeatDist;\n" + " float latticeY = (fract(p.z/zRepeatDist+0.5)-0.5)*zRepeatDist;\n" + " vec2 anchorPosXZ = p.xz-vec2(latticeX,latticeY);\n" + " p.x = latticeX; //Cyclic coords.\n" + " p.z = latticeY;\n" + "\n" + " //Variation\n" + " float period = fract(g_time/30.)*3.0;\n" + " float theta = period*2.0*PI;\n" + " float overallAmplitude = normalized_wave(-cos(theta)); //Overall amplitude modulation\n" + " float waveAmplitude = g_animationChannels.geometry_displacement\n" + " *normalized_wave(sin(anchorPosXZ.x+anchorPosXZ.y+theta*4.0));\n" + " float primHeight = FLOOR_HEIGHT+overallAmplitude*waveAmplitude;\n" + "\n" + " repeatInfo outData;\n" + " outData.anchor = vec3(anchorPosXZ[0], primHeight, anchorPosXZ[1]);\n" + " outData.smpl = p;\n" + "\n" + " return outData;\n" + "}\n" + "\n" + "#define zclamp(a) max(a,0.0) //Clamp negative values at zero\n" + "float DF_RoundedHex( vec3 p, float width, float height)\n" + "{\n" + " //Modified version (smooth edges) of the exagon prism found here:\n" + " //http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\n" + " float smoothRadius = g_animationChannels.geometry_smoothness*0.2;\n" + " width -= smoothRadius*2.0;\n" + "\n" + " //Hexagon prism constructed using X,Y,Z symmetry.\n" + " //Only quadrant 1 needs to be solved, but the joining diagonal to quadrant IV is also\n" + " //required for distance blending (see db).\n" + " p = abs(p);\n" + "\n" + " //Hexagonal edge distances :\n" + " //Note : [.8666,0.5] = [sin(PI/3,cos(PI/3)] -> Hexagon edges rotation coeff (60 degrees).\n" + " float da = (p.x*0.866025+p.z*0.5)-width; //quadrant I diagonal edge distance\n" + " float db = (p.x*0.866025-p.z*0.5)-width; //quadrant IV diagonal edge distance (needed for blending)\n" + " float dc = p.z-width; //upper distance\n" + "\n" + " vec3 d = zclamp(vec3(da,db,dc));\n" + " //Note: this is not an euclidian length, therefore this operation slightly distorts our distance field.\n" + " //Yet, it is harmless to convergence, and does the smoothing job quite well.\n" + " float dw = length(d)-smoothRadius; //hexagonal part smoothness (blending at 60 deg)\n" + " float dh = p.y-height;\n" + "\n" + " //Now that we have xz distance(dw) and y distance (dh), we can compute the distance\n" + " //for the given isovalue (the smoothing radius).\n" + " //Note : internal distance (maxX,maxY,maxZ) is also used to genereate internal signed dist,\n" + " // helping convergence when overstepping (very frequent with domain repetition).\n" + " float externalDistance = length(zclamp(vec2(dh,dw)))-smoothRadius; //Smoothed, unsigned\n" + " float internalDistance = max(max(da,dc),dh); //Sharp, signed.\n" + " return min(externalDistance,internalDistance);\n" + "}\n" + "\n" + "struct DF_out\n" + "{\n" + " float d;\n" + " int matID;\n" + " vec3 objectPos;\n" + "};\n" + "\n" + "//The distance field composition.\n" + "//::DF_composition\n" + "DF_out DF_composition( in vec3 pos )\n" + "{\n" + " //Explanation:\n" + " //http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\n" + " DF_out oFloor;\n" + " DF_out oHexA;\n" + " DF_out oHexB;\n" + "\n" + " oHexA.matID = MATERIALID_PLASTIC;\n" + " repeatInfo infoA = DF_repeatHex(pos-vec3(0));\n" + " oHexA.objectPos = infoA.anchor;\n" + " oHexA.d = DF_RoundedHex( infoA.smpl-vec3(0,infoA.anchor.y,0),\n" + " g_animationChannels.geometry_width*HEX_HALF_WIDTH, PRIM_HEIGHT );\n" + "\n" + " oHexB.matID = MATERIALID_PLASTIC;\n" + " repeatInfo infoB = DF_repeatHex(pos-vec3(X_REPEAT_DIST*0.5,0, Z_REPEAT_DIST*0.25));\n" + " oHexB.objectPos = infoB.anchor;\n" + " oHexB.d = DF_RoundedHex( infoB.smpl-vec3(0,infoB.anchor.y,0),\n" + " g_animationChannels.geometry_width*HEX_HALF_WIDTH, PRIM_HEIGHT );\n" + "\n" + " if(oHexA.d\n" + " vec3 F0 = abs ((1.0 - n) / (1.0 + n));\n" + " return F0 + (1.-F0) * pow( 1. - VdotH, 5.);\n" + " //\n" + "}\n" + "\n" + "vec3 PBR_ABL_Equation(vec3 V, vec3 L, vec3 N, float roughness, float metallic, vec3 ior_n, vec3 ior_k)\n" + "{\n" + " roughness = max(roughness,0.01);\n" + "\n" + " vec3 H = normalize(L+V);\n" + " float NdotH = dot(N,H);//Nn.H;\n" + " float NdotL = dot(N,L);//Nn.Ln;\n" + " float VdotH = dot(V,H);//Vn.H;\n" + " float NdotV = dot(N,V);//Nn.Vn;\n" + "\n" + " //Distribution term\n" + " //This D value is an approximation of the probability for a given light to bounce into the viewing vector direction.\n" + " //It is not necessarily 100% mathematically/physically correct : this is still just a function which has a curve that decently\n" + " //matches the physical distribution.\n" + " //\n" + " float PI = 3.14159;\n" + " float alpha2 = roughness * roughness;\n" + " float NoH2 = NdotH * NdotH;\n" + " float den = NoH2*(alpha2-1.0)+1.0;\n" + " float D = (NdotH>0.)?alpha2/(PI*den*den):0.0;\n" + " //\n" + "\n" + " //Fresnel term\n" + " vec3 F = PBR_Fresnel_Schlick_Dielectric(ior_n, VdotH);\n" + "\n" + " //Geometric term\n" + " //\n" + " float Gk = (roughness+1.)*(roughness+1.)/8.; //<-Disney's modification for ABL\n" + " float Gl = max(NdotL,0.)/(NdotL*(1.0-Gk)+Gk);\n" + " float Gv = max(NdotV,0.)/(NdotV*(1.0-Gk)+Gk);\n" + " float G = Gl*Gv;\n" + " //\n" + "\n" + " //The PBR equation seen pretty much everywhere:\n" + " //\n" + " //\n" + " float softTr = 0.2; // Valid range : [0.001-0.25]. Will reduce reflexivity on edges if too high.\n" + " //Personal addition : This parameter softens up the transition at grazing angles (otherwise too sharp IMHO).\n" + " vec3 Rs = D*F*G / (4.*NdotV*NdotL*(1.0-softTr)+softTr);\n" + " //\n" + "\n" + " return Rs;\n" + "}\n" + "\n" + "#define saturate(x) clamp(x,0.0,1.0)\n" + "vec3 MAT_Plastic(TraceData traceData, vec3 cDiff, vec3 N, vec3 V, vec3 L0, vec3 L1, float dfao, float dfss0, float dfss1)\n" + "{\n" + " vec3 col = vec3(0);\n" + "\n" + " float fRoughness = g_animationChannels.material_roughness;\n" + "\n" + " //Ambient directional contribution (3x):\n" + " // color*directionalContribution()\n" + " //This give a basic \"ambient\" shading, which varies with normal angle\n" + " vec3 cAmb = vec3(0.26,0.24,0.23)*vec3(0.5+0.5*dot(traceData.normal,vec3(+0.08,1,+0.1)))\n" + " + vec3(0.25,0.25,0.30)*vec3(0.5+0.5*dot(traceData.normal,vec3(-0.28,1,-0.17)))\n" + " + vec3(0.19,0.25,0.30)*vec3(0.5+0.5*dot(traceData.normal,vec3(+0.28,1,-0.27)));\n" + " //2 x PBR lights\n" + " vec3 CL0 = PBR_HDRremap(vec3(1))*PBR_ABL_Equation(V,L0,traceData.normal, fRoughness, 0., vec3(F_DIELECTRIC_PLASTIC), vec3(0));\n" + " vec3 CL1 = PBR_HDRremap(vec3(1))*PBR_ABL_Equation(V,L1,traceData.normal, fRoughness, 0., vec3(F_DIELECTRIC_PLASTIC), vec3(0));\n" + "\n" + " col = cAmb*dfao;\n" + " col *= saturate(0.30+fRoughness*0.5+0.2*(dfss0+dfss1));\n" + " col += (dfss0+fRoughness*0.25)*CL0;\n" + " col += (dfss1+fRoughness*0.25)*CL1;\n" + "\n" + " return col*0.75;\n" + "}\n" + "\n" + "float SAMPLER_trilinear(vec3 p)\n" + "{\n" + " //Noise layering trick from Inigo Quilez.\n" + " //See this for more explanation: https://www.shadertoy.com/view/Ms3SRr\n" + " const float TEXTURE_RES = 256.0; //Noise texture resolution\n" + " p *= TEXTURE_RES; //Computation in pixel space (1 unit = 1 pixel)\n" + " vec3 pixCoord = floor(p);//Pixel coord, integer [0,1,2,3...256...]\n" + " vec3 t = p-pixCoord; //Pixel interpolation position, linear range [0-1] (fractional part)\n" + " t = (3.0 - 2.0 * t) * t * t; //interpolant easing function : linear->cubic\n" + " vec2 layer_translation = -pixCoord.y*vec2(37.0,17.0)/TEXTURE_RES; //noise volume stacking trick : g layer = r layer shifted by (37x17 pixels -> this is no keypad smashing, but the actual translation embedded in the noise texture).\n" + "// vec2 layer1_layer2 = texture(iChannel0,layer_translation+(pixCoord.xz+t.xz+0.5)/TEXTURE_RES,-100.0).xy; //Note : +0.5 to fall right on pixel center\n" + " vec2 layer1_layer2 = vec2(0.0, 0.0);\n" + " return mix( layer1_layer2.x, layer1_layer2.y, t.y ); //Layer interpolation (trilinear/volumetric)\n" + "}\n" + "\n" + "float MAT_remap_angle_probability(float x_01)\n" + "{\n" + " //cos(jitter) is used to alter probabilty distribution :\n" + " //it remaps an evenly distributed function into another\n" + " //one where closer angles are more probable, and wider\n" + " //angles are less probable.\n" + " return (1.0-cos(x_01*PI/2.0));\n" + "}\n" + "\n" + "vec3 MAT_addFog(float travelDist, in vec3 color, in vec3 p, in vec3 c_atmosphere)\n" + "{\n" + " float a = 0.08;\n" + " float NORMALIZATION_TERM = log((1.+a)/a);\n" + " float da = travelDist/50.0;\n" + " da = log((da+a)/a)/NORMALIZATION_TERM;\n" + " vec3 FinalColor = mix(color,c_atmosphere,saturate(da));\n" + " return FinalColor;\n" + "}\n" + "\n" + "//::MAT_apply\n" + "vec4 MAT_apply(vec3 pos, TraceData traceData)\n" + "{\n" + " vec3 c_atmosphere = mix(vec3(0.87,0.94,1.0),vec3(0.6,0.80,1.0),clamp(3.0*pos.y/length(pos.xz),0.,1.));\n" + "\n" + " if(traceData.matID==MATERIALID_SKY)\n" + " {\n" + " return vec4(c_atmosphere,1.0);\n" + " }\n" + "\n" + " vec4 col = vec4(0);\n" + " vec3 N = traceData.normal;\n" + " vec3 V = normalize(-traceData.rayDir);\n" + " vec3 L0 = normalize(vec3(0.5,1.2,0.3));\n" + " vec3 L1 = normalize(vec3(-L0.x,L0.y,-L0.z+0.5));\n" + "\n" + " //\n" + " float fNoiseAmplitude = 0.4;\n" + " float jitter_01 = SAMPLER_trilinear(pos*10.0+g_time*50.0);\n" + " float t = MAT_remap_angle_probability(jitter_01)*fNoiseAmplitude;\n" + " vec3 Na = vec3(N.xz*mat2(cos(t),sin(t),-sin(t),cos(t)),N.y).xzy; //Rotate(t)\n" + " jitter_01 = SAMPLER_trilinear(5.0+pos*9.11);\n" + " t = MAT_remap_angle_probability(jitter_01)*fNoiseAmplitude;\n" + " vec3 Nb = vec3(N.xz*mat2(cos(t),-sin(t),sin(t),cos(t)),N.y).xzy; //Rotate(-t)\n" + " float dfaoA = RAYMARCH_DFAO( pos, Na, 0.02);\n" + " float dfaoB = RAYMARCH_DFAO( pos, Nb, 0.02);\n" + " float dfaoAveraged = 0.5*(dfaoA+dfaoB);\n" + " //\n" + "\n" + " float dfss0 = RAYMARCH_DFSS( pos+L0*0.01, L0, 0.2);\n" + " float dfss1 = RAYMARCH_DFSS( pos+L1*0.01, L1, 0.2);\n" + "\n" + " if(traceData.matID==MATERIALID_PLASTIC)\n" + " {\n" + " col.rgb = MAT_Plastic(traceData, vec3(1), N, V, L0, L1, dfaoAveraged, dfss0, dfss1);\n" + " }\n" + "\n" + " col.rgb = MAT_addFog(traceData.rayLen*0.3, col.rgb, pos, c_atmosphere);\n" + "\n" + " return col;\n" + "}\n" + "\n" + "float TRACE_zprime(vec3 o, vec3 d)\n" + "{\n" + " float geometryCeiling = FLOOR_HEIGHT+PRIM_HEIGHT\n" + " +g_animationChannels.geometry_displacement*GEOMETRY_DISPLACEMENT;\n" + " float t = RAYINTERSEC_plane(o, d, vec3(0,geometryCeiling,0), vec3(0,1,0));\n" + " return (t<0.0)?MAX_DIST:t;\n" + " return t;\n" + "}\n" + "\n" + "//o=ray origin, d=ray direction\n" + "//::TRACE_geometry\n" + "TraceData TRACE_geometry(vec3 o, vec3 d)\n" + "{\n" + " //Raymarching (the expensive function)\n" + " TraceData dfTrace;\n" + " float rayLen = RAYMARCH_isosurface(o,d,0.0);\n" + " vec3 dfHitPosition = o+rayLen*d;\n" + "\n" + " //Additional sample, to gather material ID and other info\n" + " //(we want that stuff coompiled out of the raymarching loop, it clutters the code and might slow things down)\n" + " DF_out compInfo = DF_composition( dfHitPosition );\n" + " rayLen += compInfo.d;\n" + " dfHitPosition = o+rayLen*d;\n" + "\n" + " dfTrace.rayLen = rayLen;\n" + " dfTrace.matID = compInfo.matID;\n" + " dfTrace.objectPos = compInfo.objectPos;\n" + " dfTrace.geoDist = compInfo.d;\n" + " dfTrace.rayDir = d;\n" + " dfTrace.normal = normalize(DF_gradient(dfHitPosition));\n" + "\n" + " return dfTrace;\n" + "}\n" + "\n" + "vec3 TRACE_debug(TraceData traceData, int elemID)\n" + "{\n" + " if(elemID==DEBUG_RAYLEN) return vec3(log(traceData.rayLen)*0.2);\n" + " if(elemID==DEBUG_GEODIST) return vec3(traceData.geoDist);\n" + " if(elemID==DEBUG_NORMAL) return traceData.normal;\n" + " if(elemID==DEBUG_MATID) return traceData.matID==MATERIALID_PLASTIC?vec3(1):\n" + " vec3(traceData.matID==MATERIALID_FLOOR?1:0,\n" + " traceData.matID==MATERIALID_METAL?1:0,\n" + " traceData.matID==MATERIALID_SKY?1:0);\n" + " return vec3(0);\n" + "}\n" + "\n" + "const int SPLINE_POINT_COUNT = 8;\n" + "struct SPLINE_CtrlPts\n" + "{\n" + " vec4 p[SPLINE_POINT_COUNT];\n" + "};\n" + "vec4 SPLINE_PointArray(int i, SPLINE_CtrlPts ctrlPts)\n" + "{\n" + " //Just a way to get around the fact global arrays do not support random index access.\n" + " //(only texture/resources)\n" + " if(i==0 || i==SPLINE_POINT_COUNT ) return ctrlPts.p[0];\n" + " if(i==1 || i==SPLINE_POINT_COUNT+1) return ctrlPts.p[1];\n" + " if(i==2 || i==SPLINE_POINT_COUNT+2) return ctrlPts.p[2];\n" + " if(i==3) return ctrlPts.p[3];\n" + " if(i==4) return ctrlPts.p[4];\n" + " if(i==5) return ctrlPts.p[5];\n" + " if(i==6) return ctrlPts.p[6];\n" + " if(i==7) return ctrlPts.p[7];\n" + " return vec4(0);\n" + "}\n" + "\n" + "vec4 SPLINE_catmullRom(float fTime, SPLINE_CtrlPts ctrlPts)\n" + "{\n" + " float t = fract(fTime);\n" + " const float n = float(SPLINE_POINT_COUNT);\n" + "\n" + " int idxOffset = int(t*n);\n" + " vec4 p1 = SPLINE_PointArray(idxOffset,ctrlPts);\n" + " vec4 p2 = SPLINE_PointArray(idxOffset+1,ctrlPts);\n" + " vec4 p3 = SPLINE_PointArray(idxOffset+2,ctrlPts);\n" + " vec4 p4 = SPLINE_PointArray(idxOffset+3,ctrlPts);\n" + "\n" + " //For some reason, fract(t) returns garbage on my machine with small values of t.\n" + " //return fract(n*t);\n" + " //Using this below yields the same results, minus the glitches.\n" + " t *= n;\n" + " t = (t-float(int(t)));\n" + "\n" + " //A classic catmull-rom\n" + " //e.g.\n" + " //http://steve.hollasch.net/cgindex/curves/catmull-rom.html\n" + " //http://www.lighthouse3d.com/tutorials/maths/catmull-rom-spline/\n" + " vec4 val = 0.5 * ((-p1 + 3.*p2 -3.*p3 + p4)*t*t*t\n" + " + (2.*p1 -5.*p2 + 4.*p3 - p4)*t*t\n" + " + (-p1+p3)*t\n" + " + 2.*p2);\n" + " return val;\n" + "}\n" + "\n" + "void ANIM_main(float fTime)\n" + "{\n" + " float t1 = 0.010*fTime;\n" + " float t2 = 0.010*fTime+0.03;\n" + "\n" + " SPLINE_CtrlPts cameraPosKeyFrames; //100 sec cycle.\n" + " // DATA: PosX,PosY,PosZ,Tilt\n" + " cameraPosKeyFrames.p[1] = vec4(10.0,2.70,05.0,1.90); //t=00.0s\n" + " cameraPosKeyFrames.p[2] = vec4(16.0,3.30,08.5,1.00); //t=12.5s\n" + " cameraPosKeyFrames.p[3] = vec4(20.0,6.80,05.0,2.97); //t=25.0s\n" + " cameraPosKeyFrames.p[4] = vec4(40.0,3.40,17.5,0.82); //t=37.5s\n" + " cameraPosKeyFrames.p[5] = vec4(30.0,3.10,27.5,1.97); //t=50.0s\n" + " cameraPosKeyFrames.p[6] = vec4(25.0,3.20,22.5,1.93); //t=62.5s\n" + " cameraPosKeyFrames.p[7] = vec4(15.0,3.00,24.5,1.95); //t=75.0s\n" + " cameraPosKeyFrames.p[0] = vec4(05.0,2.80,12.5,1.20); //t=87.5s\n" + " vec4 cameraPos = SPLINE_catmullRom(t1,cameraPosKeyFrames);\n" + " vec4 cameraDir = normalize(SPLINE_catmullRom(t2,cameraPosKeyFrames)-cameraPos);\n" + "\n" + " SPLINE_CtrlPts geometryKeyFrames; //25 sec cycle.\n" + " // DATA: round,width,roughness,displacement\n" + " geometryKeyFrames.p[1] = vec4(0.070,1.000,0.30,1.000); //t=00.0s\n" + " geometryKeyFrames.p[2] = vec4(0.090,0.900,0.50,0.900); //t=01.25s\n" + " geometryKeyFrames.p[3] = vec4(0.080,1.000,0.20,1.000); //t=02.50s\n" + " geometryKeyFrames.p[4] = vec4(0.150,0.970,0.50,0.990); //t=03.75s\n" + " geometryKeyFrames.p[5] = vec4(0.090,0.820,0.50,0.820); //t=05.00s\n" + " geometryKeyFrames.p[6] = vec4(0.110,0.970,0.50,0.990); //t=06.25s\n" + " geometryKeyFrames.p[7] = vec4(0.050,0.930,0.50,0.930); //t=07.50s\n" + " geometryKeyFrames.p[0] = vec4(0.120,0.950,0.50,0.980); //t=08.75s\n" + " vec4 geoPose = SPLINE_catmullRom(t1*25.0,geometryKeyFrames);\n" + "\n" + " g_animationChannels.camPos = cameraPos.xyz;\n" + " g_animationChannels.camLookAt = cameraPos.xyz+cameraDir.xyz-vec3(0,cameraPos.w,0);\n" + " g_animationChannels.geometry_smoothness = geoPose[0];\n" + " g_animationChannels.material_roughness = 0.45;\n" + " g_animationChannels.geometry_width = geoPose[1];\n" + " g_animationChannels.geometry_displacement = GEOMETRY_DISPLACEMENT;\n" + "}\n" + "\n" + "vec3 TRACE_main( vec3 o, vec3 dir, vec2 uv)\n" + "{\n" + " float fRemainingAlpha = 1.0;\n" + " float zStart = TRACE_zprime(o, dir);\n" + " vec3 pt = o+dir*zStart;\n" + " vec3 ptGeo = vec3(0);\n" + "\n" + " TraceData geometryTraceData;\n" + " if(zStart< MAX_DIST)\n" + " {\n" + " geometryTraceData = TRACE_geometry(pt, dir);\n" + " geometryTraceData.rayLen += zStart;\n" + " ptGeo = o+dir*geometryTraceData.rayLen;\n" + " }\n" + " else\n" + " {\n" + " geometryTraceData.rayLen = MAX_DIST;\n" + " geometryTraceData.matID = MATERIALID_SKY;\n" + " geometryTraceData.objectPos = pt;\n" + " geometryTraceData.geoDist = 0.0;\n" + " geometryTraceData.rayDir = dir;\n" + " ptGeo = pt;\n" + " }\n" + "\n" + " //return TRACE_debug(geometryTraceData, DEBUG_RAYLEN); //OK\n" + " //return TRACE_debug(geometryTraceData, DEBUG_GEODIST); //OK\n" + " //return TRACE_debug(geometryTraceData, DEBUG_NORMAL); //OK\n" + " //return TRACE_debug(geometryTraceData, DEBUG_MATID); //OK\n" + "\n" + " vec4 cFinal = MAT_apply(ptGeo,geometryTraceData);\n" + "\n" + " return cFinal.rgb;\n" + "}\n" + "\n" + "void mainImage( out vec4 fragColor, in vec2 fragCoord )\n" + "{\n" + " g_time = iTime+2.6; //Time offset for better preview\n" + " vec2 uv = (fragCoord.xy-0.5*iResolution.xy) / iResolution.xx;\n" + "\n" + " float fTime = g_time+2.1;\n" + " ANIM_main(fTime);\n" + "\n" + " Cam cam = CAM_animate(uv,fTime);\n" + " vec3 d = CAM_getRay(cam,uv);\n" + " vec3 c = TRACE_main(cam.o, d, uv);\n" + "\n" + " //No supersampling required for most PostProcessFX.\n" + " c = POST_ProcessFX(c,uv);\n" + "\n" + " fragColor = vec4(c,1.0);\n" + "}\n" + "\n" + "vec3 POST_ProcessFX(vec3 c, vec2 uv)\n" + "{\n" + " //Vignetting\n" + " float lensRadius = 0.65;\n" + " uv /= lensRadius;\n" + " float sin2 = uv.x*uv.x+uv.y*uv.y;\n" + " float cos2 = 1.0-min(sin2*sin2,1.0);\n" + " float cos4 = cos2*cos2;\n" + " c *= cos4;\n" + "\n" + " //Gamma\n" + " c = pow(c,vec3(0.4545));\n" + " return c;\n" + "}\n" + "\n" + "//----------------------\n" + "// Camera\n" + "//::CAM\n" + "Cam CAM_animate(vec2 uv, float fTime)\n" + "{\n" + " Cam cam;\n" + " cam.o = g_animationChannels.camPos;\n" + " cam.D = normalize(g_animationChannels.camLookAt-cam.o);\n" + " cam.R = normalize(cross(cam.D,vec3(0,1,0)));\n" + " cam.U = normalize(cross(cam.R,cam.D));\n" + " cam.lens = 1.2+0.3*sin(fTime*0.1);\n" + " cam.zoom = 3.0+sin(fTime*0.1)/cam.lens;\n" + " return cam;\n" + "}\n" + "\n" + "vec3 CAM_getRay(Cam cam,vec2 uv)\n" + "{\n" + " uv = cam.lens*uv/(cam.lens-length(uv)*length(uv));\n" + " uv *= cam.zoom;\n" + " return normalize(uv.x*cam.R+uv.y*cam.U+cam.D);\n" + "}\n" + "\n" + ); + + register_embedded_glsl_file("ShaderToy/HexFlow.glsl", + "/*\n" + "\n" + " Hexagonal Maze Flow\n" + " -------------------\n" + "\n" + " I've been playing around with hexagonal grids lately. It's possible to make all kinds of\n" + " interesting things with them. I'll eventually tire of hexagons and get back to what I'm\n" + " supposed to be doing, but for now, here's a maze with a flowing polkadot snake-like\n" + " pattern running through it... I'm not really sure what it is either. :)\n" + "\n" + " It has an impossible geometry feel to it, and is rendered in an oldschool kind of game\n" + " style. It was pretty easy to produce: Obtain some hexagonal grid cell coordinates and\n" + " corresponding ID, render some lines, shapes, and a few arcs for the Truchet component,\n" + " apply some shading, etc.\n" + " \n" + " It was more of an exercise in applying layers in the right order than anything else. One\n" + " of the things that might be of interest is the flowing Truchet pattern. Producing a\n" + " flowing hexagonal Truchet isn't much different to producing a square one. In fact, it's\n" + " easier - in the sense that you don't have to reverse directions from cell to cell.\n" + "\n" + " However, one of the downsides is that it's not immediately obvious how to apply UV\n" + " coordinates - I think BigWings mentioned this, and I concur. :) I got around the problem\n" + " by ensuring that the texture pattern had the appropriate symmetry and applying hybrid\n" + " polar coordinates. By that, I mean, I wrapped the polar angles across the arc boundaries\n" + " and used that for one coordinate, then used the Truchet distance field itself for the\n" + " other...\n" + "\n" + " Roughly speaking, it's not much different to a circle: In that situation, you use the\n" + " familiar polar coordinates (r = length(u), a = atan(u.y, u.x)). The only difference in\n" + " this case is that you use a modified radial coordinate (r = min(min(r1, r2), r3)) - or\n" + " to put it another way, you use the distance field value... It's a bit difficult to\n" + " explain, but easy to perform. When I get time, I'm going to produce a more robust Truchet\n" + " texturing example.\n" + " \n" + "\n" + " Related references:\n" + "\n" + " // You can't do a hexagonal grid example without referencing this. :) Very stylish.\n" + " Hexagons - distance - iq\n" + " https://www.shadertoy.com/view/Xd2GR3\n" + " \n" + "\n" + " // Simpler hexagonal grid example that attempts to explain the grid setup used to produce\n" + " // the pattern here.\n" + " //\n" + " Minimal Hexagonal Grid - Shane\n" + " https://www.shadertoy.com/view/Xljczw\n" + "\n" + "*/\n" + "\n" + "// Interlaced variation - Interesting, but patched together in a hurry.\n" + "#define INTERLACING\n" + "\n" + "// A quick hack to get rid of the winding overlay - in order to show the maze only.\n" + "//#define MAZE_ONLY\n" + "\n" + "\n" + "\n" + "// Helper vector. If you're doing anything that involves regular triangles or hexagons, the\n" + "// 30-60-90 triangle will be involved in some way, which has sides of 1, sqrt(3) and 2.\n" + "const vec2 s = vec2(1, 1.7320508);\n" + "\n" + "// Standard vec2 to float hash - Based on IQ's original.\n" + "float hash21(vec2 p){ return fract(sin(dot(p, vec2(141.173, 289.927)))*43758.5453); }\n" + "\n" + "\n" + "// Standard 2D rotation formula.\n" + "mat2 r2(in float a){ float c = cos(a), s = sin(a); return mat2(c, -s, s, c); }\n" + "\n" + "\n" + "// The 2D hexagonal isosuface function: If you were to render a horizontal line and one that\n" + "// slopes at 60 degrees, mirror, then combine them, you'd arrive at the following.\n" + "float hex(in vec2 p){\n" + "\n" + " p = abs(p);\n" + "\n" + " // Below is equivalent to:\n" + " //return max(p.x*.5 + p.y*.866025, p.x);\n" + "\n" + " return max(dot(p, s*.5), p.x); // Hexagon.\n" + "\n" + "}\n" + "\n" + "// This function returns the hexagonal grid coordinate for the grid cell, and the corresponding\n" + "// hexagon cell ID - in the form of the central hexagonal point. That's basically all you need to\n" + "// produce a hexagonal grid.\n" + "//\n" + "// When working with 2D, I guess it's not that important to streamline this particular function.\n" + "// However, if you need to raymarch a hexagonal grid, the number of operations tend to matter.\n" + "// This one has minimal setup, one \"floor\" call, a couple of \"dot\" calls, a ternary operator, etc.\n" + "// To use it to raymarch, you'd have to double up on everything - in order to deal with\n" + "// overlapping fields from neighboring cells, so the fewer operations the better.\n" + "vec4 getHex(vec2 p){\n" + "\n" + " // The hexagon centers: Two sets of repeat hexagons are required to fill in the space, and\n" + " // the two sets are stored in a \"vec4\" in order to group some calculations together. The hexagon\n" + " // center we'll eventually use will depend upon which is closest to the current point. Since\n" + " // the central hexagon point is unique, it doubles as the unique hexagon ID.\n" + " vec4 hC = floor(vec4(p, p - vec2(.5, 1))/s.xyxy) + .5;\n" + "\n" + " // Centering the coordinates with the hexagon centers above.\n" + " vec4 h = vec4(p - hC.xy*s, p - (hC.zw + .5)*s);\n" + "\n" + " // Nearest hexagon center (with respect to p) to the current point. In other words, when\n" + " // \"h.xy\" is zero, we're at the center. We're also returning the corresponding hexagon ID -\n" + " // in the form of the hexagonal central point. Note that a random constant has been added to\n" + " // \"hC.zw\" to further distinguish it from \"hC.xy.\"\n" + " //\n" + " // On a side note, I sometimes compare hex distances, but I noticed that Iomateron compared\n" + " // the Euclidian version, which seems neater, so I've adopted that.\n" + " return dot(h.xy, h.xy).5) p.y = -p.y;\n" + "\n" + "\n" + "\n" + " // Determining the closest of the three arcs to the current point, the keeping a copy\n" + " // of the vector used to produce it. That way, you'll know just to render that particular\n" + " // decorated arc, lines, etc - instead of all three.\n" + " const float r = 1.;\n" + " const float th = .2; // Arc thickness.\n" + "\n" + " // Arc one.\n" + " q = p - vec2(0, r)/s;\n" + " vec3 da = vec3(q, dfPol(q));\n" + "\n" + " // Arc two. \"r2\" could be hardcoded, but this is a relatively cheap 2D example.\n" + " q = r2(3.14159*2./3.)*p - vec2(0, r)/s;\n" + " vec3 db = vec3(q, dfPol(q));\n" + "\n" + " // Arc three.\n" + " q = r2(3.14159*4./3.)*p - vec2(0, r)/s;\n" + " vec3 dc = vec3(q, dfPol(q));\n" + "\n" + " // Compare distance fields, and return the vector used to produce the closest one.\n" + " vec3 q3 = da.z.5 && lRnd.x<.5) hLines2 *= smoothstep(0., .02, ln);\n" + " if(lRnd.x>.5) hLines2 *= dMask;\n" + " #else\n" + " if(rnd>.5) hLines2 *= smoothstep(0., .02, ln);\n" + " hLines2 *= dMask;\n" + " #endif\n" + " bg = mix(bg, vec3(0), hLines2*tr);\n" + "\n" + " float eDist3 = hex(h3.xy);\n" + " float hLines3 = smoothstep(0., .02, eDist3 - .5 + .02);\n" + " #ifdef INTERLACING\n" + " if(rnd<=.5 && lRnd.x>.5) hLines3 *= smoothstep(0., .02, ln);\n" + " if(lRnd.x>.5) hLines3 *= dMask;\n" + " #else\n" + " if(rnd<=.5) hLines3 *= smoothstep(0., .02, ln);\n" + " hLines3 *= dMask;\n" + " #endif\n" + " bg = mix(bg, vec3(0), hLines3*tr);\n" + "\n" + "\n" + " // Using the two off-centered hex coordinates to give the background a bit of highlighting.\n" + " float shade = max(1.25 - dot(h2.xy, h2.xy)*2., 0.);\n" + " shade = min(shade, max(dot(h3.xy, h3.xy)*3. + .25, 0.));\n" + " bg = mix(bg, vec3(0), (1.-shade)*.5);\n" + "\n" + " // I wanted to change the colors of everything at the last minute. It's pretty hacky, so\n" + " // when I'm feeling less lazy, I'll tidy it up. :)\n" + " vec3 dotCol = bg.zyx*vec3(1.5, .4, .4);\n" + " vec3 bCol = mix(bg.zyx, bg.yyy, .25);\n" + " bg = mix(bg.yyy, bg.zyx, .25);\n" + "\n" + "\n" + " // Under the random threshold, and we draw the lines under the Truchet pattern.\n" + " #ifdef INTERLACING\n" + " if(lRnd.x>.5){\n" + " bg = mix(bg, vec3(0), (1. - smoothstep(0., .015, lnBord)));\n" + " bg = mix(bg, bCol, (1. - smoothstep(0., .015, ln)));\n" + " // Center lines.\n" + " bg = mix(bg, vec3(0), smoothstep(0., .02, eDist3 - .5 + .02)*tr);\n" + " }\n" + " #else\n" + " bg = mix(bg, vec3(0), (1. - smoothstep(0., .015, lnBord)));\n" + " bg = mix(bg, bCol, (1. - smoothstep(0., .015, ln)));\n" + " #endif\n" + "\n" + "\n" + "\n" + " // Apply the Truchet shadow to the background.\n" + " bg = mix(bg, vec3(0), (1. - smoothstep(0., .07, d))*.5);\n" + "\n" + "\n" + " // Place the Truchet field to the background, with some additional shading to give it a\n" + " // slightly rounded, raised feel.\n" + " vec3 col = mix(bg, vec3(1)*max(-d*3. + .7, 0.), (1. - dMask)*.65);\n" + "\n" + "\n" + " // Apply the moving dot pattern to the Truchet.\n" + " //dotCol = mix(dotCol, dotCol.xzy, dot(sin(u*3.14159*2. - cos(u.yx*3.14159*2.)*3.14159), vec2(.25)) + .5);\n" + " col = mix(col, vec3(0), (1. - dMask)*(1. - smoothstep(0., .02, d2)));\n" + " col = mix(col, dotCol, (1. - dMask)*(1. - smoothstep(0., .02, d2 + .125)));\n" + "\n" + " // Truchet border.\n" + " col = mix(col, vec3(0), 1. - smoothstep(0., .015, dBord));\n" + "\n" + " #ifdef INTERLACING\n" + " // Over the random threshold, and we draw the lines over the Truchet.\n" + " if(lRnd.x<=.5){\n" + " col = mix(col, vec3(0), (1. - smoothstep(0., .015, lnBord)));\n" + " col = mix(col, bCol, (1. - smoothstep(0., .015, ln)));\n" + " // Center lines.\n" + " col = mix(col, vec3(0), smoothstep(0., .02, eDist2 - .5 + .02)*tr);\n" + " }\n" + " #endif\n" + "\n" + "\n" + "\n" + "\n" + " // Using the offset hex values for a bit of fake 3D highlighting.\n" + " //if(rnd>.5) h3.y = -h3.y; // All raised edges. Spoils the mild 3D illusion.\n" + " #ifdef INTERLACING\n" + " float trSn = max(dMask, 1. - smoothstep(0., .015, lnBord))*.75 + .25;\n" + " #else\n" + " float trSn = dMask*.75 + .25;\n" + " #endif\n" + " col = mix(col, vec3(0), trSn*(1. - hex(s/2.+h2.xy)));\n" + " col = mix(col, vec3(0), trSn*(1. - hex(s/2.-h3.xy)));\n" + "\n" + "\n" + " // Using the edge distance to produce some repeat contour lines. Standard stuff.\n" + " //if (rnd>.5) h.xy = -h.yx;\n" + " //float cont = clamp(cos(hex(h.xy)*6.283*12.)*1.5 + 1.25, 0., 1.);\n" + " //col = mix(col, vec3(0), (1. - smoothstep(0., .015, ln))*(smoothstep(0., .015, d))*(1.-cont)*.5);\n" + "\n" + "\n" + " // Very basic hatch line effect.\n" + " float gr = dot(col, vec3(.299, .587, .114));\n" + " float hatch = (gr<.45)? clamp(sin((sc.x - sc.y)*3.14159*40.)*2. + 1.5, 0., 1.) : 1.;\n" + " float hatch2 = (gr<.25)? clamp(sin((sc.x + sc.y)*3.14159*40.)*2. + 1.5, 0., 1.) : 1.;\n" + "\n" + " col *= min(hatch, hatch2)*.5 + .5;\n" + " col *= clamp(sin((sc.x - sc.y)*3.14159*80.)*1.5 + .75, 0., 1.)*.25 + 1.;\n" + "\n" + "\n" + " // Subtle vignette.\n" + " u = fragCoord/iResolution.xy;\n" + " col *= pow(16.*u.x*u.y*(1. - u.x)*(1. - u.y) , .125) + .25;\n" + " // Colored varation.\n" + " //col = mix(pow(min(vec3(1.5, 1, 1)*col, 1.), vec3(1, 3, 16)), col,\n" + " //pow(16.*u.x*u.y*(1. - u.x)*(1. - u.y) , .25)*.75 + .25);\n" + "\n" + "\n" + "\n" + " // Rough gamma correction.\n" + " fragColor = vec4(sqrt(max(col, 0.)), 1);\n" + "\n" + "}\n" + "\n" + "\n" + "\n" + ); + + register_embedded_glsl_file("ShaderToy/JellyTubes.glsl", + "#define AA 2 // Square root of the number of anti-aliasing samples to make.\n" + "\n" + "vec2 intersectSphere(vec3 ro, vec3 rd, vec3 org, float rad)\n" + "{\n" + " float a = dot(rd, rd);\n" + " float b = 2. * dot(rd, ro - org);\n" + " float c = dot(ro - org, ro - org) - rad * rad;\n" + " float desc = b * b - 4. * a * c;\n" + " if (desc < 0.)\n" + " return vec2(1, 0);\n" + "\n" + " return vec2((-b - sqrt(desc)) / (2. * a), (-b + sqrt(desc)) / (2. * a));\n" + "}\n" + "\n" + "vec2 intersectCylinder(vec2 ro, vec2 rd, vec2 org, float rad)\n" + "{\n" + " return intersectSphere(vec3(ro, 0), vec3(rd, 0), vec3(org, 0), rad);\n" + "}\n" + "\n" + "vec3 nn = vec3(0);\n" + "float u = 0.;\n" + "\n" + "vec3 tr2(vec3 o, vec3 r, vec2 t)\n" + "{\n" + " o += r * (1e-4 + .5 - o.y) / r.y;\n" + " for(int i = 0; i < 38; ++i)\n" + " {\n" + " vec3 c = vec3(floor(o.x), 0, floor(o.z));\n" + "\n" + " vec3 ofs = vec3(cos(c.z) * .1, 0, cos(c.x) * .1);\n" + "\n" + " float rad = .3+cos(c.x) * .1;\n" + " ofs.x = cos(t.y * 8. + c.z * 2.5) * rad / 4.;\n" + "\n" + " float h = -(cos(c.x + 3. + c.z * 65.) * .5 + .5) * 11.8;\n" + "\n" + " u = h;\n" + "\n" + " float ht = (h - o.y) / r.y;\n" + " float ft = (-2.2 - o.y) / r.y;\n" + "\n" + " vec2 cyl = intersectCylinder(o.xz, r.xz, (c + ofs).xz + .5, rad);\n" + " vec2 sph = intersectSphere(o, r, (c + ofs) + .5 + vec3(0, -.5 + h, 0), rad);\n" + "\n" + " cyl.x = max(cyl.x, ht);\n" + "\n" + " if(sph.x < cyl.x && sph.y > 0. && sph.x < sph.y)\n" + " {\n" + " nn = normalize(o + r * sph.x - ((c + ofs) + .5 + vec3(0, -.5 + h, 0)));\n" + " return o + r * sph.x;\n" + " }\n" + "\n" + " if((cyl.x < sph.y || sph.x >= sph.y) && cyl.y > 0. && cyl.x < cyl.y)\n" + " {\n" + " nn.xz = o.xz + r.xz * cyl.x - ((c + ofs).xz + .5);\n" + " nn.y = 0.;\n" + " nn = normalize(nn);\n" + " return o + r * cyl.x;\n" + " }\n" + "\n" + " c.xz = ((c.xz + max(sign(r.xz), 0.)) - o.xz) / r.xz;\n" + " float t = (dot(c.xz, step(c.xz, c.zx)) + 1e-4);\n" + " // if(ft 1.0) ms = (2.*iMouse.xy - iResolution.xy)/iResolution.xy;\n" + " a = sin(vec2(1.5707963, 0) - ms.x);\n" + " rM = mat2(a, -a.y, a.x);\n" + " rd.xz = rd.xz*rM;\n" + " a = sin(vec2(1.5707963, 0) - ms.y);\n" + " rM = mat2(a, -a.y, a.x);\n" + " rd.yz = rd.yz*rM;\n" + "\n" + "\n" + "\n" + " // Raymarching.\n" + " const float FAR = 50.0;\n" + " float t = 0.0, h;\n" + " for(int i = 0; i < 96; i++){\n" + "\n" + " h = map(ro+rd*t);\n" + " // Note the \"t*b + a\" addition. Basically, we're putting less emphasis on accuracy, as\n" + " // \"t\" increases. It's a cheap trick that works in most situations... Not all, though.\n" + " if(abs(h)<0.001*(t*.75 + .25) || t>FAR) break;//*(t*.5 + 1.)\n" + " t += h*.75;\n" + " //t += step(.5, t)*h*.25 + h*.5;\n" + "\n" + " }\n" + "\n" + " // Initialize the scene color.\n" + " vec3 col = vec3(0);\n" + "\n" + " // Scene hit, so color the pixel.\n" + " if(t1.5){\n" + " \n" + " // Grey out the limestone wall color.\n" + " col = vec3(1)*dot(col*.7+.2, vec3(.299, .587, .114));\n" + " // Add some fake reflection. Not reliable, but it's subtle.\n" + " rCol = tex3D(iChannel0, (pOffs + reflect(rd, nor))*ts, nor);\n" + " col += rCol*.25 + spot*.25;\n" + " spe2 = spe*spe*.25; // Ramp up the global specular a bit.\n" + "\n" + " }\n" + "\n" + " // If just the screen has been hit, apply some extra properties, then draw the screen image.\n" + " // I could just write \"saveObjID == 3.,\" but I get a little paranoid where floats are concerned. :)\n" + " if(saveObjID>2.5){\n" + "\n" + " // For the screen image, we're interested in the offset height and depth positions. Ie: pOffs.zy.\n" + "\n" + " // Pixelized dot pattern shade.\n" + " float c = dotPattern(pOffs.zy*36.+.5);\n" + "\n" + " // Applying some color to the shade.\n" + " col = vec3(min(c*1.5, 1.), pow(c, 2.5), pow(c, 12.));\n" + " // Mixing the colors around a little. Made up.\n" + " col = mix(col.zyx, col, sin(dot(pos, vec3(.333))*3.14159*6.)*.34+.66);\n" + " \n" + " // Individual screen ID or sorts.\n" + " float id = hash(dot(floor(pOffs + vec3(.0, .5, .5)), vec3(7, 157, 113)));\n" + "\n" + " // Use the screen ID to give it a different random hue.\n" + " col = rotHue(col, floor(id*12.)/12.*6.283/2.);\n" + "\n" + " col += rCol*rCol*.5; // Screen reflection.\n" + "\n" + " dif += .5; // Make the screen appear self illuminating, but increasing the diffuse.\n" + " spe += .25;\n" + "\n" + " }\n" + "\n" + " // Combining everything together to produce the scene color.\n" + " col *= (dif + .25 + spot*.5 + vec3(.25, .3, .5)*spe) + spe2;\n" + " col *= occ; // Applying occlusion.\n" + "\n" + "\n" + " }\n" + "\n" + " // Applying some very slight fog in the distance. This is technically an inside scene...\n" + " // Or is it underground... Who cares, it's just a shader. :)\n" + " col = mix(min(col, 1.), vec3(0), 1.-exp(-t*t/FAR/FAR*15.));//smoothstep(0., FAR-20., t)\n" + "\n" + " // Done.\n" + " fragColor = vec4(col, 1.0);\n" + "\n" + "}\n" + "\n" + ); + + register_embedded_glsl_file("ShaderToy/QuadTreeTruchet.glsl", + "/*\n" + "\n" + " Quadtree Truchet\n" + " ----------------\n" + "\n" + " A multiscale, multitile, overlapped, weaved Truchet pattern -- However, since\n" + " that description is a little verbose, I figured that a quadtree Truchet was as\n" + " good a description as any. :) The mild weave effect is provided via the\n" + " \"INCLUDE_LINE_TILES\" define.\n" + "\n" + " In order to produce a varied looking Truchet pattern, there are a couple of\n" + " simple things you can try: One is to use more than one tile, and the other is\n" + " to stitch weaved tiles together to produce a cool under-over effect. There are\n" + " a few examples on Shadertoy of each, which are easy enough to find -- Just do\n" + " a search for \"Truchet\" and look for the multitile and weaved examples.\n" + "\n" + " Lesser known variations include using Truchet tiles that overlap one another,\n" + " and stitching together multiscaled tiles -- usually on something like a quadtree\n" + " grid. This example uses elements of all of the aforementioned.\n" + "\n" + " In the past, I've combined two non-overlapping tile scales, but had never\n" + " considered taking it beyond that... until I came across Christopher Carlson's\n" + " article, \"Multi-Scale Truchet Patterns.\" If you follow the link below and refer\n" + " to the construction process, you'll see that the idea behind it is almost\n" + " rundimentary. As a consequence, I figured that it'd take me five minutes to put\n" + " the ideas into pixel shader form. Unfortunately, they say the dumber you are,\n" + " the more overconfident you'll be, and to cut a long story short... It took me\n" + " longer than five minutes. :D\n" + "\n" + " The code below is somewhat obfuscated and strewn with defines - The defines are\n" + " my fault, since I wanted to provide a few rendering options. However, the\n" + " remaining complication boils down to the necessity to render overlapping tiles\n" + " on a repeat quadtree grid in an environment that doesn't allow random pixel\n" + " access. The only example along those lines I could find on here was IQ's\n" + " hierachical Voronoi demonstration, which is pretty cool, but I needed to render\n" + " things in a way that involved less nesting, which complicated things.\n" + "\n" + " Either way, the idea is pretty simple: Construct a grid, randomly render some\n" + " Truchet tiles, subdivide the remaining squares into four, randomly render some\n" + " more tiles in reverse color order, then continue ad infinitum. By the way, I\n" + " constructed this on the fly using the best method I could think of at the time.\n" + " However, if anyone out there has a more elegant solution, feel free to post it. :)\n" + " \n" + " Naturally, the idea can be extended to 3D. Three levels with this particular\n" + " setup might be a little slow. However, two levels using a non overlapping tile\n" + " is definitely doable, so I intend to produce an example along those lines in the\n" + " near future.\n" + "\n" + "\n" + " Based on the following:\n" + "\n" + " Multi-Scale Truchet Patterns - Christopher Carlson\n" + " https://christophercarlson.com/portfolio/multi-scale-truchet-patterns/\n" + " Linking paper containing more detail:\n" + " http://archive.bridgesmathart.org/2018/bridges2018-39.pdf\n" + "\n" + " Quadtree Related:\n" + "\n" + " // Considers overlap.\n" + " https://www.shadertoy.com/view/Xll3zX\n" + " Voronoi - hierarchical - IQ\n" + "\n" + " // No overlap, but I really like this one.\n" + " SDF Raymarch Quadtree - Paniq\n" + " https://www.shadertoy.com/view/MlffW8\n" + "\n" + " // Multilevel, and nice and simple.\n" + " quadtree - 4 - FabriceNeyret2\n" + " https://www.shadertoy.com/view/ltlyRH\n" + "\n" + "*/\n" + "\n" + "\n" + "// DEFINES: Feel free to try them out.\n" + "\n" + "// Default colored setting. Not applicable when using the stacked tiles option.\n" + "// When turned off, the color is white.\n" + "#define SPECTRUM_COLORED\n" + "\n" + "// Showing the different tile layers stacked on top of one another. Aesthetically, I prefer\n" + "// this more, because it has a raised look about it. However, you can't make out the general\n" + "// pattern as well, so it's off by default.\n" + "//#define STACKED_TILES\n" + "\n" + "// Pink -- Less bland than white, and has a velvety feel... Gets overridden by the spectrum\n" + "// color option, so only works when \"SPECTRUM_COLORED\" is commented out.\n" + "//#define PINK\n" + "\n" + "// This option produces art deco looking patterns, which are probably more interesting, but\n" + "// I wanted the default pattern to be more simplistic.\n" + "//#define INCLUDE_LINE_TILES\n" + "\n" + "\n" + "\n" + "// vec2 to vec2 hash.\n" + "vec2 hash22(vec2 p) {\n" + "\n" + " // Faster, but doesn't disperse things quite as nicely. However, when framerate\n" + " // is an issue, and it often is, this is a good one to use. Basically, it's a tweaked\n" + " // amalgamation I put together, based on a couple of other random algorithms I've\n" + " // seen around... so use it with caution, because I make a tonne of mistakes. :)\n" + " float n = sin(dot(p, vec2(57, 27)));\n" + "\n" + " return fract(vec2(262144, 32768)*n);\n" + "\n" + " /*\n" + " // Animated.\n" + " p = fract(vec2(262144, 32768)*n);\n" + " // Note the \".35,\" insted of \".5\" that you'd expect to see. .\n" + " return sin(p*6.2831853 + iTime/2.)*.24;\n" + " */\n" + "}\n" + "\n" + "// Standard 2D rotation formula.\n" + "mat2 r2(in float a){ float c = cos(a), s = sin(a); return mat2(c, s, -s, c); }\n" + "\n" + "/*\n" + "// IQ's 2D unsigned box formula.\n" + "float sBox(vec2 p, vec2 b){ return length(max(abs(p) - b, 0.)); }\n" + "\n" + "// IQ's 2D signed box formula.\n" + "float sBoxU(vec2 p, vec2 b){\n" + "\n" + " vec2 d = abs(p) - b;\n" + " return min(max(d.x, d.y), 0.) + length(max(d, 0.));\n" + "}\n" + "*/\n" + "\n" + "void mainImage(out vec4 fragColor, in vec2 fragCoord){\n" + "\n" + " // Screen coordinates.\n" + " vec2 uv = (fragCoord - iResolution.xy*.5)/iResolution.y;\n" + "\n" + " // Scaling, rotation and transalation.\n" + " vec2 oP = uv*5.;\n" + " oP *= r2(sin(iTime/8.)*3.14159/8.);\n" + " oP -= vec2(cos(iTime/8.)*0., -iTime);\n" + "\n" + "\n" + " // Distance field values -- One for each color. They're \"vec4\"s to hold the three\n" + " // layers and an an unused spare. The other is for the grid.\n" + " vec4 d = vec4(1e5), d2 = vec4(1e5), grid = vec4(1e5);\n" + "\n" + " // Final entry needs to fill in the rest, so you give it a 100% chance of success.\n" + " // I'd rather not say how long it took me to figure that out. :D\n" + " vec2 rndTh[3] = vec2[3]( vec2(.5, .35), vec2(.5, .7), vec2(.5, 1));\n" + "\n" + "\n" + " // The scale dimentions. Gets multiplied by two each iteration.\n" + " float dim = 1.;\n" + "\n" + "\n" + "\n" + " // If you didn't need to worry about overlap, you wouldn't need to consider neighboring\n" + " // cell rendering, which would make this far less complicated - One loop and a break.\n" + "\n" + " // Three tile levels.\n" + " for(int k=0; k<3; k++){\n" + "\n" + " // Base cell ID.\n" + " vec2 ip = floor(oP*dim);\n" + "\n" + "\n" + " for(int j=-1; j<=1; j++){\n" + " for(int i=-1; i<=1; i++){\n" + "\n" + " // The neighboring cell ID.\n" + " vec2 rndIJ = hash22(ip + vec2(i, j));\n" + "\n" + " // The cell IDs for the previous dimension, or dimensions, as the case may be.\n" + " // Because the tiles overlap, rendering order matters. In this case, the tiles\n" + " // need to laid down from largest (k = 0) to smallest (k = 2). If a large tile\n" + " // has taken up the space, you need to check on the next iterations and skip --\n" + " // so as not to lay smaller tiles over the larger ones.\n" + " //\n" + " // So why not just break from the loop? Unfortunately, there are neighboring\n" + " // cells to check, and the IDs need to be calculated from the perspective of\n" + " // each cell neighbor... Yeah, I'm confused too. You can either take my word\n" + " // for it, or better yet, come up with a more elegant solution. :)\n" + " vec2 rndIJ2 = hash22(floor((ip + vec2(i, j))/2.));\n" + " vec2 rndIJ4 = hash22(floor((ip + vec2(i, j))/4.));\n" + " \n" + " // If the previous large tile has been rendered, continue.\n" + " if(k==1 && rndIJ2.y.35){\n" + " c2 = abs(length(p - vec2(.5, -.5)/dim) - .5/dim) - .5/3./dim;\n" + " }\n" + " else{\n" + " // Circles at the mid boundary lines -- instead of an arc.\n" + " // c2 = 1e5; // In some situations, just this would work.\n" + " c2 = length(p - vec2(.5, 0)/dim) - .5/3./dim;\n" + " c2 = min(c2, length(p - vec2(0, -.5)/dim) - .5/3./dim);\n" + " }\n" + "\n" + "\n" + " // Randomly overiding some arcs with lines.\n" + " #ifdef INCLUDE_LINE_TILES\n" + " if(fract(rndIJ.x*113.467 + .51)<.35){\n" + " c = abs(p.x) - .5/3./dim;\n" + " }\n" + " if(fract(rndIJ.y*113.467 + .51)<.35){\n" + " c2 = abs(p.y) - .5/3./dim;\n" + " }\n" + " #endif\n" + "\n" + "\n" + " // Truch arcs, lines, or dots -- as the case may be.\n" + " float truchet = min(c, c2);\n" + "\n" + " // Carving out a mild channel around the line to give a faux weave effect.\n" + " #ifdef INCLUDE_LINE_TILES\n" + " float lne = abs(c - .5/6./dim + .5/12./dim) - .5/12./dim;\n" + " truchet = max(truchet, -lne);\n" + " #endif\n" + "\n" + " // Each tile has two colors. This is the first, and it's rendered on top.\n" + " c = min(c3, max(square, truchet));\n" + " d[k] = min(d[k], c); // Tile color one.\n" + "\n" + "\n" + " // TILE COLOR TWO.\n" + " // Repeat trick, to render four circles at the grid vertices.\n" + " p = abs(p) - .5/dim;\n" + " float l = length(p);\n" + " // Four circles at the grid vertices and the square.\n" + " c = min(l - 1./3./dim, square);\n" + " //c = max(c, -truchet);\n" + " //c = max(c, -c3);\n" + " d2[k] = min(d2[k], c); // Tile color two.\n" + "\n" + " // Rendering some circles at the actual grid vertices. Mouse down to see it.\n" + " grid.y = min(grid.y, l - .5/9./dim); //.05/(dim*.35 + .65)\n" + " grid.z = min(grid.z, l);\n" + "\n" + "\n" + " }\n" + "\n" + "\n" + "\n" + " }\n" + " }\n" + "\n" + "\n" + " dim *= 2.;\n" + "\n" + "\n" + " }\n" + "\n" + "\n" + " // The scene color. Initiated to grey.\n" + " vec3 col = vec3(.25);\n" + "\n" + "\n" + " // Just a simple lined pattern.\n" + " float pat3 = clamp(sin((oP.x - oP.y)*6.283*iResolution.y/24.)*1. + .9, 0., 1.)*.25 + .75;\n" + " // Resolution based falloff... Insert \"too may different devices these days\" rant here. :D\n" + " float fo = 5./iResolution.y;\n" + "\n" + "\n" + " // Tile colors.\n" + " vec3 pCol2 = vec3(.125);\n" + " vec3 pCol1 = vec3(1);\n" + "\n" + " //The spectrum color option overides the pink option.\n" + " #ifdef SPECTRUM_COLORED\n" + " pCol1 = vec3(.7, 1.4, .4);\n" + " #else\n" + " // Pink version.\n" + " #ifdef PINK\n" + " pCol1 = mix(vec3(1, .1, .2), vec3(1, .1, .5), uv.y*.5 + .5);;\n" + " pCol2 = vec3(.1, .02, .06);\n" + " #endif\n" + " #endif\n" + "\n" + "\n" + "\n" + "\n" + " #ifdef STACKED_TILES\n" + " // I provided this as an option becaue I thought it might be useful\n" + " // to see the tile layering process.\n" + "\n" + " float pw = .02;\n" + " d -= pw/2.;\n" + " d2 -= pw/2.;\n" + "\n" + " // Render each two-colored tile, switching colors on alternating iterations.\n" + " for (int k=0; k<3; k++){\n" + "\n" + " col = mix(col, vec3(0), (1. - smoothstep(0., fo*5., d2[k]))*.35);\n" + " col = mix(col, vec3(0), 1. - smoothstep(0., fo, d2[k]));\n" + " col = mix(col, pCol2, 1. - smoothstep(0., fo, d2[k] + pw));\n" + "\n" + " col = mix(col, vec3(0), (1. - smoothstep(0., fo*5., d[k]))*.35);\n" + " col = mix(col, vec3(0), 1. - smoothstep(0., fo, d[k]));\n" + " col = mix(col, pCol1, 1. - smoothstep(0., fo, d[k] + pw));\n" + "\n" + " vec3 temp = pCol1; pCol1 = pCol2; pCol2 = temp;\n" + " }\n" + "\n" + " col *= pat3;\n" + "\n" + " #else\n" + "\n" + " // Combining the tile layers into a continuous surface. I'd like to say that\n" + " // I applied years of topological knowledge to arrive at this, but like most\n" + " // things, I threw a bunch of formulas at the screen in frustration until I\n" + " // fluked the solution. :D There was a bit of logic applied though. :)\n" + " d.x = max(d2.x, -d.x);\n" + " d.x = min(max(d.x, -d2.y), d.y);\n" + " d.x = max(min(d.x, d2.z), -d.z);\n" + "\n" + " // A couple of distance field patterns and a shade.\n" + " float pat = clamp(-sin(d.x*6.283*20.) - .0, 0., 1.);\n" + " float pat2 = clamp(sin(d.x*6.283*16.)*1. + .9, 0., 1.)*.3 + .7;\n" + " float sh = clamp(.75 + d.x*2., 0., 1.);\n" + "\n" + " #ifdef SPECTRUM_COLORED\n" + "\n" + " col *= pat;\n" + "\n" + " // Render the combined shape.\n" + " d.x = -(d.x + .03);\n" + "\n" + " col = mix(col, vec3(0), (1. - smoothstep(0., fo*5., d.x)));\n" + " col = mix(col, vec3(0), 1. - smoothstep(0., fo, d.x));\n" + " col = mix(col, vec3(.8, 1.2, .6), 1. - smoothstep(0., fo*2., d.x + .02));\n" + " col = mix(col, vec3(0), 1. - smoothstep(0., fo*2., d.x + .03));\n" + " col = mix(col, vec3(.7, 1.4, .4)*pat2, 1. - smoothstep(0., fo*2., d.x + .05));\n" + "\n" + " col *= sh;\n" + "\n" + " #else\n" + "\n" + " //d.x -= .01;\n" + " col = pCol1;\n" + "\n" + " // Render the combined shape.\n" + " col = mix(col, vec3(0), (1. - smoothstep(0., fo*5., d.x))*.35);\n" + " col = mix(col, vec3(0), 1. - smoothstep(0., fo, d.x));\n" + " col = mix(col, pCol2, 1. - smoothstep(0., fo, d.x + .02));\n" + "\n" + "\n" + " col *= pat3; // Line decroation.\n" + " #endif\n" + "\n" + " #endif\n" + "\n" + "\n" + "\n" + " // Mild spotlight.\n" + " col *= max(1.15 - length(uv)*.5, 0.);\n" + "\n" + "\n" + " // Click the left mouse button to show the underlying quadtree grid structure. It's\n" + " // helpful to see the cell borders to see the random tile constructions.\n" + " if(iMouse.z>0.){\n" + "\n" + "\n" + " vec3 vCol1 = vec3(.8, 1, .7);\n" + " vec3 vCol2 = vec3(1, .7, .4);\n" + "\n" + " #ifdef PINK\n" + " vCol1 = vCol1.zxy;\n" + " vCol2 = vCol2.zyx;\n" + " #endif\n" + "\n" + " // Grid lines.\n" + " vec3 bg = col;\n" + " col = mix(col, vec3(0), (1. - smoothstep(0., .02, grid.x - .02))*.7);\n" + " col = mix(col, vCol1 + bg/2., 1. - smoothstep(0., .015, grid.x));\n" + "\n" + " // Circles on the grid vertices.\n" + " float fo = .5/iResolution.y/grid.z;\n" + " col = mix(col, vec3(0), (1. - smoothstep(0., fo*3., grid.y - .02))*.5);\n" + " col = mix(col, vec3(0), 1. - smoothstep(0., fo, grid.y - .02));\n" + " col = mix(col, vCol2, 1. - smoothstep(0., fo, grid.y));\n" + " col = mix(col, vec3(0), 1. - smoothstep(0., fo, grid.z - .001));\n" + " }\n" + "\n" + "\n" + " // Mix the colors, if the spectrum option is chosen.\n" + " #ifdef SPECTRUM_COLORED\n" + " col = mix(col, col.yxz, uv.y*.75 + .5); //.zxy\n" + " col = mix(col, col.zxy, uv.x*.7 + .5); //.zxy\n" + " #endif\n" + "\n" + "\n" + " // Rough gamma correction, and output to the screen.\n" + " fragColor = vec4(sqrt(max(col, 0.)), 1);\n" + "}\n" + ); + + register_embedded_glsl_file("ShaderToy/rabbit.glsl", + "float time;\n" + "\n" + "// polynomial smooth min (k = 0.1) (from IQ)\n" + "float smin( float a, float b, float k )\n" + "{\n" + " float h = clamp( 0.5+0.5*(b-a)/k, 0.0, 1.0 );\n" + " return mix( b, a, h ) - k*h*(1.0-h);\n" + "}\n" + "\n" + "\n" + "float smax(float a,float b, float k)\n" + "{\n" + " return -smin(-a,-b,k);\n" + "}\n" + "\n" + "mat2 rotmat(float a)\n" + "{\n" + " return mat2(cos(a),sin(a),-sin(a),cos(a));\n" + "}\n" + "\n" + "float cylinder(vec3 p,vec3 dir,float h,float r)\n" + "{\n" + " float t=dot(p,dir);\n" + " float d=distance(p,dir*t);\n" + " return length(max(abs(vec2(d,t))-vec2(r,h),vec2(0)));\n" + " d=max(d,-t);\n" + " d=max(d,t-h);\n" + " return d;\n" + "}\n" + "\n" + "float pupdist=1e4;\n" + "\n" + "float rabdist(vec3 p)\n" + "{\n" + " float an=.5*.5*2.*6. +iMouse.x/iResolution.x*6.;\n" + " p.xz=mat2(cos(an),sin(an),sin(an),-cos(an))*p.xz;\n" + "\n" + " float time2=time*2.4;\n" + "\n" + " p.y+=2.3;\n" + " p.xy*=rotmat(cos(time2+1.)*.04);\n" + " p.y-=2.3;\n" + "\n" + " vec3 op=p;\n" + "\n" + " vec3 p2=p;\n" + " p2.xy*=rotmat(cos(time2)*.1);\n" + "\n" + " vec3 p3=p;\n" + " p3.xy*=rotmat(cos(time2-.0-length(p)/2.)*.13);\n" + "\n" + " float d=1e4;\n" + " p.x=abs(p.x);\n" + " p2.x=abs(p2.x);\n" + " p3.x=abs(p3.x);\n" + "\n" + " d=smin(length(p2-vec3(-.75,0.,-.1))-.4,length(p2-vec3(.75,0.,-.1))-.5,2.);\n" + " d=smin(d,length(p2-vec3(0,0.4,-.1))-.9,1.6);\n" + " d+=.1;\n" + " // ears 1\n" + " d=smin(d,distance(vec3(.7,clamp(p3.y,0.,2.2),0.),p3.xyz)-.4,.14);\n" + " d=smax(d,-(length(p3-vec3(.7,1.7,-0.5))-.5),.2);\n" + "\n" + " d=smin(d,distance(vec3(0.,clamp(p.y,-1.6,-1.1),0.),p.xyz)-.6,.04);\n" + " d=smin(d,distance(vec3(.3,clamp(p.y,-2.6,-1.5),0.),p.xyz)-.3,.1);\n" + " d=smin(d,distance(vec3(0.,-1.5,-.2),p)-.5+cos(time*3.)*.03,.4);\n" + "\n" + " // ears 2\n" + " d=smin(d,distance(vec3(1.1,2.3,-.1),p3)-.2,.8);\n" + "\n" + " // tail\n" + " d=smin(d,distance(vec3(0,-1.7,.6),p)-.3,.1);\n" + "\n" + " vec3 q=vec3(0.35,.4,-1);\n" + "\n" + " if(mod(time-1.,4.)>.04)\n" + " {\n" + " d=smax(d,-(cylinder(p2-q,normalize(q-p2),.3,.1)-.0001),.05);\n" + " d=smin(d,(length(p2-q*.9)-.2),.24);\n" + "\n" + " // eye pupils\n" + " if(op.x>0.)\n" + " pupdist=(length(p2-vec3(.39,.32,-1.))-.2);\n" + " else\n" + " pupdist=(length(p2-vec3(.28,.32,-1.02))-.2);\n" + "\n" + " d=smin(d,pupdist,.005);\n" + " }\n" + "\n" + " // nose\n" + " d=smin(d,(length(p2-vec3(0,.1,-1.02))-.2),.02);\n" + "\n" + " float d3=smax(-(length(p-vec3(-.05,-.29,-1.02))-.1),-(length(p-vec3(.05,-.29,-1.02))-.1),.1);\n" + "\n" + " float d2=max(p2.z,distance(p2,vec3(clamp(p2.x,0.,.3),-.2,clamp(p2.z,-2.,2.)))+.01);\n" + "\n" + " float time4=time/8.;\n" + " float gg=smoothstep(0.,1.,clamp((min(fract(time4),1.-fract(time4))-.25)*64.,0.,1.));\n" + " d=smax(d,mix(-d2,d3,gg),.1);\n" + "\n" + " // tooth\n" + " d=min(d,(length(p-vec3(.0,-.2,-1.02))-.08));\n" + "\n" + " p.y+=.2;\n" + " p.xy*=rotmat(.4+cos(time2*2.)*.02);\n" + "\n" + " // arms\n" + " float armd=smin(distance(vec3(.2,clamp(p.y,-1.8,-0.),0.),p.xyz)-.2,\n" + " distance(p,vec3(0.2,-1.7,0))-.2,.2);\n" + "\n" + " d=smin(d,armd,.05);\n" + "\n" + " return d;\n" + "}\n" + "\n" + "float floordist(vec3 p)\n" + "{\n" + " return p.y+2.85;\n" + "}\n" + "\n" + "float f(vec3 p)\n" + "{\n" + " return min(rabdist(p),floordist(p));\n" + "}\n" + "\n" + "float sceneDist(vec3 p) { return f(p); }\n" + "\n" + "vec3 sceneNorm(vec3 p)\n" + "{\n" + " vec3 e=vec3(1e-2,0,0);\n" + " float d = sceneDist(p);\n" + " return normalize(vec3(sceneDist(p + e.xyy) - d, sceneDist(p + e.yxy) - d,\n" + " sceneDist(p + e.yyx) - d));\n" + "}\n" + "\n" + "\n" + "// from simon green and others\n" + "float ambientOcclusion(vec3 p, vec3 n)\n" + "{\n" + " const int steps = 18;\n" + " const float delta = 1.5;\n" + "\n" + " float a = 0.0;\n" + " float weight = .5;\n" + " for(int i=1; i<=steps; i++) {\n" + " float d = (float(i) / float(steps)) * delta;\n" + " a += weight*(d - sceneDist(p + n*d));\n" + " weight *= 0.6;\n" + " }\n" + " return clamp(1.0 - a, 0.0, 1.0);\n" + "}\n" + "\n" + "void mainImage( out vec4 fragColor, in vec2 fragCoord )\n" + "{\n" + " vec2 uv = (fragCoord/iResolution.xy * 2. - 1.) * .75;\n" + " uv.x *= iResolution.x / iResolution.y;\n" + " vec2 vt=uv;\n" + " float an;\n" + " time=iTime;\n" + "\n" + " vec3 ro=vec3(0.,-.1,-8.+iMouse.y/iResolution.y*2.);\n" + " vec3 rd=normalize(vec3(uv,1.8));\n" + "\n" + "\n" + " float s=20.;\n" + "\n" + " float t=2.,d=0.;\n" + " for(int i=0;i<120;++i)\n" + " {\n" + " d=f(ro+rd*t);\n" + " if(d<1e-4)break;\n" + " if(t>50.)break;\n" + " t+=d;\n" + " }\n" + "\n" + " float d2=f(ro+rd*t+normalize(vec3(1,2,-2))*5e-2);\n" + " float l=.5+.5*(d2-d)/5e-2;\n" + "\n" + " vec3 rp=(ro+rd*t);\n" + "\n" + " vec3 n=sceneNorm(rp);\n" + "\n" + " vec3 col=vec3(1);\n" + "\n" + " col*=mix(.1,1.,smoothstep(0.0,.01,pupdist));\n" + "\n" + " vec3 bcol=vec3(1,.4,.18);\n" + "\n" + " if(floordist(rp).99999)\n" + " {\n" + " col*=pow(ambientOcclusion(rp,n),1.);\n" + " col*=mix(.7,1.,smoothstep(0.,2.,length(rp.xz)));\n" + " }\n" + " else\n" + " {\n" + " // vec3 r=reflect(rd,n);\n" + " // col += texture(iChannel0, r).rgb*.2*pow(clamp(0.,1.,1.-dot(-rd,n)),2.);\n" + " // col*=pow(ambientOcclusion(rp,n),2.);\n" + " }\n" + "\n" + " fragColor.rgb=max(col,0.);\n" + " fragColor.rgb=sqrt(fragColor.rgb+.01);\n" + "}\n" + "\n" + "\n" + ); + + register_embedded_glsl_file("ShaderToy/RayMarchingPrimitives.glsl", + "// The MIT License\n" + "// Copyright © 2013 Inigo Quilez\n" + "// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n" + "\n" + "\n" + "// A list of useful distance function to simple primitives, and an example on how to\n" + "// do some interesting boolean operations, repetition and displacement.\n" + "//\n" + "// More info here: http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\n" + "\n" + "// make this 1 is your machine is too slow\n" + "#define AA 1\n" + "\n" + "//------------------------------------------------------------------\n" + "\n" + "float sdPlane( in vec3 p )\n" + "{\n" + " return p.y;\n" + "}\n" + "\n" + "float sdSphere( in vec3 p, in float s )\n" + "{\n" + " return length(p)-s;\n" + "}\n" + "\n" + "float sdBox( in vec3 p, in vec3 b )\n" + "{\n" + " vec3 d = abs(p) - b;\n" + " return min(max(d.x,max(d.y,d.z)),0.0) + length(max(d,0.0));\n" + "}\n" + "\n" + "float sdEllipsoid( in vec3 p, in vec3 r )\n" + "{\n" + " return (length( p/r ) - 1.0) * min(min(r.x,r.y),r.z);\n" + "}\n" + "\n" + "float udRoundBox( in vec3 p, in vec3 b, in float r )\n" + "{\n" + " return length(max(abs(p)-b,0.0))-r;\n" + "}\n" + "\n" + "float sdTorus( in vec3 p, in vec2 t )\n" + "{\n" + " return length( vec2(length(p.xz)-t.x,p.y) )-t.y;\n" + "}\n" + "\n" + "float sdHexPrism( vec3 p, vec2 h )\n" + "{\n" + " vec3 q = abs(p);\n" + "#if 0\n" + " return max(q.z-h.y,max((q.x*0.866025+q.y*0.5),q.y)-h.x);\n" + "#else\n" + " float d1 = q.z-h.y;\n" + " float d2 = max((q.x*0.866025+q.y*0.5),q.y)-h.x;\n" + " return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);\n" + "#endif\n" + "}\n" + "\n" + "float sdCapsule( vec3 p, vec3 a, vec3 b, float r )\n" + "{\n" + " vec3 pa = p-a, ba = b-a;\n" + " float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n" + " return length( pa - ba*h ) - r;\n" + "}\n" + "\n" + "float sdEquilateralTriangle( in vec2 p )\n" + "{\n" + " const float k = sqrt(3.0);\n" + " p.x = abs(p.x) - 1.0;\n" + " p.y = p.y + 1.0/k;\n" + " if( p.x + k*p.y > 0.0 ) p = vec2( p.x - k*p.y, -k*p.x - p.y )/2.0;\n" + " p.x += 2.0 - 2.0*clamp( (p.x+2.0)/2.0, 0.0, 1.0 );\n" + " return -length(p)*sign(p.y);\n" + "}\n" + "\n" + "float sdTriPrism( vec3 p, vec2 h )\n" + "{\n" + " vec3 q = abs(p);\n" + " float d1 = q.z-h.y;\n" + "#if 1\n" + " // distance bound\n" + " float d2 = max(q.x*0.866025+p.y*0.5,-p.y)-h.x*0.5;\n" + "#else\n" + " // correct distance\n" + " h.x *= 0.866025;\n" + " float d2 = sdEquilateralTriangle(p.xy/h.x)*h.x;\n" + "#endif\n" + " return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);\n" + "}\n" + "\n" + "float sdCylinder( vec3 p, vec2 h )\n" + "{\n" + " vec2 d = abs(vec2(length(p.xz),p.y)) - h;\n" + " return min(max(d.x,d.y),0.0) + length(max(d,0.0));\n" + "}\n" + "\n" + "float sdCone( in vec3 p, in vec3 c )\n" + "{\n" + " vec2 q = vec2( length(p.xz), p.y );\n" + " float d1 = -q.y-c.z;\n" + " float d2 = max( dot(q,c.xy), q.y);\n" + " return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);\n" + "}\n" + "\n" + "float sdConeSection( in vec3 p, in float h, in float r1, in float r2 )\n" + "{\n" + " float d1 = -p.y - h;\n" + " float q = p.y - h;\n" + " float si = 0.5*(r1-r2)/h;\n" + " float d2 = max( sqrt( dot(p.xz,p.xz)*(1.0-si*si)) + q*si - r2, q );\n" + " return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);\n" + "}\n" + "\n" + "float sdPryamid4(vec3 p, vec3 h ) // h = { cos a, sin a, height }\n" + "{\n" + " // Tetrahedron = Octahedron - Cube\n" + " float box = sdBox( p - vec3(0,-2.0*h.z,0), vec3(2.0*h.z) );\n" + "\n" + " float d = 0.0;\n" + " d = max( d, abs( dot(p, vec3( -h.x, h.y, 0 )) ));\n" + " d = max( d, abs( dot(p, vec3( h.x, h.y, 0 )) ));\n" + " d = max( d, abs( dot(p, vec3( 0, h.y, h.x )) ));\n" + " d = max( d, abs( dot(p, vec3( 0, h.y,-h.x )) ));\n" + " float octa = d - h.z;\n" + " return max(-box,octa); // Subtraction\n" + " }\n" + "\n" + "float length2( vec2 p )\n" + "{\n" + " return sqrt( p.x*p.x + p.y*p.y );\n" + "}\n" + "\n" + "float length6( vec2 p )\n" + "{\n" + " p = p*p*p; p = p*p;\n" + " return pow( p.x + p.y, 1.0/6.0 );\n" + "}\n" + "\n" + "float length8( vec2 p )\n" + "{\n" + " p = p*p; p = p*p; p = p*p;\n" + " return pow( p.x + p.y, 1.0/8.0 );\n" + "}\n" + "\n" + "float sdTorus82( vec3 p, vec2 t )\n" + "{\n" + " vec2 q = vec2(length2(p.xz)-t.x,p.y);\n" + " return length8(q)-t.y;\n" + "}\n" + "\n" + "float sdTorus88( vec3 p, vec2 t )\n" + "{\n" + " vec2 q = vec2(length8(p.xz)-t.x,p.y);\n" + " return length8(q)-t.y;\n" + "}\n" + "\n" + "float sdCylinder6( vec3 p, vec2 h )\n" + "{\n" + " return max( length6(p.xz)-h.x, abs(p.y)-h.y );\n" + "}\n" + "\n" + "//------------------------------------------------------------------\n" + "\n" + "float opS( float d1, float d2 )\n" + "{\n" + " return max(-d2,d1);\n" + "}\n" + "\n" + "vec2 opU( vec2 d1, vec2 d2 )\n" + "{\n" + " return (d1.x0.0 ) tmax = min( tmax, tp1 );\n" + " float tp2 = (1.6-ro.y)/rd.y; if( tp2>0.0 ) { if( ro.y>1.6 ) tmin = max( tmin, tp2 );\n" + " else tmax = min( tmax, tp2 ); }\n" + "#endif\n" + "\n" + " float t = tmin;\n" + " float m = -1.0;\n" + " for( int i=0; i<64; i++ )\n" + " {\n" + " float precis = 0.0005*t;\n" + " vec2 res = map( ro+rd*t );\n" + " if( res.xtmax ) break;\n" + " t += res.x;\n" + " m = res.y;\n" + " }\n" + "\n" + " if( t>tmax ) m=-1.0;\n" + " return vec2( t, m );\n" + "}\n" + "\n" + "\n" + "float calcSoftshadow( in vec3 ro, in vec3 rd, in float mint, in float tmax )\n" + "{\n" + " float res = 1.0;\n" + " float t = mint;\n" + " for( int i=0; i<16; i++ )\n" + " {\n" + " float h = map( ro + rd*t ).x;\n" + " res = min( res, 8.0*h/t );\n" + " t += clamp( h, 0.02, 0.10 );\n" + " if( h<0.001 || t>tmax ) break;\n" + " }\n" + " return clamp( res, 0.0, 1.0 );\n" + "}\n" + "\n" + "vec3 calcNormal( in vec3 pos )\n" + "{\n" + " vec2 e = vec2(1.0,-1.0)*0.5773*0.0005;\n" + " return normalize( e.xyy*map( pos + e.xyy ).x +\n" + " e.yyx*map( pos + e.yyx ).x +\n" + " e.yxy*map( pos + e.yxy ).x +\n" + " e.xxx*map( pos + e.xxx ).x );\n" + " /*\n" + " vec3 eps = vec3( 0.0005, 0.0, 0.0 );\n" + " vec3 nor = vec3(\n" + " map(pos+eps.xyy).x - map(pos-eps.xyy).x,\n" + " map(pos+eps.yxy).x - map(pos-eps.yxy).x,\n" + " map(pos+eps.yyx).x - map(pos-eps.yyx).x );\n" + " return normalize(nor);\n" + " */\n" + "}\n" + "\n" + "float calcAO( in vec3 pos, in vec3 nor )\n" + "{\n" + " float occ = 0.0;\n" + " float sca = 1.0;\n" + " for( int i=0; i<5; i++ )\n" + " {\n" + " float hr = 0.01 + 0.12*float(i)/4.0;\n" + " vec3 aopos = nor * hr + pos;\n" + " float dd = map( aopos ).x;\n" + " occ += -(dd-hr)*sca;\n" + " sca *= 0.95;\n" + " }\n" + " return clamp( 1.0 - 3.0*occ, 0.0, 1.0 );\n" + "}\n" + "\n" + "// http://iquilezles.org/www/articles/checkerfiltering/checkerfiltering.htm\n" + "float checkersGradBox( in vec2 p )\n" + "{\n" + " // filter kernel\n" + " vec2 w = fwidth(p) + 0.001;\n" + " // analytical integral (box filter)\n" + " vec2 i = 2.0*(abs(fract((p-0.5*w)*0.5)-0.5)-abs(fract((p+0.5*w)*0.5)-0.5))/w;\n" + " // xor pattern\n" + " return 0.5 - 0.5*i.x*i.y;\n" + "}\n" + "\n" + "vec3 render( in vec3 ro, in vec3 rd )\n" + "{\n" + " vec3 col = vec3(0.7, 0.9, 1.0) +rd.y*0.8;\n" + " vec2 res = castRay(ro,rd);\n" + " float t = res.x;\n" + " float m = res.y;\n" + " if( m>-0.5 )\n" + " {\n" + " vec3 pos = ro + t*rd;\n" + " vec3 nor = calcNormal( pos );\n" + " vec3 ref = reflect( rd, nor );\n" + "\n" + " // material\n" + " col = 0.45 + 0.35*sin( vec3(0.05,0.08,0.10)*(m-1.0) );\n" + " if( m<1.5 )\n" + " {\n" + "\n" + " float f = checkersGradBox( 5.0*pos.xz );\n" + " col = 0.3 + f*vec3(0.1);\n" + " }\n" + "\n" + " // lighitng\n" + " float occ = calcAO( pos, nor );\n" + " vec3 lig = normalize( vec3(-0.4, 0.7, -0.6) );\n" + " vec3 hal = normalize( lig-rd );\n" + " float amb = clamp( 0.5+0.5*nor.y, 0.0, 1.0 );\n" + " float dif = clamp( dot( nor, lig ), 0.0, 1.0 );\n" + " float bac = clamp( dot( nor, normalize(vec3(-lig.x,0.0,-lig.z))), 0.0, 1.0 )*clamp( 1.0-pos.y,0.0,1.0);\n" + " float dom = smoothstep( -0.1, 0.1, ref.y );\n" + " float fre = pow( clamp(1.0+dot(nor,rd),0.0,1.0), 2.0 );\n" + "\n" + " dif *= calcSoftshadow( pos, lig, 0.02, 2.5 );\n" + " dom *= calcSoftshadow( pos, ref, 0.02, 2.5 );\n" + "\n" + " float spe = pow( clamp( dot( nor, hal ), 0.0, 1.0 ),16.0)*\n" + " dif *\n" + " (0.04 + 0.96*pow( clamp(1.0+dot(hal,rd),0.0,1.0), 5.0 ));\n" + "\n" + " vec3 lin = vec3(0.0);\n" + " lin += 1.30*dif*vec3(1.00,0.80,0.55);\n" + " lin += 0.40*amb*vec3(0.40,0.60,1.00)*occ;\n" + " lin += 0.50*dom*vec3(0.40,0.60,1.00)*occ;\n" + " lin += 0.50*bac*vec3(0.25,0.25,0.25)*occ;\n" + " lin += 0.25*fre*vec3(1.00,1.00,1.00)*occ;\n" + " col = col*lin;\n" + " col += 10.00*spe*vec3(1.00,0.90,0.70);\n" + "\n" + " col = mix( col, vec3(0.8,0.9,1.0), 1.0-exp( -0.0002*t*t*t ) );\n" + " }\n" + "\n" + " return vec3( clamp(col,0.0,1.0) );\n" + "}\n" + "\n" + "mat3 setCamera( in vec3 ro, in vec3 ta, float cr )\n" + "{\n" + " vec3 cw = normalize(ta-ro);\n" + " vec3 cp = vec3(sin(cr), cos(cr),0.0);\n" + " vec3 cu = normalize( cross(cw,cp) );\n" + " vec3 cv = normalize( cross(cu,cw) );\n" + " return mat3( cu, cv, cw );\n" + "}\n" + "\n" + "void mainImage( out vec4 fragColor, in vec2 fragCoord )\n" + "{\n" + " vec2 mo = iMouse.xy/iResolution.xy;\n" + " float time = 15.0 + iTime;\n" + "\n" + "\n" + " vec3 tot = vec3(0.0);\n" + "#if AA>1\n" + " for( int m=0; m1\n" + " }\n" + " tot /= float(AA*AA);\n" + "#endif\n" + "\n" + "\n" + " fragColor = vec4( tot, 1.0 );\n" + "}\n" + "\n" + ); + + register_embedded_glsl_file("ShaderToy/RoundedVoronoiEdges.glsl", + "/*\n" + " Rounded Voronoi Borders\n" + " -----------------------\n" + "\n" + " Fabrice came up with an interesting formula to produce more evenly distributed Voronoi values.\n" + " I'm sure there are more interesting ways to use it, but I like the fact that it facilitates\n" + " the creation of more rounded looking borders. I'm sure there are more sophisticated ways to\n" + " produce more accurate borders, but Fabrice's version is simple and elegant.\n" + "\n" + " The process is explained below. The link to the original is below also.\n" + "\n" + " I didn't want to cloud the example with too much window dressing, so just for fun, I tried\n" + " to pretty it up by using as little code as possible.\n" + "\n" + " // 2D version\n" + " 2D trabeculum - FabriceNeyret2\n" + " https://www.shadertoy.com/view/4dKSDV\n" + "\n" + " // 3D version\n" + " hypertexture - trabeculum - FabriceNeyret2\n" + " https://www.shadertoy.com/view/ltj3Dc\n" + "\n" + " // Straight borders - accurate geometric solution.\n" + " Voronoi - distances - iq\n" + " https://www.shadertoy.com/view/ldl3W8\n" + "\n" + "*/\n" + "\n" + "// vec2 to vec2 hash.\n" + "vec2 hash22(vec2 p) {\n" + "\n" + " // Faster, but doesn't disperse things quite as nicely as other combinations. :)\n" + " float n = sin(dot(p, vec2(41, 289)));\n" + " //return fract(vec2(262144, 32768)*n)*.75 + .25;\n" + "\n" + " // Animated.\n" + " p = fract(vec2(262144, 32768)*n);\n" + " return sin( p*6.2831853 + iTime )*.35 + .65;\n" + "\n" + "}\n" + "\n" + "// IQ's polynomial-based smooth minimum function.\n" + "float smin( float a, float b, float k ){\n" + "\n" + " float h = clamp(.5 + .5*(b - a)/k, 0., 1.);\n" + " return mix(b, a, h) - k*h*(1. - h);\n" + "}\n" + "\n" + "// 2D 3rd-order Voronoi: This is just a rehash of Fabrice Neyret's version, which is in\n" + "// turn based on IQ's original. I've simplified it slightly, and tidied up the \"if-statements,\"\n" + "// but the clever bit at the end came from Fabrice.\n" + "//\n" + "// Using a bit of science and art, Fabrice came up with the following formula to produce a more\n" + "// rounded, evenly distributed, cellular value:\n" + "\n" + "// d1, d2, d3 - First, second and third closest points (nodes).\n" + "// val = 1./(1./(d2 - d1) + 1./(d3 - d1));\n" + "//\n" + "float Voronoi(in vec2 p){\n" + "\n" + " vec2 g = floor(p), o; p -= g;\n" + " \n" + " vec3 d = vec3(1); // 1.4, etc.\n" + "\n" + " float r = 0.;\n" + "\n" + " for(int y = -1; y <= 1; y++){\n" + " for(int x = -1; x <= 1; x++){\n" + "\n" + " o = vec2(x, y);\n" + " o += hash22(g + o) - p;\n" + "\n" + " r = dot(o, o);\n" + "\n" + " // 1st, 2nd and 3rd nearest squared distances.\n" + " d.z = max(d.x, max(d.y, min(d.z, r))); // 3rd.\n" + " d.y = max(d.x, min(d.y, r)); // 2nd.\n" + " d.x = min(d.x, r); // Closest.\n" + "\n" + " }\n" + " }\n" + "\n" + " d = sqrt(d); // Squared distance to distance.\n" + "\n" + " // Fabrice's formula.\n" + " return min(2./(1./max(d.y - d.x, .001) + 1./max(d.z - d.x, .001)), 1.);\n" + " // Dr2's variation - See \"Voronoi Of The Week\": https://www.shadertoy.com/view/lsjBz1\n" + " //return min(smin(d.z, d.y, .2) - d.x, 1.);\n" + "\n" + "}\n" + "\n" + "vec2 hMap(vec2 uv){\n" + "\n" + " // Plain Voronoi value. We're saving it and returning it to use when coloring.\n" + " // It's a little less tidy, but saves the need for recalculation later.\n" + " float h = Voronoi(uv*6.);\n" + "\n" + " // Adding some bordering and returning the result as the height map value.\n" + " float c = smoothstep(0., fwidth(h)*2., h - .09)*h;\n" + " c += (1.-smoothstep(0., fwidth(h)*3., h - .22))*c*.5;\n" + "\n" + " // Returning the rounded border Voronoi, and the straight Voronoi values.\n" + " return vec2(c, h);\n" + "\n" + "}\n" + "\n" + "void mainImage( out vec4 fragColor, in vec2 fragCoord ){\n" + "\n" + " // Moving screen coordinates.\n" + " vec2 uv = fragCoord/iResolution.y + vec2(-.2, .05)*iTime;\n" + "\n" + " // Obtain the height map (rounded Voronoi border) value, then another nearby.\n" + " vec2 c = hMap(uv);\n" + " vec2 c2 = hMap(uv + .004);\n" + "\n" + " // Take a factored difference of the values above to obtain a very, very basic gradient value.\n" + " // Ie. - a measurement of the bumpiness, or bump value.\n" + " float b = max(c2.x - c.x, 0.)*16.;\n" + "\n" + " // Use the height map value to produce some color. It's all made up on the spot, so don't pay it\n" + " // too much attention.\n" + " //\n" + " vec3 col = vec3(1, .05, .25)*c.x; // Red base.\n" + " float sv = Voronoi(uv*16. + c.y)*.66 + (1.-Voronoi(uv*48. + c.y*2.))*.34; // Finer overlay pattern.\n" + " col = col*.85 + vec3(1, .7, .5)*sv*sqrt(sv)*.3; // Mix in a little of the overlay.\n" + " col += (1. - col)*(1.-smoothstep(0., fwidth(c.y)*3., c.y - .22))*c.x; // Highlighting the border.\n" + " col *= col; // Ramping up the contrast, simply because the deeper color seems to look better.\n" + "\n" + " // Taking a pattern sample a little off to the right, ramping it up, then combining a bit of it\n" + " // with the color above. The result is the flecks of yellowy orange that you see. There's no physics\n" + " // behind it, but the offset tricks your eyes into believing something's happening. :)\n" + " sv = col.x*Voronoi(uv*6. + .5);\n" + " col += vec3(.7, 1, .3)*pow(sv, 4.)*8.;\n" + "\n" + " // Apply the bump - or a powered variation of it - to the color for a bit of highlighting.\n" + " col += vec3(.5, .7, 1)*(b*b*.5 + b*b*b*b*.5);\n" + " \n" + "\n" + " // Basic gamma correction\n" + " fragColor = vec4(sqrt(clamp(col, 0., 1.)), 1);\n" + "\n" + "}\n" + ); + + register_embedded_glsl_file("ShaderToy/RounderVoronoi.glsl", + "// ST_MODE = \"ShaderToy mode\". Do not undefine. It is here for PolyCube compatibility.\n" + "#define ST_MODE\n" + "\n" + "// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.\n" + "// by Tomasz Dobrowolski' 2018\n" + "\n" + "// Use mouse (X/Y) to control two smoothness parameters.\n" + "\n" + "// PolyCube edition:\n" + "// http://polycu.be/edit/?h=X3sd5D\n" + "\n" + "// This is continuation of a quest to formulate\n" + "// smooth and continuous across whole domain\n" + "// distance function to edges of random Voronoi cells.\n" + "\n" + "// I just had a very simple idea today (2018-02-03)\n" + "// how to make this function continuous and smooth\n" + "// at non-zero distance at the same time, and it works!\n" + "// See \"voronoi_rounder\" function for details.\n" + "\n" + "// My previous shader with analysis of discontinuities\n" + "// in Shane's attempt.\n" + "// https://www.shadertoy.com/view/MdSfzD\n" + "\n" + "// Shane's original shader.\n" + "// https://www.shadertoy.com/view/lsSfz1\n" + "\n" + "// My previous attempt to optimize distance to edges.\n" + "// https://www.shadertoy.com/view/llG3zy\n" + "\n" + "// Smooth cell noise function by TinyTexel.\n" + "// https://www.shadertoy.com/view/MdByzD\n" + "\n" + "// Play with some options (1 = enable, 0 = disable).\n" + "#define DOMAIN_DEFORM 0\n" + "#define ANIMATE 1\n" + "\n" + "// How far cells can go off center during animation (must be <= .5)\n" + "#define ANIMATE_D .45\n" + "\n" + "// Points cannot be closer than sqrt(EPSILON)\n" + "#define EPSILON .00001\n" + "\n" + "#ifdef ST_MODE\n" + "#define template_time iTime\n" + "#endif\n" + "\n" + "vec2 hash2(vec2 p)\n" + "{\n" + " #if 1\n" + " // Dave Hoskin's hash as in https://www.shadertoy.com/view/4djSRW\n" + " vec3 p3 = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973));\n" + " p3 += dot(p3, p3.yzx+19.19);\n" + " vec2 o = fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y));\n" + " #else\n" + " // Texture-based\n" + " vec2 o = texture( iChannel0, (p+0.5)/256.0, -100.0 ).xy;\n" + " #endif\n" + " #if ANIMATE\n" + " o = 0.5 + ANIMATE_D*sin( template_time*.5 + o*6.2831853 );\n" + " #endif\n" + " return o;\n" + "}\n" + "\n" + "// Commutative smin function taken\n" + "// from Alex Evans aka Statix talk\n" + "// http://media.lolrus.mediamolecule.com/AlexEvans_SIGGRAPH-2015.pdf\n" + "// credited to Dave Smith @media molecule\n" + "float smin(float a, float b, float r)\n" + "{\n" + "#if 0\n" + " // Preventing division by zero.\n" + " float f = max(0.,1.-abs(b-a)/max(1e-32,r));\n" + "#else\n" + " float f = max(0.,1.-abs(b-a)/r);\n" + "#endif\n" + " return min(a,b) - r*.25*f*f;\n" + "}\n" + "\n" + "// Smooth abs.\n" + "// This one is equivalent to -smin(x, -x, r) - r*.25\n" + "float sabs(float x, float r)\n" + "{\n" + " float f = max(0.,1.-abs(x + x)/r);\n" + " return abs(x) + r*.25*(f*f - 1.);\n" + "}\n" + "\n" + "// This is bullet-proof version of finding closest point\n" + "// in 4x4 area around query point \"q\".\n" + "// In fact 12 cells (4x4 without corners) would be enough,\n" + "// but it's less elegant to implement.\n" + "// We pass n=|q|, f=q-n, as an optimization.\n" + "float closest( in vec2 n, in vec2 f, out vec2 mr, out vec2 mg )\n" + "{\n" + " // take half-cell position\n" + " vec2 h = step(.5,f) - 2.;\n" + " vec2 n2 = n + h;\n" + " vec2 f2 = f - h;\n" + "\n" + " float md = 8.0;\n" + "\n" + " //----------------------------------\n" + " // first pass: regular voronoi\n" + " //----------------------------------\n" + " for( int j=0; j<=3; j++ )\n" + " for( int i=0; i<=3; i++ )\n" + " {\n" + " vec2 g = vec2(float(i),float(j));\n" + " vec2 o = hash2( n2 + g );\n" + " vec2 r = g + o - f2;\n" + " float d = dot(r,r);\n" + "\n" + " if( dEPSILON ) // skip the same cell\n" + " {\n" + " float d = dot( 0.5*(mr+r), normalize(r-mr) );\n" + "\n" + " // The whole trick to get continuous function\n" + " // across whole domain and smooth at non-zero distance\n" + " // is to use smooth minimum (as usual)\n" + " // and multiple smoothness factor by distance,\n" + " // so it becomes minimum at zero distance.\n" + " // Simple as that!\n" + " // If you keep smoothness factor constant (i.e. multiple by \"s\" only),\n" + " // the distance function becomes discontinuous\n" + " // (see https://www.shadertoy.com/view/MdSfzD).\n" + " md = smin(d, md, s*d);\n" + " }\n" + " }\n" + "\n" + " // Totally empirical compensation for\n" + " // smoothing scaling side-effect.\n" + " md *= .5 + s;\n" + "\n" + " // At the end do some smooth abs\n" + " // on the distance value.\n" + " // This is really optional, since distance function\n" + " // is already continuous, but we can get extra\n" + " // smoothness from it.\n" + " md = sabs(md, e);\n" + "\n" + " return vec3( md, mr );\n" + "}\n" + "\n" + "#ifdef ST_MODE\n" + "vec3 plot( vec2 p, float ss )\n" + "{\n" + "#else\n" + "vec3 plot( vec2 p )\n" + "{\n" + " float ss = template_tr.z;\n" + "#endif\n" + "#ifdef ST_MODE\n" + " float s = clamp(iMouse.x/iResolution.x,.0,1.)*.95+.05;\n" + " float e = max(.01,iMouse.y/iResolution.y)*.5;\n" + " if (length(iMouse.xy) < .5) {\n" + " s = .5;\n" + " e = .005;\n" + " }\n" + "#else\n" + " const float s = .5;\n" + " const float e = .01;\n" + "#endif\n" + " vec3 c = voronoi_rounder(p, s, e);\n" + "\n" + " const float pd = 40.;\n" + "#if 0\n" + " vec3 norm = normalize(vec3(dFdx(c.x),dFdy(c.x),ss*1.5));\n" + " float fw1 = fwidth(c.x);\n" + "#else\n" + " const vec2 eps = vec2(.001,0);\n" + " float fdx = (voronoi_rounder(p + eps.xy, s, e).x - c.x)/eps.x;\n" + " float fdy = (voronoi_rounder(p + eps.yx, s, e).x - c.x)/eps.x;\n" + " vec3 norm = normalize(vec3(fdx, fdy, 1.5));\n" + " float fw1 = (abs(fdx) + abs(fdy))*ss;\n" + "#endif\n" + " float fw2 = fw1*(pd/3.141592653589793*2.7);\n" + "\n" + " const float f0 = sin(.7/pd);\n" + " float f = sin(c.x*pd-.7);\n" + " float od = abs(f);\n" + " vec3 ldir = normalize(vec3(-.2,-.3,.6));\n" + " float dd = dot(norm,ldir);\n" + " float rd = pow(max(0.,reflect(-ldir,norm).z),16.);\n" + " float ld = dd*dd*.7+.35;\n" + " float c0 = c.x*.7-step(0.,f)*.05+.6;\n" + " float c1 = c.x*.7+.33;\n" + " vec3 col = mix(vec3(c0*ld+rd*.23), vec3(c1*ld), smoothstep(fw2,0.,od)*.7);\n" + " col = mix(col, vec3(.1,.15,.1), smoothstep(f0+fw1,f0,c.x)*.5);\n" + " col = sqrt(col)*1.5-.53; // some final grading\n" + " return col;\n" + "}\n" + "\n" + "#ifdef ST_MODE\n" + "void mainImage( out vec4 fragColor, in vec2 fragCoord )\n" + "{\n" + " float sc = step(0.5, iResolution.y)*2. + 3.; // scale differently for fullscreen\n" + " float ss = sc / iResolution.y; // size of 1 pixel\n" + " vec2 uv = (fragCoord.xy - iResolution.xy*.5) * ss;\n" + " fragColor = vec4(plot(uv, ss), 1.);\n" + "}\n" + "#endif\n" + ); + + register_embedded_glsl_file("ShaderToy/SiggraphLogo.glsl", + "// Created by inigo quilez - iq/2013\n" + "// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.\n" + "\n" + "vec2 disp( in vec3 p )\n" + "{\n" + " return vec2( pow( 0.5 + 0.5*cos( 1.0*iTime ), 2.0 ),\n" + " pow( 0.5 + 0.5*cos( 25.0*p.x + 1.5*iTime)*\n" + " sin( 25.0*p.y + 2.0*iTime )*\n" + " sin( 25.0*p.z + 1.0*iTime ), 3.0) );\n" + "}\n" + "\n" + "float obj( in vec3 p )\n" + "{\n" + " vec3 ax = vec3(-2.0,2.0,1.0)/3.0;\n" + " vec3 ce = vec3(0.0,-0.2,-0.2);\n" + "\n" + " float d1 = dot(p,ax) - 0.1;\n" + " float d2 = length(p) - 1.0;\n" + " float d3 = length( p-ce - ax*dot(p-ce,ax)) - 1.0;\n" + "\n" + " return max( max( d1, d2 ), -d3 );\n" + "}\n" + "\n" + "vec2 map( in vec3 p )\n" + "{\n" + " float d1 = obj( p );\n" + " float d2 = obj( p*vec3(-1.0,-1.0,1.0) );\n" + "\n" + " vec2 res = vec2( d1, 0.0 );\n" + " if( d2-0.5 )\n" + " {\n" + " // geometry\n" + " vec3 pos = ro + tmat.x*rd;\n" + " vec3 nor = calcNormal(pos);\n" + " vec3 ref = reflect(rd,nor);\n" + " vec3 lig = normalize(vec3(-0.6,0.5,0.2));\n" + " vec2 dis = disp( pos );\n" + "\n" + " // lights\n" + " float con = 1.0;\n" + " float amb = 0.5 + 0.5*nor.y;\n" + " float dif = max(dot(nor,lig),0.0);\n" + " float bac = max(0.2 + 0.8*dot(nor,vec3(-lig.x,lig.y,-lig.z)),0.0);\n" + " float rim = pow(1.0+dot(nor,rd),8.0);\n" + " float spe = pow(clamp(dot(lig,ref),0.0,1.0),8.0);\n" + " float occ = mix( 1.0, 0.9 + 3.0*dis.y, dis.x );\n" + "\n" + " // shadow\n" + " float sh = softshadow( pos, lig, 0.01, 8.0 );\n" + " dif *= sh;\n" + " spe *= sh;\n" + " rim *= sh;\n" + " \n" + " col = 0.10*con*vec3(1.0)*occ;\n" + " col += 1.00*dif*vec3(1.0,0.8,0.6);\n" + " col += 0.40*bac*vec3(1.0)*occ;\n" + " col += 0.25*amb*vec3(0.6,0.8,1.0)*occ;\n" + "\n" + " // material\n" + " col *= mix( vec3(0.7,0.1,0.1), vec3(0.0,0.2,1.0), tmat.y );\n" + " \n" + " // speculars\n" + " col += 0.50*spe*vec3(1.0);\n" + " col += 1.00*rim*vec3(1.0);\n" + " \n" + " // gamma\n" + " col = sqrt(col);\n" + " }\n" + "\n" + "\n" + " fragColor = vec4( col,1.0 );\n" + "}\n" ); + + register_embedded_glsl_file("ShaderToy/TentacleObject.glsl", + "// Spherical Fibonnacci points, as described by Benjamin Keinert, Matthias Innmann,\n" + "// Michael Sanger and Marc Stamminger in their paper (below)\n" + "\n" + "//=================================================================================================\n" + "// http://lgdv.cs.fau.de/uploads/publications/spherical_fibonacci_mapping_opt.pdf\n" + "//=================================================================================================\n" + "const float PI = 3.14159265359;\n" + "const float PHI = 1.61803398875;\n" + "\n" + "// Originally from https://www.shadertoy.com/view/lllXz4\n" + "// Modified by fizzer to put out the vector q.\n" + "vec2 inverseSF( vec3 p, float n, out vec3 outq )\n" + "{\n" + " float m = 1.0 - 1.0/n;\n" + "\n" + " float phi = min(atan(p.y, p.x), PI), cosTheta = p.z;\n" + "\n" + " float k = max(2.0, floor( log(n * PI * sqrt(5.0) * (1.0 - cosTheta*cosTheta))/ log(PHI+1.0)));\n" + " float Fk = pow(PHI, k)/sqrt(5.0);\n" + " vec2 F = vec2( round(Fk), round(Fk * PHI) ); // k, k+1\n" + "\n" + " vec2 ka = 2.0*F/n;\n" + " vec2 kb = 2.0*PI*( fract((F+1.0)*PHI) - (PHI-1.0) );\n" + "\n" + " mat2 iB = mat2( ka.y, -ka.x,\n" + " kb.y, -kb.x ) / (ka.y*kb.x - ka.x*kb.y);\n" + "\n" + " vec2 c = floor( iB * vec2(phi, cosTheta - m));\n" + " float d = 8.0;\n" + " float j = 0.0;\n" + " for( int s=0; s<4; s++ )\n" + " {\n" + " vec2 uv = vec2( float(s-2*(s/2)), float(s/2) );\n" + "\n" + " float i = round(dot(F, uv + c));\n" + "\n" + " float phi = 2.0*PI*fract(i*PHI);\n" + " float cosTheta = m - 2.0*i/n;\n" + " float sinTheta = sqrt(1.0 - cosTheta*cosTheta);\n" + "\n" + " vec3 q = vec3( cos(phi)*sinTheta, sin(phi)*sinTheta, cosTheta );\n" + " float squaredDistance = dot(q-p, q-p);\n" + " if (squaredDistance < d)\n" + " {\n" + " outq = q;\n" + " d = squaredDistance;\n" + " j = i;\n" + " }\n" + " }\n" + " return vec2( j, sqrt(d) );\n" + "}\n" + "\n" + "vec2 intersectSphere(vec3 ro, vec3 rd, vec3 org, float rad)\n" + "{\n" + " float a = dot(rd, rd);\n" + " float b = 2. * dot(rd, ro - org);\n" + " float c = dot(ro - org, ro - org) - rad * rad;\n" + " float desc = b * b - 4. * a * c;\n" + " if (desc < 0.)\n" + " return vec2(1, 0);\n" + "\n" + " return vec2((-b - sqrt(desc)) / (2. * a), (-b + sqrt(desc)) / (2. * a));\n" + "}\n" + "\n" + "// polynomial smooth min (k = 0.1);\n" + "// from iq: https://www.iquilezles.org/www/articles/smin/smin.htm\n" + "float smin( float a, float b, float k )\n" + "{\n" + " float h = clamp( 0.5+0.5*(b-a)/k, 0.0, 1.0 );\n" + " return mix( b, a, h ) - k*h*(1.0-h);\n" + "}\n" + "\n" + "//float smin(float a,float b,float k){ return -log2(exp2(-k*a)+exp2(-k*b))/k;}//from iq\n" + "float smax(float a,float b,float k){ return -smin(-a,-b,k);}\n" + "\n" + "mat3 rotX(float a)\n" + "{\n" + " return mat3(1., 0., 0.,\n" + " 0., cos(a), sin(a),\n" + " 0., -sin(a), cos(a));\n" + "}\n" + "\n" + "mat3 rotY(float a)\n" + "{\n" + " return mat3(cos(a), 0., sin(a),\n" + " 0., 1., 0.,\n" + " -sin(a), 0., cos(a));\n" + "}\n" + "\n" + "mat3 rotZ(float a)\n" + "{\n" + " return mat3(cos(a), sin(a), 0.,\n" + " -sin(a), cos(a), 0.,\n" + " 0., 0., 1.);\n" + "}\n" + "\n" + "// Anti-aliasing samples count sqrt\n" + "#define AA 2\n" + "\n" + "float time;\n" + "\n" + "// Rotation matrix for spherical layer.\n" + "mat3 rot(float r)\n" + "{\n" + " float t = time - r * 2.;\n" + " float s = .5 + .5 * r;\n" + " return rotX(cos(t / 1.5) * s) * rotY(sin(t / 3.) * s);\n" + "}\n" + "\n" + "// Scene SDF\n" + "float dist(vec3 p)\n" + "{\n" + " const float precis = 35.0;\n" + "\n" + " vec3 op = p;\n" + "\n" + " p = rot(length(p)) * p;\n" + "\n" + " // Rotational velocity estimation.\n" + " float diff = distance(p, rot(length(op) - 1e-2) * op);\n" + "\n" + " // A scaling factor based on the rotational velocity to\n" + " // simulate a 'bunching up' of the tentacles when they are spinning fast.\n" + " float k = max(1e-3, 1. + diff * 1.);\n" + "\n" + " p *= k;\n" + " op *= k;\n" + "\n" + " vec3 q;\n" + " vec2 sf = inverseSF( normalize(p), precis, q );\n" + "\n" + " q *= k;\n" + "\n" + " float d = length(p);\n" + "\n" + " // Alternating tentacle lengths based on spiral point ID.\n" + " float r3 = (mod(sf.x, 3.) < 1.) ? 1. : 1.45;\n" + " float r2 = r3 / k;\n" + "\n" + " d = smax(sf.y - diff * 2.2 - .04 / dot(p, p), d - r3, 32. / 200.);\n" + "\n" + " // Add spheres at the ends of the tentacles using the unrotated\n" + " // sample space, to keep them spherical.\n" + " q = transpose(rot(r2 + .05)) * q;\n" + " d = smin(d, length(op - q * r2) - .1, 32. / 200.);\n" + "\n" + " return min(d * .6 / k, .2);\n" + "}\n" + "\n" + "// A special field which is only applied when extracing surface normals.\n" + "float bump(vec3 p)\n" + "{\n" + " return 0.0;\n" + "}\n" + "\n" + "vec3 getNormal(vec3 p)\n" + "{\n" + " // Here the epsilon used for scene normal extraction is larger than the detailed\n" + " // bump epsilon. The larger geometry epsilon results in a smoothing effect which helps\n" + " // to blend the bases of the tentacles together.\n" + "\n" + " const vec2 eps = vec2(1e-1, 0);\n" + " const vec2 eps2 = vec2(1e-3, 0);\n" + " return normalize(vec3(dist(p + eps.xyy) + bump(p + eps2.xyy) - dist(p - eps.xyy) - bump(p - eps2.xyy),\n" + " dist(p + eps.yxy) + bump(p + eps2.yxy) - dist(p - eps.yxy) - bump(p - eps2.yxy),\n" + " dist(p + eps.yyx) + bump(p + eps2.yyx) - dist(p - eps.yyx) - bump(p - eps2.yyx)));\n" + "}\n" + "\n" + "// Pyramid waveform\n" + "float tri(float x)\n" + "{\n" + " return min(fract(x) * 2., 2. - 2. * fract(x));\n" + "}\n" + "\n" + "vec3 render(vec2 fragCoord)\n" + "{\n" + " // Jittered time sample for motionblur\n" + " time = iTime + texelFetch(iChannel1, ivec2(fragCoord * 2.) & 1023, 0).r * .025;\n" + "\n" + " vec3 fragColor = vec3(0);\n" + "\n" + " vec2 uv = fragCoord / iResolution.xy * 2. - 1.;\n" + " uv.x *= iResolution.x / iResolution.y;\n" + "\n" + " vec3 ro = vec3(0, 0, 3), rd = normalize(vec3(uv, -1.8));\n" + "\n" + " ro.y += sin(time / 4.) * .03;\n" + " ro.x += sin(time / 5.) * .03;\n" + "\n" + " // Clip to a bounding sphere\n" + " vec2 spheret = intersectSphere(ro, rd, vec3(0), 1.6);\n" + "\n" + " // Background colour\n" + " vec3 bg = vec3(.75) * mix(vec3(.5, .5, 1.), vec3(1), .6) * (1. - smoothstep(0., 7., length(uv)));\n" + "\n" + " if(spheret.x > spheret.y)\n" + " return bg;\n" + "\n" + " float t = spheret.x;\n" + " float maxt = spheret.y;\n" + "\n" + " // Raymarch\n" + " for(int i = 0; i < 80; ++i)\n" + " {\n" + " float d = dist(ro + rd * t);\n" + " if(abs(d) < 1e-4 || t > maxt)\n" + " break;\n" + " t += d;\n" + " }\n" + "\n" + " if(t > maxt)\n" + " {\n" + " fragColor.rgb = bg;\n" + " }\n" + " else\n" + " {\n" + " vec3 rp = ro + rd * t;\n" + " vec3 n = getNormal(rp);\n" + " vec3 r = reflect(rd, n);\n" + " float l = length(rp);\n" + " float fr = clamp(1. - dot(n, -rd), 0., 1.);\n" + "\n" + " // Apply some fake shadowing to the specular highlight and the backlight,\n" + " // by simulating a spherical occluder for the 'body' at the center of the object.\n" + " float bodyR = .5;\n" + " float cone = cos(atan(bodyR / l));\n" + "\n" + " float specshad = 1. - smoothstep(-.1, .1, dot(r, normalize(vec3(0) - rp)) - cone) * 1.;\n" + " float specshad2 = 1. - smoothstep(-.3, .3, dot(r, normalize(vec3(0) - rp)) - cone) * 1.;\n" + "\n" + " // Backlight / fake SSS\n" + " fragColor.rgb = bg * mix(vec3(.2, .5, 1.) / 2., vec3(1., .9, .8).bgr, specshad2 * pow(fr, .8));\n" + "\n" + " // Fake AO from center of body\n" + " fragColor.rgb *= vec3(pow(mix(.5 + .5 * dot(n, normalize(vec3(0) - rp)), 1., smoothstep(0., 1.5, l)), .5));\n" + "\n" + " // Slight AO / diffuse bleeding\n" + " fragColor.rgb *= mix(vec3(.75,1.,.75), vec3(1), smoothstep(0.1, .8, l));\n" + "\n" + " vec3 c = fragColor.rgb;\n" + "\n" + " // Blue / green alternating pattern\n" + " fragColor.rgb = mix(c.bbb * vec3(.5,1.,.5), fragColor.rgb, smoothstep(.3, .7, tri(l * 4.)));\n" + "\n" + " // Yellow tips\n" + " fragColor.rgb = mix(fragColor.rgb, c.bbb * vec3(1,1,.5), smoothstep(1.4, 1.5, l));\n" + "\n" + " // Yellow tips self-illumination\n" + " fragColor.rgb += vec3(1,1,.4) * smoothstep(1.4, 1.5, l) * .11;\n" + "\n" + " // Specular highlight\n" + " fragColor.rgb += specshad * .9 * smoothstep(.4, .7, dot(r, normalize(vec3(1)))) * fr;\n" + "\n" + " // Mist\n" + " fragColor.rgb += vec3(mix(vec3(.5, .5, 1.), vec3(0), exp(-t / 25.)));\n" + " }\n" + "\n" + " return fragColor;\n" + "}\n" + "\n" + "void mainImage( out vec4 fragColor, in vec2 fragCoord )\n" + "{\n" + " fragColor.rgb = vec3(0);\n" + "\n" + " // Anti-aliasing sample loop\n" + " for(int y = 0; y < AA; ++y)\n" + " for(int x = 0; x < AA; ++x)\n" + " {\n" + " fragColor.rgb += clamp(render(fragCoord + vec2(x, y) / float(AA)), 0., 1.);\n" + " }\n" + "\n" + " fragColor.rgb /= float(AA * AA);\n" + "\n" + " // Contrast\n" + " fragColor.rgb = (fragColor.rgb * 1.2 - .05);\n" + "\n" + " // Clamp, gamma, dither\n" + " fragColor.rgb = pow(clamp(fragColor.rgb, 0., 1.), vec3(1. / 2.2)) + texelFetch(iChannel1, ivec2(fragCoord) & 1023, 0).gba / 200.;\n" + "}\n" + ); + + register_embedded_glsl_file("ShaderToy/ThePopularShader.glsl", + "#define USE_IQ_SMIN 0\n" + "\n" + "float time;\n" + "\n" + "vec2 leg0[3];\n" + "vec2 leg1[3];\n" + "\n" + "vec2 arm0[3];\n" + "vec2 arm1[3];\n" + "\n" + "float wlen=15.0;\n" + "float bob;\n" + "float wc_scale=0.5;\n" + "float scroll;\n" + "float scene_scale=15.0;\n" + "\n" + "// Finds the entry and exit points of a 2D ray with a circle of radius 1\n" + "// centered at the origin.\n" + "vec2 intersectCircle(vec2 ro, vec2 rd)\n" + "{\n" + " float a = dot(rd, rd);\n" + " float b = 2.0 * dot(rd, ro);\n" + " float ds = b * b - 4.0 * a * (dot(ro, ro) - 1.0);\n" + " \n" + " if(ds < 0.0)\n" + " return vec2(1e3);\n" + " \n" + " return ((-b - sqrt(ds) * vec2(-1.0, 1.0))) / (2.0 * a);\n" + "}\n" + "\n" + "mat3 rotateXMat(float a)\n" + "{\n" + " return mat3(1.0, 0.0, 0.0, 0.0, cos(a), -sin(a), 0.0, sin(a), cos(a));\n" + "}\n" + "\n" + "mat3 rotateYMat(float a)\n" + "{\n" + " return mat3(cos(a), 0.0, -sin(a), 0.0, 1.0, 0.0, sin(a), 0.0, cos(a));\n" + "}\n" + "\n" + "// Adapted from https://www.shadertoy.com/view/ldlGR7\n" + "vec2 solve( vec2 p, float l1, float l2, float side )\n" + "{\n" + " vec2 q = p*( 0.5 + 0.5*(l1*l1-l2*l2)/dot(p,p) );\n" + " \n" + " float s = l1*l1/dot(q,q) - 1.0;\n" + " \n" + " if( s<0.0 ) return vec2(-100.0);\n" + " \n" + " return q + q.yx*vec2(-1.0,1.0)*side*sqrt( s );\n" + "}\n" + "\n" + "// Returns a pyramid-like periodic signal.\n" + "float pyramid(float x)\n" + "{\n" + " x = fract(x);\n" + " return min(x * 2.0, (1.0 - x) * 2.0);\n" + "}\n" + "\n" + "// Returns a semicircular periodic signal.\n" + "float circ(float x)\n" + "{\n" + " x = fract(x) * 2.0 - 1.0;\n" + " return sqrt(1.0 - x * x);\n" + "}\n" + "\n" + "#if USE_IQ_SMIN\n" + "float smin(float a,float b,float k){ return -log(exp(-k*a)+exp(-k*b))/k;}//from iq\n" + "#else\n" + "// http://www.johndcook.com/blog/2010/01/20/how-to-compute-the-soft-maximum/\n" + "float smin(in float a, in float b, in float k) { return a - log(1.0+exp(k*(a-b))) / k; }\n" + "#endif\n" + "\n" + "float mp(float x)\n" + "{\n" + " float y=0.3;\n" + " return clamp((pyramid(x)-0.5)*2.0-0.4,-y,y);\n" + "}\n" + "\n" + "float mosaic(vec3 p)\n" + "{\n" + " // Disabled because it causes a compilation failure due to time-out or size limit.\n" + " return 0.0;//max(mp(p.y*10.0),mp(p.z*10.0))*0.01;\n" + "}\n" + "/*\n" + "mat3 transpose(mat3 m)\n" + "{\n" + " return mat3(vec3(m[0].x,m[1].x,m[2].x),\n" + " vec3(m[0].y,m[1].y,m[2].y),\n" + " vec3(m[0].z,m[1].z,m[2].z));\n" + "}*/\n" + "\n" + "float capsuleDist(vec3 p,vec3 o,vec3 d,float h0,float h1,float r0,float r1)\n" + "{\n" + " vec3 u=cross(d,vec3(1.0,0.0,0.0));\n" + " vec3 v=cross(u,d);\n" + " u=cross(v,d);\n" + " mat3 m=transpose(mat3(normalize(u),normalize(v),normalize(d)));\n" + " d=normalize(d);\n" + " float t=clamp(dot(p-o,d),h0,h1);\n" + " vec3 np=o+t*d;\n" + " return distance(np,p)-mix(r0,r1,t)+mosaic(m*(p-o));\n" + "}\n" + "\n" + "float boxDist(vec3 p,vec3 s,float r)\n" + "{\n" + " return length(max(vec3(0.0),abs(p)-s))-r+mosaic(p);\n" + "}\n" + "\n" + "float sphereDist(vec3 p,vec3 o,float r)\n" + "{\n" + " return distance(p,o)-r+mosaic(p-o);\n" + "}\n" + "\n" + "float sceneDist(vec3 p)\n" + "{\n" + " float d=1e3;\n" + " \n" + " p+=vec3(0.0,0.07,0.0)*scene_scale;\n" + " p=rotateYMat(3.1415926*0.5)*p;\n" + " \n" + " p.z+=cos(p.y*2.0+time)*0.1;\n" + " float tm=fract(time*wc_scale*2.0-0.1);\n" + " p.x-=(smoothstep(0.0,0.3,tm)-smoothstep(0.4,1.0,tm))*smoothstep(0.5,2.0,p.y)*0.2+scroll;\n" + " \n" + " // Leg 0\n" + " {\n" + " float g=0.08;\n" + " vec3 o=vec3(0.0,0.0,0.2);\n" + " float d0=capsuleDist(p+o,vec3(leg0[0],0.0),vec3(leg0[1]-leg0[0],0.0),0.0,1.0-g,0.1,0.1);\n" + " float d1=capsuleDist(p+o,vec3(leg0[1],0.0),vec3(leg0[2]-leg0[1],0.0),g,1.0,0.1,0.2);\n" + " d=min(d,smin(d0,d1,15.0));\n" + " }\n" + " \n" + " // Leg 1\n" + " {\n" + " float g=0.08;\n" + " vec3 o=vec3(0.0,0.0,-0.2);\n" + " float d0=capsuleDist(p+o,vec3(leg1[0],0.0),vec3(leg1[1]-leg1[0],0.0),0.0,1.0-g,0.1,0.1);\n" + " float d1=capsuleDist(p+o,vec3(leg1[1],0.0),vec3(leg1[2]-leg1[1],0.0),g,1.0,0.1,0.2);\n" + " d=min(d,smin(d0,d1,15.0));\n" + " }\n" + " \n" + " p.y-=bob;\n" + " \n" + " // Arm 0\n" + " {\n" + " float g=0.08;\n" + " vec3 o=vec3(0.0,0.0,0.4);\n" + " mat3 m=rotateXMat(-0.3)*rotateYMat((cos((time*wc_scale+0.5)*3.1415926*2.0)-0.6)*0.5);\n" + " float d0=capsuleDist(p+o,vec3(arm0[0],0.0),m*vec3(arm0[1]-arm0[0],0.0),0.0,0.7-g,0.03,0.03);\n" + " float d1=capsuleDist(p+o,vec3(arm0[0],0.0)+m*vec3(arm0[1]-arm0[0],0.0),m*vec3(arm0[2]-arm0[1],0.0),g,0.7,0.03,0.06);\n" + " d=min(d,smin(d0,d1,15.0));\n" + " }\n" + " \n" + " // Arm 1\n" + " {\n" + " float g=0.08;\n" + " vec3 o=vec3(0.0,0.0,-0.4);\n" + " mat3 m=rotateXMat(0.3)*rotateYMat(-(cos(time*wc_scale*3.1415926*2.0)-0.6)*0.5);\n" + " float d0=capsuleDist(p+o,vec3(arm1[0],0.0),m*vec3(arm1[1]-arm1[0],0.0),0.0,0.7-g,0.03,0.03);\n" + " float d1=capsuleDist(p+o,vec3(arm1[0],0.0)+m*vec3(arm1[1]-arm1[0],0.0),m*vec3(arm1[2]-arm1[1],0.0),g,0.7,0.03,0.06);\n" + " d=min(d,smin(d0,d1,15.0));\n" + " }\n" + " \n" + " // Torso\n" + " d=smin(d,boxDist(p+vec3(0.0,-0.7,0.0),vec3(0.05,0.7,0.15),0.1),15.0);\n" + " d=smin(d,boxDist(p+vec3(-0.1,-1.1,0.0),vec3(0.05,0.2,0.15)*0.1,0.1),5.0);\n" + " \n" + " // Head\n" + " d=smin(d,sphereDist(p,vec3(0.0,1.825,0.0),0.2),15.0);\n" + " \n" + " \n" + " return d;\n" + "}\n" + "\n" + "vec3 sceneNorm(vec3 p)\n" + "{\n" + " p*=scene_scale;\n" + " float c=sceneDist(p);\n" + " float e=1e-3;\n" + " return normalize(vec3(sceneDist(p+vec3(e,0,0))-c,\n" + " sceneDist(p+vec3(0,e,0))-c,\n" + " sceneDist(p+vec3(0,0,e))-c));\n" + "}\n" + "\n" + "float robot(vec3 ro,vec3 rd)\n" + "{\n" + " float t=0.0;\n" + " float tm;\n" + " \n" + " tm=time*wc_scale;\n" + " \n" + " leg0[0]=vec2(0.0,bob);\n" + " leg0[2]=vec2(pyramid(tm)-0.3,-1.8+0.3*circ(tm*2.0)*step(fract(tm),0.5));\n" + " leg0[1]=(leg0[0]+solve(leg0[2]-leg0[0],1.0,1.0,1.0));\n" + " \n" + " arm1[0]=vec2(0.0,1.4);\n" + " arm1[2]=vec2(pyramid(tm)-0.3,0.1+pow(pyramid(tm),2.0)*0.7);\n" + " arm1[1]=(arm1[0]+solve(arm1[2]-arm1[0],0.7,0.7,-1.0));\n" + " \n" + " tm+=0.5;\n" + " \n" + " leg1[0]=vec2(0.0,bob);\n" + " leg1[2]=vec2(pyramid(tm)-0.3,-1.8+0.3*circ(tm*2.0)*step(fract(tm),0.5));\n" + " leg1[1]=(leg1[0]+solve(leg1[2]-leg1[0],1.0,1.0,1.0));\n" + " \n" + " arm0[0]=vec2(0.0,1.4);\n" + " arm0[2]=vec2(pyramid(tm)-0.3,0.1+pow(pyramid(tm),2.0)*0.7);\n" + " arm0[1]=(arm0[0]+solve(arm0[2]-arm0[0],0.7,0.7,-1.0));\n" + " \n" + " float rt=1e4;\n" + " \n" + " ro*=scene_scale;\n" + " rd*=scene_scale;\n" + " \n" + " for(int i=0;i<15;i+=1)\n" + " {\n" + " vec3 rp=ro+rd*t;\n" + " \n" + " float d=sceneDist(rp);\n" + " \n" + " if(d<1e-2)\n" + " {\n" + " rt=t;\n" + " }\n" + " \n" + " t+=d/scene_scale;\n" + " }\n" + " \n" + " \n" + " return rt;\n" + "}\n" + "\n" + "\n" + "vec2 unitSquareInterval(vec2 ro, vec2 rd)\n" + "{ \n" + " vec2 slabs0 = (vec2(+1.0) - ro) / rd; \n" + " vec2 slabs1 = (vec2(-1.0) - ro) / rd;\n" + " \n" + " vec2 mins = min(slabs0, slabs1);\n" + " vec2 maxs = max(slabs0, slabs1);\n" + " \n" + " return vec2(max(mins.x, mins.y),\n" + " min(maxs.x, maxs.y));\n" + "}\n" + "\n" + "vec3 squaresColours(vec2 p)\n" + "{\n" + " p+=vec2(time*0.2);\n" + " \n" + " vec3 orange=vec3(1.0,0.4,0.1)*2.0;\n" + " vec3 purple=vec3(1.0,0.2,0.5)*0.8;\n" + " \n" + " float l=pow(0.5+0.5*cos(p.x*7.0+cos(p.y)*8.0)*sin(p.y*2.0),4.0)*2.0;\n" + " vec3 c=pow(l*(mix(orange,purple,0.5+0.5*cos(p.x*40.0+sin(p.y*10.0)*3.0))+\n" + " mix(orange,purple,0.5+0.5*cos(p.x*20.0+sin(p.y*3.0)*3.0))),vec3(1.2))*0.7;\n" + " \n" + " c+=vec3(1.0,0.8,0.4)*pow(0.5+0.5*cos(p.x*20.0)*sin(p.y*12.0),20.0)*2.0;\n" + " \n" + " c+=vec3(0.1,0.5+0.5*cos(p*20.0))*vec3(0.05,0.1,0.4).bgr*0.7;\n" + " \n" + " return c;\n" + "}\n" + "\n" + "vec3 squaresTex(vec2 p,float border)\n" + "{\n" + " float sm=0.02;\n" + " vec2 res=vec2(8.0);\n" + " vec2 ip=floor(p*res)/res;\n" + " vec2 fp=fract(p*res);\n" + " float m=1.0-max(smoothstep(border-sm,border,abs(fp.x-0.5)),smoothstep(border-sm,border,abs(fp.y-0.5)));\n" + " m+=1.0-smoothstep(0.0,0.56,distance(fp,vec2(0.5)));\n" + " return m*squaresColours(ip);\n" + "}\n" + "\n" + "vec3 room(vec3 ro,vec3 rd,out vec3 rp,out vec3 n)\n" + "{\n" + " vec2 box_size=vec2(1.0,5.0+3.0/8.0);\n" + " \n" + " vec2 cp=vec2(0.0),ct=vec2(1e3);\n" + " \n" + " for(int i=0;i<4;i+=1)\n" + " {\n" + " float cr=0.03;\n" + " vec2 tcp=vec2(2.5/8.0*float(-1),float(i)-2.0+0.5/8.0);\n" + " vec2 tct=intersectCircle((ro.xz-tcp)/cr,rd.xz/cr);\n" + " \n" + " if(tct.y > 0.0 && tct.y 0.0 && tct.yabs(rp.y*box_size.y))\n" + " n.xy=vec2(rp.x/abs(rp.x),0.0);\n" + " else\n" + " n.xy=vec2(0.0,rp.y/abs(rp.y));\n" + " \n" + " if(ct.y1e-8){\n" + "\n" + " // Using the the distance \"sDist\" above to calculate the surface position. Ie: sp = ro + rd*t;\n" + " // I've hardcoded \"ro\" to reduce line count. Note that \"ro.xy\" is centered on zero. The cheap\n" + " // ray-intersection formula above relies on that.\n" + " vec3 sp = vec3(0.0, 0.0, iTime*2.) + rd*sDist;\n" + "\n" + " // The surface normal. Based on the derivative of the surface description function. See above.\n" + " //vec3 sn = normalize(vec3(-sp.xy, 0.)); // Cylinder normal.\n" + " vec3 sn = normalize(-sign(sp)*vec3(pow(abs(sp.xy)*scale, vec2(power-1.)), 0.)); // Minkowski normal.\n" + "\n" + " // Bump mapping.\n" + " //\n" + " // I wanted to make this example as simple as possible, but it's only a few extra lines. Note the larger\n" + " // \"eps\" number. Increasing the value spreads the samples out, which effectively blurs the result, thus\n" + " // reducing the jaggies. The downside is loss of bump precision, which isn't noticeable in this particular\n" + " // example. Decrease the value to \"0.001\" to see what I'm talking about.\n" + " const vec2 eps = vec2(0.025, 0.);\n" + " float c = Voronesque(sp*2.5); // Base value. Used below to color the surface.\n" + " // 3D gradient vector... of sorts. Based on the bump function. In this case, Voronoi.\n" + " vec3 gr = (vec3(Voronesque((sp-eps.xyy)*2.5), Voronesque((sp-eps.yxy)*2.5), Voronesque((sp-eps.yyx)*2.5))-c)/eps.x;\n" + " gr -= sn*dot(sn, gr); // There's a reason for this... but I need more room. :)\n" + " sn = normalize(sn + gr*0.1); // Combining the bump gradient vector with the object surface normal.\n" + "\n" + " // Lighting.\n" + " //\n" + " // The light is hovering just in front of the viewer.\n" + " vec3 lp = vec3(0.0, 0.0, iTime*2. + 3.);\n" + " vec3 ld = lp - sp; // Light direction.\n" + " float dist = max(length(ld), 0.001); // Distance from light to the surface.\n" + " ld /= dist; // Use the distance to normalize \"ld.\"\n" + "\n" + " // Light attenuation, based on the distance above.\n" + " float atten = min(1.0/max(0.75 + dist*0.25 + dist*dist*0.05, 0.001), 1.0);\n" + "\n" + "\n" + " float diff = max(dot(sn, ld), 0.); // Diffuse light value.\n" + " float spec = pow(max(dot(reflect(-ld, sn), -rd), 0.), 16.); // Specular highlighting.\n" + " // Adding some fake, reflective environment information.\n" + " float ref = Voronesque((sp + reflect(rd, sn)*0.5)*2.5);\n" + "\n" + " // Coloring the surface with the Voronesque function that is used to bump the surface. See \"bump mapping\" above.\n" + " vec3 objCol = vec3(min(c*1.5, 1.), pow(c, 2.5), pow(c, 12.)); // Cheap, but effective, red palette.\n" + " //vec3 objCol = vec3(c*c*0.9, c, c*c*0.4); // Cheap green palette.\n" + " //vec3 objCol = vec3(pow(c, 1.6), pow(c, 1.7), c); // Purpley blue.\n" + " //vec3 objCol = vec3(c); // Grey scale.\n" + "\n" + " // Using the values above to produce the final color.\n" + " //col = (objCol*(diff + ref*0.25 + 0.25) + vec3(1., 0.8, 0.9)*ref*0.25 + spec*vec3(0.75, 0.9, 1.))*atten;\n" + " col = (objCol*(vec3(1.0, 0.97, 0.92)*diff + ref*0.5 + 0.25) + vec3(1., 0.8, 0.9)*ref*0.3 + vec3(1., 0.9, 0.7)*spec)*atten;\n" + " //col = ((vec3(1.0, 0.97, 0.92)*diff + ref*0.5 + 0.25)*c + vec3(1., 0.8, 0.9)*ref*0.3 + vec3(0.75, 0.9, 1.)*spec)*atten;\n" + "\n" + "\n" + " //}\n" + "\n" + " fragColor = vec4(min(col, 1.), 1.);\n" + "}\n" + "\n" + ); + + register_embedded_glsl_file("ShaderToy/VoxelPacMan.glsl", + "///////////////////////////////////////////////////////////////////////////////\n" + "// //\n" + "// GGGG IIIII AAA N N TTTTT PPPP AAA CCCC M M AAA N N //\n" + "// G I A A NN N T P P A A C MM MM A A NN N //\n" + "// G GG I AAAAA N N N T PPPP AAAAA C --- M M M AAAAA N N N //\n" + "// G G I A A N NN T P A A C M M A A N NN //\n" + "// GGGG IIIII A A N N T P A A CCCC M M A A N N //\n" + "// //\n" + "///////////////////////////////////////////////////////////////////////////////\n" + "\n" + "// Parameters\n" + "#define VOXEL_RESOLUTION 1.5\n" + "#define VOXEL_LIGHTING\n" + "#define SHADOW\n" + "#define GROUND\n" + "#define GHOST\n" + "#define MOUSE\n" + "#define HSV2RGB_FAST\n" + "\n" + "#define CAMERA_FOCAL_LENGTH 2.0\n" + "#define DELTA 0.01\n" + "#define RAY_LENGTH_MAX 500.0\n" + "#define RAY_STEP_MAX 100.0\n" + "#define AMBIENT 0.2\n" + "#define SPECULAR_POWER 2.0\n" + "#define SPECULAR_INTENSITY 0.3\n" + "#define SHADOW_LENGTH 150.0\n" + "#define SHADOW_POWER 3.0\n" + "#define FADE_POWER 1.0\n" + "#define BACKGROUND 0.7\n" + "#define GLOW 0.4\n" + "#define GAMMA 0.8\n" + "\n" + "// Math constants\n" + "#define PI 3.14159265359\n" + "#define SQRT3 1.73205080757\n" + "\n" + "// Global variable to handle the glow effect\n" + "float glowCounter;\n" + "\n" + "// PRNG (from https://www.shadertoy.com/view/4djSRW)\n" + "float rand (in vec3 seed) {\n" + " seed = fract (seed * vec3 (5.3983, 5.4427, 6.9371));\n" + " seed += dot (seed.yzx, seed.xyz + vec3 (21.5351, 14.3137, 15.3219));\n" + " return fract (seed.x * seed.y * seed.z * 95.4337);\n" + "}\n" + "\n" + "// Distance to the voxel\n" + "float distVoxel (in vec3 p) {\n" + "\n" + " // Update the glow counter\n" + " ++glowCounter;\n" + "\n" + " // Rounded box\n" + " const float voxelRadius = 0.25;\n" + " return length (max (abs (p) - 0.5 + voxelRadius, 0.0)) - voxelRadius;\n" + "}\n" + "\n" + "// Distance to the scene and color of the closest point\n" + "vec2 distScene (in vec3 p, out vec3 P) {\n" + "\n" + " // Update the glow counter\n" + " ++glowCounter;\n" + "\n" + " // Scaling\n" + " p *= VOXEL_RESOLUTION;\n" + "\n" + " // Velocity, period of the waves, spacing of the gums\n" + " float v = VOXEL_RESOLUTION * floor (iTime * 100.0 / VOXEL_RESOLUTION);\n" + " const float k1 = 0.05;\n" + " const float k2 = 60.0;\n" + "\n" + " // Giant Pac-Man\n" + " float body = length (p);\n" + " body = max (body - 32.0, 27.0 - body);\n" + " float eyes = 6.0 - length (vec3 (abs (p.x) - 12.5, p.y - 19.5, p.z - 20.0));\n" + " float mouthAngle = PI * (0.07 + 0.07 * cos (2.0 * v * PI / k2));\n" + " float mouthTop = dot (p, vec3 (0.0, -cos (mouthAngle), sin (mouthAngle))) - 2.0;\n" + " mouthAngle *= 2.5;\n" + " float mouthBottom = dot (p, vec3 (0.0, cos (mouthAngle), sin (mouthAngle)));\n" + " float pacMan = max (max (body, eyes), min (mouthTop, mouthBottom));\n" + " vec2 d = vec2 (pacMan, 0.13);\n" + " P = p;\n" + "\n" + " // Gums\n" + " vec3 q = vec3 (p.xy, mod (p.z + v, k2) - k2 * 0.5);\n" + " float gum = max (length (q) - 6.0, -p.z);\n" + " if (gum < d.x) {\n" + " d = vec2 (gum, 0.35);\n" + " P = q;\n" + " }\n" + "\n" + " // Ground\n" + " #ifdef GROUND\n" + " q = vec3 (p.xy, p.z + v);\n" + " float ground = (q.y + 50.0 + 14.0 * cos (q.x * k1) * cos (q.z * k1)) * 0.7;\n" + " if (ground < d.x) {\n" + " d = vec2 (ground, 0.55);\n" + " P = q;\n" + " }\n" + " #endif\n" + "\n" + " // Ghost\n" + " #ifdef GHOST\n" + " v = VOXEL_RESOLUTION * floor ((130.0 + 60.0 * cos (iTime * 3.0)) / VOXEL_RESOLUTION);\n" + " q = vec3 (p.xy, p.z + v);\n" + " body = length (vec3 (q.x, max (q.y - 4.0, 0.0), q.z));\n" + " body = max (body - 28.0, 22.0 - body);\n" + " eyes = 8.0 - length (vec3 (abs (q.x) - 12.0, q.y - 10.0, q.z - 22.0));\n" + " float bottom = (q.y + 28.0 + 4.0 * cos (p.x * 0.4) * cos (p.z * 0.4)) * 0.7;\n" + " float ghost = max (max (body, eyes), -bottom);\n" + " if (ghost < d.x) {\n" + " d = vec2 (ghost, 0.76);\n" + " P = q;\n" + " }\n" + " #endif\n" + "\n" + " // Scaling\n" + " d.x /= VOXEL_RESOLUTION;\n" + " return d;\n" + "}\n" + "\n" + "// Distance to the (voxelized?) scene\n" + "vec4 dist (inout vec3 p, in vec3 ray, in float voxelized, in float rayLengthMax) {\n" + " vec3 P = p;\n" + " vec2 d = vec2 (1.0 / 0.0, 0.0);\n" + " float rayLength = 0.0;\n" + " float rayLengthInVoxel = 0.0;\n" + " float rayLengthCheckVoxel = 0.0;\n" + " vec3 raySign = sign (ray);\n" + " vec3 rayDeltaVoxel = raySign / ray;\n" + " for (float rayStep = 0.0; rayStep < RAY_STEP_MAX; ++rayStep) {\n" + " if (rayLength < rayLengthInVoxel) {\n" + " d.x = distVoxel (fract (p + 0.5) - 0.5);\n" + " if (d.x < DELTA) {\n" + " break;\n" + " }\n" + " } else if (rayLength < rayLengthCheckVoxel) {\n" + " vec3 rayDelta = (0.5 - raySign * (fract (p + 0.5) - 0.5)) * rayDeltaVoxel;\n" + " float dNext = min (rayDelta.x, min (rayDelta.y, rayDelta.z));\n" + " d = distScene (floor (p + 0.5), P);\n" + " if (d.x < 0.0) {\n" + " rayDelta = rayDeltaVoxel - rayDelta;\n" + " d.x = max (rayLengthInVoxel - rayLength, DELTA - min (rayDelta.x, min (rayDelta.y, rayDelta.z)));\n" + " rayLengthInVoxel = rayLength + dNext;\n" + " } else {\n" + " d.x = DELTA + dNext;\n" + " }\n" + " } else {\n" + " d = distScene (p, P);\n" + " if (voxelized > 0.5) {\n" + " if (d.x < SQRT3 * 0.5) {\n" + " rayLengthCheckVoxel = rayLength + abs (d.x) + SQRT3 * 0.5;\n" + " d.x = max (rayLengthInVoxel - rayLength + DELTA, d.x - SQRT3 * 0.5);\n" + " }\n" + " } else if (d.x < DELTA) {\n" + " break;\n" + " }\n" + " }\n" + " rayLength += d.x;\n" + " if (rayLength > rayLengthMax) {\n" + " break;\n" + " }\n" + " p += d.x * ray;\n" + " }\n" + " return vec4 (d, rayLength, rand (P));\n" + "}\n" + "\n" + "// Normal at a given point\n" + "vec3 normal (in vec3 p, in float voxelized) {\n" + " vec2 h = vec2 (DELTA, -DELTA);\n" + " vec3 n;\n" + " if (voxelized > 0.5) {\n" + " p = fract (p + 0.5) - 0.5;\n" + " n = h.xxx * distVoxel (p + h.xxx) +\n" + " h.xyy * distVoxel (p + h.xyy) +\n" + " h.yxy * distVoxel (p + h.yxy) +\n" + " h.yyx * distVoxel (p + h.yyx);\n" + " } else {\n" + " n = h.xxx * distScene (p + h.xxx, n).x +\n" + " h.xyy * distScene (p + h.xyy, n).x +\n" + " h.yxy * distScene (p + h.yxy, n).x +\n" + " h.yyx * distScene (p + h.yyx, n).x;\n" + " }\n" + " return normalize (n);\n" + "}\n" + "\n" + "// HSV to RGB\n" + "vec3 hsv2rgb (in vec3 hsv) {\n" + " #ifdef HSV2RGB_SAFE\n" + " hsv.yz = clamp (hsv.yz, 0.0, 1.0);\n" + " #endif\n" + " #ifdef HSV2RGB_FAST\n" + " return hsv.z * (1.0 + 0.5 * hsv.y * (cos (2.0 * PI * (hsv.x + vec3 (0.0, 2.0 / 3.0, 1.0 / 3.0))) - 1.0));\n" + " #else\n" + " return hsv.z * (1.0 + hsv.y * clamp (abs (fract (hsv.x + vec3 (0.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 2.0, -1.0, 0.0));\n" + " #endif\n" + "}\n" + "\n" + "// Main function\n" + "void mainImage (out vec4 fragColor, in vec2 fragCoord) {\n" + "\n" + " // Get the fragment\n" + " vec2 frag = (2.0 * fragCoord.xy - iResolution.xy) / iResolution.y;\n" + "\n" + " // Define the rendering mode\n" + " float modeTiming = iTime * 0.234;\n" + " float modeAngle = PI * cos (iTime * 0.2);\n" + " modeAngle = dot (frag - vec2 (cos (iTime * 2.0), 0.0), vec2 (cos (modeAngle), sin (modeAngle)));\n" + " float modeVoxel = step (0.5, fract (modeTiming / (4.0 * PI)));\n" + " modeTiming = cos (modeTiming);\n" + " float mode3D = smoothstep (0.8, 0.5, modeTiming);\n" + " float modeSwitch = smoothstep (0.995, 1.0, modeTiming) + smoothstep (0.02, 0.0, abs (modeAngle)) * (1.0 - modeVoxel);\n" + " modeVoxel += step (0.0, modeAngle) * (1.0 - modeVoxel);\n" + "\n" + " // Define the ray corresponding to this fragment\n" + " vec3 ray = normalize (vec3 (frag, mix (8.0, CAMERA_FOCAL_LENGTH, mode3D)));\n" + "\n" + " // Compute the orientation of the camera\n" + " float yawAngle = PI * (1.2 + 0.2 * cos (iTime * 0.5));\n" + " float pitchAngle = PI * (0.1 * cos (iTime * 0.3) - 0.05);\n" + " #ifdef MOUSE\n" + " yawAngle += 4.0 * PI * iMouse.x / iResolution.x;\n" + " pitchAngle += PI * 0.3 * (1.0 - iMouse.y / iResolution.y);\n" + " #endif\n" + " yawAngle = mix (PI * 1.5, yawAngle, mode3D);\n" + " pitchAngle *= mode3D;\n" + "\n" + " float cosYaw = cos (yawAngle);\n" + " float sinYaw = sin (yawAngle);\n" + " float cosPitch = cos (pitchAngle);\n" + " float sinPitch = sin (pitchAngle);\n" + "\n" + " mat3 cameraOrientation;\n" + " cameraOrientation [0] = vec3 (cosYaw, 0.0, -sinYaw);\n" + " cameraOrientation [1] = vec3 (sinYaw * sinPitch, cosPitch, cosYaw * sinPitch);\n" + " cameraOrientation [2] = vec3 (sinYaw * cosPitch, -sinPitch, cosYaw * cosPitch);\n" + "\n" + " ray = cameraOrientation * ray;\n" + "\n" + " // Compute the origin of the ray\n" + " float cameraDist = mix (300.0, 95.0 + 50.0 * cos (iTime * 0.8), mode3D);\n" + " vec3 origin = (vec3 (0.0, 0.0, 40.0 * sin (iTime * 0.2)) - cameraOrientation [2] * cameraDist) / VOXEL_RESOLUTION;\n" + "\n" + " // Compute the distance to the scene\n" + " glowCounter = 0.0;\n" + " vec4 d = dist (origin, ray, modeVoxel, RAY_LENGTH_MAX / VOXEL_RESOLUTION);\n" + "\n" + " // Set the background color\n" + " vec3 finalColor = hsv2rgb (vec3 (0.2 * ray.y + 0.4 * modeVoxel - 0.37, 1.0, mode3D * BACKGROUND));\n" + " vec3 glowColor = GLOW * vec3 (1.0, 0.3, 0.0) * glowCounter / RAY_STEP_MAX;\n" + " if (d.x < DELTA) {\n" + "\n" + " // Set the object color\n" + " vec3 color = hsv2rgb (vec3 (d.y + 0.1 * d.w * modeVoxel, 0.5 + 0.5 * modeVoxel, 1.0));\n" + "\n" + " // Lighting\n" + " vec3 l = normalize (mix (vec3 (1.0, 0.0, 0.0), vec3 (1.25 + cos (iTime * 0.2), 1.0, 1.0), mode3D));\n" + " #ifdef VOXEL_LIGHTING\n" + " if (modeVoxel > 0.5) {\n" + " vec3 n = normal (floor (origin + 0.5), 0.0);\n" + " float diffuse = max (0.0, dot (n, l));\n" + " float specular = pow (max (0.0, dot (reflect (ray, n), l)), SPECULAR_POWER) * SPECULAR_INTENSITY;\n" + " color = (AMBIENT + diffuse) * color + specular;\n" + " }\n" + " #endif\n" + " vec3 n = normal (origin, modeVoxel);\n" + " float diffuse = dot (n, l);\n" + " float specular;\n" + " if (diffuse < 0.0) {\n" + " diffuse = 0.0;\n" + " specular = 0.0;\n" + " } else {\n" + " specular = pow (max (0.0, dot (reflect (ray, n), l)), SPECULAR_POWER) * SPECULAR_INTENSITY;\n" + " #ifdef SHADOW\n" + " origin += n * DELTA * 2.0;\n" + " vec4 shadow = dist (origin, l, modeVoxel, SHADOW_LENGTH / VOXEL_RESOLUTION);\n" + " if (shadow.x < DELTA) {\n" + " shadow.z = pow (min (1.0, shadow.z * VOXEL_RESOLUTION / SHADOW_LENGTH), SHADOW_POWER);\n" + " diffuse *= shadow.z;\n" + " specular *= shadow.z;\n" + " }\n" + " #endif\n" + " }\n" + " color = (AMBIENT + diffuse) * color + specular;\n" + "\n" + " // Fading\n" + " float fade = pow (max (0.0, 1.0 - d.z * VOXEL_RESOLUTION / RAY_LENGTH_MAX), FADE_POWER);\n" + " finalColor = mix (finalColor, color, fade);\n" + " }\n" + "\n" + " // Set the fragment color\n" + " finalColor = mix (pow (finalColor, vec3 (GAMMA)) + glowColor, vec3 (1.0), modeSwitch);\n" + " fragColor = vec4 (finalColor, 1.0);\n" + "}\n" + ); + + register_embedded_glsl_file("ShaderToy/Voxels.glsl", + "// voxels!\n" + "// @simesgreen\n" + "\n" + "// CSG operations\n" + "float _union(float a, float b)\n" + "{\n" + " return min(a, b);\n" + "}\n" + "\n" + "float intersect(float a, float b)\n" + "{\n" + " return max(a, b);\n" + "}\n" + "\n" + "float diff(float a, float b)\n" + "{\n" + " return max(a, -b);\n" + "}\n" + "\n" + "// primitive functions\n" + "// these all return the distance to the surface from a given point\n" + "\n" + "float plane(vec3 p, vec3 planeN, vec3 planePos)\n" + "{\n" + " return dot(p - planePos, planeN);\n" + "}\n" + "\n" + "float box( vec3 p, vec3 b )\n" + "{\n" + " vec3 d = abs(p) - b;\n" + " return min(max(d.x,max(d.y,d.z)),0.0) +\n" + " length(max(d,0.0));\n" + "}\n" + "\n" + "float sphere(vec3 p, float r)\n" + "{\n" + " return length(p) - r;\n" + "}\n" + "\n" + "// http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm\n" + "\n" + "float sdCone( vec3 p, vec2 c )\n" + "{\n" + " // c must be normalized\n" + " float q = length(p.xz);\n" + " return dot(c, vec2(q, p.y));\n" + "}\n" + "\n" + "float sdTorus( vec3 p, vec2 t )\n" + "{\n" + " vec2 q = vec2(length(p.xz)-t.x,p.y);\n" + " return length(q)-t.y;\n" + "}\n" + "\n" + "// transforms\n" + "vec3 rotateX(vec3 p, float a)\n" + "{\n" + " float sa = sin(a);\n" + " float ca = cos(a);\n" + " vec3 r;\n" + " r.x = p.x;\n" + " r.y = ca*p.y - sa*p.z;\n" + " r.z = sa*p.y + ca*p.z;\n" + " return r;\n" + "}\n" + "\n" + "vec3 rotateY(vec3 p, float a)\n" + "{\n" + " float sa = sin(a);\n" + " float ca = cos(a);\n" + " vec3 r;\n" + " r.x = ca*p.x + sa*p.z;\n" + " r.y = p.y;\n" + " r.z = -sa*p.x + ca*p.z;\n" + " return r;\n" + "}\n" + "\n" + "// distance to scene\n" + "float scene(vec3 p)\n" + "{ \n" + " float d;\n" + " //d = box(p, vec3(1.0));\n" + " //p.z += sin(time)*1.5;\n" + " //d = diff( d, sphere(p, sin(time*0.5)*1.5) );\n" + " \n" + " //d = sphere(p, 1.0); \n" + " d = sphere(p, sin(iTime)*0.5+0.5);\n" + "\n" + " vec3 pr = p - vec3(1.5, 0.0, 0.0);\n" + " pr = rotateX(pr, iTime);\n" + " pr = rotateY(pr, iTime*0.3); \n" + " d= _union(d, diff(box(pr , vec3(0.6)), sphere(pr, 0.7)) );\n" + "\n" + " //d = _union(d, sdCone(p + vec3(1.5, -0.5, 0.0), vec2(1.0, 0.5)));\n" + " pr = p + vec3(1.5, 0.0, 0.0);\n" + " pr = rotateX(pr, iTime);\n" + " d = _union(d, sdTorus(pr, vec2(0.5, 0.25)));\n" + " \n" + " d = _union(d, plane(p, vec3(0.0, 1.0, 0.0), vec3(0.0, -1.0, 0.0)) );\n" + " return d;\n" + "}\n" + "\n" + "// calculate scene normal\n" + "vec3 sceneNormal(vec3 pos )\n" + "{\n" + " float eps = 0.0001;\n" + " vec3 n;\n" + "#if 0\n" + " n.x = scene( vec3(pos.x+eps, pos.y, pos.z) ) - scene( vec3(pos.x-eps, pos.y, pos.z) );\n" + " n.y = scene( vec3(pos.x, pos.y+eps, pos.z) ) - scene( vec3(pos.x, pos.y-eps, pos.z) );\n" + " n.z = scene( vec3(pos.x, pos.y, pos.z+eps) ) - scene( vec3(pos.x, pos.y, pos.z-eps) );\n" + "#else\n" + " float d = scene(pos);\n" + " n.x = scene( vec3(pos.x+eps, pos.y, pos.z) ) - d;\n" + " n.y = scene( vec3(pos.x, pos.y+eps, pos.z) ) - d;\n" + " n.z = scene( vec3(pos.x, pos.y, pos.z+eps) ) - d;\n" + "#endif\n" + " return normalize(n);\n" + "}\n" + "\n" + "// ambient occlusion approximation\n" + "float ambientOcclusion(vec3 p, vec3 n)\n" + "{\n" + " const int steps = 3;\n" + " const float delta = 0.5;\n" + "\n" + " float a = 0.0;\n" + " float weight = 1.0;\n" + " for(int i=1; i<=steps; i++) {\n" + " float d = (float(i) / float(steps)) * delta;\n" + " a += weight*(d - scene(p + n*d));\n" + " weight *= 0.5;\n" + " }\n" + " return clamp(1.0 - a, 0.0, 1.0);\n" + "}\n" + "\n" + "// lighting\n" + "vec3 shade(vec3 pos, vec3 n, vec3 eyePos)\n" + "{\n" + " const vec3 lightPos = vec3(4.0, 3.0, 5.0);\n" + " const vec3 color = vec3(1.0, 1.0, 0.0);\n" + " const float shininess = 40.0;\n" + "\n" + " vec3 l = normalize(lightPos - pos);\n" + " vec3 v = normalize(eyePos - pos);\n" + " vec3 h = normalize(v + l);\n" + " float diff = dot(n, l);\n" + " float spec = max(0.0, pow(dot(n, h), shininess)) * float(diff > 0.0);\n" + " diff = max(0.0, diff);\n" + " //diff = 0.5+0.5*diff;\n" + "\n" + " float fresnel = pow(1.0 - dot(n, v), 5.0);\n" + " float ao = ambientOcclusion(pos, n);\n" + "\n" + "// return vec3(diff);\n" + "// return vec3(diff*ao)*color + vec3(spec + fresnel*0.5);\n" + " return vec3(diff*ao)*color; \n" + "// return vec3(diff*ao)*color + vec3(spec);\n" + "// return vec3(ao);\n" + "// return vec3(fresnel);\n" + "}\n" + "\n" + "// trace ray using sphere tracing\n" + "vec3 trace(vec3 ro, vec3 rd, out bool hit)\n" + "{\n" + " const int maxSteps = 128;\n" + " const float hitThreshold = 0.001;\n" + " hit = false;\n" + " vec3 pos = ro;\n" + " vec3 hitPos = ro;\n" + "\n" + " for(int i=0; i 0.0, rd.y > 0.0, rd.z > 0.0);\n" + " vec3 tMax = (voxelToWorld(nearestVoxel) - ro) / rd;\n" + " vec3 tDelta = voxelSize / abs(rd);\n" + "\n" + " vec3 hitVoxel = voxel;\n" + " \n" + " hit = false;\n" + " float hitT = 0.0;\n" + " for(int i=0; i= size.width) ||\n" + " (voxel.y < 0) || (voxel.y >= size.height) ||\n" + " (voxel.z < 0) || (voxel.z >= size.depth)) {\n" + " break;\n" + " }\n" + "#endif \n" + " }\n" + "\n" + " //return voxelToWorld(hitVoxel);\n" + " return ro + hitT*rd;\n" + "}\n" + "\n" + "\n" + "vec3 background(vec3 rd)\n" + "{\n" + " //return mix(vec3(1.0), vec3(0.0), rd.y);\n" + " return mix(vec3(1.0, 1.0, 1.0), vec3(0.0, 0.5, 1.0), abs(rd.y));\n" + " //return vec3(0.0);\n" + "}\n" + "\n" + "void mainImage( out vec4 fragColor, in vec2 fragCoord )\n" + "{\n" + " vec2 pixel = (fragCoord.xy / iResolution.xy)*2.0-1.0;\n" + "\n" + " // compute ray origin and direction\n" + " float asp = iResolution.x / iResolution.y;\n" + " vec3 rd = normalize(vec3(asp*pixel.x, pixel.y, -2.0));\n" + " vec3 ro = vec3(0.0, 0.0, 4.0);\n" + " ro += rd*2.0;\n" + " \n" + " vec2 mouse = iMouse.xy / iResolution.xy;\n" + "\n" + " vec2 a = vec2(0.0, 0.0);\n" + " if (iMouse.x > 0.0) {\n" + " a.x = -(1.0 - mouse.y)*1.5;\n" + " a.y = 4.5 -(mouse.x-0.5)*3.0;\n" + " }\n" + " \n" + " rd = rotateX(rd, a.x);\n" + " ro = rotateX(ro, a.x);\n" + " \n" + " rd = rotateY(rd, a.y);\n" + " ro = rotateY(ro, a.y);\n" + "\n" + " // trace ray\n" + " bool hit;\n" + " //vec3 pos = trace(ro, rd, hit);\n" + " vec3 n;\n" + " vec3 pos = voxelTrace(ro, rd, hit, n);\n" + "\n" + " vec3 rgb;\n" + " if(hit)\n" + " {\n" + " // calc normal\n" + " //vec3 n = sceneNormal(pos);\n" + " \n" + " // shade\n" + " rgb = shade(pos, n, ro);\n" + "\n" + "#if 0\n" + " // reflection\n" + " vec3 v = normalize(ro - pos);\n" + " float fresnel = 0.1 + 0.9*pow(1.0 - dot(n, v), 5.0);\n" + "\n" + " ro = pos + n*0.2; // offset to avoid self-intersection\n" + " rd = reflect(-v, n);\n" + " //pos = trace(ro, rd, hit);\n" + " pos = voxelTrace(ro, rd, hit, n);\n" + " \n" + " if (hit) {\n" + " //vec3 n = sceneNormal(pos);\n" + " rgb += shade(pos, n, ro) * vec3(fresnel);\n" + " } else {\n" + " rgb += background(rd) * vec3(fresnel);\n" + " }\n" + "#endif\n" + "\n" + " } else {\n" + " rgb = background(rd);\n" + " }\n" + "\n" + " // vignetting\n" + " //rgb *= 0.5+0.5*smoothstep(2.0, 0.5, dot(pixel, pixel));\n" + "\n" + " fragColor=vec4(rgb, 1.0);\n" + "}\n" + ); + +} diff --git a/src/bin/geoshade/main.cpp b/src/bin/geoshade/main.cpp new file mode 100644 index 00000000..eda010f7 --- /dev/null +++ b/src/bin/geoshade/main.cpp @@ -0,0 +1,378 @@ +/* + * Copyright (c) 2012-2014, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#include +#include +#include +#include +#include +#include +#include + +std::map embedded_files; + +void register_embedded_glsl_file(const char* filename, const char* body) { + embedded_files[std::string(filename)] = body; +} + +extern void register_embedded_glsl_files(void); + +void list_embedded_glsl_files(std::vector& files) { + files.clear(); + for(auto it : embedded_files) { + files.push_back(it.first); + } +} + +void get_embedded_glsl_file(const char* filename, const char** data) { + *data = nullptr; + auto it = embedded_files.find(std::string(filename)); + if(it != embedded_files.end()) { + *data = it->second; + } +} + +namespace { + + using namespace GEO; + + /** + * \brief A super-simple shader authoring application. + */ + class GeoShadeApplication : public SimpleApplication { + public: + + /** + * \brief GeoShadeApplication constructor. + */ + GeoShadeApplication() : SimpleApplication("GeoShade") { + set_default_filename("hello.glsl"); + use_text_editor_ = true; + set_region_of_interest(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + register_embedded_glsl_files(); + glsl_program_ = 0; + three_D_ = false; + glsl_frame_ = 0; + glsl_start_time_ = SystemStopwatch::now(); + object_properties_visible_ = false; +#ifdef GEO_OS_ANDROID + viewer_properties_visible_ = false; +#endif + new_file(); + } + + /** + * \brief GeoShadeApplication destructor. + */ + ~GeoShadeApplication() override { + if(glsl_program_ != 0) { + glDeleteProgram(glsl_program_); + glsl_program_ = 0; + } + } + + /** + * \brief Displays and handles the GUI for object properties. + * \details Overloads Application::draw_object_properties(). + */ + void draw_object_properties() override { + // TODO + } + + /** + * \brief Draws the scene according to currently set primitive and + * drawing modes. + */ + void draw_scene() override { + + if(glsl_program_ != 0) { + if(animate()) { + + glUseProgram(glsl_program_); + + // If shader has an iTime uniform (e.g. a ShaderToy shader), + // then update it, and indicate that graphics should be + // updated again and again (call update() at each frame). + GLint iTime_loc = glGetUniformLocation(glsl_program_, "iTime"); + if(iTime_loc != -1) { + glUniform1f( + iTime_loc, float(SystemStopwatch::now() - glsl_start_time_) + ); + } + + GLint iFrame_loc = glGetUniformLocation(glsl_program_, "iFrame"); + if(iFrame_loc != -1) { + glUniform1f( + iFrame_loc, float(glsl_frame_) + ); + } + + GLint iDate_loc = glGetUniformLocation(glsl_program_, "iDate"); + if(iDate_loc != -1) { + time_t t = time(nullptr); + struct tm* tm = localtime(&t); + float datex = float(tm->tm_year + 1900); + float datey = float(tm->tm_mon); + float datez = float(tm->tm_mday); + float datew = float(tm->tm_sec) + + 60.0f * float(tm->tm_min) + + 3600.0f * float(tm->tm_hour); + glUniform4f(iDate_loc, datex, datey, datez, datew); + } + + glUseProgram(0); + + ++glsl_frame_; + + // Of course, there is a much faster way of drawing a + // quad, but here we do not care about this (tiny) loss + // of performance. + + glupDisable(GLUP_VERTEX_COLORS); + glupEnable(GLUP_TEXTURING); + glupUseProgram(glsl_program_); + glupBegin(GLUP_TRIANGLES); + + glupTexCoord2d(0.0, 0.0); + glupVertex2d( 0.0, 0.0); + + glupTexCoord2d(1.0, 1.0); + glupVertex2d( 1.0, 1.0); + + glupTexCoord2d(0.0, 1.0); + glupVertex2d( 0.0, 1.0); + + + glupTexCoord2d(1.0, 1.0); + glupVertex2d( 1.0, 1.0); + + glupTexCoord2d(0.0, 0.0); + glupVertex2d( 0.0, 0.0); + + glupTexCoord2d(1.0, 0.0); + glupVertex2d( 1.0, 0.0); + + glupEnd(); + glupUseProgram(0); + glupDisable(GLUP_TEXTURING); + } + } + } + + void embedded_files_menu(const std::string& prefix) { + std::vector embedded_files; + list_embedded_glsl_files(embedded_files); + std::sort(embedded_files.begin(), embedded_files.end()); + for(index_t i=0; i\n" + "#line 1\n" + ) + text_editor_.text(); + glsl_program_ = glupCompileProgram(source.c_str()); + } + text_editor_visible_ = (glsl_program_ == 0); + start_animation(); + } + + void stop_program() { + stop_animation(); + text_editor_visible_ = true; + } + + + /** + * \brief Draws the application menus. + * \details This function overloads + * Application::draw_application_menus(). It can be used to create + * additional menus in the main menu bar. + */ + void draw_application_menus() override { +#ifdef GEO_OS_ANDROID + ImGui::Dummy(ImVec2(10.0f * scaling(), 0.0f)); + if(ImGui::Button( + (icon_UTF8("play-circle") + " Run").c_str() + )) { + run_program(); + } + ImGui::Dummy(ImVec2(10.0f * scaling(), 0.0f)); + if(ImGui::Button( + (icon_UTF8("stop-circle") + " Stop").c_str() + )) { + stop_program(); + } + ImGui::Dummy(ImVec2(10.0f * scaling(), 0.0f)); + if(ImGui::Button( + (icon_UTF8("home") + " Home [H]").c_str() + )) { + home(); + } +#endif + } + + + /** + * \copydoc Application::load() + */ + bool load(const std::string& filename) override { + text_editor_.load(filename); + current_file_ = filename; + text_editor_visible_ = true; + return true; + } + + /** + * \copydoc Application::save() + */ + bool save(const std::string& filename) override { + text_editor_.save(filename); + current_file_ = filename; + return true; + } + + /** + * \copydoc Application::supported_read_file_extensions() + */ + std::string supported_read_file_extensions() override { + return "glsl"; + } + + /** + * \copydoc Application::supported_write_file_extensions() + */ + std::string supported_write_file_extensions() override { + return "glsl"; + } + + + + protected: + void draw_viewer_properties() override { + if(ImGui::Button( + "run", + ImVec2(-ImGui::GetContentRegionAvailWidth()/2.0f,0.0f)) + ) { + run_program(); + } + ImGui::SameLine(); + if(ImGui::Button("stop", ImVec2(-1.0f, 0.0f))) { + stop_program(); + } + ImGui::Separator(); + if(ImGui::Button( + (icon_UTF8("home") + " Home [H]").c_str(), ImVec2(-1.0, 0.0)) + ) { + home(); + } + } + + private: + GLuint glsl_program_; + int glsl_frame_; + double glsl_start_time_; + }; + +} + +int main(int argc, char** argv) { + GeoShadeApplication app; + app.start(argc, argv); + return 0; +} diff --git a/src/bin/vorpacomp/CMakeLists.txt b/src/bin/vorpacomp/CMakeLists.txt index 56f775f8..4c4ce36d 100755 --- a/src/bin/vorpacomp/CMakeLists.txt +++ b/src/bin/vorpacomp/CMakeLists.txt @@ -1,6 +1,7 @@ +set(APP_NAME vorpacomp) aux_source_directories(SOURCES "" .) -vor_add_executable(vorpacomp ${SOURCES}) -target_link_libraries(vorpacomp geogram) +vor_add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram) -set_target_properties(vorpacomp PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/bin/vorpalite/CMakeLists.txt b/src/bin/vorpalite/CMakeLists.txt index 6c78540f..8d670401 100755 --- a/src/bin/vorpalite/CMakeLists.txt +++ b/src/bin/vorpalite/CMakeLists.txt @@ -1,10 +1,11 @@ +set(APP_NAME vorpalite) aux_source_directories(SOURCES "" .) -vor_add_executable(vorpalite ${SOURCES}) -target_link_libraries(vorpalite geogram) +vor_add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram) -install_runtime_targets(vorpalite) +install_runtime_targets(${APP_NAME}) -set_target_properties(vorpalite PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/bin/vorpastat/CMakeLists.txt b/src/bin/vorpastat/CMakeLists.txt index f534218f..0dd7f26f 100755 --- a/src/bin/vorpastat/CMakeLists.txt +++ b/src/bin/vorpastat/CMakeLists.txt @@ -1,6 +1,7 @@ +set(APP_NAME vorpastat) aux_source_directories(SOURCES "" .) -vor_add_executable(vorpastat ${SOURCES}) -target_link_libraries(vorpastat geogram) +vor_add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram) -set_target_properties(vorpastat PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/bin/vorpaview/CMakeLists.txt b/src/bin/vorpaview/CMakeLists.txt index 2a880578..9c1e0ee4 100755 --- a/src/bin/vorpaview/CMakeLists.txt +++ b/src/bin/vorpaview/CMakeLists.txt @@ -1,8 +1,9 @@ include(${PROJECT_SOURCE_DIR}/cmake/opengl.cmake) +set(APP_NAME vorpaview) aux_source_directories(SOURCES "" .) -add_executable(vorpaview ${SOURCES}) -target_link_libraries(vorpaview geogram_gfx geogram ${GLFW_LIBRARIES}) -install_runtime_targets(vorpaview) +add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram_gfx geogram ${GLFW_LIBRARIES}) +install_runtime_targets(${APP_NAME}) -set_target_properties(vorpaview PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/bin/vorpaview/main.cpp b/src/bin/vorpaview/main.cpp old mode 100755 new mode 100644 index 64d7017a..dc514a3a --- a/src/bin/vorpaview/main.cpp +++ b/src/bin/vorpaview/main.cpp @@ -43,11 +43,11 @@ * */ -#include +#include int main(int argc, char** argv) { // A SimpleMeshApplication is already a mesh viewer (nothing to do !) - GEO::SimpleMeshApplication app(argc, argv, ""); - app.start(); + GEO::SimpleMeshApplication app("Vorpaview"); + app.start(argc, argv); return 0; } diff --git a/src/examples/exploragram/compute_OTM/CMakeLists.txt b/src/examples/exploragram/compute_OTM/CMakeLists.txt index 0d8abe3b..e1902b0b 100755 --- a/src/examples/exploragram/compute_OTM/CMakeLists.txt +++ b/src/examples/exploragram/compute_OTM/CMakeLists.txt @@ -1,11 +1,13 @@ +set(APP_NAME compute_OTM) + aux_source_directories(SOURCES "" .) -vor_add_executable(compute_OTM ${SOURCES}) +vor_add_executable(${APP_NAME} ${SOURCES}) if(GEOGRAM_WITH_VORPALINE) add_definitions(-DGEOGRAM_WITH_VORPALINE) - target_link_libraries(compute_OTM exploragram geogram vorpalib) + target_link_libraries(${APP_NAME} exploragram geogram vorpalib) else() - target_link_libraries(compute_OTM exploragram geogram) + target_link_libraries(${APP_NAME} exploragram geogram) endif() -set_target_properties(compute_OTM PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/examples/exploragram/hexdom_pipeline/CMakeLists.txt b/src/examples/exploragram/hexdom_pipeline/CMakeLists.txt index eb43a10a..ca4e29a5 100755 --- a/src/examples/exploragram/hexdom_pipeline/CMakeLists.txt +++ b/src/examples/exploragram/hexdom_pipeline/CMakeLists.txt @@ -1,7 +1,9 @@ +set(APP_NAME hexdom_pipeline) + aux_source_directories(SOURCES "" .) -vor_add_executable(hexdom_pipeline ${SOURCES}) -target_link_libraries(hexdom_pipeline exploragram geogram) +vor_add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} exploragram geogram) -set_target_properties(hexdom_pipeline PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/examples/geogram/compute_RVD/CMakeLists.txt b/src/examples/geogram/compute_RVD/CMakeLists.txt index 99d3a103..b04734fb 100755 --- a/src/examples/geogram/compute_RVD/CMakeLists.txt +++ b/src/examples/geogram/compute_RVD/CMakeLists.txt @@ -1,7 +1,9 @@ +set(APP_NAME compute_RVD) + aux_source_directories(SOURCES "" .) -vor_add_executable(compute_RVD ${SOURCES}) -target_link_libraries(compute_RVD geogram) +vor_add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram) -set_target_properties(compute_RVD PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/examples/geogram/compute_delaunay/CMakeLists.txt b/src/examples/geogram/compute_delaunay/CMakeLists.txt index 803e1232..5a0709cb 100755 --- a/src/examples/geogram/compute_delaunay/CMakeLists.txt +++ b/src/examples/geogram/compute_delaunay/CMakeLists.txt @@ -1,5 +1,7 @@ +set(APP_NAME compute_delaunay) + aux_source_directories(SOURCES "" .) -vor_add_executable(compute_delaunay ${SOURCES}) -target_link_libraries(compute_delaunay geogram) +vor_add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram) -set_target_properties(compute_delaunay PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/examples/geogram/manifold_harmonics/CMakeLists.txt b/src/examples/geogram/manifold_harmonics/CMakeLists.txt index d94f265f..0ad04d10 100755 --- a/src/examples/geogram/manifold_harmonics/CMakeLists.txt +++ b/src/examples/geogram/manifold_harmonics/CMakeLists.txt @@ -1,5 +1,7 @@ +set(APP_NAME manifold_harmonics) + aux_source_directories(SOURCES "" .) -vor_add_executable(manifold_harmonics ${SOURCES}) -target_link_libraries(manifold_harmonics geogram) +vor_add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram) -set_target_properties(manifold_harmonics PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/examples/geogram/opennl_LSCM/CMakeLists.txt b/src/examples/geogram/opennl_LSCM/CMakeLists.txt index 3222625a..87c12281 100644 --- a/src/examples/geogram/opennl_LSCM/CMakeLists.txt +++ b/src/examples/geogram/opennl_LSCM/CMakeLists.txt @@ -1,5 +1,7 @@ +set(APP_NAME opennl_LSCM) + aux_source_directories(SOURCES "" .) -vor_add_executable(opennl_LSCM ${SOURCES}) -target_link_libraries(opennl_LSCM geogram) +vor_add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram) -set_target_properties(opennl_LSCM PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/examples/geogram/opennl_basic_example/CMakeLists.txt b/src/examples/geogram/opennl_basic_example/CMakeLists.txt index fa2de72e..e9142bbd 100755 --- a/src/examples/geogram/opennl_basic_example/CMakeLists.txt +++ b/src/examples/geogram/opennl_basic_example/CMakeLists.txt @@ -1,7 +1,9 @@ +set(APP_NAME opennl_basic_example) + aux_source_directories(SOURCES "" .) -vor_add_executable(opennl_basic_example ${SOURCES}) -target_link_libraries(opennl_basic_example geogram) +vor_add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram) -set_target_properties(opennl_basic_example PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/examples/geogram/opennl_mesh_smooth/CMakeLists.txt b/src/examples/geogram/opennl_mesh_smooth/CMakeLists.txt index c471b914..a7dd4e32 100755 --- a/src/examples/geogram/opennl_mesh_smooth/CMakeLists.txt +++ b/src/examples/geogram/opennl_mesh_smooth/CMakeLists.txt @@ -1,5 +1,7 @@ +set(APP_NAME opennl_mesh_smooth) + aux_source_directories(SOURCES "" .) -vor_add_executable(opennl_mesh_smooth ${SOURCES}) -target_link_libraries(opennl_mesh_smooth geogram) +vor_add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram) -set_target_properties(opennl_mesh_smooth PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/examples/geogram/simple_raytrace/CMakeLists.txt b/src/examples/geogram/simple_raytrace/CMakeLists.txt index acac1dd2..9395774b 100755 --- a/src/examples/geogram/simple_raytrace/CMakeLists.txt +++ b/src/examples/geogram/simple_raytrace/CMakeLists.txt @@ -1,5 +1,7 @@ +set(APP_NAME simple_raytrace) + aux_source_directories(SOURCES "" .) -vor_add_executable(simple_raytrace ${SOURCES}) -target_link_libraries(simple_raytrace geogram) +vor_add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram) -set_target_properties(simple_raytrace PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/examples/geogram/simple_raytrace/main.cpp b/src/examples/geogram/simple_raytrace/main.cpp index 3c68897c..b8903b2c 100644 --- a/src/examples/geogram/simple_raytrace/main.cpp +++ b/src/examples/geogram/simple_raytrace/main.cpp @@ -111,16 +111,17 @@ int main(int argc, char** argv) { // 5) Let's trace some rays !! { Stopwatch Watch("Raytrace"); -#ifdef GEO_OPENMP -#pragma omp parallel for -#endif - for(index_t Y=0; Y image_; + index_t bpp_; }; /*******************************************************************/ @@ -444,8 +475,9 @@ namespace GEO { Vf[0] = float(V.x); Vf[1] = float(V.y); Vf[2] = float(V.z); + ImGui::SetNextItemWidth(-ImGui::CalcTextSize(name.c_str()).x); bool result = ImGui::DragFloat3( - name.c_str(), Vf, 0.1f, 0.0f, 0.0f, "%.4f" + name.c_str(), Vf, 0.1f, 0.0f, 0.0f, "%.3f" ); if(result) { V.x = double(Vf[0]); @@ -457,6 +489,7 @@ namespace GEO { bool edit_scalar(const std::string& name, double& V) { double zero = 0.0; + ImGui::SetNextItemWidth(-ImGui::CalcTextSize(name.c_str()).x); return ImGui::DragScalar( name.c_str(), ImGuiDataType_Double, @@ -464,7 +497,7 @@ namespace GEO { 0.005f, &zero, nullptr, - "%.4f" + "%.3f" ); } @@ -708,8 +741,8 @@ namespace GEO { public: /** * \brief MeshObject constructor. - * \param[in,out] M a reference to the mesh. Note that MeshAABB changes the - * order of the mesh elements. + * \param[in,out] M a reference to the mesh. Note that + * MeshAABB changes the order of the mesh elements. */ MeshObject(Mesh& M) : AABB_(M) { } @@ -758,7 +791,8 @@ namespace GEO { /** * \brief The traditional checkerboard. - * \details Cannot avoid to have this in a raytracer (this is the tradition). + * \details Cannot avoid to have this in a raytracer + * (this is the tradition). */ class HorizontalCheckerboardPlane : public Object { public: diff --git a/src/examples/graphics/CMakeLists.txt b/src/examples/graphics/CMakeLists.txt index d6b26940..6725f189 100644 --- a/src/examples/graphics/CMakeLists.txt +++ b/src/examples/graphics/CMakeLists.txt @@ -1,6 +1,7 @@ -add_subdirectory(GLUP_basic_example) add_subdirectory(demo_GLUP) add_subdirectory(demo_Delaunay2d) add_subdirectory(demo_Delaunay3d) add_subdirectory(demo_Evert) add_subdirectory(demo_Raytrace) +add_subdirectory(demo_Application) +add_subdirectory(demo_SimpleApplication) diff --git a/src/examples/graphics/GLUP_basic_example/CMakeLists.txt b/src/examples/graphics/GLUP_basic_example/CMakeLists.txt deleted file mode 100755 index 0b0fbb98..00000000 --- a/src/examples/graphics/GLUP_basic_example/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -include(${PROJECT_SOURCE_DIR}/cmake/opengl.cmake) - -aux_source_directories(SOURCES "" .) -add_executable(GLUP_basic_example ${SOURCES}) - -target_link_libraries(GLUP_basic_example geogram_gfx geogram ${GLFW_LIBRARIES}) - -set_target_properties(GLUP_basic_example PROPERTIES FOLDER "GEOGRAM") diff --git a/src/examples/graphics/GLUP_basic_example/main.cpp b/src/examples/graphics/GLUP_basic_example/main.cpp deleted file mode 100644 index 1649b664..00000000 --- a/src/examples/graphics/GLUP_basic_example/main.cpp +++ /dev/null @@ -1,910 +0,0 @@ -/* - * Copyright (c) 2012-2014, Bruno Levy - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of the ALICE Project-Team nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * If you modify this software, you should include a notice giving the - * name of the person performing the modification, the date of modification, - * and the reason for such modification. - * - * Contact: Bruno Levy - * - * Bruno.Levy@inria.fr - * http://www.loria.fr/~levy - * - * ALICE Project - * LORIA, INRIA Lorraine, - * Campus Scientifique, BP 239 - * 54506 VANDOEUVRE LES NANCY CEDEX - * FRANCE - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "uv.xpm" - -namespace { - - bool lighting = true; - - /** - * \brief Zooms in. - * \details Zooming factor is 1.1x. - */ - void zoom_in() { - *glup_viewer_float_ptr(GLUP_VIEWER_ZOOM) *= 1.1f; - } - - /** - * \brief Zooms out. - * \details De-zooming factor is (1/1.1)x. - */ - void zoom_out() { - *glup_viewer_float_ptr(GLUP_VIEWER_ZOOM) /= 1.1f; - } - - GEO::index_t n = 30; - - GLint prim = GLUP_POINTS; - - bool VBO_mode = false; - GLuint index_VBO = 0; - GLuint vertex_VBO = 0; - GLuint color_VBO = 0; - GLuint tex_coord_VBO = 0; -// GLuint VAO = 0; // TODO... - GLsizei VBO_nb_vertices = 0; - GLuint texture; - - void reset_VBOs() { - if(!VBO_mode) { - return; - } - if(index_VBO != 0) { - glDeleteBuffers(1, &index_VBO); - } - index_VBO = 0; - if(vertex_VBO != 0) { - glDeleteBuffers(1, &vertex_VBO); - } - vertex_VBO = 0; - if(color_VBO != 0) { - glDeleteBuffers(1, &color_VBO); - } - color_VBO = 0; - if(tex_coord_VBO != 0) { - glDeleteBuffers(1, &tex_coord_VBO); - } - tex_coord_VBO = 0; - VBO_mode = false; - GEO::Logger::out("VBO") << "Deactivated" << std::endl; - } - - void setup_VBO_vertices_grid() { - GEO::index_t nb_vertices = n*n*n; - size_t size = sizeof(float)*3*nb_vertices; - float* data = new float[3*nb_vertices]; - float* ptr = data; - for(GEO::index_t i=0; i GLUP_TEXTURE_ADD) { - mode = GLUP_TEXTURE_REPLACE; - } - glupTextureMode(mode); - } - - void cycle_clipping_mode() { - static GLUPclipMode mode = GLUP_CLIP_WHOLE_CELLS; - mode = GLUPclipMode(mode + 1); - if(mode > GLUP_CLIP_SLICE_CELLS) { - mode = GLUP_CLIP_STANDARD; - } - glupClipMode(mode); - } - - /** - * \brief Toggles per-vertex colors. - */ - void toggle_vertex_colors() { - if(glupIsEnabled(GLUP_VERTEX_COLORS)) { - glupDisable(GLUP_VERTEX_COLORS); - } else { - glupEnable(GLUP_VERTEX_COLORS); - } - } - - /** - * \brief Toggles per-vertex normals. - */ - void toggle_vertex_normals() { - if(glupIsEnabled(GLUP_VERTEX_NORMALS)) { - glupDisable(GLUP_VERTEX_NORMALS); - } else { - glupEnable(GLUP_VERTEX_NORMALS); - } - } - - /** - * \brief Toggles fragment discard. - */ - void toggle_alpha_discard() { - if(glupIsEnabled(GLUP_ALPHA_DISCARD)) { - glupDisable(GLUP_ALPHA_DISCARD); - } else { - glupEnable(GLUP_ALPHA_DISCARD); - } - } - - void inc_n() { - reset_VBOs(); - GEO::index_t new_n = n * 3; - if(new_n < 100000000) { - n = new_n; - } - GEO::Logger::out("GLUP") << "n = " << n << std::endl; - GEO::Logger::out("GLUP") << "n2 = " << n*n << std::endl; - GEO::Logger::out("GLUP") << "n3 = " << n*n*n << std::endl; - } - - void dec_n() { - reset_VBOs(); - GEO::index_t new_n = n / 3; - if(new_n >= 2) { - n = new_n; - } - GEO::Logger::out("GLUP") << "n = " << n << std::endl; - GEO::Logger::out("GLUP") << "n2 = " << n*n << std::endl; - GEO::Logger::out("GLUP") << "n3 = " << n*n*n << std::endl; - } - - inline void draw_vertex_grid( - GEO::index_t i, GEO::index_t j, GEO::index_t k, float R=0.0f - ) { - glupColor4f( - float(i)/float(n), - float(j)/float(n), - float(k)/float(n), - 0.0f - ); - glupTexCoord3f( - float(i)/float(n), - float(j)/float(n), - float(k)/float(n) - ); - glupVertex4f( - float(i)/float(n), - float(j)/float(n), - float(k)/float(n), - (R == 0.0f) ? 1.0f : R - ); - } - - inline void draw_vertex_sphere(GEO::index_t i, GEO::index_t j) { - double theta = double(i) * 2.0 * M_PI / double(n-1); - double phi = -M_PI/2.0 + double(j) * M_PI / double(n-1); - - double x = (cos(theta)*cos(phi) + 1.0)/2.0; - double y = (sin(theta)*cos(phi) + 1.0)/2.0; - double z = (sin(phi) + 1.0) / 2.0; - - glupColor4d(x,y,z,0.0); - glupTexCoord3d(x,y,z); - glupNormal3d(x-0.5,y-0.5,z-0.5); - glupVertex3d(x,y,z); - } - - GLint point_size = 4; - - void inc_point_size() { - ++point_size; - } - - void dec_point_size() { - --point_size; - if(point_size <= 0) { - point_size = 0; - } - } - - void next_primitive() { - reset_VBOs(); - ++prim; - - if(prim == GLUP_CONNECTORS) { - prim = GLUP_SPHERES; - } - - if(prim > GLUP_SPHERES) { - prim = GLUP_POINTS; - } - } - - /** - * \brief Initializes OpenGL objects. - * \details Specifed as glup_viewer_set_init_func() callback. - */ - void init() { - GEO::Graphics::initialize(); - - glup_viewer_set_background_color(1.0, 1.0, 1.0); - glup_viewer_add_toggle( - 'T', glup_viewer_is_enabled_ptr(GLUP_VIEWER_TWEAKBARS), - "Toggle tweakbars" - ); - glup_viewer_add_key_func('z', zoom_in, "Zoom in"); - glup_viewer_add_key_func('Z', zoom_out, "Zoom out"); - glup_viewer_disable(GLUP_VIEWER_TWEAKBARS); - glup_viewer_disable(GLUP_VIEWER_BACKGROUND); - glup_viewer_add_key_func('m', toggle_mesh, "mesh"); - - glupEnable(GLUP_VERTEX_COLORS); - glupEnable(GLUP_DRAW_MESH); - - glupMatrixMode(GLUP_TEXTURE_MATRIX); - glupLoadIdentity(); - - glGenTextures(1, &texture); - glActiveTexture(GL_TEXTURE0 + GLUP_TEXTURE_2D_UNIT); - glBindTexture(GL_TEXTURE_2D, texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexImage2DXPM(uv); - - glupTextureType(GLUP_TEXTURE_2D); - glupTextureMode(GLUP_TEXTURE_REPLACE); - glupClipMode(GLUP_CLIP_WHOLE_CELLS); - } - - void display_points() { - glupSetPointSize(GLfloat(point_size)); - - if(VBO_mode) { - glBindBuffer(GL_ARRAY_BUFFER, vertex_VBO); - glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr); - - if(glupIsEnabled(GLUP_VERTEX_COLORS)) { - glBindBuffer(GL_ARRAY_BUFFER, color_VBO); - glEnableVertexAttribArray(1); - glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, nullptr); - } - - if(glupIsEnabled(GLUP_TEXTURING)) { - glBindBuffer(GL_ARRAY_BUFFER, tex_coord_VBO); - glEnableVertexAttribArray(2); - glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, nullptr); - } - - glupDrawArrays(GLUP_POINTS, 0, VBO_nb_vertices); - - glDisableVertexAttribArray(0); - glDisableVertexAttribArray(1); - glDisableVertexAttribArray(2); - glBindBuffer(GL_ARRAY_BUFFER,0); - - } else { - glupBegin(GLUP_POINTS); - for(GEO::index_t i=0; iset_quiet(false); - - GEO::CmdLine::import_arg_group("standard"); - GEO::CmdLine::import_arg_group("algo"); - GEO::CmdLine::import_arg_group("gfx"); - - GEO::CmdLine::set_arg("sys:assert","abort"); - - std::vector filenames; - if(!GEO::CmdLine::parse(argc, argv, filenames, "")) { - return 1; - } - - glup_viewer_set_region_of_interest( - 0.0f, 0.0f, 0.0f, - 1.0f, 1.0f, 1.0f - ); - - glup_viewer_set_window_title( - "GLUP eyecandy test" - ); - glup_viewer_set_init_func(init); - glup_viewer_set_display_func(display); - glup_viewer_set_overlay_func(overlay); - glup_viewer_add_key_func('L', toggle_lighting, "toggle lighting"); - glup_viewer_add_key_func('c', toggle_vertex_colors, "toggle vrtx colors"); - glup_viewer_add_key_func('x', dec_shrink, "unshrink cells"); - glup_viewer_add_key_func('w', inc_shrink, "shrink cells"); - glup_viewer_add_key_func('n', inc_n, "increment n"); - glup_viewer_add_key_func('N', dec_n, "decrement n"); - glup_viewer_add_key_func('p', inc_point_size, "increment point size"); - glup_viewer_add_key_func('P', dec_point_size, "decrement point size"); - glup_viewer_add_key_func(' ', next_primitive, "cycle GLUP primitives"); - glup_viewer_add_key_func('o', toggle_picking, "toggle picking"); - glup_viewer_add_key_func('v', toggle_VBOs, "create VBO"); - glup_viewer_add_key_func('t', toggle_texturing, "toggle texturing"); - glup_viewer_add_key_func('y', cycle_texturing_mode, "texturing mode"); - glup_viewer_add_key_func('C', cycle_clipping_mode, "clipping mode"); - glup_viewer_add_key_func('W', toggle_vertex_normals, "toggle vrtx normals"); - glup_viewer_add_key_func('a', toggle_alpha_discard, "toggle alpha discard"); - - if(GEO::CmdLine::get_arg_bool("gfx:full_screen")) { - glup_viewer_enable(GLUP_VIEWER_FULL_SCREEN); - } - - glup_viewer_main_loop(argc, argv); - - return 0; -} diff --git a/src/examples/graphics/GLUP_basic_example/uv.xpm b/src/examples/graphics/GLUP_basic_example/uv.xpm deleted file mode 100755 index 8edd1b4c..00000000 --- a/src/examples/graphics/GLUP_basic_example/uv.xpm +++ /dev/null @@ -1,771 +0,0 @@ -/* XPM */ -static const char * uv[] = { -"512 512 256 2", -" c None", -". c #000300", -"+ c #090100", -"@ c #050208", -"# c #000408", -"$ c #0F0106", -"% c #050310", -"& c #010817", -"* c #0A061B", -"= c #1B0407", -"- c #000D04", -"; c #0B0B2A", -"> c #120E04", -", c #28080C", -"' c #0C0C37", -") c #061702", -"! c #03161B", -"~ c #1C110B", -"{ c #121411", -"] c #1A1405", -"^ c #201304", -"/ c #031E04", -"( c #13134D", -"_ c #1F1804", -": c #420D0F", -"< c #301125", -"[ c #1A1D04", -"} c #181760", -"| c #411221", -"1 c #52100D", -"2 c #2A1B3A", -"3 c #241E49", -"4 c #2F2218", -"5 c #063107", -"6 c #441857", -"7 c #401F21", -"8 c #2B2525", -"9 c #31260F", -"0 c #421D40", -"a c #182D21", -"b c #0E2F35", -"c c #251E9F", -"d c #1D247C", -"e c #252287", -"f c #2C2837", -"g c #2C2D09", -"h c #332547", -"i c #272476", -"j c #561C3D", -"k c #531D46", -"l c #292A4A", -"m c #4C223C", -"n c #242599", -"o c #252C54", -"p c #222C73", -"q c #6A1C4C", -"r c #3C2A6B", -"s c #722225", -"t c #6E2234", -"u c #7A221A", -"v c #4A2D40", -"w c #35315A", -"x c #382F65", -"y c #362F6B", -"z c #3F2D66", -"A c #363161", -"B c #333266", -"C c #5C2C32", -"D c #612D23", -"E c #2D3764", -"F c #49372C", -"G c #3D29DB", -"H c #4A3821", -"I c #373859", -"J c #3F3939", -"K c #1E3E75", -"L c #124C11", -"M c #3433B2", -"N c #922624", -"O c #6C2D53", -"P c #3433BF", -"Q c #A02424", -"R c #164950", -"S c #6D3517", -"T c #382FEF", -"U c #4130D0", -"V c #3B2EF6", -"W c #434411", -"X c #2C37E0", -"Y c #3934D9", -"Z c #2C38D9", -"` c #3537CC", -" . c #3235E9", -".. c #982937", -"+. c #3B34E1", -"@. c #3A36D2", -"#. c #7C2F5C", -"$. c #9D2469", -"%. c #8B2B5E", -"&. c #962767", -"*. c #8A2B63", -"=. c #902966", -"-. c #1D4A75", -";. c #4D3E63", -">. c #852E61", -",. c #8E2C5B", -"'. c #932A62", -"). c #4E434F", -"!. c #9C2C52", -"~. c #5A4054", -"{. c #972D60", -"]. c #474C2E", -"^. c #634819", -"/. c #664632", -"(. c #5E464A", -"_. c #5C4A31", -":. c #40524A", -"<. c #634A33", -"[. c #5B4E41", -"}. c #544F4F", -"|. c #B33353", -"1. c #584D64", -"2. c #BB3633", -"3. c #17663B", -"4. c #156652", -"5. c #BD3642", -"6. c #1D607B", -"7. c #1E6929", -"8. c #E72D2E", -"9. c #DA3335", -"0. c #CF3736", -"a. c #5C5C1B", -"b. c #EA2F37", -"c. c #1F666C", -"d. c #DF3331", -"e. c #E23339", -"f. c #D53933", -"g. c #F32F3F", -"h. c #346C16", -"i. c #CF3A3F", -"j. c #DE363E", -"k. c #615863", -"l. c #805158", -"m. c #17772A", -"n. c #1A7A19", -"o. c #3C761B", -"p. c #118049", -"q. c #736163", -"r. c #7E6521", -"s. c #7E6346", -"t. c #55741E", -"u. c #766553", -"v. c #915E55", -"w. c #6A6866", -"x. c #6F6F25", -"y. c #1E806D", -"z. c #387F3C", -"A. c #317F52", -"B. c #247D90", -"C. c #1F8C22", -"D. c #538017", -"E. c #288687", -"F. c #6A766E", -"G. c #77717C", -"H. c #747D1C", -"I. c #847D21", -"J. c #3A9240", -"K. c #1F9F1C", -"L. c #947473", -"M. c #7C7B7B", -"N. c #289C2D", -"O. c #917C6A", -"P. c #977D5F", -"Q. c #8D7D83", -"R. c #8A8086", -"S. c #2D9EB0", -"T. c #908F2A", -"U. c #878986", -"V. c #8F887C", -"W. c #87898C", -"X. c #30A1A0", -"Y. c #8C8981", -"Z. c #8E8987", -"`. c #828E86", -" + c #939052", -".+ c #898D96", -"++ c #8D9270", -"@+ c #62A361", -"#+ c #909292", -"$+ c #3DB442", -"%+ c #31BA34", -"&+ c #52AD56", -"*+ c #44AB96", -"=+ c #A99170", -"-+ c #91A02A", -";+ c #37BE20", -">+ c #A2A025", -",+ c #9D9790", -"'+ c #A5A033", -")+ c #A6998D", -"!+ c #BF9485", -"~+ c #33B8BD", -"{+ c #AD9B86", -"]+ c #4DB2C0", -"^+ c #C09A83", -"/+ c #56C329", -"(+ c #B69E83", -"_+ c #BC9C8A", -":+ c #B89F7E", -"<+ c #B9A079", -"[+ c #42C0BA", -"}+ c #33D335", -"|+ c #2CD62D", -"1+ c #AFAA70", -"2+ c #48D049", -"3+ c #C0A785", -"4+ c #BFA78C", -"5+ c #23E11F", -"6+ c #C2A881", -"7+ c #3CD644", -"8+ c #53CE59", -"9+ c #31DC33", -"0+ c #BCA993", -"a+ c #C6A97A", -"b+ c #2FDE2B", -"c+ c #CBAA66", -"d+ c #38CBD1", -"e+ c #35CFC8", -"f+ c #39DC3D", -"g+ c #C2B539", -"h+ c #21D6DC", -"i+ c #A8BF33", -"j+ c #B6B94D", -"k+ c #31D6D5", -"l+ c #3DD3D8", -"m+ c #BABE3A", -"n+ c #50D2CC", -"o+ c #30DDC6", -"p+ c #CAB593", -"q+ c #2ADEE3", -"r+ c #26E0DE", -"s+ c #3CDBDA", -"t+ c #31E1D8", -"u+ c #45E0EB", -"v+ c #CBCD32", -"w+ c #CFD128", -"x+ c #D3D54F", -"y+ c #D4D83D", -"z+ c #D7D932", -"A+ c #DBDB29", -"B+ c #E1DA43", -"C+ c #E3DC2D", -"D+ c #DCE120", -"E+ c #D8E12D", -"F+ c #D9E43B", -"G+ c #E7E23E", -"u N N N N N Q Q Q N Q Q N N N N Q Q N N N N Q Q Q N N N N Q N N N Q N N Q N N N N Q N Q N N N N N |.1 F T.>+>+D.-+I.I.T.I.I.I.I.I.I.T.I.T.I.I.I.T.T.I.I.I.I.T.T.I.I.I.T.T.T.I.I.I.T.T.H.I.T.I.T.>+H.T.>+>+x.L n.C.C.C.C.N.C.C.C.C.C.N.C.C.C.N.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.N.C.C.N.C.C.N.C.C.C.C.C.N.C.C.C.C.C.n.3.c.X.E.E.E.E.E.E.E.E.E.E.B.E.B.E.E.E.E.E.E.E.E.E.E.E.E.B.E.E.B.E.E.B.E.E.E.E.E.E.E.E.E.E.E.E.X.E.E.E.R } n M M e e M n e e e e e e e e e e e M n e e e e e e e e e e n n e e e e e e e e e n M e e e e n ` d _.I.u.v.u.<.u.v.u.u.I.v.v.u.u.u.v.u.v.v.u.v.v.u.u.u.v.u.u.v.u.u.v.u.v.u.u.u.v.u.u.v.u.v.u.u.u.v.u. +<.f [.}.:.:.}.k.w.k.k.}.}.}.}.}.k.q.k.}.}.}.:.:.k.k.}.}.}.}.k.}.}.}.}.}.}.}.F.}.k.}.}.k.}.k.F.:.q.k.w.1.0 q #.q q q q O q q O q q O q q O q q O q q O q O q O O q q q O q O q O q O O O q q O q q j O q q O O 0 l I I I I I I w A I l h I l h I I h I I I I l A w I l l I I w w I w o o w I I I I l l w w w w h A E f 8 <.F D D F F a.D F D F D F F a.F F D F F F D F F D F F F F F F D F F D H ^.D F F H W F D F a.a.F ].g ", -"N i.i.i.0.i.0.0.i.i.i.5.i.i.i.0.i.5.i.i.i.f.0.i.i.0.i.f.0.5.5.i.i.i.f.i.5.f.0.i.f.0.5.0.f.f.f.0.5.e...I.x+G+B+B+z+z+E+G+B+G+G+B+B+y+x+G+F+B+B+y+B+B+G+G+G+y+B+G+G+G+G+G+B+B+z+G+G+G+B+y+B+B+B+B+x+x+B+E+G+'+o.$+2+f+f+f+7+2+7+7+2+2+7+7+7+2+7+7+7+7+7+7+7+7+7+7+7+7+7+8+2+2+2+7+7+7+7+7+2+7+2+2+7+7+2+}+2+7+9+2+&+3.X.u+u+l+l+l+u+l+d+u+k+t+t+u+s+s+t+t+u+l+u+u+l+l+l+u+t+l+l+t+s+t+u+u+l+l+l+l+u+l+l+l+l+l+l+l+s+t+l+d+B.d M M ` ` M Z @.` ` ` ` @.Z M P @.` ` ` ` P ` ` P ` Z M P P M ` ` ` ` ` ` ` Z ` M ` M ` ` ` ` @.` @.d u.1+p+_+p+4+4+4+3+:+4+(+4+4+3+4+p+3+4+4+3+3+p+4+3+(+4+4+3+p+4+4+4+3+p+(+4+4+4+p+4+3+4+4+4+4+3+3+p+0+u.[.W.#+.+Z.#+#+#+#+Z.#+#+#+#+Z.Z.#+#+#+#+#+#+#+#+#+#+#+#+#+#+W.#+#+#+#+Z.#+#+#+#+#+#+#+#+#+Z.W.#+Z.#+G.m q %.>.>.>.>.#.#.>.>.>.>.>.>.>.>.>.>.=.>.>.>.=.*.*.=.>.>.>.>.>.>.>.>.#.*.>.*.>.*.*.>.*.=.*.#.>.'.*.*.k o A I w w w A A w B A A A B A A A A A A w A A A A A A A A I A w w I w A A A A w A A w w A w A A B A 8 F <.<.<.<._.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.[.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<._.<.F ", -"N i.i.i.9.j.j.j.j.j.j.j.e.e.9.f.j.j.b.e.j.9.e.j.j.j.j.j.j.j.j.j.9.e.j.j.j.e.j.e.j.j.e.e.j.j.e.9.e.d.u x.y+C+A+y+z+E+D+D+D+D+D+D+D+D+A+A+A+z+A+A+A+A+D+A+D+A+D+A+A+D+D+A+D+D+D+D+D+C+A+A+A+z+z+z+A+A+A+C+G+'+h.%+b+}+9+|+9+9+|+9+9+9+9+|+9+|+|+b+f+9+|+9+9+b+f+}+9+9+9+9+|+9+9+9+9+9+f+9+9+9+9+|+|+9+9+9+9+b+b+b+$+3.X.u+h+s+t+o+s+o+h+k+t+t+t+t+s+t+t+t+o+k+k+k+t+s+s+k+t+t+t+t+t+t+t+t+s+k+s+r+h+t+o+k+s+t+k+k+k+s+t+l+B.n ` @.Y @.U U Z +.+.+.+.+.+.+.+.+.+.Z +.+.+.+.+.+.+.Y +. .X @.X +.+.+.U +.+.+.Z +.+.Z +.Z +.+.+.+.@.d u.4+3+4+0+(+4+3+4+:+{+0+3+3+(+(+4+4+4+{+0+4+4+4+4+4+4+4+4+(+(+4+_+4+4+:+4+:+4+4+(+4+:+4+4+:+_+:+4+0+u.[.U.#+.+W.U.U.U.U.U.U.U.U.U.U.U.U.Z.U.W.U.U.Z.U.Z.U.U.U.Z.U.W.U.U.Z.U.U.U.U.Z.Z.U.U.U.U..+@+`.R.#+#+G.m q '.=.=.=.=.=.=.=.=.=.=.=.=.=.*.=.=.=.=.=.'.=.&.=.=.=.%.=.=.=.=.=.=.=.*.=.=.=.=.=.*.=.&.%.%.%.'.&.*.k l I w I w A A w w w w w w w w w A w B w I B w B w w w w A w w w w w w w w A A A B A w w w w w w A B f H <.<.<._._.<._.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.F ", -"Q i.i.e.j.j.e.e.d.9.e.e.e.j.j.e.d.d.e.9.9.9.e.b.j.j.e.b.e.e.e.e.j.e.9.8.j.d.e.d.j.j.d.e.j.e.j.e.e.d.u x.y+A+z+y+E+A+z+z+z+z+z+z+G+G+z+A+C+z+A+A+z+E+z+z+w+z+z+y+y+z+z+z+z+z+w+z+z+z+z+A+A+y+z+z+A+A+E+A+G+'+h.%+b+|+9+|+9+9+9+b+|+9+b+9+b+|+|+b+b+|+b+b+|+9+b+9+|+b+9+b+b+9+b+b+b+9+|+b+b+b+b+|+b+b+b+b+f+9+b+9+%+p.S.q+s+s+s+t+t+s+t+k+k+s+s+s+k+h+k+k+s+s+o+s+s+o+s+s+s+s+t+t+k+s+h+t+o+t+s+s+s+s+s+t+o+r+k+k+t+o+t+e+B.c Y +. .@.Z +.+.+.U +.+.+.Z Y +.+.Z +.+.+.+.+.+.+.Y X +.+.+.+.+.+.+. .T +.+.+.+.+.+.+.+.+.+.+.+.+.@.p w.(+<+4+(+<+4+3+3+_+(+4+4+4+(+{+0+4+3+:+(+(+4+4+(+(+3+4+4+(+(+4+4+3+4+(+3+4+4+4+(+(+4+:+4+(+4+3+:+p+u.}.M.`.W.W.U.U.W.W.W.Z.U.U.U.U.U.W.W.Z.U.U.U.U.U.U.U.U.U.U.Z.U.U.U.U.#+U.U.U.Z.U.U.W.U.Z.U.W.Z.R.W.#+G.m #.=.=.=.*.*.=.=.=.*.>.*.*.*.=.=.=.*.=.*.*.=.=.=.=.=.>.=.=.*.>.=.=.*.*.*.=.=.%.=.*.*.&.=.*.*.=.=.=.*.k o A w A B A B B A B B A B B B B A B A A B w A B B B B B A A B B B B B B A A A B A A B B A A A B B A f 8 <.<.<.<.<.<.<.<.<.<.<.<.<._.<.<.<.F <.<.<.<.<.<._.<.<.<.<.<.<.<.<.<.<.<.<.<.<._.<.<.<.<.<.<.<._.<.F ", -"Q i.9.j.d.0.9.d.0.d.0.f.0.f.0.0.9.f.f.f.0.f.f.0.d.f.0.9.0.0.0.9.0.9.0.d.d.9.9.0.0.d.d.0.d.0.0.d.f.e.u r.y+C+z+v+w+y+y+x+y+y+y+x+x+y+w+y+y+w+w+w+y+y+y+x+y+x+x+y+y+v+y+y+y+y+w+x+x+y+y+w+w+y+y+y+w+w+A+A+z+'+h.$+9+|+}+}+}+f+|+|+|+}+|+|+|+}+|+}+}+|+}+|+|+|+|+|+}+9+|+|+|+|+|+|+}+}+|+|+9+|+}+}+}+|+9+|+}+}+9+9+%+z.*+u+d+d+k+d+k+d+d+k+d+l+d+l+d+d+l+l+k+k+d+d+k+d+d+k+l+d+l+d+k+d+l+d+k+e+k+d+d+d+d+l+k+s+k+k+k+e+e+[+B.c ` Z X U U U U ` ` U ` ` ` U ` Z ` Z Y ` Z U Y Y @.` Z @.` ` @.U U Z ` ` Y @.` Y @.` U ` Y U Y U ` d u.1+:+{+_+:+_+(+:+:+:+{+(+(+:+:+<+:+:+=+=+:+3+(+:+=+(+(+:+:+<+<+<+(+:+=+:+:+:+:+:+:+:+(+(+(+:+:+4+4+u._.Y.U.U.R.R.U.U.Q.@+++W.U.U.L.L.`.`.`.Z.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.W. +Y.U.W.@+++Q.R.#+w.v >.=.*.*.>.>.=.*.>.#.#.*.%.*.*.#.=.%.*.*.*.%.*.#.%.*.,.*.*.%.%.*.*.*.*.*.*.*.*.%.*.*.*.%.>.#.>.*.%.#.0 o A w w A B B x x x x x x B x x x x x x w w B x B B B B B B B B B A A x B A B x x B B B B B B A A B f 9 <.<.F _._._._._._._._._._.u /._._.<.<._._._._._._._.<.<.<._._._.<.<.<.<._.<.<.<.F <.<._.<.<._._.<.9 ", -"N 0.f.j.9.0.f.9.0.0.0.0.0.0.0.0.f.f.f.0.0.0.0.f.0.0.0.0.0.0.0.0.0.f.0.f.0.0.0.0.d.0.f.f.f.0.0.f.0.e.u r.m+C+B+x+z+z+y+z+z+w+w+y+y+y+y+x+x+y+x+y+y+y+z+y+v+y+y+v+z+v+w+y+y+z+w+y+y+v+y+y+x+y+y+y+x+y+y+z+G+'+h.%+9+9+}+}+}+}+}+}+}+}+}+7+}+}+}+f+}+}+}+}+}+7+}+}+}+}+}+}+}+}+}+9+}+}+}+}+}+}+}+}+}+}+}+}+}+}+9+f+$+3.X.u+d+l+d+l+l+d+l+d+h+s+l+k+k+k+k+s+l+d+d+l+l+l+l+d+l+l+k+h+k+k+s+h+d+l+l+l+d+d+d+d+s+k+h+k+k+k+s+l+B.n M Y Z U ` U @.` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` @.p w.1+<+{+(+:+^+4+:+(+(+(+:+_+(+(+(+4+:+:+:+:+(+:+(+(+(+4+(+(+:+:+<+(+(+:+<+:+:+:+:+<+:+:+:+<+:+:+4+0+u.[.Y.#+R.R.R.W.U.R.R.Z.U.U.U.Z.Z.W.W.W.U.Z.U.U.U.U.U.U.U.U.U.U.U.U.U.U.Q.U.U.U.U.U.Y.U.U.U.M.Z.Z.Z.#+w.v q *.*.%.>.*.*.*.*.*.*.*.*.*.*.*.*.%.#.%.#.>.*.*.#.*.=.,.>.*.>.*.>.>.>.*.*.*.*.>.*.*.=.%.#.#.#.*.*.#.0 o A A B x x x x B B x x B x x x B B B B B A B x x x B B B B B B x x x x B B B B B B B B B B B B B E 2 8 <.<.<._._._.<._._._._._.<./.<.<.<.<.<.<.<.<._._.<.<.<.<.<.<.<.<.<.<.<._.<.<.<.<.<.<.<.<.<.<.<._.<.].", -"N f.9.j.d.f.9.j.0.f.f.f.f.f.f.9.f.f.f.f.f.f.f.f.f.f.0.9.9.f.f.f.f.f.d.f.0.f.f.f.9.0.f.f.f.0.9.f.j.j.u I.y+C+z+y+y+A+A+A+A+A+A+A+E+E+z+z+z+y+y+y+y+y+A+z+A+A+z+z+A+A+w+A+D+E+A+A+A+z+z+v+y+y+y+y+v+y+y+E+C+'+h.$+9+9+f+}+}+}+}+}+}+}+}+f+f+}+}+}+}+}+}+}+}+f+|+}+|+f+f+9+}+|+}+f+9+}+}+|+9+}+|+|+}+}+}+}+}+f+b+9+$+7.*+u+s+h+h+h+s+s+l+d+q+s+s+h+k+s+s+s+h+k+l+s+h+s+h+h+q+k+t+s+k+s+s+s+h+l+s+s+s+l+d+h+s+s+h+d+k+t+s+l+B.c @.Z +.@.U Z +.@.Z Z @.Z @.Z Z @.@.@.@.@.Z @.Y U Z @.@.@.Z Z @.@.@.@.@.Z Z @.U Z @.@.@.@.@.Z Z Z @.} q.p+3+4+(+:+:+4+:+{+(+(+:+(+:+<+:+<+3+:+<+:+(+:+:+:+4+3+<+<+<+(+:+(+4+<+:+:+:+:+:+:+:+:+(+<+:+:+4+4+u.}.Z.#+#+W.Z.U.#+#+R.R.W.W.U.U.U.W..+W.U.U.W.U.#+U.U.U.U.U.U.U.U.W.U.U.U.U.W.#+U.U.W.R.W.W.Q.W.Z.Z.#+G.m q '.&.%.'.=.*.=.=.*.=.&.=.=.%.&.'.&.*.*.*.=.=.%.*.=.&.&.'.'.*.=.&.&.*.=.=.&.%.%.*.&.&.%.%.*.%.%.*.>.k 3 B B A A B B B B x x x x x x x B x B B B y B x x B B B B x B B B B B x B B B x x x x B B B B x B A 2 F <.<.<._.<.<.<.<.<.<.<.<.<._._.<.<._._.<.<.<._._._.<.<.<.<._._._.<.<.<.<._.<.<.<.<.<.<._.<.<.<._._.F ", -"Q f.9.e.d.9.j.b.d.b.8.d.e.b.9.d.b.e.d.8.8.8.8.b.b.b.b.8.e.e.d.b.e.e.d.8.e.8.e.e.8.d.8.8.e.8.8.d.8.e.u x.y+C+C+B+v+z+z+E+z+z+z+z+z+A+A+A+A+A+A+A+A+A+F+z+A+z+A+A+A+E+E+z+z+z+A+z+z+z+D+A+A+D+z+C+A+C+E+E+G+>+h.%+9+9+|+|+b+9+|+|+|+|+9+9+9+|+9+b+|+9+|+9+9+9+9+|+9+9+9+9+|+|+|+9+9+}+|+9+9+|+9+|+}+|+9+|+}+}+b+b+%+m.X.u+q+h+k+s+q+q+r+k+h+s+s+q+k+d+s+t+h+s+t+s+q+r+s+s+s+q+q+s+s+q+h+t+t+k+s+q+s+s+k+s+r+r+h+k+s+t+s+d+B.c Y X +.+.Z Z +.T +.+.T +.T +.+.+.+.+.+.+.+.+.+.+.X +.+.+. .+.+. .T T +.+.+.+.+.Y +.+.+.+.+.+.+.+.@.} q.p+4+_+_+(+4+3+4+(+_+3+3+4+3+:+(+3+:+<+<+:+:+:+:+<+<+:+:+:+:+:+<+:+:+:+<+:+3+:+<+<+:+:+<+:+<+4+4+4+u.[.U.U.W.W.R.W.#+#+R.R.U.W.U.U.U.W.W.U.U.U.U.U.U.#+U.#+U.U.U.W.U.W.U.U.U.U.Z.U.U.U.U.W.W.W.W.R.Z.#+#+G.m #.&.&.&.'.&.&.&.&.&.&.&.&.&.&.$.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.'.%.'.'.&.%.k o B B x B B y p B B B B B B B B x B B B B B x y B y x x B B B y x B y x B B B B B B B B x y B B B B 2 H <.<.<.<.<.<.<.<.<.<.<.<.<._.<.<.<.<.<._.<.<.<.<.<._.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<._.F ", -"Q i.j.d.d.0.0.8.e.d.0.f.9.8.d.d.d.8.g.j.i.5.5.5.5.Q Q 2.i.9.d.8.8.b.d.8.e.9.e.f.0.d.9.9.f.9.9.9.9.e.u r.y+C+G+x+z+z+z+z+z+y+z+z+z+y+y+G+C+C+w+z+y+F+E+F+>+'+x+'+1+'+1+x+v+F+y+w+A+z+A+z+z+z+z+z+z+z+z+C+G+'+h.%+b+9+}+|+9+9+9+|+|+|+9+}+}+|+}+9+7+2+7+7+$+$+$+$+$+$+7+7+7+2+}+f+9+b+5+f+}+9+}+|+7+f+|+}+}+|+9+9+%+m.*+u+s+s+k+h+s+q+s+h+u+s+s+h+k+k+t+t+o+s+r+[+~+X.X.~+[+l+l+l+s+k+q+t+t+s+t+t+s+u+d+l+q+s+l+d+k+t+t+d+B.c Y +.+.` ` U Y Y Y Y Y Z Y Y Z +.Y Y @.` Z Y +.T T G P n n d n e p n . .Z ` ` ` X X X X X X Z Z @.d w.a+a+_+_+<+3+3+3+:+(+3+3+3+(+0+0+0+0+4+)+)+4+0+0+0+0+0+0+0+,+0+,+0+0+{+0+4+a+:+:+:+(+:+3+:+:+(+4+p+u.}.Z.#+W.U.U.U.U.W.W.U.U.#+#+U.`.#+U.U.U.U.#+,+Z.w.q.w.M.M.#+@+R.#+U.U.U.U.Z.U.U.U.U.U.W.W.U.U.Z.#+#+G.m *.=.&.&.*.=.&.*.=.&.&.=.#.>.#.~.#.>.'.'.'.'.'.'.'.=.'.'.'.#.%.'.>.=.>.#.%.'.%.=.=.>.*.'.=.*.=.=.=.>.k o B A A B B B y B B B A B B B y B B A w w o f f f f h w w z w I A A z x y y B B A x B B B B B B B A f 8 <.<.<._.<._.<._.<.<.<.<.<.<._._.<.<._._.H _._.F F <.<.[.[.[.[.<._._._.<._._.<._.<.<.<.<.<.<.<.<.<._.", -"N 5.j.9.0.0.f.9.j.9.d.0.f.8.d.d.d.5.5.Q 1 : : : : , , , : 1 Q 2...d.9.b.d.9.9.f.0.d.d.f.9.9.d.9.9.b.u r.y+A+z+v+w+w+z+A+w+v+w+z+z+w+v+y+G+C+z+v+v+z+z+T./ _ [ _ / ^ 4 >+D+z+v+w+A+w+z+w+w+w+y+z+w+v+y+E+G+'+o.%+9+9+}+}+}+}+|+|+}+|+|+9+|+}+}+2+N.C.h.5 / ) ) a 5 5 5 L m.n.N.2+f+9+9+9+9+9+}+}+}+}+|+}+}+|+b+b+$+3.X.u+k+k+k+d+k+k+k+d+d+d+k+k+k+k+s+~+*+c.b f b ! a b a b R c.E.d+l+h+k+r+t+t+s+l+d+d+k+s+k+d+n+s+s+d+6.n M .+.Z ` U +.Z Z Z Z Z Z Z @.+.Y U ` ` ` +. .@.P e ( ' ' ' ' ; ; d @.+.@.P ` U Y Z Z Z Z Y Y U U d F.<+a+_+(+:+:+:+(+:+<+:+:+:+0+u.[._.F ).F _._._.[.J _._._._._.H ).).J _.O.:+<+(+:+:+:+:+(+:+:+<+:+0+u._.M.U.U.R.W.U.U.U.U.R.R.R.U.U.W.U.U.U.U.}.J 8 { { @ { { { 8 :.O M.#+#+U.U.U.U.U.U.U.U.U.W.@+++R.Q.W.G.m q =.=.*.*.*.=.=.=.&.&.>.j m | 7 | | | m | | 0 | | | | 0 k | m | | | = 0 : ,.&.=.*.*.=.&.'.>.>.=.=.>.k o A w B B B B B B x B B B B p x A w h 3 * * * * * % % % * ; 3 I w A B A A B B B B B B B B x B B B E 2 F <.<.<._.<.<._._.<.<._.<._.<._._._.H ^ ~ = + + $ + + = 9 F J <._._.D S <./.S /.D _.<._._._.<.<.<.<.g ", -"Q 0.j.e.0.0.0.d.j.9.0.f.d.9.f.f.Q s : , > - . . + . . - . $ , : s 5.i.0.j.9.d.d.0.9.9.9.9.f.9.f.9.e.u r.v+A+z+v+w+w+z+z+z+w+z+z+z+w+v+y+z+A+w+v+y+x+1+5 + # @ $ @ @ @ >+A+y+y+y+C+z+y+w+w+y+y+z+w+C+z+z+C+'+h.%+9+b+|+}+}+}+|+|+}+}+|+9+}+7+}+n.5 5 - . . $ % % @ @ . - ) / 5 h.$+&+2+}+}+9+}+}+}+|+9+9+}+}+9+9+$+3.X.u+h+h+k+k+h+k+k+k+k+h+s+o+k+n+y.b ! ! @ $ . $ $ $ . @ @ { & R E.d+k+k+k+k+s+l+d+h+s+s+l+l+k+e+t+n+4.c @.+.+.` ` U +.Z Z Z Z Z Z Z Z Y U U Z ` ` Y .e } ' * @ # . # @ * d @.T X @.U U Z Z Z Z Y Z U Z Z d k.a+a+_+(+1+:+:+(+:+(+:+:+:+0+F $ + $ $ $ + + > . . > + + > > + @ $ $ ~ u.:+<+(+:+:+:+:+(+:+:+:+:+4+u.[.M.U.W.W.Z.U.U.U.U.Z.W.W.R.U.`.#+R.k.8 # @ + . + . . . . . @ % = ~.`.W.#+U.U.U.U.U.U.U.U.Y.R.R.W.#+G.m q =.*.*.=.*.=.=.*.=.&.q = * % = $ $ @ % @ @ % @ @ @ $ % % $ $ @ $ $ @ = , O *.&.=.*.=.'.%.*.*.=.*.>.k o B A A A B B B A B A B B A y w 3 * * % % % % @ @ @ @ @ % & * * 3 w w w w x y B B B B B B B B B B A 8 H <.<.<._.<._._._._.<.<.<.<.[.F ^ ~ > + $ + + + + . + + + . $ 7 [.[.<./._.<./.<./._.<._._._.<.<.<.<.F ", -"N i.j.e.f.0.f.d.9.j.9.9.f.f.5...1 , = @ - . + . # @ @ . - @ @ $ , s 2.i.0.9.d.f.9.9.j.9.9.j.9.9.9.e.u r.v+C+z+y+w+z+z+z+z+w+z+z+z+z+y+z+z+E+w+v+y+j+[.. % & & % % ; ~ >+E+F+y+z+A+z+z+w+y+z+z+y+w+z+z+C+G+'+h.$+9+9+|+|+9+}+}+}+}+}+}+f+2+N.h./ . # . + . @ @ . @ @ . @ @ . . - 5 C.8+}+}+}+|+|+f+9+f+}+}+9+b+9+$+7.X.u+s+s+k+h+h+h+h+k+t+t+k+e+~+R & % @ - # $ + = = $ $ + $ $ $ & ! :.~+k+s+s+k+l+d+h+s+s+k+l+k+k+t+d+6.n M Y +.Z ` U +.Y Z Z Z Y Z Z Z Z +.X U Z Z ` Z i * @ @ . - - . . % } ` +.+.Y +.+.Y Y Y Y Y Y Y Y @.d k.a+^+_+(+<+:+3+:+:+(+(+3+3+3+F + + $ $ + # . + + + + + + + + + + $ + + u.4+<+:+:+(+:+:+:+:+:+:+4+0+u.}.M.U.W.W.U.U.U.U.U.U.U.U.W.L.L.`.J + . . . . + + + . . . # @ # @ = v @+U.U.U.U.U.U.U.U.U.Q.R.Z.Z.#+G.m #.=.=.=.*.=.=.=.=.*.=.q @ & % @ + @ # @ # # . # # % @ + % + + # + @ % @ $ O *.=.&.=.=.'.=.*.=.=.=.%.k o A A A B B x B B x B B w w w 2 % @ @ $ @ @ . . . . @ # # @ @ # * ; o I w A x y x A B B A B B B B A 8 8 <.<.<._.<._._.<._._.<.<.[.F 8 $ + + + + + + . . . @ # + + # + 4 _.<.<.<.<.<.<._._.<.<.<.<.<.<._.<.F ", -"N 0.j.e.d.0.f.b.e.9.d.9.f.f...1 = + + + . + + $ $ % % % % % # % $ : u |.i.i.9.f.d.9.9.j.9.9.9.9.9.e.u I.y+C+z+y+G+z+z+z+z+z+z+z+z+z+w+A+E+F+z+y+x+T.@ @ % % % @ @ & + >+D+E+y+y+C+z+z+y+w+z+z+z+z+y+F+A+G+'+h.%+9+9+}+|+9+9+9+}+}+9+}+f+%+5 ) @ % @ % $ + . + . . . + * * $ @ . - 5 &+2+f+|+}+}+|+9+f+}+}+f+9+9+$+m.*+u+s+s+k+h+s+s+h+k+t+t+t+k+R # @ $ . + . + + + + @ $ $ $ $ $ $ + . c.~+t+t+s+s+k+k+s+t+l+d+s+s+t+l+6.n @.+.+.` ` U +.Z Z Z Z Z Z Z Z Z Z Z +.+.Y P n ' @ @ . . . . . . @ } P Y +.Y . .Y Y Y Y Y Y Y Y @.d u.6+a+_+(+<+3+4+3+:+(+:+3+3+)+8 + + + + + . @ @ . @ @ @ @ # @ . . + + + u.0+:+3+:+3+:+:+3+:+:+:+(+0+u.[.Z.Z.Z.U.U.U.#+U.U.U.U.U.W.Z.M.J . . . . . . + + + . . . . @ . . @ $ :.#+Z.Z.U.U.U.Z.U.U.R.W.U.Z.#+G.v #.*.=.=.=.=.=.=.=.=.=.j + @ + # + + . # . . @ . . # . @ @ . @ # . @ . # @ j =.=.'.=.=.=.=.*.=.=.=.=.k o B A B B B B B x x B w I w ; * @ . . @ . . . . . . . @ @ # . . @ & 2 l I A z z B B B B B B B B B A 8 f <.<.<._._.<.<.<.<._.<.<.a.$ @ @ # $ + @ @ . . . . @ @ . . + $ + _ H [.<.<.<.<.<.<.<.<.<.<.<.<._.<.9 ", -"Q f.j.j.0.0.f.d.j.j.9.9.9.5.s ~ @ . . . - . + $ $ $ @ # . . # @ % = : N i.5.9.9.d.9.f.j.9.9.9.9.j.e.u r.y+C+B+y+z+z+z+z+A+z+z+z+z+A+E+E+E+G+G+m+a._ . # @ @ @ . . @ + m+F+z+x+y+z+z+z+y+y+z+z+z+z+y+z+A+G+'+h.%+9+9+|+9+f+f+9+f+}+f+f+2+m.- - $ $ & % = = # . . % @ = * % $ # . - . L %+9+}+}+}+}+f+9+}+}+9+b+9+$+7.X.u+s+h+k+h+s+h+s+d+k+l+n+c.{ @ $ = $ $ + . + + @ + + + . $ $ + . . b E.n+k+s+k+k+s+r+r+l+d+s+t+o+d+B.c @.+.+.Z ` Y +.Z Z Z Z Z Z Z Z @.X Y +.+.` n } * @ @ @ . . @ % @ @ } ` +.X Z +.T Y Y Y U Y U Y Y @.i q.3+^+_+^+<+:+3+:+:+:+:+3+3+M.8 + . . . . . @ @ @ @ @ @ @ @ @ . . . + $ u.4+4+:+(+:+:+:+3+(+:+:+4+p+u.}.Z.Z.Z.U.U.U.U.U.U.U.U.U.U.M.J . + + . . . . . . . + . + . + . . + . @ w.#+#+W.W.U.#+W.W.@+`.R.Z.#+G.v q =.=.=.=.=.=.=.=.=.*.j + $ @ + + . + $ + + @ $ + + . @ . . @ . . + . # + O *.%.=.=.=.=.>.>.=.=.=.*.k o B A A x B B B B B A w I h % # . . . . $ @ @ . @ % @ @ + . . . @ % * 2 l w x x y B x x B B B B B E f F <.<.<._.<.<.<.<._._.<.<.9 @ @ @ . @ . @ @ # . . + + + + + + . . $ 4 H <._._.<._._.<.<._._.<.<.<.<.].", -"Q 0.9.b.0.0.f.b.j.9.9.j.j...: . # @ . - . . $ , 9 : , $ . . . - # . $ 1 2.i.9.d.d.9.9.9.9.9.9.9.9.b.u r.x+D+z+B+v+z+z+z+w+w+w+z+z+w+w+w+G+x+ +W > + . @ @ . - . . + + '+E+y+y+v+z+y+z+w+v+v+z+z+w+v+y+C+G+>+h.%+9+|+}+}+}+}+|+}+}+}+7+J.5 . @ $ $ # . $ @ - L L L . + @ $ $ + + . . - %+b+|+|+|+}+|+|+}+}+|+9+9+%+7.X.u+h+k+k+d+h+k+h+d+t+k+X.& % . $ + $ + @ b c.E.E.6.# - . # + + - . & c.n+k+k+k+k+k+k+s+k+d+k+s+e+~+6.n P +.X ` ` ` +.Z Z Z Z Z Z Z Z @.+.U +.` n } % @ @ @ # @ % % % @ @ } P @.U Z U +.Y Y U Z Y U U Y @.i q.:+:+_+:+:+:+:+:+:+:+:+<+3+u.~ . . @ @ . . # @ # @ # @ # @ . + . . . $ u.{+1+(+:+:+:+:+:+:+:+:+4+0+u.}.M.U.U.U.R.W.U.U.U.U.U.U.U.}.. . + + . + + @ 8 J F.7.< . . - . . + . . 8 M.U.W.U.U.W.U.W.`.Z.R.R.#+G.m q =.=.=.=.=.=.=.=.*.#.k @ $ @ + + @ . @ + + . @ + + . . . . . . . . . @ = O >.'.&.&.&.'.%.#.>.&.=.*.k o B A B x B B B B B A I l % @ # + . . . @ @ * 8 l f @ @ @ # + @ @ @ @ ; 3 w B x x B B B x B B B B B 2 F <.<.<._._._.<.<._.<._.H = + # . . . . @ - _ J F 8 $ + . + + . . + $ F [.[._.<.H _.<.<._._.<.<.<.<.F ", -"N i.j.e.f.0.f.b.f.f.9.b.9.N , - . % @ + $ = 1 D l...N : = = $ $ + ) . , N i.9.e.d.9.9.9.9.f.9.9.9.b.u r.y+A+y+y+w+z+z+z+w+w+w+z+z+z+z+y+m+x.[ + % * % & % % . - # @ + T.E+y+x+v+w+y+y+w+w+z+z+y+v+w+z+A+G+'+h.$+9+b+}+}+|+}+}+}+}+}+}+m.- $ = $ $ . ) / 5 m.$+$+$+z.) + + + + + + . . n.|+|+}+}+|+}+}+}+}+|+|+f+$+7.X.u+k+k+k+l+s+h+h+k+s+d+y.* % + + - % . ! E.~+n+e+d+:.{ # # @ . . - % -.~+n+k+k+e+k+s+t+k+d+d+s+t+n+c.c @.X U @.` Z +.@.Z Z Y Z Z Z Z Z U +.+.P d ; - - + . . # @ @ @ . # } P Z Y @.` U Y Y Y Y Y Z Z Z @.d q.a+^+_+(+<+:+(+:+:+:+:+:+3+(.@ . . @ # @ @ . . . . . . . . . . . . # . u.{+:+(+:+:+:+:+:+:+:+(+4+0+u.[.Y.U.W.U.W.W.U.U.U.U.U.#+w.8 . . . . . + + { w.W.`.++q.; . + . . . . + . w.R.U.U.U.R.Z.U.R.Q.Z.W.#+G.v q =.=.=.=.=.=.*.*.*.#.k . . . . . + . . . . . . . . . . . . . . . . @ # < #.*.&.&.=.&.=.*.>.*.&.=.>.k o A A A x B B B p A w w l @ % @ - . . @ % * l v I I f ; % @ @ @ + . @ % f A y y B B B B B B B B x B f H <.<.<._.<._.<._._.<.<.7 $ + - . . . . @ a }.[.[.[.F ~ + + + . . . @ ~ _.[.<.<.<.<.<.<._.<.<._.<.<.F ", -"N i.j.j.9.0.9.b.i.j.8.j.Q : $ . @ $ . . $ 1 Q i.i.i.0.Q : $ + $ $ . + = : 5.b.b.0.9.9.9.9.9.9.9.9.b.u I.y+C+G+y+z+C+z+z+z+z+z+y+G+j+ +x.W - . @ % & # @ & @ . - # % = +F+E+y+z+z+z+z+w+z+z+z+z+w+z+F+A+G+'+h.%+9+b+}+|+9+9+|+|+|+9+$+b . % % @ % % # 5 n.8+f+9+b+2+K.) . + + $ $ @ @ L $+2+}+|+|+|+|+}+7+|+b+b+$+3.X.u+h+h+k+h+q+h+s+k+l+[+R % @ $ @ % @ % R ~+k+s+l+s+[+b @ @ . - . + % R ~+s+t+t+k+d+h+s+k+k+k+r+r+e+y.c P +.+.U ` Z +. .+.Z Z Y +.Z ` +.G +.M } ; % + . . . . @ @ @ @ . @ } ` +.X @.` @.Y Y Y Y Y Z @.+.@.d u.3+4+_+_+<+3+<+3+:+:+(+0+0+J . . . . . # @ 7 <._.C C /.a._./.W /.].C C v._+3+3+(+:+3+(+3+(+:+3+{+0+u._.Y.#+.+U.U.U.U.U.U.U.U.U.}.@ . . . . . . # }.U.#+W.W.#+).. . . % % 8 8 :.M.W.U.U.U.W.W.U.U.Z.Z.#+#+l.k q =.=.=.&.=.=.=.*.>.#.O j j m m j | m m j m j m m m 4 $ . . . @ + . * m q *.*.=.=.=.&.&.*.*.=.=.=.%.k o A w A B B B B y A B A l @ @ - . . @ @ * 3 A z A A w 2 * % . . . . @ @ * x ;.I B B B B B B B B B A 2 4 <.<.<._.<.<.<.<._._._.= $ + . . @ # + ~ [.<._._.^._.F > + + . @ @ @ + 9 _.<.<.<.<.<.<.<.<.<._.<.<._.", -"Q i.e.j.0.0.j.b.i.d.8.j.s = @ + $ @ - - = u i.e.d.9.d.2.1 + - . @ @ $ $ = ..j.8.i.9.9.9.9.9.9.9.e.e.u r.y+C+z+y+y+z+z+z+z+z+z+y+g+a.~ { . # . . @ . . @ % . . . . @ = T.E+E+y+z+C+z+z+z+z+z+z+z+z+z+F+A+G+'+h.%+b+9+|+|+|+9+9+|+|+b+$+< . @ # @ @ $ @ 5 %+8+}+9+b+b+9+) . . + $ $ % % 5 &+2+f+|+9+9+9+}+7+9+5+b+$+7.X.u+q+h+k+h+q+q+s+k+l+n+X.E.R R R ! % % E.s+t+k+k+l+s+b @ + . - . + % R X.t+t+s+k+l+h+q+k+l+s+t+q+d+6.c ` .X Z ` Z +. .+.Y @.+.+.Y ` .T @.i ; @ + $ @ @ @ @ % @ + @ . @ } ` +.+.Z Z @.Y Y Y Y Y Y Y X +.d q.6+a+3+{+<+<+<+3+:+(+(+0+4+9 . . . . . . { u.:+:+!+!+^+1+(+=+1+^+1+!+^+^+^+4+3+:+:+3+3+3+(+:+^+^+4+u._.Z..+#+U.U.U.U.Z.Z.Z.#+M.J . . . . . . # 8 U.#+Z.U.U.W.M.J }.}.w.w.w.M.M.W.U.U.U.U.U.Z.Z.`.`.R.#+,+q.k q &.=.*.=.=.=.=.&.=.*.*.*.=.>.%.%.*.*.q &.=.&.=.*.#.4 $ + . @ @ + + j q >.>.*.*.*.=.&.&.*.%.*.=.=.%.k o B w w B B B B x B x A l @ . . . . @ % ; w z z x z A h * @ + . . . @ % ; w ;.I A B B B B B B B B B 2 F <.<.<._.<.<.<.<._._.F $ @ + + . @ # + F <.<.<.<.^._._._ + + . @ % @ + ^ _._.<.<.<.<.<.<.<.<.<.<.<.F ", -"N i.e.j.f.0.0.b.j.d.d.j.u = @ + $ @ - - , N i.e.d.d.d.i.s + - . + @ $ $ = ..i.b.0.9.9.d.f.9.9.9.9.b.u x.v+C+z+y+z+A+z+z+z+z+E+G+>+W . # # + . . @ . @ @ % @ . . . @ > T.E+E+v+z+C+z+z+A+z+z+z+z+y+z+z+A+G+'+o.%+9+9+}+}+|+9+9+|+|+9+$+5 / - - . - + - h.2+7+9+b+|+9+7+5 - . . @ + @ @ 5 $+7+9+9+f+f+9+|+}+9+5+b+$+7.X.u+s+h+k+h+s+s+s+k+k+s+l+s+~+[+X.E.c.6.[+o+o+t+k+t+~+b % @ + . # @ % R ~+t+t+s+k+l+h+q+k+l+t+t+l+d+6.c P .+.` ` U +.+.Y ` Z +.+.Y @. .U n ( % . + + @ & ; * @ @ @ + . # } ` .+.@.U U Y Y Y Y Y Y Y Y X d q.6+3+^+(+<+6+^+4+:+(+4+0+!+4 . . . + + . 8 V.4+0+0+0+0+3+3+0+0+4+3+4+p+6+3+!+:+:+:+:+:+3+:+:+4+:+4+u.[.Z.W.#+W.U.U.U.Z.U.U.#+w.8 . + . . . . @ J #+#+W.U.U.#+#+W.#+U.Z.#+#+R.Z.W.W.U.U.U.U.Z.Z.U.R.R.R.#+G.v q =.=.=.=.=.*.=.&.=.&.=.=.*.*.%.*.=.=.>.&.&.&.'.>.j @ + . . # . + = q *.*.*.*.=.=.=.&.=.>.>.'.=.*.>.k o B A E B B x B x A B A l @ . . . . . % * l w w A x w f * @ + + . . % * l I w B B B B B B B B B B A f J <.<.<._.<.<.<.<._._.H @ @ + + . # # @ F <.<.<.<.<.<._.4 $ + . # @ @ + ~ _._.<._.<.<.<.<.<.<.<.<.<.F ", -"N 0.9.b.d.0.0.b.j.9.d.i.1 $ # + $ @ . . , Q 0.9.9.d.d.i.t $ . + + @ @ + $ D j.e.0.9.9.e.f.9.9.9.9.b.u a.y+A+y+v+w+A+z+w+w+w+A+z+g+H % % @ # @ . @ . ) @ @ @ . . . @ { T.E+A+w+y+A+z+z+w+z+z+z+A+w+v+y+A+G+'+o.%+9+9+|+|+}+9+9+|+|+|+7+N.C.n.C.m.n.m.7.C.7+9+5+5+|+f+%+/ . . + . . + + L %+}+|+9+f+9+9+}+}+b+5+b+$+3.S.u+q+k+k+h+h+h+k+e+t+k+s+r+s+s+t+s+n+e+t+o+t+e+s+e+R { @ + + + # # ' 6.e+s+t+s+l+d+h+s+k+k+k+s+q+n+c.c ` +.+.` ` U +.@.` ` Z Y +.Y @.@.n } * + . . + * ( 3 * # @ @ + . @ } ` .+.@.Z U Y Y Y Y Y Y Y Y @.d w.3+^+_+(+<+:+:+4+(+:+{+4+P.~ . . . + + . J ,+p+1+ +O.O.P.P.!+0+0+(+{+:+:+3+^+:+:+:+(+(+:+:+:+:+(+4+u.[.U.U.U.U.U.U.U.W.W.U.#+}.@ . . . . . . % ).)+#+#+M.w.w.w.M.F.Z.Z.U.U.R.U.U.U.U.U.U.U.U.W.@+U.Q.R.#+G.m q =.=.=.=.=.=.=.*.*.=.*.*.*.*.*.=.*.>.&.%.*.'.#.O | + + . . @ + = m *.*.%.*.=.*.%.*.&.=.>.>.=.'.%.>.k 3 A B B B B B B B x B x l % . . . . @ @ & f I I w A w l * @ . . @ @ @ * o w A x x B B B B B B B B w 8 F <.<.<._.<.<.<.W _._.g + $ + . . + + @ F <.<.<._.<._._.8 @ . . . @ @ + > H _.<.<.<.<.<.<.<.<.<._.<.F ", -"Q f.9.d.f.f.9.d.9.9.d.i.: @ # + @ @ . . : Q 0.e.9.9.8.j..., # + + @ @ . + 1 j.e.f.9.9.9.9.d.9.9.9.e.u x.v+A+z+y+v+z+z+w+w+w+A+y+>+H % % + + @ . 9 ].g . . @ @ . . . ~ +D+E+w+w+A+z+w+w+w+z+z+A+w+w+z+A+G+'+h.%+b+b+|+|+}+|+|+|+|+|+9+f+f+f+9+7+f+7+;+%+}+9+b+|+}+8+n.{ + . + + . . . h.;+|+|+|+f+|+|+|+}+9+5+b+%+3.X.u+h+k+e+k+h+h+h+k+s+h+s+s+k+s+t+s+k+t+k+e+*+X.X.R % @ + + $ + . + I ]+n+s+s+l+d+d+k+s+k+l+k+s+q+n+c.c ` +.+.U ` U +.` ` ` Z Z .@.P n } ; @ . . @ + ( e r ; @ . + @ # @ } ` .+.Z Z U Y Y Y Y Y Y Y Y @.d q.a+a+_+:+<+^+:+:+:+<+(+4+s.~ # . . . . . J w.[.W g 4 4 4 F F u.{+:+0+{+:+:+:+:+:+:+(+:+(+:+:+:+^+4+u.[.U.Z.`.U.W.U.U.U.W.Z.#+}.. + + . . . . @ k.V.w.k.8 8 8 8 8 a }.}.U.U.U.U.U.U.U.U.U.U.U.W.++U.R.Z.#+G.m q '.&.=.>.*.=.=.=.*.*.*.=.=.=.*.*.*.>.=.'.*.#.O | , . @ . @ $ = j O *.%.%.=.=.%.'.*.=.=.*.*.*.=.*.>.k o A A A B B B x x x x x w ' @ . . . @ @ % * l w I h 3 * @ . @ + @ @ @ * o A x y y B B B B B B B B E 8 F <.<._._.<._.<.^.<._.g + + . . @ + . @ F _.<.<.<.<._.[.4 @ . . . @ @ + + 9 _.<._.<.<.<.<.<.<.<._._.F ", -"N i.b.j.f.0.f.d.f.d.d.i.: . . + @ @ . + : Q j.e.j.9.8.e.5.: @ + + @ @ . . 1 i.e.f.9.9.e.9.9.9.9.9.b.u x.y+A+z+y+y+z+z+z+w+w+A+y+m+W @ $ + . > W T.j+W . @ @ @ . . @ = T.D+E+w+w+z+z+z+w+z+z+z+z+w+z+z+A+G+'+h.$+9+9+}+|+|+|+|+|+|+}+9+|+|+|+|+f+f+}+|+|+f+|+9+7+2+J.5 @ @ + . . . . - C.}+9+|+}+7+7+|+|+}+|+5+b+%+3.X.q+h+k+k+k+s+h+k+k+l+u+d+u+d+s+s+s+k+k+d+[+R b b . % @ # + . @ # b E.n+k+t+s+d+d+l+s+s+k+e+t+s+r+d+c.n P .+.` ` Y +.@.` @.U +.+.` M } ; % . - # % ; e M i ' @ . . @ # # } ` .+.Y Z U Y Y Y Y Y Y Y Y @.d k.a+^+_+:+:+^+3+3+:+:+4+4+<.~ + . . . + + { { # @ @ @ @ + @ # . F u.)+0+(+<+4+3+:+:+(+:+:+:+:+:+(+4+u.}.W.W.`.U.U.U.W.W.W.W.U.J . + + . . . . { w.w.8 @ . + . . . . . { J M.U.U.U.U.U.U.U.Z.U.Z.++`.R.W.#+G.m q =.=.=.*.*.=.=.=.*.=.=.=.=.=.=.=.%.=.*.&.*.#.j = $ . @ . @ @ | #.#.*.*.*.=.=.%.=.'.'.=.*.*.=.=.=.%.k o A A B B B x B B x x B A l ; @ . . . . @ % * * 2 * * @ @ @ @ + @ % % f w A x y r B B B B B B B B A f 9 <.<.<._.<.<.<.<.<._.H + + + . @ . . + H <.<.<.<._._.[.4 + @ . @ @ @ + + , _./.D <.<.<.<.<.<.<.<._.F ", -"N i.j.j.d.0.0.8.9.d.d.Q , . . + @ @ . + 1 2.j.e.j.0.b.j.5.: @ + + @ . . - , i.d.0.9.9.d.9.9.9.9.9.b.Q x.y+A+A+y+z+A+z+F+z+w+z+z+m+W . + ~ W H.m+y+m+].. # @ @ . . @ > m+D+F+z+z+C+z+z+w+z+z+z+z+z+z+F+A+G+'+h.$+9+|+}+|+9+9+9+}+}+f+9+|+}+|+}+}+}+}+}+|+f+|+9+7+J.5 - % % + + - . ) a %+9+b+9+|+7+}+9+}+7+9+5+b+$+3.X.u+h+h+k+h+q+s+s+k+l+l+l+h+d+s+s+t+s+h+l+[+; @ + + $ . . # . @ R X.d+s+t+s+h+l+l+u+q+r+k+e+t+s+r+d+B.n @.+.Y ` ` Y +.Z @.Y U .X M e * @ + - - & ' d ` ` n ' @ . . @ # # } ` .+.Y Z U Y Y Y Y Y Y Y Y @.d k.a+_+_+:+:+3+3+3+:+(+4+4+H + + . . . + + . . . @ @ @ @ @ @ @ . . @ }.=+4+:+(+3+(+:+3+3+:+:+:+^+(+p+u.[.U.W.W.W.U.U.W.W.W.W.U.J . . . . . . . { J { . + + + . . . . . . @ 8 w.U.U.U.W.U.U.Z.Z.W.++`.R.Z.#+w.v q =.=.=.=.=.=.=.*.=.=.=.=.=.=.=.=.*.&.%.=.*.O | % % . @ @ @ = j %.%.*.*.=.=.'.%.=.&.'.=.*.>.%.&.=.%.k o A B B B B B B A y y B x w 2 * . . . . @ @ @ + @ @ # @ @ @ # . % * f l A A x z x B B B B B B x B B 2 H <.<.<._.<.<.<.<._.].F $ $ + + . @ @ + 9 _.<.<._.<.<._._ + @ . @ @ @ + + ^ <./.D _.<.<.<.<.<.<._.<.F ", -"N f.e.d.f.f.f.b.9.9.f.Q , . - + $ @ . $ 1 5.j.e.9.9.b.e.5.: @ + + @ . . - , f.d.d.9.9.f.9.9.9.9.j.e.Q x.y+C+A+y+G+A+F+G+z+z+A+G+>+W ^ _.x.m+y+y+D+v+].- @ % % . . + . m+D+F+z+z+C+z+z+z+z+z+z+z+C+G+F+A+G+'+h.%+b+b+}+|+9+9+9+}+}+9+9+9+9+|+}+f+}+}+}+9+9+9+9+N.5 . % @ @ # + . . / ].2+9+b+9+f+f+f+9+}+7+|+5+b+$+7.*+u+q+s+k+h+q+s+s+k+s+s+t+s+k+t+k+o+r+q+l+X.& + + + $ + - - . { c.[+n+r+t+t+h+l+l+q+q+q+k+l+s+s+q+d+6.n P +.X Y ` Z +.Y Z Z +.+.@.n } @ . . . % ; d M +.+.n ' # . . @ @ @ } ` +.+.Z @.Z Y Y Y Y Y Y Y Y @.d q.p+^+_+(+<+6+:+(+:+(+4+p+F . . . . . + + + + . . @ # # @ . . @ + + $ [.6+4+<+:+(+:+3+3+3+(+:+^+3+p+u.[.Z.W.W.W.U.U.U.W.U.U.U.J . . . . . . . + @ . . + . . . . + . . . . + 8 M.U.U.W.U.U.U.W.W.Q.R.Z.U.#+w.v q =.=.=.=.=.=.=.=.=.=.=.&.=.=.=.=.=.&.,.%.%.k = @ # @ @ % @ 4 #.%.'.=.=.=.=.'.'.=.&.'.=.*.*.*.=.'.>.k o B B B x B B B A x x B y B l h @ @ . + @ . @ . @ @ @ # @ # . . * f I w A B x y y B B B B B B B B A f F <.<.<._.<.<.<.<./._.].$ . + . @ @ @ # ^ F <.<.<.^.^.9 > @ @ . @ @ @ . @ ~ <.<._.<.<.<.<.<.<.<._.<.H ", -"N 0.e.e.0.0.f.9.9.d.d.Q , . - + @ @ . + 1 5.j.d.9.e.8.d.5.: . + @ @ . - - , 0.9.d.9.9.9.9.9.9.9.9.b.u r.y+A+z+y+A+A+z+z+w+w+z+G+m+T.T.m+x+x+y+w+D+w+a.. @ % @ . . @ + T.E+E+y+w+y+z+z+w+z+z+z+y+w+y+z+A+G+'+h.%+9+b+9+}+|+9+|+|+|+}+9+b+9+|+}+7+|+|+|+7+f+;+n.5 @ + % % % + + . - L $+}+9+b+b+|+}+7+9+}+}+|+b+b+%+3.S.u+s+k+k+s+s+k+h+l+k+k+t+k+k+t+l+s+s+e+n+X.* @ # . $ @ - - . - ) R E.[+e+t+t+k+s+u+h+q+k+l+k+t+t+d+c.n P +.+.@.` Z +.+.+.Y +.` d } * . . . @ ; } M @. .+.n ' . - . @ # @ } ` +.+.@.` U Z Y Y Y Y Y Y Y @.d u.3+a+_+(+<+<+:+(+:+:+4+^+7 + . . . . + . . . + ] + . . . + @ @ . . + + s.3+6+3+:+(+:+:+3+:+:+3+3+0+u.[.Z.#+W.W.Z.U.U.W.W.U.M.J . + . . . . . . . # # @ % $ . + + . . . . . . J M.U.Z.U.U.U.W.U.W.W.Z.W.#+G.m q =.=.=.*.*.=.&.=.*.=.&.=.=.=.=.&.'.{.*.#.O < @ @ . @ @ @ < C %.=.=.*.=.=.=.=.=.=.=.&.=.>.*.%.'.=.*.k o A B B B B B B y y y A A A I f @ @ . . @ @ @ @ @ @ @ @ . . . . % f l I A x x y y A B B B B B B x x f 8 <.<.<._.<.<.<.<./.<._.4 + + + @ . # # $ , F F F H g > + + . . @ @ . . + ~ _.<.<.<.<.<._.<.<.<.<.<.9 ", -"N f.j.e.0.0.f.d.9.d.d.Q , . # + @ @ . + : 5.j.e.9.9.8.d.5.: . . + @ . . . , i.9.d.9.9.9.9.9.9.f.f.b.u a.y+A+z+v+w+z+z+w+w+v+w+z+z+A+z+z+w+w+w+w+z+m+a.. @ & . . # % $ T.E+A+y+v+y+y+w+w+w+w+z+z+v+w+F+E+G+>+h.%+9+|+|+}+}+|+}+|+|+}+|+b+|+}+7+2+}+|+b+2+N.7.. + $ @ . % & @ $ - L ;+b+|+|+|+}+|+}+|+|+}+}+|+b+9+$+3.S.u+k+k+k+l+h+k+k+l+h+k+h+d+k+d+d+d+k+[+n+E.{ % + + @ @ + + + . . + - y.[+o+o+s+s+l+d+s+h+d+k+e+t+d+6.c ` X +.` ` Y +.+. . .` n ' @ + - - # ; } M @.+. .@.e ' . - . @ . # } ` +.+.Z @.U Y Y Y Y U Z Y Z @.d q.<+<+^+(+1+(+(+(+(+:+(+v., . . . . . + . - 8 /.s._.F ~ + @ @ . # @ . @ $ {+{+:+<+(+:+:+:+:+:+:+(+0+u._.Z.Z.U.R.R.U.U.U.Z.R.M.8 . + . . . . . . . . 8 J :.~.f @ . . . + . . . @ w.U.U.U.U.U.U.W.++U.Z.R.W.w.m *.=.=.=.=.=.=.=.=.*.*.=.=.=.=.*.=.'.!.*.O 7 @ . . + @ @ = j *.'.=.=.*.=.=.=.*.=.=.*.=.&.>.>.%.'.=.*.k 3 B A A x B B y p B x w l h 8 . . . . . @ @ @ % % % @ % @ @ # . . > * h A y x A A B B B B B B B B A f J <.<.<._.<._.<.<._._.<.D 7 + . . . @ @ # @ @ % ! % # . . . . . . @ @ @ + ~ _.<._._.<.H <.<.<.<.<.<.F ", -"N 0.j.d.f.0.0.8.9.9.d.Q , . # @ $ @ . + 1 5.i.e.f.9.8.e.5.7 @ . . . . . - : i.d.d.9.9.j.9.9.9.9.f.e.u x.y+C+z+x+v+z+z+z+z+w+z+A+z+z+w+z+G+z+w+v+z+v+a.. @ % . . # % = '+D+A+w+y+z+y+z+w+w+y+G+z+w+w+F+E+G+'+h.%+b+9+}+}+|+f+}+}+}+}+|+b+9+}+}+}+}+}+7+N.L - @ $ + $ @ @ @ . - L 8+7+|+9+9+|+}+}+|+9+|+|+}+|+b+9+%+m.X.u+h+h+k+l+h+h+k+k+k+l+k+l+k+l+k+s+k+k+l+E.a b b b b % # . . # . # . a X.n+t+s+k+h+h+s+k+d+h+s+t+d+6.n M +.+.@.` U +.Y Z Y M i ; @ + . @ & ( e P @. .+.@.n ' @ + # @ @ @ } ` Y Y @.Y X Y Y Y Z Y U Y X @.d u.6+4+3+(+<+(+(+:+{+(+4+P./.F 4 8 _ ~ > ^ }.)+0+0+0+{+u.8 # $ . # @ @ + $ w.{+:+:+^+(+:+:+:+:+(+(+4+u.[.Z.U.W.U.U.U.U.U.W.R.F.J . . . . . . . . . 8 F.`.@+#+R.}.@ . . . . . . . J W.U.U.U.U.U.W.@+`.Z.R.#+G.m #.=.=.=.=.=.*.*.=.=.=.=.=.=.&.=.=.=.&.%.j < @ . . . @ @ = k %.&.=.=.=.=.=.=.*.=.&.=.&.&.*.>.=.=.*.>.k 3 B A A B B x x x x A A l 2 @ . . . + . # % * * * * % % @ @ @ . + . & ; o x A w A B B B B B B B B E 8 F <.<.<._.<._.<.<.<._.<.F H + @ . . . . @ # . . . . . # @ + . . . @ $ $ . _ <.<.<.<.<.<.<.<.<.<._._._.", -"N i.j.b.0.0.j.b.9.d.d.5.: . . + @ # . + 1 2.j.e.0.9.8.e.5.7 @ . . . . . . : i.9.f.9.j.9.9.9.9.j.j.e.u x.y+C+z+y+w+z+z+z+z+z+z+z+z+z+z+G+B+z+z+z+G+v+a.# % @ . . . @ ~ m+E+E+y+z+z+y+z+z+y+z+y+z+z+z+F+A+G+'+h.%+b+9+}+}+}+9+9+9+|+}+9+|+9+b+|+f+2+%+K.5 - - $ $ $ % @ # . 5 L $+2+2+}+|+9+}+9+9+|+f+9+}+}+9+9+9+%+m.*+u+s+h+h+h+s+s+h+h+l+l+s+s+k+s+q+s+s+s+k+X.X.~+~+X.E.b # . . . . @ + # c.~+u+h+k+s+s+r+l+l+s+t+t+l+B.c P .+.` ` U +.Z U ` e ( @ + + @ % ; r e M P @.` M d ' @ . @ % % @ ( M ` M ` Y .Y Y Y X Y Y Y Y @.d q.6+^+4+(+<+3+4+4+(+{+4+3+0+a+O.O.O.u._.s.!+0+0+(+(+0+0+w.+ @ . . + $ + + H 0+3+:+_+:+3+3+:+:+4+4+4+u.[.U.Z.W.W.U.U.W.W.W.U.U.J . . . . . . . . 8 M.#+W.W.U.#+#+J . . . . . . . ! M.#+U.U.U.U.#+Q.R.Z.Z.#+G.m #.&.=.=.=.=.=.=.=.=.&.=.=.=.*.=.=.=.'.>.m $ . . . + @ $ | #.%.&.=.=.=.=.=.=.=.*.*.=.&.=.>.>.=.=.*.>.k o w A A B B B B x y A w 2 @ @ + . . + @ % * h f l v l * % @ . . . . @ * 2 A x A A B B B B B B B B A 8 J <.<.<._.<.<.<.<.<._.<.<.D 4 > . # . . @ . . + + + + + { @ . . # @ @ + . [ <.<.<.<.<.<.<.<.<._._._.F ", -"N i.j.e.0.0.9.d.0.b.d.5.| @ # + @ # . + : 5.i.9.9.f.e.j.5.: . . . . . . + : f.j.0.9.9.9.j.9.9.j.9.e.u r.y+C+z+y+G+z+z+z+z+z+z+z+z+z+w+y+z+z+z+z+z+v+a.# % % . . . @ + T.F+E+y+z+z+y+z+y+z+z+z+z+y+B+F+A+C+'+h.%+9+|+9+|+}+9+9+}+}+9+}+}+|+|+|+7+$+m.5 - @ % $ = $ % . - / C.8+f+7+|+|+|+9+9+|+|+|+|+9+}+}+f+9+9+$+7.X.u+s+h+l+h+s+s+h+h+s+t+s+s+s+s+r+t+r+k+s+q+s+s+k+l+d+E.b . + + . @ $ $ ! E.s+s+h+s+s+s+l+l+k+t+s+d+B.c @.+.+.@.` U +.Z Z P ( ; # + + @ % * 2 3 } d i e d ( * @ . @ % @ @ ' } d e n ` .@.Y Z Y U U Y Z Z d q.a+<+_+(+<+3+:+(+(+:+:+:+4+(+4+3+4+4+4+4+4+^+(+4+:+(+0+O.= . . . @ @ + + = 4+3+:+:+<+3+:+:+:+4+4+4+u.}.Z.#+.+W.U.#+W.W.W.Z.Z.J . . . . . . . @ J #+U.U.U.W.U.W.M.+ . - . . . . . w.#+U.U.U.U.#+R.W.#+R.#+G.v #.&.=.*.*.=.&.=.=.=.=.=.&.=.=.=.&.=.,.#.< $ @ . . + @ + j %.%.&.=.=.=.=.=.=.&.=.=.=.&.=.=.*.*.&.=.>.k l w A A A B B x y B A I * % . . . - . % * l w w w 0 I h * @ . . . . . @ ; A A A x B B B B B B B B E f F <.<.<._._.<.<.<.<._.<.<.<.F H ] + + + . . + $ + $ $ 9 F $ + . @ @ # . . ~ _.<.<.<.<.<.<.<.<.<._.<.F ", -"N f.j.e.9.0.0.8.0.9.d.i.: + . . @ % # + : Q j.9.0.0.d.e.Q , - . . . . . + 1 j.j.0.9.9.9.9.9.9.9.f.e.u r.v+C+z+y+y+z+z+z+w+z+z+z+z+z+w+y+z+z+z+y+z+v+a.# % & . . # % { T.D+F+w+y+y+y+z+w+w+y+z+y+w+w+y+A+C+'+h.%+9+9+|+}+}+|+}+}+}+}+}+9+|+}+7+$+7.) - @ % $ @ @ @ . ) L J.2+}+f+f+|+|+|+|+|+|+|+|+|+f+|+|+|+|+9+$+3.X.u+h+h+d+h+h+h+h+d+k+o+k+t+k+k+k+k+k+k+k+h+s+k+k+s+u+s+c.# + + . + $ $ # E.s+k+s+t+t+s+k+l+d+s+t+l+c.n P +.+.` ` U X Z ` M ; % . - + + . . # @ & % & ; ; % @ . . + . . @ % * ; ' } P Y Z Z Y U Y U Z Y Y i w.a+^+_+:+<+_+(+3+4+:+(+(+(+(+^+^+:+3+(+(+:+:+3+3+:+<+4+)+J . . . # @ + + { 0+3+:+:+3+:+(+:+:+:+:+0+u.[.U.W.W.W.U.U.U.U.U.U.#+J . . . . . . . @ }.#+U.Z.Q.#+#+#+W.@ . + . . . @ + w.U.U.R.W.U.W.++`.Z.Z.#+G.v q =.=.=.=.*.=.&.=.*.*.=.=.*.&.*.=.&.>.j $ % @ . . + $ = O #.%.=.=.*.*.=.=.=.&.=.*.=.&.=.*.#.%.&.&.*.k o B A A A B x y B y A l @ @ . . . + . % ; I z w A x w o ; @ . . . . . @ * 3 w A x B B B A B B B B A f 8 <.H <._.<.<.<.<.<._._.<.<.[.[.H ^ = > + + $ $ ~ { 8 [.4 = + . . @ @ + + 4 _.<._.<.<.<._.<.<.<._.<.F ", -"N 0.9.e.f.0.i.d.f.9.d.i.1 + # . @ @ # + : N j.9.0.0.8.e.N , . . . . . . $ 1 j.d.0.9.f.9.9.9.9.9.9.b.u x.y+A+z+v+v+z+z+w+z+w+w+z+z+w+v+w+y+w+w+w+w+v+a.# % % . . # % = T.A+A+w+y+z+y+C+w+w+w+z+z+w+w+z+A+G+'+h.$+9+9+}+}+}+}+|+|+|+|+}+9+f+7+$+7.. . @ @ $ $ + . . 5 m.$+7+2+}+|+|+}+|+|+|+|+|+|+|+}+|+}+}+}+b+9+$+3.X.u+h+k+k+k+h+h+h+k+k+h+k+o+k+k+l+l+l+e+k+k+k+s+s+k+e+s+E.& @ $ + . $ $ + c.l+k+k+k+k+s+k+k+k+s+k+[+c.n Y +.+.Z ` U +.+.` M ' . - . @ + . # . . . . . . @ # . + + + . . @ @ # # @ ( P Y U Y Y Y Z Z U Y @.p [.a+a+_+(+<+(+(+(+(+:+(+(+{+(+(+:+{+(+(+(+(+:+<+<+:+<+<+)+F . . . @ . + . + 0+:+=+:+:+:+(+:+:+:+<+0+u._.Y.Z.U.U.U.U.U.U.U.U.#+}.# # . . . . . { w.U.U.Z.v.`.U.W.Z.@ . . . . . $ # :.Z.U.Q.W.W.W.@+U.Q.W.#+w.m q *.*.=.=.*.=.*.*.*.=.&.*.*.*.*.*.*.#.k $ @ . . . + $ < #.,.%.&.=.>.=.=.=.=.*.*.*.*.&.&.>.#.*.=.=.>.0 o B A A B B B x x x z l % @ . . - . . @ 2 w A w y x x w 3 % - . . @ . # @ 2 A B A B B A A B B B B A 8 H <.<.<.<._.<.<.<._._._.<.<.<.<.<.F F H 7 4 8 7 H [.[._.4 $ + . . @ @ $ > H _.<._.<.<.<._._._._.<.<.9 ", -"N f.f.e.0.0.0.d.i.f.8.j.u = @ . @ - - + , N j.j.0.0.8.j...= . . . . . # $ s 9.9.0.d.9.j.9.9.9.9.9.e.u x.x+C+z+y+w+z+z+z+z+z+w+z+z+w+w+z+z+z+z+w+z+v+a.# % @ . . # % + >+A+A+w+z+z+y+y+w+w+y+C+z+v+w+y+A+C+'+h.$+9+b+|+|+}+}+}+}+}+}+9+b+7+$+z.. . @ % . $ . + - a N.2+7+9+}+|+}+|+|+}+|+9+9+}+}+|+|+|+9+}+}+b+b+$+3.X.u+h+k+k+h+h+h+h+d+k+d+d+~+[+~+]+~+X.E.~+d+k+s+k+k+t+r+X.! @ + + . $ $ @ c.s+k+k+k+s+r+l+d+s+o+s+d+6.c U Y +.` ` U +.T U M ; # - . @ @ % % @ @ # . - . . . # @ @ @ + + @ @ . . @ ( ` .Y Y Y U Y U Y Y Y d k.a+<+_+(+1+0+(+:+:+(+4+3+^+=+{+{+=+=+O.)+{+4+3+<+a+<+3+=+F . - @ @ @ $ + ^ 0+:+:+^+:+:+:+(+:+:+4+4+u.}.M.#+U.U.U.U.U.U.U.U.Z.w.% @ . . . . . { k.U.U.U.W.W.U.U.U.f . + . . . . @ w.U.U.R.U.R.W.Q.Q.R.W.#+w.v q =.=.=.*.=.&.=.=.*.=.=.&.=.=.=.=.*.O < @ % . . . + = j %.,.'.'.=.*.=.=.=.=.=.*.*.=.&.=.*.>.>.&.&.*.k o B A B B B B x y A w 2 % # + . + . . & 2 y z y y x A z 3 $ + . # @ . . # 2 A x B B B B B B B B B A 2 D <.<.<.<._.<.<.<._.<.<.<.<._._.<._._._.<.<.<.[.[._.[.[.4 $ + . . @ @ + $ J _.<.<.<.<.<.<.<.<._.<.<.F ", -"N 0.9.9.9.0.f.8.i.f.8.i..., @ # @ + - . , N j.j.9.f.d.d.N $ . - . + + $ = ..f.9.0.9.9.j.9.9.9.f.e.e.u x.y+C+B+y+C+G+z+z+z+w+z+z+z+z+w+z+z+z+G+w+z+v+a.# % % . . # % . m+A+z+y+z+z+y+y+z+y+z+y+y+z+y+F+A+G+'+h.$+b+b+|+|+9+9+}+}+|+}+9+9+2+h.- @ % @ & . + . - 5 N.2+7+9+b+b+f+f+f+f+}+2+f+9+|+}+f+9+f+f+}+9+b+b+%+7.X.u+s+s+h+h+s+s+s+k+l+X.E.6.4.b & a % $ E.n+k+s+k+t+t+r+E.& @ . . . + $ ! E.s+k+k+h+s+r+l+l+k+t+t+l+B.c ` +.Y U ` U X .U M * . + . @ % % % % % @ . . # . . # % % @ $ @ % % . . # ( +. .Y Y Y Y Y Y Y Z @.d q.6+^+_+(+:+4+(+3+:+_+{+ +v.(.[.F 9 _ + F 4+0+6+<+<+<+0+O.9 + . @ $ $ + + H 0+3+(+_+<+3+3+(+_+(+4+4+u.[.M.#+W.U.U.W.Z.Z.U.U.#+F.4 . . . . . . @ J #+#+#+W.W.U.W.Z.@ . + . . . . + w.Z.U.U.U.W.W.U.R.Z.W.#+G.m q '.&.=.*.=.=.=.*.=.&.=.=.=.=.=.=.*.j = @ % . - . + , k *.%.%.'.>.*.=.=.=.=.&.=.&.=.=.=.*.*.=.=.&.*.k o A A B B B x B B A h l % @ . . + - @ % 3 A x A B B w I ; & @ . @ @ . . % l A x A A A B B B B B B A 2 8 <.<.<.<._.<.<.<.<.<.<.<.<.<.F <._.H F _._.<.[.[._._._.4 $ + # @ @ @ # { _._.<.<.<.<.<.<.<.<.<.<._._.", -"N i.e.e.0.f.f.8.d.d.9.i.2.1 + # $ = + . + : |.5.b.j.i.Q : = . - - @ . . , |.f.9.d.9.9.j.j.f.9.9.j.e.u x.v+C+z+y+C+z+z+z+z+z+z+z+z+z+w+z+z+G+B+z+z+v+a.@ % @ . . # % $ T.E+E+y+z+z+z+z+w+z+z+z+z+z+y+z+C+G+'+h.%+b+9+|+9+b+f+}+|+}+}+9+2+J.- @ % & @ $ . # - 5 J.J.&+&+%+%+%+$+$+%+$+%+F.8+5+b+7+f+|+9+f+}+}+b+b+%+7.*+u+q+s+h+s+s+h+s+h+d+E.% + $ + - - @ % c.[+l+t+t+q+l+l+R & # - . + $ + b X.t+k+k+l+l+s+k+l+k+o+s+l+B.n M .X U ` Z +.Y U n ' @ @ - . # - . # + @ . . % @ + . - . + $ % + # . - # ( P +.Y Y Y Y Y Y Y Y @.d u.4+<+4+(+:+4+_+4+{+(+O.[ + . @ @ . . + 4 O.0+0+4+{+{+0+O.] # # # . . + $ q.0+3+:+:+:+3+:+:+:+4+4+4+u.}.M.W..+W.U.U.W.U.U.U.U.U.J . . . + + . . { M.#+W.U.U.#+U.w.. . . . . . . @ W.#+U.Z.U.U.Z.U.U.Z.Z.#+G.m >.=.=.=.=.=.=.=.=.=.&.&.&.&.*.%.=.*.8 . . . . + . . j %.*.*.>.=.=.*.&.=.=.=.&.=.=.=.&.=.>.>.=.=.*.>.k o A A B x B B B B B A 2 % . . . + + @ % ; l z w z w z f * % @ + . . . @ * l w w I I w B B B B B B B 2 J <.<.<.<.<.<.<.<._.<.<._.F F f f 9 { . @ J [._._.[.[.H ^ + @ % @ . . + 4 _.<.<.<.<.<.<.<.<.<.<.<._.F ", -"Q 5.e.j.d.f.f.8.9.9.9.9.i.1 $ . + + . . + $ t |.5.5...1 $ + . - . @ . + u f.9.d.9.9.9.j.j.9.9.9.9.e.u x.y+A+y+y+y+z+z+z+z+w+z+z+z+z+w+z+z+z+y+w+z+m+a.@ @ & . . # @ = +F+E+y+w+z+z+z+w+y+z+z+z+C+z+z+A+G+'+h.%+9+|+9+|+}+}+9+}+}+f+7+$+L - @ & @ $ + @ @ - @ + - - - . . - . - @ . . . C.b+|+}+9+b+9+}+}+}+9+9+%+7.X.u+s+s+l+h+s+h+s+h+l+d+b + $ + - - $ % ! X.n+l+k+q+l+E.5 - + + + + $ + R [+t+k+s+h+s+r+s+k+k+s+o+l+6.n ` .+.@.` Z +.X @.M } ' ; ; * * * * * * * * * ; ; % . . + $ $ @ # % ; ; ' d P +.@.Z Y Z Y Z Y Y @.d w.a+3+3+:+<+4+(+(+4+0+0+F = . # @ . . + $ (.{+3+{+{+0+O.4 + # # - + + $ = v.0+:+:+:+:+:+:+:+:+:+4+4+u.[.Z.#+W.W.U.U.W.W.U.U.U.#+w.{ . . + + . . @ J U.`.U.Z.#+M.J + . . . . . . f U.Z.U.`.U.W.W.`.U.Z.Z.#+G.m q *.=.=.=.=.=.=.=.*.=.&.&.=.%.=.=.>.8 + . . . . . + j %.*.%.>.*.=.=.*.&.=.*.*.*.*.=.&.=.*.*.%.=.=.*.k o A w A B x B x y B A l % . . - . . . & @ 3 I z w z w f * @ . . . . @ % * l I I w y y A B B B B B E 8 H <.<.<._._.<.<.<._.<.<.g = . $ + . # + + 4 _._._.[.F , $ + @ @ . . + ~ H _._.<./._.<.<.<._.<._.<.<.F ", -"N i.9.d.0.0.f.8.9.d.d.0.i.N : = + . . . + $ , 1 s s : = $ + . @ % - + , N 0.8.9.i.9.9.f.9.9.9.9.9.b.u r.x+D+z+v+w+w+z+w+w+w+w+z+z+w+v+w+w+w+w+w+w+v+a.. @ & . . # % ~ T.D+D+w+w+A+y+y+w+w+w+y+w+v+w+y+E+G+>+h.%+9+|+9+}+}+|+}+}+}+|+2+z.) . - @ @ @ + $ $ @ @ + @ @ - = $ $ $ @ $ $ $ . N.5+b+}+f+b+}+}+}+}+9+f+$+7.X.q+h+k+d+d+k+k+k+d+e+d+E.% # + $ % + . @ ! E.[+X.~+E.l @ . $ = $ + @ ) y.l+k+k+d+d+k+k+l+d+k+k+n+d+6.n ` +.+.U ` U +.+.` M n d e e e e e e d e e d e e d ( & . . @ @ @ @ ' e e e M ` Y Z Z Z Z U Y Y Z @.d }.a+<+_+(+=+:+:+(+(+:+{+O.~ . + + . . + - + H ++)+)+P.F + . . . . . + + _.0+{+:+:+:+:+:+:+:+:+<+4+0+u._.Y.U.R.Q.R.U.U.U.W.R.R.U.M.J . + + . . + + % a @+q.M.w.J . . + . . . . # q.Z.U.W.@+U..+Q.@+`.Q.Q.#+G.m q '.=.=.*.=.=.*.*.=.&.=.=.*.*.*.=.>.. . . . . . . + j *.*.#.*.=.=.%.*.*.&.=.*.*.=.=.&.=.>.>.*.=.*.>.k o A A x A x B x y y w w ; # # + . . # @ & & f 2 l o 2 * % @ . . # . @ % ; h w A B B B B B B B B B A 8 9 <.<.<._._._._._._.<.<.9 + - . + . + + . @ F _._.F ~ @ + + + . # @ + 4 _.<._./.D _._.<.F _.<.<._.<.F ", -"N f.9.d.d.0.f.8.9.9.d.f.f.5.t , > - . @ @ + + . + $ + + . . @ % # - $ u i.e.8.d.0.9.9.9.9.9.d.9.9.e.u x.y+C+y+y+w+y+C+G+z+z+w+z+z+w+w+z+y+z+y+w+z+v+a.# % % . . # % + T.D+F+v+A+z+y+y+w+w+z+z+y+w+w+z+C+C+'+h.%+9+9+|+|+|+}+}+}+}+9+;+L - @ . # @ . + . $ $ + @ @ & % @ + + + + + $ $ . N.b+|+2+}+b+b+|+}+}+b+9+$+7.*+q+h+l+d+k+h+h+l+d+t+e+X.b % @ = $ $ . - . - a b ; % # + $ $ $ + + + R [+k+k+l+k+k+k+s+k+k+k+t+o+e+6.e U Z U U ` U +.+.U Y M M ` Y Y Y P @.P @.P M @.` M e ' @ . . @ $ @ ( M Z Y ` ` X Y Y Y Y Y Z Y Z @.d k.3+<+_+^+1+:+:+:+(+4+4+3+F + $ + . + + $ + @ > 4 < @ + + + . . . + + 4 1+_+4+_+:+:+:+:+:+:+:+(+:+4+u._.Z.#+U.U.U.U.U.U.R.W.U.#+#+w.% . + + . . @ $ $ = f 8 . . . + + . . . . f U.Z.U.U.Q.Q.Z.#+Q.Z.Z.Z.#+G.m #.=.=.=.=.=.*.=.&.*.=.=.=.%.*.*.*.q + . . . . . . . q =.*.%.=.=.'.=.*.&.=.*.&.=.=.=.&.'.*.*.*.=.=.*.k o B B x B B B x B B w z l * % % . # % . @ @ & & ; ; % % # . + . @ @ @ * 2 w B B B A A B x x x B A A f 8 _.<.<._.<.<._.<._.<.<.F g + + + + + + + . $ = @ + $ + . . @ @ @ $ ] H <._.<.<._.<.<.<.<.<.<.<._._.F ", -"Q f.9.j.0.f.d.d.j.j.9.9.9.i...1 $ # . - . @ # . @ . # @ . . @ @ + $ : Q j.e.e.9.d.f.j.j.f.9.9.9.9.e.u x.y+C+F+y+v+z+z+z+z+z+z+z+z+z+w+w+B+B+z+y+z+v+a.# % @ . . # @ $ +D+E+y+y+z+z+z+z+y+z+z+z+z+y+F+A+G+'+h.%+b+9+}+}+}+f+9+9+}+9+K.) . + . . - + $ . . . . . . @ @ . . . - - - . . . N.f+9+7+7+|+9+}+}+}+b+b+%+7.*+u+h+h+d+h+s+s+s+h+s+t+l+X.& . $ + + - - . + . + . . + $ $ $ + @ @ b X.n+l+h+h+s+h+k+s+l+d+s+t+s+d+6.n P .+.Z ` Z +.+.U U X +.+.+. .X . . .+.+.+. .X Y n ' @ . . . . @ } Y .+.+.Z U Y Y Y Y Y Y Y Y Z d k.3+_+_+_+:+_+3+:+:+(+0+0+!+4 + + + + + + . + $ + . . . + + . . - $ ~ u._+{+3+3+:+:+:+3+:+:+:+:+4+4+u.}.U.Z.W.W.U.Z.W.W.U.U.U.U.#+U.}.@ $ @ . . @ @ . . + . . . . . . . . . { M.#+U.U.U.U.#+U.#+R.W.R.R.#+G.m q *.=.=.=.=.&.*.=.&.=.=.=.=.*.=.>.j . . . . . . . . *.&.*.=.=.'.=.'.*.=.=.=.=.=.=.&.&.=.=.*.*.=.*.>.k o A A A A B x y y x x A I 2 % & . @ @ . . @ + @ % @ @ % # # . . @ % % ; w w B y x A B B B B B B B A f J <.<.<._.<.<.<.<.<._.<.<._.{ + . . . . + + + + + . . + + . + + + ] H <.<._.<.<.<.<.<.<.<.<.<._.<.<.a.", -"N f.j.e.d.0.f.d.j.j.9.d.9.0.i.2.1 = $ + . . @ @ . . @ # - + $ $ = : N i.j.j.j.9.9.9.j.j.j.9.f.j.j.b.u r.y+C+z+y+w+z+z+z+z+w+z+z+z+z+z+C+z+z+z+z+z+v+a.. % % . . . + + T.A+A+w+y+z+z+y+w+w+z+z+z+z+z+y+C+G+'+h.$+b+b+9+7+7+f+}+}+}+;+7.@ . + . . . . . - - . - . . . . . # . $ @ # # @ . N.b+|+7+}+|+f+}+}+}+9+9+$+7.*+u+h+h+k+h+h+h+h+k+o+k+u+l+B.b . + - . . . . . + + + + $ $ + . # l B.d+u+l+d+l+l+h+q+q+l+d+k+t+t+n+y.c Y +.+.` ` Z +.Z U U Y @.+.+.T .+.+.+.+.+.+.+. .Y n ( % . . @ @ @ } ` T .+.U U Y Y Y Y Y Z Y X +.i u.a+<+_+(+<+<+3+3+:+:+4+4+4+O.4 @ + + . . + + + + $ @ . # # . . . ~ u.0+3+3+<+:+:+:+:+:+:+:+:+:+4+0+u.[.M.Z.Z.U.U.Z.Z.W.U.U.U.U.U.#+Z.}.+ $ . . . . + + + . . . + . . . + { q.#+U.U.U.U.U.U.U.W.W.R.Z.Z.#+G.m q =.&.&.=.=.=.=.=.=.=.=.=.*.%.*.=.j . . . + . . # . *.=.'.%.=.'.&.%.*.&.&.=.=.=.=.=.&.'.*.>.*.=.'.%.k o E w B x B B B y B x B I I ; * . . . # . . + + . . . @ $ @ @ . % % f I A B B y y B A B B B B A B E 2 H <.<.<._.<._._.<.<.<.<.<.<.J = + . . . + + + + . . . . . . . + ^ H <.<.<.<.<.<._.<.<.<.<.<.<._.<._.F ", -"N f.e.9.0.f.f.8.9.d.9.b.d.f.0.0.2.u , + . - . + $ . . - + $ = = : Q i.j.f.0.0.f.8.9.9.j.j.9.9.9.j.e.u I.y+C+B+y+C+G+z+z+z+z+z+z+z+z+w+y+z+y+z+w+z+v+a.# % @ . # @ % + T.E+F+w+z+z+z+z+w+y+z+B+B+w+w+y+A+C+'+h.%+b+b+}+}+f+}+}+}+9+;+7.% $ $ + . - + + + $ . . + + + + @ % % @ % % % % @ &+9+}+2+7+b+9+|+7+}+b+f+$+3.X.u+s+h+d+h+s+s+s+k+k+k+s+u+l+E.b $ @ - . . . + + + + + + . - + c.~+k+e+e+q+u+l+d+k+s+s+k+l+s+o+s+l+B.c U +.+.U ` U +.U U Y Y Z U @.Z Y U Y Y Z @.Z U +.+.n ' @ . . @ . # } ` +.+.+.Z U Y Y Y Y Y Y Y Y @.p k.a+_+_+(+<+a+3+3+:+:+<+4+(+{+1+}.* + . @ % @ . . . @ % % @ @ . , v.0+(+^+_+3+:+(+:+3+:+:+:+4+:+4+p+u.[.Z.#+.+U.U.U.U.W.W.Z.#+R..+#+Z.++A.2 + . . + . . . . . + + . % % 8 M.U.U.U.U.U.U.U.U.U.Z.U.U.Z.Z.#+G.m >.=.=.=.=.=.=.=.=.*.=.=.=.*.%.*.*.m . . . + . . @ @ =.=.=.=.%.&.'.&.=.=.=.=.&.=.=.=.&.&.>.>.=.'.*.>.k o A A B x B B B y B x A A A I ; . @ . @ . . . . . . . . . . . . * f I I w x x r p A B B B B B B B B f 9 <./.s _._.<.<.<._._.<.<.<.[.f { # . . . + + . . . . @ @ % & _ F v /.D <.<._.<.<.<.<.<.<.<.<.<.<.<.F ", -"Q 5.i.e.d.0.f.8.9.d.d.d.9.9.0.i.i.|.s 7 $ . + = = + + + + = : D v.i.9.d.0.0.0.9.8.9.f.9.9.9.9.9.f.e.u x.v+D+z+y+v+w+A+z+w+w+w+z+A+w+v+y+y+w+w+v+w+v+a.% @ % . . . @ > x+A+w+w+w+A+y+w+w+w+w+w+w+w+w+y+E+G+>+h.%+9+|+}+}+}+}+}+}+}+%+L % @ @ . - - . + @ + + + # . . . . . . . . . . . - K.5+|+}+9+9+|+}+}+9+b+9+$+7.*+u+h+h+k+k+l+d+k+k+k+k+s+t+k+l+n+A.I - . . . # + . # . # - b X.n+d+t+o+t+k+q+l+d+d+k+k+k+d+l+k+k+l+c.n M .+.U ` Z +.U ` Z U ` ` ` M Z ` @.Z U Y ` @.T @.e ' @ @ @ @ @ % } P ` ` ` U U Z U Y Z Z Z Z Y @.p k.a+a+_+(+1+<+:+<+:+:+:+(+:+{+{+,+V.}.{ . @ @ @ @ . . - { % f u.,+#+{+{+:+<+<+:+:+:+:+:+:+:+:+:+:+0+u._.Y.U.U.U.W.U.U.U.U.R.Q.Q.Q.++@+R.U.M.).8 . + + . + + . . . # f O &+U.U.U.U.U.U.U.Q.Z.U.Q.U.U.Z.Z.#+G.k q =.=.=.=.=.=.=.=.*.%.=.=.=.#.=.=.| . @ @ @ @ @ $ * =.*.=.=.%.&.&.&.=.*.=.=.%.*.=.*.&.=.>.#.*.=.=.*.k o A w A x x x B A y B w I A I I f { + + # # @ - - . @ # # # # 8 f I w I w A x y x A B B B B B A E E 2 F <.<._._._._._._._._.<._.<.[.}._.J = + + + . . . @ # . @ * F F [._.<.^.W <.<.<._._.<.<._._.<.<.<._.F ", -"N f.e.e.d.0.d.9.9.9.9.9.9.f.9.9.f.f.f.0.d.0.N Q Q Q Q N 2.d.0.i.i.9.9.9.9.f.9.9.9.9.9.9.9.9.9.9.j.b.u x.y+C+z+y+v+z+z+z+z+w+w+z+z+w+w+z+z+z+z+w+z+z+z+z+w+w+z+z+z+w+z+z+z+z+w+w+w+z+z+z+w+y+z+y+v+w+F+E+G+'+h.%+9+9+|+}+|+9+9+|+|+9+9+9+}+|+|+9+9+9+|+9+9+|+9+|+|+9+9+|+|+9+9+9+9+|+|+f+9+9+|+}+|+9+9+}+}+|+b+b+$+3.X.u+s+s+k+h+s+h+h+s+h+h+s+s+s+h+h+q+l+l+X.E.E.B.B.E.E.X.t+e+d+l+h+s+k+k+k+k+k+k+k+k+s+q+l+e+o+h+l+l+y.e ` X +.Z ` Y +.Z U Z Y Z U U Y Z Y Y Y Y Y Y Y U U Y X Y U X X X Y U Y Y Y Y Y U Y Z U Y Y Z Z Y @.d k.<+a+_+(+1+:+:+:+(+:+(+_+(+:+:+:+3+3+:+P.v.v.<.<.<.<.s.1+=+:+(+:+<+^+:+:+:+:+:+:+:+:+:+:+(+:+:+:+0+u.[.U.U.U.U.U.Z.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.w.k.}.}.}.}.}.M.M.U.U.U.U.U.Z.Z.U.U.U.U.U.U.W. +Y.R.W.#+G.m q '.=.*.*.*.=.'.=.*.=.=.=.=.=.=.=.=.=.*.=.=.&.*.=.&.=.=.=.=.=.=.=.=.*.&.=.=.=.&.=.=.&.=.*.#.>.=.=.*.k o E w A B B B x B B B x B B x B B B B A 3 3 ( ( 3 3 ( o I A x B B B B B B B B B B B B B B B B B B A 2 8 <.<.<._.<.<.<._._.<._._.<.<.<.<.<._.D D 9 g g H D D /._._.<.<.<.<.<._.<.<.<.<.<.<.<.<.<._.<.<._.<.F ", -"N i.e.j.d.0.f.e.9.9.9.9.j.9.f.9.9.f.f.f.0.0.9.8.j.5.9.8.d.f.f.9.9.f.f.9.9.j.9.9.f.9.9.j.j.9.9.9.9.e.u x.y+C+z+y+C+G+z+z+z+z+z+z+z+z+z+z+z+z+z+w+z+z+z+z+A+y+z+z+z+z+w+z+z+z+w+z+z+z+y+w+w+z+z+y+w+w+z+A+G+'+h.%+b+b+|+}+|+9+9+|+|+9+9+9+9+|+9+9+9+|+|+9+}+9+9+|+|+9+9+9+9+|+9+9+9+|+|+9+}+|+|+}+|+9+9+}+;+|+5+9+$+3.X.q+k+h+k+h+s+s+h+k+s+s+s+s+k+h+s+s+l+k+d+l+s+d+d+k+d+h+k+e+d+l+s+s+k+k+s+h+s+k+k+s+q+q+k+k+k+s+r+d+6.c Y +.+.` ` Z +.Z U U U Y Y Y @.+.Z Y Y Y Y Z +.X U Y Y U Y Y U Y Y Z U Y Z Y Y Z Y Y Y Y Y Y Y Y +.d u.p+3+3+(+<+:+3+3+:+(+3+3+3+:+:+:+:+4+4+<+6+3+3+:+<+4+4+:+:+:+^+_+3+3+:+:+3+:+3+:+:+3+3+:+:+:+:+4+p+u._.Z.#+#+U.U.W.Z.Z.U.U.U.U.U.U.U.U.U.U.U.W.#+Z.U.W.Q.U.W.U.U.U.U.#+#+U.U.U.W.Z.U.U.U.U.U.W.`.U.R.W.#+G.m q &.=.=.&.=.*.=.=.*.=.=.=.=.=.=.=.=.*.*.*.=.=.*.=.*.=.=.=.=.=.=.=.=.&.=.=.=.*.*.&.=.=.=.*.*.=.=.%.>.k o A A A w B B B x B B B B B B B B B B B B B B B A A B B A B B B B B B x B B B B B B B B B B B B B E 8 _.<.<.<._.<.<.<.<.<.<.<.<.<.<._.<.<.<.<.<._.<.<.<._.<.<.<.<.<.<.<.<.<.<.<.<.<.<._._.<.<._.<.<._.<._.F ", -"Q f.j.e.d.f.f.8.e.j.j.j.9.9.9.9.9.9.9.9.f.f.9.9.f.9.f.9.j.e.e.j.j.j.9.9.9.j.j.9.j.f.j.j.j.j.f.9.9.e.u r.y+C+z+y+v+z+z+E+z+w+z+z+z+z+A+z+z+z+z+z+z+z+z+z+A+z+z+z+z+z+z+z+z+z+w+z+z+z+z+w+z+z+B+G+z+B+F+A+G+'+h.%+9+9+|+}+|+9+9+|+}+|+9+9+|+|+|+9+9+|+|+9+9+9+9+9+|+9+9+|+|+|+|+9+|+|+|+|+9+9+|+}+|+9+9+}+}+9+5+9+$+3.X.u+s+s+k+h+s+s+s+k+h+s+h+q+k+k+s+s+s+t+e+k+s+k+k+h+k+l+k+k+h+h+h+s+k+k+s+h+s+k+k+k+s+q+k+k+s+t+s+e+y.c M +.+.@.` U +.Z U Z Z Y Y Y Y Z Y Y Y Y Y Y Z Z Y Y Y Y U U Y Y Y U U U Y Y Y Y U Y Z Y Z Y Y Z @.d k.:+_+_+(+:+:+:+:+:+:+:+3+:+:+:+3+4+:+<+:+(+3+4+4+:+4+4+:+:+:+:+:+3+:+:+:+3+3+:+:+:+:+:+:+:+:+4+:+4+u.[.U.U.U.U.U.W.W.W.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.`.W.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.W.W.`.R.Z.Z.#+G.m #.=.=.=.=.=.=.=.=.*.=.=.=.=.=.=.=.=.*.&.=.=.=.*.&.=.=.=.=.=.=.=.=.=.=.*.=.=.=.=.*.*.&.=.*.*.=.=.=.*.k o B B B B x B B B B B B B B x B B B B B B B B B A B A B B B B B B B B B B B B B B B B B B B B B B B f 9 <.<.<._.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<._.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<._.<._.<.<.F ", -"Q f.j.e.0.f.f.e.9.9.f.9.9.9.f.9.9.9.9.9.f.f.f.f.f.9.9.9.9.j.j.e.e.j.9.9.9.j.j.j.9.9.j.j.9.9.9.f.9.e.Q r.y+C+z+y+C+z+z+z+z+z+z+E+E+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+w+z+z+z+z+w+z+z+z+z+y+y+z+y+z+z+C+z+C+G+'+h.%+b+9+}+}+|+}+}+|+|+}+9+9+|+}+|+9+9+|+|+9+9+9+9+}+|+9+9+9+}+|+9+9+9+|+|+9+9+9+|+}+|+9+9+}+}+b+5+9+$+7.*+u+s+h+k+h+s+h+h+k+s+s+s+s+k+h+s+q+t+s+s+t+t+s+k+k+k+l+k+k+k+h+h+q+h+k+k+s+s+k+k+s+s+q+l+n+k+s+r+d+6.c Y +.+.Z ` U +.U Z Z Z Y U Y Y Y Y Y Y Y Y Z Y Y Z Y X Y Z Y Y Y Y Y Y Y Y Y Y Z U Y Y Y Z Y Y U +.E w.a+a+_+_+<+3+:+3+:+(+3+3+:+:+:+:+3+3+:+:+:+:+3+:+:+4+4+4+4+4+:+:+3+:+:+_+:+3+:+:+:+:+3+3+:+:+:+4+4+u._.Z.U.#+W.U.Z.Z.W.W.U.Z.Z.U.U.U.W.W.U.#+U.U.U.U.U.U.U.U..+W.U.U.U.U.U.U.U.U.U.U.U.U.U.U.Z.`.U.Z.#+#+G.m q =.=.*.*.=.=.*.=.&.=.=.=.=.=.=.=.=.=.*.=.=.=.*.*.&.=.=.=.=.=.=.=.=.*.&.=.&.=.&.=.=.&.&.>.#.>.'.%.>.k o A w B B B B B B B x B w B B B B B x B B x B B x B B B B B B B B B A A B A A B B B B B B x B B B E 8 F <.<._._.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.F ", -"Q 0.i.e.0.0.9.8.9.9.9.9.9.9.9.9.9.d.9.9.9.9.9.f.0.0.0.0.0.9.0.f.0.9.9.d.9.9.9.j.f.9.9.f.9.9.d.9.9.b.u r.v+D+z+v+w+w+w+A+w+v+w+w+z+w+w+w+w+z+A+w+w+z+w+w+w+w+w+w+w+w+w+w+w+w+w+w+w+w+y+w+w+w+y+z+w+w+w+D+G+'+h.%+b+b+|+|+}+|+|+}+}+|+|+|+|+|+}+|+|+|+9+|+|+|+9+}+9+|+|+|+9+}+}+|+}+|+|+|+|+9+}+|+}+}+|+}+9+9+b+9+$+z.*+u+h+h+k+k+h+h+s+k+k+k+k+h+k+s+k+k+e+k+k+k+k+k+k+k+k+l+k+k+k+k+k+k+k+k+k+s+k+k+k+k+k+s+k+k+k+s+s+d+c.c Y Z +.U ` Y +.Y Y Z Y Z Y Z Y Z Y Y Y Y Z @.Y Y Y Y Y Z Z U U Y Y U U Y Y Y Y Z Y Y Y Z Y Z Y Y Z i [.3+<+_+:+<+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+<+<+(+^+:+:+:+:+:+:+:+(+:+:+:+:+:+:+:+(+(+0+u.[.M.U.R.W.U.U.U.U.R.R.U.U.U.W.R.U.U.U.U.U.U.U.U.R.R.U.U.U.`.Q.U.U.U.U.Q.U.U.U.U.U.U.U.U.Z.`.U.R..+#+G.m q *.=.=.*.*.=.=.=.*.=.=.=.=.=.=.=.=.*.=.*.*.=.=.=.=.=.=.=.*.=.=.=.=.*.*.=.=.*.*.=.=.=.=.*.%.*.=.=.>.k o w A B B B B B B B B B B B B w w x B B B B B B B B B x x w A A A B B B B B B B B B B B x B B B B E 2 8 <.<.<._.<.<._.<._.<.<.<.<._._._._.<._.<.<._._._._.<.<._._._.<.<.<.<.<.<._.<.<.<._.<.<.<.<.<.<.<.<.F ", -"N 5.e.9.d.0.f.9.9.9.9.9.9.9.9.9.e.d.e.j.9.f.9.9.0.0.0.0.0.0.0.f.f.9.j.9.9.9.9.9.9.9.9.9.f.9.9.f.9.e.u x.y+C+z+y+v+z+z+z+w+w+z+z+z+w+w+w+z+z+w+w+z+z+z+z+w+A+z+z+z+w+w+z+z+z+w+A+z+z+z+w+w+y+y+w+w+w+y+A+G+>+h.%+9+|+}+}+9+9+|+|+|+}+9+9+|+}+|+9+9+|+}+|+|+9+9+|+|+9+9+9+|+|+|+|+9+|+|+|+}+|+|+|+|+}+|+}+;+|+b+9+$+3.S.u+k+h+k+k+h+h+h+k+k+h+h+s+k+k+k+k+s+k+k+k+k+k+k+k+k+k+h+k+k+k+k+s+k+k+k+k+k+k+k+k+s+r+t+[+k+s+q+d+B.n M X +.U ` Y +.Y Z Y Y Y U Z Y +.Z Y Y Y Z +.+.Y Y Y Y Y U U Y X Y Y U Y Z Y Y Y Y Z Y Y Y Y Y Z @.p k.a+_+_+:+<+:+:+:+:+(+(+:+:+:+:+:+:+:+:+:+:+:+3+:+=+(+(+(+4+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+(+4+p+u.}.M.U.W.W.U.U.U.U.U.U.U.U.U.U.W.U.U.U.U.U.U.U.U.U.W.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.`.U.Q.W.`.w.m q &.=.=.=.*.=.=.=.=.=.*.=.=.=.=.=.=.=.=.&.=.=.=.=.=.=.=.*.*.=.*.=.=.*.=.=.=.&.=.*.=.&.=.*.*.*.=.&.*.k o A w B x B B x A w B x B B B B B B B B B x x w A B B B B A B B B B B A A B B B B B B B B B A B B B 2 F <.<._._.<.<.<.<._._._.<.<.F _._.<.<.<.<.<.<._._._.<.<.<.<.<.<.<.<.<._._.<.<.<.<.<.<.<._.<.<._._.<.9 ", -"N i.e.e.d.f.f.8.9.9.f.9.9.9.9.9.9.9.j.9.9.j.9.f.0.0.f.f.j.9.f.9.e.9.f.9.9.9.9.9.9.9.9.j.j.9.9.9.9.b.u x.y+C+z+y+z+z+z+z+z+y+G+C+z+z+w+A+z+z+z+w+z+z+z+z+w+z+z+z+z+w+w+z+z+z+w+z+z+z+z+y+z+z+z+z+y+y+z+E+G+'+h.%+b+b+}+}+|+9+|+}+|+|+}+9+|+}+|+9+9+|+}+|+9+9+9+|+}+9+9+9+|+|+}+|+9+|+}+|+9+9+|+}+|+9+9+}+}+}+b+9+$+3.X.q+s+k+k+k+h+s+h+k+h+s+s+s+k+k+h+k+k+k+k+t+s+s+d+l+s+k+s+k+k+k+s+t+s+k+s+k+k+k+k+s+s+r+k+l+k+s+u+d+B.n ` +.Y ` ` Y +.Y Z Z Y Y Z Y Y Z Y Y Y Y Y Y Z Z Y Y Y Y U U Z Y Y Z U Y Y Y Z Z U Y U Y Z Z Z Z +.i k.3+_+_+:+:+:+:+:+(+:+:+{+(+:+:+3+3+:+:+3+3+3+:+:+:+:+(+4+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+(+:+:+4+u._.U.#+W.W.Z.U.U.W.U.U.U.U.W..+R.U.U.U.U.U.U.U.U.U.U.Z.Z.#+U.U.U.Z.U.U.U.U.U.U.U.U.U.U.U.U.U.U.Z.Z.#+G.m >.&.=.*.*.*.=.&.=.*.=.*.=.=.=.=.=.=.=.=.=.=.=.=.&.=.=.*.=.*.=.=.=.=.&.=.=.=.*.&.&.=.&.=.*.%.=.=.=.%.k o B A A B B B B B B B B B B B B B B B A B B B A B B B B B B B B B B B B B B B B B B B B B B x B B A 8 9 <./.s _._.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<._.<.<.<.<.<.<.<.<.<.<.<.<.<._.<.<.<.<.<.<.<.<.<._.<.<._.<.].", -"N 0.9.e.d.0.f.d.9.9.9.9.j.9.9.9.j.e.e.9.9.9.j.0.9.9.j.j.e.e.e.e.e.j.j.f.9.j.9.j.9.j.j.j.j.9.9.j.j.e.u x.y+C+z+x+G+G+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+w+z+F+z+z+w+z+z+z+z+w+w+z+z+z+w+z+z+z+z+z+B+z+A+G+'+h.%+b+9+}+|+9+9+9+|+|+9+9+9+|+|+9+9+9+9+|+|+9+9+9+|+}+|+9+9+9+|+|+9+9+|+|+9+9+9+9+9+9+9+9+9+|+9+5+9+$+7.*+u+q+k+k+h+s+s+s+k+q+s+s+s+k+s+h+t+t+s+s+s+s+s+k+k+t+s+s+k+k+t+t+s+k+k+k+t+t+k+k+h+q+q+k+k+k+q+u+l+y.n ` +.+.@.` Y +.Y Z Y Y @.Y Z Y Y Y Y Y Y Y Y +.X Y Y Y Z Y Y Y Y Y Z U Y Y Y Y Z Y Y Z Y U Y Y @.Z d u.3+a+_+^+<+3+3+3+(+(+3+3+3+:+(+(+4+3+:+:+^+_+4+:+(+3+4+4+4+:+(+(+3+3+(+(+3+3+3+(+:+3+3+:+:+3+4+3+4+u.[.W.Z.W.W.U.W.Z.Z.U.U.U.Z.U.W.Z.Z.W.W.U.U.U.U.U.Z.U.U.Z.Z.U.U.U.U.W.#+U.U.Z.Z.W.W.U.U.Z.Z.`.R.Z.Z.#+w.v #.=.=.*.=.&.=.=.=.=.=.=.=.=.=.=.=.=.*.=.=.=.*.=.=.*.=.=.=.&.=.=.=.=.*.&.&.&.=.*.*.*.&.=.#.>.=.=.*.>.k 3 B B B B x B B B B B B B B A A B B B B B B B B x x B B B B B B B B B B B B B B B B B B B B B B B E l H <.<./._.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.H H <.<.<.<.<.<.<.<.<._.<.<.<.<.<.<.<._._.D ", -"9.f.f.f.9.f.f.f.d.b.d.b.d.d.b.d.d.d.d.b.d.d.b.d.d.d.d.b.d.d.b.d.b.d.d.b.d.b.d.d.b.d.b.d.b.b.d.b.d.j.Q r.B+F+F+F+G+G+D+D+D+D+D+D+D+D+A+E+D+D+D+D+E+D+D+D+C+D+D+D+D+C+D+D+D+D+D+D+D+D+D+C+D+E+D+C+D+E+F+F+G+-+o.%+b+f+7+f+f+f+f+7+f+f+f+f+f+f+f+f+f+f+7+f+9+f+f+9+f+f+f+f+f+f+f+f+f+7+f+9+f+f+f+f+f+7+f+f+7+7+9+7+&+7.*+q+u+u+q+t+u+u+u+u+u+u+u+u+u+u+t+u+u+q+u+u+u+u+u+u+u+u+t+q+u+t+s+u+q+u+u+u+u+u+u+u+u+u+u+l+u+u+u+d+6.Y .T . . . .T .X .Y . . .+. . . . . . . . . .+. .T .+.+. . . .+.+. . . . . . . . . .+. . . .Z x u._+a+a+1+_+a+a+a+a+a+a+a+6+a+6+3+3+a+6+a+6+6+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+3+a+3+3+3+3+a+3+a+p+0+w.[.<+*+#+#+U.#+#+#+#+U.#+#+#+#+#+#+#+#+#+#+#+#+#+#+.+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+,+#+.+G.m #.=.&.=.%.%.%.'.&.=.>.%.*.'.,.%.*.,.=.%.*.&.'.=.%.=.&.*.=.%.'.%.=.=.&.&.=.&.*.*.%.,.'.=.'.>.*.%.%.%.k o B A I w x z z I A E w w B E A B E A E E A E B w A B B A A B B B B B E w A A B E w B A w B B E w A f 8 _._.s._.[.<.<.<.<.<.<.<._.<.<.<.s.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<._.<.<.<.<.<.<.<._.<.<._._._.F ", -"N u u u u u Q N N N u s u N u u s s u N N N u s u N N N u s s u s N s N s N s u s u N u s N N N u ,.D ^.D.-+-+T.r.I.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.-+T.T.T.T.-+T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.'+I.T.a.7.C.N.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.n.n.C.C.C.C.C.n.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.n.n.C.C.o.3.c.*+y.y.E.E.E.*+y.E.E.*+*+E.E.E.E.*+*+E.E.E.*+*+E.E.E.*+y.E.E.E.E.y.y.y.y.y.y.E.E.y.*+y.E.E.y.y.E.E.6.e e d d d d c d e e e e e e e e e e e e e e e e e e e e e e e n c e e e e e e e e e e e e e e e e c ( j q.P.P.u.q.q.u.q.q.u.u.q.q.q.q.q.u.u.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.u.q.q.q.q.q.q.q.q.q.q.q.P.q.q.F F [.:.;.k.}.}.}.w.[.[.}.w.w.}.}.}.w.}.}.}.}.}.}.}.}.}.}.}.}.[.}.}.].}.}.}.}.}.w.}.}.}.}.}.(.}.}.[.[.J 2 k q q k q k j j j j j k j j j j j q j j j j j j j j q k j j j j q k j j j j j q q j j j j k k j j j j 2 3 2 l l h h h 2 2 l f 3 3 l 2 f o f l 2 l o 3 o 2 2 2 2 2 3 3 h 2 h 2 3 3 3 2 l l f 2 2 2 h l f k < f J _.8 F 8 H F F 9 F 8 g H 9 F J 8 9 H J 8 F H H J F F J 8 J H 4 J F J H H F 8 9 J F J F 8 H 9 8 _.8 ", -"< 8 8 8 8 2 < 2 8 8 < 2 8 < 8 < f < 2 2 f f < f f < < 8 f 2 < 8 2 8 < 2 2 8 < 2 2 2 2 2 8 8 2 2 < } 0 H S S S S S S S S D S S D S S S D D S S D S D S S S D D S S D S D D D S D D D S D D D D S S S u N N C F a.D.t.t.t.t.t.t.H.x.H.t.t.t.H.t.x.t.t.x.t.x.x.t.x.H.t.t.t.t.t.t.t.t.H.t.t.t.t.t.t.t.t.H.D.t.t.D.H.a.5 7.7.m.m.m.m.m.m.n.m.m.m.m.m.m.m.m.m.m.m.m.m.7.7.7.7.m.m.m.m.m.m.m.m.7.7.m.m.m.7.7.m.m.n.7.m.m.m.m.J.5 l y.y.y.y.y.y.B.c.c.c.c.4.y.6.c.6.4.c.c.c.c.B.c.c.c.4.4.c.c.c.c.y.c.6.c.c.4.6.B.c.6.4.c.4.c.c.c.6.B.R ( A y y y r B d p p p p p p p y y r y B y p y y y y p p p p p p p B p p p p p p B p y B p p p y y r 3 F [.[.k.}.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.u.[.[.[.[.[.[.[.[.[.[.u.}.f v ~.~.~.~.).}.).~.~.~.~.~.~.~.~.).}.~.~.}.~.}.}.~.}.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.).}.).~.).(.).2 h m k k k 0 m m m k m k 0 k k k m m k k m k k k 0 k m k m m k k k k m k 0 0 k k k 0 m k k m 0 k k m < f f 8 f 2 2 f 2 2 f 8 l f 2 2 2 f l f f 2 2 2 2 f f 2 2 2 2 2 f 8 < f f 2 f 2 f 8 l f f l f f 8 f 8 ; ", -"l A E A E E E E A w E A E A A A A A B x B A B E A B A A A B A A A A E A A A B B z A E A A A E x x r 0 s 2.i.j.i.5.5.i.i.5.i.i.i.5.i.i.5.5.i.i.5.i.5.5.5.5.5.5.5.5.5.i.5.j.5.i.5.5.j.i.5.5.5.5.i.i.i.0.f.i.N S j+y+v+B+g+x+x+B+g+B+B+x+B+B+v+g+g+B+w+v+x+g+g+w+w+B+g+x+B+B+x+B+x+x+g+B+B+x+x+x+B+g+g+B+B+B+B+v+w+g+t.J.8+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+%+2+2+2+%+2+2+2+2+$+n.B.[+d+[+e+e+e+d+e+e+e+d+o+o+d+e+e+o+e+e+n+e+e+e+e+e+o+o+e+e+e+e+e+e+e+e+e+o+n+n+d+l+o+e+l+e+e+e+e+l+E.E P U M n P P ` ` ` @.` ` ` P M M ` P M M M P ` P P ` ` ` ` @.` P P ` ` ` ` ` M M M M M M M M ` P M i 1.++3+4+(+(+4+(+{+(+(+(+(+{+{+(+(+(+(+(+(+{+{+{+{+(+{+{+{+{+(+{+{+:+{+(+{+{+{+(+{+(+(+{+4+:+3+{+{+3+O.}.G.W.W.W.U.U.W.W.W.W.W.W.W.W.W.W.W.W.W..+W.W.W.W.M.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.F.).q O #.#.%.#.#.#.%.#.%.*.%.*.*.*.*.#.*.>.#.#.*.*.#.>.%.*.>.%.*.*.>.>.>.#.#.>.*.*.*.%.%.>.*.*.%.*.>.#.k f I I l I A z B A B A B B B B A A A B B A A A A A A A A A A A A A A A A B A A z A B B A B A z A A A o ", -"} B B B B B B B z y y y B x z y y y z y z z y y y y y y y z y y y z z y y y z z y y z y z y y z y i 3 s i.b.e.e.j.e.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.9.d.e.Q S g+D+D+C+A+A+A+C+C+D+D+A+A+A+D+D+A+A+D+A+D+D+D+D+D+A+D+D+A+A+A+A+D+A+D+A+A+C+A+D+D+D+D+A+A+A+C+D+D+v+o.N.f+b+b+|+9+b+9+b+9+b+9+b+b+b+b+b+b+b+9+9+b+b+9+9+b+b+b+b+b+b+b+b+9+9+9+b+b+b+b+9+b+9+b+9+9+b+b+b+}+n.S.u+u+l+q+q+q+q+r+t+r+q+r+r+t+t+r+r+r+r+t+r+r+r+r+t+r+r+r+t+t+q+q+r+t+t+r+r+r+r+t+q+r+r+q+t+r+r+r+t+E.p +.T .X +.+.+.+.+.+.+.+.+.+.Z X X Y X +.+.+.+.+.+. . .+.+.+.+.+.+.+.+.+.+.+.+.U +.+.Y +.Z +. . .@.e 1.4+a+3+6+:+3+a+4+^+:+3+3+3+4+:+6+3+^+^+:+^+_+4+3+3+6+4+3+6+:+6+(+_+3+:+_+a+_+3+4+4+_+6+4+4+_+6+3+p+O.[.M.#+#+#+W.W.#+#+W.R.#+#+#+#+#+W.#+Z.#+W.#+`.#+#+#+R.W.#+R.#+#+#+#+Z.#+W.U.#+#+#+U.U.#+#+W.U.#+#+#+F.v *.=.*.=.=.=.=.=.&.&.&.&.=.&.&.=.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.'.&.&.&.&.&.&.=.&.&.&.&.&.=.*.q f w E B E B B A B B B B B B B B B A B B B B B B B A A B B B B B B B B B A B B B B B B B B B x y x A w ", -"x x z z y y z z x x x x B x x x x x x x x x y y x x x x x x x x x x x x x B x x x x A x x x x y x y f D 2.8.b.d.f.e.d.d.9.e.e.d.d.d.9.9.9.d.d.9.d.9.e.d.d.d.e.b.d.d.d.d.d.d.d.d.e.9.d.d.9.b.d.d.e.d.9.d.d.Q ^.m+D+C+A+z+z+z+z+E+z+F+E+z+z+A+F+F+E+w+z+E+F+z+z+E+z+z+z+E+F+E+z+E+E+F+z+z+z+E+E+z+z+E+F+w+y+y+z+G+m+n.K.f+9+|+|+9+b+9+b+|+9+9+9+9+9+|+9+9+9+|+9+9+9+9+9+b+b+b+9+9+9+9+b+b+9+|+9+b+b+|+|+9+9+b+9+}+9+9+b+}+n.S.u+s+t+q+h+q+q+h+k+h+h+q+q+k+k+s+s+s+k+k+q+q+h+k+k+s+q+q+k+h+h+h+s+k+h+q+s+h+q+k+h+s+s+s+k+q+h+s+t+A.p .T T .+.X +. .+.+.+.+. .+.+.Y +. .+.X . .+.+.+. . .+.+.+. . . .+.+.X . .+.Y +. .+.X +. .T T .n 1.{+6+<+:+:+3+4+6+<+:+:+3+6+<+:+a+6+_+3+<+6+3+a+3+<+3+<+3+^+:+^+a+6+a+:+^+:+<+3+<+<+3+a+<+:+^+:+a+3+O.[.M.#+R.R.Z.W.Z.Z.Z.W..+#+W.Z.R.Z.Z.Z.R.R.R.R.Z.Z.R.Z.U.W.Z.R.R.Q.Z.Z.R.W.W.R.Z.R.R.R.Q.Z.R.W.U.W.#+M.m *.&.=.=.=.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.=.&.&.&.&.&.&.&.&.&.&.&.&.&.%.k l A E B y y E A E A E B B B A A B w A B B A A B B A A B A A A B B B B E A B A A A A A B w B w B w z A ", -"w A x A A A x A B w w E w A x B B E w A B B x A w E E w A A w B B E w w B w E B w w B B B w E w B E f D 2.b.d.f.f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.f.0.0.0.0.0.0.0.0.0.i.i.0.0.j.j.i.N ^.j+y+z+z+y+y+y+y+v+y+y+y+x+y+v+y+y+y+y+v+y+y+y+y+w+w+y+y+y+v+y+x+y+y+y+y+y+y+w+w+y+y+y+y+v+v+x+v+G+m+t.C.f+}+}+}+|+}+}+}+}+}+}+}+}+}+|+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+|+}+}+}+}+}+}+}+}+f+|+}+}+}+f+9+;+m.S.s+e+e+d+d+k+h+d+d+l+d+d+d+k+l+d+d+k+k+d+k+l+k+l+d+d+h+k+d+l+k+l+d+d+d+d+d+l+d+k+d+k+d+d+d+d+d+d+t+y.p Y T +.Y +.U Y @.Y X Y Y Y Z Y Y Y Y Y Y @.@.Z X Z @.Y Y Y Y @.Y Z @.Y U ` @.Y Z Y Y Y Y Y @. . .Y n 1.(+<+<+<+:+:+:+:+:+:+(+:+:+:+<+<+:+:+<+<+:+:+<+:+<+:+:+:+^+:+^+<+<+:+:+:+:+:+:+<+<+<+<+:+:+<+<+^+4+O.[.M.R.Q.Z.U.V.)+W.Q.R.L.L.`.W.Q.{+W.Z.R.Q.Z.{+Z.R.Q.R.U.{+R.Q.R.R.Z.U.R.{+V.R.Q.R.)+V.M.R.M.M.U.V.)+M.v %.'.=.=.=.=.&.=.=.=.=.'.&.=.=.=.=.=.&.&.'.%.=.=.=.=.&.=.%.=.=.=.&.=.%.%.=.=.=.=.&.=.=.%.'.=.=.&.=.%.k 3 w B y A A w B B y A A B B B w A w I w A w A A w w w w A w w B B B A A x B A w A w B B w A A I I w w ", -"h B A A B w B w B A A B A A B A E A A A B A A B A A A A A A w B B B w A x A B E A A x E B A B A B B l s 2.d.8.d.9.f.0.f.f.0.f.f.0.f.f.0.0.9.f.f.j.0.j.0.f.0.0.j.j.0.0.0.9.9.j.9.j.9.f.f.f.0.0.0.f.f.j.9.f.N ^.j+F+z+y+w+z+G+z+y+z+A+z+z+y+w+C+y+z+C+w+y+B+G+y+v+w+y+G+w+w+C+y+y+G+z+w+z+z+y+C+z+z+G+C+A+w+y+A+A+g+t.N.7+}+}+}+}+}+}+|+}+}+|+}+}+}+}+}+}+}+}+}+}+7+}+}+}+}+}+}+}+}+}+}+}+}+}+}+7+}+}+}+}+}+|+}+}+}+f+7+%+n.B.l+l+l+d+d+l+h+l+k+l+h+l+h+k+k+l+h+k+k+k+k+k+k+k+h+l+k+h+h+k+k+l+l+l+k+k+k+k+k+k+l+s+l+l+d+l+k+l+q+E.p @. .` P ` ` ` ` ` ` ` ` ` ` @.Z Z Z @.@.@.` ` ` ` ` P P @.` ` ` ` P ` ` ` @.Z ` Z ` ` Z Z ` Y Y M d 1.<+<+<+:+{+(+(+_+(+(+(+:+:+:+:+(+:+:+:+:+:+:+:+:+<+(+:+:+:+:+{+_+:+(+(+{+:+:+<+:+(+:+:+:+{+(+:+<+3+O.[.M.#+U.U.`.`.`.U.U.W.U.V.`.`.`.`.`.U.U.U.`.Y.W.Q.@+R.U.V.R.@+U.U.U.U.U.`.`.`.Z.U.`.`.U.W.U.`.`.`.`.F.v q ,.%.*.*.*.%.%.*.#.%.#.*.#.%.#.*.%.*.=.%.%.%.%.#.>.#.*.%.%.#.%.*.#.%.%.%.>.*.>.#.>.*.%.#.%.>.>.*.#.k 3 E B x 0 w x z B y B z y y y B A A x x x x B x B A A x y x B B x y z x y y y A A B B y A A B I I A l ", -"l w w B x B B A A B B B B A A B B B x B B A A B x y x x y B x y x B A B B B B A B B B A B B B B B B 3 t i.8.9.f.9.9.j.9.9.9.9.9.9.9.d.9.f.9.d.d.d.d.d.9.f.9.9.f.f.d.b.b.9.f.d.f.9.9.9.f.9.9.9.9.9.9.j.b.e.N ^.m+G+z+y+w+z+G+z+z+w+z+z+B+x+w+A+C+z+A+z+A+A+G+E+z+A+A+A+z+z+A+D+E+A+z+x+z+C+z+G+z+z+z+G+A+w+y+E+D+g+o.K.f+9+|+|+|+f+|+9+|+|+9+f+f+|+|+}+f+}+}+}+|+f+|+b+9+9+b+9+|+|+b+9+b+|+}+9+9+f+|+|+|+|+9+f+}+9+9+7+%+n.B.t+s+r+l+l+q+s+h+k+h+u+q+q+k+k+d+l+u+l+s+d+l+u+l+l+u+l+l+d+l+u+s+t+s+k+k+q+l+s+k+h+s+s+s+l+h+s+s+r+B.i @.+.@.P Y Z ` Z Z @.@.Y Y ` ` Y +.+.X +.+.X @.@.@.@.@.@.Y Y X X X +.X @.` P Z Z Y ` ` Y Y Y +.+.@.d 1.<+a+3+:+4+:+(+4+{+{+4+(+:+:+:+3+3+3+4+{+(+:+:+3+3+(+3+3+3+:+(+0+(+:+(+(+:+3+:+:+(+(+3+:+(+:+3+3+p+O.}.M.#+U.U.U.U.U.U.U.U.U.`.U.W.U.U.U.#+U.U.U.W.#+W.++U.U.W.W.++U.U.U.W.U.U.U.U.U.U.U.U.U.U.U.U.U.U.#+M.v q '.%.%.%.>.%.'.*.*.=.*.&.*.'.%.=.'.&.&.'.'.'.'.>.=.*.=.=.#.#.*.=.=.=.*.*.=.&.%.%.=.=.*.*.=.=.*.=.*.0 3 E w A z B x p B x B x x A x y B A y x A A A x y y y z z z y x B x x x x A A B B B A x A A B A A x h ", -"I w A B x B B B B B B B B B B B B B B B B y y x x w w w A B x y x B x B B B B B A B B B B B B B B B l D 0.8.9.0.j.e.9.9.9.9.9.j.j.e.d.9.9.9.d.d.f.d.9.9.9.f.9.f.f.f.d.d.9.e.f.f.d.d.9.9.9.9.j.9.9.9.0.d.j.N ^.m+D+G+z+w+z+z+z+z+z+z+y+y+y+w+C+A+z+z+z+A+E+D+G+A+A+A+A+y+z+A+D+D+z+z+y+y+z+z+G+z+z+z+z+G+z+y+E+G+g+t.N.f+9+|+|+9+9+9+9+|+|+f+9+9+|+9+f+9+f+}+f+|+9+b+b+|+9+9+f+b+9+9+9+9+9+}+9+9+9+|+|+|+9+9+}+}+9+9+f+%+m.B.s+t+s+l+k+t+s+t+k+s+u+q+q+k+k+l+h+h+s+s+k+h+s+s+s+s+r+s+l+k+q+r+t+k+k+h+u+l+k+k+h+s+s+s+h+h+h+s+r+B.d @.+.Y ` +.X +.Y Y Z Y X X Z ` X +. .+.Y ` @.+.+.+.+.+.+.+.+.Y +. . .+.U Z P Y Y Y Y Y Y Y Z Y +.Y n k.<+a+3+:+:+:+3+4+(+(+0+4+:+(+(+_+^+4+(+(+3+(+(+:+:+(+0+(+4+4+4+4+4+4+4+4+:+3+(+:+:+:+3+3+(+:+a+6+p+O.[.M.#+U.U.U.U.W.Z.Z.U.#+U.Z.W.U.U.Z.U.U.U.U.U.#+#+W.U.U.Z.U.W.U.W.#+Z.Z.U.Z.#+U.U.U.W.U.Z.U.U.U.W.#+M.~.q =.&.*.#.*.=.&.*.=.&.&.&.&.'.'.$.'.&.=.&.=.=.&.=.&.=.&.&.=.=.&.=.&.'.=.&.=.=.=.=.=.=.=.=.=.=.=.=.=.0 2 w w z y B y y B B B B B A B x B w w B w A A B A w A w w w A y y B B A A A w B B B B B B A B y A A w ", -"I w A B A B B B B B B B B B B B B B B B B y y x A h h h w w w w w A B A B B B B w B B B B B B B B B f D 0.8.9.0.j.e.9.9.9.9.9.9.9.d.8.d.j.j.0.i.5.5.2.2.2.2.2.5.5.i.i.i.0.j.f.d.d.f.9.9.f.9.9.9.9.9.f.d.j.N ^.m+D+A+y+z+z+z+z+z+z+z+z+E+A+w+w+A+y+y+F+B+F+m+m+m+m+y+x+x+y+F+z+E+E+D+D+z+z+z+z+z+z+z+z+A+G+y+E+G+g+t.N.9+9+|+|+9+9+9+|+}+|+9+9+9+}+|+9+9+}+|+9+9+|+9+9+b+8+$+%+%+%+%+%+%+7+|+|+9+9+|+|+9+9+9+}+}+|+b+f+2+m.B.u+t+s+s+k+t+s+s+k+s+q+q+q+s+e+s+s+t+t+q+q+t+t+r+q+t+t+r+t+t+q+s+s+n+l+u+u+h+k+s+h+s+q+s+k+k+s+s+r+B.d +.+.Y ` Y Y +.Z U Z Y Y Y +.+.+.+.X ` P M M M @.+.` @.Y @.Z P @.X +.+.+.U Z Z Y Y Y Y Y U Y U +.Y n 1.<+a+3+^+:+4+3+4+{+(+4+0+4+0+0+0+4+0+0+0+4+4+4+0+4+0+_+0+4+0+4+0+4+_+0+0+3+:+3+:+:+3+:+3+:+<+<+^+4+O.[.M.#+Z.U.U.U.U.U.Z.Z.#+U.#+U.U.U.#+Z.#+U.M.M.G.F.M.M.#+#+#+U.W.W.#+W.W.U.W.#+U.U.U.W.Z.Z.U.U.U.Z.#+M.v *.=.&.=.>.*.=.&.*.=.&.&.&.%.*.%.%.>.>.#.%.q O #.#.*.%.=.=.&.$.&.&.=.%.'.&.*.=.=.=.=.=.=.=.=.*.=.=.=.k l w E A x B x B B B B B B B A w w A w A w w A w w w w I I I A y y B B A A B A B B B B B B B B y A A o ", -"I w A B A B x B B B B B B B B B B B B A A A w A 2 % * * * ; * ; h B A A B B B B A B B B B B B B B E 2 s j.8.9.0.j.9.f.9.9.9.9.9.9.d.8.d.i.2.N s | : : : : : : t t s u 2.i.i.d.d.d.0.9.9.f.9.9.9.9.9.f.8.j.N ^.m+D+z+y+w+z+z+z+z+z+z+A+D+E+z+y+y+x+'+x.].W W W H g W ^.s.T.>+x+y+z+D+D+z+y+z+z+w+w+z+z+w+y+y+E+A+g+t.N.f+}+}+|+}+|+}+|+|+|+|+9+9+|+|+|+}+}+|+b+9+|+7+7+;+7.L L 5 5 L 5 5 N.b+9+9+}+}+|+|+9+9+|+|+9+b+9+%+n.B.t+t+s+l+k+s+s+h+d+h+s+h+l+E.E.E.c.E.E.c.c.E.E.c.c.E.E.E.E.E.c.c.B.B.]+l+l+h+k+k+h+k+h+k+k+k+h+s+t+E.d Y +.Z ` U Y Y Z Z Z Y Y U +.+.+.@.M e } } } ( ( } } } } } d M P Z @.X +.+.U Z Y Y Y Y Y U Y Z +.Y d 1.a+a+3+:+:+3+(+(+{+(+P.q.u.s.s.u.[.u.u.u.s.u.[.u.q.u.u.u.u.q.s.u.q.u.u.u.:+:+:+:+:+:+:+(+:+<+:+^+4+O.}.w.W.U.U.U.U.U.U.U.W.R.U.U.U.U.U.U.w.}.J 8 8 8 8 8 8 J }.k.w.R.Z.`.`.U.U.W.U.U.R.W.U.U.U.U.U.W.W.#+M.v q =.=.*.#.*.=.&.*.*.'.&.'.,.#.#.O k j < < < < < | < | j q >.%.=.=.=.*.%.=.*.=.=.*.=.=.=.=.=.=.=.=.*.0 l R A A x B B y B B x A B A I I w 3 2 ; ; * ' ; ; ; ' h h I A x A A B B A B x B B B B B B B B x A A w ", -"l A A B x x x x B B B B B B B A A B B A w I l h * . # @ @ % % % l B B x B B A B A B B B B B B B B E 2 s 0.8.9.0.9.f.9.9.9.9.9.9.9.e.f.2.Q 1 , = @ + + + + + + + + + , 1 N j.e.j.f.i.9.9.9.9.j.f.9.9.f.8.j.N ^.m+D+z+y+w+w+z+z+w+w+w+E+D+z+y+x+T.W 9 + @ @ % % % % @ @ $ [ 9 x.'+x+z+D+A+z+z+A+w+w+z+z+w+v+y+z+A+m+t.N.9+}+}+|+}+|+|+|+|+}+|+|+9+b+|+|+|+|+|+b+|+f+2+8+m.- . . + @ + + + n.b+|+|+}+|+|+|+9+|+9+|+}+|+f+2+m.B.t+t+h+d+k+s+h+d+k+k+h+t+l+R b { # ! - # # & # # # # { { { { # # * b X.l+h+k+k+k+h+k+h+k+k+k+h+h+t+B.d Y +.Z ` U Y Y Z Z Z Y Y U @.` P e } ' * % @ # + @ % @ @ @ * } n ` @.Y Y +.+.Y U U Y Y Y U Y @.+.X d 1.:+a+3+:+:+:+:+(+4+:+<.$ + ~ ^ + + > > > > > @ > @ > > > > @ > > $ > > > :+:+:+:+:+:+3+(+(+:+:+<+p+O.}.M.#+U.W.R.U.U.U.U.R.R.U.W.U.U.w.8 8 @ @ . . . . . . . @ @ 8 J w.L.`.W.R.U.U.U.R.Z.U.U.U.U.U.W.U.#+M.v q &.=.*.>.%.*.&.=.=.%.=.>.#.O j < $ = @ @ + @ @ @ @ $ < < | j l.#.=.*.*.*.=.=.*.*.=.=.=.=.=.=.&.=.*.0 l R w z y B B x B B A w A w 3 o ; * & & @ % * & % % % * ; * l A w w A A B x x B B B B B B B B B x A o ", -"o A w B A B B B B B B B B B B A B B B x I I l ; % . . . . @ @ % f B B B B B A B A B B B B B B B B B 2 s 0.8.9.0.j.9.9.j.9.9.9.e.e.2.u 1 : = + # # . + + . + @ + + + @ $ : s 2.i.0.j.9.9.9.9.9.9.9.9.f.d.j.N ^.m+D+z+z+w+z+z+z+z+w+z+z+z+x+j+a.g + . @ % @ @ @ @ @ % % . @ + > g T.x+F+z+z+z+z+z+z+z+z+z+y+z+E+D+g+t.N.9+9+9+|+|+|+|+|+|+|+|+|+9+}+|+9+9+f+|+|+b+7+8+z./ @ @ @ + + + @ + n.9+}+|+|+|+}+|+9+9+|+}+|+b+f+2+m.B.s+t+l+l+e+k+h+d+h+k+h+t+n+b + . . + + + + @ + @ + + + + + + + @ @ a X.s+r+q+k+k+k+k+h+k+k+k+h+s+t+B.d U +.U @.U Z Y Y Z Z Y Z Y M e i ' & @ @ . . . . . . . . # @ ; } e P ` +.+. .Y Y Y Y Y Y Z Y Z +.X e 1.:+a+3+:+:+:+3+(+(+4+[.. + + # + + # + @ @ + + + + # + # + . + # + + + . (+3+:+:+:+:+3+:+:+:+:+<+p+O.[.M.#+U.W.W.U.U.U.U.U.U.U.#+U.}.{ . . . . . . . . . . . . . . . 8 (.Z.W.Z.U.U.U.U.U.U.U.U.U.U.U.U.#+M.v q =.&.'.%.*.'.&.=.*.*.*.>.O < = @ . $ . @ . @ @ # # @ @ @ $ , v #.=.=.*.*.*.*.>.>.=.=.=.*.=.=.&.=.=.k h A A y y B B B B B A w w w * * % @ @ @ @ @ @ @ @ @ @ @ % @ * 3 I I w B x B B B B B B B B B B B y A l ", -"w A A A A B B B B B B B B B B B B B B B I I ' & @ . . # @ @ @ % f B B B B B A B A B B B B B B A B B h s 0.8.9.0.j.9.j.9.9.9.9.9.e.u 4 = @ . . + # + $ + + $ $ $ @ + + @ $ = 1 5.j.d.9.f.9.j.9.9.9.9.j.e.j.N ^.m+G+G+z+z+z+z+G+z+w+z+y+y+m+_.+ @ @ . . . . . + . . . . + @ @ @ @ 9 T.x+y+z+z+z+z+z+z+z+A+z+y+E+D+g+t.N.f+9+9+}+|+|+9+|+9+|+9+f+9+}+9+}+9+2+|+|+9+2+$+/ + @ . # @ # # @ @ n.b+9+9+9+}+}+9+9+b+}+}+9+b+f+%+n.B.s+t+h+l+k+t+s+l+h+s+t+s+X.! $ . . . . . . . . . . . . . . . . @ + a X.l+r+r+h+l+s+s+h+q+k+k+h+q+t+E.i @.+.Y @.U Y Y Y Y Y Y Y +.e 3 * @ . + + @ @ @ @ @ . # @ @ @ # % ( e M @. . .Y Y Y Y Y Y Y Y Y +.Z e 1.a+a+:+(+:+:+3+4+(+4+[.. + + . . . . . . . . . + + . . . + . . . . . . . :+3+(+:+:+3+3+(+:+:+:+:+4+O.[.M.#+U.U.U.U.U.U.U.U.U.#+W.}.. . . . . . . + . . . . . . . + . . { w.U.U.W.#+U.U.U.U.W.W.Z.U.U.U.#+M.~.q =.=.=.>.=.'.&.=.=.=.*.>.| # @ @ . @ . . . . . . - . . # @ + $ k =.*.*.*.*.>.*.*.*.=.=.=.=.=.=.=.*.k f E w x y B B A B A B A w ' # # @ . . . . . . . . . . . @ # % ; h I w B x B B B B B A A B B B B x x l ", -"I A A A x B B A B B B B B B B B B B B A w ; % % @ . @ @ @ % % % f B B B B B B B A B B B B B B A B B 2 s f.8.9.0.j.9.9.9.9.9.i.9.8.u @ @ # # @ $ @ + @ @ # @ . % # @ + # . + = N i.b.e.f.9.j.j.9.9.9.j.d.j.N ^.m+D+G+y+w+z+z+G+z+z+z+F+y+x.$ @ & % % . # @ @ @ @ @ . @ . . % % $ + W j+y+z+G+z+z+z+z+z+C+z+B+E+G+g+t.N.f+9+9+|+9+9+9+9+|+|+9+9+9+|+9+}+9+2+}+|+9+%+L . $ + @ @ @ @ @ + + n.b+9+9+9+|+|+9+9+9+}+}+9+b+f+$+n.B.t+t+h+l+s+t+h+k+s+s+t+s+*+- = + # . . . . . . . . . . . . . . + + a X.s+r+t+h+d+s+s+h+h+k+h+s+r+t+E.i @.+.Z ` X Y Z Y Y Y Y Y .} @ @ . + @ % % @ + . + + + @ @ # - . ; } M @.+.+.Y Y Y Y Y Y Y Y Z +.X e 1.:+a+:+^+:+:+:+4+0+4+[.. # @ . . @ @ . @ @ . . . . . . @ . @ . @ . . @ . :+3+4+(+:+3+3+4+:+:+:+3+p+O.[.M.#+U.U.U.U.W.U.U.U.U.W.}.# . + . . . . + + . . . . . . . + . . . { M.U.W.#+U.U.U.U.W.W.U.U.U.U.#+F.~.q =.=.*.>.=.'.&.%.'.'.#.j = % @ + + + . . . . . . . - . + . . . | q *.*.=.*.*.=.=.=.&.=.=.=.=.=.=.>.m l E w x y B B A A w A w 3 ; # . . . . . . . . . . . . . . . @ * ; h w x x x B B B B A A B B B B A x l ", -"I w A B B B B B A A B x y B A A A w I l 2 % # @ @ . @ @ @ % % % f B B B B B B B A B B B B B B A B E 2 s 0.8.9.0.9.i.j.9.e.d.j.i.Q : % @ $ @ % $ + @ $ , , , + @ - @ # @ . . + : 5.j.0.f.0.9.9.9.9.9.0.d.j.N ^.m+G+z+y+w+w+z+z+z+w+z+y+T.] + + # % @ @ @ [ W a.a.W % % . . % % % @ - +B+z+G+w+w+z+z+A+w+v+y+E+C+g+t.N.f+}+|+|+}+f+|+|+|+}+9+}+}+|+}+}+|+9+|+7+%+L - . + + @ @ + $ $ $ + n.9+}+|+9+|+}+|+|+|+}+}+|+b+9+$+n.B.t+s+k+l+k+t+k+k+h+s+t+s+y.- = + . + + + + @ + + + . + + + + + @ @ a X.s+k+h+h+d+h+k+h+q+k+l+k+t+t+B.i @.+.Z ` X .Y @.Z +.Y M e ; @ @ + . . % * ' ( ( ( ; @ @ + . . - # & d P Y +.Y Y Y Z Y Y Y U Z +.X e 1.(+a+3+(+:+:+:+(+{+4+[.. # @ . @ @ @ . @ $ + @ + + # @ @ @ % @ @ . + @ . =+:+:+:+:+:+:+:+<+:+:+:+3+O.}.M.#+U.W.W.W.W.U.W.W.U.M.8 . + + . . . . - < J J 8 @ . . . . + . . . }.W.U.U.U.U.U.U.U.U.U.U.Z.Z.#+M.v q *.=.*.%.*.=.'.%.%.#.m = + @ @ + + + + , < m j < = + @ # . . + = | O #.%.=.=.=.=.=.=.=.*.=.=.=.=.*.k o -.x z y B x x A A w f * % . . . . # @ % * * * & % @ @ . . # @ % 2 w A B y x A B B B B B B B B A A I ", -"I w w B B B B B I w B x y x w w 0 h f * % @ @ @ + . . . # @ @ @ f B B B A B B A A B B B B B B B B E 2 s f.8.9.0.9.i.0.9.d.8.e.5.7 @ @ $ = $ % @ # = t N Q u 1 , - . % @ . . . + u 0.0.9.0.f.9.9.9.9.0.d.j.N ^.m+A+z+v+v+w+z+z+w+w+w+g+}.. . . . + @ % = T.m+E+A+i+g @ . . . @ * @ . a.v+A+w+w+w+w+z+z+w+y+F+E+C+g+t.N.f+}+|+|+}+}+}+}+|+}+|+}+f+;+2+}+|+5+9+%+L . $ # @ @ . . . @ @ $ + n.9+}+}+9+}+}+}+|+|+}+}+|+b+9+%+m.B.s+s+k+d+k+k+k+s+d+s+t+e+R # + . . @ $ . . + $ + + + + $ + + + @ @ a X.n+l+l+u+d+d+l+h+l+k+d+k+h+t+B.d @.+.U ` Z T Y ` @. .Y i # @ & % @ . . % ( n ` ` M d ' % . - . - - # ' n Y T Z Z Z Z Y Z Z Z Z +.Z e 1.<+a+:+(+:+:+:+:+:+6+_.. . . . . @ . . . + + $ $ . + # . # @ @ + . + . 8 (+:+:+:+:+:+:+(+:+:+<+<+3+O.}.M.#+U.R.R.U.U.W.W.R.U.w.# . . . . . . . a ~.U.#+M.}.@ . . . . . . . % O.#+U.U.U.U.U.U.U.U.U.U.Z.#+M.v q *.=.*.%.*.=.&.'.%.O 2 + . . + . $ @ = j >.=.$.q k , @ # # . + @ + f O #.'.&.'.=.=.=.=.=.=.=.*.=.=.k f R B A x B y y y A I % @ @ . . + @ % * ; 2 A 3 ' * % @ + . . . @ * h I A x y B B B B B A B B B x A w ", -"l w w A B x B x w w B x x A o l 2 * % # . @ . + + . . . . @ % % f B B B A B B B B B B B B B B B B E 2 s 0.8.9.0.j.9.9.f.f.d.j...: @ # @ @ . # . $ C 5.5.0.2.2.s + . % . + . . $ u 0.f.9.9.f.9.9.9.9.f.8.j.N ^.m+A+z+y+w+z+z+z+z+w+z+>+~ . . . . . @ * ^.x+y+A+w+z+'+. . . . @ * % + a.v+A+z+z+w+z+z+z+z+w+y+z+C+g+t.N.f+|+|+}+9+}+|+}+}+|+}+9+9+}+}+}+9+b+7+n.- @ $ @ @ . . . . . @ @ + n.b+}+}+|+}+}+}+9+9+}+}+9+9+9+8+m.B.s+t+k+l+k+t+s+s+l+k+t+n+b + + + + @ + - a R R R R R R R R R R R a 4.X.l+q+q+h+l+h+l+h+l+k+l+k+l+t+B.e @.+.U ` U .Z ` Z +.` i & + @ # . # % ' e @.+.` M M } ; @ # * ' ' ' d M X .Z Z Z Y Y Z Z Z Y +.Y e 1.<+a+3+:+(+(+:+3+^+6+s.7 8 7 a ].7 ].a 7 F H 8 ].7 8 - . @ @ . $ . + 4 O.(+:+(+:+:+:+:+(+:+:+6+<+p+O.}.M.#+U.U.U.W.W.U.W.R.M.}.. . + + . . . { M.#+#+W.`.U.8 . . . . . . . @ O.#+W.U.U.U.U.W.W.U.U.U.U.W.F.v q *.=.=.%.*.'.&.&.%.O , + . . + . $ $ 0 #.*.=.=.#.q j % @ # . . @ @ < j >.&.&.'.=.=.=.=.=.=.=.*.&.=.k l A A A x x x y A w l * @ @ # . . @ @ ; 3 h A A 3 ; % # . + . . # & 3 w A x y B B B B B A B B x B A 3 ", -"o I B A B x x x A A B y y A ; ; % @ @ @ . . . . . . . . # @ @ % f B B A B B B B B B B B B B B A A E 2 s 0.8.9.0.j.e.9.0.f.d.i.N , + + + . - ) > | !.d.e.d.e.5.|., $ @ . + . . $ 1 0.9.f.f.9.j.j.9.9.f.d.j.N ^.m+A+z+y+z+z+z+z+z+z+z+m+a.].g g g > . @ >+y+E+D+D+y+x+. + . + @ * % @ a.v+z+z+z+z+z+z+z+C+B+y+E+G+g+t.N.f+9+}+}+9+9+9+9+|+}+f+b+9+b+9+9+|+7+N./ + $ $ $ @ - . - . . $ @ @ n.b+f+f+f+|+|+9+9+9+}+}+9+9+f+8+n.B.u+t+s+l+s+t+s+s+d+k+t+n+{ . + $ $ . @ b X.[+e+[+~+~+[+~+~+[+d+~+X.~+e+t+s+s+s+k+k+h+q+s+k+h+h+l+t+B.i @.+.Y ` U X Y Z U Y P ( @ + + . . @ * } P +. .Y @.` n } } } e n n n M P X .@.Z Z X Z Z Z Z Y +.Y e 1.:+a+3+(+:+3+:+3+:+:+!+O.O.v.++++!+1+1+!+^+<+++@+L.:.. . % . . + + 4 O.0+3+3+3+:+:+3+3+3+(+:+3+3+p+O.[.M.#+U.U.W.W.W.Z.W.R.M.).. + + + . . + f U.#+U.U.U.U.w.. . . . . . . . w.#+#+U.U.U.U.W.W.U.U.W.W.#+M.v q *.=.%.%.%.&.'.{.%.q $ @ . . . . + = j #.%.=.=.*.>.O % . . . + @ + $ m %.&.&.=.*.=.=.=.&.=.=.=.&.=.k 3 E I r y y y B w I 2 % . . . . @ % @ 2 z w A B w l * . . . . . . % ; o A x x A B B B B B B B x A A 3 ", -"w w A B B x z x A x x y x 3 * % @ . . . . . . . . . . . @ @ @ % f y B w B B B B B B B B B B B A A E l s 0.8.9.0.j.e.9.0.f.d.i.N : = , = + . > , s i.d.8.8.8.i.5.: = @ . + . . $ : 0.9.f.f.9.9.9.f.9.9.d.j...r.m+G+C+z+w+y+z+z+y+z+C+G+F+x+j+-+T.a._.H A+z+F+E+E+y+j+. . . + $ ; % % a.v+z+z+z+z+z+z+z+z+y+y+E+G+g+t.N.f+f+|+}+9+f+9+9+}+}+f+b+b+|+9+9+f+&+/ . $ $ + . - a . - . . @ $ + n.9+}+9+}+|+}+}+9+9+}+}+|+|+f+7+n.B.q+t+t+l+k+s+k+k+k+l+t+[+/ + . $ $ . % R [+s+t+q+l+l+s+q+l+h+q+q+k+t+o+t+r+h+h+d+l+h+s+s+l+h+h+q+t+B.d @.+.@.` U Z Y X Y @.n ' @ . . . . @ * d ` +. . .Y Y Z P P P +.Y +.+.@.Y Y Y Z Z Z Y Z Z Z Y Y +.Y e k.<+1+:+(+<+:+4+4+3+:+3+3+4+4+^+^+4+!+^+3+{+0+4+_+M.9 . + . + @ - ~ O.0+0+3+:+:+:+:+:+3+3+:+:+:+:+p+O.[.M.#+U.Z.U.U.U.#+R.Q.U.}.. + . . . . + f Z.W.W.#+R.W.w.+ . . . . . . . w.#+U.U.U.U.W.Z.Z.U.U.W.W.#+M.m q *.=.%.%.*.&.'.!.*.j @ . . . . - + = O #.*.=.=.*.*.O < @ . . . @ @ @ m %.'.&.'.%.=.*.=.=.=.=.=.=.*.k 3 w w y x B x B z I ; # . . . . @ & * l z w A B A h * @ . . . . @ % * h A B B A A A B B B B B A x A I ", -"I w w A B A B x x B y x B 3 * @ . . . . . . # @ @ . . . . @ % % f x A A x B B B x B B B B B B B B B f D 0.8.9.0.f.d.e.f.0.0.0.2.N s u s : : : 1 Q d.d.e.8.d.f.v., + @ . + . - $ 1 0.9.9.9.9.9.f.9.9.0.d.e.N ^.m+A+z+y+w+z+z+z+z+y+y+z+A+z+y+y+y+y+x+j+z+v+F+y+F+m+a.> # - . @ % $ . I.y+z+z+z+w+z+z+z+w+y+y+A+C+g+t.N.f+f+|+|+}+}+|+}+|+}+}+|+b+|+}+7+%+5 - $ = $ . - L :.) - - . . . . n.9+|+}+}+|+}+}+9+9+}+}+}+|+9+2+m.B.t+s+k+d+k+s+h+h+d+d+k+X.! $ + + + @ + 4.e+t+k+~+~+[+[+d+k+q+q+s+s+s+t+t+s+s+k+d+h+k+s+h+d+l+s+h+t+B.d @. .@.` U Z Z +.+.P e ; . . + + # @ ' e @.+.@.` P P P M P P Y +. .T .X Y U Z Z Z Z Z Z Z Z @.+.Y e k.<+1+3+(+:+(+(+(+(+:+:+3+:+:+<+<+3+3+^+:+:+(+4+++4 + . + + + $ > u.0+{+4+(+3+:+:+:+:+3+:+<+:+:+<+p+O.}.M.#+Z.Z.M.W.U.W.`.`.U.}.# . . . . . . { Z.#+Q.#+Q.W.}.. . . . . . . { M.#+U.U.U.W.Z.U.U.U.U.U.U.W.F.v q *.=.%.%.*.'.&.&.*.| @ @ . . . . + , O #.=.=.=.&.%.#.2 @ . . . . @ $ < O %.'.%.'.=.*.*.=.=.=.=.&.%.k 2 w w B x x z x A I ; @ . . . . . % ; o A w A A A l ; % . . . . . @ * h w A B A A A B B B B B x B z l ", -"I w B w B A B B x x y B A h % # . . . . + { % & @ . . . . @ % % f B B x A B B B A B B B B B B B B B 2 s f.8.9.0.0.8.d.0.0.f.9.j.5.5.2.5.5.i.5.2.9.9.9.9.f.f.2.u = . @ . - . . $ u 0.f.9.9.9.9.f.f.9.0.d.e.N ^.m+C+G+v+w+w+z+y+w+v+y+z+D+C+w+w+A+A+A+A+w+x+m+m+'+a.$ $ % @ . @ + . g m+z+z+z+w+w+w+z+z+w+w+y+E+C+g+h.N.f+|+|+|+}+|+|+}+|+}+|+b+b+}+7+8+L @ $ $ $ + - / N.:.) . - . . . . n.b+|+}+}+}+}+}+|+|+}+}+|+|+|+%+m.B.s+t+k+l+k+s+k+h+d+d+k+y.* $ + + . % + c.X.X.c.R R 4.c.c.E.X.[+l+s+k+k+k+l+k+k+k+d+d+k+h+k+d+k+h+t+B.d @.T Y ` U P Z .+.P } * . . + + # % ; d @.P d i d d } } d e n P @.+. .+.Z Z Z Z Z Z Z Z Z Z @.+.Z e 1.(+a+:+:+=+:+(+:+:+:+:+:+:+:+:+(+^+:+:+<+<+4+(+7.+ + @ @ + + = W 0+0+=+(+(+:+:+:+:+:+(+:+(+:+<+:+4+O.J w.U.U.M.M.W.U.W.++@+W.F.{ + . . . . . . J M.++Q.R.G.8 . + . + . . . }.M.U.U.U.U.R.W.U.U.U.U.U.U.U.F.v q *.=.%.#.*.=.&.'.*.j @ @ . . . + + < #.=.=.*.=.&.'.#.| @ # . . . # @ < j %.=.*.*.*.*.=.=.=.=.*.*.%.m l -.A x y y A x I I % @ . . . . # % ; o I I A A I I 3 & . . . . . @ * 3 I A x B B B B B B B B z A A l ", -"w w B B B x B B y x B B I h % . . . # @ % f l 2 % . . . . @ @ % f B B B A B B B w B B A B B B B B E 2 s j.8.f.0.f.d.d.f.f.d.8.b.i.i.0.0.e.j.d.d.9.9.j.j.f.i...: + - @ @ + . - $ s f.f.9.f.9.9.9.0.f.0.d.j.N ^.m+A+z+y+w+z+z+z+y+w+z+y+A+z+B+C+C+A+C+A+v+x+a.a.] @ $ % % @ # # . 5 T.v+z+z+z+w+w+z+z+z+z+w+y+F+C+g+t.N.f+}+}+|+}+9+9+|+}+9+9+b+|+}+8+n.- . $ % $ @ / n.7+F.{ - - . + . . n.b+}+}+}+|+}+|+9+9+|+}+|+9+}+2+n.B.s+r+k+l+s+s+h+s+d+d+s+c.; = + . . . . 8 b @ @ @ + + + + . b c.X.l+l+l+k+d+k+s+k+h+h+h+l+k+d+h+h+t+B.d @.+.U ` Y M @.T .P ( @ - @ $ @ . @ ; p c e * % % @ @ @ @ ; } e M Z U Z Z ` Z Z Z Z Z Z Z Z @.+.@.e 1.<+a+3+(+:+:+(+4+:+(+(+:+(+(+:+^+^+3+(+(+:+:+u.= + $ % & + $ 7 <+0+(+:+:+:+:+:+:+:+3+_+(+:+:+a+<+4+O.}.M.#+U.W.W.U.U.U.W.W.U.Z.}.@ . . . + . . @ J z.k.}.% . . + . + + . $ w.U.U.U.U.U.U.U.U.U.U.U.U.U.U.M.v q *.=.=.=.=.&.&.'.,.m @ # . . . . + = >.=.'.=.=.{.$.#., + . + . . @ @ = j *.=.*.*.=.=.=.*.=.=.=.=.=.k l R A y x x B I I I % % # . . . @ & 2 l w I A B A w l * @ . . . . @ & 2 I A x A B B B B B B B B B A l ", -"w A A B B x B B B y x A w 3 * % @ @ * ; 3 w w ; & . . . @ % @ % f B B B B B B B B B B w B B B B x E 2 s 0.8.9.0.j.9.9.f.0.9.8.b.j.i.0.d.8.8.d.9.9.d.i.i.i.Q u = . . @ $ + . + , v.9.9.9.0.j.j.9.9.9.f.e.j.N r.m+G+G+y+z+z+z+z+G+C+w+B+B+y+x+z+z+C+z+w+x+m++ + + + % % % . # ] a 1+y+D+E+z+z+w+w+z+z+z+C+z+F+F+G+g+t.N.f+9+9+}+}+9+9+9+|+7+f+|+b+%+z./ - @ @ % # ) m.2+f+A.) - - . . . . n.9+}+f+}+}+}+}+9+9+}+}+}+9+f+%+n.B.q+r+d+d+s+t+s+s+h+k+s+R % $ + . - . + . . @ + $ $ = $ + + + + b X.n+l+t+s+h+h+k+h+k+q+u+k+k+h+h+t+B.d @. .U ` +.@.Y .+.P ( . . % % % @ @ * 3 } ; . . . . . + + @ % ; e n Z Y Y ` Z Z Z Y Z Z U Z Z +.Y e 1.a+a+4+(+:+3+(+:+:+:+3+(+0+{+(+(+(+4+(+{+4+O.4 + + % & % $ ~ O.#+4+:+:+:+3+(+3+:+:+3+3+3+<+:+<+3+4+O.[.M.#+Z.Z.U.U.U.U.U.U.U.Z.M.f . - + + . . . . . . . . . . . . . . { k.R.U.U.#+#+U.U.U.U.U.U.U.U.W.#+M.v q '.=.=.*.*.=.&.%.>.m % % @ - . - + $ j %.'.{.=.!.{.#., $ @ . . @ @ % $ j *.=.>.>.&.=.*.=.&.&.=.=.=.k l w w A y y A A w h % @ . @ . . @ % 2 w z w A A x w l * @ . . . . @ % ; I w B B B B B B B B B y A z l ", -"l A w A B x B B A A A A w 3 ; ; ' 3 3 A z x w * . . . . @ @ @ % f y B A B B B B x B B B B B B B B B 2 s 0.8.9.0.j.9.9.9.9.9.9.9.9.9.9.f.0.0.9.d.8.b.j.5...7 $ $ + $ $ @ - + = u f.8.9.f.f.9.9.f.f.9.9.d.j.N ^.m+G+z+y+z+G+B+z+z+y+z+z+z+z+z+z+z+z+z+z+E+T.# # # + - - & @ + W +v+F+E+E+A+C+w+z+y+z+E+z+B+y+E+C+g+h.N.f+9+|+|+9+9+9+|+|+9+9+9+7+J.) $ - % $ . ) n.2+9+b+C./ . + @ . . . n.|+7+}+}+}+}+f+f+9+}+}+9+9+7+%+n.B.u+t+s+l+h+s+s+k+t+k+d+{ . + = @ @ . . . . - . + + $ $ @ + . - + = E.n+o+o+l+u+h+h+s+h+s+h+h+s+s+t+B.d @.T Z ` Y +.U @.Y M ; @ @ + @ % % @ . . . . @ # . . . @ @ % % . . 3 M T +.Y Z Z Z Z Z Z U Z Y +.Y e k.a+a+3+(+:+3+3+3+(+:+3+3+4+4+(+4+4+(+(+(+)+}.. . $ @ @ @ $ H 4+6+4+3+<+:+3+4+(+:+:+:+3+3+4+<+:+^+4+O.[.M.#+U.U.U.U.U.U.U.U.U.U.#+R.J . + . . . + + . . . . . . + . . { k.Q.Q.Z.U.#+U.U.U.U.U.U.U.U.U.W.#+F.v q =.=.=.>.>.=.&.*.#.O % % $ @ . % . $ < O >.|.,.*.%.j = $ @ . . . . @ # j '.'.=.=.=.=.=.=.=.=.=.=.=.k 2 E w x y B w B B l % . . @ # . . @ 2 A y w x y B w 2 * # . . . . . @ ; w x y B B B B B B B B A x A w ", -"l A w w B x B B A A A A A l h 2 r y A A B A l & . + . . . @ % % f x A w x B B B B B B B B B B B B B 2 s j.b.9.0.j.9.9.9.9.9.9.9.9.f.f.f.d.9.j.j.j.j.5.t : = + @ . @ @ @ + = 1 i.0.e.f.9.9.f.9.0.0.9.f.d.j.N r.m+C+z+w+w+y+z+z+z+w+z+z+z+w+w+w+z+z+C+w+F+I.+ % % @ @ @ % % + % g x.j+F+y+z+E+E+z+y+y+z+C+B+y+A+C+g+t.N.f+|+|+|+|+9+|+|+}+|+9+2+$+5 & . + $ + - L &+7+|+9+J.) . + @ @ . . C.b+9+9+f+}+}+}+9+b+f+}+9+9+f+%+n.S.s+t+k+l+h+t+s+l+k+l+X.% % $ $ + + . # + # @ . # # @ # @ @ . + @ $ b X.s+t+k+h+h+s+s+h+s+h+h+h+s+t+B.d @. .Z ` U +.` ` Z M ' # . + + @ % @ + . # % * * @ @ @ + + # % . @ ' n +.@.@.Z Z Z Z U Z Z Z Y +.Y e 1.<+a+3+(+(+3+:+(+:+<+:+(+(+:+(+{+(+(+4+0+U.^ + . + . $ @ ~ v.{+:+:+3+:+:+(+3+:+:+:+3+3+:+<+:+:+3+4+O.[.M.#+U.U.U.U.U.U.W.Z.U.W.#+Z.w.! . . . . . . . . . . . . + + . J q.#+#+U.U.U.U.U.U.#+U.U.W.Z.U.U.#+M.v q =.'.*.#.*.%.&.*.,.O , $ @ $ . @ @ + , D j #.%.O j = + + + + . + + # @ j &.&.=.=.=.=.=.=.=.&.=.&.*.k f I A z y y A y A l % . . . @ . . @ 2 A y A A B A I h % . # . . . . # * w y y B B B B A B B B B x w w ", -"l w w w w x B x x A B w A w w w A x A w A A 3 & . . . . . @ @ % f B w A B B B B A B A x B B A B B E l s f.8.d.0.j.9.9.9.9.9.9.9.9.f.f.0.d.b.j.0.2.5.s : = . . - # @ . + = 1 Q i.0.d.9.9.9.9.f.9.9.9.0.d.b.N ^.m+A+z+y+v+w+z+w+w+v+w+z+z+w+v+w+w+w+w+v+x+I.+ % % & % % @ @ # + # @ g j+x+y+w+w+w+y+y+A+A+v+x+w+D+g+t.N.f+|+|+|+|+|+|+}+}+}+7+$+5 . . . . . - 5 &+}+|+}+|+].{ . $ % @ . . C.5+|+|+|+|+}+}+}+|+|+|+b+b+7+$+m.B.t+t+d+d+k+s+k+d+k+l+E.& % # @ $ $ + @ { ! f -.R ) # # @ @ + . @ @ - c.n+k+k+l+d+k+k+k+k+k+s+h+h+o+B.i Z T ` ` U +.Y U @.n ' @ @ @ + . # @ . @ % ' } } ( ; % @ . - @ . @ * } M Y Y U Z Z Z Z Z ` @.U U X e (.<+<+:+:+:+:+:+(+:+:+:+:+:+:+:+(+(+(+4+1+3.+ + + . . . . H 4+:+^+(+<+:+:+(+:+:+:+:+:+(+:+:+:+:+:+3+u.J M.#+U.U.U.U.U.U.W.R.U.U.M.}.@ . . . . . . @ + . . . . . . . . + * z.`.W.U.U.U.U.U.U.U.U.R.R.U.U.U.M.v *.=.=.%.%.*.=.&.'.%.%.j $ + # . # % . @ $ , < m , @ % . . . . + + + . . 0 *.&.=.=.=.*.=.=.*.=.&.=.=.k l R A x x p I B y h % . . # @ # . @ 2 A y w A x B w 3 * @ @ . . . . @ * I w y B B A w A B w x A z y l ", -"h A w w B x B B B x B A w A w A B B A w A A w * . . . . @ @ @ % f B x B w B B B A x w B B x w B w B f D 0.8.0.0.f.9.f.9.9.9.9.9.9.0.0.e.b.b.i.5.u 1 + $ . - - . . . + $ : |.0.f.d.d.9.9.9.f.9.9.9.f.0.d.j.N ^.m+G+G+y+w+z+z+z+w+w+z+y+z+w+w+A+z+z+w+w+v+H.> ~ ] > > $ $ + @ $ @ $ @ W j+y+w+w+w+y+y+z+C+G+y+E+C+g+t.N.9+|+}+}+|+9+9+9+|+8+$+h.- . + + . ) 5 C.2+}+9+|+9+C.) @ @ % @ . . C.5+9+}+}+}+}+}+}+9+}+|+9+9+9+%+n.B.u+t+h+l+k+t+k+d+k+n+X.R ! * { - # . & c.[+n+n+s+X.c.! $ $ $ + + + - 5 S.l+k+h+h+h+h+h+k+k+s+h+s+t+E.d @.+.Y ` U +.Y ` Y M ' @ @ @ . @ @ . % ; ( n P M n e ( ; . . $ . @ & ' n ` X Z Z Z U Z Z U Z U +.Y e 1.a+a+^+^+:+:+3+:+:+(+_+^+(+{+(+(+4+0+{+L.* . . . + + + + v.{+(+_+3+:+<+:+:+_+3+:+(+3+:+:+:+:+:+:+4+O.[.M.#+U.U.U.U.U.U.U.U.U.M.8 . . + + . . . @ $ { { @ # . . . + . . . @ }.U.U.U.U.U.U.U.U.U.U.U.U.U.#+M.v q =.%.*.#.=.=.&.&.%.=.O 0 $ @ + % @ # . @ @ $ + % # @ @ @ - . . + + + + m *.&.=.*.*.=.=.=.&.*.*.*.%.m h E w z y B w y A I % . . @ . . . @ 2 A y w x r A w 3 * @ . . . . @ % * w A y A A x B x B B B A I z h ", -"A A A w B B B B B B B B B A w w A z A A A B h * . . . . . @ % % f B B B B B B B B B B B B B B B B B 2 s 0.8.e.0.f.9.9.9.9.9.9.j.9.0.f.9.j.j.5.t 4 @ @ @ - - . . . $ , 1 Q i.9.e.e.f.j.f.f.j.j.f.9.f.f.d.j...^.m+G+G+y+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+A+F+>+T.1+'+T.x.> . . @ @ $ % + . x.x+B+A+A+y+y+z+z+B+y+E+C+g+t.N.f+9+9+|+9+f+9+|+}+2+n.- . $ + $ . ) N.&+2+7+}+}+f+n./ . $ @ @ . . z.7+2+2+2+}+|+|+9+9+}+}+9+b+9+2+n.B.s+t+k+d+h+s+s+q+s+t+s+l+[+X.E.y.R c.E.d+s+s+t+s+n+[+R $ + $ $ @ @ % & E.r+t+s+k+s+s+s+s+k+h+q+s+t+B.d @.+.Z ` +.+.Z ` Y M ' + @ @ . . . @ % ( n ` Y +. .` e ( % + . + . . * } M .Z Z Z Z Z U Z Z @.+.Y e 1.a+a+3+:+:+3+3+:+:+:+3+3+4+(+:+3+3+3+^+C . + + + + + + 8 p+{+:+4+4+:+<+:+:+:+3+:+^+3+3+3+4+<+:+a+p+O.[.M.#+U.U.U.U.W.#+#+V.{+}.. # + + + . . # % }.`.#+q.J { - . + + + + . % w.U.U.#+U.U.U.U.W.U.U.U.#+#+M.v q =.=.*.#.=.=.&.&.&.'.%.#.| $ $ @ @ % + . @ @ . & % @ # + + + # + + @ + j =.&.=.=.=.=.=.=.=.=.=.=.=.k l R x z y B I y w w % . . . . . . @ 2 A x A x r A w f % @ . . . . . @ * w x B B B B B B B B B A x w A ", -"I A I B B x B B B B B B B B B w x y A w A A 3 * . . . . . @ % % f y B B B B B B B B B B B B B B A E 2 s f.8.9.0.9.9.j.9.9.9.9.9.9.9.f.i.i.5.t , + # # - - - + + = , u |.i.j.d.d.j.9.f.9.9.9.j.f.9.9.f.e.j.N ^.v+D+z+y+w+z+z+z+z+w+y+z+z+z+z+z+z+z+z+w+D+A+y+x+x+F+x+x.- . . @ @ % % % a.m+B+G+A+z+y+y+C+z+z+E+C+g+t.N.f+9+|+|+9+9+9+9+}+$+/ . = + @ . # _.n.C.C.C.C.C.C.a ) . + + @ @ + L C.n.K.7+7+}+9+9+9+|+}+9+9+f+%+n.B.s+t+k+l+h+s+s+h+t+t+t+s+s+l+k+l+l+l+o+t+q+t+t+t+t+t+E.& @ + + . . @ & c.t+o+t+d+h+h+s+s+k+k+h+s+t+B.p @.+.Z ` U +.Z U Y P ' # @ @ . . . @ * d ` +.+. .T .P i * @ + + . - # ' M .@.Z Z Z Z Z U Z Z +.Y e 1.<+a+3+(+:+:+^+:+:+:+:+(+4+(+(+0+{+4+P., @ $ + . . . { O.4+_+_+:+:+(+:+:+:+3+:+:+:+(+:+:+(+<+:+3+p+O.}.M.#+Z.U.U.W.W.U.U.#+G.% # @ . . . . . { q.U.U.Z.U.#+J . . + . + + + . ).M.U.Z.`.U.U.U.U.W.U.U.Z.#+F.v *.'.'.=.*.=.=.=.&.&.&.%.>.#.0 , $ $ $ + + + . . @ $ f 0 = $ + @ @ . @ @ j '.=.=.=.=.=.=.&.=.=.=.=.*.k f w E z y B I y y w % . . . . . . @ 2 w A w x y A w 3 & . . . . . . @ ; w x y B B B B B B B B A y z 3 ", -"l I B A B B B B B x B B B B B A x x w A x A 3 * . . . . . @ % % f B A w B B A B B B B B B B B B B B h s j.8.9.0.f.9.9.9.9.9.9.9.9.9.d.f.2.u $ + # @ . + . + $ = : ..i.j.i.9.9.d.9.8.9.9.f.9.9.9.9.f.0.8.j...^.m+G+z+y+w+B+B+z+z+z+z+z+z+z+w+A+z+z+z+z+D+z+B+y+D+A+y+x+5 + + . % @ + @ ~ '+y+w+z+z+z+y+y+y+y+E+C+g+t.N.f+9+|+|+9+9+9+f+|+$+@ $ = & % @ . - @ . - - - - . 5 - + + @ % # $ + . - / n.2+|+|+b+9+}+}+9+9+9+2+n.S.u+t+k+l+k+s+s+l+q+s+h+k+k+d+k+s+h+k+t+s+k+q+r+t+o+o+B.; # . . . + $ @ R t+o+t+h+h+h+s+s+k+k+q+s+r+E.d Y +.Z ` U +.Y ` Y M ' @ . # . . . # ; n .+.Z +.T .` e * % . . . . - * n T @.Z Z U Z U Z @.+.+.Y e 1.<+a+3+(+:+3+^+4+:+(+3+3+:+(+{+(+(+4+u.+ % @ @ + . - { 0+:+4+_+:+4+4+:+<+3+:+:+:+:+:+3+3+<+:+3+3+4+O.[.M.#+#+W.Z.U.U.U.U.U.k.@ . . + . . + + J `.Z.U.U.U.U.#+{ . + + . . . . % M.#+U.Z.U.U.#+#+U.U.U.Z.Z.M.m q *.'.%.#.=.=.=.=.=.&.'.%.,.q j = $ $ $ $ % $ $ , j #.m = = + - + + . & 0 %.'.=.*.=.=.=.=.=.=.=.&.=.k h E I A A B A y A h & # . . . . . @ 2 x B A B y w I 3 * @ . . . . + @ ; w x y A B B B B B B B A B A I ", -"h A w A B w A x B p y B A A B A A y A w x x l { . . . . @ % @ % f x x B w B B x w B B B B B x B B E 2 s 0.8.9.0.f.j.9.f.f.9.9.9.9.e.d.2.1 = + - ) - + + + $ = s |.|.8.e.0.f.d.d.d.9.9.0.9.j.9.9.0.f.0.d.e.N ^.m+E+z+y+v+w+w+z+y+v+v+w+z+w+v+w+A+w+w+v+v+y+y+w+D+D+w+z+_.- - . $ $ @ . . T.y+D+w+w+y+y+y+w+y+z+C+g+t.N.f+|+|+}+|+9+}+}+9+$+- + , @ & @ ) & * $ = $ = @ % - - + + $ @ . + $ $ + 5 z.8+|+b+b+|+}+}+}+9+9+$+m.B.s+k+d+d+k+s+k+d+d+k+d+l+l+d+h+h+q+h+k+k+k+s+d+k+t+e+X.b % @ . - @ $ $ R n+t+k+k+k+s+h+h+s+k+h+k+t+E.d @.+.U ` U +.Y Y Y P ' @ @ % @ - . @ ; n T @.M @.+. .@.e ' % . . . - - * n T Z Z Z Z Z Z U Z @.+.X e (.<+a+{+:+<+:+:+:+:+=+(+{+{+(+:+:+:+P.H + @ @ + . . - J {+_+=+:+:+:+<+:+:+(+(+:+:+:+:+:+(+:+:+:+<+p+O.J M.#+U.R.R.U.U.U.U.M.}.. . + + . . . { F.Q.U.U.U.U.`.U.f # . . + + . - + w.Z.U.R.R.U.U.U.U.U.U.U.W.F.v q =.%.=.*.*.=.=.*.*.'.'.'.#.,.#.}.j 0 | | < 0 j ,.%.#.1 , $ + - . # # $ j %.'.=.*.=.&.*.*.=.*.*.=.*.k l w I A y B w y A w # # . . . . . @ 2 A x w x x w I l * @ . . . . + + * w x x w x B B x B w B y x A I ", -"I A B w x x B B B A x B B w A B B B A A B B 3 * @ . . . @ @ @ % f B B B B B B B x B B B B B B B B B h s f.8.9.0.j.j.j.0.0.0.b.b.d.i.{.j $ . - + + . ) - . : N i.e.8.9.0.d.8.d.0.f.8.8.8.9.f.9.9.9.9.f.e.j.N ^.m+D+D+z+w+z+z+y+z+w+w+w+z+v+v+y+w+v+j+T.z+z+y+B+y+y+y+z+u.- . . . $ @ . + T.x+z+A+z+z+z+w+y+y+z+C+g+t.N.f+}+9+9+9+9+9+9+}+$+/ - % $ . . . . . . . . . . . . . . . @ $ $ $ % % $ - z.2+9+9+9+9+|+|+|+9+f+%+n.B.u+t+s+l+k+s+k+h+q+q+k+k+d+[+e+d+d+d+d+d+l+t+s+t+r+n+X.b @ + + + . @ % I s+k+d+k+h+h+s+h+k+k+h+h+t+B.d @.+.Z ` U Y Y Y X Y d * - - + - . @ ( M +.@.P +.T .` e ' * $ @ . + $ ; c T @.Z Z Y Y Z Z Y @.+.Y e k.a+a+:+:+:+:+3+:+:+:+:+:+:+:+:+(+0+V.% . . @ @ . + ~ P.6+_+:+(+:+:+:+:+:+:+:+:+:+:+:+:+:+(+<+:+3+p+O.}.M.#+U.U.U.U.U.U.U.M.).@ . . # + + . - F.U.U.U.U.&+Q.Q.}.% . . . . . . . w.U.#+U.U.U.U.U.U.U.U.U.#+M.v *.'.'.&.*.*.=.'.=.=.&.&.&.&.&.&.%.&.&.%.%.%.%.>.%.%.#., $ % # @ # # @ < q =.=.=.=.=.=.=.=.=.*.=.=.'.m l R A A y B I I I w ; % # . . . . @ ; o z A x x w h * . . . . . . @ * l w B B A B B B B B B B A x A w ", -"I A w B x x B B B B B B B B B B y y A A B B l { . . . . . @ % % f B A w x B B B w B B x w x w B x B f D j.8.f.0.j.9.9.9.0.0.e.d.d.|.t : $ + . . . + = , : {.i.j.e.8.j.9.e.8.d.f.0.8.9.d.9.j.j.9.9.9.f.8.j.N ^.v+D+G+y+z+G+G+z+z+w+z+m+I.x.x.W W @ - . >+y+z+C+A+C+z+z+H.- - . @ @ % # $ c+x+z+z+z+z+z+z+y+y+E+G+g+o.K.f+9+|+|+9+9+9+9+}+@+- @ $ = @ . . $ @ $ + $ $ + $ @ - . . . . @ @ $ @ @ ) z.2+|+b+9+9+|+}+|+b+f+%+n.B.t+t+t+l+k+s+s+u+s+s+X.X.E.E.m.b R ; E.l+t+t+t+t+n+u+E.! @ + + . @ $ # c.t+o+k+d+h+s+s+s+k+k+s+s+q+B.d @.T Z ` +.X +.+.+.` e ; . . + . . @ ( e @.+.Z +.T .` e ' % $ @ . - @ ' P .Y Z Z Y Y Z Z Y Z +.X i 1.^+a+3+:+:+(+4+3+(+(+3+4+4+:+:+3+{+w.@ @ . @ @ . . [ 1+_+3+:+:+:+3+:+:+:+:+:+3+(+:+:+:+:+:+:+<+6+p+O.[.M.#+U.U.U.U.Z.Z.U.Z.}.. . . . . . . { q.U.Z.#+U.W.U.#+m @ . . . . . . # w.U.U.U.U.U.U.U.U.U.U.U.#+M.~.q '.'.%.#.=.=.&.*.>.#.*.*.*.%.%.>.,.,.%.%.'.'.'.%.%.#., $ @ . + . # + | *.&.&.=.*.*.*.=.=.=.=.*.=.=.k f w A y y B z I w A 2 % # . . . . @ % l I x z y z A f + . . . . @ @ * h w y B B B B B B B B x A x A h ", -"h A B B x x x B B B B B B B B B y y A A B B w * . + . . . @ % % f B B B B B B B B B B B B B B B B E 2 s f.8.9.0.j.9.9.9.9.9.j.i.0.N , $ + . . % @ $ , : s |.|.i.0.5.i.5.5.5.5.|.5.j.j.9.9.9.j.9.9.9.f.d.j.N ^.m+D+z+y+y+y+y+z+z+z+w+x.@ % % & . # % % r.G+z+D+D+D+E+F+g . . . % % @ % g j+y+w+z+z+z+z+C+G+y+E+C+g+t.N.9+|+}+}+9+9+9+|+}+&+. + = = + . $ + + $ $ $ + + $ $ + . . . . @ @ . - - 5 C.7+|+9+b+b+|+}+|+9+f+%+n.B.s+t+s+l+h+s+s+d+l+E.; % % % - - & % R ~+l+q+s+t+e+n+c.# @ @ + + + @ b X.s+t+k+s+s+s+s+h+h+h+s+s+t+B.d @.+.U ` U Y Y +.X ` n ( $ + . . . @ & } P +.+. .T .P i * % . . . . @ ' M .Y Y Z Y Y Z Z Y +.+.Y e 1.4+a+6+:+:+:+:+:+:+:+3+3+3+6+<+4+)+}.. + . . . . + 7 3+3+:+:+:+:+:+:+:+:+3+3+3+:+(+3+3+3+:+:+_+6+p+O.}.M.#+U.U.U.U.W.W.Z.U.}.. + . . . . . # f Q.#+U.U.U.Q.#+{ . . . . . . . @ M.#+W.U.U.W.W.U.U.U.U.U.#+M.v q *.&.'.%.>.=.'.*.=.>.#.#.q j 1 j < < , O %.'.&.#.#.j % + @ @ + . . = j >.&.&.=.=.&.*.=.=.=.=.*.=.%.q l E A y y B I z A A h % # . . . . @ % 2 I A A w w 3 * % @ . . . @ @ * I w y y B B B B B B B B A y I A ", -"I A w B x x B B B B B B B B B B B B A A B B 3 * @ . . . @ % @ % f B B x x B B B B B B B B B B B B E 2 s j.8.9.0.j.9.9.0.0.9.j.f.2.1 . - . - - . + $ = = $ = = @ , = = $ , , , $ , 5.9.f.9.9.j.9.9.9.0.9.j.N ^.m+D+z+y+z+z+z+E+z+z+A+>+% # % & @ . - @ ^ x+y+A+D+w+B+>+- - . % % % # @ a.m+y+A+z+B+z+z+A+z+y+F+G+g+t.C.f+}+}+9+9+f+}+9+}+J.5 - + - - - ) - - - - - - - - ) . - . . . . + - ) - 5 C.b+9+9+9+9+7+}+|+b+7+%+n.B.s+t+k+d+d+s+s+u+d+l+; % = $ . + + @ ! X.n+k+q+n+n+X.b % @ + . + . . b [+s+s+s+k+h+s+s+s+k+h+s+s+t+E.d Y +.U ` +.X Y Y Y Y P } ' * @ . . . @ ' e ` X Y P M n ( @ - + . . - * } M Y Y Z Y Y Y Z Y Y @.+.Y e 1.<+a+<+:+:+3+3+:+:+:+3+4+^+6+<+4+O.4 . + . . @ @ + /.p+a+(+:+:+:+3+:+:+:+:+:+:+:+:+:+:+:+(+(+a+<+4+O.[.M.#+Z.Z.U.U.U.W.W.U.w.. + . + + . . + $ M.Z.U.#+U.U.}.@ . . . . + + - 8 M.Z.U.U.U.U.W.W.Z.U.U.#+#+M.v q %.'.'.%.*.=.&.=.#.#.k = $ $ @ @ + $ , q >.*.,.#.#.| $ $ @ . . . @ < O *.&.=.=.*.*.*.=.=.=.=.=.=.%.k l w w x y B w A A A I ; % # . . $ @ @ ; 2 l I I h * @ + + . . . @ * 3 w w y B B B B B B B x B A x I I ", -"h A w B x B x x B w A B B B B B B B A A B B 3 & . + . . . @ % % f B B x B B B B B B x B B w B B B B h s f.8.d.f.f.9.9.9.9.j.i.5.1 $ . . - - + @ $ + . . - - - - - - @ - - . + ) $ v.0.9.9.9.j.9.9.9.0.d.j.N ^.m+G+G+y+w+w+w+z+w+v+z+v+W . @ & @ . . - + g 1+F+w+x+H.{ . . @ & % @ - . -+y+v+A+z+y+z+z+w+v+v+E+C+g+h.N.f+|+|+|+}+|+|+}+}+;+n.n.7.h.n.m.7.n.7.n.h.n.h.n.m.a { - . - . . + L n.m.n.K.}+|+|+9+b+}+}+}+9+9+%+m.B.t+t+k+l+k+s+k+k+k+[+E.% $ = $ $ = $ . ! E.n+k+e+*+a % % @ . . @ @ ! E.l+d+l+q+k+h+k+h+h+k+k+k+s+t+B.d @.+.Z ` U U Z U Y U ` n } ; % # . . @ * ( e M M M e } * . - + . . @ ' n ` U Y Y Z Y Y Y Y Y @.+.Y e 1.<+a+^+(+:+:+:+(+:+:+(+:+^+^+=+{+O._ @ @ . @ @ . { u._+:+:+:+:+:+:+:+:+(+:+:+:+:+:+:+:+(+:+:+:+<+3+O.}.M.#+U.U.U.U.U.U.U.U.w.% . . . . . . . . { F.U.Z.U.}.. . . . . . . . . ).Q.Q.W.U.U.U.Z.U.U.U.U.U.U.M.v q =.'.=.*.*.=.'.=.*.#.m @ $ @ @ - . . = < q >.=.j 0 $ @ % # + + @ = j >.=.&.=.*.=.=.=.=.=.=.=.=.=.=.k o E w A x B A B y A I 2 % @ # . . . @ % @ 2 2 2 * % @ % @ . . . @ * f A B B B B x B B B B B B A x A A ", -"I A w B x B x B B B x B B B B B B B A A B B w * . . . . . @ % % f B A w x B B B x B B B x B x x B E 2 s j.8.9.0.0.9.9.e.b.d.i...: . - - . . . . @ $ . . - . . - . - + . . + . . , |.0.9.9.9.9.9.9.9.0.8.j.N ^.m+D+A+B+w+w+y+y+z+w+w+z+'+] @ % & $ @ . @ . - g g g { . . . @ & % # @ a.m+y+z+z+w+y+z+A+w+y+y+z+C+g+t.N.9+|+|+|+|+|+|+|+|+|+}+2+2+2+;+7+2+2+}+2+}+2+}+}+7+a.[ . - . . . . z.2+2+2+7+9+b+}+7+9+}+}+|+b+f+2+n.B.s+t+k+d+k+s+k+t+t+[+[+b . + . $ $ $ . ) - b b ! ) - % @ . . . + . a ~+k+l+d+k+k+k+k+h+s+k+k+h+s+q+B.d @.+.Z ` +.Z Z U +.X ` M e ' * % @ . . @ * ; ' ( ; ; % . . - . + @ * e M U Y Y Z Y Y Y Y Z Y U +.Y i 1.<+a+:+:+(+3+3+:+(+:+3+4+4+:+<+6+u.+ + . . . @ @ ~ M.(+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+(+:+<+<+:+4+O.}.M.#+U.U.U.U.U.U.U.U.U.}.. + + . . . . . + + { { % . . + . . + + . . f J.`.R.W.R.W.U.U.U.U.W.U.U.#+M.v *.=.'.%.#.*.=.&.&.%.%.O < $ @ - . . @ @ + $ , | = $ + @ @ - - + = | O %.&.&.=.*.=.=.=.=.*.=.=.=.=.*.q f w A y y y B B y B I I * # . - . @ # @ @ & % & % @ @ . . + @ @ * 2 l A y y z B B B B B x B w y A I I ", -"I A w A A A B B B B B B B B B B B B B x B B 3 * . . . . . @ % % f B B B B B A B B B B B B B B B B E 2 s f.8.9.0.9.d.d.d.d.j.5.t $ . . . . . + + + . + + + $ $ $ @ + $ @ . $ + . , !.j.9.9.9.j.9.9.9.f.8.j.N ^.v+D+C+w+w+z+F+z+z+z+w+z+y+x.+ @ % & & % & . . . . - . $ . $ % % @ . ] -+y+y+z+A+z+y+z+A+z+y+z+E+C+g+t.N.9+|+|+}+|+9+|+|+|+5+f+7+}+9+9+9+7+9+}+|+9+}+|+9+b+].) - . + - . . C.9+7+7+f+|+|+}+f+b+}+|+9+9+f+2+m.B.s+k+h+l+k+s+s+k+k+o+e+X.& . . - . + + . . . # % @ @ @ + $ @ + . a X.k+k+u+u+u+h+h+h+s+q+k+k+h+q+t+E.d +.+.Z ` U Z Z Z +.+.+.@.n ( * % @ . - . . % * * % @ . + + @ % . % ' n +.+.+.Y Z Z Y Y Y Y Y @.+.Y e 1.a+<+3+:+:+:+(+<+:+(+(+3+3+(+6+=+C # + . . @ @ . { ,+6+a+(+:+:+:+:+:+:+(+{+(+:+:+:+:+:+:+:+<+<+:+0+O.}.M.#+U.R.R.U.Z.Z.U.W..+Y.9 % . . . . . . . . . . . . . . . . . . . . ).U.#+#+Z.Z.U.Z.U.Z.Z.U.U.U.#+G.v q =.'.=.*.*.=.&.&.&.'.>.O $ $ . - . . . $ + @ % + @ # . . . + + < j #.'.&.&.=.*.>.=.&.&.=.=.=.=.=.=.k o B B y y B B y y y y I f . . . . + + . . # . . . @ @ . . . . + { h z A y y p w x B B B B B B A A y w ", -"I A w A x x B E B B B B B B B B B B A A x B h * . . . . @ @ @ % f y A w B B B B B B B B B B B B B B 2 s j.8.9.0.j.d.d.d.b.j.i.1 > - + # + + $ $ $ @ - . + + + # % $ + - - + - - $ 5.9.j.9.9.9.j.9.9.f.8.j...^.m+G+G+y+z+w+z+z+z+v+y+A+D+v+a.+ + $ + + % @ @ & & & & @ . @ & % @ ] -+F+z+z+E+w+y+y+F+E+E+y+y+E+G+g+t.N.f+b+|+|+9+9+9+9+9+b+f+}+}+9+9+|+7+9+|+}+9+9+9+9+b+A.{ - - . . . . C.5+|+}+f+9+|+f+f+b+9+9+b+b+f+%+n.B.s+q+s+l+h+t+s+u+s+t+o+l+A.& @ - - . + . . + = $ + + + + . + . _ F.e+e+r+l+d+u+h+s+s+s+h+k+k+s+s+t+B.d Z +.Z ` U Z U Y U . .` @.i ; % + . - . @ . . @ # . . @ % % % @ * B P T T +.Y Z Z Y Y Z Z Y @.+.Y e 1.a+a+6+:+:+3+3+3+:+^+4+4+^+:+6+=+F . + + . . # . { 0+3+3+4+:+:+:+3+3+:+:+3+3+:+:+:+3+3+3+3+:+:+3+4+O.[.M.#+U.U.U.W.W.U.W.V.++W.w.% . . . . . . . . . . + . . . . . . . . J M.R.W.U.U.U.U.#+#+W.W.U.U.U.#+M.v q =.=.=.#.=.=.&.&.&.%.*.[.j $ $ . . - . - . - - . + - . - . + = j #.'.&.&.=.=.>.#.=.=.*.*.=.=.=.=.=.k l R x y y B B y B i A I I ; @ . . + . . + + @ @ . . . . . . . { 8 f I w B B B A B B B B B B B A I z h ", -"h A w B B B B B B B B B B B A A B B B B B B y ' & . @ @ @ @ % * f x B w B B B B x B x B B B B B B B f D f.8.9.0.9.d.9.9.f.i.N , > - @ - - . # @ # # ) . # % @ . ) . - . ) ) - $ = v.0.9.9.f.f.9.9.9.f.d.j.N a.m+G+C+z+w+z+z+z+z+w+y+z+D+z+m+x.] @ $ + $ % * $ % $ * % @ $ @ @ a.j+y+v+z+z+z+A+z+z+z+z+z+y+y+z+C+g+t.N.f+9+}+}+|+9+9+9+|+9+|+9+9+|+}+9+9+9+9+9+9+9+7+|+9+F.* $ $ $ + + @ n.b+}+}+}+}+|+}+}+9+}+}+9+b+f+2+n.B.u+t+s+l+k+s+s+s+d+s+s+l+k+X.R # @ @ @ @ @ = = = = $ % % @ & b E.s+s+h+h+h+s+h+h+h+s+s+s+h+d+s+s+t+B.d @.T Z ` +.X Y Y Y Y X Y Y @.U c ( * # - - - . . + . . . . # ( d n P Z X X X Y Z Z Z Z Z Z Z Y +.X e 1.a+1+3+(+(+3+:+:+:+:+:+4+_+{+4+P.F + $ $ + + + $ 7 0+4+4+3+:+:+3+3+3+(+:+3+3+:+:+:+3+3+3+:+:+a+6+0+O.}.M.#+U.U.U.U.W.Z.U.U.`.W.U.M.8 . . . . . . . . . + . . + + . @ < ).M.U.U.Z.W.W.U.U.U.U.U.U.U.U.U.#+M.~.q =.=.'.%.>.%.&.&.&.=.=.*.%.q m $ $ + @ @ $ $ + % & & % @ = | j %.'.=.=.=.&.&.=.*.=.=.=.=.=.=.=.=.%.k l R x z A x B B B B w B B B f @ @ @ @ @ @ @ . . . . @ @ @ . ; B A A B B B B B B B x B B B B x y A I w ", -"l A w A B B x B B B B B B B B B B B B B B B 3 ' * % % % @ % % * h B w x B B B B B B B B B B B B B E l s 0.8.9.0.0.d.9.9.9.2.u : $ $ $ $ + + $ $ = $ + + $ $ = $ + + = = = + $ = : !.0.9.9.f.9.9.9.9.0.d.e.N ^.m+G+z+y+w+w+z+z+w+w+v+A+D+z+y+x+j+x.W . + - @ . @ + @ + + + W -+m+y+v+z+z+w+z+w+w+w+z+z+w+v+y+z+C+g+t.N.f+|+|+|+}+|+|+}+}+|+|+}+|+|+|+}+|+}+|+}+|+}+|+}+9+n.) - - - - - . n.}+}+9+|+}+}+|+9+|+}+}+|+9+9+%+m.B.s+t+k+d+k+k+k+k+k+d+d+k+d+l+e+E.R b . % @ @ % @ % @ + # 4.y.X.l+h+k+k+d+k+k+d+k+d+h+h+h+k+l+h+h+t+B.d @. .Z ` U Z Y U Y U Z Y Y ` U P n } ; & . . % % % * % * * ' n e M Z U U Z Z Z Z Z Z Z Z Z Z Y +.X e 1.<+1+<+:+:+:+:+(+:+:+:+{+(+{+{+P.^ . + + + + + $ H (+_+{+:+:+:+:+(+:+:+:+:+:+(+:+:+:+:+:+=+(+:+:+4+O.}.M.#+U.R.R.U.U.U.W.R.W.Q.R.U.M.}.J @ . . . . . . . . . . . 8 ).@+`.W.U.U.U.U.U.R.W.U.U.U.R.R.U.U.U.M.v q =.=.*.#.=.'.'.%.%.%.%.%.=.%.>.< , $ $ @ + $ . # @ $ = | j O q *.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.m f I A A y B B B B B A B B B I l ; & % % % % & & % @ % @ * * l x B B B x B B B B B B B B B B B A x z 3 ", -"I A w A B x x B B B B B B B B B B B B A A B B A o l l l l o l l w B A x x B B B x B B B B w B B B E 2 s j.8.9.0.f.9.f.9.9.e.i...!...2.2.5.2.2.5.2.2.5.2.5.2.5.2.5.2.5.5.5.!.5.!.5.j.9.9.9.f.f.9.9.9.0.d.j.N ^.m+A+z+y+w+z+z+y+y+w+w+z+E+A+v+y+y+x+m+j+x.t.x.x.x.x.x.x.++j+m+x+y+y+z+D+A+z+z+w+w+z+z+z+C+z+z+E+C+g+t.N.f+9+|+|+|+9+|+}+|+|+|+9+|+|+|+|+}+}+}+}+}+|+}+}+|+7+$+$+$+$+$+$+$+7+|+}+f+9+}+}+|+|+|+}+}+|+9+7+%+n.B.t+t+k+d+k+t+k+s+k+k+k+k+d+d+s+[+~+[+E.c.c.c.c.4.4.c.X.X.[+e+e+t+h+k+k+h+h+h+l+d+s+h+h+h+d+k+h+s+o+B.d @.+.` ` U Y Z Y U Y Z Y Z Z @.@.` M n e e d } } } d e d e n M P Z Y U U Y @.Z Z Z Z Z Z Z Y @.+.Y e 1.<+a+4+:+:+^+^+:+:+:+:+3+^+{+(+(+=+{+)+O.O.)+)+O.{+4+0+_+(+:+(+:+<+:+:+(+:+:+:+:+:+:+:+:+:+<+3+:+4+O.[.M.#+U.U.U.U.U.U.W.W.W.Z.Z.U.U.U.M.M.w.w.}.J J J J J (.w.q.M.R.`.U.U.W.U.U.U.U.W.W.U.U.Z.Z.U.U.U.#+M.v q &.&.*.%.*.=.&.&.*.=.*.%.&.%.&.[.O j k m | | | m j j #.>.%.=.&.=.=.*.=.=.=.=.=.*.=.=.=.=.=.=.=.=.=.m l E w x x B B B B B B B B B w w l I l l 2 ; ; ; ; 2 2 l I I I A A A A w A B B B B B B B B B B A x A o ", -"l A w B x x B B B x A A B B B B B B B B B B B A A A w I A I I w w E A x w B B B w B B B B A x B B E 2 s f.8.f.0.j.9.j.e.e.d.j.i.i.i.d.9.9.f.f.9.9.9.9.d.9.9.9.9.9.9.i.j.e.i.0.i.e.b.f.9.f.9.j.9.9.9.0.d.j.N ^.m+D+A+y+w+z+z+z+z+w+z+z+F+E+A+z+z+z+y+y+x+x+x+x+x+x+v+y+y+z+y+y+z+A+z+A+z+z+z+z+z+z+z+z+z+z+F+E+C+g+t.N.9+|+}+|+}+9+9+|+|+9+|+}+|+|+|+9+|+f+}+}+|+9+9+|+|+9+9+9+|+9+9+9+9+9+}+|+}+|+|+}+}+}+|+}+}+}+9+f+%+n.B.s+t+k+l+k+t+k+k+k+k+k+u+l+k+k+k+o+t+e+d+d+d+d+d+d+n+t+o+t+s+o+t+h+h+k+h+h+h+h+h+h+h+h+h+k+h+h+s+t+E.d @.+.U ` U Y Y Y Y Y Y Y Y Y Y Y Y Z Y Y @.@.` P ` P ` ` ` @.Z @.Y Y Z Y Y Y Z Z Z Z Z Z Z Z Y +.Y e 1.a+1+3+^+:+:+:+:+:+:+(+:+3+(+(+(+4+4+0+{+0+0+0+0+(+{+3+(+(+:+(+3+:+_+:+:+(+3+:+:+(+(+3+_+^+:+<+3+0+O.}.M.#+U.U.U.U.U.U.Z.W.W.W.W.W.U.U.U.U.U.U.U.U.U.U.M.M.W.W.W.U.Z.W.W.U.U.U.U.W.W.U.U.U.U.U.U.U.U.U.#+M.~.q =.=.*.#.=.=.'.'.%.=.=.&.&.%.%.,.%.>.>.,.%.>.>.*.*.%.'.%.'.&.&.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.&.k l A w y y B x B B B B x B B w A B A I w I A w w A w I I I w x A B B B A B B B B B B B B w B B y x A I ", -"l w w B x x B B B B A B B B B B B A A B B B B B B B x x A x B A A B A x B B B B B B B w x B B B B B 2 s j.b.9.0.9.9.j.j.d.8.8.d.e.b.d.d.8.e.d.8.d.8.e.d.8.8.d.8.9.8.9.8.d.e.0.d.f.8.e.9.f.j.j.9.9.9.f.d.j...^.g+C+z+y+y+y+z+z+z+z+z+G+B+y+w+C+E+E+E+A+y+z+z+z+z+z+z+y+C+D+z+z+G+y+y+y+z+z+z+z+z+z+z+z+C+G+y+z+C+g+t.N.9+9+f+|+9+9+9+9+|+9+9+f+|+9+9+9+9+9+|+|+}+9+7+}+}+b+9+b+b+|+9+9+b+|+}+}+9+}+|+|+}+9+9+7+}+|+|+f+%+n.B.u+t+k+l+s+s+s+s+k+k+k+q+k+k+k+t+t+s+s+s+s+s+s+k+k+s+s+s+s+q+r+r+h+s+h+s+s+s+h+h+s+h+s+s+d+h+h+s+t+B.d @.+.Z ` +.Y Y Y Y Y Y Y Y Y @.Z Y +.+.+. .+.@.Y Y Y Y +.Y U +.+.+.Y Y Y Y Y Y Z Z Z Y Z Z Z Y +.Y e 1.a+a+3+(+:+:+3+3+:+:+3+3+3+3+:+(+4+0+0+{+{+0+4+4+(+(+:+3+3+:+:+3+3+^+:+:+3+3+:+:+(+:+4+4+:+:+:+<+4+O.[.M.#+U.U.U.U.Z.W.W.U.W.W.#+W.U.U.U.U.U.U.W.U.U.U.U.U.W.W.U.U.Z.U.#+U.U.U.U.W.W.U.Z.U.W.W.U.U.U.U.#+M.v q =.=.&.*.*.=.&.=.=.*.'.=.=.=.=.&.'.=.%.=.=.=.=.%.=.=.%.%.'.&.&.&.=.*.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.k l R x y x B x B B B B x B B z B y B B B B w A A x x A A B B B B B B B B A A B B B B B x A B B B x z 3 ", -"I A w B x x x B B B B B B B B B B B B B B B B B x y B x y z B x y B B x x B B B B B B A B w B B B B f D 0.8.9.0.j.9.j.j.9.e.b.b.d.d.e.9.9.9.f.9.f.9.9.j.9.e.9.e.j.9.9.b.d.9.i.0.f.d.0.9.f.9.j.f.9.f.0.e.j.N ^.m+D+G+y+C+C+y+z+z+z+z+z+B+y+y+w+z+A+A+z+z+y+z+z+w+z+z+C+D+A+z+z+y+B+B+x+y+C+z+w+w+z+z+z+z+y+y+z+G+g+t.N.f+9+|+|+9+9+9+9+|+9+9+9+9+|+|+9+9+9+}+}+f+9+f+}+|+|+|+9+9+9+9+9+9+|+}+9+f+}+}+|+f+9+9+}+}+9+9+f+%+n.B.u+t+k+l+h+r+s+s+s+k+t+s+k+k+d+s+s+s+k+k+s+t+r+l+l+l+u+q+k+h+q+s+s+h+d+h+s+s+h+k+h+s+h+u+k+k+h+s+t+B.d @.+.U ` U Y Y Z Z Z Z Y Z U @.` ` Y +. . .+.Y Y Y Z Z +.+. . .X X Z Z Y X +.Z Z Z Z U Z Z Z Z +.Y e 1.^+a+:+(+:+3+3+3+:+:+3+3+3+:+^+_+0+4+4+4+4+0+0+:+:+:+<+3+3+(+:+:+:+3+(+:+3+3+:+(+:+:+4+3+<+:+3+3+3+O.[.M.#+W.W.U.W.W.Z.Z.U.U.#+#+Z.M.#+U.U.Z.U.U.U.W.U.U.U.U.#+W.Z.U.U.U.U.U.U.Z.W.W.U.U.U.U.U.U.U.U.U.#+M.).q =.=.*.#.*.=.=.=.%.=.=.*.*.=.=.&.&.&.'.&.=.=.=.*.=.=.=.*.=.*.=.*.=.=.*.=.=.=.=.=.=.=.=.=.=.=.=.=.=.m f I w B x y B w B B B B B B y y y x A y z A x y x y x x z x B B B B B x B A B B B B B B B B B A A w o ", -"I A w A B x x B B B B B B B B B B A A B B B A A A A x x y x A B x B A A B B B B B B B B B A B B B E l s 0.8.f.0.f.9.j.9.d.9.9.f.0.0.0.9.i.i.0.0.f.9.f.0.9.0.f.0.9.0.0.9.9.9.9.0.f.9.f.9.9.f.f.9.9.9.9.8.j.N ^.m+C+z+v+w+w+y+z+y+w+v+w+z+v+v+v+y+z+z+w+w+C+y+y+w+z+w+z+A+w+z+w+y+B+y+v+y+z+z+w+v+w+z+z+w+y+y+E+D+g+t.N.f+}+|+|+}+|+|+}+}+|+|+|+|+|+}+|+|+}+|+}+|+|+}+}+|+7+}+}+}+}+}+}+}+}+}+|+f+}+|+|+}+|+9+}+}+|+b+}+$+m.B.u+t+k+d+k+s+k+s+k+k+s+k+k+k+k+k+k+k+k+k+k+s+k+k+k+d+d+d+d+l+l+l+h+d+d+h+h+k+d+k+k+k+d+h+k+k+k+k+t+B.d @.+.Y ` U Z Z Y Z Y Z Y Y @.@.@.Z U @.Z Y Y Z Z U U U Y Y Y +.Y ` Y ` U Y +.Z Z Z Z Z Z Z U @.+.@.e 1.<+1+:+:+:+:+:+:+:+:+(+:+:+<+:+(+:+:+(+{+(+:+:+:+:+:+<+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+<+:+:+:+4+O.}.M.#+U.W.U.W.W.`.V.L.W.U.U.U.U.U.U.U.U.R.U.U.R.U.R.U.R.Q.@+Z.Z.U.U.U.U.U.U.W.U.R.W.U.U.U.U.U.U.U.U.M.(.q =.%.*.>.*.%.&.=.%.=.=.*.*.%.%.&.=.=.=.=.=.=.=.%.%.*.=.=.=.*.*.*.&.=.*.*.&.&.=.*.=.=.=.=.=.=.*.=.*.k l E w z x y B A B B B B B B x y r B B A A A B x y x B x x x B x B B B A A B B B B A w A B B B y B A w ", -"I w A B B x x B B A B B B A B A A A A A A A B B B A w A A w w A A A B A B B B B x B B B x B B A B B 2 s j.8.9.0.9.9.9.0.0.0.f.0.0.f.0.0.f.0.f.f.f.j.j.f.f.f.9.f.0.f.0.9.9.8.d.f.9.e.9.9.9.f.f.9.9.9.0.d.j.N ^.m+G+z+y+w+z+z+z+z+w+w+z+C+C+v+w+y+y+y+y+y+z+w+w+w+w+y+z+z+w+w+z+w+C+w+w+w+z+z+w+w+z+z+z+w+w+y+E+C+g+t.N.f+|+|+|+}+|+|+|+|+|+}+}+|+|+}+9+|+}+}+}+}+|+}+}+}+}+}+}+}+|+}+}+|+}+}+|+9+}+}+|+}+9+9+f+}+|+|+9+2+m.B.t+t+k+d+d+s+k+k+k+k+k+k+k+k+k+k+k+k+k+t+k+k+k+e+t+s+h+l+d+d+l+u+l+l+k+h+h+h+h+k+k+h+l+h+k+k+s+t+q+B.i @.+.` Z U Y Y Y Y Y Y Y Y Z Z Z Z U Z ` @.@.@.Y Z U U Y +.U Z Z P M ` U Y +.Z U U Z Z Z U Z Y +.Z e 1.<+a+3+(+:+:+:+:+:+:+(+:+<+:+:+<+(+(+(+(+:+(+<+(+<+<+<+<+:+(+:+:+:+:+(+:+:+:+:+:+:+:+:+:+:+(+<+<+4+O.}.M.#+U.U.Z.W.#+#+U.Q.U.U.#+Z.R.U.U.U.U.R.R.U.W.U.Z.U..+Q.++Q.Z.U.U.U.U.U.U.U.U.Z.Z.U.U.U.U.U.U.Z.W.F.v q *.'.=.*.*.=.&.*.%.%.=.=.=.=.*.=.=.*.*.*.*.*.*.*.*.=.=.=.*.*.*.=.=.*.*.=.=.=.=.&.=.=.=.=.=.=.=.=.%.k l E w y x y A B B B B B B A B x x A A w I w A x x B B B B x B B A A A A B x A B B A A A B B B y A I w ", -"w B y B A A A B y z y B x y z p y B B B B y r B B x x B x B z y y y y p z B B z B y z z B z z z p R l t 2.b.8.9.i.j.j.j.j.0.0.9.e.j.j.9.e.9.9.9.e.e.e.9.e.e.e.9.e.9.e.j.j.9.9.e.e.d.j.e.9.e.f.j.e.e.d.8.j.Q r.v+D+D+z+y+y+y+y+z+w+y+y+z+B+y+y+B+y+y+y+y+z+y+y+y+y+y+z+y+y+y+y+y+z+y+v+z+y+y+y+y+y+y+y+y+y+z+C+G+m+o.$+f+}+|+}+|+9+9+|+|+9+|+}+9+|+}+|+|+}+|+|+|+9+|+}+}+|+}+f+|+9+|+|+9+}+}+9+}+}+|+|+}+|+}+7+}+}+|+9+7+n.S.t+t+k+o+k+e+t+k+e+k+k+k+s+k+k+s+s+t+e+s+s+h+t+e+e+k+s+k+k+k+e+t+t+t+k+k+t+k+k+k+k+k+k+t+k+k+k+t+o+B.e ` X @.@.U Z Z ` @.` @.Z Z ` ` @.` @.@.` @.Z ` ` @.@.` Z @.` U ` P ` ` ` Z Y @.` ` @.` @.` ` @.+.Y n 1.^+a+4+(+:+3+3+(+:+:+(+3+3+(+:+:+4+(+3+3+4+4+3+(+(+^+:+3+3+^+(+(+(+3+:+(+4+(+3+{+(+4+3+^+^+<+<+a+6+O.(.R.#+W.U.`.U..+#+#+U.W.W.`.W.W.W.`.W.W.W.W.W.W.W.W.R.#+W..+U.W.W.#+W.U.W.W.W.W.W.U.W.W.W.W.W.W.W.#+M.m *.&.&.&.=.&.=.&.=.'.=.=.&.=.&.&.&.=.&.&.=.&.=.&.&.&.=.&.=.&.&.=.=.&.&.&.&.=.=.&.&.&.&.&.&.=.&.&.&.=.q 0 E I w A z z z y z y z z z y y y y z z x x B B y y x x x x y z p i A B y x z y z z y y z z z A I A I ", -"w B x B B B B A x x x B x x x y y B B B B y B B x y x B x B x x y x y y x B B x B x x x B x x x y I l t 2.8.8.e.5.j.8.e.d.8.b.d.d.b.e.d.8.d.d.8.b.d.d.b.d.8.b.9.d.b.d.b.b.d.b.d.9.d.b.d.9.b.b.b.d.b.8.8.b.Q r.m+F+E+D+A+G+C+A+A+C+z+C+C+G+A+C+D+G+C+C+C+C+C+D+D+z+G+C+G+C+C+z+G+C+E+C+E+C+G+A+D+C+A+A+z+v+A+D+E+i+o.N.9+b+9+|+9+b+9+9+9+|+9+b+9+|+|+b+9+|+9+9+|+b+b+9+|+|+b+b+|+|+b+b+9+|+b+b+9+b+|+b+b+9+|+|+9+|+f+f+}+n.S.q+q+r+s+r+h+r+q+h+s+q+q+q+k+h+r+q+r+h+k+r+q+r+r+h+q+q+q+q+q+s+s+q+s+k+q+r+q+q+h+r+h+h+q+h+h+r+s+o+B.n @.Z +.U +.+.+.X X +.+.+.+.X X X X X X X +.+.X X +. .X +.+.X +. .X +.+.+. .+.+.X X +.X +. . .+.+.@.e k.<+a+6+<+:+6+a+a+<+<+<+a+6+<+<+<+<+a+a+a+6+<+a+6+<+6+<+<+a+1+6+<+a+<+<+a+<+6+<+:+:+6+a+:+:+<+<+a+p+O.;.G.#+.+W.W.W.W.#+#+U..+W.W.W.`..+W.W.W..+W.W..+W.W.W.W.#+.+U.`.W.W..+W.W..+W..+W.W.W..+W.W.W.R.W.#+M.~.*.&.&.&.=.&.=.*.=.=.=.&.&.=.=.=.&.&.&.&.=.'.&.&.=.&.&.=.=.&.=.=.=.=.=.=.=.&.=.=.=.=.=.&.=.=.=.=.&.=.k 3 w E I w x x x B B x B x x x x x x x x x y y y y x x x x x y x y y x y x B x x x x y y x x y E w w I ", -"w w A A w w A w A A A A w A B A w A B A A A A w A A A B A w A A w w w A A w B A w B A A A w w B w 0 J s 2.e.8.9.i.j.d.9.e.d.d.9.d.d.d.d.d.d.9.d.d.f.d.d.9.d.d.9.d.d.d.8.d.8.d.e.d.f.d.f.f.d.d.d.f.d.d.j.g.Q r.j+y+F+E+D+D+G+G+G+A+G+D+G+G+A+F+D+G+G+A+D+G+G+D+D+G+G+G+D+G+D+G+G+G+E+G+G+G+G+D+D+D+D+G+G+G+F+D+D+m+D.K.b+b+9+f+9+f+f+9+9+9+9+9+9+f+f+9+9+f+f+9+9+f+b+9+f+9+9+b+9+9+9+b+9+f+f+9+9+9+9+f+9+f+9+9+9+9+f+f+8+C.S.u+u+u+l+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+r+E.e ` Z Z @.X +. .+. . .+. . .+. . . . .+. .+.+. .+. .+. . .X +.+.+.+.+. .X +.+. .+.X . . . . .+.Y P d k.3+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+6+a+a+a+a+a+6+a+6+a+a+a+6+6+6+a+a+6+a+a+6+a+a+a+p+6+6+6+6+1+P.).G.#+#+#+#+.+#+#+#+#+#+#+.+#+#+#+#+#+#+#+#+Z.#+#+W.#+#+#+#+W.#+#+#+#+Z.Z.#+#+#+Z.Z.#+#+#+Z.Z.Z.#+#+M.~.*.*.=.=.=.*.*.>.*.=.*.*.*.*.*.*.*.*.*.*.*.*.*.*.=.*.*.*.*.*.=.*.*.*.*.=.*.*.*.*.*.*.*.=.=.*.%.*.>.l.k h z w B B B B w K E w E B B A w A A B B A w A A B B A w A A w w w w A w w A A B w w w w w B B B A A l ", -"l l o o l o 3 3 h l l l l h h h l h h l l h h l l h h o l l h l l l l h h l o l l o h l l l l h l 0 7 | ..2.2.2...Q Q Q Q N Q Q N Q Q Q Q N Q Q N N Q 2.Q N N Q 2.N Q N Q N N N N Q Q N Q Q Q N Q N Q Q ..s W H.m+m+'+>+-+'+>+-+'+>+>+'+>+-+-+'+-+-+-+-+>+-+>+-+'+'+'+>+-+>+'+-+'+-+>+'+'+'+-+'+>+>+'+-+'+'+'+'+I.L n.$+N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.7.B.S.X.X.X.X.X.S.X.X.X.X.S.*+X.X.X.X.X.X.X.X.X.S.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.*+X.X.X.S.*+6.d c c c c e n n n c n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n e n n n n n n c c e B I v.P.++O.O.O.O.O.O.O.O.O.O.P.P.O.O.O.O.L.O.O.O.O.O.P.O.L.O.O.O.O.L.P.O.O.L.O.O.L.O.O.O.O.P.O.O.L.V.u.W ].w.w.u.u.w.w.w.k.~.w.w.w.w.u.w.u.q.~.w.w.w.w.u.~.w.w.w.w.u.~.w.w.w.u.w.w.1.k.w.u.u.w.w.w.u.u.w.w.}.7 k O q q q O q q q q q q q q j j q q q q q q q q q q q q q O q q q q O q q q q j j j q q q q q q O v 0 < l h 3 3 3 f l f l f l l l l l l h h h h l h l h h h l l l l l l l h l h l h o o o l l l o h k 3 3 3 ", -"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 < < m : t | | | | | | m | m m | | m m | | | m m | | | | | | | 7 m m | m | | 0 | | m | | | | | | 7 | m < H ^.S S S S ^.S S S S S S S S ^.^.S ^./.S ^.S S S ^.^.^.^.S ^.S ^.^.S ^.S ^.S S ^.S S S S S S S u u S F L D.t.t.t.t.h.h.t.t.t.t.t.t.h.t.t.t.t.h.t.t.t.t.t.t.t.h.h.t.t.t.h.h.t.t.t.t.h.t.t.t.h.D.D.t.t.D.h.t.L L z.7.m.7.7.3.m.7.7.7.7.7.m.3.7.m.m.3.7.7.m.7.7.7.7.3.7.7.7.7.m.m.7.7.7.7.m.7.7.7.7.m.7.m.7.7.7.m.m.2 z -.-.-.-.6.-.-.-.-.-.-.-.-.6.-.-.6.-.-.6.-.-.-.-.-.6.6.-.6.-.6.-.-.-.6.-.6.-.-.6.-.-.-.-.6.-.-.-.-.E l A w E B y z x E B B B x z B A x B A x B B E y E x A z x E p B A A A B B A x r E A x E y A A x y B h g ].[.[.[._.[.[.[.[.(.[.[.[.[._.[.[.(.(.[.[.[.[.[.(.[.[.[.[._.(.[.[.[.[.[.[.(.[.[.[.[.[.[.[.[.[.[.[.[.4 v ~.v ).v v v v v v v ~.v v v v v v v v v v v v v ).).).v v v v v v v v v v v v v v v v v v v v v v 2 < v 0 0 0 0 0 0 0 0 v 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 k 0 0 k ", -"j #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.O #.#.#.#.#.#.O #.O #.>.#.#.#.#.#.#.#.#.1.h h B o o o 3 o o o o o o o o o o o o o o o o o o o o o o o o o o E o o o o B E o o o o o o o o l o E 3 | u 2.i.2.Q 5.5.5.Q 5.5.5.5.5.2.5.Q 5.5.5.5.5.5.Q 5...5.5.Q 5.5.5.5.5.5.5.2.5.5.5.5.2.5.5.Q ..Q 2.0.Q S T.m+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+m+v+g+g+g+v+g+'+a.n./+%+;+%+$+%+;+%+%+%+%+%+;+%+%+%+;+%+%+%+;+%+;+;+%+%+%+%+%+%+;+;+%+%+%+;+;+%+%+%+%+%+%+%+%+%+%+;+%+7.c.[+[+e+~+]+[+[+[+[+~+[+[+[+[+[+[+[+[+[+[+[+[+[+~+[+[+[+[+[+[+[+[+[+~+[+[+[+[+[+[+[+[+[+[+[+[+~+e+~+B.p n ` P n c M M M M M M M M P P M M M c M M M P M M M c M M ` M M M M M P M M P M M M M P n n M P P d ).L._+=+P.O.{+=+O.O.O.{+{+{+O.{+{+{+=+=+=+V.=+=+O.O.=+=+{+=+{+{+=+=+{+=+O.{+=+=+O.O.O.O.=+{+V.{+{+{+P.[.w.M.M.M.M.G.M.M.G.G.G.M.G.M.G.G.M.M.M.M.M.G.G.M.G.F.M.M.M.G.M.G.M.M.M.M.M.M.M.M.M.G.M.M.G.G.G.M.M.G.~.j #.#.>.>.#.>.>.>.>.#.>.>.>.#.#.#.#.#.#.#.>.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.q ", -"%.=.=.,.*.*.'.'.%.*.*.*.*.=.%.*.=.=.=.=.*.%.=.'.'.*.%.=.=.*.*.=.*.%.'.=.*.*.*.=.=.*.*.=.=.=.*.*.=.O k 3 B K K E B B E E B E B E E B E E B E E B E B E E E B E B E E B E E B E E B B E B E B E E B E B y B l C 2.e.b.b.b.b.j.e.b.b.b.b.j.b.b.b.j.e.b.b.b.b.b.j.b.j.j.b.j.b.e.b.b.b.b.b.g.b.b.b.b.b.b.b.j.f.d.d.e.0.u g+D+C+C+C+C+C+C+C+C+G+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+A+C+A+C+C+G+B+x.K.b+9+9+9+f+b+9+b+b+b+b+9+b+b+9+9+b+5+b+9+b+b+b+b+b+b+b+9+9+b+9+9+b+b+9+b+9+b+9+b+9+9+b+b+b+9+b+9+f+N.A.t+t+t+t+t+t+r+r+r+r+t+t+r+r+t+t+t+r+t+r+r+t+t+t+r+t+t+t+t+t+r+r+r+q+r+r+q+t+t+t+t+t+t+r+t+r+q+t+q+X.d U .+.X X +.+.+.+.+.+.+.+.+.X +.+.+.+.+.+.+.+.+.+.+.+.+.+.Y +.+.+.+.X +.+.+.+.+.+.+.+.+.` Y +.T +.n ;.)+0+3+3+4+3+3+4+4+4+4+4+4+4+4+4+4+3+p+6+4+3+3+4+3+3+p+4+6+4+3+p+3+3+3+4+4+p+p+3+3+4+0+4+4+0+4+4+p+(+[.w.#+#+#+,+++#+#+W.`.W.#+#+`.`.#+#+#+#+`.#+`.#+#+W.#+#+#+#+#+U.W.#+#+U.`.#+#+#+#+U.#+#+#+#+#+`.#+#+#+~.j %.*.%.=.*.&.&.&.&.=.&.&.&.*.=.*.*.*.*.*.=.=.*.*.=.*.*.*.*.*.'.%.*.*.*.*.*.%.%.*.'.=.%.*.'.%.*.>.%.O ", -"q &.%.'.*.%.%.'.'.=.=.&.=.=.'.=.&.&.&.&.&.&.&.&.&.=.=.=.=.=.=.=.&.=.=.=.=.=.&.=.=.=.=.&.=.=.&.=.=.!.q k B E E B w A x x x B x x x B B x x B x x x x B B x z x z x B z x x z B B z z x z x z y B x x x r i 3 s 2.d.8.e.9.9.9.d.d.9.9.d.9.e.d.d.9.e.d.9.d.d.d.9.8.8.9.d.9.8.9.d.d.e.9.9.9.d.9.d.d.9.d.d.d.0.j.e.d.2.u >+E+E+A+z+z+E+E+A+E+z+E+A+E+E+C+G+E+A+E+z+E+E+A+z+E+E+A+E+E+A+E+E+E+z+E+A+A+A+z+E+D+A+F+z+v+z+E+E+B+H.N.7+9+f+7+7+9+f+f+|+9+f+f+9+f+f+f+9+9+9+f+9+f+f+|+|+f+f+9+}+}+|+f+f+9+f+}+f+f+}+|+f+f+9+9+|+f+9+f+2+C.A.o+r+s+t+t+s+q+q+h+s+s+s+q+s+s+s+s+s+k+s+h+s+t+k+h+s+s+s+s+s+s+q+q+s+h+s+q+q+s+k+s+s+s+q+s+r+t+o+s+E.d U +.Y X X +.+.+.X X +.X X Y Y +.+.+.X X X X X +.+.+.X X X U X +.X X Y +.X +.X +.+.+.X +.Y +.T T +.n 1.{+3+6+<+<+6+3+<+<+:+3+3+<+<+<+<+:+6+:+<+:+:+:+:+<+:+<+3+a+:+:+6+:+a+<+:+:+6+:+<+<+:+4+4+:+<+:+3+3+=+[.w.#+W.W.`.++W.U.V.`.U.Z.U.{+U.U.U.Z.)+`.)+`.U.U.)+Y.U.U.U.U.U.V.Y.U.U.`.V.V.U.U.Y.V.U.U.Y.V.`.Z.Z.W.~.j '.'.'.'.=.&.&.&.=.&.&.&.=.=.=.=.=.=.=.=.&.'.=.=.=.=.=.=.=.=.=.=.=.=.=.&.&.=.=.=.=.&.=.=.'.=.*.>.%.O ", -"q =.'.&.#.*.%.'.=.=.=.=.=.=.=.=.=.=.=.=.&.&.&.&.&.*.*.*.*.>.*.=.=.&.=.=.=.=.>.=.=.=.=.&.=.=.&.=.=.!.q k B E w B A A z z x x x x z A A z x z x x x z A x A w A w A A w A z z z z r z z x z x x x x x z A p z t 2.8.b.9.f.f.f.f.0.0.f.f.f.f.0.f.f.9.f.0.f.j.f.0.f.f.f.f.0.f.0.0.0.0.0.i.i.i.9.d.0.0.0.f.9.i.i.e.e.2.S -+F+z+w+y+y+F+z+z+w+y+F+z+F+y+w+y+F+y+y+y+F+F+z+y+y+y+z+z+F+z+y+F+y+y+w+y+w+z+w+y+x+x+F+y+x+y+F+E+x+t.N.2+f+f+}+7+f+}+7+}+}+}+}+7+f+}+}+}+7+7+7+}+}+f+}+}+}+}+}+7+7+}+7+}+f+|+f+}+7+7+}+}+7+}+}+|+7+}+}+2+m.y.l+s+h+k+u+l+k+h+k+k+k+k+h+l+l+l+l+l+k+k+k+l+l+l+d+l+k+l+l+l+l+l+l+d+d+l+l+s+h+k+s+k+l+l+d+s+s+t+t+E.i @.+.` @.Z X Y U Z Z U Y Y Z Z @.X X @.@.Z @.` U U X Z Z Z U Z U ` ` @.U Z X ` @.@.X Z +.Z @.+. .+.n 1.=+6+<+<+<+<+:+<+<+:+:+3+6+:+<+<+:+a+<+<+<+<+<+:+:+:+:+6+<+:+:+<+:+<+<+<+<+:+<+<+<+<+3+4+:+:+:+:+3+P._.w.#+U.U.W.U.Z.U.V.U.U.Z.U.V.R.U.Z.Z.V.U.)+U.U.Z.V.Z.Z.U.U.Z.U.V.Y.W.M.U.V.V.U.W.Z.V.U.W.Y.V.U.U.#+R.).C *.=.&.=.=.'.'.*.=.=.=.=.=.=.&.=.=.=.=.=.=.=.=.=.&.&.&.'.'.&.=.*.=.=.=.&.=.=.=.=.=.&.=.=.=.'.=.'.>.O ", -"q =.&.=.#.*.*.&.=.*.=.=.=.=.=.=.=.=.=.=.*.*.&.'.=.*.*.*.%.>.=.=.=.=.=.=.&.*.>.>.*.*.=.=.=.=.=.=.=.&.k 2 E I w z y B A B B B B B B A A B A A B B B B B A A A x A A x I I A y y y p y B B B B B B B A x B E o C 2.8.e.9.d.9.f.f.9.9.9.9.f.f.0.9.9.9.f.0.9.j.9.0.0.0.0.i.j.9.f.j.j.0.f.0.0.j.b.b.9.0.i.f.d.0.0.d.b.5.S >+E+B+w+w+w+z+y+y+v+w+w+z+w+w+w+z+z+G+v+z+z+B+v+v+z+y+y+y+v+w+z+y+y+v+w+w+w+A+z+w+g+g+E+y+v+w+w+z+x+x.N.7+|+|+|+}+|+|+}+|+|+}+}+}+|+|+}+}+}+}+}+|+}+|+|+}+}+}+}+|+}+}+}+|+|+|+|+}+}+}+|+|+}+|+9+}+|+|+|+f+m.y.u+k+k+k+h+h+h+h+k+k+k+h+h+h+h+l+l+k+e+k+k+l+h+k+l+k+s+k+d+h+d+k+l+l+k+h+k+k+k+s+s+k+l+l+l+k+k+s+t+E.p ` +.Z ` Z Z Z Y U Y Z +.+.Y ` ` +.+.@.@.+.X Z U U X U +.Y Y U +.@.@.` X U @.` ` P Z X .@.` +. .X n ;.=+a+:+:+:+:+:+^+:+:+(+:+:+(+(+:+:+3+<+<+a+<+:+(+:+:+:+:+(+:+<+<+:+:+=+:+4+(+<+<+<+<+:+(+:+(+(+(+4+=+_.w.#+U.U.U.W.U.U.W.R.U.U.U.W.U.U.U.U.W.W.R.W.U.U.U.R.Z.U.U.U.W.W.U.W.M.M.W.U.U.W.R.W.Z.U.W.W.U.U.U.W.).C *.=.&.*.=.'.'.=.=.=.=.=.=.*.=.=.=.=.=.*.=.=.=.=.=.'.&.'.%.'.%.%.*.*.=.=.=.=.=.=.=.=.=.=.=.&.&.%.>.k ", -"q =.=.=.=.*.*.&.=.=.=.=.&.=.*.=.=.=.=.=.*.*.&.=.%.=.*.%.&.&.&.=.'.*.=.=.&.=.=.>.=.=.=.=.=.=.=.=.=.&.q h R I x y x B B B B A A B B B B B A A B B B B B x x x y y x x I I I A x y x B B A B B B B B B z B E 3 C 2.9.9.9.9.f.f.f.f.9.9.9.f.f.9.9.9.9.f.9.j.j.j.9.9.9.0.0.b.e.d.8.b.9.d.9.i.i.d.b.j.0.0.9.9.0.0.d.b.5.S >+D+y+z+w+z+z+y+z+w+z+z+y+z+y+z+F+z+C+w+D+E+w+w+w+A+E+A+A+w+A+D+E+D+w+w+E+A+A+D+E+G+C+E+z+y+z+E+z+g+r.N.7+9+|+|+}+f+9+}+|+|+}+}+9+}+}+b+9+|+}+|+9+9+|+9+|+|+9+9+b+|+}+9+f+}+}+|+9+9+9+9+|+}+9+|+}+|+|+|+9+n.y.u+s+s+d+h+h+h+k+k+k+h+h+h+s+t+h+q+r+t+t+e+h+q+s+s+s+s+s+k+s+s+s+q+q+s+r+r+s+k+h+k+k+s+s+e+k+k+r+r+y.p ` +.Z ` @.Z Z @.Z Z @.X +.Y @.Z +. .X X T .+.+.Y +.Y Y @.` Y +. . .G +.+.X Y @.@.U +. .@.` +. .Y n ;.=+a+:+:+:+3+:+:+:+:+4+:+(+(+(+(+4+4+<+:+6+3+4+(+{+4+(+:+(+(+4+3+^+4+(+(+4+4+:+:+<+<+:+(+:+(+^+^+4+=+[.w.#+U.Z.U.U.U.U.W.R.U.U.U.U.`.U.W.Z.U.Z.U.U.#+Z.U.U.W.#+U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.W.~.j *.&.=.=.=.=.=.=.=.=.=.=.=.=.=.&.=.=.*.=.&.=.=.=.>.%.'.*.>.#.%.=.=.*.*.=.&.=.=.=.=.=.=.=.=.=.&.*.>.q ", -"q %.=.=.>.*.=.&.=.=.=.=.=.=.*.=.=.&.=.%.'.=.>.>.>.>.#.%.=.=.=.%.%.>.>.=.*.&.=.&.'.=.=.=.=.=.=.=.=.&.q h R I A x x B B B B A A B B B B B B A A A A A A A A l A x A w I I I I A x B y B A A B B B B B z x B l C 2.d.d.e.f.f.9.j.9.9.f.9.9.f.9.j.9.j.9.f.9.j.j.e.9.e.e.e.e.j.0.f.0.0.0.0.2.5.j.b.e.0.f.j.9.0.0.d.b.5./.m+D+z+z+w+y+z+z+z+z+z+z+F+z+y+z+z+z+G+z+E+F+G+A+E+E+F+G+G+z+E+E+F+E+y+x+B+y+A+D+A+E+E+E+y+y+z+E+E+B+H.N.2+9+b+|+7+}+9+}+}+9+}+9+}+}+}+b+5+b+9+|+}+f+f+f+f+}+;+;+;+}+f+7+7+7+}+9+9+b+b+b+9+f+9+9+|+9+9+9+7+n.E.u+t+s+l+s+s+s+s+h+h+h+h+s+s+t+s+r+r+s+t+t+s+r+s+s+r+r+r+s+s+t+r+r+r+s+r+t+r+l+l+t+k+k+s+k+k+l+q+s+E.p U .@.Z Z Z Z Z Z Z @.Y X Y U +. . .Y Z .+.X Z ` P P M M M ` ` X .T .+. .+.Y U U Y +.@.` Y .+.n ;.=+a+^+^+:+3+3+3+3+:+:+4+4+3+:+3+4+4+4+{+4+4+0+)+:+!+!+)+4+4+0+0+p+0+(+4+4+4+(+:+:+<+:+4+(+(+4+4+p+=+[.w.#+W.U.U.U.U.#+W.U.U.Z.W.#+W.U..+Z.#+U.U.U.#+#+U.M.M.M.R.W.W.#+U.#+U.U.U.U.Z.U.W.U.U.U.U.U.Z.W.#+W.~.j *.&.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.*.=.=.=.=.*.%.>.#.q #.#.q #.>.*.*.=.=.&.=.=.=.=.=.&.=.*.&.&.*.>.q ", -"q *.&.=.#.*.=.&.&.=.=.=.=.=.=.*.=.'.%.%.*.#.O j j m m j m m j m k j O *.#.=.&.&.'.=.=.=.=.=.&.=.*.'.k 2 w w A x B B B B B B B B B A A B B A I I l l f l 2 ; ; ; l ; l l l w w w w x B B B B B B B A z B K l C 2.8.b.9.f.f.9.j.9.9.9.9.9.f.9.j.9.j.9.f.i.9.j.d.d.e.9.9.....s u s s s s u 5.i.d.9.0.f.9.9.i.i.d.b.5./.m+E+z+z+w+y+z+z+z+y+z+z+z+z+z+z+y+z+'+'+T.'+'+T.'+'+'+'+T.'+T.T.T.'+'+T.T.T.m+v+z+z+F+z+y+y+y+A+z+B+H.N.7+b+b+}+7+f+b+f+}+}+}+9+}+}+}+b+5+b+|+7+7+2+%+C.J.7.7.7.7.m.n.J.N.$+2+7+9+b+b+b+9+|+}+9+|+|+f+|+f+m.E.u+r+s+k+s+s+s+s+k+h+h+s+s+q+~+E.X.X.E.E.X.X.E.E.X.X.X.E.X.X.E.X.X.X.E.E.E.X.S.E.t+h+k+q+k+s+k+q+t+E.p U .Z Z Z Z Z Z @.@.Z Y Y Z Y +.+.Y ` M M n e d d } } } ( } d e n ` @.Y +.+.+.Y +.X Y Y @.` Z .+.n I =+a+^+^+(+:+3+:+:+:+(+4+(+(+(+<+3+4+0+{+^+V.O.k.].C C J u.u.u.O.:+0+{+(+0+4+(+:+:+:+4+4+(+(+:+3+p+=+<.k.#+U.W.W.U.U.U.U.U.U.U.W.U.R.U.W.Z.#+L.Z.w.w.:.}.J :.J J }.}.k.M.#+#+U.W.W.W.U.U.U.U.U.U.U.U.U.#+W.~.j *.=.&.*.=.=.&.=.=.=.=.=.=.=.=.&.=.*.&.=.*.=.>.>.%.j < m j | j j j #.*.=.&.&.=.=.=.=.*.*.=.&.&.*.%.O ", -"q *.=.=.#.>.*.&.&.*.*.=.=.*.=.=.%.,.%.>.j | < = $ + @ @ + + @ # @ < < j #.#.*.'.'.&.*.=.=.=.=.*.=.'.q 2 E w z y B B B B B B B B B B x B A E h l 8 % @ % @ @ @ @ @ @ @ % ; ; 2 l I I A B B B B B B B z B E 3 C 2.d.d.0.f.f.9.f.f.9.9.f.9.9.9.9.f.9.9.0.i.9.9.e.d.f.0.f.4 = + $ + + + . , !.i.e.j.j.9.e.d.i.i.d.b.5.S >+G+G+y+w+w+z+z+z+w+z+y+z+z+z+w+z+z+g g ~ g ] > g ] g ] > g _ > > [ _ [ _ _ a.>+y+x+y+A+v+y+y+A+A+x+x.C.7+9+|+}+}+|+|+}+|+}+}+f+|+|+}+b+b+b+f+2+N.h.L ) . . + @ . . . - 5 7.z.$+2+}+|+|+|+}+}+|+}+|+}+|+f+m.y.l+r+s+k+k+k+k+k+k+h+k+h+s+l+c.{ ! ! ! ! a b ! ! ! b - ) ! b ! ! b { ! ) ! b & ; n+s+q+u+d+k+h+r+t+E.p Z .` @.U Z Z Z @.@.U X X U Z Y X ` M i l ( ; % % % @ # . @ % ; ' } e d ` Z Y U +.X Y Y ` ` +.+.X n 1.=+a+:+:+(+:+:+:+:+:+(+(+:+3+:+(+4+3+4+u.C 8 ] . + + . . . . $ 4 D k.O.{+0+(+3+4+(+(+(+3+(+(+(+(+4+=+_.w.#+Z.Z.R.U.U.U.Z.R.U.U.U.W.R.W.U.#+U.v.}.% % + . . . . . . . @ J w.M.U.W.#+#+Z.V.W.U.U.U.U.U.U.Z.W.~.j =.=.&.*.=.=.=.&.*.=.=.=.=.*.*.=.=.*.=.=.=.=.=.>.m , $ @ $ $ $ = | k #.%.&.&.*.=.*.=.*.*.=.*.&.'.%.k ", -"q =.=.*.%.#.=.&.*.=.*.=.=.=.*.=.%.,.q m = + . # # . . . . . . . . @ @ $ | j >.%.%.*.=.=.*.*.*.*.&.'.q 2 w w x p y B B B B B B B B B B A w l 2 * % % . . . . . . . . @ @ % % @ ; l I A B B B B B B B z B E o C 2.d.d.0.f.f.9.9.f.9.9.9.f.9.9.9.9.9.9.9.0.9.e.j.f.0.2.N @ % - # . . - - $ ..i.d.d.9.9.e.d.f.0.d.b.5.S >+C+G+w+v+w+z+y+y+w+w+z+v+w+w+w+z+w+# @ # @ @ @ @ @ @ @ @ @ @ . # @ @ @ @ + g -+x+x+y+A+y+v+w+A+A+B+t.C.7+|+|+}+}+}+|+}+|+}+|+}+}+|+}+}+}+2+%+n.5 . @ $ % $ $ % $ $ $ . . . / 7.&+7+7+}+|+|+|+|+}+|+|+9+f+m.y.l+k+k+d+d+k+k+k+k+k+k+k+s+n+a . @ $ @ . . @ . + + + - - + + . + + + . - + + . * [+l+q+h+d+k+k+t+r+y.p ` .Z Z U Z Z Z U U Z Y Y Z ` @.` n d ; . @ . . . . . - - . . @ % % ; * n M ` U U Y Y Y ` @.X +.X n ;.=+a+:+:+=+:+:+:+:+=+<+:+:+<+<+(+3+1+].% . + # . + + . + + . . . + . C O.(+(+:+(+(+(+(+(+:+:+(+(+_+=+_.w.#+U.U.U.U.U.U.Z.R.U.U.U.R.R.R.U.M.:.& . + . - . . . . . . . . . # J M.W.U.`.L.L.W.U.U.U.U.U.U.U.R.~.j *.*.=.*.*.*.*.*.*.*.=.=.=.*.=.=.&.*.=.=.=.*.%.O < # @ % % @ % $ < O #.%.'.&.=.*.*.=.=.*.=.*.&.%.>.q ", -"q =.&.=.#.*.&.&.*.=.=.=.&.=.*.=.%.q m = $ @ # - - + + . . . . + # # . @ $ , j #.=.*.&.=.=.=.=.*.&.'.q f E w A y x B A A B B A A B B B B o 2 * % @ @ . . . @ . . . . . . @ # & & ; l A B B B B B B B z B E o t 2.d.d.9.9.9.9.9.9.9.f.9.f.9.9.9.9.9.9.9.0.9.e.j.0.0.Q : @ @ # . - . . @ $ ..0.f.d.e.9.d.d.f.0.d.b.5.S >+G+y+y+w+z+z+y+z+w+z+z+y+z+w+z+D+v+@ @ . @ @ @ @ @ # @ @ @ # @ @ # @ % % @ g -+y+E+E+A+y+y+z+E+A+x+H.N.7+|+9+|+7+}+|+}+}+}+|+}+}+}+|+2+2+&+h.) @ % % @ @ @ @ @ $ @ + $ = $ . ) L %+2+}+|+|+9+9+|+|+9+f+9+m.y.u+s+k+k+d+s+s+h+k+k+k+k+s+s+4.@ % @ @ @ @ @ @ @ + # @ + + @ @ @ + @ @ + + @ . - n+q+q+q+k+k+k+s+t+E.p ` .Y Z Z Z @.Z U U Z Z Y ` @.@.M e ( % . @ @ @ @ @ @ @ . @ @ @ @ @ . . d d M ` U U Y Z ` ` Z +.X n ;.=+a+(+:+:+:+(+(+:+:+:+4+4+:+3+(+=+_.. . . . . @ + # + . . . . . . . + 4 P.4+4+{+(+(+{+(+(+(+<+:+_+=+[.w.#+U.U.U.U.U.U.U.U.U.U.Z.W.Q.Z.M.J + % # . . + . . . . . . . . # . @ J M.W.W.W.W.U.U.U.U.U.U.U.Z.W.).j *.=.&.=.*.=.=.=.=.=.=.=.=.*.&.&.=.*.=.=.=.{.,.m % @ . . . . % % < O #.'.&.&.&.*.=.&.&.*.&.=.&.%.>.q ", -"O >.=.=.=.*.*.&.=.=.=.=.=.&.=.*.#.m , $ $ @ . - - @ @ + + + + . . - . @ + $ = j >.=.=.=.=.=.=.=.=.'.q h A w A x x B A A B B A A B B x A 2 * % @ . . . . @ % @ # . + . . @ # @ % % 8 A B A B A B B B z B K o C 2.d.d.9.9.9.9.9.9.0.0.9.f.f.9.9.f.9.9.f.0.j.9.j.0.2.u = + + . + + @ + # + l.i.d.9.j.j.d.d.0.0.d.b.5.S >+D+z+z+z+z+z+z+z+z+z+z+z+F+v+z+F+T.. . . . @ @ # + . . . + + . . + @ @ @ . W '+y+D+D+E+y+y+z+E+E+x+r.N.7+9+b+|+2+9+9+}+|+f+|+9+9+}+9+2+$+h.) . @ * = ~ # @ . . . @ @ = = @ @ - ) L 2+2+9+9+9+9+|+9+9+9+9+m.y.u+q+s+d+h+s+s+s+s+h+s+s+l+n+R @ % % @ @ @ # # # @ @ @ . . @ @ @ . @ @ . + @ . ) l+s+r+q+s+k+k+q+t+E.p @.+.@.@.Z Z Z Y U Y Z Z X Y Y M d ( % % # @ @ @ % * % % % % @ # . . @ @ ' 3 e ` +.+.+.X ` @.+. .Y e ;.=+a+(+(+(+3+3+4+(+(+(+3+3+(+0+{+D + . @ . . + @ @ % + + + . + @ @ @ $ + 4 O.0+(+(+{+(+3+(+(+3+4+4+=+[.w.#+Z.U.U.U.W.Z.U.U.W.U.R.W.R.`.J @ - @ . . . . . . . . . . . . . . . @ J M.#+W.W.U.W.W.U.U.U.U.#+W.).j >.=.&.&.*.=.=.=.=.=.=.=.=.=.&.*.&.=.*.*.=.!.j , $ $ . - - + % % < O %.'.&.&.&.=.*.=.=.*.*.&.'.=.>.O ", -"q >.=.=.*.>.*.&.=.&.=.=.=.*.%.=.k @ . + + + + + @ % @ = , = + . - @ % @ . . . , m &.=.*.=.=.=.=.=.&.q 2 E A A B B B B B B B B B B B A 3 * % @ + - + . @ & * * & @ @ . . . @ . . . . A B A B A B A B z x B o C 2.d.e.9.9.9.9.9.f.f.f.j.j.9.f.9.9.j.f.9.f.f.d.j.5.1 $ . . . # . . $ @ @ + ..e.8.0.i.e.9.f.i.i.d.g.5.S >+D+z+z+z+A+z+z+z+z+z+A+C+B+y+D+y+x.- - . . & & @ + + . # + + . @ + % % @ + g -+x+z+D+E+y+x+z+E+F+x+H.N.7+9+b+|+2+9+9+f+|+}+}+b+b+9+7+8+7.. @ # . @ . < = / 5 L 5 - * = - . @ . - / n.$+9+9+9+f+|+|+9+f+f+m.E.u+r+t+k+h+s+s+s+h+k+s+s+q+s+:.+ @ $ + . @ . . + + + + . . + . . - . . + + + % * n+n+t+q+k+u+d+q+r+y.p U .Y Z Z Y Y Z Z Z @.X +. .@.d * @ @ @ @ . . @ & ' ( ( ( ; . - - . $ @ @ @ } @.T +.+. .` ` X +.X n ;.=+a+3+(+(+3+3+3+3+:+<+:+3+(+)+M.] # # @ @ . + # > 8 4 4 ~ # + @ @ & # . . J )+4+:+:+4+4+(+:+4+4+4+=+_.w.#+U.Z.U.W.W.Z.U.W.W.U.U.U.U.@+. . + . . + + . . % { { . . . . + + . . @ }.#+U.U.U.W.W.Z.U.U.W.#+W.~.j >.%.'.=.=.=.*.=.=.*.=.=.=.&.&.=.=.=.*.%.>.v . . @ @ + + + . . + , O '.&.=.=.&.&.*.=.*.=.*.&.&.*.>.O ", -"O >.=.=.*.*.=.&.=.=.=.=.=.>.%.'.< . . . . . . . @ = < k j | , $ . @ $ . . . # $ m =.*.*.&.=.=.&.*.&.q f l w A z x B B A A B B A B w l * % # . . . + @ % 3 l I w ; % . . . . . . . @ A B B B A B A A z B K o C 2.d.d.9.f.9.9.9.9.f.9.j.j.0.0.9.9.9.f.9.e.e.f.i.u = + - . + . . . @ @ @ @ N d.d.0.0.e.e.9.f.0.b.b.5.S -+D+z+z+w+A+z+z+z+w+z+A+z+y+y+D+y+W + + . . @ @ + . . . % @ . # @ @ @ @ + + g -+x+F+A+w+B+y+z+A+z+x+H.C.7+9+b+|+}+9+|+7+}+}+|+b+b+|+f+&+5 - - . @ $ @ . 5 n.2+7+%+7.) + $ % % $ @ # L 8+9+|+|+9+}+|+|+9+f+n.y.l+t+k+k+l+s+s+h+h+h+k+s+s+n+:.+ @ $ + @ @ # @ $ $ $ @ $ $ $ . . + + + . @ + % ! [+t+t+q+k+h+h+r+u+E.p @. .Z Z U Z Z Z U U Z Z +.+.` e ; # . + . . @ * ' y M n n } % - + @ . + . . ( ` +.Z Z +.` ` Z +.+.n ;.=+6+3+:+:+:+3+:+:+:+6+_+(+0+V.).. # % @ @ . + $ _.v.4+0+O.4 + . @ @ # . @ > P.0+:+:+(+3+:+(+(+(+3+=+[.w.#+U.U.Z.U.Z.U.U.U.Z.U.W.U.`.J + . . . . + + + ~ I k.).8 . + . + + . . @ J M.U.U.U.U.U.W.Z.U.U.U.W.~.j %.,.=.=.=.&.*.*.&.*.*.=.=.&.&.*.*.*.*.q < $ + + . . . . . . . + < O =.&.=.=.*.*.=.&.=.=.*.&.&.*.>.q ", -"q >.>.*.%.*.=.&.&.%.*.*.*.*.*.q < . . . . . . . $ | O %.'.,.t < $ # $ . . # @ = F &.*.=.*.&.&.*.*.&.q 3 E A x x x B B A A B B A A A 2 % % . # . + # @ * h w w z w h . @ . . . . . . 3 A w A A B A B z x B o s 2.f.d.j.0.9.f.f.9.9.9.9.f.0.d.d.9.9.9.d.8.9.5.u = $ . . . + - . . @ . @ + ..e.d.0.0.e.e.9.0.0.d.b.Q S -+E+z+w+v+w+z+z+w+w+w+w+z+y+w+E+x+9 @ . @ @ $ . . / [ [ 4 g [ ] [ _ _ 9 4 ^ W >+v+w+w+w+v+v+z+A+E+v+r.C.7+|+|+|+}+|+|+|+}+}+9+9+|+}+}+h.) - . $ $ + @ / J.2+}+}+}+%+L . @ # # { { ) 5 J.9+}+|+|+}+|+|+9+}+n.y.l+k+k+k+d+k+s+k+k+k+k+h+h+n+R ! & ! b b a a * ! ! ! b b ! ! . . + $ + @ $ @ b y.n+e+k+k+d+h+d+s+r+E.p ` +.@.@.Z Z Z Z U U Z U Y Y P } % . + @ @ # @ ' e ` T Y Z n } % @ @ + . . # * M +.U ` Z ` @.U .+.n ;.=+6+(+:+:+:+:+:+:+:+:+:+(+{+O.= . + @ @ . + @ _.0+0+:+4+0+v.7 . . @ @ . . . F V.(+:+(+(+:+:+(+^+3+P._.w.Z.U.W.R.U.U.U.U.U.R.U.Z.U.q.@ . . . . . . . $ w.#+U.R.w.8 + + # # . + . # }.U.U.U.U.U.W.R.U.U.U.W.~.j %.%.&.*.*.&.*.=.*.=.*.&.=.&.*.#.O q j = @ @ + $ + . . . . . . + , O =.&.=.=.&.*.=.=.=.#.*.=.&.=.*.k ", -"q >.=.*.*.%.'.&.&.%.=.=.=.*.%.j = @ @ + @ @ # . < >.'.&.'.%.>.m $ . . . . . + $ , *.=.&.=.*.*.*.=.=.q 3 l A y r x B B B B B B B B A o ; * * % % @ # % h w x y A A A . @ @ . @ . . . ( A B B B A B B y x B 3 | 2.d.d.9.9.9.9.9.9.9.f.f.9.f.d.9.j.9.9.0.b.0...= + . . @ + # + - . . + + + t j.8.0.0.e.d.9.0.0.d.b.5.S >+D+z+z+w+z+z+z+A+v+y+A+A+z+y+v+x+. @ @ $ @ @ . 9 +1+'+>+>+'+'+'+'+'+'+'+'+m+y+w+A+A+z+y+v+y+A+E+v+t.N.7+9+9+}+}+f+|+|+9+}+|+b+}+2+N.- . - . $ $ + . h.}+f+}+}+2+$+n.5 5 L L n.C.C.$+$+|+9+9+9+|+|+9+9+f+m.y.u+s+s+d+h+s+s+h+h+k+h+s+h+t+~+~+X.X.X.X.X.X.~+~+*+*+[+[+X.3.. - + $ % @ @ b X.n+k+t+s+k+h+k+k+q+t+E.p ` .X Z Z Z @.Z Z Z Z Z Z Y P } % . . . # % * ( P +. .T .@.i ; @ + + . . @ * n U ` ` Z @.` Z +.X n 1.=+6+:+:+:+(+:+:+:+:+<+:+{+:+s.. + + . . . . ~ (+0+_+(+:+4+0+O.- . @ @ # + + ] u.0+3+:+{+(+:+:+(+0+=+_.w.#+U.U.U.U.U.U.U.U.U.W.R.U.k.. . . . . . . . k.W.W.U.U.#+}.@ . # @ + . . . J U.U.U.Z.Z.U.U.U.U.U.W.~.j *.'.=.=.=.*.*.&.=.&.*.*.&.'.O j < $ @ @ @ @ + + + . . . . . . + < O >.=.&.=.*.=.&.*.=.&.*.&.&.'.*.q ", -"O >.*.=.#.*.*.&.=.%.*.&.=.*.*.q < % % $ $ % % @ j &.=.&.=.%.%.#.< . + . . - . + , =.&.=.*.=.=.=.=.'.k h I I x y x B B B B B B B B B B A w 3 3 ' ; * * w z B B z A A . . @ . @ . . . ( x B B A B A A z B E o C 2.d.e.9.9.9.j.j.9.9.9.9.9.f.9.j.j.j.9.0.i.2.: $ . - + $ = $ + + . - + $ $ v.0.8.f.0.e.9.9.0.0.d.b.5.S >+D+z+z+A+z+z+z+z+z+y+C+z+y+y+z+m+$ @ @ @ . $ @ W j+D+C+D+D+D+A+C+D+y+y+F+y+z+A+A+A+D+A+y+x+z+z+z+x+H.N.7+9+b+|+}+7+|+|+9+9+9+9+}+2+N.- @ + + $ $ + + K.5+b+b+9+7+2+$+$+f+9+f+7+b+9+f+9+9+9+9+9+|+9+9+9+f+m.E.u+r+t+d+h+s+s+s+h+h+s+s+q+t+t+s+s+s+s+n+l+s+r+s+r+t+o+o+X.b - . @ + & @ a X.l+t+t+t+k+t+d+s+k+q+t+y.p ` T X Z Z Z Z Z Z Z Z Z Y @.M } @ . . . . @ * } P Y T T T ` p ; @ . . . . . * P +.@.` U ` @.+.+.X n ;.=+a+3+(+(+:+3+3+3+:+<+6+_+(+[.@ + . . - + . 9 0+{+_+3+:+4+0+0+~ . . . + + + . C _+0+4+4+(+(+(+(+3+=+[.w.#+W.#+U.U.U.U.U.W.U.Z.U.U.J . . . . + . . @ M.W.W.U.U.U.Z.8 . . + + . . . J M.U.U.U.Z.U.U.U.U.#+W.).j *.'.'.=.*.=.=.=.=.=.=.=.=.%.j = @ % @ # . + + . + + . . . . . + < O %.'.&.=.=.*.*.=.=.=.=.&.&.%.>.k ", -"q >.=.=.%.*.'.&.&.%.%.=.%.*.*.q k | | , , , : | k &.&.&.&.&.>.j < . $ . + @ . $ 0 &.=.=.=.=.=.=.=.&.O 2 R I A y x B B B B B B B B x y x z y B B x B h w A B B w I 2 . . . . . . # @ 3 x A A B A B B z B K o t 2.8.d.j.f.9.j.j.9.9.9.9.f.0.9.9.f.9.f.0.!.1 $ @ - - $ $ 1 : = + - . . . + ..b.d.0.0.j.j.9.i.i.8.b.5.S >+D+z+w+z+z+z+z+z+z+y+z+C+y+y+y+T.+ @ . @ @ . . a.j+F+z+B+w+w+w+w+G+B+y+z+E+A+C+A+C+A+E+y+y+y+A+z+B+r.N.7+9+b+}+}+9+|+}+|+}+9+9+}+2+n.- @ + $ $ @ . ^ K.5+b+b+9+7+%+2+2+7+7+b+5+5+b+5+b+9+9+9+|+|+9+|+9+f+m.y.u+t+s+d+h+s+s+h+h+h+s+s+s+s+o+r+l+s+t+t+s+l+u+t+t+o+t+X.R + . @ $ $ % & X.s+s+k+t+s+h+l+k+s+l+q+t+E.p U .Z Z Z Y Y Y Z Z Y U Y Z P e & . . # . . % 3 M Y T T +.` } ; @ + . . . . ; ` .Y ` Y ` ` X +.X n ;.=+a+:+:+:+:+:+:+:+:+:+3+3+)+F + + + @ . + + 8 0+(+_+a+3+:+4+0+H . . @ $ # + + F {+4+4+4+(+{+(+:+3+!+l.w.#+U.U.U.U.W.U.W.R.U.#+#+W.@ . . . . + + . f U.R.`.U.U.U.#+8 . . . . . . . 8 w.U.U.W.W.U.U.U.W.Z.U.}.j *.=.&.=.=.=.=.=.=.=.*.=.=.#.j % @ % - . . + + + + + . . . . . + < O '.&.&.=.&.=.=.=.=.*.=.&.&.=.>.O ", -"q >.=.=.%.*.'.&.&.=.=.*.*.=.*.>.#.>.*.>.#.#.#.#.#.=.&.&.=.%.#.m # . . + + . + = j =.*.=.=.=.=.=.=.'.q h E A z y x B B B B B B B B A A A A A A B x z A x x B A l 8 @ # . . . . . @ @ w x w B B B B B z B K o C 2.d.d.9.9.9.9.f.9.9.9.f.j.9.9.f.9.9.f.f.: + + - . . $ , N s , $ + - . . . N d.d.0.0.e.9.9.f.0.d.b.5.S >+D+z+z+w+z+z+z+z+w+y+z+z+z+w+z+H.= . . . @ # . I.m+j+I.x.x.x.H. +1+j+x+F+F+G+w+v+y+z+E+y+y+y+A+A+x+t.N.2+9+|+|+}+f+9+f+}+|+9+f+7+2+L . # + @ % . . b &+f+2+%+N.n.h.h.n.N.8+2+|+b+9+9+f+9+|+|+}+|+|+}+9+f+m.y.u+r+k+k+s+s+s+h+k+h+k+h+h+k+h+u+h+r+t+k+k+l+l+d+d+k+[+c.@ $ - @ $ $ # c.e+o+t+k+s+s+l+l+d+k+s+q+t+y.y ` +.Y Z Z Y Z Z U Z @.Y +.+.` e ' . @ @ . - @ ; i M Z +.P e ( @ . $ . + . @ } ` T .U +.` ` @.+.X n ;.=+a+:+(+(+:+3+:+(+:+a+3+:+{+J + + . . + + + 9 0+(+_+<+a+3+{+0+J + . @ @ $ @ + 4 O.0+(+4+:+^+0+(+4+=+_.w.#+U.W.W.W.W.Z.U.`.#+Y.#+Z.+ . + . . . . . }.Z.`.U.W.W.W.,+J # . . . . + . @ }.#+U.Z.Z.W.Z.W.W.Z.W.~.j *.=.&.=.=.=.*.=.*.*.=.*.=.%.j = @ . . . . + $ $ + . + + . . . @ < O *.&.=.*.=.*.=.&.*.=.=.=.&.,.>.q ", -"q >.=.*.%.*.=.&.&.%.=.*.=.=.#.*.=.%.%.%.=.*.%.%.*.=.=.=.=.*.j < % . . . . # + $ j *.=.=.=.*.=.=.=.'.q 2 l A y x B B B B B B B B B A I w A w A A w A y B x ( 2 ; . . @ . . # # # # f A B x B A A B B z B K o t 2.d.9.9.f.f.f.9.f.9.9.9.9.9.d.0.9.f.0.f.. . . - + + ~ j |.N , $ + - - . + N d.d.0.0.9.9.d.f.0.d.b.5.^.>+E+w+w+v+w+z+z+A+v+w+w+A+w+w+y+a.= . . - . # + a.g . . @ @ . . - . g -+x+y+y+w+y+y+z+A+y+v+z+A+A+x+t.N.7+|+|+}+|+}+|+9+}+|+|+7+7+&+5 . # $ @ @ . - L J.J.L . + + + $ $ # 5 n.N.2+7+2+7+|+|+|+9+|+}+|+|+}+m.y.u+s+k+d+h+k+h+k+k+k+k+h+h+k+d+l+l+l+k+d+l+l+l+k+e+e+E.! % , - + $ % b [+e+t+k+k+s+k+d+d+d+k+h+q+t+E.p U .@.@.U Z Z Z Z Z Z X +.+.@.n ( @ @ # . + @ % ' n n M d ( % - - . + $ @ & E ` .T Y +.` @.+. .Z e ;.=+a+(+:+:+:+:+:+:+:+:+:+:+=+[.+ # # . # . + , (+{+(+a+:+<+:+:+= + - @ @ + + + ^ P.4+(+(+(+:+(+(+0+=+_.w.U.U.W.R.U.U.U..+W.Y.v.U.M.. . + . . . . . J U.R.Q.W.`.R.++[.@ . . . . + + @ }.U.U.U.U.Z.W.U.U.W.R.~.j >.%.=.=.*.=.&.*.*.=.=.=.=.#.H . # - . + $ $ f f @ . + + . . . @ < q =.&.&.&.&.*.*.=.=.*.*.=.&.=.>.k ", -"O *.=.*.%.*.=.&.=.=.=.'.=.=.*.&.&.&.=.*.#.#.>.=.=.&.'.%.%.j < + . + . - - % $ | %.=.=.=.=.*.=.=.=.=.k 2 w w A y x B B B B B B B B B B B A w A B B x y B 2 % . . . . . . . @ % * h I I I B B x B B B z B E o C 2.d.d.9.d.9.9.9.f.9.9.f.0.e.8.8.d.5.D @ - - - . $ , u i.i.u = . # # $ $ . N 0.f.f.9.b.d.f.f.j.b.b.5.S >+E+z+z+w+z+z+z+w+w+y+z+A+D+D+j+9 @ . . # @ @ % @ . @ & % % % @ + - + . W j+x+y+w+A+z+z+y+y+z+A+A+B+H.C.7+9+|+}+}+9+|+9+9+2+}+|+b+&+) % @ . + - . . :.J { . = = $ + . # % @ . / J.8+|+5+9+9+9+9+9+9+9+9+f+m.y.u+t+o+e+h+s+s+h+k+k+h+h+h+k+k+k+k+k+k+k+k+s+r+t+e+E.J @ $ @ + $ % & X.t+o+k+h+d+h+h+s+h+k+d+d+q+t+y.p U .Y Y Y Y Y Z Z Y Y Y @.M M Y @.d % + $ $ . . . . . @ @ @ $ . . + $ . ( n ` Z Z @.U ` ` ` X +.+.n ;.=+6+(+:+:+:+3+:+:+:+<+:+4+(+[.+ $ @ . @ . . . Z.:+4+<+<+:+{+(+{ # @ # . . . . + u.6+:+4+(+(+(+:+4+=+_.w.#+U.U.U.U.U.U.U.U.U.W.U.w.. . . . . . . . k.Z.U.U.U.Z.U.W.w.{ . . . . . . . J #+U.U.U.W.R.U.U.U.W.~.j *.'.'.*.*.=.=.=.=.=.=.=.=.#.j = @ & % , m *.=.q = @ @ . . . . + , O =.&.&.&.=.*.=.&.=.*.*.=.&.&.,.q ", -"O #.=.=.*.>.=.&.=.=.=.=.=.=.*.=.&.&.&.>.#.>.=.=.&.=.%.%.j < $ @ . + . . - % = k #.=.=.=.=.=.=.=.=.&.q f E A A y y x B B B B B B B A A B B B B B B B x z 2 @ . . . . . . # @ @ 2 z I A w w A B B B p r x B o C 2.8.d.9.9.9.9.j.9.9.9.j.0.9.8.8.0...g % . . . + , u i.j.i.s = . @ $ + . + t i.f.f.9.b.9.f.0.f.d.b.5.S >+D+z+z+z+z+z+z+z+w+y+E+A+D+v+x+= * # @ & % % . . . @ % # @ @ % @ @ @ + @ W j+y+w+z+z+A+y+y+y+A+A+x+t.N.f+9+b+}+}+9+9+9+|+7+}+b+5+N.) $ @ . . . . # _ ] # . + $ $ + # % @ @ . . a J.7+|+}+9+9+9+}+|+9+9+b+m.E.u+t+s+d+h+s+s+s+h+h+s+s+s+k+k+s+h+s+k+k+s+q+r+k+d+c.. % @ @ + @ & 6.n+o+k+t+h+h+h+s+s+s+k+h+k+r+s+E.p U .` @.Y Y Y Y Y Z Y +.+.U +. .@.n ( . @ $ . . . . . . . . . . - + @ & e M ` +.+.+.Y Z U ` X +.X n ;.=+a+3+:+:+:+3+:+(+:+<+6+p+0+M.+ + $ # @ . . + [.{+4+3+4+4+{+}.. @ # . . @ @ . + O.4+4+4+(+(+4+{+0+{+[.w.#+U.U.U.U.U.U.U.U.Z.U.U.w.$ . . . . . . . :.#+U.U.U.Z.Z.U.w.{ . . . . . . . J #+Z.Z.U.U.U.U.U.U.W.~.j *.'.=.=.=.=.=.=.=.=.=.*.=.#.j , $ @ < m #.=.*.O < @ . . . . . + < O %.$.&.*.*.*.=.&.&.*.*.&.&.,.*.m ", -"q >.=.=.%.*.&.&.=.=.=.=.=.*.*.*.'.=.=.%.%.=.=.&.'.>.#.j = + . + . . . . + = 0 #.*.=.=.=.=.=.=.=.=.&.O h E o x r x B B B B B B B B B B B B B B B B B A w 2 . . . . . . . @ . & ; f I A w w B B B B B z B K o t 2.d.b.e.9.9.9.j.9.9.9.9.9.e.8.d.5.: $ . . - + = 1 Q f.8.|.u = + @ @ . . + ..j.9.0.0.j.0.0.0.0.d.b.5.S >+D+z+z+z+z+z+z+z+z+w+z+A+F+y+m++ & @ & & & & @ . . . . + . @ @ @ % % $ + . a.x+y+y+E+E+y+y+z+A+z+B+T.C.7+9+b+|+}+9+9+9+9+2+}+9+b+N.{ @ . . . + - - . $ $ @ - - . . @ @ . + $ . - 5 $+2+}+9+|+9+|+|+9+9+f+m.E.l+q+s+d+h+s+s+s+k+h+h+s+s+k+k+s+h+s+k+k+k+q+q+s+X.b @ + + . @ @ ! [+l+s+s+k+h+k+d+s+s+s+k+h+l+q+t+E.y U T X Z Y Y Y U Y Y Y .T .+.Y ` M p 8 + $ + $ . - - - . . . . + . & 2 M @.@.+.+.+.Y +.Y @. . .X n ;.=+a+(+:+:+:+:+3+3+<+1+6+0+0+O.8 + + @ . . . . + [.)+(+0+4+u.= + + . . . . . . . u.3+(+4+:+(+:+:+p+=+_.w.#+U.U.U.W.U.W.W.U.U.U.U.:.. . . . . . . . :.U.U.U.U.U.U.U.w.{ . . . . . . . J #+U.U.U.U.U.U.U.#+W.~.j *.=.&.=.*.=.=.=.=.*.=.=.=.%.j j k O #.%.%.=.*.q < @ @ . . . . @ < O '.&.=.&.&.*.=.*.=.*.*.=.'.,.>.k ", -"O >.=.*.%.*.&.&.=.*.=.'.&.&.*.&.'.*.=.=.&.&.&.&.%.O m = + @ % @ . . + $ $ | #.*.*.=.=.=.'.=.*.=.=.&.k f l w x y x B B B B B B B B B B B B B B B B A I I 2 @ . . . . . . . @ . @ & ; l w w A B B B B z B K o C 2.d.9.9.9.9.j.9.9.9.9.e.b.j.i.2.1 $ + - - - $ , v.0.f.d.i.u = + . $ @ - $ ..e.d.f.j.e.e.9.0.0.d.b.5.S >+D+z+z+A+z+z+z+z+A+z+z+E+z+x+T.+ + @ @ @ $ + . + @ W W = . . + . % % @ . . @ a.x+y+z+C+z+y+y+D+E+B+r.C.7+|+|+}+}+9+9+9+|+}+}+b+9+N.) $ % @ . + - . . + . - 5 7.5 ) - $ $ + + $ + / 7.$+|+9+9+|+|+9+9+f+f+m.E.l+t+k+l+h+h+s+s+h+s+s+s+s+k+k+k+s+s+k+k+k+h+q+~+R + . + @ @ . # R l+d+s+s+h+h+k+h+s+s+s+h+h+s+q+t+y.p ` +.Z Z Z Y X Y U U Y . .+.U P M d ' % @ . . . - + # # # . - . - . & ; n e P U +.+.+.Y M ` U .+.n 1.=+6+(+:+:+:+:+:+:+:+:+<+4+4+_+v.+ + @ . . . . . - 9 [._.g + . . . . . . . @ % . u._+^+4+(+(+:+:+4+=+_.w.#+U.U.U.U.U.U.U.W.Q.#+U.(.. . . . . . . . k.W.U.U.U.Z.#+M.}.{ . . . . . . . J #+U.U.U.U.U.U.U.#+U.}.j *.=.=.=.*.=.=.=.=.=.=.=.=.&.&.=.*.%.%.%.'.'.>.O = . . . . . . + < O >.&.=.=.=.*.*.&.&.*.*.&.&.'.>.q ", -"q >.=.=.>.*.=.&.=.=.=.=.=.=.*.=.=.=.=.=.*.%.'.&.O ! $ $ @ . + . - + + = | #.&.*.&.=.=.=.=.=.=.*.=.'.q h R I z x y x B B B B B B B B B B B A A B B B A l ; % @ @ % & . . . @ @ . @ @ ; I I A A w A B z x B o C 2.f.e.d.9.f.9.9.9.9.9.d.d.i.2.1 $ + . . $ + , N 0.0.d.8.|.u $ . @ $ @ - $ N j.0.f.j.e.d.9.i.i.d.b.5.S >+D+w+w+w+w+z+w+v+w+A+w+v+y+v+H.@ $ + $ $ + + . x.1+x+x+x+-+g @ . @ @ @ % @ . W g+F+E+A+z+v+z+A+E+m+t.N.7+|+b+}+}+}+|+9+|+}+}+b+9+N.- + @ @ . . + - - . L J.8+2+8+z.5 - @ $ + $ $ @ ) n.9+|+|+9+|+|+|+|+b+m.E.u+s+s+k+h+k+k+k+k+k+k+k+k+k+k+k+s+k+k+k+k+k+l+X.b @ + + . - + a X.l+k+d+h+d+h+k+k+k+h+h+d+k+s+q+s+E.p ` +.Z Z Y Y Y Y U U Y +.+.@.P M } * & % . @ % @ % * ; ; ; @ @ . . . & ; ; ( e P @.U U ` ` Z +.+.X n ;.=+a+(+:+:+^+^+:+:+:+:+:+:+(+{+O._ # + + + . . . . . + + + + . + + + . . . . . . u.4+{+(+:+{+^+:+3+^+v.w.#+U.U.U.U.U.U.U.Z.Q.U.Z.k.. . . . . . . . k.Z.Z.U.U.U.U.U.w.{ . . . . + + . J #+U.U.U.U.U.U.U.U.W.~.j %.,.'.=.=.=.=.=.*.&.=.=.=.&.&.&.%.%.&.&.&.'.'.q * # . . . . . @ < O '.&.=.=.*.*.=.=.=.*.*.*.&.%.>.m ", -"q >.=.=.*.#.&.&.=.=.=.=.=.=.*.=.=.=.=.%.*.=.>.O < @ . @ $ . . . . @ % 0 #.'.&.=.=.=.=.=.=.=.=.=.=.&.q f l I A y x B B B B B B B B B B B B B B B B B B w 2 2 2 f 3 ; @ @ . . @ . + . ; A I A A w A B z B K o t 2.b.d.9.9.9.9.9.9.d.9.9.j.2.s $ . # @ + , , ,.5.0.0.e.j.i.s $ . . @ @ - # N j.i.0.j.b.b.d.f.0.d.b.5.S >+D+z+A+w+z+z+z+C+v+z+z+y+z+w+y+x+ +T.H.H.g W +x+x+F+E+z+x+>+g + + # . % % % [ T.y+E+A+y+x+z+A+z+x+t.N.7+|+9+|+}+}+|+9+|+}+2+|+9+N.) . . @ @ + - . + L $+2+7+7+2+f+K./ + @ $ $ + . - L 9+f+}+9+}+9+|+}+f+m.y.u+q+s+d+h+h+s+s+k+k+h+s+h+k+k+k+k+k+k+k+k+k+d+c.@ @ + . . + # R n+o+k+q+s+h+h+d+h+h+s+s+k+h+k+k+t+y.p U .` @.Y Y Y U Z Y Y Z Z @.M } & . @ % . @ % % ' e n M e ( ; $ . . & % + & ( n M ` Z Z ` Z U +.X n ;.=+6+(+:+:+:+:+:+:+:+<+<+(+:+(+0+O.9 + . + . . . . . . . - + + @ + + . . @ @ . . u.3+:+3+(+(+:+:+3+=+_.w.#+U.W.R.U.U.U.U.U.U.U.U.w.. . . . . . . . :.U.Z.U.U.U.W.U.w.{ . . . . . . . J #+U.U.Z.Z.U.U.U.#+W.~.j *.=.'.=.=.=.=.=.=.=.=.=.=.&.&.=.'.&.&.&.=.*.*.O < @ @ . . . . + < O %.=.=.&.&.*.=.*.=.*.*.=.'.,.>.m ", -"O >.=.>.*.*.=.&.=.=.=.=.=.*.&.=.*.%.'.%.*.*.k 2 $ @ @ . @ $ . + + % h #.%.&.&.=.#.=.=.=.=.=.=.=.*.=.q 2 E E A y x B B B B B B x B B B B B B B B B B y B z I I w B A @ @ . @ . . . . ; ; A I w w w A z x B o C 2.8.b.9.9.9.j.9.f.f.9.9.9.Q = . - % @ + = j N N N Q N N s 9 - . @ @ + + . D N N N 5.j.b.d.f.0.d.b.5.S >+D+z+z+z+z+z+z+z+w+z+z+F+y+D+y+F+y+F+x+y+x+x+y+y+F+E+A+A+y+y+a.. @ @ . @ * % > x.F+D+A+z+v+y+z+F+x+t.C.f+|+|+9+}+9+|+9+|+9+7+b+5+N./ . @ + - . . + . C.9+f+9+b+|+|+f+n.. @ % @ # $ . 5 9+9+9+9+|+}+9+9+f+m.E.l+t+s+d+k+s+s+h+k+k+h+s+h+k+k+k+k+k+k+k+s+q+X.b $ $ + . . + ! E.q+t+t+q+h+d+s+k+h+h+s+h+k+h+h+k+t+y.p ` +.Y Y Y Y Y Y U U Y @.@.` n ( @ . . # - @ * } e U @.@.@.M } ; . - - . - . * e P @.+. .` P X .Z e ;.=+a+(+:+:+:+3+:+:+^+_+:+3+3+:+(+0+P.9 @ + + . @ . . . @ . . J }.+ + + . . @ @ @ u.4+3+4+(+(+(+4+4+O.[.w.#+U.U.`.U.U.U.U.U.U.U.U.w.@ . . . . . . . }.U.U.U.U.U.U.U.w.{ . . . . . . . J #+Z.U.U.U.U.U.U.#+W.~.j %.,.'.%.=.=.=.=.=.*.&.*.=.%.=.=.=.%.=.=.=.%.%.q = . . . . . . + < O '.&.&.=.=.=.&.=.*.=.*.&.&.=.>.q ", -"q #.=.=.#.*.&.&.=.=.=.=.=.=.*.=.=.=.=.=.>.j = * % @ . @ @ . + $ $ j #.%.'.&.&.=.=.=.=.=.=.=.=.=.=.'.q h I w A y x B B B B B B B B B B B B B B B B x y B x A B B B B I @ . @ . . . . & ; l A w A w w z x B o C 2.d.d.e.9.9.j.9.9.9.9.j.i...~ ) # . + $ & + $ = , $ @ - , = - @ + + + @ - $ , , : N i.i.f.f.f.d.b.5.S >+D+C+z+z+z+z+z+z+w+z+y+F+y+D+D+F+F+D+D+D+E+F+A+A+D+D+D+E+z+x+ +^ % @ . % ; @ . a.F+D+E+B+y+z+z+z+B+H.C.2+9+|+|+}+9+9+|+|+7+7+b+b+&+{ @ @ . . - . . * N.b+|+b+9+|+|+9+n.. @ % % % @ + 5 5+9+f+9+|+|+9+9+f+m.y.u+t+k+d+h+s+q+h+s+s+s+s+s+k+k+s+t+r+k+k+s+r+E.@ @ = + - . . b n+s+t+q+d+u+u+s+d+h+s+s+s+k+s+s+q+t+E.y U .Z Z Z Y X Y Y X Y Z +.X e ; . - @ % - + * } M T T . .` e ; . - . . - . % } M +. . .@.` +.+.X n ;.=+6+3+:+:+:+3+3+3+:+<+<+3+3+:+4+(+0+{+[.$ # # # % & + @ @ w..+J + + + . . . # _ P.3+4+4+(+(+(+(+4+=+_.w.#+U.W.R.U.U.U.U.U.U.Z.U.`.+ - . . . . . . k.W.W.U.Z.U.U.U.~.$ . . . . . . + }.#+Z.W.W.U.U.U.U.U.W.~.j *.'.'.'.*.=.=.=.=.*.=.=.=.%.%.=.=.=.*.*.>.'.*.O = @ @ . . . . + < O %.%.=.=.*.*.=.&.&.*.*.*.|.&.>.q ", -"q =.'.=.*.%.=.'.'.=.%.=.*.=.#.#.%.,.%.O < @ @ @ . - # @ # $ , 1 #.*.*.*.*.*.=.*.*.=.=.=.=.&.=.=.*.&.q f R I A y x B B B B B B B B x y y B B A I I w y y y B B y A A f 2 & @ & . . . . & l I B B x A A B K o s 2.d.d.9.f.j.j.9.9.9.f.9.9.Q $ - @ @ $ $ + . + + + . . $ = - - . + + @ # + $ @ - , Q j.j.j.i.i.d.b.5.S >+D+z+z+w+y+z+z+z+w+A+z+z+w+z+F+F+D+F+D+D+F+E+w+y+y+x+y+F+D+y+'+g @ @ . . % & @ s.F+D+A+z+B+z+D+z+x+H.N.f+9+b+}+}+7+9+}+}+|+7+9+2+2+L + $ @ @ @ . - 4 &+7+f+9+9+|+}+f+C.) - + . @ & % a K.}+|+|+|+}+9+|+7+m.E.u+s+s+k+h+s+h+s+k+h+s+s+q+q+s+l+s+k+s+s+s+X.a . @ @ + + $ ! X.q+h+d+h+d+s+h+s+k+h+h+s+s+h+h+k+q+t+E.p @.+.Y Z Z Y Z Z Z Z @.X X M } & . - . . . % ; d P Y Z Y T +.M ( ; @ . . $ + . * n M @.` ` ` +.+.X n ;.=+a+:+:+:+:+3+:+:+:+<+:+<+3+(+_+_+{+3+(+^+v.H 9 9 D H v.(+{+0+).$ + @ % # + . 4 O.4+(+3+(+(+:+4+4+=+[.w.#+U.U.U.U.U.Z.U.W.R.U.#+G.. . . . . . . . J U.U.U.U.U.#+R.).@ + + . . . . * 1.Z.U.U.W.W.U.Z.W.#+W.~.j >.=.&.&.*.=.*.=.=.=.=.=.=.*.&.=.&.&.=.=.=.&.>.j < @ . . . . . . < #.>.&.&.&.&.*.=.'.&.*.=.&.'.*.>.#.", -"#.*.'.=.#.>.=.&.'.%.*.=.=.*.%.*.%.,.q m = @ @ @ @ @ . . $ | j #.#.=.=.&.%.=.=.=.'.*.&.*.*.*.*.*.&.$.q h l w x y x B B B A A B B B B x B B A w I I h o B A I x y x p I ; & @ % . . . @ @ o I z y A I x B E o C 2.f.e.j.0.9.f.9.0.0.9.d.d...+ - - % $ @ . . + . . . . # + - . . $ $ + @ % @ - . , Q j.j.f.0.0.d.b.5.S >+E+w+w+w+w+z+w+w+w+w+z+w+y+x+w+x+x+z+x+x+x+x+x+v+v+y+v+z+D+y+-+9 % @ . . @ % @ a.F+D+z+y+x+w+z+z+j+t.C.7+9+|+|+}+}+9+}+|+|+7+|+2+f+h.- + + @ # - . L %+}+|+|+|+|+|+f+J.% - - . + @ % / 5+|+}+}+}+}+}+}+f+n.y.l+s+s+k+k+k+k+h+k+k+k+k+k+d+d+d+l+k+t+e+s+E.{ + . @ $ $ + ! X.q+d+d+d+d+k+k+d+k+k+k+d+h+k+k+h+s+s+E.p @. .` @.Z Z Z Z Z Z Z Y @.M } % . - + + . @ ' d ` Y +.U T Z M } * @ . . + . . * n ` Z Z ` @.U +.+.n ;.=+6+:+:+:+:+(+(+:+<+<+a+<+:+(+(+_+4+(+_+_+_+{+=+=+=+:+=+1+=+4+[ + . @ @ . . + F V.(+:+{+(+:+^+(+3+P._.w.#+U.W.R.U.U.U.U.R.Q.W.R.&+f + + . . . + - f W.U.U.U.U.Q.@+a @ + . . . + . < ~.R.R.U.U.R.R.U.U.W.W.}.j >.%.&.*.*.*.&.*.&.=.*.=.=.*.*.*.*.*.*.&.=.%.#.j < @ @ . . . . + < O *.&.&.=.=.*.*.*.*.*.*.*.&.*.>.k ", -"q >.'.=.#.%.=.&.&.%.=.*.*.*.*.*.%.#.j = $ + . + . . + = | k #.,.%.&.&.,.&.&.=.,.'.*.&.=.=.*.&.*.*.'.q h E B x y y x B B B B B B B A w h 2 ' ; % * % * h w I A B B y I @ & @ # . . . @ @ l z x B B A z x B o t 2.f.e.d.9.f.f.f.9.9.9.9.i.t + . @ % @ . # @ - . . . @ . + . - - . + @ @ - . . . $ ..j.9.0.9.f.d.b.5./.i+D+z+y+w+w+y+y+y+w+A+A+y+F+x+'+1+'+T.T.W H > m+y+D+E+C+D+w+y+I._ % @ . . @ $ + x.y+A+z+y+v+z+A+E+x+r.C.7+|+|+|+}+}+|+}+}+|+|+7+7+2+N.- + $ $ $ @ # / N.9+|+b+b+|+|+9+m.@ - @ @ @ @ @ / 9+9+|+}+}+|+9+|+f+m.y.u+s+s+d+d+h+s+h+k+k+h+h+h+d+l+u+l+k+s+k+l+B.+ . . @ % % @ b ~+s+k+h+k+k+h+k+h+k+k+d+h+h+k+d+k+r+s+y.p ` .` @.Z Z Z Z Z Z Z U Y P } % . . . + . @ ; d P .T T T +.e d & @ . . @ . @ * n @.U Y M ` Y +.X n ;.=+6+(+:+:+:+:+:+:+:+:+3+:+:+(+_+{+{+{+{+{+0+0+0+_+0+4+:+{+{+v.+ + + % @ . + + C ^+4+(+4+(+(+(+:+3+P._.w.#+U.W.W.U.U.U.U.U.U.Z.Q.`.J . + . . . . . @ M.U.U.U.U.Q.Y.8 + . . . . . . 8 G.R.U.U.U.U.U.U.U.U.W.).j *.=.&.*.*.=.=.*.*.=.=.=.=.*.&.=.*.*.*.*.=.=.'.q < @ . . . . . @ < O &.&.=.#.=.*.=.&.*.*.*.&.&.%.>.O ", -"O %.'.*.*.*.=.&.&.=.=.=.*.*.*.=.>.j , $ $ @ . . + + + < O #.#.#.*.*.#.>.'.>.>.%.>.=.*.=.=.=.=.=.=.'.q 2 l w x y x B B B B B B B B 3 ; % & % % . # @ & 3 I w z B B y I @ % @ . . . . @ * l A y x B A z B E o t 2.9.b.e.9.9.9.9.9.9.f.j.i...+ . # # # . . # . . . . # . . . - - . @ @ + - . + @ , Q 9.0.f.f.0.d.b.5.S >+D+z+z+w+z+C+z+z+y+A+E+B+y+T.> = ~ > > ~ ) . I.y+w+E+D+D+z+y+a.> % @ . . . + g '+z+A+z+y+y+y+E+D+v+H.N.7+9+b+}+}+9+|+f+|+9+9+b+7+}+N.) . . + + + $ . C.|+|+9+b+b+|+9+n.. . . . + . . 5 9+9+9+9+}+|+9+9+f+m.y.u+t+s+d+l+s+s+s+h+k+h+k+s+l+d+d+l+h+d+d+~+R . @ @ @ # # + b q+s+l+l+k+h+s+k+h+k+h+s+h+h+k+h+l+q+t+E.p U .Y @.Z Y Y Z Z Z Z X +.P i ; # + + . - @ ; e Y T T T +.` M ' ; # . . @ . % ' n ` U U ` @.+.+.X n 1.<+a+(+:+:+:+3+:+3+:+6+3+:+3+_+_+0+ +u.u.[.H H 7 {+0+0+_+0+0+F.- + . - @ . - . O.4+4+0+0+(+:+:+(+(+^+v.w.#+U.U.U.U.U.U.U.Z.Q.U.#+W.k.$ . . . . . . . k.Z.U.U.#+#+~.= . . . . . . . L @+R.U.U.U.U.U.U.Z.U.W.~.j =.%.=.&.*.=.*.=.*.=.=.=.=.*.=.&.*.&.=.=.&.'.#.j < @ @ @ . . . @ 2 q >.&.&.&.&.=.*.=.=.&.*.=.&.&.*.m ", -"q =.=.=.=.*.=.&.%.'.=.=.=.*.*.=.q , $ $ @ . . . . + + $ = = , , , = % = = = = = = *.=.=.*.=.=.&.=.'.k 2 I w A x B B B B B B B B B A ; % % @ # + . . @ * f w z I w A f @ @ @ . . . . @ 2 I w B y y B z B E 3 t 2.9.e.e.9.j.j.j.9.f.9.0.i...= = $ = + $ + + + + + + + + = $ . . . # . + - + = = , Q f.0.f.0.0.d.g.5.S >+G+B+z+C+y+y+z+z+y+z+z+F+B+m+% + $ # @ ; % @ 9 m+x+y+y+F+B+-+g . % @ . @ @ @ W m+z+E+A+y+y+y+z+z+x+H.N.7+9+b+|+}+7+|+9+}+9+|+9+7+}+}+L - # $ = $ + . L %+2+2+7+7+2+%+L . @ $ # . + ) L b+}+f+7+|+|+f+7+f+m.y.u+q+t+k+h+s+s+s+h+s+s+s+s+d+d+t+t+t+t+l+X.a + @ . + . - { c.r+l+l+s+k+s+s+s+h+d+h+s+h+h+h+h+l+q+t+E.y ` +.Y Z Z Y Z Z Z Z Z X +.` e ; @ . + . . @ * ( c P Y +.U M i ; % . . . @ . % } n Y +.Y ` @.+.+.X n ;.=+a+(+:+:+:+:+:+:+<+a+:+<+4+)+<.~ ~ ~ + $ . . + M.0+0+0+0+0+4 . . . @ @ . + F O.4+3+3+4+{+(+(+(+4+P._.w.#+U.U.U.U.W.W.U.U.U.U.#+U.w.@ . . . . . . . $ w.U.#+#+U.8 @ . . . + + . @ }.`.U.U.W.W.U.U.U.W.#+W.~.j *.=.&.=.=.=.*.=.*.*.=.=.=.*.*.=.=.=.=.=.=.=.#.j < @ . # . . . + < O >.&.&.=.&.=.=.=.=.*.*.=.&.%.,.q ", -"O =.=.=.#.*.=.&.&.=.=.=.=.*.%.#.| $ @ @ + . . + + . . . @ @ + $ @ # @ @ $ # + + % =.*.*.&.=.=.=.*.&.q f E E x y x B B B B A A B B I J % @ @ . . . . . @ 8 f w I I h { % % % . . . . % l I A B z y y z x B o C 2.d.d.9.9.9.9.f.f.f.9.e.j.5.1 1 1 s 1 D 1 1 1 1 1 1 1 1 s , + . . . . + - 7 s 1 u 2.f.d.9.i.i.d.b.5.S >+D+B+y+w+y+z+z+z+z+z+z+D+z+x+a.+ = . @ ; * % + g m+x+x+x+j+g - . % @ . . # [ I.y+E+E+E+y+y+y+A+z+x+r.N.7+9+b+|+}+f+9+9+|+|+|+9+7+}+2+N./ - + $ $ @ # - L &+8+8+8+&+L - @ . @ @ . . 5 N.9+}+9+f+9+}+}+f+7+C.E.u+t+s+k+h+s+q+s+h+h+s+s+s+h+h+k+t+t+k+l+E.! . @ $ @ # . { E.s+s+s+s+k+h+s+t+h+h+h+h+s+s+k+h+h+r+t+E.p U .Y Z Z Z Z Z Z Z Z Y Y ` e ( & . @ @ + @ @ * ( n n P n e ; % # . + + # @ * } ` .+.X ` ` X .Z n ;.=+a+3+(+(+3+3+3+3+:+<+4+(+{+{+}.+ $ + + + + . . 8 (+0+_+,+_.$ + @ @ @ . . + u.(+(+:+:+3+(+(+:+:+3+O.}.k.#+U.#+U.U.W.W.W.U.U.U.U.U.W.J . . . . . . . . ; [.q.w.8 . . . . . + + . 8 w.U.U.U.#+#+U.U.U.U.Z.W.~.j *.=.&.*.*.=.=.*.&.*.&.=.&.*.&.&.=.*.=.=.=.=.%.j < @ # . . . . + , O =.&.&.=.*.*.*.=.&.*.*.&.&.%.>.q ", -"O =.=.=.#.*.%.&.&.=.%.=.*.*.%.q < @ @ . - . . + + . . . @ @ + . - . # . + . . + @ =.*.*.=.*.*.*.=.&.q h E E x r x A A B B A A B B w f % & % @ . . @ & @ % * * % * * @ @ # @ . . + . f I I x B p y x y B E o t 2.8.d.9.9.9.f.f.9.9.9.e.b.0.2.5.5.i.2.N 2.2.5.2.2.2.2.2...s , + . . . . + t 5.5.2.0.f.d.d.0.0.d.b.5./.>+D+w+v+w+v+y+z+w+v+y+w+D+v+v+m+= + . # @ % @ # . _ W W H [ . + % % @ . @ % g m+E+F+w+A+z+y+w+A+E+v+H.C.7+|+9+}+}+}+9+9+}+}+|+|+}+;+|+8+L / . + $ % % @ - / L m.L / - . . @ $ @ . / L $+|+}+|+|+|+}+}+|+f+n.y.l+s+k+d+d+k+k+k+k+k+k+k+k+k+d+k+s+o+t+n+6.% @ + @ % @ . / *+k+k+k+k+k+s+s+s+k+k+k+k+d+h+k+d+k+s+t+y.p @. .@.@.Z Z Z Z U Z Z X +.@.M } * @ . @ % $ . . * ' ' 3 ' ' % - + . + $ @ @ ; d @. .T Y ` P Z +.Z e ;.=+a+:+:+:+:+:+:+:+:+:+(+(+(+(+O.^ $ + + . - . . . ~ _._.4 . + + + @ @ - + F )+(+(+:+(+^+:+:+:+:+3+P.[.w.#+U.U.U.U.U.U.W.U.U.U.U.U.U.w.@ . . . . . . @ @ + @ { . . . + . + + . . J U.U.U.U.U.U.W.U.U.U.U.W.~.j *.&.*.*.*.=.*.*.=.*.=.=.=.*.=.=.*.*.=.=.=.=.>.O < @ @ @ . . . + < O %.$.&.&.&.*.=.&.=.*.*.=.&.'.>.k ", -"q =.&.=.%.*.&.&.'.%.%.*.%.'.'.q = . @ . . . . + + + + . # . . @ # . + . + + + . @ &.=.*.&.=.=.=.=.=.k f l w z x B B B B B B B B B A I l * % @ @ @ . @ % @ @ % @ % @ % % @ . . . - . 8 I w y y y x B y B E 3 C 2.d.b.j.0.0.9.9.9.9.9.d.8.f.i.i.j.b.f.f.j.e.j.j.9.b.9.8.|.u , $ . . . . . |.j.j.i.f.d.d.9.f.0.d.b.5.S >+E+z+y+w+w+z+y+z+v+y+w+D+z+w+x+P.+ + - . # . . @ % $ = + @ @ @ % @ . @ % [ T.x+w+v+z+A+y+x+w+A+A+x+t.C.7+9+|+}+}+|+|+9+|+}+|+|+}+|+|+8+&+/ . + % % # + $ + - ) - + = + # @ $ @ . 5 &+2+|+}+|+}+}+}+|+|+}+m.y.l+t+k+d+l+h+h+h+h+k+h+s+s+k+k+h+s+e+e+n+R @ $ $ @ . # # 5 X.k+k+k+k+e+s+s+s+s+k+k+h+l+h+h+l+h+q+t+E.p ` +.Z Z Z @.Z Z Z Z Z +.+.@.M i ; @ + % % . - . - . $ % * % - . - . + $ @ . h n ` .T +.` @.+.+.X e ;.=+<+^+:+:+:+:+:+:+:+:+(+4+(+{+{+w.+ . . . . . . @ . ~ ~ + + + + @ % # . ~ O.0+(+:+<+:+(+:+(+(+:+3+=+[.w.#+U.W.R.U.U.U.U.W.U.U.U.W.R.U.J . . . . . . @ . . . . . . . . . + + . 8 G.U.U.U.U.U.Z.U.U.U.U.U.U.).j *.&.&.*.*.=.=.*.&.=.=.=.=.&.=.=.=.=.=.=.=.%.%.j < @ # # . . . + < O >.$.&.=.=.*.=.&.=.&.*.=.&.%.>.O ", -"O *.&.=.*.>.=.&.>.*.=.&.'.*.#.2 % . + . . . . + + + . . + . - . @ . + . - + - . @ =.=.=.&.=.*.=.=.&.k h I I B B B B B B A B B B B A A A 3 ; % # . # - @ @ . @ # @ . @ - - + @ @ * 2 w A A B B x B B z x B o C 2.d.b.9.f.9.9.9.9.9.9.d.8.f.9.9.9.d.f.9.9.9.d.9.9.e.d.d.|.q , $ - . . . $ l.i.9.9.j.e.d.e.0.0.b.b.5.S m+E+z+z+w+z+z+z+z+A+z+z+E+z+w+y+x+I.@ . + + $ $ $ % @ @ @ % @ # @ # + + 9 T.x+y+w+y+y+A+y+y+y+E+A+B+x.N.7+9+|+}+}+9+f+9+|+|+9+9+f+|+|+f+2+C.5 - # @ $ $ @ @ @ $ @ $ $ $ $ $ + - L %+2+}+|+|+9+f+}+|+9+|+f+m.y.u+r+t+k+h+s+h+h+k+k+h+s+q+l+k+t+o+k+e+X.I @ $ @ + + . - a [+t+k+h+s+k+k+s+s+s+k+s+s+s+s+k+h+l+q+t+E.p @. .Z Y Y Y Z Y Y Y Y +.+.+.Y P d ' * * @ @ # @ @ @ + # . # . . . . @ @ } d M ` Z +. .+.` P +.+.+.n ;.=+a+:+(+:+:+:+3+:+:+3+:+3+(+(+4+=+C . . + . . . # . + + + + . . @ # + 9 s.(+4+:+(+:+:+4+:+:+(+(+p+=+_.w.#+U.W.Z.U.U.U.U.U.U.U.U.W.W.Z.Z.J @ . . . + + . . . . . . . . . . . ] w.Z.U.U.U.U.U.Z.U.U.U.U.#+W.).j >.%.'.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.%.q , + . . . @ @ @ < q *.&.&.&.=.=.=.&.=.=.=.=.'.%.>.q ", -"q *.>.*.*.>.=.&.*.*.&.'.=.>.q < # . # - - # . . . . . . . . . . . . . . . . . . + =.=.=.=.=.=.=.=.=.q h R I A x x B B B B B B A A B B B A o ; * # @ . . . . . @ . . . . . . % 2 l I B A B B B B x A z x B o C 2.d.e.j.9.9.9.9.j.9.9.e.d.9.9.9.j.9.9.f.9.9.9.9.9.d.9.9.|.t = @ - ) . . = N i.f.9.e.e.e.9.0.f.d.b.5.S -+D+z+z+w+z+z+z+z+z+z+z+z+z+w+z+E+v+++_ . # $ $ @ $ % % @ @ # + + . + H T.x+B+z+A+z+z+A+y+B+y+A+A+B+x.C.8+b+|+|+f+7+b+f+|+9+9+f+9+}+|+b+9+7+J.L - $ $ $ @ @ @ @ @ @ + @ @ + - 5 N.7+7+|+9+9+9+9+|+9+9+9+7+C.E.l+q+t+l+h+s+s+s+h+s+s+s+q+l+n+t+t+k+l+S.-.* = $ + + @ # R n+s+t+t+s+k+h+s+s+s+k+s+s+s+q+k+h+s+q+s+E.p U .Y Z Y Y Y Y Y Y Y +. . .+.U P d ' & . . . # @ + . . . . . . % % % % e M ` @.+.+.+.+.@.@.+.+.X n 1.=+a+:+(+(+3+3+^+^+:+:+4+4+:+<+4+:+=+a.* . + + + + + + + + . . # . . C P.3+4+4+:+:+4+4+(+:+:+4+(+p+=+_.w.#+U.U.U.U.U.U.U.U.W.W.W.Z.U.U.U.W.:.; . . . . + . . . . . # + . . 8 w.W.W.#+U.U.U.Z.W.W.U.Z.U.#+W.~.j >.%.'.=.=.=.=.*.&.*.=.=.=.*.*.=.=.=.=.*.=.&.'.q , + @ @ + @ % @ < O %.'.{.!.&.*.=.=.=.=.=.=.'.,.>.O ", -"O >.=.=.*.*.=.&.%.*.&.&.&.#.j = # . + + + + + + @ + + @ + . + + . @ + + # + + . @ =.=.=.=.=.=.=.=.&.q h I I x y x B B B A A B B A B B x A w l 2 * @ % % @ . @ @ @ @ . @ % * 2 w A A B A B B B B B B z x B o t 2.9.e.9.9.9.9.j.9.9.9.9.9.9.9.9.j.j.9.f.9.9.9.9.d.9.9.9.|.u = + . . + + , ..5.e.e.9.9.e.9.0.0.d.b.5.S >+E+z+z+w+z+z+z+z+w+z+z+z+z+z+z+z+z+x+'+t.W . . + # @ @ # . - . > g x.j+x+y+A+A+A+A+E+E+y+B+z+A+C+x+x.N.2+f+b+}+}+f+9+}+}+9+9+9+9+}+9+b+9+}+7+$+n.L / - + # . . . . . . - L m.&+2+7+}+|+9+9+|+9+|+|+}+9+7+n.y.l+r+s+d+h+h+s+s+k+h+s+s+q+l+k+s+r+t+t+E.l % + + @ + . & R n+h+s+s+s+k+s+s+s+s+k+k+s+s+q+k+h+s+q+t+E.p U .Y Z Y Y Y Y Z Y Y Y Y +.+.+.@.M e ( % * & @ . @ @ @ @ @ % % * ' ( i P P @.@.X X Y ` P ` +.T +.n ;.=+a+3+(+(+:+3+3+4+:+:+3+4+:+:+<+4+3+,+u.J = + + . + + . + . . ] F w.=+:+4+4+:+3+4+(+(+4+:+:+4+4+4+=+_.w.#+W.U.U.U.U.U.U.U.U.U.W.Z.U.U.W.W.U.w.J @ . . . . . . . . . + 8 }.M.#+#+W.Z.Z.U.U.Z.W.W.U.U.Z.W.W.~.j >.=.&.=.=.=.=.&.=.&.=.&.=.&.&.=.=.&.=.=.=.&.'.j 2 % + + $ $ + $ < O #.=.'.{.=.*.=.=.=.=.=.=.&.'.%.k ", -"q >.&.=.%.%.'.&.*.*.%.%.%.*.#.j m j j j j j j m m j j j m j j j j j j j m j j m j =.=.=.=.=.=.=.=.'.q 2 E A x y x B B B B B B B B B x x B A I l l f f 2 ; * ; ; * 8 2 2 2 o A B x B B B B B B B B B z x B 3 C 2.d.b.e.f.9.9.f.f.9.9.9.9.9.9.9.j.j.9.9.9.9.9.9.9.9.9.9.j.2.u N t ..N t s 5.i.9.d.d.9.d.9.0.0.d.b.5.S >+D+z+w+w+z+z+z+z+w+w+z+z+z+w+z+z+w+D+E+m+j+ +a.a.W W W a.a.a.s. +j+x+y+y+w+D+D+A+A+z+A+y+y+z+A+A+v+x.N.f+|+b+|+}+9+}+}+|+|+|+9+|+|+}+|+|+}+}+f+2+$+K.n.L L L L L L L m.J.&+2+7+7+7+|+|+|+9+|+|+|+|+}+9+f+m.y.u+s+k+d+h+k+k+k+k+k+k+h+k+d+l+k+t+s+k+[+E.E.E.E.E.E.E.S.~+s+h+h+h+h+k+k+k+h+k+k+k+h+s+q+k+k+d+q+t+E.p U .@.@.Y Y Y Z Z Z Y @.` @.+.+.Z @.` M d d i } } } } ( ( } d i e e n M U Z Z Z U Y Y Z P @.U .+.n ;.=+a+(+:+:+:+(+(+:+:+:+:+:+(+(+:+:+:+)+{+O.L.w.F F F F J J C q.O.)+)+:+:+(+:+:+:+(+:+:+4+(+:+:+(+4+=+_.w.#+W.W.R.U.U.U.U.U.U.U.U.U.U.U.W.U.v.`.M.w.}.).J { 8 J 8 J }.w.M.W.W.M.M.U.W.W.M.U.U.U.W.R.U.U.U.W.~.j %.=.=.=.=.&.*.=.&.=.*.=.=.=.=.=.=.=.*.*.=.&.&.*.k m j j j j j j O #.>.=.=.=.=.*.=.=.=.=.*.=.&.%.%.q ", -"q >.*.=.*.#.*.&.=.*.*.=.=.*.*.#.>.=.*.*.*.%.%.%.*.*.*.*.=.=.=.*.=.*.=.*.*.%.*.%.%.=.=.=.=.=.=.=.=.=.q h w w x y x B B B A A B B B B B B B A I I I I I l w w w w o l A x A A B B B y B B B B B B B B z B K l 7 Q d.b.9.9.9.9.9.9.9.9.9.9.9.9.9.9.j.f.9.9.9.9.9.9.9.9.9.8.d.2.0.j.e.d.i.i.i.f.d.9.9.9.d.d.f.0.d.b.5.S >+D+z+w+v+w+z+z+z+w+z+z+w+y+v+z+z+z+z+w+w+F+y+m+m+m+j+m+m+m+m+g+x+y+y+w+v+z+A+A+z+y+z+E+z+y+z+E+z+v+H.N.7+9+|+}+}+}+}+|+9+|+|+9+|+9+}+b+|+b+|+|+}+f+9+2+$+$+%+%+%+$+$+7+7+2+f+|+}+7+|+|+|+9+|+|+|+}+|+9+}+m.E.u+t+k+k+k+k+h+k+k+k+k+h+s+d+k+k+k+t+n+n+n+n+t+t+t+t+s+q+r+t+k+k+s+k+k+k+k+k+k+k+k+h+s+h+k+k+l+q+s+E.p U .Z @.Y Y Z Z U Z Y @.` ` +. .+.+.+.X Y ` ` ` ` ` ` P M M P P ` Y Z X +.U Y Z Z ` ` ` ` Z +. .+.n ;.=+a+(+(+:+:+3+(+:+:+:+:+:+:+(+:+:+{+4+<+0+0+{+{+O.O.{+O.O.!+{+0+4+{+(+<+3+(+:+=+:+<+:+4+:+=+:+:+3+=+_.w.#+U.U.U.U.U.U.Z.R.U.Z.U.U.U.U.U.U.L.U.U.U.U.M.G.w.M.M.M.M.M.#+#+W.W.Z.U.U.#+W.M.U.U.U.W.R.U.U.#+W.).C %.*.=.=.*.=.&.*.=.*.&.=.=.*.*.=.=.*.*.*.=.&.&.*.#.#.>.>.%.%.>.>.#.*.*.*.>.*.=.=.=.=.=.=.*.=.'.'.>.k ", -"O >.%.=.*.#.=.&.&.*.=.&.=.=.=.*.=.&.&.&.=.'.'.'.&.&.&.&.&.&.&.&.&.&.&.&.&.'.'.&.'.=.=.=.=.=.=.=.=.&.k 2 R I x y x B B B B B B B B B B A B B E w A A A A w I I A I w B B x B B z B y B B B B B B B B z B K l C 2.b.d.9.9.9.9.9.9.9.9.9.9.9.9.9.9.j.9.9.9.9.9.9.9.9.9.9.9.9.f.9.d.b.f.0.0.0.9.9.9.9.9.d.d.i.i.d.b.5.S >+D+z+z+w+z+z+z+z+w+z+z+z+E+w+z+z+z+y+z+z+E+z+C+A+z+y+y+z+y+y+z+E+A+z+y+y+z+z+z+y+y+y+E+z+y+z+A+z+x+t.N.7+9+b+}+}+f+|+9+|+|+}+9+9+|+}+9+b+b+|+|+b+b+b+f+9+9+9+9+9+|+9+9+|+|+|+9+9+9+|+|+|+|+|+|+|+|+|+}+f+m.y.u+r+s+k+k+s+h+s+k+k+h+s+s+k+k+s+s+s+e+k+l+l+e+t+t+s+k+q+q+s+k+k+s+s+k+k+q+s+h+k+h+h+q+h+k+h+d+q+t+E.p ` +.@.Z Y Y Y Z Z Z Y @.P ` U +. .+. .+.X Z Y Y Y ` ` Y Z Z X +.+. . . .+.+.Y Z ` ` ` ` ` @.+.+.X n ;.=+a+(+:+(+(+:+:+:+:+:+:+3+:+:+3+3+4+:+:+:+:+4+0+(+_+4+4+3+:+(+(+3+4+:+:+3+(+4+(+:+(+4+4+:+:+(+3+p+=+[.k.#+U.U.R.U.U.U.U.R.U.W.U.W.U.U.U.U.#+Z.U.W.#+U.W.U.W.W.Z.U.U.U.U.U.U.U.#+U.U.Z.W.U.U.U.U.U.U.U.#+W.).m *.'.&.*.=.=.=.*.=.*.=.=.=.*.=.=.=.*.=.*.=.=.=.=.>.>.%.%.%.%.*.*.*.=.*.=.*.=.=.=.=.=.=.=.*.=.&.%.>.q ", -"q >.'.=.%.*.=.&.&.%.*.=.=.=.&.=.&.&.&.=.&.&.&.&.&.&.=.&.&.&.&.&.&.&.&.&.&.&.&.&.&.=.=.=.=.=.=.=.=.=.O 2 I I A z x B B B B B B B B B B B x y B A B B B x A A A A A A y B B B y x y x B B B B B B B B z x B o t 2.9.e.9.9.9.9.j.9.9.f.9.j.9.9.9.j.9.9.9.9.9.d.9.9.9.9.9.f.d.f.f.e.e.9.0.0.9.d.9.9.f.f.9.d.0.i.d.b.5.S >+D+z+z+w+z+z+z+z+z+z+z+z+E+w+C+z+z+y+z+z+z+z+C+w+C+z+z+z+C+A+A+C+A+z+y+z+z+z+z+y+y+z+A+y+y+z+E+E+B+t.N.7+9+b+}+7+9+9+9+}+|+}+9+9+}+9+7+9+9+|+|+9+9+9+b+b+b+b+b+b+|+b+b+9+9+b+|+9+b+b+9+9+|+9+9+|+9+9+}+f+m.y.l+r+s+d+h+s+s+q+h+h+h+h+s+k+l+l+s+s+k+k+k+l+k+k+k+l+l+s+l+l+s+s+s+s+k+k+q+s+h+k+h+s+h+s+h+h+l+q+t+E.y P +.Z Z Y Y Y Y Y U Y Y Y Z Y Y X X +.Y Y Z @.@.` @.P ` +.+.+.X +.+.+.+.+.+.Y ` ` @.X +.` ` Z +.X n ;.=+a+(+:+:+3+:+(+:+:+:+3+3+:+:+:+3+3+<+:+<+<+4+4+_+(+(+6+3+:+<+6+3+:+:+:+:+4+4+4+(+(+3+4+(+(+3+4+p+=+_.w.#+Z.Z.W.U.U.Z.Z.U.U.W.W.Z.U.U.U.U.#+U.U.W.U.#+R.Z.W.Z.Z.U.U.U.U.W.U.U.U.U.U.U.U.U.U.Z.U.U.U.U.#+W.~.j >.=.&.=.=.=.=.=.=.=.=.=.=.=.=.=.*.=.=.&.=.=.*.*.=.=.'.=.=.'.'.=.&.=.&.=.=.=.=.=.=.=.=.=.=.=.'.,.>.q ", -"q >.=.*.*.*.&.&.=.=.=.'.=.=.&.=.=.&.&.=.*.=.&.&.&.=.=.=.=.=.=.=.=.&.&.=.=.=.=.&.&.=.=.=.=.=.=.=.=.&.q 2 A w x y x B B B B B B B B B B B x x B y r x y z y y y z y y x x A y x B x B B A A B B A A B z B E o C 2.d.d.e.9.9.j.j.9.9.9.9.j.9.9.9.j.9.9.9.9.9.e.9.9.9.9.9.d.d.f.d.8.b.e.f.9.b.b.b.9.0.0.9.9.f.f.d.b.5.S >+D+z+z+A+z+z+z+z+z+z+z+z+z+y+G+z+E+A+A+z+z+B+y+y+B+B+B+y+G+A+z+C+A+A+z+z+z+z+y+w+z+E+A+y+y+z+E+E+x+t.C.8+9+9+|+f+9+9+}+|+9+|+9+9+|+|+f+}+9+|+}+f+7+7+|+|+}+9+9+|+|+}+|+f+f+|+9+9+f+9+9+9+9+9+9+|+9+9+9+f+m.y.l+r+s+d+l+s+s+q+h+h+s+s+s+h+u+q+s+s+k+s+t+t+t+t+t+s+l+l+d+d+s+s+s+s+k+k+q+s+s+k+h+q+s+s+k+k+s+q+t+X.y @. .Y Y Y Y Y Y Y Y Y +.+.Y Y @.` @.@.@.+.+.+.X Y U Y Y +.+.X @.Z P ` P +.+.` @.@.@.+. .@.` Y +.X n ;.=+a+3+:+^+4+3+^+3+(+3+3+(+:+:+:+:+6+a+<+a+<+6+3+^+<+3+a+:+:+:+6+3+3+3+(+(+:+4+(+(+^+3+4+(+(+3+3+4+=+_.w.#+U.U.U.U.U.U.Z.U.U.U.W.Z.U.U.U.U.#+U.U.#+U.#+W.U.W.Z.U.U.U.U.#+#+U.U.U.U.U.U.U.Z.W.W.U.W.U.W.#+W.~.j *.'.=.=.=.=.=.=.=.&.=.&.=.&.=.=.=.=.=.=.=.*.*.*.=.&.&.&.&.&.'.&.&.&.&.&.&.=.=.=.=.=.=.=.'.'.'.%.*.O ", -"q *.=.*.=.*.=.=.=.=.=.=.=.=.=.=.=.=.=.*.#.>.=.=.=.=.*.=.=.*.*.*.=.=.*.>.*.*.=.=.=.=.=.=.=.=.*.=.=.=.q 3 B E A y z x y x B B B B x B B B B B B B y B r p x y B y y y B y A x B B y B B B B B B E B B A A K 3 | 2.i.i.0.f.0.0.0.0.f.j.i.0.0.9.0.j.i.0.0.0.0.0.9.0.0.9.0.j.0.0.d.d.j.9.f.f.j.j.9.0.i.0.0.0.0.f.0.i.5.S '+G+z+z+w+z+A+w+C+w+w+A+A+z+y+E+w+D+w+w+w+w+B+G+y+v+B+C+z+w+z+A+A+A+z+w+w+A+C+w+w+z+A+A+y+y+w+D+z+x+t.N.7+9+|+}+}+}+|+}+}+|+}+|+}+}+9+9+}+9+}+}+}+}+}+}+}+}+}+}+7+}+}+}+}+f+}+}+}+}+}+}+f+9+|+}+|+}+|+}+7+m.y.u+q+q+k+s+k+h+h+l+k+k+k+h+h+h+h+h+l+h+k+s+s+s+s+s+k+h+l+d+l+l+k+h+h+d+l+h+k+k+d+d+h+h+l+k+d+h+r+s+E.i P X U U +.+.X Y Y U +.+.+.U Y Y Y Z Z Y .+.T .Y Y .+.U U U +.X ` @.` X +.@.U Y X +. .` Z +. .Y n ;._+6+<+:+<+:+:+a+<+(+:+:+:+<+:+:+<+a+a+:+a+<+<+<+=+a+:+1+<+<+:+6+6+6+:+<+<+1+a+:+<+a+<+:+:+:+:+<+3+P._.w.#+U.W.R.W.U.R.W.W.U.R.W.U.U.U.U.W.R.Z.U.R.W.#+W.R.U.W.R.W.R.Z.U.U.W.R.W.W.W.U.U.U.U.W.W.U.R.W.U.M.w j *.&.=.>.>.>.=.>.*.>.=.>.=.=.*.=.=.*.=.*.=.*.*.*.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.*.=.=.=.=.=.=.=.=.*.k ", -"q =.#.=.%.=.=.=.=.=.*.=.=.*.*.=.=.%.*.>.>.>.=.%.%.*.*.=.=.=.*.*.=.=.*.*.=.=.&.=.*.=.=.*.*.*.*.=.=.=.k 3 B K w A z y r z y x B x y B B y B B B B B B y p x y x y y y y B y y x y x x B B B B B B B B A A B h C 2.i.i.j.0.0.f.0.0.0.j.i.0.0.f.0.9.i.0.0.0.0.i.9.0.0.f.0.0.0.0.f.f.0.f.0.i.0.0.0.0.i.0.f.0.0.9.e.i.Q S '+F+y+y+v+y+z+y+z+v+y+z+z+y+y+E+y+G+y+y+y+y+y+G+w+y+v+z+z+y+y+z+z+z+y+y+y+B+z+z+y+y+z+y+v+v+w+z+y+v+t.N.7+f+|+}+2+7+|+7+;+}+}+}+7+7+7+|+9+|+}+|+7+}+9+7+7+}+9+}+7+}+}+}+}+}+}+|+7+}+}+}+}+7+}+}+9+}+}+7+7+m.y.l+q+l+h+t+k+k+l+d+d+k+d+k+l+d+d+l+l+k+d+d+l+l+k+k+l+l+l+k+k+d+d+k+k+d+l+l+d+d+d+k+k+d+l+d+d+u+t+t+E.d M @.+.Z @.Y @.` ` ` Z Y @.` ` @.Z @.` @.Z @.Z Z Z @.Z @.@.@.@.Z Z @.@.@.@.Z @.@.` Z ` Z P ` X .Z e I _+p+:+:+<+:+:+<+:+:+:+:+:+<+:+:+^+(+<+=+<+(+<+1+=+:+:+<+(+:+:+:+(+:+=+<+<+:+<+:+:+<+:+:+:+:+<+<+6+=+_.w.`.U.U.R.R.U.W.W.Q.R.U.W.U.W.U.U.)+Q.U.`.=+U.W.L.M.`.++Z.R.R.R.U.U.U.R.W.W.W.U.W.W.U.W.W.`.V.W.W.W.;.j %.&.=.>.>.>.*.>.=.>.*.>.*.*.*.=.=.=.*.*.*.=.=.=.=.=.=.=.*.*.=.*.=.=.*.=.=.=.=.*.*.=.=.=.*.*.=.=.>.q ", -"q =.>.*.=.'.=.=.&.&.=.=.=.=.=.&.'.'.=.=.=.=.=.'.'.=.=.=.=.=.=.=.&.=.=.&.=.=.=.=.=.=.&.=.=.&.&.=.&.=.q h E E w E x x z y y x x z x x z y r r z z z z z x y y z x x y y A x x r x y x z z r z z z r z B B B 3 t 2.d.b.d.j.j.e.9.9.9.9.e.j.9.e.9.9.9.9.d.9.j.j.9.9.9.9.e.e.9.9.9.9.9.9.9.j.9.e.e.e.9.9.e.d.d.8.8.8.2.S -+F+B+y+z+y+B+y+y+y+y+y+y+y+y+y+y+y+y+B+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+x+v+y+z+G+x+t.N.7+f+|+}+2+f+9+}+}+|+|+}+f+}+}+}+9+9+|+|+}+9+9+}+}+}+9+9+|+|+9+9+}+}+|+|+}+}+9+|+}+}+f+|+9+9+9+f+f+n.E.l+q+d+d+s+t+s+l+l+d+k+h+s+k+h+h+s+s+k+k+s+s+l+k+k+k+l+l+k+k+h+k+s+k+k+k+s+k+l+h+s+k+l+t+h+k+q+o+t+E.d P @.+.@.@.` ` ` @.@.` ` ` ` @.` ` ` @.` ` @.` ` Z P ` ` @.` ` ` ` P ` ` ` ` ` ` ` ` ` ` M ` . .Y d ).=+3+_+^+^+^+_+_+_+^+^+_+_+:+_+^+_+4+0+^+_+_+{+_+^+_+^+^+_+(+^+_+_+:+^+_+4+{+_+_+_+0+0+(+{+{+^+:+3+=+_.w.`.U.U.W.U.W.W.Z.R.W.`.U.U.U.U.U.)+R.U.U.++Y.U.L.U.#+++Y.R.U.U.W.U.U.U.U.U.W.W.V.V.W.U.U.V.++U.W.W.~.j %.'.!.=.=.&.=.&.&.=.=.=.=.=.&.=.=.=.=.&.&.=.=.=.=.'.=.=.=.=.=.=.=.=.=.=.=.=.&.=.*.&.&.=.=.&.=.=.*.q ", -"q %.&.=.'.'.'.=.=.'.'.'.&.'.%.=.'.&.&.&.&.&.&.&.&.'.=.=.&.'.%.%.=.=.&.=.=.%.'.=.'.=.&.=.'.'.'.=.&.'.q 0 ).I I E I I x x A w B A w A A x x A A A A A A A A A A A A A A A w w x w x A A A x A A A A A E E E 2 s 0.8.8.d.e.b.d.e.d.d.e.b.d.d.d.9.e.e.d.d.d.d.9.d.d.b.e.e.b.9.9.b.9.d.d.b.e.b.d.b.d.d.e.e.d.8.8.8.8.2.^.i+E+z+C+A+C+G+A+G+G+C+z+C+A+w+z+z+z+G+E+z+z+A+C+z+C+z+C+A+C+z+z+A+G+A+A+A+A+z+z+z+z+G+C+A+w+G+C+C+B+H.N.9+b+|+}+|+|+b+b+b+9+|+|+9+b+b+9+|+b+9+|+|+b+b+|+b+b+9+|+b+|+b+b+|+b+9+9+|+|+|+9+9+b+b+b+9+9+b+b+b+C.y.q+s+l+d+h+r+r+r+t+k+s+s+t+s+k+s+r+t+s+k+s+r+s+t+s+s+s+s+s+s+s+s+t+s+s+s+s+t+r+s+r+t+r+r+s+t+q+o+t+E.d ` Z @.X +.Y X +.+.+.X X X X +.+.X X +.X Y +.+.X +.Y X +.+.+.+.X X Z +.+.X X +.+.G X X X Y .T T .e ).=+a+!+_+:+3+^+^+_+^+^+^+^+(+(+^+3+6+:+_+^+^+_+^+^+3+^+^+^+_+^+^+3+p+3+^+3+_+^+^+_+(+3+:+(+^+^+3+p+=+[.w.#+W.W.U.U.U.Z.U.U.W.W.U.W.U.U.U.W.U.U.U.W.Z.U.`.`.`..+W.U.`.U.W.W.U.U.W.W.U.U.++++W.U.U.U.U.Z.U.U.(.j =.'.!.&.=.&.&.&.&.&.&.&.&.'.'.'.%.=.&.'.&.'.&.=.=.=.'.'.=.=.'.'.'.=.'.%.'.'.&.=.=.&.&.'.=.&.=.=.'.t ", -"O '.*.*.%.#.%.%.*.*.%.=.'.%.>.*.*.'.'.'.'.'.'.'.'.%.*.*.=.'.%.,.>.=.=.*.*.%.=.*.%.*.*.*.%.%.%.*.*.*.q 0 ~.w w w R I w w E w I -.w I w w w w w E w w w I w I E E w R I E I E w E E w w w w w I w w w B K B h s 2.d.8.d.9.d.d.e.d.j.d.d.e.d.9.9.e.d.d.9.d.d.9.d.9.d.9.9.d.e.9.8.9.d.d.d.d.d.d.d.9.d.9.9.9.d.d.b.e.Q ^.i+F+E+G+E+D+E+D+G+D+G+E+G+F+G+E+G+G+C+E+G+G+D+G+E+G+G+G+D+E+D+G+G+G+E+A+A+D+G+G+E+A+G+G+C+z+G+C+G+G+-+N.7+b+f+b+9+9+b+9+5+9+9+b+9+b+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+b+9+9+9+9+9+9+9+9+9+9+9+7+n.y.q+r+u+l+u+u+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+u+q+r+q+q+q+q+q+q+q+q+r+q+q+q+q+q+q+s+r+q+q+q+s+q+r+t+t+E.e @.X @.+.+.+.+.+.+.+.+.+.+.+.+. .+.+.+.+.+.+.+.+.+.+.+. .+.+.+.+.+.+.+.+.+.+.+.+. . .+.+.+.+.T T +.e 1.(+6+6+6+6+a+a+3+3+a+3+a+6+a+6+p+3+a+6+a+6+6+4+a+6+a+6+3+6+6+6+a+a+p+a+6+6+6+a+a+3+6+6+6+6+<+a+6+p+ +].w.#+#+#+`.#+#+#+#+#+#+`.#+#+`.#+#+#+#+`.#+#+#+#+`.`.`.#+#+`.`.#+#+#+#+U.#+#+#+`.`.#+#+#+#+#+`.#+#+Z.[.t =.=.&.&.=.=.=.'.=.&.'.&.'.,.%.%.>.*.=.%.*.%.=.*.*.%.%.*.*.%.%.%.=.=.%.%.%.%.*.*.%.'.%.*.=.*.>.*.O t ", -"j #.O #.O j q q O q q O O q q q q O q O O q q q q q O q O O q q q q O O q q q q q q O q q #.q O O O v 2 3 3 h o B B l l o w f I o l o l l h l l l l o b h l o o f R l o f o f o I l o l o l l o o l z A A h j ..2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.0.2.2.0.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.5.5...S '+v+m+m+m+m+m+m+m+i+m+m+m+m+m+m+i+m+g+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+'+H.n.&+%+%+K.$+$+%+$+K.$+$+%+%+$+$+$+$+$+$+%+$+$+$+%+$+$+$+$+$+$+$+$+$+$+$+$+$+N.$+$+$+$+$+$+$+$+$+$+$+7.c.]+[+~+~+]+]+]+~+~+~+]+~+]+~+~+]+]+]+~+~+~+]+~+~+~+~+[+]+]+~+~+~+~+~+~+~+]+]+]+~+~+~+]+~+~+~+[+[+e+B.d P ` P P c c c M M c c c c c c c c c c c M c M M c c c c c M M c c c c c P M c c M P c c M P M M M r ).O._+=+=+=+=+=+=+=+=+=+++=+=+V.1+{+{+{+=+O.=+{+=+=+{+{+=+{+=+{+=+=+=+=+=+{+=+=+=+=+=+=+=+=+=+O.{+=+ +].k.R.M.M.M.M.M.M.M.M.M.M.M.G.M.M.M.M.G.G.M.G.G.M.G.w.M.G.M.M.M.M.M.M.M.M.M.M.M.M.M.M.G.M.M.M.M.M.M.w.F : O O #.q #.q O q O q q q q q O q q O q q O q O O q q O O q q q O q q q q q O O q q >.q O O q O q ~.q ", -"0 v v v F m m m v v m m m m v v v v v v v m m m m m m m v J m m m v m m v v m m m v m m k m m F v v v < 2 j 0 0 ( 2 0 0 0 h h 0 0 0 h h 0 h h < 2 h h 0 0 h 0 0 v 0 h 0 v h f h v h h h h 2 2 h h 2 k 0 3 3 2 t t C C s 1 C C C 1 C t s C C t t C t C C t t t s t s C t C s C t t t C C C C t t t t t C C C C m m : S r.^.^.^.^.^.^.^.^.^.^.a.^.^.^.a.^.^.^.^.^.a.a.^.^.^.^.^.^.^.^.^.^.^.^.^.a.^.^.^.a.a.a.^.^.^.^.^./.W L o.n.h.h.h.o.o.h.h.h.h.h.n.h.h.h.h.7.h.o.h.h.h.n.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.7.h.h.h.h.h.C.L 7 A.z.p.4.4.3.3.p.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.p.3.3.3.3.3.3.3.3.3.p.3.3.3.3.3.3.3.3.3.A.A.m.f 3 p K p K B K K E -.K K K K K E K K K K K K K K E K K K K K K E K K E K K K -.K K K K K K -.K c.R -.o 2 v ~.;.;.).I ;.1.;.;.).I I ;.I ).I ;.;.I I 1.;.;.).I ;.).I ;.;.I ;.1.;.I ;.;.;.1.).;.1.1.1.1.;.;.;.;.f J q.[.[.}.[.[.[.}.}.[.[.[.(.[.[.[.[.(.}.}.(.(.[.(.}.}.(.}.}.}.}.}.[.[.[.}.}.[.[.[.}.(.(.[.}.}.}.(.}.F 7 v F m l v v m m m v m m m m m m m v v v m m m m m m v v m v v m m v v m m v F m m m m v F m m v m < ", -"~.w.w.F.k.q.G.G.w.w.G.G.G.G.w.w.w.w.G.w.w.G.G.w.w.G.G.G.G.G.G.G.G.G.G.q.q.w.G.G.G.w.G.q.q.q.G.G.q.G.~.v k >.%.q q q q q q q q q q q q q q q q q q q q q q q q *.q q q q q q O q q q q q O q O q q q ,.q ;.h < 0 h f l 3 3 o o o 3 h o o o o o 3 h o 3 h 3 o o 2 3 2 o o o o o o o o o o 3 3 3 o o o o l l f f o ( j s N Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q ..Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q N N Q Q Q N S I.g+-+'+>+-+-+-+i+-+'+>+-+'+-+-+>+>+>+>+-+-+'+-+-+'+-+i+-+>+>+>+>+>+>+>+-+'+i+-+>+-+>+-+>+-+>+-+'+-+x.L N.K.K.C.N.K.N.K.N.N.N.N.K.K.N.K.K.K.K.N.N.N.K.K.N.N.N.N.N.N.N.K.K.N.N.N.K.N.K.N.N.N.K.N.N.N.%+N.K.L 4.X.~+X.X.X.[+X.X.X.X.X.X.X.X.X.[+X.X.[+X.X.[+X.X.[+X.X.X.[+X.X.X.[+*+X.X.X.[+X.X.X.X.[+X.X.*+X.*+*+B.p e n n c n n n n n n n n n n n n n n n n n n n n n n n n e n n n n n n n n n n n n n n n n n n c n c p s.P.P.P.P.O.P.P.P.O.O.O.O.P.O.P.O.O.P.P.O.O.O.O.O.P.O.P.O.O.O.O.O.O.O.O.O.P.P.O.O.O.O.O.O.O.O.O.O.Q.].(.G.M.G.w.w.w.G.G.G.G.G.G.G.G.q.G.G.w.w.w.G.G.G.G.G.G.G.G.G.w.w.G.q.w.w.G.G.G.G.G.G.q.G.G.G.G.G.w.M.J ", -"w.#+#+#+#+Z.#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+w.m >.=.'.=.=.=.=.&.&.&.&.&.=.=.=.=.=.*.=.*.=.=.$.'.&.=.&.&.'.'.$.'.$.&.&.&.&.=.&.=.=.&.*.'.%.=.!.{.O ;.h l A I -.B B B B B B B B B B B B B B B B B B y B y p B y B y B y B B y B B B B B B B B B x A B -.K i q |.d.g.b.e.e.e.e.e.b.e.e.e.e.e.d.e.e.b.b.b.b.b.b.b.g.g.g.e.b.g.g.g.b.b.b.b.e.e.e.e.e.e.e.j.j.e.g.e.j.N -+G+G+C+C+C+B+G+D+C+G+D+D+G+C+C+G+G+G+C+D+G+B+G+D+C+G+E+E+G+G+G+D+G+G+D+G+G+D+G+C+D+D+D+D+C+D+D+G+F+D.C.8+9+b+9+f+9+9+7+9+9+b+9+9+9+9+f+9+f+f+9+9+9+9+b+b+9+9+b+9+9+9+9+f+9+9+9+f+f+9+f+b+9+f+9+b+9+f+b+f+K.A.d+r+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+r+r+q+q+r+r+t+o+t+t+t+t+t+t+t+t+r+t+t+t+t+t+t+q+r+t+t+s+S.p ` X +.+.X X Y X +.+.+.+.+.Y Y X X X +.+.Y X X +.Y Z .+.+.X X .+.X X Y X +.+.X Y X +.X Y Y +.+.Y G i <+p+p+3+6+3+3+p+p+3+3+p+p+3+3+3+4+p+p+p+4+p+p+3+4+3+p+p+4+3+3+4+p+3+3+3+p+3+p+p+4+p+p+p+p+3+4+3+p+_+:.k.#+#+#+`.`.#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+w.", -"k.Z.Z.U.U.U.U.U.U.U.W.W.W.W.U.U.U.U.U.U.U.#+#+W.W.R.Z.W.Z.Z.W.W.W.U.W.U.U.U.Z.U.U.Z.U.U.U.U.U.U.U.#+k.m #.=.'.=.=.=.=.=.=.=.*.=.=.*.=.=.=.=.=.=.=.=.'.'.=.=.=.=.=.*.&.&.&.&.&.=.=.*.=.=.*.=.=.&.=.=.=.=.*.q 0 w B x B B B A A B B A B B B x x y B x x x y p y p x B p x p y p y B p y A A A B A B B B A A B y y o 7 Q d.e.9.9.9.9.9.f.9.9.9.9.9.9.f.9.9.d.d.d.d.d.e.d.b.j.j.f.j.e.d.d.d.9.f.9.9.f.9.f.f.9.e.f.0.9.e.j.5.u T.G+E+E+y+y+y+C+C+A+A+z+z+z+z+y+z+z+B+z+z+z+y+G+y+C+C+B+B+z+z+B+B+z+z+z+z+z+z+v+A+z+F+z+z+w+z+z+z+A+D.7.7+b+b+9+f+9+9+9+9+|+9+9+f+9+|+b+9+|+9+9+}+7+9+|+|+9+9+9+9+9+}+}+9+}+}+9+9+}+9+|+9+9+9+9+}+9+7+b+9+C.4.d+q+q+k+k+h+s+h+h+l+h+q+q+k+k+k+h+h+k+h+q+q+h+h+h+h+h+q+k+k+k+t+t+s+k+k+h+s+h+h+h+h+s+h+k+k+l+q+t+X.K ` .Y Y Y Y X Y Y Y Y Y Y Y Y Y Y Y +.X Y Z U Z ` ` +.T +. .+.+.X Y Z Y Y Y Y Y Y Y +.+.Z Y Y Y @.P I +0+_+(+{+:+(+4+3+:+(+:+3+3+(+:+:+3+:+(+^+3+3+:+_+(+^+3+_+:+^+_+^+:+(+(+3+3+3+:+:+3+:+3+:+(+3+3+3+{+[.}.#+W.W.Z.U.Z.Z.U.U.U.Z.U.U.W.U.U.W.W.U.U.U.Z.W.W.U.U.U.U.U.U.W.#+U.U.U.U.Z.W.W.R.U.W.W.W.Z.Z.U.U.#+}.", -"k.#+U.U.W.U.U.U.U.V.U.W.U.W.W.Z.U.U.U.U.U.Z.U.U.U.U.U.U.U.W.R.U.W.U.W.U.W.U.U.U.W.Z.U.U.U.W.U.U.U.#+k.m #.=.'.=.=.&.=.=.=.*.=.=.=.*.=.&.=.&.=.=.=.=.'.'.'.=.=.'.=.*.=.&.&.&.=.=.=.*.=.&.*.=.=.*.*.=.=.=.*.O 0 w B y y A A B B B B B B B B x B B B B x y B A A A x A A y A A A x B x B B x B B B A A B A A x x y l 7 Q d.0.f.9.9.9.9.9.9.9.9.9.9.9.f.9.9.d.f.0.0.j.j.9.9.0.i.0.f.0.0.0.f.9.f.9.9.f.9.9.9.e.d.f.0.9.e.j.i.u -+G+A+z+v+y+z+C+B+z+y+E+z+y+y+y+z+C+C+A+A+A+C+C+w+z+C+C+C+A+A+A+z+y+y+z+y+y+y+y+v+z+z+z+z+w+y+z+z+B+H.m.2+5+|+|+|+|+|+}+|+|+|+9+9+|+}+}+}+f+}+|+}+7+f+f+f+}+7+7+9+9+}+|+|+}+}+9+}+}+}+|+|+|+|+|+|+|+7+|+9+C.4.d+q+s+k+k+k+s+h+k+k+h+l+l+k+k+k+k+s+k+k+s+t+k+k+k+k+k+h+s+k+k+t+t+k+k+d+h+s+s+k+k+k+s+s+k+k+l+s+t+*+E ` +.Y Y Y Z Y Y Y Y Y Y Y Y Y Y Y Y Y +.+.@.Z U Z Y +.Y ` Y ` ` P ` Z Y Y Y Z Z Y Y +.X Z Z Y Y Z P y P.p+^+(+:+:+(+(+:+:+:+:+3+3+:+:+3+3+:+:+{+:+3+:+^+:+3+:+^+<+<+3+:+:+:+:+:+:+(+:+:+:+:+:+:+(+(+:+3+{+[.}.#+W.U.U.R.U.U.U.U.U.U.#+U.U.R.U.Z.Z.W.W.U.U.U.U.Z.#+U.U.U.U.W.W.U.U.U.U.W.W.W.Z.U.U.U.Z.W.Z.U.Z.#+}.", -"}.W.U.U.R.U.U.U.W.v.U.`.U.U.R.R.U.U.Z.U.U.R.U.U.U.U.U.U.U.U.U.U.U.U.U.M.U.U.U.U.R.U.U.U.U.R.U.U.U.#+k.v #.%.'.%.*.*.=.=.*.*.=.=.=.*.=.=.=.*.*.*.=.=.'.%.=.*.*.%.*.%.*.=.=.*.*.*.*.*.*.=.*.&.=.*.*.&.=.=.*.q 0 h B y r A A x B B B B B B B B B B A x B A w w w I w I I A w I I I w A w A x B B B A A B B A A x y o 7 Q d.9.9.9.9.9.9.9.9.9.9.f.9.9.9.9.9.f.0.0.0.f.9.9.9.f.d.0.f.f.d.f.0.0.0.9.9.f.f.9.f.d.d.f.0.d.e.9.2.u T.F+A+A+v+y+w+D+v+y+v+y+y+w+w+z+v+y+v+v+v+v+y+y+y+v+v+y+y+v+v+w+z+z+w+w+z+y+y+y+x+w+z+z+w+v+w+z+A+A+H.m.2+b+|+}+}+}+|+}+|+|+}+|+|+}+}+}+}+}+}+|+9+9+}+7+7+}+7+7+}+}+}+|+|+|+|+|+}+}+}+|+|+}+|+|+|+}+}+|+9+C.4.d+q+o+e+k+k+h+h+k+k+d+k+k+k+k+k+k+k+k+k+k+k+k+k+l+d+e+k+k+k+k+d+d+d+d+d+h+h+k+k+k+k+h+k+k+k+d+s+r+X.E P +.Y U U Z Z Y Y Z U U Z Z Y Z Z Z ` Z @.` @.U Z Z Y ` ` ` M P M P Z Y Y Y Z U U Z +.X Z Z Y Y @.P y P.3+:+(+:+:+(+:+:+:+:+:+:+(+:+:+(+:+:+:+:+:+:+:+=+:+<+<+<+:+:+<+:+:+:+:+:+(+(+:+:+:+:+:+:+:+:+:+(+{+[.}.#+`.`.W.R.U.U.U.U.U.U.U.U.U.R.Z.R.W.R.R.U.U.U.U.U.U.U.U.U.U.U.U.U.Z.Z.W.W.R.Z.R.`.W.U.U.R.U.U.U.#+}.", -"}.#+U.U.U.Q.Z.U.U.W.U.#+U.U.U.U.U.U.U.U.U.U.U.U.U.M.W.W.U.W.W.W.W.U.Z.R.U.W.U.Z.U.U.U.U.U.U.U.U.U.#+k.F #.'.=.%.*.=.=.&.=.*.*.=.=.=.*.*.=.=.*.=.=.=.'.'.*.=.*.*.*.*.%.=.*.*.=.=.=.=.=.&.*.*.&.=.=.=.=.=.*.O 0 l A x A B B x B A A x B B A A B A x B A w A w w w w A A A A w A A A w w A B A A B B B B B w w x x A m Q d.9.9.9.9.9.9.9.9.9.9.9.9.9.d.9.9.d.0.9.9.9.9.j.e.9.9.9.9.d.d.d.f.f.9.f.f.9.9.9.f.9.e.0.0.d.e.9.5.u -+F+z+A+v+y+z+A+y+v+z+z+z+w+A+A+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+B+z+D+A+w+E+z+z+z+w+z+z+z+A+v+z+z+z+B+H.n.7+9+|+|+|+}+9+9+|+}+|+9+9+9+}+}+}+|+|+|+9+9+}+}+}+}+}+}+|+|+9+9+9+|+}+}+9+}+9+|+}+|+9+9+}+|+7+9+9+C.A.d+u+h+k+d+l+h+h+h+k+s+s+k+k+k+k+s+k+h+k+k+l+l+l+d+s+s+k+k+k+k+s+s+d+d+l+h+s+s+k+k+h+s+s+s+d+l+q+t+*+E P +.Y Y Z Y Y Y Z Y Y Y Y Z Y Y Y U P ` ` ` ` Y ` ` +.X Y U Y @.@.@.U Y Y Y U Z U Z Y Z Z Z Y Y @.P y P.3+:+:+(+(+4+(+:+:+(+:+:+:+:+:+(+(+:+:+:+:+(+:+<+:+a+<+<+<+:+<+:+:+:+:+:+:+^+^+:+:+:+^+^+:+:+:+4+{+[.}.#+`..+W.Z.U.U.U.U.U.U.U.U.R.W.U.#+U.U.U.U.U.U.Z.W.U.U.U.U.U.U.U.U.W.R.R.R.U.U.U.W.U.U.U.U.U.U.W.#+}.", -"}.#+W.W.U.U.#+U.U.U.Z.Z.U.W.W.U.U.U.Z.U.U.U.W.#+#+W.U.Z.#+W.R..+W.U.U.U.U.W.W.Z.U.U.U.U.U.U.U.U.U.#+k.j #.=.=.=.=.=.=.*.*.=.=.=.=.&.=.=.=.=.=.=.=.=.=.=.=.*.*.*.>.*.*.*.>.,.'.&.&.&.&.=.*.=.=.=.=.=.&.=.*.q h l A B B B B B B B B B B B A w A A B B x B B B B B B B B B B B B B B B B B B B B A A B B B A A z x w m Q d.9.9.9.9.j.j.9.9.9.j.j.9.f.9.9.j.f.d.d.e.e.e.j.i.j.e.e.9.0.d.d.8.d.9.9.j.j.9.9.f.d.d.0.0.9.j.j.2.N -+F+E+E+y+y+z+C+z+w+A+E+E+A+v+C+z+z+E+E+z+z+z+E+F+z+z+E+z+w+z+z+E+A+C+A+E+E+A+A+A+z+z+z+z+z+y+z+z+A+H.C.7+9+9+|+9+9+9+9+9+|+9+9+f+9+|+}+f+}+}+|+f+9+b+9+b+b+b+b+5+|+9+9+f+9+9+}+f+7+}+}+}+9+9+9+9+9+2+b+b+n.A.d+q+s+h+h+s+s+s+l+l+h+s+s+k+k+k+s+k+k+k+h+s+s+s+h+h+s+q+h+k+h+h+s+s+k+k+s+h+s+h+h+s+s+s+s+l+l+q+t+*+E ` .Y Y Z Y Y Y Y Y Y Y Y Z Y Y Y X . .+. .Y . .+.+.Y Y X +. . .T Y Y Y Y Y Y Y Y X X Y Z X +.Z P r P.p+:+(+(+3+3+4+:+:+:+3+3+:+:+:+3+3+:+(+:+:+3+3+1+<+4+{+(+1+:+(+3+:+(+:+(+3+3+:+:+3+3+:+3+:+3+:+4+{+[.}.#+W.W.W.R.U.#+U.U.U.U.W.Z.Z.W.W.Z.U.U.U.#+#+Z.R.W.#+#+W.U.U.U.U.U.W.Q.R.#+W.U.U.U.U.U.#+U.U.U.U.#+}.", -"q.#+U.U.U.U.U.U.U.U.U.U.U.U.U.U.Z.U.U.U.U.W.#+#+Z.U.Z.Z.U.`.Y.R.#+#+#+U.U.W.W.W.U.U.U.U.U.U.U.U.U.#+k.m #.=.&.&.=.=.=.=.=.=.=.=.=.=.*.=.=.=.=.=.=.=.=.=.*.%.>.>.*.>.#.>.#.>.>.*.*.=.=.=.=.=.=.=.=.=.&.=.*.O 2 h w z x B B B B B B B B A w w A A A B B B B A A B A A B B B A A B B B A B B B B B B B B B B B x x o m Q d.9.9.9.9.9.j.f.9.f.j.j.9.9.9.j.9.b.e.e.i.i.2.i.5.i.5.i.0.0.9.d.e.9.f.9.j.j.9.9.9.9.e.0.0.j.j.e.5.u T.F+D+F+y+y+z+C+A+A+z+z+z+G+y+y+A+E+D+D+A+E+E+A+A+A+A+z+A+A+A+E+F+B+G+w+A+z+C+A+A+z+z+z+z+A+z+z+z+B+H.7.2+9+9+|+9+9+9+9+9+}+|+9+9+|+|+}+f+f+f+7+2+f+b+|+}+|+9+9+9+9+9+9+7+9+}+9+f+9+9+|+|+9+9+9+|+9+7+|+9+C.4.d+q+s+k+h+h+h+h+h+h+h+k+k+k+k+k+s+s+k+s+r+t+s+s+k+k+k+t+s+l+l+h+t+s+k+s+s+q+s+h+k+s+s+s+k+d+l+q+r+*+K U .Y Y Y Y Z Y Y Y Y Y X Y Z Y Z X T T . .+.X Y Z P Z Z X +.T T T +.Y Y Y Y Y Y Y +.+.Z Y Y Y @.P y P.p+(+(+:+:+:+:+:+(+:+:+^+:+:+:+3+3+3+(+:+3+4+(+_+0+(+,+{+:+{+{+3+:+(+(+:+:+:+^+:+3+:+:+(+(+:+:+3+{+[.}.#+`.W.Q.W.U.U.U.U.U.U.W.U.Q.W.Q.W.U.U.U.W.W.U.U.U.U.W.#+U.Z.Z.U.U.U.U.#+#+W.U.U.U.U.W.W.U.U.U.U.#+}.", -":.Z.U.U.U.U.#+W.U.Z.U.U.U.U.U.Z.Z.#+#+W.W.M.M.q.[.}.k.}.(.u.++M.W.Z.#+U.U.W.U.#+Y.U.U.U.U.U.U.U.U.#+k.m #.=.&.=.&.=.=.&.=.=.=.*.=.=.*.=.=.*.=.=.=.=.=.*.*.*.=.*.O j k k m j j j #.>.&.&.*.=.=.=.=.=.=.=.*.O 2 w B y x A B B B B A B A w A A A w l B w l l w w w l w l l o w l w l l l A B x B A B B B A E B B B w m Q 8.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.i.0.5.2.|.N s s s u ..5.2.5.2.i.0.0.0.9.f.f.9.9.e.e.0.0.0.d.j.5.u T.G+z+E+y+y+y+A+A+A+z+y+B+m+j+j+x+m+m+m+j+m+m+m+m+m+m+j+m+m+m+m+j+j+j+g+g+m+x+B+y+z+z+C+z+w+w+z+z+G+H.7.2+9+|+|+9+|+|+9+}+}+|+9+f+9+}+}+}+f+2+%+%+$+C.m.n.n.J.@+J.%+|+}+f+9+}+}+7+b+9+|+|+|+9+|+|+|+7+|+9+K.4.d+u+h+h+h+s+s+h+h+k+k+s+s+k+k+k+r+t+t+e+X.X.E.E.E.E.E.~+~+d+d+l+l+s+k+s+s+s+s+h+k+h+s+h+k+k+k+q+q+*+-.` +.Y Y Y Y Y Y Y U Y Y Y Y Z Y U Y Y P M n n i i d d n n M P Y +.+.Y Y Y Z Y U Y Y +.X Y Y Y Y @.P y P.3+4+(+(+:+:+:+:+:+:+3+_+:+:+:+3+3+3+:+(+3+p+4+v.z./.P.w.P.u.V.3+3+(+:+3+:+:+:+(+3+:+3+3+(+:+:+3+{+[.}.#+`.`.Y.Z.U.#+U.U.W.U.#+U.Q.W.`.U.Z.M.M.M.k.:.}.}.:.}.w.M.R.R.#+#+++@+Q.#+W.W.U.W.U.U.Z.Z.Z.U.U.#+}.", -"}.Z.U.U.U.U.U.U.U.Q.R.U.U.U.R.R.U.Z.`.w.).8 @ . . . . . . . @ @ f k.w.U.U.W.`.W.v.U.U.U.U.U.U.U.U.#+k.m >.=.=.*.*.=.=.*.=.=.=.=.=.=.=.&.*.=.=.%.=.=.*.=.=.*.>.j | , # # @ $ , , O #.*.*.*.*.=.=.=.=.&.'.>.q 0 o B x A A B x x A A B A A A w 3 2 ; ; ; @ ; % ; ; @ ; ; ; % ; @ * @ * * 3 w A x A A B B A A B x x o | Q d.f.f.9.9.f.9.9.9.9.9.9.9.f.9.9.9.5.N u 1 : , @ + $ , = = , 1 s ..i.9.f.f.9.9.9.f.d.d.0.0.d.d.e.5.u T.G+A+w+w+y+z+A+z+v+w+x+x+a.9 _ _ W 9 _ _ W 9 g 9 g W g g g ] g g g H 7 _ 9 x.x+v+w+z+z+z+w+w+w+z+G+H.h.2+5+|+}+|+|+|+|+}+}+}+|+|+}+}+7+7+;+C.L 5 - @ @ + . - @ # / n.C.}+}+}+}+9+b+}+|+|+|+|+|+|+}+7+|+f+C.4.d+q+k+k+k+k+h+h+d+k+k+k+k+k+e+k+l+~+E.R . + + + . . . @ ( R E.[+l+k+k+s+h+k+k+k+k+k+h+k+k+k+k+s+t+*+E P +.Y Z Z Y Y Y Y Z Z U Y Y Z @.` P r ( ' * @ + - ) * * ' e e n ` @.Y Y Y Z Y Z Z Y X Z @.U Y Y @.P x P.3+<+:+:+:+:+(+(+:+:+:+:+(+:+:+:+^+:+=+:+4+:+v.$ $ + + + + + F =+(+(+:+:+:+(+(+:+:+(+:+(+:+:+:+(+{+[.[.#+U.`.=+W.U.U.U.U.Q.U.U.U.R.Q.@+F.}.f + . . . + + . . . @ 8 }.w.U.U.Q.U.U.U.U.U.U.U.U.Z.R.U.Z.U.#+}.", -"}.#+U.U.U.U.U.U.W.R.Z.U.W.W.U.U.U.M.[.] . . . + . . . . + . + . . . { :.U.U.W.U.(+`.U.U.W.U.U.U.U.#+k.m #.>.'.=.*.=.=.=.=.*.=.=.=.=.=.&.=.=.=.*.%.=.&.&.'.#.m . . . + . . . . @ #.&.=.=.=.=.=.=.=.=.&.'.*.q 0 h E y x A B B B B B B B A I l 2 . . . . . . . . @ % @ @ . . . . . . . . 2 A w w A x B B A A A x y A m N d.9.f.d.9.f.9.f.9.8.9.0.0.0.9.i.0.O = + . . @ @ % @ + + + - . . ! s f.0.9.d.d.d.0.9.8.0.0.0.b.e.2.u T.F+A+A+v+y+z+C+x+x+z+D+F+~ # + @ % % % % % % % @ . . . # % % % % . . . % * H x+D+A+z+z+z+w+z+z+z+B+D.m.2+b+9+9+9+}+|+f+}+|+f+f+9+9+7+$+z./ + $ + + + + $ + . . . . $ - 5 C.&+2+9+b+}+|+9+9+9+9+}+|+7+|+9+C.4.d+r+s+k+k+k+s+s+k+k+s+q+q+t+t+~+c.# . . ) - - + + + . . + + . b E.[+e+o+k+s+t+e+d+h+t+t+s+k+k+q+t+*+E P .Y Z Y Y Y Z Y @.` X . .` e 3 * ; % $ . + . . - . @ % . . * d Y +. .T .Y M ` +.T +.` ` +.+.@.P y P.3+3+3+:+3+:+3+(+(+(+(+4+(+:+_+<+_+<+:+(+{+=+, . . . . . . . w.{+4+(+:+:+:+:+:+:+:+:+3+:+:+(+:+3+{+[.[.#+W.`.W.U.U.U.U.U.U.#+U.W.U.w.}.+ . . . . . . . . . + . . . . @ ].@+Q.R.U.U.U.U.U.U.U.U.U.U.U.Z.#+}.", -"}.#+U.U.U.U.U.U.U.U.U.W.#+#+M.Z.Z.}.@ . . . + + . . . + + . . . + + + + }.W.#+U.W.W.W.U.U.U.U.U.U.#+k.m #.%.%.=.*.=.=.=.=.=.=.=.=.=.*.*.=.=.*.*.'.&.&.'.,.j , $ . + $ . . - . $ #.&.=.=.=.=.=.=.=.=.&.&.*.q 0 l A y x B B B B B B B A A A I 2 % $ . . . . . . . @ @ @ . . . . . . . . 2 x B B B B B B x A w x B o | Q d.9.9.9.9.9.j.9.9.8.f.0.f.9.j.N 1 , - . - . . . @ # . # + . + $ $ , N 0.0.d.8.b.e.e.d.0.0.9.e.j.2.u -+G+E+z+y+y+z+A+y+y+A+D+y+] $ @ . - . . + - . . . . . . . . . @ @ . . @ % % H x+D+z+y+z+z+w+z+z+z+E+H.m.2+9+9+9+|+9+}+9+|+|+b+f+f+2+2+C.5 . + @ @ @ $ + $ $ @ % % % $ . - ) h.8+9+5+f+|+|+9+9+9+|+|+7+b+f+C.4.d+u+h+k+k+k+s+s+k+k+k+h+h+k+~+4.) + @ @ + + . + + # . @ + + % @ @ 4.[+e+s+s+t+k+d+l+t+t+k+l+l+s+t+*+E U .Z Z Z Y Y Y Y ` ` Y +.Z P d * & ; $ $ . . # # # . . & # . % } n P Z T +.Y M ` . .+.` ` +. .@.n y P.p+:+:+:+:+4+(+4+(+_+3+(+4+:+:+3+4+_+(+_+0+F + + . . . . . . /.^+3+:+:+3+3+3+3+:+:+3+3+3+:+:+:+3+{+[.}.#+W..+U.U.U.#+W.U.U.Z.Z.#+w.f @ . . . . . . . . . + + . . + + @ @ 8 M.#+U.U.U.U.U.W.W.U.U.Z.U.U.#+}.", -"q.#+Z.Z.Z.U.Z.Z.W.W.W.W.W.Z.U.U.J . . . . . . . . + . . . . . + . . . . { q.#+U.U.U.U.W.U.U.U.U.U.#+k.k #.=.&.=.*.=.=.=.&.=.=.=.=.=.=.*.=.=.=.=.=.=.=.*.O | $ @ - + $ . . . - $ >.&.=.=.=.=.=.=.=.=.&.=.*.O 0 o B B B A B B B B B B B A A w 2 % . . . . . . . . . . . . . . . . . . . * 3 B A A B B B B B B z z A < N d.j.f.9.9.j.9.9.j.9.d.f.j.j.5.u $ + - - - . + + . . @ % @ . + $ , , : t 5.f.e.d.b.e.e.j.0.0.e.j.2.N -+y+z+D+y+y+z+C+C+y+z+D+x+) @ % # . . . . . . . # # # # + + . . . @ . @ % @ H x+A+z+z+E+z+z+z+z+z+B+H.m.2+9+b+9+|+9+9+7+}+|+9+7+9+2+h./ . + @ % @ @ @ @ . . @ % % % $ + . - - m.7+9+9+|+9+9+9+9+|+9+7+9+b+C.4.d+q+k+k+k+k+s+k+k+k+s+l+u+d+c.- + + . + $ + + # @ @ % * + $ $ @ @ b 4.[+s+t+s+k+l+l+s+s+k+d+l+q+t+*+E ` +.Y Y Y Y Y Y Y Z Z @.` P e ' % + $ . - . # % % % ) . . . . @ * ' n ` . .Y M ` +. .X ` ` Y +.@.P y P.p+:+:+(+(+:+4+(+_+:+4+4+:+:+{+3+:+4+{+0+u.+ + + . . . # . $ z.1+^+:+:+:+(+(+:+:+:+:+3+3+:+:+3+3+{+[.[.#+W.W.U.Z.W.W.#+U.Z.U.#+Q.f . + . . . . . . . . . . . . . . . . . + 8 R.U.#+U.U.U.U.U.W.U.U.U.Z.#+}.", -":.#+Z.U.U.U.#+U.W.U.R.W.W.U.#+}.@ + . . . . . # + + . + . . . . . . . + . { #+#+U.U.U.U.U.U.U.U.U.#+O j O %.=.=.*.=.=.=.*.=.=.=.=.=.=.*.=.=.'.=.*.*.#.#.| , = $ . . . . . - . $ #.&.=.=.=.=.=.=.=.=.&.'.>.q 0 l E B B B B B B B B B B x A l 2 % . . . . . . . . . . . . . . . . . . . 2 l A B A B B B B A B x z l 7 N b.j.9.9.9.9.j.9.9.f.9.e.i.5.N $ . . . - . + = = , , = + - . . . . # @ : v...f.d.e.e.e.0.0.9.b.j.2.u -+G+z+z+y+y+z+C+C+y+z+D+x+~ % % @ . . . . . . . % % % % @ . . . @ % @ @ $ + H x+w+z+z+z+z+z+z+z+z+E+H.n.2+9+|+|+}+|+9+9+9+}+|+9+b+C.5 - . @ % % @ # - - / / ) @ % % $ $ # % . / &+}+9+|+9+9+9+9+|+|+7+b+b+n.A.l+u+t+e+k+s+k+k+k+k+k+s+s+E.# @ $ $ . . @ # & { - { & % + + $ $ @ % $ A.k+s+s+k+d+u+k+s+h+k+s+r+q+*+-.U +.Y Y Z Y Y Y Y +.+.` M n ' % . . - . - - % * ; % @ . . . . . @ # } n ` +.@.` Z +.+.X ` ` +. .Y P y P.p+4+3+:+:+:+3+4+:+:+:+4+3+_+:+{+4+4+{+}.$ + + . . . . $ + + w.{+3+:+:+3+3+3+:+:+:+:+3+3+:+:+:+4+{+[.}.#+.+W.Z.U.Q.W.U.U.U.U.#+}.. . + + . . . . . # # + . . . . . . . . @ % }.#+Z.Z.U.U.U.W.W.U.W.W.U.#+}.", -"}.#+U.U.U.U.U.U.U.R.W.`.U.U.M.8 . . . . . . . @ }.M.Z.w.J . @ $ . . . . . + q.U.U.U.U.U.U.U.U.Z.U.#+k.m #.%.'.=.*.=.=.=.=.*.=.=.=.*.%.%.%.*.*.%.%.*.#.< @ = + . . - . . . . . + #.=.=.*.=.=.=.=.*.=.&.&.*.q 0 l A B B B B B B B B B x x I l ; @ @ . . . . . # . . @ # . . . @ # . . . 2 A w w A B B B A A B x y l 7 Q b.9.9.9.9.9.9.9.9.d.f.8.e.N , . ) $ . . + = 1 N |.|.s , + - - - . . . $ t 5.f.f.9.9.e.0.0.0.e.j.5.u T.y+D+A+v+y+w+A+z+y+w+y+x+~ % $ @ @ $ % # @ $ $ @ @ $ $ + @ $ @ # % @ . + . W y+w+w+w+z+A+v+w+w+z+G+H.n.2+9+9+9+9+9+}+f+|+|+}+}+9+5 @ . + @ @ % # - 5 J.8+%+n.5 . @ % % $ $ + / L 2+9+9+|+|+|+|+|+|+7+|+f+C.4.d+q+k+k+k+k+k+k+k+k+k+k+*+R % $ $ @ @ % % * R [+~+X.y.; + $ = $ $ @ @ b ~+s+h+k+d+l+l+k+k+k+k+t+t+*+E U .Y Y Y Y Y Y Y Y +.` n } * @ - + . - @ % ; i d } % % # . @ # - - * d P +.Y Z U U +.X ` ` +. .@.M y P.3+<+:+:+:+:+<+:+(+:+:+_+:+:+:+{+{+=+f # . . . . . . . . . . C !+(+:+:+:+:+:+:+:+:+:+:+:+:+:+(+:+:+[.}.#+W.W.Q.U.U.Q.U.U.U.U.U.{ # . . . . + - . + l ).[.4 # . + + . . . . . 8 M.U.W.R.U.U.U.Z.Q.U.U.U.#+}.", -"}.#+U.U.U.U.W.U.U.U.U.U.U.#+).@ . . . . . . @ }.U.M.#+#+M.J @ . . . + + . . }.U.U.U.U.U.U.Q.W.U.U.#+w.m #.'.'.=.*.=.=.=.=.=.=.=.=.=.=.=.*.=.*.%.=.*.m $ $ @ . . . + $ . . - . $ >.&.*.*.=.=.=.=.*.=.&.'.*.q 0 o B B B A A B B B B A A x I o ; % . . # @ . # * % % % % @ % % % @ & % @ 2 w B A A B B x A E B B B l 7 Q b.9.f.9.9.9.9.9.9.f.d.8.i.u , - . * % . $ 1 N i.f.j.|.u , + - + % @ $ = 1 2.0.f.f.d.d.0.0.9.e.j.5.N >+y+A+w+v+y+y+A+y+y+y+w+x+5 + . + + + $ ) > $ + + + . . + + # % @ @ % @ # g '+x+w+w+z+z+z+w+z+z+z+z+D.m.2+9+b+9+|+f+9+9+}+|+b+}+b+L + $ % @ @ % . L $+2+}+9+2+z./ - + @ % $ % $ 5 2+9+}+|+|+9+9+|+|+7+|+9+C.4.d+u+k+k+k+k+s+k+k+k+k+s+E.& % = + . @ % ; 6.n+l+k+l+l+X.@ @ . = $ + . + E.d+h+k+k+k+d+k+k+l+l+q+t+X.K ` .Z Z Y Y Y Y Y Y +.` i * @ . - + . - % } n M M M i ; % . @ # + - . } n X +.Y U +.+.X ` ` +.+.` P y P.p+:+:+(+(+:+:+:+(+:+_+3+3+(+=+=+_.. . . . . @ # . . . . . # }.{+3+(+(+:+:+:+:+:+:+:+(+:+:+:+:+4+{+[.[..+W.`.U.U.#+Q.U.W.&+U.q.+ . . . . . + - . }.U.`.`.M.}.@ . . . . + + . { w.U.U.U.U.U.U.U.U.U.U.U.#+}.", -"}.#+U.Z.U.U.U.U.W. +V.W.#+#+).@ . . . - . @ 8 w.#+U.U.#+#+w.. . . . . . . + k.U.U.U.U.U.U.U.U.U.W.#+k.m #.*.&.=.*.=.=.=.=.=.=.=.=.=.=.=.'.'.%.&.*.j @ & @ . . . . - . . . . - $ #.&.=.*.&.=.=.*.&.=.&.&.*.q 0 l A p r A B B B B B B A I I l % % . . # % & @ f 2 2 h 2 h h h 2 h h l 2 h A B w A B B y A A B x y A m N d.9.f.9.9.9.j.9.9.f.9.j.|., + . . & * # , s 0.0.d.d.d.2.: , , : 1 1 N N 0.d.d.f.0.d.d.0.0.9.j.9.0.u -+G+F+D+w+y+z+C+z+y+y+A+F+T. +'+T.T.T. +T. +T.T.T.T. + +W @ $ % # . . @ 9 -+y+y+w+z+z+z+z+w+z+z+z+B+H.n.2+b+9+}+}+9+9+9+|+|+}+9+5+L + + @ % . - . h.f+b+5+b+}+$+L - - @ $ @ $ . / 2+9+|+9+9+9+9+|+|+7+b+b+C.4.d+u+k+k+k+k+k+k+k+k+s+s+c.% $ $ - - @ % I [+n+o+o+t+o+l+4.- % . + + . . p d+l+k+h+k+s+r+s+k+k+q+t+*+E ` .Z Z Z Y Y Y Y Y +.P } * . . . . # % ; i M +.Y @.M i * # . @ # + - & e Y .X Z Y .+.` P Y +.@.P r !+p+<+(+(+(+:+(+(+_+:+4+4+(+u.D + + . . . - @ % # . . . . . . :.{+:+:+:+:+:+:+:+:+:+:+3+3+(+(+:+3+{+[.}.#+U.W.U.U.#+U.W.Q.Q.#+f - . . . . . . . ).R.U.U.U.#+Z.J . . . . . + . @ ).#+U.U.U.U.U.U.U.U.U.U.#+}.", -"}.#+U.U.U.U.#+U.#+U.#+U.U.#+U.U.q.}.J f { . J U.#+U.U.U.#+w.. . . . . . . . }.U.U.U.U.U.U.U.U.W.Z.#+k.m #.%.&.=.*.=.=.=.=.=.=.=.=.=.*.*.=.=.%.&.>.0 @ % . . . . . - . . . . . $ #.&.&.*.*.=.=.*.*.&.&.'.*.O h l A y x B B B B B B B x y B o % % . . # % % ; I I I I I I I I z w I I z w A B w A B B B A A B y B o | Q b.9.9.9.9.9.j.j.f.d.e.i.u = . & @ & % # = v.i.8.f.e.f.f.N 2.|.5.i.i.5.j.b.8.d.d.f.f.e.f.0.0.e.9.0.u -+F+A+F+y+y+z+A+C+z+A+D+E+F+F+F+F+F+D+D+E+F+E+E+F+F+y+T.[ . + $ @ . @ [ -+x+E+A+y+z+z+z+z+w+z+z+z+B+D.m.f+9+9+}+|+b+7+f+|+|+7+9+K.5 + . + . . . ] o.f+|+5+b+|+2+z.- - @ % * $ . / 2+9+9+9+}+9+9+9+|+7+b+b+C.4.d+q+s+k+k+s+s+s+k+k+q+[+4.+ $ . - . $ = c.l+l+s+t+t+o+t+X.- - . + . . . ; [+l+k+h+h+t+t+k+k+k+q+t+*+E U .Y Y Y Y Y Y Z X +.M } * . . # % & % ' M U .T T .n * # . @ % @ ) & d U +.Y U +.+.X ` ` +. .Y P y P.p+p+3+(+4+4+:+:+:+(+4+:+<., $ + . + . . @ @ # . . . . . + + C ^+3+:+:+3+3+:+:+:+:+:+3+3+^+_+:+4+{+[.}.#+W.W.U.U.Z.U.U.Q.#+#+{ . . . + + . . @ w.#+U.U.U.U.#+}.@ . . . . . . { ).#+U.U.U.W.U.Z.U.U.U.W.#+}.", -"k.Z.U.U.U.U.U.U.U.U.U.U.W.W.U.U.U.U.U.U.U.M.M.U.U.U.U.#+M.J . + + . + + . . M.U.U.U.Z.W.U.U.U.U.U.#+k.m %.%.&.=.=.=.=.=.=.=.=.=.=.*.#.>.&.'.%.j < + + + + $ = , < . . . . . . . ,.&.&.*.&.=.=.&.=.=.=.=.=.q 0 l A B B B B B B B B B x A l 2 . . . . @ * * 3 A I z I B A w I z y y y y x A A B B B B A E A A r B o | N 9.9.9.9.9.9.9.9.9.d.j.2.1 . . + . - . $ : 2.i.b.8.j.j.i.j.9.j.9.d.d.f.9.e.e.9.0.0.d.d.0.0.0.e.j.5.N -+x+E+F+w+y+z+C+z+w+w+z+z+z+z+y+F+z+y+y+y+z+A+y+F+x+j+W @ + + @ @ @ 9 >+y+E+D+z+y+z+z+z+z+w+w+z+z+B+H.7.2+9+9+|+9+|+|+9+|+|+|+|+b+5 + $ @ $ @ - ) m.7+|+b+b+9+%+L - . # % @ - ) 5 8+}+9+9+}+9+9+|+}+7+b+b+C.4.d+u+s+k+k+s+s+h+d+k+q+X.b $ $ + . . . { c.l+s+r+k+h+s+l+[+7.# $ $ $ @ . % c.d+t+k+s+s+s+s+l+l+q+t+*+E ` +.Y Y Y Y Y Y Y X Y e * % @ @ @ . @ * d ` Y Z U U T M } % . . . . . . ( M +.+.U +.X Z Z @.X +.` P y P.p+(+(+:+4+4+4+4+:+{+0+{+[.+ + @ $ . . + . + @ # . . . . . + }.{+:+(+(+:+:+3+3+(+:+:+3+(+(+:+3+3+{+[.}.#+`.W.Q.U.W.U.U.U.#+(+I f f f @ . # . % w.U.U.R.W.W.#+}.@ . . . . + . + J #+Z.U.U.U.U.Z.U.U.U.U.#+}.", -"}.U.U.U.Q.W.U.U.U.R.R.U.U.U.R.R.U.U.U.U.U.U.U.U.U.U.U.M.J @ . . . . . . - f Z.Q.`.U.U.U.U.U.Q.Z.U.#+k.m ,.'.%.%.*.=.=.=.*.%.*.=.*.*.*.*.=.'.#.| $ + + # @ $ , F < . . . . - + $ O &.*.*.*.*.*.*.*.*.=.=.*.q 0 l x y x A A B B B B B B A l ; . . . . # % ; f h h h 2 ; 2 3 h w A w I I A x B B A A B B A A y y B o m 2.9.9.d.9.d.9.9.9.9.d.0.2., . $ $ @ - . $ 1 5.i.j.Q N u u u N ..i.f.0.f.d.9.9.9.9.0.0.d.0.0.0.e.j.0.u T.F+w+A+w+w+w+A+w+w+w+w+y+z+w+w+A+w+v+v+A+z+z+z+z+-+W @ @ + + + @ , s.c+w+D+E+z+v+w+w+w+w+w+w+w+w+z+H.n.2+9+9+|+|+|+|+|+|+|+|+|+b+h.- @ + & % @ . L %+7+|+}+2+$+5 . + @ $ $ . / n.2+|+}+}+|+}+|+|+}+2+|+f+C.4.d+q+o+e+k+h+k+h+k+k+s+X.b @ $ $ - - + # c.l+k+s+t+k+k+k+[+b % = $ @ # . . R [+e+k+k+k+s+k+d+l+t+t+*+E P +.U Z U Z Z Y U +.Y e & . # % @ . # * n ` @.Z Z U +.M } * - . . . . . ' M +.+.` Y +.+.` @.Y Y @.P y P.4+(+(+:+:+<+:+(+:+(+_+)+}.+ . . . . + # + @ % # . . . . . . :.{+:+:+:+:+:+:+:+:+(+:+(+:+:+(+(+:+{+[.[.#+W.U.W.Q.U.U.U.U.U.U.R.`.w.M.M..+ +F.w.M.U.W.U.U.W.W.J . + + . . . . { w.U.U.U.U.U.U.W.Q.U.U.U.#+}.", -"}.#+U.U.U.W.U.U.U.Z.U.U.U.U.W.Z.U.U.U.U.U.U.U.#+w.}.}.f . . . . + + . . { q.#+Z.U.U.U.U.U.U.U.W.U.#+k.m #.*.&.=.*.=.=.=.=.%.%.=.=.=.*.*.%.>.j $ # % @ + $ ~ F #.j $ . . . . @ $ O '.&.*.*.=.*.*.*.&.=.=.*.q 2 l A y x A B B B B B B A w z * + . . . . @ % { @ # % % % % % % ; 2 2 l I A B w A B B B B B E A r p o | N d.9.9.f.f.j.9.9.9.d.0.|., - $ + # - . $ s |...u : = = = = = , 1 !.|.f.0.0.e.d.9.9.d.e.0.0.d.e.j.5.u T.G+z+A+y+y+w+A+y+w+w+y+z+y+w+w+F+z+y+y+D+A+z+z+F+x.> % % @ + . $ F j+y+A+E+D+z+y+w+z+z+z+w+A+z+z+G+H.m.2+9+9+|+}+|+9+9+|+}+|+9+9+C.5 - @ $ $ $ + - L J.8+8+J.L . $ $ $ + + . 5 }+2+}+}+}+}+9+}+|+|+2+b+b+C.4.d+u+s+k+k+h+h+s+d+d+q+X.b @ $ $ . - @ % c.l+d+q+k+s+h+k+[+5 % $ + @ . . + b ~+o+s+s+s+s+s+d+l+q+t+*+E ` +.U Z Z Z Y Y Y Y @.e & . @ @ + . # * e U +.Y U Z +.` } * . . . + + . ' M +.X ` X +.U U Z Y Y @.P y P.p+:+(+(+(+:+:+(+:+{+4+(+[.+ + + + . . 9 w.}.+ + . . . + + @ C ^+:+:+(+(+:+:+:+:+:+:+:+:+:+:+:+4+{+[.}.#+`.W.U.W.U.U.W.U.U.U.U.U.U.U.W.R.W.R.W.U.U.W.++V.W.k.@ @ @ . . . . . 8 q.U.U.U.U.U.U.U.U.U.U.Z.#+}.", -"}.#+U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.W.W.U.W.R.W.J . . # . . . . . . . { w.`.U.U.U.U.U.U.U.U.U.Z.Z.#+w.m #.=.=.=.=.=.'.=.=.=.=.=.*.%.%.%.>.j , + . - # @ = j O #.j = + . . @ # $ ,.&.=.*.&.=.&.=.&.=.=.*.*.O 0 h E B B B B B B B B B A w z * . . . . . . # . . . + . + % # @ % % @ f I A B B A B B B B w w A z B o | 2.9.9.9.j.9.j.9.9.f.d.j.2.$ . + $ . - . $ O s : $ + - @ . . . + $ , u ..5.j.j.e.9.9.e.e.0.0.9.d.e.2.S -+G+D+D+y+x+z+z+y+w+y+z+z+z+y+w+z+y+y+z+D+A+A+F+ +4 . % * % . . g j+x+w+w+D+A+y+y+z+z+z+z+w+z+z+z+B+H.m.2+9+|+|+}+|+9+f+|+}+|+f+9+2+m./ @ $ $ $ $ . - - ) / ) + $ $ $ $ - + ) m.2+9+}+|+9+|+9+9+|+|+}+b+b+n.4.d+q+h+k+k+s+s+h+k+h+q+~+R + + + . . . % I [+q+q+s+q+s+t+X.- - $ + # . . + b [+e+k+s+s+h+k+l+l+q+t+*+K U .Y Z Y Y Y Y Y Y ` i % + . @ $ . @ ' e Y X Y Z Z .M } % . . . . . . * n +.Y @.U +.Y U Z Z Y @.P I +4+:+:+:+4+4+:+:+(+(+4+(+[.+ + + + + _.Y.0+u.$ + . . . + + . k._+3+:+:+3+3+:+:+:+:+:+:+3+:+(+3+4+{+[.}.#+W.`.U.=+U.U.W.U.U.U.U.U.U.U.`.U..+W.U.U.U.U.U.#+k.{ . . . . + + . + J #+U.U.U.U.U.U.U.U.U.U.U.#+}.", -"}.#+U.U.U.U.Z.U.U.U.U.U.U.U.U.Z.U.W.#+U.U.Z.U.U.J . . . . . . . + + f M.Z.#+U.U.U.U.U.W.U.U.U.U.W.#+k.m #.%.%.=.=.=.=.=.=.=.=.'.'.%.*.*.j , @ @ . . $ % < #.%.>.j = . . . # . $ >.,.=.&.=.&.&.*.&.&.=.&.*.q 0 h B y x B B B B B B B A I l % @ . . . . . . . . . - . + # . # # . . & % l B B B B B B B w w x y B o m 2.9.j.9.9.9.j.j.9.9.d.0.N $ . . $ . - - . | , $ . ) . $ . . @ @ @ @ = s 5.i.i.e.e.j.e.e.0.0.9.e.j.5.u -+F+z+F+B+B+y+C+z+y+y+z+z+z+y+z+z+y+z+z+C+A+G+g+W . @ * * % @ > x.F+z+A+E+D+z+y+y+z+z+z+z+w+z+z+z+B+D.m.2+9+9+9+}+9+9+f+9+9+9+9+9+}+2+C./ @ . . + + + . . - @ $ = , - + - / m.8+f+5+f+|+9+|+9+9+}+}+7+|+f+K.4.d+q+s+h+h+h+s+s+k+h+q+d+4.- + + . . @ $ b S.s+t+d+d+h+k+y.@ + $ . - . . @ % [+k+k+s+s+s+k+l+k+q+t+*+E ` .Y Y Y Y Y Y Y X @.i * . . . . . - ; n M Z Y U Z T M i * # . . + + . % n .+.` ` +.X Z Z Y X Z P B P.3+:+:+:+:+:+3+3+3+(+4+{+<.+ + $ J P.{+0+0+u.$ + . . . . + . z.1+^+:+^+4+3+3+3+:+3+(+:+:+:+:+3+(+{+[.}.#+W.U.U.Y.#+#+U.U.U.U.U.#+U.U.U.#+#+`.R.W.R..+#+}.{ . + . . . . + . { w.#+U.Z.U.Z.Z.U.U.U.U.U.U.#+}.", -":.#+U.U.U.U.W.U.U.U.U.W.W.Z.U.U.U.W.U.U.U.U.#+R.J . . . . @ $ . . + @ J F.#+U.U.U.U.U.U.Z.U.U.U.W.Z.k.m #.%.*.=.*.=.=.=.=.%.%.=.=.=.%.k < @ @ . - + = 0 #.%.,.%.k $ . . . . @ $ #.&.*.*.*.*.*.*.*.*.=.=.*.q 0 l A y x B B B B B B A w w l % @ . . . . - . . . . $ . . . . . . . . # . 2 A B B A B B A B B z z B o | Q e.j.9.j.9.9.9.9.f.f.0.N , . . + . . . - + % $ - # $ $ + @ @ @ % % $ , s 2.i.j.9.9.d.d.0.0.0.e.j.2.u -+G+z+z+y+B+y+C+z+z+y+y+z+z+z+y+z+z+z+w+z+G+x+T.[ # + @ & % . ].j+C+z+w+z+z+y+y+w+z+z+z+z+w+z+z+z+B+D.m.2+b+9+9+b+|+9+9+9+9+9+9+}+|+7+8+n./ . . . @ @ . . @ $ $ $ = . - { :.&+8+|+5+f+}+}+9+9+7+}+9+7+b+9+C.4.d+u+k+s+s+s+h+s+h+h+q+s+E.b @ @ @ @ @ $ # a ~+s+n+n+l+E.- @ $ + . - . + . % ~+o+k+u+q+h+k+k+k+r+t+*+E ` +.Z Z Z Z Y Y Y Y ` } @ . . @ $ . # ' n @.Y Z Z U T @.i * . . . + . . & n .Y P @.+.X Z Z Y Y @.P r !+4+4+(+(+3+:+(+_+<+(+4+(+<.4 [.)+{+{+{+{+(+u.= + . . . . . . /.:+3+(+(+3+3+3+:+:+3+(+3+3+(+:+3+3+{+[.}.#+.+W.U.U.#+U.U.U.U.#+#+#+W.U.#+U.U.R.R.U.Q.@+:.% . . . . . . . . @ ).U.W..+W.U.U.Z.W.W.U.U.U.U.#+}.", -"}.U.U.U.U.U.U.U.U.R.Z.U.U.U.U.U.Z.U.U.L.L.#+#+M.J . . + + . + . . . + . { ~.`.W.Q.U.U.U.U.U.U.W.U.#+k.m ,.'.=.%.*.=.%.%.*.*.*.'.=.>.O < $ % # - . $ < O #.%.,.%.j & . . . . @ $ O &.=.*.*.*.*.*.*.&.=.'.*.q 0 l w r r A B B B B B B A w 2 % . . . . # @ @ @ @ % @ % % # . . . . @ @ @ ' o A B x B B B w A z x B o | N 9.9.9.9.9.9.9.9.d.d.9.N = - . . @ $ @ - . @ $ = : : , = $ + # # # . + : ..5.j.d.f.j.d.0.0.0.e.j.2.u T.G+A+w+v+x+w+A+z+w+v+w+C+z+w+v+w+w+w+w+w+x+j+H @ @ + . @ @ + x.F+z+w+A+z+w+w+y+v+w+A+z+w+w+w+z+z+y+H.h.2+9+|+|+|+|+}+}+|+}+}+|+|+7+%+L { . @ + . + . . @ $ $ + + + @ % . ) m.&+|+5+|+}+}+|+}+9+|+}+}+|+9+C.4.d+s+s+l+d+k+k+k+k+k+h+t+*+a @ + + . @ % $ . b R E.E.R { . $ = + . - . + @ + [+e+k+h+h+k+k+d+l+t+t+*+E P +.Z U U Y Y Y Y Y ` } @ . . . + . # ; n U U Y U Z T @.e % @ # . @ @ . & M .@.P @.Y Z Z Z Y Y @.P y P.4+:+<+:+:+:+:+<+<+:+:+0+)+=+)+{+{+4+1+<+4+s.= + . . . . + . }.{+:+:+:+:+:+:+:+:+:+:+:+:+:+(+(+3+{+[.}.#+`.`.Q.U.U.Q.U.U.U.W.U.U.U.U.U.U.U.R.U.R.R.J { # . . . . . . @ { J M.U.U.U.W.R.U.U.U.U.Z.Q.U.U.#+}.", -"[.#+U.U.U.U.U.U.U.W.W.U.U.U.U.U.W.W.#+U.Y.U.Z.w.8 . . . . . . . . . . . . $ w.U.R.U.U.U.Z.U.U.U.U.#+k.m #.'.'.=.=.=.'.=.=.=.=.=.&.>.| , @ # - . . = q *.*.%.'.>.2 & . . + . @ @ #.&.=.&.*.=.&.&.=.*.=.=.*.O h l A y x B B B B B B B x x 2 @ + . . . . & & ; l l l o 2 . . . . @ @ @ % ; 3 x A w A x A A A A z B o | 2.9.9.9.9.9.f.9.9.9.0.f.N $ . + $ . , $ - - . 1 ..5.v.s D = + + . + - - = 1 Q 0.0.0.0.9.0.0.9.b.e.2.u T.F+A+w+w+y+y+A+C+w+w+w+z+y+v+w+A+z+z+w+w+x+T._ @ @ + + . . g m+E+A+w+y+y+y+y+w+w+w+z+z+z+w+w+z+z+E+H.n.2+9+|+|+}+|+|+9+|+}+}+}+}+%+L - . % % @ @ + + . @ @ + @ . - % % @ . - n.9+|+|+}+}+}+|+9+}+}+7+|+9+C.4.d+u+s+d+l+h+h+k+d+d+d+t+o+c.* + + @ % $ , + - ) ! & # @ $ = $ + - ) . $ + # ~+k+s+h+k+k+k+l+l+q+t+*+E P +.Y Y Y Y Y Y Y Y ` d @ . . . + + @ * n ` Z Y Z Y .M d * @ . . # . . & n +.G ` @.+.X ` @.Y Y Z P y P.3+:+:+:+:+:+:+<+<+<+:+4+4+{+{+0+(+4+=+<+6+u.= + . . . . + + }.)+:+:+(+(+:+:+:+:+:+:+^+:+:+:+(+4+{+[.}.W.W.W.`.Z.Z.R.U.U.U.U.U.U.U.W.U.Z.U.U.#+w.8 $ @ + + . . . + . . f M.U.U.U.U.U.R.U.U.U.U.U.Z.U.U.#+}.", -"}.#+U.Z.U.U.U.U.U.U.U.#+#+U.W.W.W.U.#+W.W.W.#+M.J }.k.).J % . . + . . . . . { M.U.U.U.U.W.U.U.W.Z.#+k.m #.*.&.=.=.=.=.*.=.&.'.>.#.m + @ $ + + + { v '.=.%.,.,.O m , . . - . @ $ O >.~.#.=.&.&.&.=.*.=.&.*.O 0 l A B B B A B B B B B B A l o h 2 2 * ; ; l A A A A B B 2 & # . # # @ @ @ ; w w x x A A A A A A x A m Q d.j.9.9.9.j.9.9.f.j.f.N = . - @ % + @ - + u 2.0.i.i.j.f.N , @ . . + . . = s i.9.9.9.d.0.0.j.j.e.5.u T.F+D+z+x+z+A+z+z+w+w+z+z+z+w+z+z+C+D+A+y+j+].@ @ @ * * $ $ x.z+E+z+z+A+z+z+z+z+z+z+z+z+z+z+z+z+z+B+x.n.f+9+b+9+|+f+}+}+}+b+b+9+8+5 - # @ @ $ . - ) 5 n.$+N.7.5 - + $ + + + @ / W $+9+}+|+|+9+9+}+|+7+b+b+C.4.d+q+t+s+k+h+h+h+h+l+h+r+o+[+c.! + + $ + - - - . $ + $ $ - b $ = # . . + $ % ~+t+r+t+s+k+k+k+k+q+t+*+E P +.Y Y Y Y Y Y Y Z P i @ . . - + . - * d U T .Y Z T @.e * @ # . $ @ . % M X +.Y @. .+.` @.+.X ` P r P.p+:+3+:+:+:+:+:+:+:+(+(+(+(+(+_+3+<+=+:+4+u.$ + . . . . + + :.{+3+:+:+3+:+:+:+:+:+(+4+3+:+:+:+4+{+[.}.#+W.W.U.U.U.U.U.U.U.#+U.#+W.`.#+#+#+U.}.{ . @ # + . + + # . @ [.++.+W.W.W.U.U.U.Z.U.U.U.U.U.Z.W.#+}.", -"k.#+Z.W.Z.U.U.U.W.U.U.U.W.W.W.U.W.W.#+R.W..+W.R.G.M.Z.W.W.w.@ . + . . . . . . u.U.W.W.U.U.U.U.W.Z.#+w.m #.=.=.=.=.=.=.=.*.'.'.>.O = . # + + + = < C ,.t j O O k m = . . . . + $ j t m q &.'.%.%.*.*.&.&.*.q 0 w B B B B B B B B B B B x x w A A w z l o w B B A p B B A % . . . @ # . @ * o I A B A A A A B x y A m N d.9.9.9.9.j.9.9.9.9.f.2., - - @ % . - # = 2.e.d.0.f.e.d.2.1 + - + $ + . + u 9.9.j.9.d.j.0.9.e.e.i.u '+G+D+z+y+z+z+z+z+w+w+z+z+z+z+z+z+C+D+D+x+I.[ @ . @ * ; @ g >+z+A+z+z+z+z+z+z+z+w+z+z+z+z+w+z+z+z+B+H.n.7+}+9+9+9+}+|+f+}+b+5+f+N./ @ # @ @ + + . L J.$+2+7+7+C.5 + $ . # @ - # 5 p.9+|+9+9+9+9+}+9+7+b+f+K.4.d+u+s+k+h+h+h+s+s+s+s+s+s+n+[+c.* @ @ + . + + $ + @ @ @ R :.$ $ $ + - + $ ! [+o+t+s+l+k+k+k+s+q+t+X.K U .Y Y Y Y Y Y Y Y ` i % . . . . . # ; e Y .T Y Z T X d * % # . @ . . ; n @.+.X Z +.X ` ` X +.Y P y P.p+(+4+:+(+4+:+:+:+:+3+3+:+:+:+_+3+3+:+4+4+u.$ + . . . . . . (.^+3+:+:+(+4+3+:+:+(+(+3+:+(+(+3+3+{+[.}.#+.+W.Z.U.U.U.#+U.U.U.U.#+v.U.#+#+U.J $ . . + + . . + . . @ J U.#+Q.R.W.W.Z.U.U.U.U.Z.W.Z.U.Z.Z.#+}.", -"}.#+U.W.Z.U.U.U.U.U.U.U.#+Z.`.U.U.U.U.W.R..+W.Z.#+W.Z.U.#+U.}.% . . . . . . . 8 U.W.U.U.U.U.U.U.U.#+k.m #.=.=.=.=.=.=.=.&.&.'.>.j + . . + + + + = = , , = = = % % @ $ + @ + $ + = : | 1 %.&.=.*.*.=.&.&.=.O 0 w B B x B B B B B B B x y z x B B w w w B w B B B y x x w ; @ + . @ @ . @ % l A B B y x A B B x z A m Q d.9.9.9.9.9.j.9.9.9.j.|.= . ) @ $ + . @ = 2.9.9.f.f.j.e.5.: + . + + . . + 1 0.9.j.9.e.0.0.0.e.j.0.u -+G+D+z+y+z+C+z+z+z+w+z+z+z+z+z+z+z+A+w+y+W . @ . # % % @ a.v+z+z+z+z+A+z+z+z+z+z+z+z+z+z+w+z+z+z+B+D.n.2+9+9+|+|+}+b+}+}+|+5+7+L . @ @ @ @ @ @ ) C.2+8+7+9+b+2+z.- + . . + + # ) m.9+}+9+9+9+9+}+|+7+9+9+C.4.d+q+s+k+k+s+s+k+k+k+s+k+h+l+l+[+E.R & * . + $ $ . . b A.X.R @ + @ - . + @ b ~+o+s+k+k+k+k+k+h+q+t+X.K ` +.Y Y Z Y Y Y Y U ` e & . . + . . @ ; e M . .Z Z .P d * @ . . . . . ' n @.+.X Z +.+.@.` Y .@.M y P.p+3+(+(+(+4+4+(+(+:+:+3+:+:+:+3+<+<+1+4+4+u.$ + . . . . . @ 3.1+^+:+:+(+:+:+^+:+:+(+3+3+(+:+3+4+4+[.}.#+W.U.U.U.W.#+#+U.U.U.U.W.Q.W.W.U.J # + . . + + . . . . { k.W.#+W.W.Z.U.W.#+Z.U.U.U.Z.W.Z.U.U.U.#+}.", -"}.#+U.Z.U.U.U.U.U.U.U.U.R.Z.W.W.U.U.U.W.++++W.U.W.W.U.R.R.U.w.% . . . . . . . @ U.U.U.U.U.U.R.U.Z.#+k.m >.%.&.=.=.*.*.&.'.'.'.%.m . . . + + + + + + + $ @ @ @ . - % @ @ # + @ $ + + $ < #.&.&.*.*.=.&.'.*.q 0 l A B x B B B B B B A A x x x A A A A w B w A x A y x x w ' . . . @ @ . @ @ l A B x x A A A B x y l 7 Q d.9.9.9.9.j.j.9.9.j.j.5., + - % $ + . # : 5.0.d.9.i.e.d.i.t + . . + + . @ 1 2.9.9.9.d.0.0.9.b.e.2.u T.F+D+y+v+z+A+A+A+w+w+z+z+A+w+w+z+A+A+y+m+g . @ . @ % $ $ x.y+z+A+z+w+w+z+z+z+w+w+w+A+z+z+w+z+z+A+B+H.n.2+9+9+}+|+|+9+|+}+|+b+9+5 + + # @ % @ . a J.b+|+9+5+b+7+&+5 . . # @ + - . L 9+|+}+}+|+|+|+|+7+|+9+C.4.d+u+s+k+k+k+h+k+k+k+h+k+k+k+k+k+l+~+E.c.R ! ! b c.c.X.e+[+b # % + . . + % b k+k+k+k+k+k+k+d+h+q+t+*+E ` +.Y Z Y Y Y Y Y Y Y e ; @ . - . . # * e M X +.U Z Y M } % . . @ + - @ ( n Y X U U +.X ` ` X .Y c y P.3+<+(+:+:+<+<+<+:+:+:+:+:+:+:+^+^+:+<+<+{+u.+ + . . . @ + + F.{+:+:+:+:+:+(+(+:+:+:+:+:+:+:+:+4+(+[.}.#+U.W.U.U.U.U.U.M.R.U.U.U.W.U.Z.J . . . . + . . . . @ J w.U.U.M.M.U.U.U.W.R.U.U.U.U.U.Z.U.U.U.W.#+}.", -"}.U.U.U.U.R.Z.U.U.U.R.Z.R.Q.Q.R.W.U.U.#+V.V.U.U.Z.Z.U.W.W.Z.M.8 . . . . . . # @ U.U.U.U.U.U.R.U.U.#+k.m ,.*.'.=.*.*.=.*.*.&.'.#.j $ . . . . + + + @ @ + # @ @ . . # . @ + $ . @ + @ @ < #.'.'.%.%.*.&.'.'.q h w B B B B B B B B B B A B A w A w w w I w A I A w A B B z ' . . . @ @ . @ % l A x x B A A A B x z w 7 N d.9.f.9.9.9.j.9.9.9.0.0.: + - @ $ $ + . s 5.d.8.9.0.9.d.5.t . . + + + + + 1 0.e.f.9.d.0.0.9.e.9.2.N T.F+D+y+x+w+A+C+z+w+z+z+z+z+w+z+A+z+A+y+x.> # . . @ # # 9 '+x+y+A+z+z+w+z+z+z+z+w+w+z+z+z+w+z+z+z+B+H.h.7+9+b+}+|+b+9+f+}+|+9+%+5 + + @ @ @ @ . ].8+b+|+b+5+5+f+$+L . @ @ @ + + . / 9+|+}+}+|+}+|+|+7+b+f+C.4.d+u+s+k+k+k+h+k+k+k+k+s+r+s+t+s+k+s+t+e+e+X.X.X.~+~+q+t+X.) . # - . . + % 4.d+t+k+k+k+s+k+k+k+s+t+*+E ` .U U U Y Y Y Y Y +.M ' @ . . . . # * } M ` Y U Z Y M ' % # . $ + . @ } M X .+.` Y X ` ` +. .X P x P.p+:+:+:+:+:+:+:+:+:+:+(+:+:+:+_+^+:+:+<+{+u.$ + . . . @ + . (.^+3+:+:+(+(+(+:+:+:+:+:+:+:+:+:+3+(+[.[.#+`..+U.U.U.U.U.U.W.U.U.#+U.G.J . + + . + . . + . { }.M.U.U.W.W.U.U.U.U.Z.W.W.R.U.U.U.U.U.U.U.U.#+}.", -"}.#+U.Z.U.R.U.U.U.U.W.W..+@+F.q.w.}.).J 8 8 }.Z.#+U.U.U.U.U.M.J . . . . . . . @ W.U.U.U.U.U.U.U.W.#+k.m #.=.&.=.*.=.*.*.=.&.'.>.j $ . . . . + + + + @ . # @ . # $ @ . . + @ . . . . @ , #.=.=.'.%.=.&.&.=.q h w B B B B B B B B B B A w h h o h 3 2 ; ' A w A A w B B w ' @ . . @ @ . @ % l w A y x A A B B x y A < N d.j.9.9.9.j.9.9.9.9.e.i.1 $ . @ $ $ . . , 5.9.8.9.f.d.d.i.t + . + + + . + 1 0.d.9.9.e.0.0.9.j.j.2.u T.F+D+y+x+w+A+z+z+w+z+z+z+z+w+z+C+z+y+j+H + # . . . + . a.x+y+z+A+z+z+w+z+z+z+z+z+z+z+z+z+w+z+z+z+B+H.n.f+9+b+|+9+b+f+7+|+9+b+%+5 + + @ @ @ . . a &+b+9+b+b+5+f+$+L + . @ @ $ + @ - 9+|+|+|+9+|+|+|+7+b+b+C.4.d+u+k+k+k+h+h+s+k+k+k+r+r+s+s+h+h+t+t+s+r+r+t+s+k+k+q+s+X.. . # . . + + @ E.l+s+s+s+h+h+k+k+s+r+t+X.E P +.Y Y U U Y Y Y +. .M ' @ . . + + # * } M @.Z Z Z Y n ; @ . . + + . % i P X .+.@.X +.@.` +.+.Z P x P.p+(+(+:+(+:+:+:+:+:+:+3+^+:+:+_+^+<+:+:+{+u.$ + . . . . . . (._+3+:+:+:+:+:+:+:+:+:+3+:+:+:+:+3+(+[.}.#+W.W.R.U.U.U.U.U.U.U.U.#+U.J # @ + + . . . . @ 8 w.U.U.U.U.U.W.W.U.U.U.Z.U.W.W.U.U.U.U.U.U.U.U.#+}.", -"}.#+U.#+U.U.#+U.#+U.U.U.W.F.a 8 ~ @ @ # + . 8 M.#+U.U.U.U.U.M.{ . . . . . . . 8 ++W.U.W.U.U.U.U.Z.#+k.m #.'.=.=.*.=.*.*.=.&.'.>.m + . . . . . . . . . . . . + + $ @ + + + . @ $ . . % < #.%.'.=.*.&.&.&.*.q 0 h A y y A B B B B B B A 2 * * * * * & % ; 3 w w A A B A I * # . . @ @ . @ * h w A x B B B A A x y o 7 Q d.9.9.9.9.j.j.9.9.9.e.5.u = + @ @ + . - = |.j.d.0.0.d.d.i.1 $ # @ + + # + s i.d.9.9.d.0.0.9.e.j.5.u '+F+D+F+y+z+C+z+z+w+z+z+z+z+z+z+C+z+G+j+9 . . . . + + + I.y+z+z+z+z+z+w+z+C+z+z+w+z+z+z+z+A+z+z+z+B+H.n.7+9+9+}+|+}+f+f+|+f+b+7+5 + + . @ @ + + a N.b+|+|+|+|+7+&+/ @ # @ @ $ + - 5 9+|+|+9+9+9+|+9+7+9+9+C.A.d+q+s+h+h+h+s+s+k+k+s+s+s+n+[+~+X.X.E.c.6.E.t+t+t+q+q+d+y.+ # $ + . - + ! ~+k+s+q+s+s+h+k+l+k+q+t+X.K U +.Y Y Z Z Y Y Y +. .P } @ . . + + @ % ' n P Z Z Z ` e ; @ - . . . @ * d P +.+.Y ` Y +.@.` +.+.Y P r P.p+3+4+:+:+(+4+3+(+:+:+3+:+:+:+4+_+:+:+4+0+u.$ + . . . . . . :.{+3+:+:+(+4+3+3+:+:+3+3+:+:+:+4+3+{+[.[.#+W.W.R.Z.U.#+U.U.U.U.#+#+J # . @ # . . . + . 8 M.#+#+#+#+#+#+#+#+#+R.#+#+#+U.U.U.U.W.W.U.U.Z.U.#+}.", -":.#+U.#+U.U.#+U.U.U.#+U.#+R.8 . + + . . + + @ }.U.U.U.#+U.U.w.. . . . . . . + }.++W.U.W.U.U.U.U.Z.#+k.m #.=.=.*.=.=.*.=.&.&.&.>.j + . . . . . . . . . . . . . + . . - . @ @ $ @ . . @ , O *.&.=.=.&.&.&.*.O v l A y y A B B B B B B w f % % % @ @ @ @ * ; I A w w w B A % . . . @ @ . @ f I A x z x A A A B x y l 7 Q d.j.9.9.j.j.j.9.9.9.9.i.5.= - . @ + . . = s 9.f.i.f.d.b.2.: + . + + @ # + s j.d.9.0.d.0.0.9.e.j.i.N T.E+A+y+y+z+C+z+z+A+z+z+z+z+z+z+A+z+x+T._ . @ @ . - . [ T.y+z+E+G+z+z+z+z+z+z+z+w+z+z+z+z+z+z+z+z+G+H.n.7+b+9+}+|+}+}+7+7+|+b+f+5 . . # @ @ $ + ) n.7+f+|+|+f+7+m.- @ # @ @ $ + - a 9+|+9+}+9+9+|+9+7+b+f+C.A.d+q+q+h+h+h+s+s+k+k+s+s+[+c.I R a a { { & b ~+t+e+q+l+d+R % % $ . . . + R [+k+s+q+q+l+q+k+k+s+q+t+X.K ` .Y Y Y Y Y X Y +. .P i @ . . . . . * ; e M @.X X G } * - . . . @ @ * i P +. .X @.+.+.` ` +. .Y P w +p+3+4+:+3+3+4+3+:+3+:+:+3+(+(+3+3+:+<+4+4+u.$ . . . . . + . (.^+3+:+:+3+3+:+:+:+:+3+3+:+:+(+3+3+{+[.[.#+.+.+U.U.U.#+W.U.U.Z.#+M.{ . . . . . + + . . { J J J J J J J J J J J J }.#+U.W.U.U.W.W.Z.U.U.Z.#+}.", -":.#+W.U.U.U.U.U.U.U.M.U.U.#+}.. . . + . . . # { }.U.#+#+U.w.8 . . . . . . . . w.W.U.U.Z.U.U.U.U.U.#+k.m #.%.=.*.=.*.*.*.%.=.=.*.q | < < < < < < < < < < = < < < = @ . . # @ . + < : < j q =.&.=.'.=.&.&.*.q 2 l B x x B B B B B B B w f % @ @ @ . . # % * o h w w l I * @ . . . @ . . ; l w B A x B A w A B x B o 7 2.e.9.9.9.9.9.9.f.9.9.0.0.i.1 ~ . - + . . $ : u Q i.5.5.2.u , + . . - . + : ..i.9.0.9.d.f.0.0.e.j.i.u T.G+z+z+y+B+z+A+z+w+z+z+y+y+w+w+A+y+x+a.+ % @ + # # @ g '+x+y+z+z+z+w+w+w+z+z+z+w+w+z+z+A+w+z+z+A+B+H.m.7+5+9+}+9+}+}+7+|+}+|+f+n.- @ @ @ @ . . + / C.%+8+2+2+n.5 - . # % % % @ ) 7.9+|+|+}+}+|+}+|+7+9+9+C.4.d+q+k+k+k+k+k+k+k+k+k+q+~+b @ + + + + @ % & c.n+n+n+~+c.) # $ $ + + . $ X.e+k+h+l+k+l+h+k+k+k+s+t+X.E P +.Y Y Y Y Y Y Y +.T @.e ' % . . - . @ * ' p n d n } * @ . . @ % % % } n @.X +.Y U +.+.Z Z +.+.Z P A +4+:+(+=+:+(+4+:+:+(+:+(+:+:+:+6+:+:+<+:+{+u.= + + + + . + . }.{+3+:+:+(+:+:+:+:+:+:+(+:+:+:+:+3+{+[.}.#+W.W.U.R.U.U.#+v.U.`.M.J . . . . . . + + . . . . . . . . . . . . . . . 8 #+Y.++W.U.U.U.U.U.U.Z.#+}.", -"}.#+U.U.U.U.U.U.U.R.W.U.U.U.M.8 @ . . . . + + . { J }.}.J { @ . . . . + + + J M.U.U.U.U.U.U.U.U.U.#+k.m #.,.'.*.=.*.=.*.*.=.*.*.*.q q q q >.O O q q #.q O q q q k $ . . . . . + j t '.*.*.=.&.=.%.%.=.=.*.q 0 l A y x B B B B B B A A I f * @ @ . . # % % * * ; f ; % . . . . . . @ + 2 B B x A A B B A E x z B o | Q 9.9.9.9.9.9.f.f.9.d.f.9.j.5.: + - . . . + $ , : u s t : , $ + . # - . = u i.0.f.0.9.d.f.0.j.b.9.2.u T.F+z+A+y+y+w+A+w+v+w+w+y+G+w+w+D+x+x+H @ % # . % % @ W j+x+v+w+y+z+y+v+w+z+w+y+w+w+w+z+z+v+w+w+A+B+H.m.2+b+9+}+|+}+|+|+}+}+}+}+}+5 @ @ @ . . # % # / L 7.7.L / - - . @ % % @ . 5 8+}+}+}+|+|+}+|+|+2+|+9+n.4.d+s+k+k+k+k+k+k+k+k+k+l+d+c.! + $ = + @ * & ! c.E.c.R # - . + $ @ . @ 4.l+l+k+k+l+k+k+h+k+d+l+s+t+*+E P X Z Z Z Z Z Z @.+.T X M d ; @ . . # . @ % * ' 2 ' # @ . . . @ @ @ ( e P Z +.Y Z U X Y @.@.X Y @.P y P.4+:+:+=+:+:+:+(+:+(+:+:+:+:+:+<+<+:+(+(+0+u.= $ + + + + + . (.^+(+:+:+:+:+(+:+:+:+(+(+:+:+:+:+(+(+[.[.#+U.W.U.R.U.U.#+L.`.`.w.+ + . . . . . . . . . . . . . . . . . . . + + . 8 #+Z.V.U.U.U.W.R.U.U.U.#+}.", -"w.#+U.U.U.U.U.#+U.W.#+U.U.#+U.k.$ . . . . + + . . . @ @ . . + + . + + . + @ M.#+U.W.W.W.Z.U.Z.U.U.#+k.m #.%.&.=.=.=.=.=.=.=.=.*.=.*.>.*.*.*.>.=.*.*.=.*.%.*.=.#.k $ . + . . . @ O %.'.*.=.=.=.=.*.%.=.'.*.O 0 l A x x B B A A B B A A I h ; % @ @ . . @ @ @ @ @ . @ @ + . . @ @ @ % % 3 B B B A A B A B B z y B o | Q 9.9.f.9.f.9.f.f.9.9.9.j.j.5.s , ~ @ @ @ @ - . + = , = = + . @ # . + + : 5.i.j.d.d.9.e.f.0.0.j.j.2.N -+F+A+E+y+y+z+z+z+w+z+y+y+C+z+y+D+F+m+9 + @ @ . % @ . a.x+y+E+E+z+y+z+z+z+z+z+z+w+A+z+z+z+w+z+z+z+B+D.m.2+|+9+}+}+}+9+|+|+}+}+}+b+n.- - - # @ % & @ $ . - - . . . $ + + % # + - m.2+}+}+|+}+9+}+|+}+2+b+b+C.A.d+q+s+k+k+k+k+k+k+k+k+k+q+~+R . + + + @ $ @ @ . # # . + + $ $ $ % @ ! *+s+l+k+k+k+s+l+h+k+l+l+q+t+X.K ` +.Z Z Z Z Z @.Z Y +.Z P n } % @ + + + @ @ @ % % * % @ + . . . + + d n @.Y X @.@.Y X X @.@.X X @.P y P.3+:+:+:+:+3+:+(+:+:+3+:+3+(+:+3+6+:+(+_+0+u.$ @ @ . @ + + . (.^+3+:+:+:+:+:+:+:+:+(+:+:+:+<+:+(+(+[.[.#+`.U.Z.U.U.U.U.W.U.#+f # . . . . . . . . . . . . . . . . . . . . . . . 8 #+U.Q.U.U.U.W.W.U.U.U.#+}.", -"w.#+U.U.U.U.#+#+Z.U.U.U.U.W.U.Z.}.. . + . + + . . . . . . . . + . . + . * }.#+U.U.U.W.W.Z.U.U.U.#+#+k.m #.=.&.=.=.=.&.=.*.=.'.'.=.&.&.&.'.=.=.'.&.&.&.=.%.*.=.%.m $ . . . @ @ $ #.%.=.*.=.=.=.=.*.=.=.%.*.O 0 l A B B B B A A B B B A I I l * % @ @ @ . . . . . . . . . . . @ % & * 3 B B B B A A B B A A z y B o | Q 9.9.f.9.f.f.9.9.9.0.9.b.9.i.|.u : @ # % % # - - - @ . @ # . # % # = : ..5.i.e.d.9.9.e.0.0.j.j.j.2.N -+G+z+E+y+y+z+A+z+y+z+z+B+z+w+B+D+E+>+[ + % % @ & % . x.x+y+E+D+A+B+z+G+y+z+z+G+w+y+z+z+z+A+z+z+z+B+H.m.2+b+9+|+}+9+f+}+|+|+|+}+b+$+L ) - . @ = * * $ @ @ . # @ $ = = $ @ . - 7.;+f+9+}+9+}+f+f+|+}+7+9+9+C.A.d+q+s+k+k+s+s+s+k+k+s+s+s+l+E.! . . @ @ + + + . + + + $ = $ $ @ * b E.l+s+s+s+h+h+s+l+l+k+k+k+q+r+*+K U +.Z Z Z Z Z @.Z @.` @.` ` n ( % @ + + . . + @ @ @ # . . . . @ * * e P +.+.Y ` ` @.+.+.@.@.X X @.P y P.p+(+(+:+3+4+4+:+:+3+3+3+3+(+:+6+3+4+(+{+_+u.$ @ @ . @ # . + ).{+3+:+:+3+3+3+3+:+(+(+3+:+^+^+3+3+{+[.}.#+U.U.`.)+#+U.U.U..+G.% # . . . . . . . . . . . . . . . . . . . . . + + 8 #+W.W.U.U.W.W.U.U.U.U.#+}.", -"k.#+U.Z.U.U.U.U.Z.U.U.W.W.U.U.U.W.}.! # . + + . . . . . . . . . # @ . 4 1.#+#+U.`.U.Z.U.U.U.U.U.U.#+k.m >.%.=.*.*.=.&.=.*.=.=.=.=.=.=.&.&.&.=.=.&.=.&.&.*.%.*.>.j @ @ # @ % % $ >.'.=.*.=.=.=.=.*.*.=.'.*.q 0 l B y x B B B B B B B B A w I l ' * @ % . . . . . . . . . + . @ * ; l A B B B B B B B B A w x y B o m N 9.f.f.9.f.f.9.9.f.0.9.d.e.e.i.5.u < $ $ - # # . - # . # @ # . @ $ 1 N 5.i.j.b.d.9.e.e.0.0.9.b.j.2.u -+G+A+E+y+y+y+C+y+y+z+z+B+B+w+y+D+G+'+_ + % % % % $ + +x+y+w+D+C+B+z+w+z+z+G+B+z+z+z+z+z+A+B+z+z+B+t.m.2+b+9+9+|+f+7+}+f+f+9+9+9+2+N.7.5 - @ = = * % % % % % % % % $ @ . ) L 7+f+9+}+}+}+}+7+9+|+9+7+9+9+C.4.d+q+s+k+k+s+s+s+k+k+s+s+r+s+l+E.b # % % . . . . . + + + + + + ! R E.k+h+s+s+s+h+h+h+s+l+k+l+h+q+r+*+-.` +.@.Z Z Z Z Z Y ` P @.+.Y P n ( % . . @ @ . + . . - . . # % ; } p M Z +.+.Y ` ` ` X +.@.@.Z Y @.P r P.p+4+(+:+3+(+4+:+:+(+:+3+3+(+:+6+3+4+4+4+0+u.$ @ . . . . . . 4.6+3+(+:+3+(+3+3+:+(+:+3+:+^+^+:+3+{+[.}.#+W.W.U.)+#+U.#+U.#+q.. . . . . . . . . . . . . . . . . . . . . . . + . 8 #+R.W.U.W.U.W.R.U.U.U.#+}.", -"}.U.U.Z.R.W.U.U.U.R.Z.W.W.U.U.U.#+L.w.:.{ @ . . . + . . . . . . # % J F.U.W.U.#+L.W.U.U.U.R.U.U.Z.#+k.m >.%.'.%.*.*.=.=.*.%.'.=.*.*.*.=.=.*.%.=.=.*.'.'.%.*.>.#.< + @ @ @ @ & @ #.=.*.*.%.=.=.=.*.*.=.=.*.q 2 w x y x B B B B B B B x y x A A l 2 * * # @ @ @ @ @ @ @ @ @ % * 2 3 A A x A A A B B A B B E x y B o | Q 9.f.f.9.9.9.9.0.9.9.9.e.b.e.j.i.2.t 1 , > + + + $ . @ @ + + = : : ..2.i.0.e.e.e.d.d.d.0.0.0.j.j.5.u -+B+A+E+y+y+y+C+G+w+y+w+z+z+w+w+z+B+H.> . . @ @ + . > +y+z+v+w+z+z+w+w+z+z+z+y+w+z+z+z+z+w+y+z+z+B+H.n.2+b+9+|+}+}+|+9+}+|+}+}+}+}+7+%+n.L / . + + @ @ % % @ @ @ @ . 5 L n.$+f+|+5+}+}+}+}+}+|+}+}+}+b+9+C.4.d+q+s+k+k+k+k+k+k+k+k+s+t+t+k+l+X.R b # + . . . + @ . @ @ - a c.[+l+k+q+h+h+k+l+h+d+h+h+k+l+k+q+r+X.E ` +.Z Z Z Z Z Z Z @.` @.+.+.Z M n ( * * % & % % @ @ . . % % ( d c @.@.Z +.+.Y ` ` ` Y Y U U Z U Z P w +0+(+(+:+:+4+:+:+:+:+:+(+3+:+:+:+3+:+:+0+0+u.$ . . . . . . . 3.++:+:+:+(+(+:+:+:+:+:+3+:+:+:+(+4+_+[.}.#+U..+R.R.U.U.W.U.`.J . . . . . . . . . . . . . . . . . . . . . . . . . 8 #+W.Z.R.W.W.W.R.U.U.U.#+}.", -"}.#+U.U.R.W.U.U.U.R.Z.U.U.U.R.R.W.L.V.U.w.}.J 8 8 8 8 { 8 8 8 J J k.Z.R.U.U.U.W.v.R.U.U.U.R.U.U.U.#+k.m #.=.=.=.=.*.*.=.*.%.=.=.*.*.%.*.*.=.'.*.*.=.'.'.%.=.%.>.j | < j m m 0 < #.=.*.%.%.*.*.=.*.*.=.=.*.q 2 w B x x A A B B B B A A y r B B I h h 2 * * * * * * * * * ; ' h l w x A A A A A B B B B A A x z B o t 2.9.9.9.9.9.j.f.0.9.9.9.e.8.d.9.0.0.5.2.N u 1 : 1 1 : : : : : u N 5.i.0.f.9.d.d.9.f.d.8.0.0.f.j.j.i.u -+y+A+A+v+y+v+C+C+w+w+z+z+z+w+w+z+y+T.a.a.a.a.a.a.a.x.'+y+z+z+B+G+z+y+w+z+z+w+w+w+w+z+z+z+v+w+z+z+B+H.n.2+5+9+}+}+}+|+9+}+|+}+}+}+}+|+f+2+%+n.7.7.5 5 5 5 5 5 5 5 W 7.C.%+7+7+f+9+b+}+b+}+|+}+}+}+}+7+b+9+C.4.d+q+k+k+k+k+k+k+k+k+l+k+s+s+k+q+l+~+X.c.R b b b b b b R c.E.*+[+l+d+s+s+h+h+k+d+k+l+h+h+k+e+k+q+r+X.E ` +.Z Z Z Z Z U Z @.@.U Z X Y Z P ` d d } ( } ( ' ; ' ' } } e M X .Z Z +.+.Z @.Z X +.Y @.@.U U Z P E +4+:+:+:+:+(+(+:+:+:+:+(+:+:+(+<+:+:+(+(+{+O.[.F F [.[.[.[.F u.(+:+:+:+^+^+:+:+:+:+(+:+(+:+:+(+(+_+[.}.#+.+U.U.U.U.U.U.R.U.}.J J J J J J J J J J J J J J J J J J J J J J J J J }.U.W.R.R.U.W.W.W.U.U.U.#+}.", -"}.#+U.U.U.U.U.U.U.U.U.U.U.W.R.W.U.#+U.U.U.#+U.G.w.w.w.w.w.w.F.Z.#+#+U.R.U.W.W.W.#+U.U.U.U.U.U.U.U.#+k.m #.=.=.=.=.=.=.=.=.*.=.=.=.=.=.=.=.=.&.*.=.&.&.'.'.&.'.'.,.#.*.{.=.>.>.>.&.&.=.*.=.=.*.=.*.%.=.=.*.O 0 l A y x A A B B A A A y p r x x A I I I A A 3 3 3 h h 3 w w w w w I w w A B B B A B B B A A z z B o | Q d.f.f.9.f.f.9.9.f.f.9.e.d.d.9.f.0.d.f.f.f.2.2.2.Q Q N 2.Q 2.f.d.d.d.f.f.d.8.d.f.0.f.d.0.0.9.e.j.2.N -+F+A+A+y+y+y+C+y+w+w+z+z+y+y+z+G+G+y+y+y+F+F+F+y+x+F+E+A+C+z+B+B+z+w+y+y+y+z+z+w+z+y+z+z+z+z+z+z+B+H.m.2+b+9+}+|+9+}+9+}+|+}+}+}+9+f+|+f+9+2+2+}+%+K.N.N.N.N.$+/+/+7+f+9+}+}+}+}+|+}+|+}+|+}+}+|+}+2+b+f+C.4.d+q+s+k+k+s+h+s+k+k+h+l+k+h+q+h+k+k+n+n+[+~+X.X.X.X.X.[+t+n+s+k+l+k+h+t+h+s+h+l+k+s+h+h+k+k+k+q+t+*+E P +.@.Z Z Z Z Z Z U +.Y Z @.Z Y .T ` @.` M M n n d ` P ` ` P @.Y +.` @.+.X @.Z Y . .Y ` @.X X ` M y P.3+(+(+:+:+:+(+:+:+:+^+:+:+:+(+:+:+3+(+(+0+0+0+0+_+4+4+4+3+3+3+4+3+:+:+^+^+:+:+:+:+(+3+:+(+:+^+4+{+[.}.#+U.U.U.U.U.#+W.R.Z.Z.#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+W.U.W.U.U.W.W.`.++U.Z.U.#+}.", -"k.#+#+Z.U.U.#+Z.W.U.U.U.U.W.U.U.#+#+U.U.U.Z.#+#+W.W.`.#+#+U.Z.U.U.U.U.U.W.W.U.W.W.U.U.U.U.U.U.U.U.#+k.m #.'.&.=.=.=.&.'.&.=.=.&.'.&.&.&.&.'.&.'.=.'.&.&.&.&.&.&.%.'.'.!.&.=.=.=.&.&.'.=.&.&.=.=.=.&.'.=.%.O 2 w A x x B B B B A A A y i A z y x w A w x x x x B B B B B B w x z w A A B B B B A B B B B A A z B o m N 9.e.9.9.d.e.9.9.d.d.d.e.e.e.d.9.d.8.d.d.f.f.d.j.j.9.j.9.f.d.b.8.8.d.9.j.e.e.j.j.0.9.d.0.0.j.b.j.i.u -+F+E+E+z+y+C+E+z+z+z+G+z+C+z+z+C+C+G+w+E+E+E+D+E+z+E+A+A+z+w+z+z+A+A+z+G+A+z+A+z+z+C+G+A+A+z+A+z+G+D.n.7+9+b+}+9+9+9+9+}+|+}+9+9+9+f+9+f+9+9+}+f+b+b+9+f+9+9+9+b+9+7+|+b+}+}+}+}+9+}+}+9+9+9+9+|+}+7+9+7+C.4.d+q+s+k+k+s+r+s+t+k+s+t+s+s+s+h+t+t+n+s+t+t+t+r+s+s+r+t+t+s+k+s+s+t+t+t+s+s+s+h+k+h+s+s+h+k+k+q+r+X.K U +.X +.+.X X X Y +. .+.Y X +.X T T T T .+.Z Y Y ` .T X X +.+.Y +.Z Y .+.+.X +. . .+.X Y +. .@.P r !+p+(+:+<+(+4+3+:+:+:+^+3+3+:+:+:+:+:+4+{+(+0+0+(+{+4+3+(+<+:+:+:+3+:+:+3+3+3+3+:+3+:+4+3+:+(+^+4+{+[.}.#+`.W.U.U.Z.U.W.U.U.Z.U.U.U.U.U.U.U.U.U.U.W.U.U.U.U.U.U.U.U.U.U.Z.#+U.U.U.W.W.U.U.W.W.`.++Z.Z.U.#+}.", -"w.#+#+Z.U.U.U.Z.W.U.U.U.W.Z.U.U.U.U.U.U.U.U.Z.Z.U.U.U.W.W.U.U.U.U.Z.U.`..+W.U.W.R.U.U.U.U.W.U.U.U.#+k.m ,.'.&.'.=.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.'.&.&.=.&.&.'.&.=.&.&.&.&.=.'.'.&.&.=.&.&.=.&.&.'.'.'.q 0 A w A x B B B B B B x x A B B B B B B x B x B x B x B x B B B B x x B B B B B B x B B B A A z z A l v Q d.e.d.d.d.d.e.d.8.8.d.9.d.d.d.e.d.d.e.d.e.e.d.d.8.d.d.8.d.d.d.e.e.e.e.e.e.e.j.e.d.d.d.j.0.e.b.j.i.N >+G+E+D+A+A+C+E+z+A+A+C+A+C+A+A+C+C+C+A+A+z+C+C+A+A+C+G+A+A+A+A+A+G+A+A+C+A+A+C+z+A+C+C+A+A+A+C+A+B+D.C.7+f+b+|+9+9+9+9+9+9+9+9+f+|+|+9+b+9+}+|+9+|+9+9+}+|+9+9+9+|+9+9+9+9+9+9+9+9+9+|+|+|+f+}+|+|+7+9+9+C.A.d+q+r+k+k+t+t+t+t+t+t+t+r+s+s+s+s+t+s+s+t+s+s+r+k+s+t+t+t+t+s+s+s+t+o+k+t+r+s+k+s+s+r+t+l+l+q+q+u+*+K U . . .+.+.+.+.+.+. .+.+.+. .+.X +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .+.+.+.+.+.+.+.+.X . .+.U i P.p+(+<+<+:+(+:+3+4+:+4+4+(+:+4+4+4+:+(+:+(+4+4+(+(+4+4+4+<+:+4+4+4+<+3+(+4+4+:+:+(+4+4+:+<+4+4+4+{+[.}.#+W.W.U.U.Z.U.Z.U.U.U.U.U.U.U.U.U.U.U.U.U.W.Z.U.U.U.Z.W.W.U.U.W.W.U.U.U.W.Z.U.U.U.U.U.W.W.Z.#+U.#+}.", -":.#+U.U.U.U.U.U.U.W.U.U.W.W.W.W.U.U.U.U.U.U.Z.Z.U.Z.W.W.W.U.U.U.U.U.Z.L..+W.U.W.Z.W.U.U.U.U.U.W.U.#+k.m ,.'.&.&.=.=.*.*.*.%.%.=.*.*.*.*.=.*.*.%.*.*.%.*.*.*.=.*.=.>.*.*.*.>.*.=.'.*.*.*.*.*.=.*.*.>.=.%.%.q h w w x x A B B B B B B B B B B B B B B B B B B z B B B z B B x B y B B B B B B B B B B B E A z x B I 7 Q f.f.f.f.0.0.0.0.f.f.0.0.f.i.0.0.0.i.f.0.0.0.i.f.f.f.f.f.f.0.f.f.0.0.0.f.0.j.0.f.0.9.d.f.0.0.j.j.2.u T.B+y+z+w+y+z+z+y+y+y+y+y+y+v+y+y+y+z+z+y+y+y+z+w+z+y+y+v+y+z+z+y+y+y+w+y+y+y+y+y+z+y+y+z+y+v+y+G+B+H.n.2+}+|+}+}+9+7+}+}+}+}+f+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+7+|+}+|+f+7+|+}+}+}+}+7+|+}+7+9+9+n.A.d+u+t+k+d+k+k+k+k+l+l+l+l+k+k+k+l+l+l+k+k+k+k+h+k+k+k+l+l+e+k+k+k+k+k+d+l+l+k+k+k+l+l+l+d+l+h+q+l+*+R P +.@.@.@.@.@.` @.@.@.@.@.` @.@.` @.@.@.@.@.@.@.@.@.@.` ` @.@.@.` ` @.@.@.Z @.@.@.@.@.@.P P Z Y P n y P.p+:+:+(+<+:+:+(+:+(+(+3+(+:+(+3+(+:+(+:+(+:+3+(+:+:+(+(+:+:+3+(+(+:+:+(+(+(+:+:+(+(+:+:+:+(+(+4+{+[.[.#+W.W.W.U.U.Z.U.U.W.U.U.U.U.U.U.U.U.U.U.U.Z.U.W.W.U.Z.W.W.W.Z.W.W.U.U.U.U.U.Z.Z.U.Z.Z.W.R.U.#+U.#+}.", -"k.U.U.U.U.U.U.U.U.R.R.U.U.U.R.R.U.U.U.U.U.U.U.U.U.R.R.U.U.U.W.U.U.U.Z.L.#+U.U.U.R.R.U.U.U.U.U.R.Z.#+k.v #.%.=.=.=.*.#.#.#.>.#.#.*.>.#.>.*.%.%.#.*.#.*.#.*.#.*.#.*.#.%.#.%.#.#.%.%.#.#.*.#.%.%.#.%.#.%.%.*.q 0 w w x B w A B x B B x B B B B B B B B B B B x B B B B B B x x x x B A B B B B B B B B B B E w x B o 7 Q d.f.f.0.0.0.0.0.0.0.f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.f.0.0.0.0.0.0.0.0.i.0.0.0.0.0.f.d.f.0.0.e.9.2.S T.y+y+y+v+x+B+y+y+v+y+y+y+y+v+x+x+y+y+B+y+v+B+y+y+y+y+y+x+v+y+y+B+y+y+y+y+y+y+y+w+y+B+B+y+y+x+y+y+B+H.m.2+}+}+7+}+}+}+|+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+|+}+}+|+|+}+}+|+}+}+}+}+|+2+9+f+n.4.d+u+k+k+l+d+l+k+d+d+l+l+l+l+d+l+l+d+l+k+d+l+l+d+k+d+d+l+d+k+d+d+l+d+k+d+d+l+d+d+d+d+d+d+d+d+k+h+l+*+R P X ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` P P @.` P M y P.3+:+(+(+:+4+<+(+=+:+:+:+:+=+:+<+:+:+:+=+:+<+<+(+<+:+:+:+=+(+:+:+:+(+:+:+:+:+(+(+:+:+(+:+=+=+:+3+{+[.[.#+`.`.R.W.U.U.U.U.R.W.U.U.U.U.U.U.U.U.U.U.U.U.R.Z.U.U.U.R.Q.R.U.U.U.U.U.U.U.Z.R.`.U.U.Z.R.U.U.U.#+}.", -"k.Z.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.Z.W.W.Z.U.U.Z.U.U.U.U.U.U.U.`.`.U.U.W.U.U.U.U.U.U.U.U.U.#+k.F #.%.*.*.=.=.*.*.*.*.>.>.*.%.>.#.*.=.=.=.*.=.*.=.*.'.*.=.*.=.>.=.=.=.=.=.*.=.=.*.%.*.*.%.*.=.%.'.*.q h w A A B B B B A A A B B A A A A B A A B B A A B B A A B x B B B A B w A B A B B A A A A A w A x B o v Q f.f.d.9.f.9.9.9.9.0.d.9.f.f.d.9.9.9.d.9.9.9.9.9.e.f.f.9.9.9.9.9.9.9.9.j.j.9.0.0.9.e.d.i.0.0.j.e.2.N I.F+z+A+v+y+z+E+y+w+y+z+z+z+z+z+z+z+y+z+z+z+z+z+z+z+y+y+z+w+w+z+z+y+y+w+z+z+z+z+w+y+z+y+z+w+z+z+z+B+H.n.f+9+f+7+}+}+9+9+9+|+9+9+9+|+|+9+|+}+|+|+|+9+9+9+|+|+|+9+|+}+|+|+9+9+|+|+9+|+}+|+|+9+9+9+|+|+2+b+9+C.4.d+u+s+e+e+l+k+k+k+k+k+k+s+k+d+k+s+s+k+k+h+s+s+s+d+l+s+k+s+k+k+d+k+k+k+k+k+s+s+s+l+k+s+s+l+d+k+q+s+*+-.P +.Y Z Z Y Y Y Y Y @.Y Y Z @.Y Y Y Y Y Y @.X +.` X Y Y +.` Y Y Y Y Y @.Y @.` Z @.Y X X @.@.Y X Z P A P.4+4+3+<+:+4+4+:+:+:+3+4+4+:+<+(+(+3+:+:+:+4+:+(+<+3+3+3+:+(+:+3+3+:+(+^+^+3+:+:+:+:+(+(+(+:+4+3+{+[.}.#+.+W.U.W.W.U.U.U.U.U.U.U.U.U.U.W.U.U.U.U.U.W.U.U.U.U.U.U.U.U.U.U.Z.U.U.U.U.Z.U.W.U.U.U.U.U.Z.U.#+}.", -":.#+U.W.U.U.U.W.U.U.U.U.U.#+U.U.U.U.U.U.U.Z.W.W.Z.U.U.U.#+U.U.U.U.U.U.U.W.U.U.W.U.U.U.U.#+U.U.U.U.#+k.m #.%.%.%.*.'.=.=.=.=.=.=.=.=.=.'.=.=.=.=.=.=.=.=.'.&.=.'.=.=.=.'.&.=.=.'.=.=.'.=.=.&.&.=.=.=.%.%.*.q 0 o w A A A A A A A A w A w w w w w w w w w w w E x w w B B A w B w A A A A w A A w A A w A A x z B o 7 Q f.e.e.9.e.e.e.e.9.e.e.e.b.9.d.e.j.e.e.9.b.j.j.e.e.9.e.b.e.e.d.e.e.e.j.e.e.e.j.e.e.d.b.i.0.j.j.j.2.u -+G+E+D+w+z+F+D+D+A+w+E+E+E+A+A+A+A+z+A+A+E+E+E+E+A+A+E+z+w+A+A+E+D+w+w+E+D+E+E+A+w+A+E+A+A+E+E+D+C+D.C.7+9+}+|+9+|+9+b+b+|+b+b+b+9+|+b+9+9+|+|+9+9+b+b+|+9+b+b+9+b+b+9+b+b+|+9+b+9+|+|+9+b+b+9+|+|+7+b+9+N.4.d+q+t+o+e+s+s+s+s+s+t+s+s+s+s+s+s+s+s+k+s+t+s+t+s+s+s+s+k+o+k+s+s+k+t+k+s+t+s+k+s+s+t+s+l+h+k+q+t+*+R P .+. .+.+.+.+.+.+. . .+.Y +.+.+.+.+.+.+. .+.+.X +. .+.+.+.X +.+. . .+.+.+.+.X +. . .+.+.Y +.T X @.A +0+4+(+<+(+4+4+(+:+^+4+4+4+:+:+:+:+3+<+:+(+4+(+:+:+4+(+:+:+(+3+3+(+:+{+_+^+3+:+:+(+:+:+3+:+:+4+4+_+[.}.#+W.W.U.`..+Z.U.U.U.U.#+U.U.U.U.W.W.U.U.U.U.U.U.U.U.U.U.U.Z.U.W.W.U.U.U.U.#+U.U.U.U.U.W.U.U.U.U.#+}.", -"F.#+#+#+W.U.#+#+#+U.U.U.U.U.U.U.#+W.U.U.U.U.U.#+U.U.U.U.U.U.U.U.U.#+U.U.U.#+W.Z.U.#+#+#+#+#+#+U.U.#+k.F #.>.=.%.%.'.=.=.&.=.&.&.=.=.=.=.'.'.=.=.'.'.=.=.&.&.=.=.&.&.=.=.=.=.=.=.'.=.'.=.%.&.=.%.&.&.%.,.%.O h o B B B A w w A A w w A A w A A A w B w A B w B A B w B B A w A B A A A A A A A A A B B w A z x B A m N 9.e.j.e.e.j.f.9.j.e.e.j.e.e.9.j.j.0.j.j.j.j.j.j.9.e.e.e.j.0.f.i.j.9.9.j.j.j.f.f.9.e.d.f.f.0.j.j.2.N T.F+F+D+E+y+F+E+z+E+A+F+F+F+A+A+z+E+A+A+A+F+E+D+z+z+E+F+A+z+z+F+F+F+z+E+F+F+F+A+A+A+z+A+z+E+F+E+F+G+H.n.2+9+b+7+9+9+7+f+9+9+9+f+f+9+9+9+f+f+f+9+f+f+f+f+f+9+9+9+9+}+f+7+9+f+9+f+f+f+f+9+9+7+f+9+9+9+7+f+b+n.y.d+q+h+s+s+t+r+s+k+t+t+t+r+s+r+r+s+t+t+k+s+q+q+t+s+s+s+t+s+q+s+s+t+s+o+k+t+q+t+k+s+t+q+r+s+l+s+q+r+*+R P .+.+.Y Y Z Z X Y +.+.+.X Z Y +.@.Y @.Z +.@.@.@.+.X Y Y +.Y @.+.+.+.@.X Y Z Y Y Y +.Y @.Z X +.@.U d P.p+4+0+6+4+4+3+3+3+4+!+4+3+6+<+3+3+^+_+3+4+4+3+:+6+4+3+3+3+0+4+4+4+3+0+4+3+3+3+3+4+3+3+3+3+3+3+4+_+u.}.#+#+W.U.(+#+U.#+U.#+#+#+#+U.U.#+U.#+U.U.Z.U.U.U.U.#+Z.Z.U.U.U.#+Z.#+U.U.U.U.U.U.U.U.#+#+U.U.U.U.#+}.", -"k.W.U.W.U.W.U.W.W.M.U.U.U.W.M.U.W.W.W.U.W.W.Z.W.W.W.U.W.W.U.M.M.W.W.U.M.W.U.W.W.M.U.U.U.U.W.W.M.U.W.k.m #.>.=.=.=.=.*.*.*.*.=.*.*.*.=.*.=.=.*.*.=.*.=.*.>.*.=.=.*.*.=.>.=.*.=.'.>.>.=.=.*.*.>.*.*.=.%.'.'.q 2 o A B B A w A A A B A E E A A A A I B w B A w A w A w E A A w w A A w A w A w w A A w A A A x z B o v Q f.i.2.2.2.2.0.2.2.2.2.2.2.2.2.2.0.2.2.2.0.0.2.2.2.2.0.2.2.2.2.2.2.0.0.2.2.0.0.0.2.2.0.0.2.2.i.9.2.u >+x+m+y+m+m+y+y+z+y+v+w+x+x+m+x+x+y+x+x+y+v+x+B+y+y+y+y+x+B+y+x+B+y+x+v+y+x+x+v+m+x+y+B+v+y+v+x+x+x+T.C.$+7+7+$+2+7+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+%+%+2+2+2+2+2+2+2+2+2+2+2+2+%+2+2+2+2+2+$+2+7+%+7+}+n.E.~+d+d+d+d+d+d+d+~+~+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+l+d+d+d+d+d+d+d+d+d+d+]+d+]+d+k+d+d+~+d+d+e+d+d+E.w ` U M P P M M P P P P P P P P P ` M P M P P M P M ` M ` P P M ` ` P P M P P P P P M M M M M ` ` M n z P.p+(+<+(+(+3+:+<+<+:+:+(+3+:+:+<+3+_+<+<+<+3+<+<+:+3+<+3+:+<+3+:+3+:+<+6+:+:+:+:+<+<+3+:+<+3+3+<+=+[.}.W.W.W.M.M.U.W.U.W.W.W.U.W.W.U.U.W.W.W.M.Z.W.W.W.W.W.U.W.Z.U.W.W.U.W.W.W.W.W.U.W.W.U.W.W.U.U.W.U.W.:.", -"8 [.[.[.[.}.}.[.}.}.}.}.[.(.}.}.[.[.}.}.}.}.[.}.}.}.}.}.(.[.}.}.(.(.[.}.}.[.}.(.}.}.}.[.}.}.}.}.}.:.J < k q k j k k k q j j k k q j j k k k j m k m k q j m k k j m k q j m k q k q m j k k q k m j q k k j 2 2 h h 3 2 l l 0 h 3 h h h 3 h h h h h 3 3 3 h 3 h 3 h 3 h h h h l 3 h h h 3 h h 3 h h h h h 3 6 y f , N Q s u u u u s u u u u u u u u u s u u u u s u u u u s u u u u u s s u u u u u u u u u u u u u s s = a.I.r.I.x.r.r.I.r.r.r.r.x.x.r.r.r.I.r.r.x.r.x.r.r.r.r.I.I.r.r.r.r.I.I.r.r.x.r.r.r.x.x.I.r.x.r.r.r.r.W L n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.C.L a y.y.y.y.c.c.E.E.c.c.c.c.c.c.c.c.E.E.c.c.c.c.y.c.c.c.c.y.c.4.c.c.y.c.c.c.c.y.c.c.c.c.c.c.c.E.y.y.y.R o n n p i e d d d i p d d d d i p e e d e d d d d i e e d e e p d d d d e d d d d d d d d d d d d p B ; F l.[.a.(.}.}.}.F [.}.a.[.}.[.l.[.}.).a.[.F }.[.[.F l.(.}.(.F }.(.(.(.s._.}.l.l.[.[.F (.l.F (.}.(.k.v 8 [.}.}.}.[.}.(.}.}.}.}.[.}.}.}.}.(.}.}.}.}.}.[.}.}.}.}.}.}.}.}.}.}.[.}.}.}.(.[.}.}.[.}.(.}.}.[.[.w.8 ", -"a.v.u.s.s.u.u.s.u.s.u.s.v.s.s.s.s.s.s.s.s.s.v.s.s.s.u.u.u.u.u.s.u.s.u.s.s.s.u.s.s.u.u.v.s.s.u.u.v.O.F 8 }.:.w.w.k.k.w.w.:.}.k.w.w.}.k.w.w.w.w.}.k.w.w.w.:.w.w.w.w.}.w.k.w.}.:.k.w.w.w.}.w.w.w.w.}.w.w.w.F.:.m q q %.>.q q q q q q q q q q q q q q q q q q q q q q q q k q q q q q q q q q q q q q q q q q q %.%.q 2 3 3 3 3 3 3 ( } 3 3 E 3 3 3 3 i 3 3 3 3 3 3 3 3 3 3 3 3 3 o } x 3 } ( 3 3 3 r p 3 3 3 3 3 3 o o 3 3 2 1 Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q u N Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q u Q Q Q u Q Q Q Q s _.T.r.>+T.T.I.I.I.I.T.r.I.I.T.T.I.I.I.I.I.I.I.I.T.T.I.I.I.I.T.I.I.I.I.I.T.I.I.I.T.I.I.I.I.I.T.-+r.>+s.L C.K.K.N.K.K.C.K.C.C.K.K.K.C.C.K.N.K.C.C.K.K.K.C.C.K.K.C.K.N.K.K.C.K.C.K.K.K.K.C.C.K.K.K.K.C.K.K.K.n.4.E.X.X.X.X.X.X.X.X.X.X.X.X.X.y.B.X.X.X.X.X.X.X.X.*+B.X.X.B.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.*+*+E.I e n c c n c n c n n c c n c c c c c n c c n n n c n n c n c c n c c c c c n n c n n n n n c n n c U } _.I.s.v.s.s.v.s.u.s.s.s.u.s.s.s.u.s.s.s.s.s.v.s.s.s.s.s.s.s.s.v.s.s.s.s.s.s.s.u.s.s.u.s.v.s.s.s.s.v._.", -"v.p+3+4+3+3+p+p+p+3+4+4+4+p+3+3+p+p+3+3+3+p+p+p+p+4+3+4+4+3+4+4+4+p+p+3+p+p+p+p+3+3+p+4+p+0+4+4+p+p+u.[.Z.#+#+.+#+#+#+#+#+#+#+#+#+#+Z.#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+Z.#+#+#+#+#+#+#+#+#+#+#+#+#+G.v q &.&.*.>.*.*.>.>.>.>.*.=.=.*.>.=.>.>.=.>.=.%.>.&.>.>.=.*.=.>.'.*.>.=.*.>.=.&.*.>.=.*.>.#.#.*.'.=.>.0 o A A B B B B E B B B B A A E B B B E B E B B E B B B B B B B B A E B A B B B B B B B B B B B B B y r N i.i.i.j.i.f.j.i.i.0.i.i.0.i.i.i.i.0.i.i.i.i.i.0.i.i.i.i.i.i.i.i.0.i.i.0.i.i.0.i.f.i.i.i.f.i.i.i.e.q T.G+D+G+x+F+G+G+D+G+y+G+G+G+A+G+G+G+G+G+G+G+G+G+G+A+G+G+G+G+A+A+G+G+z+y+F+G+G+G+G+A+G+G+G+A+G+G+D+G+T.h.$+f+f+7+2+2+2+7+7+2+7+7+2+7+7+8+8+7+2+7+2+7+7+7+2+2+2+2+2+2+2+2+2+2+7+7+2+7+7+7+2+7+2+2+2+2+7+b+7+$+A.]+u+s+l+l+s+u+u+l+l+s+l+u+s+s+s+s+u+u+s+u+l+u+u+u+s+s+s+s+s+l+s+u+s+l+l+s+q+l+s+l+l+t+q+l+l+l+r+s+~+-.c P Y @.` Z ` Z ` ` ` ` ` ` ` U Y Y ` ` ` ` ` ` ` ` ` Z P ` @.` ` ` ` ` ` ` ` ` ` ` ` ` ` Z ` ` Y ` y q.p+p+4+4+3+3+p+p+3+p+3+p+p+4+3+p+p+p+4+3+p+4+p+p+p+p+p+p+p+4+4+3+3+p+p+p+3+p+p+3+3+4+p+p+3+3+p+p+1+v.", -"u.0+4+4+:+:+4+4+3+_+(+:+:+4+(+3+4+4+(+(+:+<+(+4+^+_+^+3+^+_+_+4+4+:+3+3+3+:+:+(+:+3+_+3+3+_+:+4+(+p+u.}.W.#+#+R.R.U.U.U.U.U.U.U.W.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.Z.U.U.U.U.U.U.U.U.U.Z.Z.#+w.v q =.=.=.&.=.=.'.'.=.&.&.&.=.=.=.=.'.'.'.'.'.'.=.=.=.'.'.=.'.=.=.'.'.'.=.'.=.'.=.=.=.'.=.*.%.*.=.=.#.0 l w B B x B B B B B B B B B B B E B B B B A B B x B B B B B A A B B B B B B B B B A B B B A B B B E h N i.j.j.j.9.e.9.e.j.9.j.j.j.e.j.i.e.e.j.e.d.b.j.j.9.j.j.9.9.9.9.e.j.j.9.9.j.j.e.e.d.e.e.e.e.d.j.b.e.u H.G+C+z+y+z+C+D+C+A+D+A+E+C+A+D+A+E+D+D+E+E+E+E+A+D+A+D+E+A+A+D+D+D+D+D+D+D+A+D+D+A+D+A+D+A+A+E+C+G+T.n.7+b+9+9+|+9+9+9+9+|+9+9+9+9+|+9+9+9+9+9+b+9+9+9+|+9+9+9+9+|+|+9+9+9+9+9+9+f+9+9+9+}+9+9+f+}+f+b+b+N.3.~+q+t+s+k+s+s+k+k+t+o+s+t+t+e+t+o+k+d+k+k+k+k+k+e+k+s+t+o+k+k+o+s+s+k+s+k+k+s+k+k+k+t+t+k+k+t+t+l+[+-.c Y Y +.Y Z +.+.Z U Z Z Y U U U Y Y Z Z Y X Z X Z Z Z Z Y U U Y Y Z Y Y Y Y Z U Z Y Y Z Z Y Z Z Y U y P.1+^+_+(+<+:+:+:+:+3+3+4+(+:+:+3+3+:+<+:+4+4+:+<+6+4+(+(+(+(+:+4+4+3+3+3+(+3+3+(+:+:+(+4+<+4+3+0+p+u.", -"u.p+4+:+4+(+4+4+3+(+:+3+4+3+(+(+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+:+4+:+(+_+3+:+(+(+4+:+4+u.}.W.`.W.`.U.U.U.#+U.U.U.Z.#+W.U.U.Z.U.U.W.W.W.W.U.Z.U.#+U.U.W.U.U.U.U.U.U.U.W.W.U.U.U.U.U.W.W.U.Z.#+G.m O =.=.=.=.=.=.=.=.=.=.=.=.'.=.*.=.'.=.=.'.'.=.=.=.'.=.=.=.=.=.=.=.=.=.=.=.'.=.=.=.=.'.'.>.#.'.'.=.#.0 l w B B B B B B B B B E A B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B A w A B A B A h N i.j.d.9.9.j.e.j.9.9.9.d.9.j.9.e.e.d.j.e.d.e.e.j.e.j.j.j.j.9.9.9.j.9.9.j.j.9.j.9.e.j.d.e.j.d.9.e.j.u T.E+D+z+z+A+z+z+y+y+z+z+z+z+y+y+y+y+y+z+y+y+z+F+y+y+z+z+z+y+y+z+z+z+y+y+y+y+y+y+B+y+y+z+z+w+y+E+D+G+T.n.}+5+}+|+|+b+9+|+|+|+9+9+|+|+b+b+|+9+|+b+b+|+9+b+9+9+9+|+9+|+|+|+|+9+9+|+b+b+9+9+9+|+9+|+|+7+9+b+9+%+A.~+r+t+k+t+o+o+t+t+k+k+t+o+t+o+s+t+t+t+e+o+k+t+k+o+k+o+t+s+k+o+k+t+o+e+o+s+t+s+o+s+k+s+t+t+k+t+o+t+~+-.c Y +.+.+.Y +.+.+.Y Y Y +.Z Y Y Y Y Y Y +.Y Y Y Y Y +.X Y Y Y Y +.X Y Y Y Y Y +.+.+.X +.Y Y Y X +.P p V.<+(+4+4+<+:+:+:+:+:+3+:+4+:+:+3+3+:+(+:+:+4+4+<+:+4+4+:+:+4+:+<+:+:+:+(+(+4+3+(+:+(+4+4+<+:+:+4+p+u.", -"u.4+_+(+:+_+(+(+(+:+:+{+(+:+:+(+(+<+:+:+=+=+:+:+:+:+(+(+:+:+=+:+:+:+:+=+:+(+:+:+=+_+:+:+:+=+:+<+4+4+u.}.M.`.#+R.R.U.U.U.R.R.U.U.U.U.U.U.U.Z.R.Q.R.U.U.V.v.`.W.U.Z.Q.U.U.U.U.Q.`.U.U.U.U.U.U.U.U.R.W.{+`.#+G.m q *.=.*.%.*.*.*.>.#.%.%.%.*.#.%.#.*.*.%.*.*.%.#.%.*.#.*.*.#.%.*.*.#.%.*.*.*.#.>.%.%.*.*.#.#.%.'.&.>.0 3 B B A w A B A B x B B B B B B B B x B x B x B x A A B B B B A A B B B A A B B B B B A w A A w A A 2 Q i.9.j.9.0.9.j.9.9.d.9.9.9.9.9.9.0.f.9.d.0.i.f.0.0.f.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.d.0.f.0.u H.y+C+w+y+w+y+y+y+y+x+y+x+y+x+y+v+x+x+y+y+x+x+y+y+y+x+x+v+y+v+y+y+y+x+v+x+x+y+x+w+x+x+x+y+w+x+v+A+G+I.h.}+9+f+}+|+|+}+|+}+}+}+|+|+|+|+}+}+}+}+}+}+}+}+|+9+|+|+}+|+|+}+}+}+}+|+|+}+}+}+|+9+}+|+|+}+}+;+|+f+C.3.~+s+k+k+k+k+k+k+k+k+d+k+k+d+k+k+d+k+k+k+d+k+k+k+k+k+d+k+k+k+d+d+h+d+k+k+k+k+k+k+k+k+k+k+k+k+k+t+t+[+-.c @.` Y U U U +.Y Z Z Z Z Z Z Z Y Y Z Z Y Z Y Y Y Z Z Z U U U Y Z Z Z Y Y Z Z Y Z Z Y Y Z Z Y Y Z ` p q.3+:+4+:+<+<+<+<+:+(+<+:+:+:+:+<+:+:+:+:+(+(+<+:+=+:+(+(+(+:+:+:+3+(+:+(+(+:+:+=+:+(+<+<+:+:+<+4+(+u.", -"I.4+3+_+:+(+(+:+_+(+(+{+_+(+:+(+(+4+4+:+:+3+:+3+:+:+:+3+3+:+:+3+:+:+:+:+(+:+:+:+:+(+:+:+<+<+<+<+:+4+u._.M..+`.R.R.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.R.U.U.U.W.`.W.U.W.Q.U.U.Z.U.U.U.Z.Z.U.U.U.U.U.U.U.Z.`.`.#+G.m q *.=.*.#.#.>.*.>.#.#.=.*.*.#.%.%.*.#.%.*.#.#.*.*.*.%.#.*.%.#.*.>.%.*.#.>.%.%.#.*.>.#.>.>.,.'.&.=.#.0 l A B B x B B E B B A B B A B A B B B B B B B B B B A A B B B B B B B A B B B B B A A B A w B A A B h Q i.9.j.9.d.9.9.f.0.f.f.f.9.9.f.0.0.0.0.0.0.0.f.f.9.f.f.f.9.f.f.f.f.0.0.9.f.f.f.0.0.0.0.0.0.0.0.0.i.s I.y+C+w+y+v+z+z+w+w+w+z+z+z+w+v+w+z+z+z+w+w+z+z+w+w+z+y+z+z+w+w+w+z+z+w+w+z+z+y+w+w+w+z+z+w+y+y+E+G+I.7.%+9+f+}+}+}+7+}+}+}+7+}+f+}+}+|+}+7+}+}+}+}+}+9+|+}+9+9+}+}+}+}+9+7+}+}+9+7+}+}+|+9+9+9+}+}+}+b+9+C.p.[+u+k+k+k+k+k+d+k+k+d+l+s+l+d+d+l+l+d+k+k+h+k+k+k+k+d+l+l+d+d+d+l+l+k+k+k+k+h+k+e+k+s+h+l+l+k+k+s+~+K n M @.@.` ` ` Y Z Z Z Z Z Z Z Y Z Z Z Z Z Z Z Z Z Y Z Z Y Y Z Z Z Z Z Z Z Y @.` Y Y Z Z Z Z Z Z Y U p u.6+(+_+:+<+4+(+4+(+4+<+:+3+:+(+(+:+(+:+<+:+:+(+(+:+:+:+3+:+:+3+:+(+:+:+:+3+(+:+:+:+<+(+:+:+(+4+<+0+u.", -"u.4+4+(+:+4+:+4+:+:+4+(+4+(+(+(+(+4+:+4+(+:+3+4+4+:+<+(+3+3+:+^+_+4+4+<+(+:+(+4+:+:+:+:+:+:+:+:+:+4+u.[.W.`.W.{+V.Z.U.U.U.U.U.U.U.U.U.U.U.W.W.Z.U.U.U.U.`..+W.U.W.Q.U.U.U.U.U.U.U.U.Z.U.U.U.U.W.W.U.Z.Z.#+w.v q *.&.=.=.=.=.=.*.%.=.=.'.%.=.=.*.=.%.=.=.=.=.=.=.>.=.=.*.=.=.=.=.%.*.=.=.'.=.=.=.*.=.=.%.%.%.'.&.%.k l w A w w B B B B x B B B B B B B B x w B x B B B B B B B B B B B B B B x A A B B x B A A B A w B B h Q f.9.9.d.f.9.e.f.d.9.f.9.f.d.f.f.f.f.9.f.f.f.9.9.9.9.9.9.f.9.9.9.9.9.9.9.9.9.9.d.f.j.f.f.f.9.f.f.e.u I.y+C+y+x+v+C+A+z+A+A+A+z+E+E+A+C+C+A+E+A+D+E+z+z+A+A+z+z+A+A+A+A+E+A+A+A+A+D+A+A+w+C+E+A+A+A+F+E+G+T.n.7+9+}+9+}+f+9+9+}+}+9+9+9+|+|+9+9+9+|+|+|+}+9+9+|+9+|+9+9+|+|+9+}+}+9+9+9+9+9+|+|+|+9+9+|+}+9+b+9+N.3.~+q+s+k+k+s+s+h+h+k+s+s+s+s+k+h+s+s+s+k+s+h+s+s+k+h+s+s+s+h+h+s+q+h+k+h+h+s+s+k+h+h+r+r+l+d+l+t+t+[+-.c Y Y Y Z ` Z Y Y Z Z U Z Z Z Z Y Z Y Y Z Y X Y Z Y Y U Z U U Y Y Y Z Z Z Y Y Z Z Y Y U Y Y Y Y Y P y P.p+3+4+:+<+:+4+:+:+:+:+4+(+(+(+:+:+4+:+:+4+4+4+<+:+(+:+4+3+<+(+:+4+4+4+:+4+4+:+:+<+4+:+(+(+3+p+4+0+v.", -"v.4+3+4+:+_+4+3+3+{+(+{+3+4+(+:+(+4+:+<+:+:+4+4+:+<+<+(+:+:+:+^+_+4+:+:+:+:+4+:+<+<+:+3+:+:+<+:+:+4+u.[.U.W.W.`.U.Z.W.W.U.Z.Z.#+#+U.U.W.W.U.U.W.U.W.W.Z.W.W.Z.W.Z.U.U.U.W.Z.U.U.W.Z.U.U.U.U.U.Z.Z.W.U.U.#+G.m q =.=.&.&.&.&.&.&.&.&.&.&.'.&.&.&.&.&.&.'.&.&.&.&.&.'.&.&.'.'.&.&.&.'.&.&.&.'.&.&.&.&.&.*.=.'.&.&.#.0 l w B B B B B A A w B B B B B B B B B B B B B B B B B B A A B B B B B B B B B B A A B A A w A B A B 2 Q i.9.e.9.9.e.e.8.9.9.e.e.9.9.e.e.8.e.b.8.d.b.b.9.9.e.e.j.9.d.d.9.j.j.9.9.e.e.9.b.8.8.e.d.8.e.8.e.j.u T.G+C+y+y+A+z+z+z+A+z+z+z+z+z+w+z+z+y+w+w+z+F+z+z+z+A+z+z+z+z+z+z+z+z+w+A+z+z+z+w+z+z+z+z+y+z+F+E+G+T.n.2+9+9+9+|+9+b+b+9+|+|+9+b+b+|+9+b+9+|+|+b+9+b+|+|+9+b+9+b+|+|+b+9+b+|+|+9+b+b+9+|+b+b+9+}+9+9+b+9+N.p.[+u+s+s+s+q+q+s+s+s+s+t+r+q+k+s+t+q+s+k+s+s+s+s+h+s+t+q+q+s+s+s+q+q+k+k+s+s+q+h+k+t+r+q+k+k+s+t+o+~+K c Y +.+.Z U X +.+.X +.+.+.Y +.Y +.+.+.Y +.+.+.+.Y +.+.+.+.X +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X +.+.` p q.3+:+4+4+<+:+4+:+:+:+:+:+4+(+:+4+(+:+(+(+:+4+4+(+(+4+4+:+:+:+:+:+:+:+<+(+:+4+4+:+:+(+4+4+:+:+:+4+0+<.", -"u.3+4+:+_+:+4+4+3+(+:+:+:+3+(+(+3+3+3+3+4+4+4+4+(+(+{+{+0+(+{+0+)+#+0+0+4+:+3+:+a+_+:+3+:+(+:+:+3+4+u.[.Z.#+W.R.W.U.W.W.U.U.U.U.W.U.U..+W.W.U.U.U.U.U.U.U.W.Q.Q.Z.W.W.`.`.U.U.U.U.U.U.U.Z.U.U.U.U.U.U.U.#+G.m q =.=.&.=.=.&.=.*.*.=.&.&.=.=.&.&.*.&.%.%.'.'.'.%.=.>.#.,.%.,.'.*.*.=.=.=.=.=.=.%.%.*.=.>.>.&.&.&.>.0 l w B B B B B B B B B B B y y A B A x A I z B I A y y x y y w x z r A I A w w A A B A B B B B A w w 2 Q i.j.9.9.9.9.e.8.d.f.f.d.9.d.9.d.9.d.0.0.f.9.j.0.f.f.f.d.d.d.d.e.8.d.0.0.9.d.d.d.9.9.9.9.9.9.9.9.e.u H.y+D+z+y+A+z+z+z+z+z+z+z+z+z+z+z+C+w+w+E+E+D+E+E+v+y+y+y+D+D+D+A+E+z+v+w+y+B+z+w+y+z+z+z+w+y+z+C+G+I.m.2+b+f+f+|+|+9+9+|+|+9+7+8+2+}+b+5+9+;+}+9+9+f+}+}+}+|+|+}+}+|+b+b+9+}+2+}+9+9+|+9+}+f+9+|+}+}+|+9+C.p.[+u+s+h+h+h+s+s+k+k+h+h+q+u+k+k+h+s+h+d+u+q+q+s+t+o+o+t+o+l+l+q+q+q+h+k+s+s+h+d+k+h+q+r+l+l+k+t+t+~+-.c @.+.X ` ` Y +.Z U U ` Z Z Z U .T +.+.+.+.U U ` Y U +. .T T T .+. .T T .Y ` ` Z U Y Y Y Y Y Y ` p V.3+3+3+_+<+:+4+:+:+:+3+4+4+3+3+:+:+_+4+{+_+0+0+4+0+0+4+4+{+(+:+4+4+:+a+a+:+3+3+:+:+:+3+3+:+:+:+3+p+u.", -"u.:+:+:+:+(+(+(+:+:+:+:+:+(+:+:+(+(+:+:+=+:+:+:+<+(+{+4+P.v.++@+v. +v.u.4+:+<+<+:+:+:+(+:+:+:+(+(+4+u._.U.`.R.R.U.U.R.R.U.R.W.U.U.U.W..+R.U.W.R.M.M.U.U.U.W.Z.&+Q.U.Q.Q.#+ +U.U.U.U.Z.U.Q.Z.U.U.R.R.{+V.#+k.m q *.&.=.*.*.*.*.=.&.*.=.&.=.=.'.&.*.=.=.,.,.#.#.q k q k O O O %.>.*.%.*.%.*.=.=.*.=.*.*.*.%.=.&.&.>.0 l w A A B w B B B B y y B x A w I I w I w I w A I w I w A I I w w I I w w l w A A x x B B B B B B B 2 Q f.f.j.9.d.9.d.d.0.0.0.d.d.9.0.8.e.9.0.0.|...N N N N Q 2.5.5.i.j.9.0.0.f.8.8.f.0.9.9.9.9.9.d.9.9.e.u H.z+A+z+w+w+w+w+z+w+v+w+w+z+w+w+w+y+w+w+v+x+m+>+'+T.T.1+x+x+x+y+y+w+A+C+v+B+y+w+w+w+w+y+w+w+w+y+C+G+T.n.2+9+}+}+|+|+}+}+}+}+}+}+7+}+|+|+|+9+f+7+8+&+N.N.N.N.N.2+&+2+}+}+|+|+7+}+}+9+}+9+|+|+|+9+}+;+|+9+f+N.3.~+u+h+k+k+k+k+d+l+d+k+l+d+h+k+k+h+h+d+d+d+d+k+d+E.X.E.X.A.E.E.k+r+q+k+k+d+l+h+k+k+k+k+k+d+d+k+k+k+[+-.n ` .+.Z ` Y +.U U U @.` Z U Z U ` M M M n e n n e e M M M ` P ` Y U U U U Y Z Z Y Y Y Y Z U Y Y ` p u.a+<+{+<+:+:+:+:+=+(+(+:+:+:+:+(+{+{+_+{+1+ +P.u.v.P.++{+0+3+1+(+(+(+:+<+<+<+(+:+:+:+(+(+:+:+:+_+3+u.", -"I.4+_+:+(+_+(+:+:+:+:+:+:+:+:+:+:+:+3+:+=+:+:+:+(+{+:+s.+ . + + $ & @ , 4+(+:+a+:+:+:+:+3+:+:+:+3+3+u.[.W.U.W.W.R.W.W.W.U.U.U.U.W.++++k.f f f f f f f f f f f f f f f ; f f f f }.U.W.U.U.U.W.U.Z.U.`.`.#+G.m q *.&.&.=.=.=.*.*.*.*.*.=.=.>.#.%.%.%.O j < , = = = = = , = , j O #.>.*.%.*.=.*.%.*.*.=.>.#.'.&.&.>.0 o A B x B B B B B B A A A ; ; * ; * ; * @ ; @ ; % ; ; % { ; * ; * * ; ; * * 3 w A x y B B x B A w A h Q i.9.d.9.d.f.9.d.f.d.d.d.9.e.9.j.i.Q N : , = $ $ $ = , , , 1 u ..i.0.f.d.8.9.0.0.9.9.j.j.j.f.9.9.e.u H.y+C+y+y+v+z+y+z+z+w+y+y+y+v+w+v+x+1+T.a.[ - . . > > - ^ W x.-+x+x+y+w+D+z+w+y+w+y+z+z+w+w+w+z+A+G+T.n.2+9+9+|+|+}+}+|+}+}+}+9+b+|+}+}+2+$+C.7.5 ) ) ) - ) ) / 5 L &+f+}+9+|+|+9+9+9+|+}+|+}+9+}+}+}+b+9+N.p.[+u+h+h+k+h+h+h+k+k+h+h+h+h+d+h+h+h+u+h+k+k+l+E.) # & * ) & % E.l+l+k+k+h+s+h+d+k+h+k+s+l+d+k+t+t+~+K n P +.X ` ` ` +.Z U Y Y U U Z Z n n d } ; ; ; ; ; * ; ; ; ( i B d ` ` ` Y +.+.Z U U U U Y Z Z U Y ` p u.p+_+_+(+<+:+<+4+<+:+<+:+:+{+(+4+:+u.H > $ + . . $ $ @ , 7 [.O.0+{+{+:+^+^+a+(+:+:+:+:+:+:+(+4+:+4+u.", -"u.4+^+:+(+:+_+3+3+:+:+:+:+:+:+:+:+:+:+:+(+4+4+:+4+0+u.$ + . $ + + + + , 0+0+:+:+:+:+:+:+:+:+:+:+:+p+u.[.U.#+.+W.Z.U.U.U.U.U.U.U.U.U.#+k.@ . + + + . + + + + + + + + + @ + + + . }.U.U.U.U.U.U.U.U.U.U.U.#+w.v q =.&.=.=.=.*.*.=.&.&.=.=.*.*.*.>.#.k , @ + + + - + + . % $ $ = = j O #.*.=.=.%.*.=.=.=.*.%.'.&.=.#.0 3 B B A A B B B B A I I l ; & @ + # + $ % % @ % % + @ % @ @ @ @ @ % & * & * 3 w A B B B x B B A A B f Q i.j.j.9.d.f.j.9.d.d.f.8.e.9.j.|.Q 1 : $ + . - - - - . + + $ + , 1 s 5.j.b.j.0.0.9.9.j.f.j.9.j.9.e.u H.G+A+y+y+C+z+z+y+w+y+z+z+z+x+x+x+T.9 $ + @ % & % & % - . . . > W '+y+w+C+z+z+z+w+y+z+z+z+w+y+F+C+G+I.m.2+b+9+}+}+|+}+}+|+}+}+9+|+}+7+$+n.5 + ) . . + @ + $ . . - ) / C.2+2+|+5+}+|+9+|+|+9+|+9+|+}+|+b+9+C.3.~+u+h+h+k+k+h+h+h+k+h+h+s+s+k+h+h+h+q+s+s+l+X.b . = = # . $ % B.l+l+k+k+h+q+h+k+h+h+s+h+l+d+e+o+s+[+-.c Y .+.Z ` Y +.@.Y Y +.@.U ` M ' ' ; % % % - # - . - . @ @ % . ( e M P @.Z Z U Z Z Y Z Z Y Y Y Y P B q.a+<+_+(+:+4+:+4+:+:+:+(+:+{+(+s.~ + $ $ + # . . . . . + + . = <.<+{+^+<+6+_+:+:+:+:+3+:+:+:+:+4+4+u.", -"v.4+4+:+:+4+(+3+3+(+:+:+(+3+:+:+(+4+4+:+:+(+(+4+4+u.@ + . + + . . + + ~ 0+4+4+<+:+:+:+:+:+:+:+3+:+4+u.[.W.#+W.W.Z.U.U.U.U.U.U.W.W.U.Z.J . . . . . . . . . . . . . . . . . . . . }.U.U.U.U.U.U.#+U.Z.Z.U.#+G.m #.=.=.&.=.*.=.=.=.&.=.=.'.=.%.>.#.j = $ - . . - - . . . % # . $ + = < q *.'.'.%.*.=.'.=.>.#.'.&.&.>.0 l w B B A w B B B B I z I & . . - - + + # . # . # + . # # . . . . . + + # % 2 A A A B B B A A A A w h Q f.9.e.d.f.d.9.j.9.9.j.e.e.i.Q D , $ + . . - # @ @ @ # # @ @ @ @ $ 1 N i.e.j.f.0.9.9.j.f.9.9.j.j.e.u H.y+C+z+y+w+w+B+G+z+y+G+z+A+y+m+W + + + @ * ; * & % % @ @ @ % % + _ T.x+z+G+F+z+y+z+z+B+z+z+y+F+C+G+T.m.2+9+9+9+}+7+f+9+|+|+}+b+b+7+%+7.- . . . $ + @ $ . + + $ @ @ - / 5 2+|+|+9+9+9+9+9+9+9+9+}+}+7+b+9+N.3.~+u+s+k+k+h+s+s+h+h+h+h+s+s+k+k+h+s+t+k+k+d+R . + , = + . $ + B.o+t+k+h+h+s+s+h+h+h+t+s+s+l+k+t+t+[+-.c Y +.+.` ` U U Z Y +.+.+.` n d * % % # # - - - . + - . . . . . * ; d M M P Y +.+.Y Y Y Y Y Y Y Y ` p V.3+_+_+{+1+4+:+:+:+4+:+(+3+,+).$ $ + + . + + . . @ @ @ @ . . + $ F O.0+4+4+4+3+(+:+:+:+3+:+<+4+:+3+u.", -"u.4+3+4+(+:+:+4+4+:+:+3+3+3+:+^+(+:+4+(+:+(+4+p+=+9 + $ @ . + . + + + { 0+0+0+4+<+:+:+:+3+:+:+:+3+p+u.}.U.#+.+W.U.U.W.W.U.U.W.Z.Z.Z.U.:.. . . . . . . . . . . . . . . . . + . . }.U.U.U.U.U.U.U.U.U.U.U.#+G.m O =.&.=.*.=.=.*.*.*.=.=.'.%.>.O < $ $ & . . . . . . . . - . . . $ $ @ , #.=.=.=.=.=.%.=.>.#.'.&.=.#.v f w B B B B B B B B z I I % @ . - . . . . . . . . . . . . . . . . . . + @ % 2 I A y B x B B B A w A 2 Q i.9.9.d.d.d.9.j.9.9.j.j.i.0.N > . + - . @ $ $ @ + $ @ @ @ . @ # . + : ..i.j.f.0.f.9.j.j.9.f.9.9.e.u H.G+C+z+y+w+z+z+y+z+z+z+z+A+j+[.@ + % % & % % # # @ . - . @ % % . . [ -+x+y+D+z+w+z+z+y+z+z+y+F+C+G+T.h.2+b+9+9+9+9+f+9+|+|+}+f+f+$+L - . @ @ @ $ + . . . . + @ % % @ + ) 5 2+f+9+9+9+9+9+9+9+9+}+}+9+b+b+N.p.[+u+s+k+k+h+s+s+l+d+h+s+s+h+d+k+h+s+o+o+l+y.5 . + = + - - + - E.o+o+s+h+s+s+s+h+h+h+q+q+l+l+t+o+t+~+-.c @.+.X ` U Y +.` U +. .Z M ( ; # $ @ . . . . . . . . . . + . . @ % ' e M P X +.+.Y Y Y U Y Z Z Z ` p q.a+a+_+(+<+4+3+4+(+<+:+3+:+_.+ + . . + . . . @ @ . . # . - @ @ . + 7 !+0+4+4+:+:+:+3+3+3+:+:+:+<+p+u.", -"<.p+_+(+:+_+_+_+(+:+:+:+(+(+:+(+:+:+(+:+=+(+4+P.H + + . . @ @ @ @ + + ~ 0+{+4+(+:+:+:+:+:+:+:+:+:+4+u._.Y.W.`.U.U.U.U.U.R.R.U.U.U.Z.M.8 . + + . . . . . . . . . . . . . . + . + }.U.U.Q.W.U.U.U.U.W.{+V.`.k.m O =.=.*.=.=.=.=.*.*.*.=.'.%.>.m = $ @ % $ @ . . + $ @ $ . - . - . . $ + j *.=.=.*.=.=.=.>.#.=.&.&.>.3 l w B B x B B B B B B B w % @ . . . . . . . . . . . . . . . . . . . . . . @ * w w A y B B B A A E B 2 Q i.9.9.d.d.9.8.9.d.0.9.0.0.N : + . + - # @ + $ = = = $ $ + . @ . . # + 1 2.j.d.d.9.d.9.9.d.9.9.9.e.u H.y+A+y+w+w+z+w+w+w+y+z+w+A+x.- + @ % % @ # @ . . . . @ $ + # # @ $ . g '+y+D+w+w+w+z+y+w+w+w+y+A+G+T.n.2+9+9+}+}+}+}+|+}+}+|+|+f+C.) . $ $ @ @ . . - - . % - # % % $ = . ) m.&+}+9+|+|+|+|+}+|+}+}+|+9+f+C.3.~+q+l+d+d+k+l+d+k+k+d+k+k+h+k+d+k+k+o+X.R & % @ . + @ - - $ . E.e+e+d+k+h+k+k+k+k+d+k+s+l+l+k+k+s+~+K n P +.X ` ` Y +.` +.T +.` d * @ . + # @ $ @ @ @ % % @ @ @ @ # . . - & ( e P +. .X Z U Y Y Z Z Z Y ` p q.a+<+_+(+:+:+3+:+:+:+:+:+s.{ + . . . @ @ % @ . . . . + . . @ @ @ @ + }.4+1+<+^+:+:+:+(+:+:+:+4+:+3+u.", -"u.p+(+:+(+(+(+(+(+:+:+:+<+^+^+:+:+:+4+(+:+1+=+C + + + @ $ @ . @ @ . + ~ 0+0+4+(+:+:+:+:+:+(+:+(+:+4+s.[.W.#+W.W.R.W.U.U.W.Z.U.U.U.U.w.{ . + + . . . . . . . . . . . . + . . . + }.U.U.Z.U.U.U.U.U.U.Z.`.#+G.m q *.&.=.=.=.*.*.=.&.=.=.'.%.q , $ % @ @ $ $ $ < m O O j + . . . . . . @ : ,.=.*.%.*.%.*.*.*.&.&.&.>.0 l w B B x x B B B B y B I & @ . . . . . . . . . . . . . . . . . @ @ . . . . ; w A y y B x A w B A A 2 Q i.9.j.9.0.f.9.9.d.f.0.f.|.1 = + . . . # + = < t v.l.| , + . - - - . @ , u j.8.8.9.9.j.9.9.9.9.9.b.u H.z+C+y+y+w+w+y+y+w+v+z+w+m+W + + % % @ . . [ a. +1+ +W + + + - @ % % . W x+E+y+w+y+w+z+z+w+B+y+E+G+T.n.2+9+9+}+}+|+9+|+}+}+|+7+$+L - + = % & % - . - ).J 5 . @ - @ $ = $ . / &+|+9+|+|+}+}+|+}+}+}+}+|+f+N.p.[+u+h+k+k+h+h+h+h+k+k+h+l+h+k+h+h+s+X.R { $ , $ . - # @ @ $ @ B.d+t+k+d+h+h+k+d+l+l+k+k+l+d+k+t+t+[+-.c @.+.X P ` Y +.` Y .+.M ( . - . + . # @ $ * 2 2 * ; & % & % $ @ - # ' d P +. . .Y Y Y Y Y Y Y Y ` } q.6+<+_+(+1+:+:+<+4+:+4+:+^ + . @ # @ @ % ' u.=+Z.w.8 @ + + @ % % . . F 1+4+4+:+:+:+:+:+:+:+:+(+3+p+u.", -"v.p+3+4+(+:+{+4+(+:+:+:+:+(+:+:+:+:+4+4+(+3+u.+ @ @ @ @ $ . . . @ $ . ] 4+4+(+3+:+:+:+3+3+(+:+3+:+4+u.[.W.#+.+W.Z.W.Z.Z.U.U.U.Z.W.#+}.@ + . + . . . . . . . . . . . . . . . . . J W.W.U.U.U.U.U.U.U.U.U.#+G.m q =.&.&.=.=.=.=.=.=.&.=.'.#., . + # . - % % < O >.O =.*.< % . . . . @ + | q *.>.*.*.*.*.*.*.&.&.&.>.0 l w B A A B B B B A w w l ; % * % % % % % % % @ % @ % % % @ . . # # . . @ * h B B y y B B B A A A w 2 Q i.e.e.0.0.f.8.5.j.9.e.d.i., . . @ @ @ - $ s 2.i.i.i.i.u , + # @ $ # - $ 1 j.e.d.9.9.9.9.d.9.9.d.e.u T.y+D+z+y+w+G+z+z+y+z+E+x+<.$ . @ @ % % @ + x.y+y+v+x+B+I.. @ . . @ @ + ] -+x+z+w+z+z+z+z+z+z+z+C+G+T.n.2+b+9+}+|+9+}+7+}+9+9+2+m.) @ + $ + @ @ . L ;+%+%+$+m./ . . + . + + - J }+9+|+|+}+7+}+b+9+|+b+b+f+N.y.~+u+s+h+h+h+s+s+k+h+q+q+o+o+n+n+X.c.{ - + + $ + . . . # # + + E.k+t+k+h+h+h+s+h+h+h+r+s+l+d+t+t+q+~+-.c Y X +.P ` Y .T .+.M d * @ - & @ @ + % ' e P M M M } ; * @ + % @ . % ( M Z +.+.Y Y Y Y Y Y Y Z ` p V.a+3+(+(+<+4+:+4+(+:+3+s.= + + + + + + = k.3+a+1+:+O.4 + $ @ % @ . . [ P.4+4+:+:+:+(+:+3+(+:+:+:+4+u.", -"/.p+4+3+:+:+(+3+3+(+:+3+3+3+(+(+:+3+4+(+{+q.= . @ % % @ + . . . . $ . { 0+3+<+3+:+:+:+3+3+:+(+(+3+4+u.[.Z.#+.+W.U.Z.W.W.U.U.U.W.W.#+:.@ + . . . . @ 8 :.(.(.}.(.}.J }.w.}.(.}.(.w.U.U.U.U.U.U.#+U.U.Z.U.#+G.m O =.&.=.=.=.=.=.=.&.=.=.%.j $ . @ . . . % # j '.>.%.%.=.m = $ $ < , < : j q *.*.*.*.*.=.*.%.&.&.&.>.0 l w B B B B B B B w A I A 2 2 2 2 2 2 2 2 2 2 f 2 f 2 2 * @ . . . . @ % % l w B y B x B B x B A A A h Q 0.j.d.f.0.d.8.i.i.9.e.j.2., - . @ % @ + $ N e.f.f.d.j.5.: . @ % $ # - @ : i.j.d.9.9.9.j.9.9.9.9.e.N H.F+C+z+B+z+z+z+z+z+A+A+y+H @ @ @ . @ % @ a.y+D+z+v+x+y+m+W # . . @ & . . W x+z+w+z+z+z+z+A+y+y+C+G+T.n.2+b+9+|+|+|+}+f+}+}+9+2+4.@ + + $ @ @ @ / N.9+9+}+2+$+5 + . . . . - . / }+b+9+9+2+2+}+b+|+7+b+5+7+J.A.[+u+s+k+h+h+s+q+h+k+d+s+t+e+y.c./ ) @ . + . + + . - . . . $ + E.k+s+k+h+h+s+h+h+h+k+q+q+k+k+s+r+q+[+-.c P X X @.` Y +. .+.` M ( % - - @ @ @ - * e M X Y Z M n ' % @ . % @ . # ( n Z X Y Y Y Y Y Y Y Y X U p q.a+a+4+:+<+3+_+3+:+(+:+D $ + + + . + + v ,+6+a+<+4+0+[.+ $ % @ . . . ^ s.4+4+3+<+:+:+3+3+(+_+4+4+p+u.", -"u.4+4+3+(+{+_+3+3+:+:+3+3+:+:+:+4+4+(+0+u.^ + + $ + @ @ . . . . - @ . ~ 4+:+:+:+:+(+:+3+3+:+:+3+:+4+u.[.W.W.W.W.U.U.U.U.U.U.U.U.U.U.:.. + . . . . @ ).U.M.R.W.M.U.U.M.U.U.W.U.R.Z.#+U.U.U.U.U.U.U.U.Z.U.#+F.v q =.=.=.=.=.=.*.*.*.*.=.#.m @ @ # . . # @ , >.%.%.,.=.'.%.O O j O j #.,.'.=.=.*.=.=.=.=.%.%.'.&.&.>.A o w B B B B B A B A A w I w w w I I A w w w I I l I I f @ . . . + . @ * l I w A B B B B B B B B A w f Q i.e.d.d.0.f.d.i.0.0.j.j.N = - . # @ @ + , Q j.d.8.8.d.2.: + # @ @ . - + 1 0.0.d.9.9.9.9.9.8.9.9.e.u H.y+C+y+y+z+y+z+y+B+F+E+m+9 . @ @ . + $ - H.G+G+z+y+y+A+E+T.. . . # % @ . [ x+C+w+z+z+z+z+z+z+z+C+G+T.n.2+b+9+9+9+9+9+9+|+}+9+%+L . . + $ @ @ . L 8+f+|+}+7+7+n.+ . . + - - . . N.}+9+9+f+7+f+b+|+}+|+b+9+C.p.[+u+s+k+k+k+s+s+k+l+u+l+~+6.& & - - = @ . + + + . - . + . + + E.k+t+k+h+s+s+h+k+k+q+h+t+n+l+h+u+r+~+K c ` +.+.@.` X +.Z U P M ( * @ # . . . % * n ` .+.+.` M } * @ . @ @ . . ; e P @.Y Y Y Y Y Y Y Y X ` p F.a+_+_+(+<+_+(+:+_+:+p+=+O.v.J F 9 + . k.)+3+3+:+0+0+[.+ @ @ . . + + 4 O.4+<+:+:+<+3+3+:+(+^+(+4+p+u.", -"u.4+3+:+:+(+(+3+:+:+:+(+:+(+:+:+(+0+0+O.4 + + . + + + = 8 . . . . . + ~ 0+:+:+_+:+:+:+:+:+:+:+:+:+4+s.[.W.`.U.U.U.U.U.U.U.U.U.U.U.Q.J . . . . . . { }.Z.U.U.#+U.U.U.U.U.U.U.R.`.U.U.U.R.W.U.U.U.R.R.Z.U.#+w.m q =.&.=.=.=.=.*.=.=.*.=.>.| + @ @ . . # $ | %.,.%.%.%.=.,.#.*.%.%.=.'.&.&.=.#.>.*.%.=.=.%.%.'.&.=.#.0 3 w A B B B B B B B A w A A w w I I B A B A A w w I 3 * @ . . . @ @ * 2 I w w w y p B B B B A A A A 2 Q i.e.e.0.f.f.b.9.9.9.9.j.Q , - . . . # + = ..i.9.d.8.j.Q : . - - @ . - = u 0.0.0.d.9.f.d.d.d.9.9.e.u I.F+A+y+y+A+y+D+w+v+E+E+>+[ . @ @ . + @ > H.y+w+w+v+w+D+E+'+> # + + @ @ . - T.z+w+w+z+z+A+w+w+z+A+G+I.n.2+9+9+}+}+}+}+}+}+}+b+m.{ - . + + # @ - m.7+|+|+}+f+2+%+. + . - . . . . C.}+9+}+}+}+}+|+}+}+b+b+f+N.y.~+q+h+k+k+h+h+k+k+k+d+l+~+R % % @ + , $ @ @ + @ + . . - . $ + E.k+s+s+k+k+h+k+k+k+h+k+s+k+e+k+s+s+[+6.c Y +.+.Z ` Y +.@.Z P M } ' ' ' % % % * } M Z T T .Y P i ; @ @ @ + @ @ ; d ` @.@.Y Y Y Y Y Y Y Y ` y P.p+^+_+(+:+(+:+:+(+(+:+(+4+_+{+=+=+O.s.1+4+(+(+4+4+)+8 + + @ @ @ . # 4 v.4+:+:+:+:+:+:+:+:+:+4+<+p+u.", -"v.<+{+(+:+(+:+{+(+:+(+(+^+(+:+:+(+0+{+F + + + . + + 9 s.J . + + @ $ . { 4+:+:+^+:+:+:+:+:+:+:+:+:+3+u._.Z.`.U.Z.U.U.U.U.R.R.U.U.U.M.8 . . . + + . { M.`.Z.w.w.w.w.w.M.R.#+Q.R.U.U.U.U.R.W.W.U.U.Q.R.U.U.#+G.m O =.&.=.*.=.=.=.=.=.=.'.q , @ @ + . . + = j ,.,.%.#.q q q j q #.#.=.=.&.=.*.*.*.*.*.=.=.%.*.=.&.&.>.0 l R x B B B B A B B B B B B w w w A B B A B A A w w * % @ . . @ @ @ f w I w A B B y B B B B B A B B 2 Q i.b.e.0.d.f.8.9.d.d.f.0.i.1 @ # . . + $ $ s 5.0.f.9.5.t = . - . . . + : u f.f.d.9.9.9.9.9.d.9.9.8.u H.y+E+w+y+w+y+A+z+w+z+D+>+_ . # @ . . + ~ I.G+z+w+v+w+w+E+'+_ # + + @ @ . { x.z+w+w+z+z+z+w+z+F+E+G+T.n.2+9+9+|+}+}+|+9+}+}+b+h.@ . + + + + + / C.7+|+|+}+|+f+2+@ - . - . . . + L 7+}+b+|+7+|+|+|+}+|+b+9+N.3.~+q+s+k+k+k+h+h+k+k+k+k+[+c.% # $ $ = % @ / % # . @ . . . $ @ B.e+t+k+k+k+h+h+k+k+k+s+s+k+k+t+t+s+~+-.c P +.+.@.` Y +.Y U X ` n n n e e e e d e M Y +. . .X M ( % # $ @ . # @ ' n @.@.` Y Y Y Y Y Y Y Y ` p L.a+^+^+:+<+_+:+(+(+:+:+_+:+<+<+:+4+4+:+<+(+0+0+0+)+}.@ . . # @ @ @ > _.^+3+:+:+:+:+:+:+:+:+:+3+:+p+u.", -"u.4+0+:+:+{+(+(+(+:+:+3+:+3+:+:+0+!+/.+ + + . # @ ~ u.++:.. . + . @ . { 0+4+<+:+:+:+:+:+:+:+:+:+:+4+u.[.W.#+W.W.R.W.U.U.W.Z.U.W.#+w.{ . . @ @ + . { w.].8 { { ~ { { f 7 G.@+U.#+#+U.U.U.U.U.U.U.R.W.Z.U.#+q.m O =.&.=.=.=.=.=.=.=.=.=.O $ # % @ + + . + j #.j | , , = , , ' | j O #.%.=.=.=.%.%.=.'.'.=.*.=.&.&.>.0 l I B A A B B B B B B B B B B B A A y y B A A B w 3 % # . . . @ @ { l A A A A x x B B B B x B A A B 0 Q i.j.d.f.0.f.8.j.d.f.f.e.0.s , # + @ @ @ @ , u Q 5.5...: + . . # . . + : Q f.f.d.9.9.9.9.9.9.9.9.b.u H.F+C+w+y+C+y+C+E+y+E+E+>+_ . # @ @ . @ ~ T.F+z+w+v+y+E+D+'+@ # . + @ & @ - W A+w+y+z+z+z+w+z+z+C+G+T.n.2+b+9+}+|+|+}+7+}+}+b+m.. . . . + + + / N.f+b+|+}+b+9+;+< . - - . . . $ L 2+}+b+|+}+9+9+}+}+9+5+9+C.4.~+q+k+k+h+h+h+k+h+k+s+t+~+6.@ % + @ % @ ! y.R @ # $ . + . $ . E.t+t+k+k+s+s+h+k+k+k+s+q+l+k+s+t+u+[+R n Y +.+.@.` X +.Y +.+.+.` P P Y X X ` P P P Z U Y @.` e ; @ . @ @ @ . % } M Z Z Z Y Y Y Y Y Y +.Y ` p q.a+4+^+:+<+(+4+3+:+_+3+4+4+<+3+:+:+(+:+<+3+O.O.}.8 $ . . . . . + + , P.4+3+3+:+:+:+(+:+3+:+:+4+4+p+u.", -"x.4+4+4+:+_+(+4+4+:+:+:+3+3+:+:+@+].= . + + @ @ ~ <.0+)+F + + @ @ . + ~ 4+:+:+3+(+:+:+3+3+:+:+3+:+p+u.}.U.#+.+W.Z.Z.W.W.Z.U.U.Z.#+}.@ . + . . . . . { > . . . + . @ % $ $ a w.#+U.#+W.U.U.U.U.W.U.U.Z.U.#+G.m q *.=.=.=.=.=.=.=.=.=.*.j $ @ . @ $ + . . v j | = % @ @ @ @ & @ $ , j #.%.=.=.=.&.'.'.&.=.*.&.&.&.>.0 l w B A A B B B B A z B B p x x B B y x B A z A ( ; @ . . . . @ & h A A A B B B B B B B B x B A A A 2 Q i.9.d.0.0.f.d.j.0.f.d.b.j.5.u = + $ @ . . $ , ^ : : : = . . @ @ + $ , u j.e.9.f.b.9.9.9.9.9.9.e.j.u H.y+C+y+y+z+y+A+z+y+z+A+>+9 @ @ @ + @ % @ x.F+E+w+v+y+z+E+'+# . . . @ % % . 4 A+w+z+z+z+z+z+z+F+C+G+T.m.2+b+9+}+}+9+9+f+}+|+5+n.@ $ @ . . . + / $+f+b+}+|+9+b+|+L # . . . . + + 5 8+f+|+|+b+9+9+}+}+b+5+f+C.A.[+q+s+k+k+s+h+s+s+k+k+s+[+R + & + . / 4.X.[+y.# % $ . - . + # E.k+s+k+h+s+s+s+h+h+h+q+q+l+d+h+s+u+[+6.n ` .X ` ` Y +.Y Y Y +.Z @.X T .G Z @.Z X +.+.@.P e ( % . . @ @ @ @ ; d ` +.X Z Y X +.Z Z Y Y X Z r q.6+a+_+{+<+_+4+{+(+_+4+:+(+:+(+3+4+:+<+:+1+F ~ ~ + + + . + + + . 4 P._+3+<+3+3+:+:+:+3+3+(+:+4+(+0+u.", -"s.0+4+4+(+(+:+3+:+(+:+3+3+3+:+3+u.~ + + . . @ * }.:+4+)+J + + @ $ @ . { 4+4+<+^+(+:+3+4+3+:+:+3+:+p+u.[.Z.W.W.W.U.U.#+W.U.U.U.Z.#+}.. . . . . + + . . + . . . . . @ @ . + @ ! w.U.U.U.U.U.U.U.W.W.U.Z.U.#+w.v q *.&.=.=.=.=.=.=.=.&.>.m $ @ # . @ $ + - 8 , = $ % # % - % . @ - $ , j *.=.=.=.=.'.'.'.=.=.&.&.=.#.0 l w B B x B B A A B p B B y x B B B A A w I A w ' ; @ . . . . & l w A y y B B B B B B B B B B B A w 2 Q i.d.e.i.0.f.8.9.f.9.8.8.e.i...9 $ $ @ - - . @ - - $ + @ # # @ $ + + C |.j.b.d.f.d.f.e.9.9.9.j.d.e.u I.F+C+y+y+C+z+z+F+y+E+E+x+9 . @ @ # % * @ W v+D+A+y+B+G+w+x.. . . + # % & @ > A+z+z+z+z+z+z+z+z+C+G+T.n.2+b+9+}+|+|+}+f+|+|+}+L % % + . . . . / %+9+9+}+f+b+5+|+:.@ - . . . + $ ) &+f+b+b+9+f+9+9+f+9+b+9+C.p.[+u+q+k+k+s+s+s+s+k+k+k+e+4.@ @ . J y.X.o+o+A.. % = $ . . $ + E.k+t+k+k+h+q+s+h+h+h+q+q+l+e+t+q+q+~+-.c U .+.` ` Y +.` U Z Y Z Z .T @.Y ` Z Z T T T ` e ( * . . . $ % @ @ ' e ` +.+.X Y Y Y Y Y Y Y X @.y u.a+^+_+(+<+(+{+4+(+0+4+3+4+:+{+4+4+4+(+4+=+4 + + + + . - . + @ ).V.p+0+4+3+3+:+(+(+3+3+3+(+:+:+4+4+u.", -"u.4+(+(+(+(+:+(+6+:+:+:+3+)+,+P.4 @ + + + $ + J {+6+(+=+F . + @ @ @ + ~ 6+:+:+^+(+(+:+:+:+:+(+(+:+4+s.[.M.`.W.W.R.U.#+W.U.U.U.U.U.J . . . . . + + . . + . . . . . . . . + . # { w.U.U.R.W.U.U.Z.U.R.Z.U.#+w.v q =.&.&.=.=.=.=.=.=.=.>.m $ # # . + $ + . . + + $ @ @ # - @ . @ . + $ $ j #.>.%.=.'.=.=.*.*.=.&.&.>.0 o w B B A B B A B x y B B A B B B B w w A x A ; % # # @ @ . @ ; A A A y y B B B B A A B B B B A B B 3 Q i.e.e.f.9.9.d.0.0.9.8.8.e.5.5.t D = @ # . . + . . . . . @ @ = = , t ..i.j.b.d.d.d.f.9.9.9.9.9.9.j.u H.F+A+y+y+z+w+z+z+y+w+y+y+a.> # @ @ # % % % a.x+G+y+x+g+r.[ + # @ + @ @ @ @ > A+w+w+z+z+z+w+z+w+A+G+T.n.2+b+|+|+|+}+}+}+}+9+%+5 @ @ . . . . + / %+9+|+|+}+|+|+}+F . . @ . . + $ - 2+|+|+7+}+b+9+}+}+|+b+9+N.3.~+u+h+h+l+k+k+k+k+k+l+l+~+c.b c.X.X.d+~+t+e+y.. @ @ @ + . $ + E.k+t+k+k+h+h+k+k+d+l+s+s+l+n+t+t+s+[+-.c @.X +.` ` X +.@.U Z Z Z Z @.+.M Z @.G +.Y ` @.r ' * * & @ . . . @ ; i M @.+. .+.U U Y Y U Y Y Y ` B u.a+^+^+:+<+:+^+:+:+:+:+:+3+:+(+3+:+(+(+:+v.7 . + + + + . # # @ J V.)+0+{+{+{+:+:+:+(+:+(+:+:+:+4+3+u.", -"v.4+:+(+(+(+:+{+6+<+:+(+4+0+Q.4 + + + + $ + F =+4+<+:+=+F . . - . $ + ] 3+:+:+^+:+(+:+:+(+:+(+(+:+4+s.[.W.#+Z.Z.R.W.W.U.R.M.Z.#+W.J . . . . . . . . . . @ % + . . . . . . . . . 8 U.U.R.U.U.U.U.R.Z.Z.U.#+w.v q =.&.=.=.=.=.=.=.*.=.*.j + # - + . + . . . + + = = = + @ @ # . . + + . , j >.%.'.'.=.=.#.>.=.&.=.#.0 3 A B B A x B B B B A B B B B B B B w w x x w * + . . # # . @ l A y y A A B B B B A A B B B B A B B 2 Q i.9.j.d.d.9.9.0.0.d.d.b.f.i.2.t 7 $ @ % @ . + $ @ # - - . @ = $ = 1 N 2.9.9.j.f.9.9.9.9.9.9.9.9.e.u x.F+A+z+y+A+w+y+w+w+y+B+z+>+[ # @ + . + @ % @ W I.>+-+]., . @ @ @ @ @ . . . > z+w+w+z+z+w+v+w+w+A+G+I.n.2+9+|+}+}+|+|+}+|+b+%+5 + . . . + + . / %+9+|+|+|+}+}+}+L . + @ . . . @ - 2+b+}+7+}+b+}+}+;+|+b+f+N.3.~+u+h+k+k+h+h+h+h+d+d+l+d+S.X.d+q+l+d+h+k+d+4.+ . % + . . $ @ E.k+s+k+k+k+k+k+l+l+h+k+k+d+l+e+e+s+~+K n ` +.X P ` X +.Z Z Z Z Z Z @.U M U U .+.P M e @ @ & * & @ . . # ; } n P X .+.Y Y Y Y Y Y Y Y Y ` y q.6+^+3+:+<+^+:+:+:+:+:+:+:+:+:+:+:+(+(+{+=+4 . + . . + @ @ @ @ + 4 J O.0+{+{+:+:+:+(+:+:+:+:+:+<+3+u.", -"v.p+4+0+(+(+(+4+<+<+<+4+0+)+F + + + + + + 4 V.)+(+:+^+O.J + . . . @ + ] 0+^+(+_+(+^+:+(+3+:+3+:+^+p+u.[.U.#+W.U.U.R.W.U.W.M.U.W.w.8 . . @ @ . . . - J }.}.k.}.8 @ . . . . . . + # q.Z.U.U.U.U.U.W.W.)+V.#+G.m q =.&.&.=.=.=.*.=.=.=.*.| $ @ . . . . . . + $ | j j j j < @ . # . + + + = j %.'.&.'.=.&.#.#.&.&.=.#.0 o E B A A B B B A A B B B B B B B B A w A w 3 * @ . @ @ . @ * l A y y B B B B B B B B B B B B B B A 0 Q 0.f.e.f.9.9.e.0.0.8.8.b.i.2.1 = $ + . . . - + = $ $ + . . . . # @ = 1 N 9.0.i.j.9.9.9.j.9.f.9.9.j.u T.F+C+z+x+w+z+z+z+z+y+y+G+B+a.- . @ @ + . . @ + [ W [ . + + @ @ @ @ . . . # > z+w+z+y+z+z+w+y+F+C+G+T.n.2+9+9+|+}+|+f+}+}+9+b+h.. . . . + + . / %+f+|+|+|+}+}+}+7.$ . $ . . . @ . $+b+|+7+|+|+}+|+}+|+b+f+N.p.[+q+h+k+l+k+h+h+l+d+s+k+k+s+t+h+s+s+u+s+s+l+y.. . @ + . . $ + X.k+t+k+k+h+l+l+l+h+s+s+h+d+l+k+t+t+[+6.M ` +.+.` ` Z +.Z Z Z Z Z Y U U X +.Y @.` n } ; # @ @ @ @ . . + ; } n M ` +. .+.Y Y Y Y Y Y X Y Y ` p M.a+3+^+(+<+:+3+(+:+:+3+3+3+:+:+4+3+4+(+{+P._ . . . . . # @ @ @ + + $ F {+0+4+:+(+:+3+3+:+:+:+:+:+p+u.", -"u.p+3+4+(+(+4+4+a+<+<+0+_+(.@ + + . . . ~ u.)+)+0+{+0+)+F . . . . . + = 0+0+4+!+(+3+:+3+3+:+:+3+3+p+u.[.Z.#+.+W.U.W.W.#+U.U.U.U.M.w.}.J f 8 @ % 8 ).G.Q.,+@+#+w.8 + . . + . . . . ).W.U.U.W.W.W.U.W.V.`.#+G.m #.*.&.&.=.*.=.=.*.=.&.*.m $ @ + . + + . @ @ | O #.#.%.*.j < + @ # + + + $ , #.'.'.'.=.&.*.>.=.&.&.#.0 l w B A A B B B A A A B B B B B B B A A A l ; % # . @ @ @ % 2 I A x B A A B B B B B B B B A A B A B 6 Q 0.f.9.f.f.9.e.0.f.b.b.0.5.1 = $ + . - - - + ^ t t C 7 $ . - - - . + = 1 Q 0.0.9.9.9.9.j.j.9.j.j.e.u I.y+C+B+y+w+z+z+z+w+y+y+B+B+m+W . @ % % # . @ @ % % % % @ - . @ @ . . . . @ > G+w+y+z+z+z+z+B+F+C+G+T.m.2+b+9+}+|+f+f+}+}+9+|+L . . . . . . . / %+f+9+9+}+}+9+}+7.@ . @ . . . $ - 2+9+9+2+}+b+f+|+f+|+b+9+N.A.~+q+s+h+l+h+s+h+h+k+t+r+s+s+t+s+s+t+l+k+s+l+4.- . @ . . . $ @ E.t+t+k+k+h+l+l+h+h+h+r+r+l+l+s+t+t+[+-.c @.X +.Z ` X +.@.Z Z Z Y Y Z U +. .Z P e ( % @ @ . . . - . % * } n M ` Y +.+.Y Y Y Y Y Y Y Y Y Y ` y O.a+a+_+_+<+:+3+3+:+_+3+:+3+:+(+4+:+(+<+<+v.F ].[.J 8 @ + @ @ + + + + + [.4+4+3+(+:+3+3+3+:+:+:+4+p+u.", -"v.p+4+4+(+(+(+3+a+6+{+0+l.= . + + . . { }.L.{+++!+O.)+L.J . . . . . + ~ )+!+!+<+0+3+:+3+3+:+(+:+3+4+u.}.Z.#+.+W.U.W.U.U.U.U.Z.W.#+#+U.M.M.w.w.w.k.R.R.W.`.++W.#+w.@ . . + . . . . % M.W.Z.W.W.U.U.U.U.U.#+G.0 q =.=.=.=.=.=.=.=.*.=.>.j + - . . + + + % , O #.=.'.'.=.>.m @ . . . + . @ $ j ,.'.=.=.=.=.*.=.'.&.#.0 l w B B B x B B B B A B B B B B B B x A w 3 % . . . . . # * l I x y x A A B B A A B B B B A w B B B 6 Q i.9.j.9.9.j.e.9.d.b.e.i.N = + $ + . . . + : s 5.5.5...1 , + - - # . + = 1 2.i.9.9.j.j.9.f.9.9.9.e.u x.y+C+y+y+C+z+z+z+w+z+y+y+B+y+'+g + @ % % # # @ % % & @ > W W @ @ . . . . . 9 z+w+w+y+z+z+z+w+z+C+G+T.n.2+b+9+}+7+}+}+}+}+9+}+L . . . . . . . / %+f+b+b+|+}+f+}+7.+ @ @ . . . % - 2+b+9+2+}+b+f+}+}+9+b+9+N.4.~+u+s+h+l+h+s+h+h+k+s+s+s+s+k+s+s+s+l+k+s+l+y.. . @ . + . $ . E.e+s+k+k+k+h+h+k+h+h+r+r+l+l+k+s+s+~+-.c Y +.U Z ` Y +.Z Z Z Z Y Z Z Z .+.` e ( % @ . @ . . . . % ; } M ` @.U X +.X @.@.Y Y Y Y Y Y Y Y ` p u.p+^+_+(+<+3+:+3+:+(+3+3+:+:+(+3+(+4+<+3+^+O.:+{+)+O.[.> + @ @ @ + + + 4 =+0+:+:+:+(+3+3+:+:+:+(+4+u.", -"v.4+4+:+:+(+:+(+:+:+(+4+4 + . . @ # . { J F ].].C J J F { + + . . . + + J 7 F a.{+:+:+(+:+:+:+:+:+4+s._.U.`.W.W.U.U.U.U.U.U.W.V.V.W.U.U.U.W.#+Y.++W.W.W.U.W.U.#+M.% . . . . . . + @ F.Q.Z.U.U.U.U.U.U.U.#+w.m q =.=.=.=.*.*.=.=.*.=.*.j + - . . . + + % | #.*.&.&.'.%.!.O = @ @ # . . @ @ j %.*.=.=.=.*.>.=.'.&.>.0 l w B B B B B B B B B B B B B B B B y A I ; @ + . . . . # ; w I A z x B B B B A A B B B B A A B B A 0 Q 0.9.j.9.d.f.d.9.9.d.9.i.1 + - $ + + . # : N 5.j.f.i.i.|.1 $ . . # - - + , N 0.9.9.9.9.9.f.9.9.9.e.u H.y+A+y+y+v+z+z+z+w+w+w+z+y+z+y+'+a.~ @ @ @ # @ % % @ [ a. +W . . . . . . + H z+w+w+G+z+z+w+w+z+A+G+T.n.2+b+|+9+7+}+|+}+}+}+9+h.+ . . . . . + / N.7+b+b+|+}+f+}+L + % @ . . . @ / 2+b+b+7+|+|+9+|+}+9+b+f+N.3.~+u+h+h+k+k+h+k+h+l+h+k+k+k+k+k+k+h+d+s+s+d+y.+ . @ + . . $ . E.d+s+l+k+h+h+k+k+k+h+s+s+l+d+e+t+s+[+-.c ` X X ` ` Y X Y Z Z Z Z Z Z Z @.P e ' @ . . . . + . @ * ( d n Z Y +.X Y Y @.@.Z Y Y Y U U Y Y Y ` p q.a+^+_+:+a+:+(+:+:+:+:+:+:+:+:+:+:+3+(+(+:+4+(+(+0+0+{+F $ @ @ # . + + $ <.0+:+:+:+:+:+:+:+:+:+(+4+u.", -"u.3+(+:+=+(+(+(+:+=+:+0+4 + . . @ @ # . . . + + + . . - . + + . . - # @ @ @ . 4 (+:+:+(+:+:+(+:+:+4+s._.U.`.`.W.W.U.U.U.W.R.W.V.V.R.U.U.U.W.W.Y.++W.W.R.R.U.U.U.U.J . . . . . . . . U.W.U.U.U.U.R.R.U.V.#+w.m q *.&.=.*.*.*.=.*.*.=.=.j + @ . . + + # % m >.&.&.&.>.#.!.%., % @ # . + @ @ k *.=.*.=.&.>.#.&.&.&.>.0 o w B B x B B B A A B B B B B A B B y x o % . . . . . . @ l A A A A B B B B B B B B B B B B x B B B 2 Q 0.e.9.9.d.9.d.0.9.9.0.2.: . - $ + @ . @ 1 5.j.d.d.d.b.i.s = + + . - - . = u 0.9.9.9.9.9.9.9.9.9.e.u H.y+A+y+y+v+A+A+w+w+w+w+z+z+w+w+y+m+I.a.g [ [ ] ] g a.T.j+1+9 # . . . . . . }.z+w+w+G+y+z+y+w+z+A+G+T.h.%+9+|+|+|+}+|+|+}+}+b+h.@ . . . . . @ / N.7+9+|+|+}+|+}+L . % @ . . . @ ) 7+|+|+}+|+b+|+|+}+|+5+9+N.3.~+u+h+k+k+h+h+k+k+d+l+k+k+k+e+k+l+k+l+h+s+d+y.. . @ + . . $ @ B.d+t+k+k+h+h+h+k+k+k+k+k+d+d+e+s+k+~+-.n P +.+.` ` Y X Z Z Z Z Z Z Z Z e d ; @ . . . + + . @ ; } n P Y +.X +.X Y Z ` @.Z Y Y Z Z U Y Y Y ` p q.a+<+_+:+<+:+(+:+:+:+:+:+^+:+:+(+:+(+<+:+:+:+:+(+{+{+0+u.= @ @ @ @ . + + 7 0+(+:+:+:+:+:+:+:+(+4+3+u.", -"v.4+4+(+(+(+(+4+3+(+{+0+4 . # # @ @ # # @ + + + @ # @ @ . + + + . - @ % % @ $ J <+:+:+:+:+(+(+(+:+4+u.[.W.`.U.W.W.W.U.W.W.R.W.W.W.R.W.U.#+.+W.#+#+U.W.Z.R.U.U.U.U.}.. . . . + . . . M.U.U.U.U.U.W.W.U.V.#+G.k q *.&.=.*.=.&.=.=.*.=.=.O $ @ . . + + + * j %.&.&.&.#.#.{.,.| % # . . + @ @ 0 #.*.*.=.&.>.%.&.&.&.#.0 3 w B A A B B B B A B B B B B A B B y A ' @ . . . . . . % w x x B x x B B B B B B B B B B B x B B B 2 Q i.e.9.d.9.9.9.0.d.0.0.N : # % + # @ @ + 1 i.b.d.d.d.b.j.N : $ + $ @ . + = 1 i.9.9.9.9.9.9.9.9.9.e.u I.y+C+y+y+w+z+C+z+z+z+z+z+z+v+v+v+y+F+y+>+-+'+T.I.'+v+D+G+'+_ # . . . . . - w.z+w+w+y+z+z+z+z+z+C+G+I.n.2+9+9+}+|+f+}+}+}+}+9+7.$ + . . . . @ ) C.9+9+|+}+}+f+}+5 . @ @ . . . @ a 2+b+9+7+|+b+9+}+}+}+b+b+C.3.~+u+h+k+k+h+h+h+h+k+k+s+s+k+k+k+l+s+k+h+k+l+y.- . @ . . . $ @ E.k+r+k+k+h+h+h+l+k+s+s+s+d+d+k+t+r+~+-.c @. .+.` ` X +.Z Z Z Z Z Z Y X ( ' @ . . . @ @ . . ; d M Y +. . .+.X Y Y @.` ` @.Y Y Y Y Y Y Y Y ` p q.a+^+_+(+<+:+3+:+:+:+:+3+4+:+3+3+4+4+=+:+:+:+:+(+^+0+0+O.4 + % @ @ . + + 8 0+:+:+(+:+:+:+:+^+4+:+p+u.", -"v.4+4+4+(+:+4+4+3+:+(+0+4 . @ # @ @ . # @ + + + @ @ @ @ + + + + . . @ @ @ + + g {+3+:+3+3+(+:+3+:+4+u.[.U.#+.+W.R.W.W.W.W.Z.W.`.U.M.M.M.M.w.k.}.w.#+U.Z.R.W.U.#+W.J . . . . + . . @ U.U.U.U.U.Z.U.U.W.U.#+G.m q *.&.=.=.=.&.&.=.=.=.=.O , @ @ @ . . + % j #.=.&.'.*.>.!.%.| $ + @ @ @ % + j #.*.=.=.=.*.*.&.&.=.#.0 o A B A A B B B B B B B B B B B B B A w * # @ @ @ # @ @ 2 w x y B x x B B B B B B B B B B B B B A A h Q i.9.j.9.9.9.e.f.9.0.0.N , % % $ @ + . $ s 2.j.d.d.d.e.j.N : + + = % % . + : i.d.9.j.j.9.9.9.9.9.e.u H.G+C+y+y+C+z+C+z+w+z+z+z+z+y+z+z+E+D+F+F+F+G+G+y+E+D+D+x+ +. @ . . . # @ { +z+w+y+z+z+z+z+z+F+C+G+T.n.7+9+9+}+|+9+f+f+}+|+9+z.= + # @ @ . @ - m.f+9+b+b+9+f+;+- . @ % @ @ + $ n.2+b+|+7+}+b+9+|+}+}+9+b+N.p.[+u+q+k+k+h+s+s+h+h+q+s+s+s+h+h+s+h+l+k+h+l+y.. . . . . . $ @ E.k+s+h+h+s+s+s+k+h+h+q+s+k+k+t+t+r+~+-.c +. .X ` ` Y +.Z U U +.+.Y M d & @ . . . . @ @ ' } e M @. . .T . . .Y Z X X Z Y Y Y Y Y Y Y Y Y ` p M.a+3+^+(+1+3+3+(+(+(+(+!+=+O.u.O.u.u.C P.{+4+3+:+^+_+0+O.4 @ % @ . + + + 4 0+3+:+:+:+3+:+:+^+:+(+3+u.", -"u.3+4+4+(+:+:+:+3+<+:+0+8 . # # . . . . . . . . + $ $ @ + . . . . % @ @ . + + g {+4+4+:+4+(+3+(+3+p+u.}.Z.#+.+W.U.W.W.U.R.W.W.R.q.J J 8 8 4 @ . { U.#+W.Q.R.U.#+U.% . . . + . . . f Z.W.U.U.U.Z.U.U.U.U.#+G.m O =.=.*.=.&.=.*.*.=.=.=.%.m @ % . - . + % < O *.'.=.'.'.%.t | $ + @ @ @ % $ j *.=.=.=.=.>.>.&.&.&.>.0 l w B B B B B B B B B B B B B B B B w h . . @ @ % @ % & o A B y x B B B B B B B B B B B B B B B A A v Q i.f.9.9.f.f.e.f.f.9.0.5., . # $ @ + . $ u 5.i.e.8.8.9.i.u ~ . . + @ # - + 1 j.8.f.9.j.9.9.9.9.9.e.u H.F+A+G+y+z+z+z+y+w+w+z+z+A+E+y+v+m+m+>+T.I.j+y+A+D+D+y+j+s.. % . - @ * % 4 m+z+w+z+z+z+z+y+z+F+C+G+T.n.2+b+9+}+|+9+9+9+9+9+b+$+a . @ % % @ $ > L 2+b+5+b+b+7+N.@ . % % % $ = + K.|+}+|+|+9+9+9+}+}+}+b+9+N.p.~+u+h+h+l+h+s+s+k+h+h+s+s+s+k+h+s+h+u+k+q+l+4.+ . @ . + . $ + E.e+t+k+h+h+s+s+h+h+h+s+s+s+k+k+t+r+~+-.c @. .+.@.` Y +.U U Y +.T ` ( . . . . . + . . . e U ` ` ` @.Y Y Y .+.@.` +.T U @.Y Y Y Y Y Y Y Y ` p O.p+6+3+:+<+4+(+0+{+{+<+(.F 8 % % @ . . [..+0+<+(+4+0+0+O.4 @ % @ . + + $ F 0+:+(+:+3+3+:+:+:+4+4+p+u.", -"u.p+3+:+(+:+<+:+<+:+:+0+4 . . . . + + + + + + + + @ + . . . . . @ @ @ + + . + g 0+(+(+:+:+:+:+:+:+4+u.[.Z.W.W.W.R.W.U.Z.U.U.W.M.8 . . + . . # @ + }.W.W.++R.U.#+w.@ . . . + . . # J R.++U.U.U.U.W.W.W.U.`.w.m O *.=.=.*.=.=.=.=.*.=.'.%.O $ @ - - + $ % $ m %.,.'.'.#.%.t , $ @ @ @ . @ @ O *.*.=.=.&.>.>.&.&.&.#.0 l w B B A x B B A A B B B B B B B B A h @ . . @ % . & % l A B y x A A B A A B B A A B B B B x B A A 0 Q i.9.e.9.0.9.d.e.d.9.0.|., . # @ @ + . # : N 5.9.d.9.i.i.s $ . @ @ . - - $ u i.d.f.f.9.9.9.f.9.9.j.u I.y+E+G+y+y+z+z+z+z+y+z+z+v+T.a.a.W W g > > a.y+z+z+E+y+j+g @ % . . @ % + a.y+w+w+y+y+G+z+w+y+z+C+G+T.m.2+b+9+|+}+}+|+9+}+}+9+2+3.. + @ @ @ + . 5 C.7+b+}+2+$+L + # @ $ @ + @ - |+|+}+}+|+|+9+9+}+}+}+b+f+N.3.~+q+k+k+k+h+h+h+k+k+k+k+h+k+k+h+k+h+d+k+s+d+y.+ . $ @ . . + . E.t+s+d+l+k+h+s+h+l+l+s+s+l+d+e+t+s+[+-.c ` +.+.@.` Y +.U U U Y +.n ' . . . . . . . . . } } p i d d d d d e e d e M X ` M Y Y Y U Z Y Y Z ` p u.3+_+4+=+<+_+{+4+{+{+<+$ + + + . + + . f R.{+:+:+(+0+_+<.+ @ # @ . + + ~ u.0+:+(+:+3+(+3+(+:+3+:+4+u.", -"u.(+<+:+:+:+<+<+:+:+=+4+F ~ { ] ~ ~ ~ ~ ~ ~ ~ ] ~ ~ ~ ~ @ . . . . + @ . ~ ~ 4 H {+:+:+:+:+:+:+:+(+3+u.}.M.U.`.W.R.W.U.W.W.Y.#+W.}.@ . . . . . . + { q.Y.@+Q.#+w.8 + . + . . . + % M.Q.@+`.W.U.W.U.R.W.V.`.k.m q *.&.=.=.=.=.=.=.*.=.=.'.#., $ @ . . + @ $ < O %.%.%.#.m < @ @ % @ @ # @ < >.%.*.*.=.&.%.>.&.&.=.#.0 l w B A A x B A A A B B A B B A B B I 2 # . . @ @ . % % l A x y y w A B A A B B A A B x x B x A w A 0 Q i.9.9.d.0.9.d.d.8.d.j.5.1 + . @ @ . . . $ 1 ..i.0.5.5.u : $ . # @ . - . = u i.j.9.9.9.9.9.9.9.f.e.u I.F+A+y+w+w+w+w+z+w+y+z+z+>+_ . @ @ @ @ @ @ g '+x+y+y+x+a.@ @ % @ @ % % ~ -+F+w+v+w+w+C+v+w+w+y+A+G+T.n.2+9+|+|+}+}+|+|+|+}+|+7+J.5 + = $ # . . . 5 J.%+$+&+L ) + . @ @ @ . { L 9+9+|+|+|+|+|+|+}+}+}+9+f+C.3.~+u+h+k+l+l+l+l+k+k+k+k+k+k+k+k+k+h+d+k+s+d+y.. . $ $ . . $ @ B.e+s+k+d+k+h+k+d+d+l+k+k+d+d+k+e+s+[+6.c @.Y +.` ` Y +.+.Y Z @.M d % - . . . . . . . . # # . . % & & % % & & % ; d ` ` P Y U U U U U U Y ` y u.a+:+_+=+:+:+(+(+(+{+{+7 $ + + + . . . . }.{+0+{+{+{+v., + @ % # . + + 4 V.{+:+:+:+:+(+:+=+:+<+(+0+u.", -"v.4+4+4+(+:+<+:+_+^+(+4+P.O.u.O.O.u.O.O.u.O.O.O.O.u.O.u.8 . . . . . . { F.u.O.O.{+:+3+:+3+:+:+:+:+3+u.}.W.W.W.W.U.U.U.U.W.V.,+.+M.8 . # @ . . . . # 8 }.q.w.}.8 . + . + + . . . J W.R.R.W.U.U.Z.U.U.Z.)+,+G.m q =.&.=.=.=.=.=.*.=.=.=.&.%.j = $ $ + # @ @ = | j j O j 8 $ @ . @ # . . = k >.%.*.=.=.&.>.>.=.&.&.>.h f w A A x B B B B B B A A B A w B B w * # . . @ . . @ ; o x B y r x B B B B B B x x B x x B A A A B 0 Q i.9.9.d.f.9.9.b.b.8.9.f.N , + @ @ - - . + , 1 u D t t , $ + . . @ . . + : ..i.j.9.9.9.9.9.f.9.9.e.u H.E+C+y+y+w+z+z+F+w+v+z+E+v+g % % % % % % # > H +'+'+a.+ + @ @ % % % @ ^.y+D+y+w+C+y+y+y+w+w+z+A+G+T.n.2+b+9+}+|+9+9+|+|+|+|+f+%+7.. $ $ @ - - $ @ 5 L L L $ . . . # + . - ) J.}+b+|+|+9+|+|+|+}+}+f+b+f+N.p.[+u+h+l+l+h+h+h+l+d+k+k+k+h+k+h+h+h+d+s+s+l+y.. . @ . - . $ @ E.t+t+k+k+k+h+k+d+l+h+k+s+l+d+k+o+t+]+K n M +.+.` ` Y .T +.U P n ' @ . . . . . . . . . . - . . . @ @ . . . # . @ i ` ` ` X Y Y Y Y Y Y Y P B w.6+^+_+:+<+:+:+4+:+{+0+P.= + . + . . . @ > _.O.O.O.u.~ + + @ @ + + + $ [.0+0+:+:+:+:+:+3+:+(+(+4+p+u.", -"v.4+4+4+(+(+:+:+:+:+(+4+4+4+0+0+0+4+0+4+4+0+0+0+0+0+0+)+F + . . . . + { 0+0+0+4+_+:+:+:+3+(+:+3+3+4+u.[.Z.#+W.W.W.U.U.#+Z.U.U.W.#+k.@ @ # . . . . # . . @ % . . . + . . . . . { q..+#+Q.W.U.U.Z.Z.U.U.W.#+G.m O =.=.=.=.=.=.=.=.=.=.=.=.*.#.j $ $ @ . + . + $ = = < $ $ + @ . # @ @ + j #.%.'.%.=.=.&.%.>.&.&.&.#.A 3 w B B B B B B B B B A B B A B B B w * # . . . . . % 2 w x x x y x A B B B B B B B B B x A A A A A 2 Q i.9.e.d.f.9.9.9.9.8.d.f.Q : = @ . @ - . + $ = = ^ ^ $ + + . . # # + = , u 5.f.9.9.j.9.9.9.f.9.j.e.u H.y+C+z+y+z+z+z+y+z+z+z+F+G+ +{ . @ % % # . @ + + _ > @ # @ & . @ @ $ 9 m+z+D+z+z+z+y+G+y+w+y+F+C+G+T.o.2+b+9+|+|+9+9+f+}+|+|+9+9+C.) . . . - . % % . . . - @ % @ + $ + - ) L 8+}+9+9+}+|+9+}+9+}+}+f+b+f+K.p.~+u+s+s+h+h+s+s+s+h+h+s+s+s+k+h+h+q+l+h+s+l+y.. . . . . . + @ E.k+t+l+h+h+s+h+h+h+h+s+s+k+k+t+o+t+~+K n ` .+.@.` Y +.+.+.Z M } % . - . . . . . . . . + @ @ # . . . . . . . . . i Z +.Y Y Y Y Y Y Y Y X ` p V.p+^+4+(+<+3+3+p+:+:+4+1+/.+ . + + + + + @ . + ^ _ + @ @ @ . + @ + + 4 O._+4+:+:+:+3+3+:+<+:+:+4+(+v.", -"u.4+4+4+:+:+<+3+3+:+:+^+3+3+(+(+(+4+(+(+3+4+3+(+(+4+0+)+J + # @ . + + ~ 0+0+{+4+:+:+:+:+3+:+:+:+:+p+u.[.Z.`.W.W.U.U.U.#+M.M.U.U.W.R.~.% . + . . . @ @ . . . . . + + . . + @ @ k.W..+#+R.Z.W.W.U.U.W.Y.Y.#+G.m q =.&.&.&.=.=.=.=.=.=.=.*.*.%.O | = @ @ + . + + % + @ @ . . @ @ @ @ $ , q *.=.%.*.*.=.'.=.=.=.&.&.>.0 3 A B A A B A B B B B B B B B B B B h & # . . . . + . l I w x x B A A B B B B B B B B x x B B A B B h Q i.j.j.9.9.9.e.f.f.8.8.f.i.N 1 $ @ . . . # + + + + + . . + + # @ @ $ , 1 2.f.9.9.9.9.f.9.9.9.9.9.e.u H.F+C+z+y+C+z+z+z+v+z+y+z+z+F+t.> . . + @ @ + + @ @ # . @ % % . . # 9 T.y+E+A+z+y+w+z+B+w+w+z+z+C+G+T.h.2+b+9+}+|+9+9+|+}+|+9+b+b+7+7.- - - # @ & @ + + + @ @ $ @ @ + + - L $+7+}+b+9+|+}+f+9+9+|+}+9+b+9+N.3.~+u+s+k+k+h+h+h+k+k+h+s+h+h+k+k+h+q+u+k+s+l+y.. . . + - . $ + E.k+t+k+h+h+s+h+h+h+h+s+s+l+l+s+t+t+[+-.c +.+.+.` ` Y +.Z Y @.n ' @ - @ . . . . . . . . # @ @ # . . . + + # # . % i Z .X Z Y Y Y Y Y Y Y ` r q.a+<+_+(+<+_+:+(+<+4+4+0+1+8 . + + + + + + . - . # # . . # # + . . _ u.0+4+(+:+:+:+:+:+:+(+:+(+3+4+u.", -"u.p+4+(+<+:+:+3+3+:+:+^+4+:+<+:+3+:+3+3+:+:+:+:+<+<+3+=+F . @ @ . + + ~ 0+4+4+3+:+:+:+:+3+:+(+3+(+p+u.[.Z.#+W.W.Z.U.#+#+U.U.Z.W.U.`.Q.m { # . . . . . . . . . . . . . . + 8 ).`.W.W.Z.W.U.W.W.Z.Z.W.)+`.#+G.m O =.&.&.=.*.=.=.=.=.=.=.%.%.,.%.q < $ @ . . . . @ . # . + . @ % @ $ , j #.%.%.'.%.*.*.&.%.%.&.&.&.>.0 l w B A A x B B B A B A B B B B B B 2 @ . . . . . . . l I w x x B A A B A A B B A A B x x B B A B A 2 Q i.9.9.d.9.0.f.0.0.d.8.9.f.i.N = @ @ @ # @ . @ . - . # . . @ @ % @ = 1 Q i.f.9.9.9.9.9.f.9.9.9.9.e.N I.y+C+y+y+v+z+z+F+y+z+w+z+z+x+m+^.] > $ % % @ . @ $ % @ . . . # . g I.y+A+E+y+z+w+y+C+z+y+w+y+y+C+G+I.n.2+b+9+}+|+9+|+9+}+}+f+b+b+2+&+7./ - + @ @ . + + $ + - . @ % + . ) $+}+9+|+|+9+|+|+|+9+}+}+}+7+9+9+N.p.[+u+k+k+d+h+h+h+k+k+s+s+h+h+k+h+s+h+d+k+s+l+c.+ . @ + + . $ + E.e+s+k+h+h+h+h+k+k+h+s+s+k+k+k+t+t+~+-.c Y +.+.Z ` Y +.P @.P d @ . + @ . . . . . . . . @ @ . + . + + + + @ @ . @ e +.+.Y Y Y Y Y Y Y Y Z ` p q.6+<+_+:+<+3+:+:+<+(+(+4+0+M.8 # # . . + + . - . . # @ @ % @ . # _ u.0+4+(+:+:+:+:+:+:+:+:+:+4+4+p+u.", -"u.4+_+(+:+(+<+<+:+:+:+:+:+:+<+:+:+:+:+:+:+:+:+:+(+:+6+P.4 + + . + + $ ~ 0+_+(+:+:+:+:+:+:+:+(+:+(+4+u._.Y.`.U.R.R.W.U.U.U.U.R.W.W.++@+R.k.f + # . + . . . . . . . . @ { 8 w.#+ +R.`.R.Q.Z.U.U.U.R.R.W.U.#+G.m q =.&.=.*.=.=.=.=.=.*.=.=.=.,.%.#.O < = + # . - # @ % # % @ . % $ , j #.%.%.%.%.*.*.=.&.>.#.'.&.&.#.0 l w B B B B B B A A B w B B A B x B ; @ # @ # # # . * l I I x x B A A B A A B B A A x B B B A A E o 0 Q 0.e.9.f.f.0.0.0.0.d.b.d.0.0.|.D , = $ + + . . + @ @ @ . @ = = , : 1 Q f.f.d.j.9.f.9.9.9.9.9.9.9.e.u H.z+C+z+v+w+w+w+w+w+w+w+z+w+w+y+m+x.9 $ % % $ + + @ @ @ @ @ . _ ^.m+y+A+D+E+x+w+v+w+z+y+z+v+w+y+D+G+I.n.2+b+|+}+|+|+|+|+|+|+}+b+|+7+8+&+p.5 - + @ # + + + + + @ # . ) / A.2+}+9+9+|+|+|+|+|+|+}+}+}+|+9+f+C.4.~+q+k+k+l+l+h+h+k+k+h+h+h+s+k+k+h+h+s+k+k+d+4.@ @ $ @ @ @ @ @ c.o+n+k+d+l+h+k+k+d+l+s+k+d+k+e+s+l+[+6.c P X Y Z ` Y X M P P } * @ @ % @ @ # # # @ @ # $ @ # + @ + $ @ @ % @ @ % } P @.@.Z Z Y Y Y Z Z Z ` p w.a+<+_+<+1+:+:+:+:+=+:+4+(+0+,+}.8 + + + + + . + . @ @ @ % # ] J O.(+{+^+:+:+:+:+:+:+:+:+<+<+<+4+3+u.", -"u.3+4+4+:+(+<+:+3+:+:+(+3+:+:+:+(+3+^+(+:+:+(+3+3+{+{+=+<.7 7 4 4 7 4 D 3+4+^+(+:+:+3+:+3+:+:+(+:+4+u.[.U.#+W.`.R.W.W.U.U.U.U.U.U.W.W.U.#+M.}.f { ~ { + { { { { { { J w.M.#+U.R.U.Z.U.U.U.U.U.U.U.U.U.Z.#+G.m q =.=.=.=.=.=.=.=.=.=.=.%.=.%.*.=.=.=.%.| ; < = * % = * ; ; < 0 q #.%.%.=.=.=.*.=.=.=.=.*.*.=.&.=.#.0 o w B B A A B B B B B B B B w x B B & & & * * & & % ( 3 A B x A A A A B B B B B B B B B B x B A A A 2 Q i.b.e.0.0.9.8.9.9.d.9.j.9.9.d.i.5.N u : : = = = = = = = , : , u 8.d.d.9.9.9.9.9.9.9.j.f.f.9.9.j.e.u H.y+D+z+y+A+z+z+z+z+z+z+z+z+E+A+y+y+m+^.9 9 ^ ] ] ] ] ~ 4 9 W >+G+z+z+w+y+y+z+z+w+w+z+z+z+w+w+z+C+G+T.n.2+b+9+|+}+|+9+9+|+|+9+|+}+}+}+f+f+;+C.L / / ) ) / ) ) [ L L C.9+9+f+|+b+9+f+9+|+}+9+9+9+}+}+b+5+9+N.4.~+q+k+h+h+k+s+h+h+k+h+h+h+s+k+k+h+s+k+e+l+l+E.l l b l l o l o E.d+n+k+h+h+s+h+k+d+k+q+q+k+k+t+t+q+[+6.c @.+.+.@.` Y +.M M M p } ( ( ( ( ' ' ' ' ' ' ' ' ' ' ' ' ; ' ' ' ; ' } } e M M P Z Z Y Y Z Y Z Y ` p M.6+a+4+(+<+:+:+3+:+:+:+3+:+_+{+_+O.<.4 , , ~ { { { { ~ ~ ~ F P.6+^+:+^+^+:+<+:+:+:+:+:+:+:+(+(+:+4+u.", -"v.4+4+4+(+<+:+3+:+:+:+:+3+:+:+:+:+3+3+:+:+:+3+3+4+{+(+4+p+4+4+3+4+3+4+:+4+:+_+4+:+:+:+:+3+:+:+:+:+p+u._.Z.`.U.W.R.Z.W.W.Z.U.U.Z.Z.U.U.U.U.U.#+U.M.M.F.w.}.}.}.w.q.M.M.#+#+U.U.R.U.W.W.U.U.U.U.U.U.U.Y.U.#+G.m q =.=.=.=.=.&.=.=.=.=.=.=.=.=.=.=.'.'.%.>.>.#.q j j j j j q >.#.*.=.*.&.=.=.&.=.=.=.=.=.>.>.=.&.&.>.0 3 A A A x B B B B x B x B B B B B B w w w w w A w w A B B B B B B B B A A B B B B B B B B B B A A A 2 Q i.e.j.9.0.f.d.j.9.9.9.9.j.9.9.j.j.i.i.2.Q N D u N Q Q Q 2.5.5.j.9.9.9.j.9.j.9.9.9.j.9.j.j.9.9.9.e.u H.y+C+y+y+z+z+z+z+z+z+z+z+z+w+A+A+z+x+x+y+m+T.T.T.T.T.'+m+B+x+z+G+z+z+w+y+z+z+z+w+z+z+z+z+A+z+z+C+G+I.n.2+b+9+}+}+|+9+}+|+9+9+}+}+9+}+}+7+7+9+2+$+N.n.n.C.n.C.$+2+7+2+7+}+9+|+|+|+9+9+|+|+|+9+9+}+}+9+5+f+C.A.[+u+s+k+h+h+s+s+k+k+s+s+s+s+k+s+s+q+k+k+k+s+s+s+s+l+s+s+t+s+s+l+s+o+k+h+s+s+h+h+h+h+r+q+l+l+t+r+t+~+-.n Y .X ` ` Y +.Y Y Z P P P P M P P P P P P P P P P P P P P P P P P P P ` +.+.+.+.@.Y Y Y Y Y Y Y ` p u.a+3+3+:+<+(+3+3+:+3+:+3+:+_+4+:+4+6+p+!+O.u.u.u.u.u.M.{+4+0+3+4+^+:+:+:+:+3+:+:+:+3+3+3+:+:+4+3+p+u.", -"v.4+4+(+{+(+:+3+3+<+:+:+:+3+:+:+(+3+:+(+(+(+:+:+:+(+{+4+4+:+4+4+4+:+3+(+:+(+{+:+_+:+:+(+3+:+:+:+3+p+u.}.W.#+.+W.Z.U.W.W.U.U.U.Z.Z.U.U.U.U.U.U.U.#+#+Q.U.Z.Z.#+#+U.W.#+U.U.U.U.U.W.W.W.U.U.U.U.U.U.W.{+V.#+G.m #.=.&.=.=.=.=.=.=.=.=.=.=.=.'.'.=.=.=.=.,.,.=.%.,.%.>.*.&.=.=.&.&.=.&.&.&.=.=.=.=.=.=.=.%.%.'.&.&.#.0 l w B B A x B B B B B B B B B B B B y x B A x y x y x B B B A B B B B B B B B B B A B B B B B A A B h N i.d.d.9.f.f.8.9.j.f.j.j.9.9.9.8.8.8.d.f.f.0.i.j.b.e.e.b.d.d.b.j.j.j.9.9.j.j.9.9.9.j.j.f.9.9.9.j.e.u I.G+C+y+y+w+z+z+z+A+z+z+z+z+A+A+C+G+y+y+z+y+y+A+A+E+F+D+D+D+D+z+C+z+z+w+z+z+z+z+w+z+z+z+z+A+z+F+C+G+T.m.2+b+9+|+}+9+}+|+|+}+|+9+9+7+}+}+7+}+2+7+9+f+f+9+f+9+9+7+2+}+7+7+9+9+}+}+9+9+9+9+9+9+9+9+}+}+|+5+9+N.y.~+q+s+k+k+k+s+s+k+k+h+s+s+s+k+k+h+q+t+s+k+s+t+l+k+n+k+s+o+s+o+t+t+t+k+h+h+h+h+d+k+h+q+q+k+k+k+h+u+~+6.c P .+.@.` Z .T +.+.+. .Y Y @. . . .T .T . . . . .T T .+.+. .Y G T T T T T +.Y Y Z Y Y Z Y Z ` y P.a+^+_+:+1+3+3+3+(+3+:+3+3+:+(+4+:+(+:+4+4+3+3+4+6+a+3+3+:+(+:+3+3+:+:+:+(+3+3+:+:+:+3+3+:+3+4+4+3+u.", -"u.4+4+4+<+:+<+:+:+:+:+:+^+:+:+:+(+3+3+:+:+:+3+3+:+(+4+4+{+4+:+:+4+(+4+_+4+4+3+(+(+:+:+_+3+:+:+:+3+p+u.[.U.U.W.W.U.U.U.Z.U.U.U.U.U.Z.U.U.U.#+U.U.U.#+U.U.U.Y.W.W.U.W.U.#+#+W.W.U.U.U.Z.U.W.Z.W.Z.U.U.W.U.#+G.m #.=.=.=.=.=.=.=.=.=.=.=.'.=.=.%.=.=.'.%.&.&.'.&.=.'.%.'.&.&.%.&.=.=.=.*.=.=.=.=.=.=.=.=.*.%.'.&.&.#.0 l w B A w B B B B A B B B B B B x B B B y B y B B y B A B A w A B B B B B B B B B A A x x B A A B o f Q i.e.e.0.f.f.e.9.9.9.9.j.j.f.9.b.d.8.8.8.9.9.9.9.9.f.f.f.f.f.9.9.9.9.d.9.9.f.9.9.f.9.9.9.9.9.f.9.e.u H.G+C+y+y+A+z+z+z+w+z+z+z+z+z+z+z+z+z+z+z+E+E+z+w+w+E+F+E+D+E+z+G+B+z+w+z+z+z+z+w+z+z+z+z+w+z+B+C+G+T.n.2+9+9+}+|+|+9+9+}+}+|+9+}+}+}+}+}+}+}+|+|+|+b+b+|+|+b+|+|+}+|+7+f+7+}+}+|+9+9+|+}+|+9+|+}+9+|+b+9+C.p.[+u+h+h+k+h+s+s+s+h+s+s+s+t+k+s+s+s+k+k+s+t+t+k+k+o+h+t+k+k+k+t+k+k+k+h+h+u+l+k+h+s+h+s+k+l+k+q+u+[+6.c Y +.+.@.` Z . .+.+.+. .T +.T .+.+.Y +.+.+.+.+.+.Y Z +.+.Y @.X Y Z Y Y Y +.X @.Y Y Y Y Y Y Y Y ` p M.p+_+_+{+<+3+:+(+:+:+:+:+3+:+:+4+4+4+<+:+(+^+<+<+:+<+<+<+<+:+:+:+3+3+:+3+4+3+:+:+:+:+:+:+:+:+3+3+p+u.", -"u.3+4+{+:+:+<+:+:+:+:+:+:+:+:+:+:+:+:+:+<+:+:+:+:+=+:+3+4+:+<+(+(+_+:+(+_+:+(+(+=+:+:+:+:+:+:+:+(+3+u.[.W.U.U.R.W.U.U.U.U.Z.U.U.U.R.R.U.U.U.U.U.W.U.U.R.R. +W.W.U.Z.U.U.U.U.Q.U.U.U.U.Z.U.U.U.U.U.U.U.`.`.q.m q =.&.&.=.=.=.=.*.*.=.=.>.%.'.=.=.'.=.=.'.,.&.%.&.%.%.%.&.&.&.'.=.*.#.%.*.=.=.*.=.=.=.=.>.#.'.&.&.>.0 l w B A A B B B A w B B B B B B B B y B B y x B B B A B A w A B A A B B B B B B B B B B B x B B B A 0 Q i.e.d.d.0.f.8.9.9.d.9.9.9.9.9.f.f.9.d.f.9.d.9.0.0.0.0.0.0.0.0.0.9.9.9.d.9.9.f.d.9.9.9.9.9.9.9.9.e.u H.z+D+y+v+w+w+w+w+w+v+w+w+w+w+w+y+y+w+w+w+w+y+y+y+v+y+y+y+B+v+y+w+w+w+w+w+w+w+w+w+w+w+w+A+w+w+w+C+G+I.n.%+b+9+}+|+|+|+9+}+}+|+9+|+|+|+}+}+}+}+}+|+}+}+|+}+|+}+|+|+|+}+}+}+}+}+2+9+9+|+|+|+}+f+9+|+|+|+b+9+N.3.~+u+k+k+k+k+k+k+k+k+k+k+h+h+k+k+k+h+k+d+d+k+k+k+s+k+k+k+d+d+k+d+d+l+e+k+h+h+d+k+k+h+k+o+t+k+k+s+s+~+K c Y X +.Z ` Z +.@.` Z Z Z Y U +.` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` Z @.` ` ` P P X Y Y Y Y Z Y X ` p q.6+<+_+:+1+(+:+:+:+:+:+:+:+=+=+:+:+4+(+<+:+<+:+(+:+:+(+(+:+:+:+:+:+:+:+:+:+(+:+:+:+:+:+:+:+(+:+4+4+u.", -"u.4+(+<+:+:+<+:+:+:+:+:+:+:+:+:+:+(+3+:+(+(+3+3+:+:+:+<+:+:+(+:+:+:+(+:+:+(+_+4+:+:+:+:+3+:+:+:+:+3+u._.U.`.#+W.U.U.U.U.R.R.U.U.U.U.U.U.U.U.U.R.R.U.U.U.U.W.R.W.U.U.U.U.U.U.U.U.U.U.U.Q.W.U.U.U.U.U.U.U.#+G.m O =.&.=.*.=.=.=.&.*.=.&.=.=.%.=.=.=.%.%.&.&.%.=.%.%.=.=.'.%.%.%.*.=.#.#.*.=.=.*.*.=.=.=.*.%.=.&.&.>.0 l w B x B B B A B B B B x B B B B B A I A I w I w I A A B x B B B A A B B B B B B B B B B x B B B B 2 Q i.d.e.0.0.9.d.9.9.9.9.9.9.9.9.f.f.0.f.0.0.j.i.i.0.0.0.0.f.9.9.9.9.9.9.9.j.9.9.d.9.9.9.f.9.9.9.f.e.u H.y+C+y+y+C+z+z+z+z+z+w+z+z+w+y+y+y+z+z+z+A+z+z+z+v+y+z+A+w+w+w+z+z+y+v+y+w+y+A+v+z+z+z+y+w+w+y+E+G+T.n.2+9+|+|+|+}+|+9+9+|+|+9+9+|+|+|+9+|+}+7+2+2+2+}+}+}+2+2+9+9+9+f+f+7+}+2+|+}+}+|+9+|+|+|+|+7+f+b+9+C.4.~+q+s+k+k+h+q+k+h+k+h+h+s+s+k+k+h+k+d+h+d+k+k+k+k+k+s+k+t+e+s+s+k+s+h+h+k+h+h+k+h+h+s+s+k+l+k+q+u+[+c.c ` X X Z ` Y +.` ` ` ` ` Z ` ` Z X Y Y Z U Y Y Y Y U U Z U U Y Y +.X Z U U Y U Y Y Z Y Y Y Y Y Y ` y u.4+_+_+(+<+:+(+:+:+:+:+:+:+<+:+4+4+3+:+:+:+0+0+{+_+(+:+(+0+^+:+:+:+:+:+:+(+{+:+:+:+:+:+:+:+:+:+(+4+u.", -"v.4+4+4+:+<+:+<+:+(+(+(+3+3+(+(+:+:+:+(+:+:+:+:+:+:+:+<+4+4+:+<+<+3+4+(+_+_+3+3+(+:+:+:+3+:+:+:+3+4+u._.U.#+.+W.Z.W.W.Z.U.U.U.U.U.U.U.U.W.U.U.U.U.W.W.U.U.U.`.Z.W.U.U.#+U.U.U.U.U.U.U.U.U.U.U.U.U.U.Z.U.#+F.v q =.=.=.=.=.=.=.*.*.=.=.'.=.=.=.=.=.=.=.&.'.=.=.&.=.*.=.*.*.*.=.=.=.=.=.=.=.=.*.=.=.=.=.>.>.=.'.&.>.0 o w B B B x B B B A w x B B B B B A A B B A x B A A B B B B B B B B B B B B B B B B B B x x B A A w h N i.d.9.d.0.f.8.9.9.9.9.j.9.f.9.d.f.d.f.0.j.9.j.9.9.9.e.e.b.8.b.e.j.9.9.9.9.9.9.9.9.9.j.j.9.9.9.j.e.u H.y+C+y+x+v+z+z+z+z+z+z+z+z+x+y+y+y+G+w+w+z+F+z+z+w+z+z+A+A+A+z+B+z+y+w+z+z+z+z+w+z+z+z+z+w+y+F+C+G+T.n.2+b+9+}+|+|+9+9+|+}+|+9+b+b+|+9+9+f+7+}+f+9+7+|+|+9+9+}+|+|+9+9+b+9+|+9+}+9+9+9+9+9+9+9+}+}+9+5+f+C.p.[+q+s+k+h+k+k+h+h+k+k+h+s+s+k+k+h+h+q+h+h+s+h+s+k+d+s+s+t+s+s+t+t+s+k+h+h+h+h+k+k+h+q+q+k+k+t+t+q+[+6.n P +.+.` ` Y +.U U U U U Z ` U +.+.+.Y +.Y +.+.+.+.X +.+.X +.+.+.+.Y X +.+.+.+.+.Y Y Y Z Z Y Z Y ` p q.6+<+_+(+<+3+(+:+(+(+:+3+_+<+<+:+:+<+(+<+3+:+_+^+^+4+^+4+:+(+:+3+3+:+:+3+3+3+3+:+:+:+3+:+:+(+4+_+4+u.", -"u.p+4+4+:+4+:+4+3+:+3+:+:+3+:+:+:+3+3+3+:+3+3+3+6+:+4+4+4+<+1+:+3+4+:+(+:+_+3+(+4+:+3+3+3+:+<+3+3+4+u.[.Z.`.W.W.U.W.Z.U.W.U.U.W.U.U.U.W.W.U.U.W.W.U.#+U.U.U.W.W.Q.U.U.U.#+U.U.U.Z.#+W.U.U.U.U.U.W.U.U.U.#+w.v O %.=.&.=.=.=.=.&.&.*.=.'.=.=.'.>.'.=.=.&.&.'.'.=.=.=.=.'.'.=.=.=.=.&.&.&.=.=.=.=.=.=.'.%.*.=.'.=.#.0 3 B B B B w B B B B B B B B B B A I y y y B y y y x B B B A A B B A B B B B B B B A A x B B B A A w 2 Q i.e.9.d.f.f.8.9.9.f.j.9.9.f.f.8.8.8.9.b.e.e.d.d.9.f.f.f.9.d.d.j.j.9.9.j.f.d.d.d.9.9.j.j.9.9.9.9.e.u I.G+C+y+v+C+z+z+z+z+z+z+z+z+w+w+z+z+z+A+A+E+z+y+y+y+B+B+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+C+F+C+G+T.m.2+b+f+|+9+9+9+9+|+|+9+9+9+|+|+|+9+9+9+}+9+9+b+b+9+b+b+b+f+|+|+9+|+|+|+b+9+f+9+9+9+}+f+9+}+}+9+b+f+N.y.~+u+s+h+h+s+s+s+h+h+h+q+s+h+d+h+q+s+q+q+q+h+q+s+k+h+l+u+l+k+h+t+s+t+k+h+s+u+q+h+h+l+s+q+l+l+s+r+q+]+K c Z .X P @. .+.+.+.+.+.Y X U Y Z Z Y U Z Z Z U Z Y Y U Y Z Y Z ` ` ` ` ` Z Y Y X Y Z X Y Y Y Y +.U y P.a+_+^+(+:+3+3+3+:+3+:+3+3+<+<+4+<+3+<+:+<+^+6+<+:+^+^+3+6+<+:+:+3+4+(+:+3+:+(+(+:+:+:+3+:+:+3+_+4+u.", -"T.p+p+3+4+4+(+4+4+a+6+3+a+6+a+6+4+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+3+a+_+u._. +,+.+W..+#+#+#+#+W.#+#+#+#+W.#+#+#+#+W.W.#+#+#+W.W.#+#+#+U.U.#+#+#+U.W.W.#+#+W.#+#+#+#+W.#+#+#+#+u.m ~.O >.*.=.*.*.=.%.%.'.*.>.=.,.%.'.%.*.,.%.'.>.*.'.,.=.>.'.,.%.*.,.%.%.'.>.*.=.%.%.%.%.*.%.%.!.!.*.#.v f w A w A E E I B E B A w I E I A E I E A w E A E B B I A w E w E B B B B B w E B A B z A w w I w B 0 8.0.0.0.0.f.0.f.f.e.f.e.e.9.e.e.e.9.e.9.e.9.e.9.e.9.e.9.9.9.9.e.f.f.9.e.e.9.e.d.e.e.d.e.e.9.e.9.e.i.N r.y+F+E+G+B+E+E+D+E+E+D+D+E+E+E+E+E+E+E+A+A+E+E+A+C+D+E+E+E+A+C+E+E+E+D+E+F+E+E+E+D+E+E+D+D+E+F+E+B+&+C.}+9+7+}+7+f+f+f+7+f+f+7+f+7+7+f+f+7+f+7+f+f+f+7+7+}+f+f+7+7+f+7+f+f+7+f+f+f+7+f+7+f+f+7+f+2+2+f+2+J.p.*+q+u+u+l+l+s+s+l+n+t+u+u+l+h+u+u+u+u+l+t+u+u+u+s+u+u+u+u+h+u+u+u+u+u+h+u+u+u+u+l+u+u+u+l+l+u+u+u+d+-.G . .+.U . . .+.+. . . . .+. .+.T T +.T T . .+.+. .+. .+.+.G .+.+.+. . . . .+.+. . . . .+.+. .Z x O._+p+j+:+_+a+a+a+a+a+a+a+3+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+6+a+a+a+a+3+3+3+6+a+3+3+3+p+4+p+H.", -"_.k.k.k.w.q.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.q.q.k.k.k.}.k.k.k.k.}.k.k.k.k.v.q.k.k.Q.f W ].A ~.).}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.).}.}.}.}.}.}.}.}.}.}._.}.}.}.}.}.).}.}.[.].}.J < 0 k k k j k k k j j j j j k j j j j j k j j j k j j j k j j j k j j j j k k j j j j j k k j q q C F 2 ; f 2 h 2 2 2 h 2 2 3 3 2 h 2 h 2 2 h 2 2 2 2 2 3 3 2 h 2 2 2 2 h f l 3 2 2 2 2 2 2 f f 3 2 2 2 3 3 2 u s N s s s s N s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s D a.H.D.D.I.r.I.I.I.I.I.I.I.I.I.H.I.I.I.I.H.x.I.I.I.I.H.I.H.I.I.I.I.I.H.H.I.I.H.H.H.I.H.I.H.I.H.T.I.I.F 7.h.C.n.n.h.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.m.C.n.t.h.4.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.A.y.y.y.y.A.y.y.y.y.A.A.y.y.y.A.y.y.A.y.y.y.y.y.y.A.y.y.y.y.y.E.c.I i i } p p i p e i d d d i d d d n d d d d i i e d } i d i d d d d d d i i d d d d d i d e i i p d e ( m q.[.[.[.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.}.k.q.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.w._.", -"( } d n d } p d d d d p i p i i i d d i d d d d i d i p d d d d d d d d d i p d d d d d p i d d i n ' f [.u.q.[.<.u.[.q.[.[.[.[.[.[.[.[.u.[.[.}.q.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.u.[.[.[.[.[.[.[.[.u.F.w.(.8 ).O ~.).).).k.}.k.}.).}.1.).).).).}.}.).}.).}.).).}.).).).).).}.}.).}.).1.}.k.).1.}.k.}.}.}.}.O O ).l f k k k k k k m k k k k k k m m k k m k k k k k k k k k k k k k k k k k k k k m k k k m k j k m 0 z m ; f 2 f 2 f f 2 2 2 2 2 f 2 f 2 f 2 2 2 2 f f 2 f f 2 2 f f f f 2 2 2 2 2 f f 2 2 f 2 2 f f 2 2 2 } 3 1 u u u u u s u s s u s s s u s s s u s s s u u s s s s s s s u s s s s u s s u s s s s s s s N N Q 1 H t.D.H.H.H.T.H.H.H.H.H.H.H.H.H.I.T.H.H.H.H.H.H.T.H.H.T.H.H.H.H.H.T.H.H.H.H.H.H.H.H.H.H.I.H.H.D.D.H.W 5 A.p.n.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.n.m.m.m.m.n.m.m.m.m.m.m.m.m.m.m.m.m.m.m.n.m.m.m.m.n.n.m.m.m.7.5 c.A.A.y.y.y.B.A.E.E.y.A.y.B.E.E.A.E.E.E.B.y.A.B.E.E.B.c.y.y.E.E.y.E.c.E.y.y.B.E.E.E.y.A.y.E.E.y.y.S.B h r d E } d d d d d d d d d d p i d d d d d d d d d d d d p i d d i d d d d i i d i p i p p d n } e ( ", -"M M @.@.Z M ` Z ` ` P P P P P P ` @.@.@.@.@.@.@.` ` @.@.` ` U Z Z @.Z U @.@.@.@.@.@.@.@.@.Y @.@.Z M d k.1+3+4+4+a+3+0+p+4+4+4+4+4+4+4+4+4+4+4+3+4+4+4+4+4+4+4+4+4+3+4+4+4+4+(+p+p+0+0+3+4+4+4+4+4+0+p+1+p+O.[.M.#+#+#+.+W.#+#+#+W.#+#+#+#+#+W.#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+`.`.U.#+#+R.~.j *.*.>.*.>.*.%.%.*.>.=.=.=.%.%.%.>.%.>.>.%.%.%.=.=.=.%.%.*.=.=.%.%.>.*.=.=.=.%.*.=.*.*.>.#.#.>.>.>.q o E E E E E E E B B E y B B B B B E B B B B B y x B B B B B B B B B B x x B B B B B B B B B B B y z k ,.i.e.e.i.f.i.i.j.e.j.i.i.i.j.i.j.j.i.i.i.i.i.i.i.i.j.j.i.i.i.j.i.i.i.i.j.e.i.i.i.i.i.i.i.i.i.j.f.i...r.x+E+B+y+B+B+B+B+B+B+B+B+G+G+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+E+B+B+B+C+B+B+G+D+g+t.&+2+7+7+7+7+7+7+7+2+7+f+7+7+7+7+f+7+7+f+2+7+7+f+}+2+2+7+7+7+7+7+f+7+7+2+7+f+7+7+7+7+f+7+2+2+7+7+2+$+p.S.s+s+t+l+l+s+t+t+t+t+t+t+t+s+s+l+t+t+t+t+t+l+t+t+t+t+s+l+t+t+t+t+t+t+t+t+t+t+t+s+t+t+s+t+t+t+t+u+d+y.d Y +.P M ` @.@.@.@.Z @.@.@.U U Z @.` @.@.@.@.Z U U ` ` @.@.@.@.@.@.@.@.@.Z Z P P P P P P ` ` @.@.M e ", -"e @.+.+.Y Y Y +.+.U +.U +.Z X +.+.+.+.+.+. . .+.+.+.+.+. . . .T .T +. .T +.+.+.+.+.+.+.+.+.+.+.+.Y i ).4+a+a+<+a+a+3+3+3+:+6+4+3+a+^+3+a+^+_+:+:+3+^+_+:+a+a+(+3+:+:+_+:+3+<+:+<+3+3+:+:+(+<+3+(+a+a+6+p+O._.w.Z.Z.U.Z.W.W.W.W.U.U.Z.W.U.U.Z.Z.Z.W.U.U.U.U.U.U.U.U.Z.U.Z.U.U.W.W.U.U.U.U.W.Z.U.Z.W.W.U.`.U..+#+M.m q %.&.&.&.&.&.&.&.&.&.&.&.&.=.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.=.=.=.=.>.=.k } B B B B B B B y z z y z z y y y y z z y y z y z z y y y y y y y y y z y y z y y B z y z y y z y B 2 s 9.8.8.e.e.b.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.d.8.d.u ^.w+D+C+A+A+D+A+A+D+D+E+C+C+D+D+E+A+A+D+D+D+A+C+A+D+D+D+D+A+A+D+D+D+A+D+D+D+D+D+D+A+D+D+D+D+E+C+A+D+i+n.;+b+b+|+b+b+b+9+b+b+b+b+b+b+b+b+b+b+b+|+|+9+b+b+|+b+b+b+b+b+b+b+b+5+9+b+b+5+9+|+b+b+b+b+b+|+b+5+9+%+p.S.q+r+q+q+q+q+q+r+t+q+q+q+r+t+q+q+q+r+s+r+r+q+q+t+r+r+q+q+t+r+q+q+q+t+r+q+r+q+r+r+q+q+q+q+q+q+q+r+o+y.d .T +.U +.T +.+.+.T +.+.+.T +.T .+.+.+.+.+. . .+.+.+.+.+.+.+.+.+.+. . .+.+.+.Y +.Y @.Z +.Z .+.@.M ", -"M U Y +.+.Z Y +.+.+.X . .X Y Y +.+.+.+.+.+.+.+.+.+.+. .+.+.+.+.+.+.+.+.+.+. .+.+.+.+.+.+.+.+.+.+.+.c k.{+<+<+<+:+3+3+:+<+<+3+3+<+:+:+6+6+a+6+<+a+4+3+<+:+:+3+:+3+:+a+a+_+3+:+3+:+3+a+:+<+3+_+3+:+:+_+<+4+v./.M.Z.Z.R.R.Z.Z.Z.U.Z.Z.R.W.Q.R.Z.Z.Z.Q.Z.Z.Z.Q.Z.Z.Z.Q.Z.Q.Q.Z.Z.Z.Z.#+Q.Z.R.Z.R.Z.R.R.R.W.W.W.W.#+M.m q '.&.&.&.&.&.&.&.=.&.&.&.=.&.=.&.&.&.&.&.=.&.&.=.&.&.&.&.&.&.&.&.&.&.&.=.&.&.&.&.&.&.&.=.=.=.=.=.=.O 3 z z z z z z z B x B B B B B B A B B B B B B B y x B B B B x y B B B B x z A B B B B B B B B B B R f u 0.8.8.9.d.9.9.d.f.9.9.9.9.d.9.9.e.e.9.9.9.9.9.e.9.9.f.9.e.e.f.9.e.f.9.f.9.f.9.9.f.9.9.f.f.f.9.9.d.Q r.x+D+C+w+y+y+F+F+F+w+w+z+E+E+z+y+y+y+z+F+F+z+z+w+z+F+F+F+y+y+y+z+F+y+z+w+E+E+F+F+z+y+F+F+w+x+y+z+G+'+n.%+f+9+9+|+9+9+9+9+|+9+9+9+f+|+|+9+9+9+|+9+9+9+9+|+9+9+|+|+9+9+9+9+9+9+|+|+}+9+|+|+9+9+|+|+|+9+f+f+;+p.S.r+t+q+s+u+q+q+s+k+q+q+s+h+h+h+q+s+s+k+h+h+q+u+k+d+h+q+q+h+h+k+s+s+k+h+q+s+h+h+h+h+h+q+s+s+q+u+r+o+y.d .T +.+.+.+.+.+.+. .+.+.X +.+.+. .+.+.+.+. . .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Y X . .+.+.Z +.T Y @.e ", -"e ` U Z Y ` ` Z U U U @.Y U Z @.Y Y @.@.U Y U Y @.` Y Z Z U Y U U Y U ` U ` U Z Z Y Y Y Y Y ` ` Z .n 1.=+<+a+(+{+(+:+:+<+:+<+<+:+<+:+<+<+:+:+:+<+<+:+:+:+:+<+:+:+:+:+(+:+:+:+_+:+(+:+:+<+<+:+<+<+:+:+:+4+O.(.G.U.U.R.V.)+W.W.#+U.L.L.W.V. +R.Q.R.`.w.`.(+Z.Q.Z.w.W.Z.W.=+Z.Z.Z.`.v.R.W.R.`.{+Q.R.)+V.W.Q.W.W.#+M.v q %.=.*.%.%.*.=.&.=.*.*.=.*.&.*.%.*.=.*.&.=.%.*.*.=.=.=.%.*.*.*.=.&.=.*.*.*.*.=.%.%.'.&.*.=.*.>.%.%.k 3 x A w w w B y A E E w B E w E w B B B x w E I A A I E E w x B E w B A w B B E I w x B E w E E B E 2 u f.d.d.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.f.0.0.0.0.0.0.0.0.0.0.0.0.0.j.f.i.s r.m+C+C+w+y+y+y+y+y+w+v+y+y+y+y+y+v+v+x+z+y+y+x+y+x+v+y+y+y+w+v+y+y+y+w+x+y+y+y+w+w+y+y+y+w+x+x+v+G+>+h.$+f+}+}+}+|+}+f+}+}+}+}+|+}+}+}+}+9+}+}+}+f+}+}+}+}+}+}+}+}+|+}+}+}+}+}+f+}+}+}+}+}+|+}+}+}+}+}+f+;+p.S.e+k+e+e+k+d+d+d+d+d+d+l+d+k+d+k+l+k+l+k+d+d+l+d+d+l+d+d+d+d+l+l+d+d+d+d+l+l+d+l+k+d+d+l+d+d+d+k+e+6.e Y T +.` Y Y U Y ` ` U Y U U Y ` U ` U ` @.` ` @.U Y Z @.@.U U Y Z Y U U Y U U @.` Y X Y Z X +.Z ` e ", -"M M @.Y U ` ` @.Y U ` @.U ` @.U ` ` ` ` ` ` ` ` ` ` ` ` ` ` P M ` ` ` ` ` ` ` ` ` M ` ` ` ` ` ` ` X e 1.<+a+^+{+{+(+:+4+(+:+3+4+:+:+(+(+:+(+(+:+:+:+:+:+:+<+:+:+:+:+_+(+_+:+_+(+^+(+4+<+:+:+:+:+:+:+0+4+0+u.I G.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.Z.U.`.`.`.`.`.U.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.U.Z.U.R.Q.R.U.`.F.v q =.>.#.,.#.%.%.#.*.,.%.#.%.#.*.%.,.O %.#.#.%.%.#.#.*.#.%.%.#.#.*.>.%.%.#.#.>.>.>.#.%.%.%.%.%.,.,.%.k 3 A w A w E w w B B A w x A w A A B B A w A B B A A A B B A A A A B B A w B B A A A A B w A I w A z l s f.8.8.d.9.9.9.9.9.9.9.9.9.9.9.9.9.j.9.f.9.9.9.9.f.j.j.f.9.9.f.9.9.9.d.9.9.9.9.9.9.j.f.9.9.d.f.9.f.s r.m+v+B+B+C+z+y+C+z+C+G+y+z+C+w+z+z+w+C+z+C+y+C+C+v+C+z+z+C+v+y+C+z+w+C+w+y+y+C+w+w+C+z+z+A+w+z+C+C+>+h.$+f+}+}+}+}+}+}+}+}+}+}+|+}+}+9+}+}+9+}+}+}+9+}+}+9+}+}+}+}+|+}+|+}+}+}+}+7+}+}+}+}+}+9+|+}+}+9+9+;+p.S.l+l+l+d+l+l+u+h+h+l+d+q+h+k+h+h+s+k+k+k+k+h+s+h+k+h+q+h+h+h+h+h+h+h+k+h+l+h+l+h+h+h+h+h+h+h+h+q+d+6.i Y +.U M ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` @.` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` Z Z Z Z ` U U @.@.@.e ", -"n P +.+.Y ` @.+.X Y Y Y Y Y Y Y Y X +.Y @.@.Z @.@.+.X Z +.+.+.+.Z ` @.Z +.+.+.+.+.Z +.@.@.Y Y Y Y .e }.3+3+_+_+:+3+3+(+:+:+3+3+:+:+:+:+3+3+(+4+4+4+4+3+_+:+3+_+4+(+(+3+3+:+:+<+<+a+_+:+:+:+:+3+(+:+3+3+4+O.}.M.#+#+#+U.U.U.U.U.U.U.W.#+#+U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.#+U.U.U.U.U.U.U.U.#+U.Z.U.U.Z.Z.W.M.v q =.=.*.*.*.*.=.*.=.*.=.=.=.*.*.=.=.=.=.*.=.=.=.=.=.=.=.=.=.=.=.&.=.*.*.*.*.=.*.*.*.%.&.=.>.%.%.%.>.q o E A B w B B y B x B A B A A x B B A A w I A z y x A A A x x B A A A B B B B A B B B B A B B B B B 2 s j.8.d.0.j.j.j.d.9.9.9.9.9.d.e.e.e.9.d.f.f.f.d.d.d.d.e.b.e.9.8.b.j.j.0.9.8.8.j.9.j.j.j.j.9.9.f.8.j.u r.v+C+G+z+w+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+C+C+y+B+z+F+y+y+x+G+y+z+A+y+z+z+z+z+z+z+z+C+z+y+y+A+C+'+n.%+f+9+|+}+|+9+9+|+}+9+f+7+}+9+9+}+7+b+|+|+|+|+b+|+7+b+f+9+|+9+7+|+7+}+|+9+9+9+|+}+|+9+9+}+}+|+9+f+%+z.S.s+s+l+l+k+r+q+s+h+h+h+h+s+k+q+s+q+s+s+k+t+k+t+s+k+s+r+s+s+s+s+k+t+s+s+k+k+s+s+s+h+h+s+h+h+s+s+s+h+6.e Y T @.` +.Y @.+.Y @.Y @.Y @.Y Y Y Z Y Y Y +.+.Y U U Z Z Z ` ` @.Z U U +.+.Y Y Y Y Z Z Y Y Z +.Y @.e ", -"e ` Z +.` ` @.+.X Y Z Y Y Z Z Y X X Y Y U U Z ` ` @.Y Y Y U ` Z Z @.Z Z Y Z Y X Y Y X Z +.Y Y Y Z Y e :.<+a+6+_+:+:+3+3+(+(+:+3+3+(+(+:+:+3+3+(+3+3+(+4+(+:+:+3+3+(+_+_+_+4+:+:+:+p+3+:+:+:+:+3+(+_+3+3+4+O.[.M.#+W.W.U.Z.W.W.U.U.U.W.W.W.Z.Z.#+U.Z.R.U.W.Z.W.U.Z.U.#+U.U.U.U.U.U.U.U.U.U.U.U.U.#+#+W.++++W.Z.#+M.v q &.=.&.&.=.=.=.=.&.=.*.=.*.&.*.=.*.=.=.=.=.=.&.=.=.>.=.#.*.=.=.=.=.=.=.=.=.=.'.=.=.=.&.=.*.*.=.=.#.k l A w B B B B x B B B B x B B B B A y A A w I I A x x x B B y x B B B B A B B B B B B B B B x x B E 2 s 9.8.f.0.j.e.9.9.9.9.9.9.9.9.d.e.9.9.d.d.d.9.9.d.d.d.e.d.d.d.8.e.j.f.d.f.d.d.9.9.9.9.j.9.9.9.f.d.j...r.y+C+F+z+w+z+z+z+z+z+z+z+z+z+z+z+z+z+z+w+G+C+C+z+y+y+y+z+z+w+y+y+C+z+z+B+C+z+z+z+z+z+z+z+C+B+F+E+G+>+h.$+9+9+}+|+9+9+9+|+|+|+9+9+|+|+9+9+7+9+}+9+9+}+}+7+7+7+9+9+}+7+f+7+7+}+|+9+9+9+|+|+|+9+9+}+}+b+b+9+%+p.S.r+t+k+l+s+s+s+s+k+h+s+s+s+k+s+q+s+s+k+s+h+k+k+k+k+s+s+s+k+s+s+s+s+k+k+k+t+r+k+s+s+s+s+h+h+s+s+r+e+6.e .+.@.` X Y Y Z Y Y Y +.X Y Z Y Z Y Y Y Y Y Y Y U Y Z Z Z Z @.U Y U U U Y Z Y Y Y Z Y Y Y Y +.+.@.e ", -"e ` +.+.@.` Y +.X Y Z Y Y Y U Y @.@.Y Z Z Z Y +.@.P ` ` ` ` ` ` ` +.Y @.@.` ` ` M Y Z Y Z Y Y Y @.Z e 1.{+3+^+^+<+3+3+:+(+:+:+3+3+(+4+4+3+4+3+(+(+:+3+3+:+<+_+_+:+:+(+4+^+3+:+(+:+6+:+:+:+:+:+3+:+:+_+^+4+O._.F.#+W.W.U.U.U.U.U.U.U.U.U.U.U.Z.U.W.W.Q.Z.U.U.W.U.U.U.Z.U.U.U.U.U.U.U.Z.#+U.U.U.U.#+#+W.`.`.U.Q.W.M.v q *.=.*.=.&.=.=.=.=.=.=.=.=.&.*.*.=.=.*.*.*.&.#.*.*.*.*.=.*.=.=.=.=.=.=.=.=.=.'.*.=.=.&.'.*.*.=.=.>.k o B A B w B B B x B B B B B B B B y x A B x x A A x y x x x y z B B B B A B B B B B B x B x B B B B 2 s e.8.f.0.j.9.9.9.9.9.9.9.9.0.0.0.9.9.9.9.d.d.f.f.f.f.f.f.f.d.b.e.j.i.0.0.d.f.9.9.9.j.f.j.9.9.f.e.e.u r.B+C+y+y+A+z+z+z+z+z+z+z+z+z+w+z+z+z+z+y+y+y+G+z+y+y+F+A+D+y+y+F+C+z+w+B+z+z+z+z+z+z+z+z+z+B+F+E+G+'+h.%+9+9+}+}+|+9+9+|+|+|+9+7+}+9+9+9+}+}+|+9+}+}+}+f+f+9+9+}+}+}+}+f+}+}+|+9+9+9+|+|+9+9+9+}+}+9+9+7+%+z.S.q+r+k+l+s+r+h+h+k+h+s+s+s+h+h+u+s+h+d+h+h+u+l+s+h+h+s+h+k+k+s+s+s+l+l+s+k+t+t+s+s+s+s+k+k+h+s+r+e+6.e Y +.Z ` U Y Y Y Y Y Y X Z U Y Y Y Y Z Y Y Z ` Z ` @.Y Z X +.+.+.X Z Z Z Z Z Y U Y Y Y Z U Y +.Y ` e ", -"e @.+.Z Z ` Y +.X U Y Y Y U Y Y X +.Y Z Y X +. .+.Z Z @.@.@.Z @.U T .+.Y @.` ` @.Y Y Y Y Y U Y +.Y e 1.<+a+^+^+<+:+:+:+:+:+:+:+:+(+:+(+(+:+(+:+:+:+:+:+<+<+:+<+:+:+_+{+(+3+:+:+:+:+:+:+:+:+:+:+:+:+:+:+4+O.[.M.#+U.U.U.U.U.U.W.R.U.U.U.U.U.U.U.U.W.Q.U.U.W.Z.U.U.U.Z.U.U.U.U.U.U.U.U.U.U.U.R.M.M.U.W.U.U.U.W.#+M.v q '.&.*.*.=.=.=.=.*.*.=.=.*.=.*.&.*.*.&.&.&.=.=.*.*.*.%.%.%.*.=.=.=.=.*.=.=.=.=.*.*.=.&.'.%.*.=.*.>.q l A w A B B B B B B B B B B x B y B x p y x x A B x x A A z z B B B B B B B B A w B B B B x B B B E f s d.8.9.0.j.9.9.9.d.9.9.9.9.0.i.0.9.e.d.d.8.d.d.d.d.d.9.9.d.d.j.e.j.j.d.9.d.f.f.9.9.j.9.9.9.9.0.b.j.u r.z+D+y+y+w+z+z+z+w+w+z+z+w+z+z+z+z+z+z+v+y+y+z+A+y+y+w+D+D+D+v+F+z+C+w+y+z+y+A+z+w+A+z+z+w+y+z+D+A+>+h.%+f+9+|+|+|+|+|+9+|+|+}+|+|+}+|+}+|+9+|+|+9+|+}+}+}+|+|+}+|+|+|+|+b+|+}+|+|+|+|+|+|+9+}+}+}+9+9+7+%+p.S.t+s+k+d+k+s+k+k+k+k+k+s+h+k+k+k+q+h+l+k+k+k+k+k+k+h+h+k+k+s+s+l+k+k+k+h+k+k+k+k+h+k+k+k+k+h+h+s+e+B.e X +.Z ` +.Y Y Y U Y Y Y Y U Y Y Y U Z Z Y Z ` @.U Y Y +.+. . .+. .+.Z Z Z Y Y Z Y Y Y Z Y Y +.+.@.e ", -"e ` X +.` ` Y +.X Z Z Y Y U Y Y . .+.+.@.Y . .T +.+.+.+.+.+.X .T T Y +.Y @.+. .U Y Y Z Y U Y X Y e 1.a+a+^+^+<+:+^+:+:+:+:+:+:+:+:+<+:+:+=+<+1+^+_+(+(+{+3+6+4+<+0+_+4+_+=+:+(+:+:+:+:+(+:+:+:+:+:+(+0+O._.w.Z.W.W.R.U.U.U.U.R.R.Z.U.U.U.U.U.W.Q.Q.U.W.`.`.U.U.U.U.U.U.U.U.W.R.R.Q.W.Z.#+W.M.U.U.U.U.R.R.U.#+M.v q =.=.*.*.=.=.=.&.*.*.&.=.*.=.*.=.=.&.%.&.%.&.&.=.=.*.%.,.%.*.%.,.%.*.*.*.=.=.*.*.=.=.&.=.*.%.*.>.>.q o B B A A B B B B B B x B B B B y y r y y x A B B A A A w w w I w A B x B B B A w B B B B B B x B B 2 s e.8.9.0.j.9.9.9.9.d.9.9.9.d.d.j.j.j.j.j.b.e.d.9.i.i.j.j.d.9.9.9.9.9.f.d.9.e.f.d.9.9.9.j.d.9.9.8.j.u r.y+D+A+y+w+z+z+z+z+w+w+z+z+w+w+z+z+z+z+v+v+z+A+E+y+y+B+A+F+z+F+E+y+z+w+y+z+z+z+w+y+z+z+z+w+y+y+E+F+>+h.%+9+|+|+|+|+|+|+|+}+f+}+|+}+|+}+}+9+9+|+|+9+9+9+f+}+7+9+}+|+|+|+b+5+|+}+|+9+|+|+|+}+|+|+}+}+|+|+7+%+p.S.t+s+k+l+k+k+k+h+k+h+s+h+h+k+h+k+q+s+s+k+k+k+o+e+k+t+t+s+k+t+o+s+l+k+k+k+k+h+k+k+k+k+h+h+k+k+k+s+e+6.e Y +.@.` Y Z Y Y Y Y Y Y Y Z Z Y Y Y U Y Y +.+.X Y Y .+.Y +. .+.@.P @.X . .Y Y U Y Y Y U Y +.Z @.e ", -"e P +.+.@.` Y +.X Y Z Y Y U Z Y .+.X @.P P ` Z Y Y Z Y Z Z Z Y Z Z P P P P X .T Y Y Y Y Y Y Y Z Y d 1.:+^+_+^+<+:+(+:+:+(+(+:+:+:+:+:+:+(+(+:+3+4+0+0+:+<+v.Y.!+3+0+_+4+0+{+(+<+4+:+:+:+(+(+:+:+:+3+4+p+O.[.M.#+W.W.Z.U.U.U.U.Z.Z.Z.#+Z.M.#+#+#+Z.@+W.#+U.(+#+#+#+#+#+#+#+#+#+Z.Q.@+`.#+#+#+U.U.U.#+`.U.R.R.#+G.v q =.=.&.=.*.=.=.=.*.*.=.=.=.&.*.=.=.%.,.'.%.#.*.O q q q #.%.%.,.%.%.%.%.=.=.=.'.=.=.&.&.*.*.=.=.=.>.k l A A B B A p B B B B B w B B A y w A w w w w w h h o o w w w l A B A B x B B A A B B B B B A B B B 2 s 9.8.0.0.j.9.9.d.d.9.9.9.d.9.d.e.j.i.i.i.i.i.i.5.2.2.2.5.5.5.i.i.j.j.9.d.e.d.9.9.9.9.9.9.9.9.f.8.j.u r.y+A+y+y+z+z+z+z+z+w+z+z+z+z+w+z+z+z+z+w+A+C+E+w+x+>+x+>+j+'+j+m+y+y+w+y+z+z+z+w+w+z+z+C+w+B+z+E+G+'+h.%+9+|+}+}+9+|+|+|+|+9+f+9+9+|+}+9+f+7+9+f+7+7+%+$+K.$+K.7+7+9+9+9+9+|+}+|+9+|+|+|+|+|+9+9+}+|+9+7+$+p.S.r+s+l+d+k+t+k+k+k+k+h+s+k+k+k+s+s+s+s+s+s+[+[+X.X.[+[+e+n+s+e+n+h+k+k+l+l+s+k+k+s+s+s+k+k+h+s+s+k+6.e Y +.Z ` +.Y Z Y Y Y Y Y X Z Y Y Z Z U Y Y . .+.Z @.P M M M M M n n c Y . .Y U Y Y Y U Y Y +.+.@.e ", -"e @.+.+.Z ` @. .Y Y Y Y Y Y Y Y ` P e i } ( } d d d d d d d d d d d i i i i c Y Y Y Y +.Y Y Y Y Y Z e }.:+3+_+^+<+3+3+3+:+(+:+3+:+3+:+(+4+(+3+6+^+v.[.J [ 4 ~ { 4 a 7 _.s.1+4+4+:+0+(+:+:+3+3+:+:+:+^+^+4+O.[.M.#+.+W.U.U.W.W.U.U.W.W.#+M.J ).).).).:.).8 ).}.8 ).).).).8 ).}.v ).).:.}.).).w.U.U.U.Z.U.U.Z.Z.#+M.v q *.=.=.&.*.=.&.=.*.*.=.=.=.=.*.=.=.%.#.j k | < = = , , , | | j j #.>.=.=.=.=.=.=.=.'.&.=.*.>.*.=.>.k 3 B w B x B y B B B B B A B x B w I I h h 2 ; * * * * & * * ; l l A A B B A A B B B B B B B B B B E 2 s e.8.j.0.j.e.9.9.9.9.9.9.9.9.9.f.0.5.5.N s : : : : : : : : 1 N 5.i.f.d.e.d.9.9.9.f.9.9.9.9.9.f.8.j.u r.v+C+B+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+A+A+E+j+T.9 g 9 4 g 4 g >+y+w+w+z+z+z+z+z+z+z+z+C+B+y+D+G+'+h.%+9+9+}+}+9+9+9+|+|+9+9+|+|+|+}+f+9+&+C.n.L L 5 5 5 5 5 L L n.C.$+8+}+|+9+9+9+|+|+9+9+9+9+9+9+b+f+$+z.S.r+r+l+l+s+t+h+s+s+s+h+q+s+k+h+l+s+~+*+c.b b b b b b b b R c.y.e+s+s+k+k+h+s+l+l+s+s+s+h+h+h+s+s+e+B.e .+.U ` Y Z +.Y Y Y Y Y Z Y Y Y Y Y Y Y Y . .X P M e ( ' ' ' ' ' ( e ` +.+.Z Y Y Y Z Y Y Z +.+.` e ", -"e ` +.+.` @.@. .Y Y Y Z Y Y Y X M } ; * * @ % % % % % % # % % % % # # % & ' e P ` Y Y Y Y Y Y Z Y +.e k.(+a+^+_+:+:+3+3+:+:+:+3+3+:+(+4+4+4+<+s.H , + # . . . . . . + ~ ^ F s.(+4+{+3+:+:+3+3+3+:+:+4+:+p+O.[.M.#+W.U.U.U.#+W.U.U.U.Z.U.w.@ @ @ @ @ @ @ + @ @ @ @ @ @ @ # @ @ $ @ @ @ @ @ @ }.U.U.U.W.++++Z.#+#+M.v q =.=.*.=.=.=.=.&.*.&.=.=.=.=.=.&.=.| | , % $ @ @ % @ @ @ @ + $ = = q &.%.=.=.*.%.=.&.&.=.>.*.=.*.>.k l w A B A B B B B B B B B B B B w l 3 ; * * % & % @ @ @ @ @ @ @ ; ( w A B B A B A B B B B B B B B E 2 N e.8.9.0.j.9.9.9.9.9.9.9.9.d.f.f.0.N 1 : = + . . . @ @ + . > : 1 N 2.i.9.9.j.j.9.j.j.j.j.9.9.f.d.e.u r.B+D+F+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+w+E+E+y+j+g . @ @ @ @ + @ T.y+w+z+z+C+z+z+z+z+z+z+w+B+y+A+C+'+h.%+9+9+|+|+9+|+}+|+|+9+f+}+}+|+9+5+N.a ) - @ + $ @ $ @ % @ - - / L L }+b+9+9+9+|+|+}+9+9+}+}+|+b+7+$+7.S.q+s+l+l+s+t+s+h+h+k+s+q+s+k+d+n+c.3.b { % @ $ , , = + @ # ! a R S.k+s+k+l+l+l+l+s+h+s+k+k+s+s+r+e+6.e X +.U ` +.Y X Y Y Y Y Y Y U Z Y X Y Y Y @.+.+.Z M i ' & . - - - . & ( M Z +.Y Y Z Z Y Y Y Y +.X ` e ", -"e P Y +.@.` @.+.Y U Y U U U Y Y M ( % @ . . . . . . . . . . . . . + . . . * i M Y Y Y Y Y Y U Z Y X e 1.<+a+^+^+<+:+^+:+:+:+:+:+(+(+(+(+0+{+_.~ . # @ @ . @ . . . . + $ + @ ^ _.,+0+:+:+:+:+:+(+:+:+:+:+4+O.[.M.#+U.U.U.U.U.U.U.U.U.U.U.w.. . . . . . . . . . . . . . + + . . . . . . . . . w.#+U.Z.W.V.V.W.Q.W.M.v q =.*.*.=.*.=.=.*.*.=.=.&.&.%.#.#.| $ + + . # # # % @ @ % % . . + + = < O #.*.&.'.*.*.'.%.%.*.=.*.>.k 3 w B B A B B B w A y z y B w w f * % # # @ @ @ @ . @ # # # . . @ * ; 3 A A x A w B B B B B B B B E 2 u e.8.f.0.9.9.d.9.d.9.9.e.d.e.5.!.s , $ + @ + . - - . . @ % @ = + ^ | !.2.9.b.9.0.9.9.9.9.0.9.9.b.j.u r.v+E+z+y+w+y+z+z+w+w+C+G+y+y+v+y+y+w+w+w+w+y+x+H.+ @ % @ @ % % . '+z+w+z+z+z+z+w+w+A+z+z+w+y+y+D+C+'+h.%+f+|+}+|+|+}+}+}+}+}+9+b+}+2+$+7./ . + $ $ @ $ % $ $ % $ $ + @ # # 5 &+2+9+|+}+}+}+f+|+}+}+b+b+7+%+p.S.s+t+l+l+h+s+k+k+d+d+s+h+d+l+s+:.) - @ + @ @ % = = $ + # . . . # ! c.[+n+s+s+h+h+k+l+h+k+k+l+h+s+e+6.e X +.U ` Y U U U Z Y U Y Y +.Y Y ` U @.Z U +. .` r * @ + . . . . . @ ( P Y X Y Y U Y Y U U Y +.Y ` e ", -"e ` @.+.@.` Z +.Y Z Z U Y Y Z Y n ' * @ . . . . @ @ @ @ @ @ @ @ @ $ . . # * d ` T Y Y Y Y Y Y Y Y Z e }.<+3+_+^+<+:+(+:+:+:+:+(+(+(+(+0+)+_.+ . + + @ @ @ @ + # @ + . @ . + + > u.,+(+:+:+:+:+(+:+:+:+:+4+O.[.w.Z.Z.U.U.U.U.U.U.U.U.U.U.w.. . . . . + . . + . . . . . + . . . . . . . . . . }.Z.U.U.W.U.U.W.W.#+M.v q *.=.=.=.=.=.=.=.*.*.%.&.%.%.O 0 ~ + + . - . . # @ $ @ @ @ . . + + . { < O >.'.&.*.*.'.%.*.*.=.=.>.q 3 A B A x x x B w A x x x x I h 8 @ + . . . . @ # . . . . . . . . . @ ; w y A I w B B B B B B B B E 2 s e.8.f.0.j.9.9.0.0.0.f.9.8.j.2.t , + . . @ % @ . . . . @ & % $ @ - $ s 0.d.d.f.0.9.9.9.9.0.f.0.d.9.u r.v+A+z+y+w+w+y+w+w+w+w+w+w+z+v+y+z+z+v+w+y+x+H.] + + $ # . @ # . >+G+w+y+z+y+w+v+w+w+z+z+v+y+z+E+G+>+h.%+f+|+|+}+}+|+|+|+|+|+b+b+}+$+5 % + + + $ + @ % % $ @ $ + $ + $ % @ + 5 N.7+9+|+}+}+|+|+}+}+b+9+7+%+p.S.t+s+k+d+k+k+k+k+l+d+d+k+t+n+c.{ - @ + + $ $ % % % % @ . + . . . . { c.[+t+t+h+l+h+l+h+k+d+l+h+h+k+B.e Y +.Z ` U Z Z +.Z Y Y Y Y Y X Z ` Z @.Z Z .Z n ; . . . @ # + @ . @ } ` +.Y Y U U Y Y Z Y Y +.+.` e ", -"e @.+.+.@.` Z +.Y Z Z Z Y Z @.X d ' * @ . . . @ @ @ @ @ @ @ @ @ @ + . + . * d @.+.Z Y Y Z Y Y Y Y Y e k.(+:+_+^+:+:+:+3+:+:+:+3+3+:+(+(+_.+ + . + + + + # . . . . + @ . @ . . # > M.(+(+(+4+^+^+:+(+:+(+4+O.[.M.#+W.U.U.U.W.W.Z.Z.Z.U.#+w.. . . + + . . . + . . . . . . . . . + + . . . . . }.Z.U.W.W.W.U.U.U.#+G.v j %.=.=.=.=.=.=.&.*.*.*.=.'.%.j = @ + + . - . @ @ + $ @ $ @ . . . + . . = j *.&.&.=.=.&.*.*.>.=.=.>.q o B A A x x B x w A x y x A w 2 % . . . . . # % @ . @ @ . # @ @ . . # & 2 A z A A B B B B B B B A E 2 s d.8.f.0.j.9.9.0.0.0.0.j.b.2.u : $ . - . @ @ . # + + @ @ # @ $ @ . $ : Q f.d.f.9.f.9.9.f.f.f.0.e.j.s r.v+C+G+z+w+z+z+z+z+y+y+z+C+C+A+E+E+z+y+x+x+x._ . . # @ . # % % + >+z+w+y+z+E+z+z+C+z+z+z+C+y+F+E+G+'+h.%+f+9+|+|+}+9+9+9+|+f+b+b+2+m.- @ + + $ + . - . . @ - . . + + $ @ @ + - L $+f+}+|+}+9+9+}+|+}+f+7+%+p.S.t+s+k+l+k+s+k+k+k+k+l+r+n+E.# - - - . + @ $ @ @ @ + % @ + $ + + + @ b X.t+t+l+d+h+h+h+s+k+h+h+s+e+6.e Y +.Z ` U +.Z Y Z Z Y Y Y U Y X +.+.Z Z Z +.M } % . . . @ @ @ @ . # } @.X Y Y Z Y Y Y Y Y X +.+.@.e ", -"e ` Y +.@.` Z +.Z Z Z Z Z Z Z Z d ; % @ . . @ % @ . - . . - - . @ # . . @ ; d M +.Y Y X Y Y Y Y Y Z e k.4+6+^+^+<+3+3+3+:+:+:+3+3+(+:+s.~ . + . # @ + @ { [.u.[.8 . . @ # @ . . . 8 (+(+:+4+^+(+:+(+(+4+4+O.}.M.#+W.W.U.W.W.W.W.U.U.W.Z.w.. . . + + . . . . . . . . . . . . . + . . + + . . k.#+Z.#+#+`.U.R.W.#+M.v q '.=.=.=.=.=.=.=.=.*.=.%.=.%.| $ @ + . . @ @ @ < m m < < @ . . . . @ # + : t '.&.=.=.&.*.*.*.=.=.*.q l w A A x B B B I A B y y w h ; % @ + + . . @ * ; f l f @ @ @ @ . . @ % * 3 w w A B B B B B B B B E f s j.8.9.0.9.j.j.9.0.f.0.j.e.Q : = + . . @ $ + + = 7 : , $ + - + + @ + = 1 2.f.9.f.f.j.9.f.f.9.j.b.j.u I.y+D+G+y+w+z+z+z+z+y+z+z+C+C+D+D+E+y+x+m+x.> + + + @ # + # @ % + >+z+w+y+z+A+z+z+z+z+z+z+z+B+F+E+G+'+h.%+f+9+|+|+9+9+9+|+}+f+9+7+$+/ . @ $ . + + . ) ) 5 5 L ) - + . $ % @ + - 5 K.f+}+}+}+9+9+9+9+|+9+f+$+p.S.r+r+k+l+s+t+h+h+s+r+r+o+~+a $ . . . . . . # c.E.c.c./ . + $ $ + @ @ # c.s+t+l+l+s+s+s+s+h+h+s+r+k+6.e Y +.Z ` +.X Z Z U Y Z Y Z ` Y +.+.+.Y Y X P } ; @ . . . @ @ # # . # } @.+.Y Y Z Y Y Y U Z Y +.Y @.e ", -"e P X Y @.` Z +.Z Z Z Z Z Y U Y d * # . . @ @ * & . . . + . . . @ & @ % * ( e P X Y Y Y Y Y Y Y Y +.d k.:+a+3+(+:+:+3+^+^+:+:+3+3+4+=+H + + + # @ @ . = w.{+0+0+O.^ - @ . @ # . . . v.:+:+(+:+3+(+(+(+(+4+O.[.M.Z.W.W.U.U.W.U.W.U.W.W.#+w.. . . . . . . . . . . . . . . . . . . + + + + . { w.U.Z.#+#+`.U.Z.Z.#+R.v q =.=.=.=.=.*.*.*.=.*.&.'.*.#.= + @ + . @ @ $ < j #.>.#.O , @ + . . @ @ @ = t *.&.=.=.=.*.%.>.=.&.>.q o A B A A B B B A z z x x w f % @ @ + + . @ & 2 l w A w 2 * . @ @ . + @ & * w w w B B B B B B B A E f s e.8.f.0.9.j.j.j.j.9.0.j.d.s $ @ - . + @ $ = : u N Q N : $ + . @ @ . + , N i.9.f.f.9.9.f.9.9.j.8.j.s r.y+D+y+y+z+z+z+z+z+y+z+B+B+w+E+F+F+m+x.W ] @ . + @ % . . # % # . T.z+w+y+z+z+z+A+z+z+z+z+C+B+y+E+C+'+h.%+9+9+}+}+|+9+|+|+|+9+7+2+J.. @ = $ # . . - / z.N.J.$+z.5 - . $ @ . @ . - n.7+}+}+}+9+9+|+|+|+|+f+%+7.S.q+t+k+l+s+t+s+l+k+q+t+e+E.. , $ $ $ + . ! E.[+n+n+~+4.) @ . . + @ @ @ R [+s+d+l+h+l+s+s+h+h+h+r+k+6.e X +.Z ` X @.Y Y U Y Z U Z ` ` +. . .X ` P } ; # . . # @ @ @ + + . @ } ` +.Y Y Y U Y Y Z Z Y +.+.@.e ", -"e ` Y X Y ` Z +.Y Z Z Z Z Z Z +.} @ @ . . @ % * ' ( ( ( ( } ( ( } } ( ( ( d e Z +.Y Z Y Z Z Z Y Z +.d k.:+3+^+(+<+:+(+^+^+:+:+:+:+0+w.> + + . @ % @ ~ (.0+0+0+0+0+C . . . ] ] 4 8 F P.(+:+(+:+3+:+(+:+:+0+O.[.F.Z.W.W.R.U.U.U.U.U.Z.U.#+M.8 J J J J a 8 a J J 8 J a J 8 @ + . . + + . . { w.U.U.W.L.V.++++R.Z.#+G.v q =.=.=.*.=.*.=.*.=.=.=.%.*.q = $ . . @ @ @ = j O #.%.%.#.j = @ # . . @ @ $ m >.=.*.=.=.*.%.#.=.=.*.q o B A B w B B B y x x B w o & @ . . . . . % ; l w x x w I 2 % @ @ . . # @ % 3 w w B B B B B B B A B 2 s e.8.f.0.9.9.j.j.9.9.0.9.f.: # . - - . + + : Q i.i.j.2.t , $ . @ $ . . ~ 1 |.9.9.9.f.9.9.0.f.0.8.j.u r.v+A+y+y+w+z+z+y+v+y+w+z+B+x+m+>+H.W > + # + @ . @ % @ . # % % + m+z+w+y+z+w+z+w+w+w+z+z+w+B+v+w+A+'+h.%+9+9+|+|+|+|+|+}+|+|+f+%+L . + $ # % @ . ) m.8+7+$+7+2+J./ . $ . . % @ - L $+f+|+}+9+9+}+}+|+b+f+%+z.S.r+t+k+l+k+s+k+l+d+l+s+e+R # = + $ $ @ % 4.e+o+t+t+l+[+b # . + . + + @ b X.l+l+h+l+l+l+k+k+k+h+s+e+6.e X +.` ` U U Y Y U Y U U Y P ` +.T +.X M d ' # . . . @ @ + @ + + . @ } ` +.Y Y U U Y Y Z Y Y +.+.@.e ", -"e ` X +.@.` Z +.Y Z Z Z @.Z Z +.} + @ . . @ & ; d ` P P P P P ` P P M n e n M +.+.Y Z Y Y Y Z Y Y Z e k.:+3+_+^+<+:+(+:+(+:+:+:+:+)+J + + + # @ % % 4 =+4+{+(+(+(+P.7 [.[.u.u.P.O.!+<+:+:+(+:+(+:+:+<+:+0+O._.u.U.U.W.R.U.U.U.U.U.U.W.#+R.q.F.R.R.M.F.M.M.R.R.F.R.U.L.}.@ . . . + + . { w.#+M.M.U.L.V.++`.W.R.W.G.v q =.=.=.=.=.=.=.*.=.=.*.*.%.q $ % + . @ @ $ , O #.,.'.'.#.O < @ @ . + @ @ @ < #.>.*.=.=.*.*.>.%.=.*.q l A A A A B x B x x y x w h % # . . . . . @ 2 w p p x w I l * % @ . . . . % ; w A B B B B B B B B B 2 s 9.8.f.0.j.f.9.9.9.9.9.9.Q = . @ . - . + + 1 j.e.d.e.j.5.1 + . @ @ # - . : 5.9.9.f.f.9.9.0.9.0.8.j.u r.v+E+z+w+w+w+z+z+w+v+z+w+y+m+x.g > . + + @ @ @ . # @ @ @ . @ % > m+z+w+y+z+w+z+w+w+w+z+z+w+w+y+z+C+'+h.%+9+9+|+|+|+|+|+}+}+|+9+$+/ - . + - % @ - 5 %+2+|+b+|+9+&+5 - + . . & @ . 5 $+}+|+}+|+9+}+}+|+b+7+K.3.S.t+t+k+l+k+k+k+l+d+l+h+e+E.c.R R b ; @ * y.k+t+t+t+t+s+b @ + + . . + @ b X.s+s+k+h+h+l+k+k+d+h+s+e+6.e Y +.` ` U Z Y Y U Y Y Y X M ` Y .X P e ' % . . + @ @ @ @ . @ @ . @ } ` +.U Y U Y Y Y Z Y Y +.Y ` e ", -"n M +.X ` ` Z +.Y Z U Z @.Z U G ( . . . . @ * ' e .+.+.+.+.X +. . .X @.M ` Z +.+.Y Y Y Y Y Y Y Y Y e 1.<+<+!+^+:+:+3+3+(+:+:+3+3+P.4 + + + @ % % @ H 4+(+4+3+6+3+6+!+0+4+4+0+4+4+6+3+:+:+4+:+(+(+:+:+3+4+O.[.M.#+W.U.U.U.U.U.W.U.Z.U.W.W.L.#+U.#+U.U.#+Z.U.#+U.#+`.L.{ . . . . + . { }.U.#+Z.U.U.#+U.Q.Q.Z.Z.W.M.v q =.=.=.=.=.=.=.=.*.=.=.=.*.q @ % . . @ % $ , ,.,.'.&.&.%.q < $ + . @ @ % @ m #.>.=.=.'.*.*.*.=.=.*.q 3 E A A B B B B y y y y w 2 # . . . . . @ % l x i i r A w I f @ @ . . . . @ * h x B B x B B B B B E 2 s f.8.f.0.j.9.9.9.j.9.i.i.N , # @ @ . . + > s j.b.8.8.d.2.D + - @ $ % - . , Q 9.9.f.9.9.9.9.f.j.b.j.u r.y+A+y+y+w+z+z+G+w+y+z+y+y+-+g . @ @ @ @ @ @ . . . @ @ @ . % & + >+z+w+y+z+z+z+w+z+z+z+z+z+y+y+E+G+'+o.%+f+9+}+}+|+|+9+|+|+b+9+$+5 ~ * # . % @ . L 8+f+5+5+b+|+8+5 - . + . % % @ / N.7+b+9+|+|+}+}+9+9+7+K.3.S.s+t+k+d+h+t+k+h+h+h+q+e+r+n+~+[+X.B.c.R ]+l+q+s+k+t+d+b @ $ = . . @ @ R [+s+s+k+h+s+k+h+h+l+h+r+e+B.e Y .Z ` U Z Z Y Y Y Y Z Y M ` Y .+.n ( % # @ . + $ * % + . # # . @ } @.+.Y Y U Z Y Y Y Z Y +.+.` e ", -"n M +.X @.` Z .@.@.` Y +.+.@.P ' . # . . @ % ; e +.@.` P P M P @.@.Z Y +.G +. .+.+.Y Y Z Y Y Y Y Y e k.<+4+_+^+<+3+4+4+(+(+:+3+3+O.{ @ + + @ % # > _.6+4+4+:+=+O.P.O.)+4+4+4+(+_+:+3+:+(+4+(+4+:+(+_+^+p+O.[.M.#+W.W.U.U.U.W.W.U.U.U.W.W.W.W.U.#+U.U.U.U.U.W.U.W.U.:.. + . . . . @ }.U.#+U.#+U.U.U.#+W.R.R.Z.#+G.v q =.=.=.=.=.*.&.=.=.=.=.=.=.#.= + . + @ % @ = q l.%.{.{.#.j = @ . . - . % % j =.=.*.=.&.*.*.*.=.=.>.q 3 B w B B A B B x A x B w 2 @ . . . . . @ ; l w A y y A A A l & @ . @ # . # @ 2 x B B B B B B B B B 2 s f.8.f.0.j.j.d.9.0.9.j.5.s $ # . + @ . + ^ N j.j.e.d.e.0.s = . + @ @ - . = C 9.9.f.f.9.9.f.f.j.e.e.u r.y+C+B+G+z+z+z+z+z+y+G+A+F+m+W @ & % # @ * @ + $ # @ % @ . @ % = >+z+w+y+z+z+z+z+z+z+z+z+G+B+z+D+G+'+h.%+9+9+|+|+|+}+9+f+|+b+9+}+C.o.z.m.m.3.7.L C.8+9+b+b+b+f+8+5 - + @ - * $ @ 5 N.f+b+9+9+9+|+}+9+b+7+%+z.S.q+t+s+l+s+t+h+k+k+h+q+s+s+h+k+t+s+t+l+d+e+s+k+n+n+~+c.! @ + $ + . @ # E.n+s+s+s+s+h+s+h+k+s+s+s+e+B.e Y .U ` +. .+.Z U Y Y X +.X X Y Y P } ; . . . @ * ' ( ; + . @ @ . @ } @.+.Y Y U Y Y Y Y Z Y +.+.@.e ", -"e ` +.+.Y ` Y .@.` P X T .P d * @ % @ # # @ ; i n } ( ' ' ( } } d n P Y . . .+.X @.Z Z Y Y Z Y Y e k.(+6+^+^+<+3+4+4+:+:+:+4+4+u.@ # . . . . . { u.3+V.u.[.J J 4 F J q.O.1+0+4+4+4+(+4+4+(+4+(+:+^+4+p+O.[.M.#+.+W.U.U.U.Z.U.U.U.U.Z.U.U.U.U.U.W.U.U.U.U.U.U.R.}.. . + + . + . f M.U.#+U.W.U.U.U.Z.W.U.Z.Z.#+M.v q &.&.=.*.=.=.&.*.=.=.=.&.=.>.m @ % + @ @ . + < (.O !.,.j < $ + - . - # $ | >.=.=.=.=.&.*.>.*.=.=.*.q l A A B x A y B A w y A A 2 % @ # . . @ % * o w B y x y B w 3 ; @ . @ @ + . @ * A B B B B B B B B B f s 9.8.0.0.9.9.d.f.0.f.d.5., . - . + @ . . : 2.8.9.f.9.b.e.Q : @ . . . + + + f 9.9.9.9.9.9.9.0.f.e.e.s r.B+D+z+G+z+z+z+z+y+y+z+A+D+m+W @ * % . @ * ^ _.9 # % # . # % % + '+E+w+y+z+z+z+z+z+z+z+z+C+B+y+E+C+'+h.%+9+f+}+|+9+9+9+|+}+|+}+9+9+b+b+b+9+f+9+%+}+f+}+|+|+|+7+J./ + $ @ # * $ . h.%+}+|+|+b+9+9+|+9+b+7+%+p.S.s+r+l+l+s+t+h+s+k+h+h+q+s+k+h+l+s+t+d+u+t+t+X.X.X.).! # @ # . $ $ . R ~+l+s+t+k+h+h+s+s+h+h+s+s+e+6.e Y +.U ` +.T +.Y Y ` Y +.+.T .` n } * @ @ . - & ( n e ( % + @ @ . @ } ` +.Y Y Y Y Y Y Y Z X +.+.Z e ", -"e ` +.+.@.` Z +.+.@.` +. .+.P } % % & % @ . @ ; ' ; @ # . . # & & ' } i M ` +.X U Z Z Y U Y Y Y Y Y e k.:+<+^+^+:+:+:+:+:+<+:+4+p+].. . . . . . . ~ u.O.J > . @ + + + + + 4 _.O.0+0+(+(+:+:+:+:+(+:+:+3+4+O.[.F.#+W.U.U.U.U.U.W.R.W.U.U.U.U.U.U.W.W.W.U.U.U.U.W.G.@ . . . . . + { q.U.W.W.W.V.Y.W.U.W.++++R.U.#+M.v q '.=.=.*.*.=.=.*.*.*.=.&.=.#.q < $ + @ . . . + = m j j | = + . . . + $ , j >.=.*.*.=.&.>.#.>.=.=.*.q l A A B A A p B w w x A B 2 % % . . . @ % * f w z y y w I I ; * % . @ @ + . . * A B B B A A x A B E f s e.8.0.0.9.9.e.9.0.9.8.5.| @ . . + @ . . 1 2.9.f.f.9.e.j.5.: . . . . . . . = 9.9.9.9.9.f.9.0.f.d.j.s r.v+D+y+y+y+y+z+z+y+y+y+E+y+j+W @ % % . > W +j+x.. @ . . # % % + T.E+w+y+z+z+z+w+w+w+z+z+v+y+y+w+G+'+h.%+9+}+|+|+}+|+|+|+|+}+}+|+|+|+}+|+|+|+|+|+}+|+}+|+b+7+%+5 - + $ @ % $ + - n.}+}+|+|+9+9+}+}+|+9+f+%+7.S.q+t+d+l+k+s+k+k+l+l+l+h+s+k+k+k+s+t+k+h+r+d+R 4.b & . # @ # . @ @ a y.k+s+s+k+k+k+k+s+k+h+k+k+s+e+6.e Y +.U ` U X @.@.` ` @.Z +. .U M p ; & @ . . . ; e M e ( % @ + @ . # } ` +.Y Y Y Z Y Y U Z Y +.+.` e ", -"e ` +.+.@.` Z +. .Y U +.+.Y P } % # @ @ . + @ * * @ . . . + . + + @ % ; d n ` @.U Y U Y U U U U Y X e ).=+a+^+^+<+<+:+3+(+:+:+4+:+_.. . . . . . . { [._ . # + . + . + + + + + F O.{+(+:+<+:+:+:+:+(+:+(+0+O._.w.`.`.U.W.U.U.U.R.R.R.U.U.Z.R.U.U.U.Z.R.U.U.U.U.U.8 + . . . . . @ }.U.U.W.R.W.++Y.R.U.W.++++R.U.#+G.v q '.=.*.*.=.=.*.=.*.*.=.=.'.%.%.j , + @ @ @ . . @ + + + + @ # . + + $ , j O %.'.%.*.=.&.>.>.%.=.'.*.q o B w B A B B B w A z B A h % % . . . . % % 8 l A A A I I l * % @ . @ @ . . @ * A B A B A A B A B E 2 s e.8.f.0.9.d.d.f.f.9.8.5.: @ # . + @ # + : 2.9.0.0.9.9.0.2.1 # + . . . . # = 9.9.9.f.9.f.9.d.0.d.j.u r.v+A+z+v+v+w+z+z+w+w+w+y+x+j+W @ @ + g a.m+y+m+a.. . @ + # % @ . >+F+z+y+z+v+z+w+w+w+z+z+w+y+w+E+G+>+h.%+9+|+|+|+}+|+|+|+|+}+|+|+|+|+}+|+|+|+|+|+9+}+|+|+9+N.L - + $ $ @ % @ . 5 $+7+|+|+|+|+|+}+}+|+9+f+%+3.S.s+k+d+d+h+s+k+k+d+d+d+h+h+d+k+h+t+k+k+k+k+~+{ . . + . + . . # @ b E.n+s+s+q+h+h+k+h+h+k+k+k+k+s+e+B.e Y +.Z ` U ` ` ` M ` Z @.X ` M e ' & @ # . @ ; i M P n ( % + # @ . # } @.X Y Y U Z Z Z U Z Z +.Y P e ", -"e ` Y +.U ` Y +.+.Y Y +.+.+.M } & . . . . . @ & % @ @ @ @ @ @ $ $ . . % ; i M Y Y Y Y Y Y Y Y Y Y X e k.(+6+^+_+<+<+(+3+:+:+(+4+=+F . . . . . . . @ % . . . . . + . . + + . . + F )+(+:+:+4+3+4+:+:+:+^+0+O._.M.#+W.U.U.U.U.U.U.U.U.Z.U.W.R.R.W.U.U.U.U.U.U.U.}.@ . + . . . . f R.U.Z.W.W.`.W.W.U.W.U.R.Q.Z.W.#+M.v q =.&.=.*.*.=.=.&.=.*.=.&.&.%.#.l.j = . @ # # . # @ . . @ % @ . + $ , j #.%.'.=.*.=.=.&.=.*.*.=.=.*.q l A A B B B B B A x x B B w ; % @ . . . @ @ % 2 w w I A 3 f { @ @ . @ @ . . @ ; A B A B B B B B B B f s e.8.f.0.j.f.d.f.f.9.e.2.: @ + . + @ % @ : 2.d.0.0.9.9.f.2.1 # + . . . + . $ 0.9.f.f.j.f.9.9.0.8.j.u r.v+C+z+y+w+z+B+G+z+w+z+y+y+>+W ^ g x.j+j+y+A+v+t.# @ & @ # % @ > '+G+y+y+z+y+z+z+z+z+z+z+A+y+F+E+C+'+h.%+f+9+9+|+|+|+|+|+}+|+|+|+9+|+|+9+9+b+b+|+9+}+2+8+K.5 # . $ $ $ % @ - ) m.2+}+|+}+}+9+9+}+}+9+9+7+$+p.S.s+s+k+l+k+s+s+k+k+h+h+h+h+d+h+q+s+s+k+h+k+~+! + . + $ $ + + . ~ c.[+n+t+t+q+h+h+h+h+s+s+k+k+h+s+e+6.e Y +.@.` Y ` ` ` ` @.X Z X M n ( ; @ . @ . * d M ` Y M ( @ . @ @ . @ } ` +.Y Y Y Y Y Y Z Y X +.Y ` e ", -"e ` +.+.` ` Z +. .Y Z X .Y M ( @ . # # . - . % & % * ; * % % @ @ . . . & ( e ` U Y Y Y Y Y Y Y Y X e }.3+6+^+_+:+:+4+4+:+<+4+4+<+_.. . . . . . . . . + . + @ > . # @ # . . $ + . }.:+:+:+4+4+4+:+:+^+3+p+O.[.M.#+.+W.U.U.W.W.U.U.W.W.Z.U.U.U.W.Z.U.U.U.Z.U.U.% . . . . . + . q.W.U.U.W.W.W.U.U.W.W.W.W.W.Z.Z.#+M.v q *.=.=.*.=.=.=.*.=.=.=.'.&.%.,.(.j < . . - . + + + # # @ @ @ . + $ < j #.>.'.&.=.*.*.'.*.*.=.=.=.>.q o B B A B B x x x y y x B A 2 % . . @ @ @ @ % * l l l l 2 % . . . . @ @ . . @ * A B B B B B B A B B f s e.8.f.0.9.f.d.f.0.j.d.2., @ @ . + % % @ : 2.d.0.0.e.e.9.2.1 # . . . + + . + 9.9.f.9.j.9.9.f.f.8.j.s r.y+C+z+z+w+z+B+B+z+z+z+E+E+m+T.T.x+G+y+E+z+D+v+t.@ % & # . % % + T.C+w+y+z+z+z+y+z+z+z+z+w+y+y+E+C+'+h.%+9+9+}+|+9+f+9+|+|+9+9+9+9+|+|+f+9+5+b+|+2+2+$+z.5 - . # $ $ @ @ + / L %+f+|+|+|+7+9+b+}+}+|+9+7+%+p.S.r+t+t+l+k+s+s+h+h+h+h+s+s+h+h+s+t+s+d+h+u+~+* @ - + $ $ + + @ @ ! R E.e+q+h+h+h+s+s+s+k+k+h+q+r+e+6.e Y +.` ` +.Z Y Y X X +.Z +.d ( * @ . . @ % ( n @.+.+.M ( @ . @ @ . @ } ` +.Y Y Y Y Y Y Z Y Y +.+.@.e ", -"e ` +.Y Y ` @.+.+.Z U Y T +.M ( % # % % @ @ @ * ' ( } } ' ; @ . . @ $ @ @ * ( M ` Z Z Y Z Y Z Y Z +.e k.<+6+_+^+:+:+4+4+4+:+:+4+!+C . . . . . . . . + $ 8 F }._.a > & @ $ @ + + # _ P.3+:+:+4+4+(+(+3+3+4+O.[.M.#+W.W.U.U.Z.Z.U.U.U.Z.U.U.U.U.Z.W.U.U.U.U.U.:.. . . . . . . f U.U.U.U.W.W.U.U.U.U.U.W.U.U.R.Z.#+G.v q =.=.*.=.&.=.=.&.*.=.'.=.&.%.#.0 = @ + @ . . @ $ $ @ @ @ # . . + + @ $ | #.*.=.=.=.=.=.*.*.*.'.'.%.q l E A A B B B B x B B y A A f * @ . @ @ # @ # + * ; ; & . . + . . . # # . . # * A B B B B B B A B B 2 s j.8.f.0.9.9.d.9.0.j.d.2., @ . . + @ # . : 2.e.9.9.e.j.9.2.1 # . . . + + . $ e.9.9.9.j.j.9.f.0.8.j.u I.y+C+B+y+y+z+z+y+w+z+z+A+D+z+z+F+F+z+A+A+z+E+v+a.@ * & . # & % . >+z+w+y+z+z+z+z+z+z+z+z+z+B+y+E+G+>+o.%+9+9+|+|+9+|+|+}+|+9+9+9+f+}+9+|+9+b+|+7+8+&+m.) - @ @ % $ $ + - - L N.7+f+9+b+|+7+f+9+}+}+9+b+7+%+p.S.t+r+s+l+h+s+k+h+h+k+h+s+s+h+h+s+t+s+d+l+u+S.& @ + @ @ + @ + @ . . + b E.l+k+h+h+h+s+s+k+k+k+s+s+e+B.e Y +.` ` +.Z +.+.+.Y +.Y ` 3 * @ + . @ * ' e P Y T +.n ' @ . + @ . @ } ` +.Y Y Y Y Y Y Y Y Y +.+.` e ", -"e P +.+.@.` @.+.Y ` ` +.T +.M } ; ; ' ; * * ; } n ` P P M d ; # . % + @ . @ ; e M Y Y Y Y Y Y Y Y Z e (.:+4+_+^+<+:+(+4+:+:+(+3+^+C . . . . . . . + $ 8 V.0+0+0+0+u.* % & % + + . . H :+(+:+:+(+(+(+3+3+4+O.[.M.#+W.W.U.U.Z.Z.U.U.U.U.U.U.U.U.Z.W.Z.W.U.U.M.% . . . . . . . k.Z.#+U.W.W.W.W.U.Z.Z.U.U.W.Z.Z.Z.#+M.v q &.=.=.*.=.=.&.=.*.>.=.=.'.>.j @ % . . # . . $ = < < < + @ . . . . . @ $ | %.=.=.=.=.&.>.#.*.=.=.>.q l w w A x B B B y x x x x I w 2 @ @ . . . . . . % & % @ # . . . . . @ @ . . # * A B B B B B B A A B 2 s f.8.9.0.j.9.9.9.0.f.b.2., @ . . + @ - - : 2.9.f.9.e.e.j.2.1 # . . . . . . + 9.9.f.f.j.f.9.9.0.8.j.u r.v+D+y+y+y+z+z+z+w+y+y+z+z+v+w+z+y+y+z+w+y+F+m+a.@ & % + # @ # { >+G+w+y+z+C+z+w+z+z+z+z+C+y+y+E+C+g+h.%+9+f+|+|+|+|+}+}+|+|+|+|+|+}+|+|+9+9+7+2+J.L - . + @ % $ % . @ - 5 &+2+9+|+5+5+f+2+f+9+}+}+9+b+f+$+p.S.t+s+s+l+d+s+h+k+k+h+l+h+s+k+k+k+s+s+l+d+k+B.b b b b & @ @ $ + - # @ @ ! E.l+k+k+h+s+s+h+h+k+s+s+k+6.e Y +.U ` +.Y +.+.Y U ` @.e * @ . . . % ( e ` U .V +.M ' . . @ @ . @ } @. .X X Y Y Y Y Y Z Y +.X ` e ", -"e ` X X ` ` @.+.Y ` ` @. . .` M d d e i } } i M ` Y Y .X M i * @ & . . - . % ( n Y Y Z U Y Y U U Z e }.=+a+^+^+1+<+:+(+(+:+:+<+=+F . + . . . . . + = Q.4+:+{+(+:+(+I % @ @ . . . # _ =+{+:+:+:+:+:+^+:+0+O.[.M.U.U.U.U.U.U.U.W.R.U.U.U.U.U.Z.U.U.U.R.U.Z.).. . . . . . . { M.U.U.U.R.Q.Z.U.U.R.R.U.W.`.`.Q.R.W.G.v q &.=.&.*.*.=.&.*.*.*.=.=.%.k = $ @ . . . @ + , m #.>.O j , $ + . . @ % # = t *.=.=.=.=.>.#.=.=.=.>.q o B w w x B B B A y y y y w w f * & @ @ . . . . % % @ @ @ @ # - . + @ @ . . @ ; A B B B B A A B A E 2 s 9.8.d.0.f.9.9.f.0.9.e.5., @ @ . + $ . . : i.d.0.f.e.j.0.5.1 # + @ @ @ . . = 9.9.9.9.j.9.9.9.0.8.j.u r.y+D+z+v+w+w+z+C+w+w+z+z+z+w+w+z+y+y+y+v+y+z+v+a.% % . . # % & { '+F+w+y+z+z+A+w+w+w+y+A+w+y+y+z+C+'+h.%+9+}+|+|+}+|+|+|+|+}+|+|+9+|+|+|+|+7+8+N.5 @ . @ $ % % # # - ) L &+2+7+|+|+b+b+|+7+}+9+}+}+|+|+}+$+p.S.s+s+k+d+k+s+k+k+k+k+d+h+k+k+d+d+s+l+d+d+k+X.E.X.X.X.c.b # @ + . . $ $ + R [+s+s+k+h+k+k+k+k+h+s+e+6.e Y .Z ` X Y U +.U U M e ( % $ @ . # ; } n P P @.+.` e ; - # . . . % } ` @.` @.@.Y X Z @.U X +.+.Z e ", -"e @.+.+.@.` @.+.Y Y @.` @.Y +.X @.Z +.Y P ` Y .+.@.@.+.X @.e ; @ % . . . - . ; @.Y Y Z Y Y Y Y Y Z e k.=+a+^+^+<+:+:+:+:+(+(+:+3+[.. + + + . . . @ F 0+=+1+<+a+<+:+,+> . . . . . . + O.0+4+<+3+<+:+_+^+4+O.[.M.#+U.U.U.U.U.U.W.R.U.U.U.U.Z.U.U.U.U.U.U.M.8 . . . . + . . }.W.U.U.U.U.U.U.U.U.U.U.W.W.@+++Q.R.#+M.v q =.=.=.*.=.&.*.=.=.*.=.=.#.< . . + + . $ $ , q %.%.*.'.&.q , + . . . . . @ < q *.=.=.'.>.>.=.=.=.*.q o E A A A B x x B B A A B w w A w ' * % @ @ . . + . @ & * ; ; @ . . . . . @ % * A B B B B B B B B B f s j.8.f.0.9.9.f.i.j.b.j.5.: + . . . . $ = | |.8.e.d.d.f.i.5.1 # $ $ & @ - + : 9.9.d.9.j.j.9.9.9.8.j.u I.y+C+B+v+w+z+z+z+w+w+z+z+z+z+w+z+z+z+z+w+z+z+m+a.# @ @ . # @ @ + T.G+A+y+z+z+z+w+y+z+z+z+z+y+y+A+G+'+h.%+9+9+|+|+|+9+9+|+}+}+9+b+b+|+|+f+f+&+z.) . + $ $ $ % $ . - 5 n.2+2+}+2+2+7+7+f+|+9+9+9+}+|+9+9+7+%+z.S.s+t+k+l+h+s+s+k+k+h+d+k+s+k+s+u+q+u+d+e+k+s+q+l+h+s+r+*+b % $ + + + + @ ! E.s+k+k+h+h+k+k+k+h+r+e+6.e Y T @.` +.Y U Z U Z M ; @ # @ % % ; ' 3 i d } ( ( ( ( ' ; % . - @ * ' ( ( } e P .+.Y ` U .+.X @.e ", -"e P +.Z ` ` @.+.+. .Y Y +. .+.Y Y +. .+.Z Z X T +.` Y +.+.` n ' @ % . . . - - ; M Y Z Y Y Y Z Y Y X e }.<+3+4+_+:+:+3+3+:+:+3+3+3+<.. + + + . . @ @ u.0+(+<+<+<+3+:+{+g . + . . . . + v.(+4+<+a+:+(+^+^+4+O.[.w.Z.W.W.U.U.W.U.U.U.U.W.U.U.U.U.U.U.U.U.Z.w.. . . . . + + # w.Z.U.U.U.U.U.Z.Z.U.U.Z.W.W.R.Q.Z.U.#+G.v q &.&.*.=.&.*.=.*.&.*.&.&.O @ + . . + . . $ < %.%.=.=.=.%.#.< @ . . . . . @ % j >.=.&.&.=.*.*.=.'.>.q l A A B w B B y B B B A B w I w w w h ; * & @ # @ $ % ; 3 l f * @ . . . . @ % f w B B B B B A B B E 2 s f.8.f.0.e.f.9.f.j.8.j.i.1 + . . . + + $ < ..d.9.9.9.d.i...1 @ $ $ @ @ . + : 9.f.9.j.9.f.9.9.9.e.j.u r.w+D+y+y+w+z+C+G+z+z+z+z+z+z+z+z+z+z+z+w+z+z+m+a.@ % @ . # % @ + >+F+z+y+z+z+z+z+z+z+z+z+C+B+F+E+G+'+h.%+9+9+|+|+9+9+9+|+}+7+9+b+b+b+}+2+2+z.) - + @ @ $ . @ + - / N.2+7+}+}+|+|+}+}+}+}+9+b+9+}+}+9+b+7+$+m.S.q+t+l+l+h+s+s+t+k+k+s+s+s+k+k+q+q+s+k+o+t+h+q+d+s+s+q+n+c.# + + + + + + # E.s+s+s+s+s+h+h+h+q+r+e+6.e Y +.@.` U Z Z ` Z U M ' @ - . . . % % % @ & * * % @ @ @ % @ . . @ % % % * ; e P +. .Y ` ` +.+.+.@.e ", -"e ` Z +.Z ` @.+.+.+.Y +.+. .Y P Y +.+.+.Y Y +.T +.` U X .Y M ( & % . . . . - ' ` Y Y Y Y Y Y Z Y +.e k.3+3+_+^+<+3+3+3+:+:+3+4+p+u.+ . . + . # # { O.0+(+<+<+a+p+(+)+9 + + . . . + - w.{+4+<+3+:+_+6+3+4+O.[.M.#+W.W.U.U.#+U.U.U.U.U.U.U.U.U.U.U.U.U.U.J . . . . . . . f W.U.#+#+U.U.U.Z.Z.U.U.U.U.U.W.W.U.Z.#+M.v q '.=.*.=.&.=.=.*.*.*.&.&.O $ + . + . . . @ j >.%.=.=.=.=.>.m $ . . . . . # $ j =.=.&.&.*.%.#.=.'.>.q l A w B A B B B B B B x B w w I z A x w w 3 ' * 2 ; 3 3 w w f @ @ . . . . @ * 3 w B B B B B w B B E 2 s 9.8.f.0.j.9.f.f.f.e.9.5.t $ + . . + + $ ~ s d.d.d.b.9.j..., # $ + @ . - = 1 9.9.9.j.j.9.9.9.f.d.j.u r.y+D+z+z+z+z+z+z+A+A+z+z+z+z+A+z+z+z+z+z+z+z+m+a.# % @ . # & @ . >+G+w+y+z+z+z+z+z+z+z+z+w+y+z+D+G+'+h.%+9+9+|+}+|+9+9+|+|+9+9+9+}+9+2+&+m.. @ + @ $ + @ . - / 7.&+2+f+7+b+b+|+b+9+|+}+}+}+}+9+9+9+9+9+7+%+7.S.q+t+s+l+s+s+s+r+s+s+t+s+s+k+l+t+t+s+e+d+t+l+u+k+t+t+s+l+E.! @ . . + + @ @ c.r+s+h+h+s+s+k+h+s+r+e+6.e Y +.Z ` Y Z Z ` Y X M ' % @ # @ @ . . . . . . . . . . . . . . . . . . . . * i P +.+.Y ` ` U +.X ` e ", -"e @.+.+.` ` Y +.+.Y U Y +. .P M M P ` M M M M +.+.Z Z +.T +.M } * @ . - . . @ } ` Y Z Y Z Y Z Y Z Z e 1.a+^+_+^+<+:+(+:+:+:+:+3+3+u.$ + + + . @ @ { u.0+4+(+<+3+:+(+.+f + . . . . . $ v.(+4+:+3+:+:+:+(+4+O.[.M.#+U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.W.8 . . . . . . . }.U.U.U.#+U.U.U.U.U.W.U.U.U.U.W.U.Z.Z.#+G.v q &.&.*.*.*.=.=.=.*.*.&.&.q $ . . + . . . @ m #.%.%.=.=.%.#.C { # . . + . # $ | =.=.&.&.*.*.%.'.=.=.q l A w A w B B x B x B z B w w A B A y x A B w A w I A A x A l & % . . . . @ * h A w B B A B B B B B 2 s e.8.f.0.f.e.f.f.f.d.9.f.u = + . . . + $ % t 9.0.d.8.9.5.t = @ $ + @ - - , s e.9.9.9.9.9.9.f.0.8.j.u r.B+C+B+z+z+z+z+z+z+z+z+z+z+z+z+z+z+G+C+z+z+z+m+a.@ % @ . . @ @ + >+z+w+y+z+z+z+z+z+z+E+z+w+y+F+E+G+>+h.%+9+|+}+}+|+9+9+|+|+9+9+}+}+7+$+n./ . . + $ . . - + 5 C.8+2+}+b+b+5+5+b+|+|+|+9+|+}+9+9+9+|+9+9+9+%+3.S.r+t+t+d+s+r+h+k+k+k+k+l+l+[+[+d+~+X.[+E.~+u+s+k+o+t+k+l+E.b + . . . + @ @ c.t+t+h+h+s+k+k+s+h+q+k+B.e Y +.Z ` +.+.Z Z Y X M ' @ @ % @ @ @ . + . . . . . . . @ @ . . . . . . . . * e M Y +.Y Z Z Y +.+.@.e ", -"e ` +.+.Y ` @.+.` P Z Z Z ` n y B } } ( ' ' } M @.` U +.+.@.n ' % @ . . # + % } U Y Y Z Y Z Y Y Y Y e (.:+a+^+^+:+:+^+(+:+:+:+:+:+P.F . + + . @ @ @ J 0+{+=+<+:+:+(+{+@ + + . . . . + =+:+1+:+<+<+:+3+4+4+O._.F.#+W.W.U.U.U.U.U.W.U.U.Z.Z.U.U.U.U.U.U.w.+ . . + . . . - w.U.U.W.U.U.U.U.U.U.R.R.U.U.W.U.U.R.R.#+M.v q =.=.=.*.=.=.&.*.=.*.=.&.q $ # . + . . . @ m O %.*.=.=.=.#.m % @ . . . . # $ | >.=.&.=.*.#.=.=.=.>.q o B w w A B B p x B x B w w w w A l A A l o l I w x x A A w ; % @ # # . . @ * h w B B B w B B B B E 2 s j.8.f.0.j.8.9.0.f.b.e.0.N , + . . . + + # t i.i.d.8.e.5.t $ . + $ @ . + , ..9.9.9.9.9.9.d.9.0.8.j.u r.y+A+z+v+v+y+z+w+v+v+w+z+w+w+v+w+z+w+w+w+z+z+m+a.@ & @ . - % @ + '+E+w+y+z+z+z+w+v+A+z+z+w+w+y+D+G+'+h.%+9+|+}+}+|+9+}+}+|+|+|+}+}+2+z.) - + . # % # - ) / N.2+2+}+}+|+|+b+}+9+}+}+}+|+|+|+b+9+}+}+|+9+f+%+p.S.r+s+k+d+k+k+k+d+d+k+d+X.c.4.c.R b $ ! . E.e+o+e+k+k+s+s+c.{ + . . . . # % B.s+k+k+k+h+h+k+k+k+s+e+6.e Y +.@.` Y +.U U Y +.M ' @ @ @ . . . . . . . . . . . + . # @ . . . . . . . % } P +.+.Y @.` X .+.@.e ", -"e ` +.+.U ` @.+.` ` ` U Y c } ; & * % @ . @ ' e P Y Y +.+.` e * + @ . - @ # * d Y Y Y Y Z Y Y Y Y +.d 1.<+a+^+^+<+:+_+(+:+(+3+3+:+3+u.. + . . . . + 4 {+4+=+:+:+3+{+M.@ . + . . . . $ )+4+(+<+<+:+(+(+(+0+O.[.M.`.U.U.U.U.U.U.W.R.U.U.U.U.U.U.U.U.U.U.:.. . . + - . . @ M.U.U.Z.U.U.U.U.U.U.U.R.W.U.W.@+++Q.Z.#+G.v q =.&.*.=.&.=.*.&.&.*.=.&.O $ @ . + . - . & < >.>.*.=.*.&.#.| + . . . . . @ = j =.=.=.&.*.*.%.=.=.=.q o B B B x B B B B B x x B w A o l 2 2 ; ; * * l w w x x w l * @ @ % @ . @ % ; w w x B B B B B B B E f s d.8.0.0.j.8.9.0.f.j.e.9.2.: + + . . . + + : Q i.j.e.j.Q : . . . . . - $ : |.9.9.d.9.j.9.9.9.f.8.i.u r.w+C+z+w+w+z+z+z+w+w+z+z+C+C+v+w+z+G+C+w+A+z+m+a.@ @ @ . # & @ - T.F+w+y+z+z+z+z+w+w+z+z+z+y+z+D+G+'+h.%+9+}+|+|+|+|+|+}+}+9+9+7+2+z.) . . + . # % @ - ) &+&+$+J.$+$+$+$+$+J.$+$+$+2+|+|+b+9+9+}+}+b+b+f+$+3.S.t+s+l+l+k+s+k+h+h+e+l+X.; % % @ $ $ + @ 4.e+t+k+k+s+k+l+c.# + + . . + . ! E.s+k+k+k+h+s+k+k+h+s+k+6.e Y +.U ` +.U U U Z +.` ' % # . # # . @ . - . @ . . . + . . . - . @ @ @ @ @ ; n G +.+.Z ` Y X +.@.@.e ", -"e ` +.+.U ` Z +.` ` +. .+.P d & . + . . . . % ( M Y Y X @.n ( @ . @ . - @ @ * n .Y Y Y Y Y Y Z Z Z e 1.<+^+_+^+:+:+3+3+:+:+:+:+:+{+G.= + . . + # + ~ <.{+3+3+4+:+=+H + . . . . . . F {+4+4+<+<+<+:+_+^+4+O._.F.Z.W.W.U.U.U.U.U.U.U.U.U.U.U.U.Z.U.Z.R.m ) # . . . . . f U.U.U.W.Z.Z.U.U.U.U.U.U.U.U.U.R.Q.W.U.#+G.v q %.=.=.&.*.=.*.*.*.*.=.=.#.= @ . + . - . @ $ j *.=.=.=.%.j = @ . . . . . @ * k >.*.=.&.=.>.#.'.&.>.q o B A w w x B x x B x B A w ( ; @ @ @ . @ @ @ 2 o A A w h * . . @ @ . # . @ h w A B B B B B B B B B 2 s e.8.f.0.j.8.f.0.f.d.e.j.9.1 $ + . . . . . = u 5.i.f.0.s + ) - @ $ . + $ 1 i.9.9.f.9.j.j.9.f.j.d.j.u r.B+C+B+z+z+z+z+z+z+w+z+z+z+z+w+z+z+z+z+w+z+C+m+a.@ % @ . # @ @ + >+y+w+y+z+z+z+z+w+z+z+z+C+B+y+A+G+'+h.%+9+9+|+|+9+9+9+|+|+9+9+7+$+L . @ $ + + $ $ $ + - . - - - - - - + - . - - - C.2+}+|+9+9+|+|+|+9+7+%+p.S.r+r+l+l+k+t+k+s+h+e+t+[+b & @ . + $ = + ! E.s+n+l+q+k+X.l % $ + . . . + R ~+k+s+s+k+h+k+k+k+h+s+e+B.e Y +.` ` Y +.Y @.+. .M ' % * * * * & * * * * * % % @ @ @ @ # . . @ % * ; ; ' e M Y +.@.` Y +.+.Z ` e ", -"e @.+.+.U ` Y +.Y Y +. .T ` d ; % @ . . + @ % ; e Z U +.` d ' . - @ . # @ % ' n T Y Z Y Y Z Y @.+.Y e 1.a+6+3+(+<+3+3+:+:+:+:+4+3+{+W.:.. + + @ @ + + = F =+(+(+=+[.+ # # . . . . # v.#+0+<+<+:+4+(+3+:+p+P.[.M.#+W.W.Z.W.W.U.U.Z.Z.W.U.U.U.U.W.U.W.W.@ + . . . . . . ).R.U.#+U.U.U.U.Z.Z.W.W.U.U.U.#+U.U.Z.W.#+M.v q =.=.*.=.=.*.&.&.*.*.&.&.#.< . # . + + @ . $ : j *.=.=.q | = @ # . + . . . < >.=.&.'.=.=.*.*.=.=.>.q o A w B x B x B A B B x B w l ; @ . . . . . . . 2 w I w 3 * @ . @ % @ % @ * w w A B B B B B B B x E 2 s e.8.f.0.j.8.9.0.f.8.e.f.f.C = + - . . . . . $ 1 N N u , . - . . - @ + , u i.9.9.9.j.j.j.9.f.f.8.j.u r.w+C+B+y+w+z+z+z+A+z+z+z+z+z+z+A+z+z+z+w+z+z+m+a.+ @ @ . @ % @ . m+z+A+y+z+C+z+w+z+z+z+z+w+y+y+C+G+'+h.%+9+9+9+|+}+9+9+|+|+|+}+7+N./ - $ $ + $ $ = + $ . . @ + + $ = $ $ = = $ - - z.8+}+9+b+f+}+|+9+9+f+%+p.S.r+t+h+d+s+t+s+s+s+o+d+[+y.) % ) . = = + % l E.[+d+l+~+R { @ $ + . . . % c.n+k+s+s+s+s+t+k+h+q+r+e+6.e Y +.U ` +.+.Y Y +. .Y } f i d i e e e e e e e d p i } ' * @ . @ % * ' } d d e P +.+.Y ` ` Z +.+.@.e ", -"e M +.+.Y ` Z +.+.+.X Z ` ` P e ; . . . + + + + @ % @ @ % @ @ % % . . - @ ' n +.T .Y Y Y Y Y Z Y +.e 1.4+a+6+(+1+3+(+:+:+:+:+3+3+(+0+O.4 + @ % @ @ . . . # f f @ . & @ @ . . . . f (+:+:+^+(+3+:+:+:+:+p+O.[.M.#+W.W.U.U.W.W.U.U.U.U.U.U.U.U.U.U.U.M.+ . . . . . . . w.U.U.U.U.U.U.U.U.U.U.U.U.U.U.Z.`.`.Z.Z.#+M.v q =.=.=.=.&.*.&.&.*.,.&.'.'.O = % . + + + . . . . . # . . . + + + + @ & $ , k #.'.&.&.&.'.%.*.=.=.*.k 3 w w B B B B B A B B B B B w ( % - . . . . . . + . @ + . . . . . @ # . * h x B B B B B B B B x B E 2 s e.8.f.0.j.j.f.9.f.f.9.9.9.5.s , . - - . + $ + + + + # + + % * % . - = 1 0.j.9.9.9.j.9.9.j.9.j.d.j.u r.B+A+y+y+w+z+z+z+z+y+z+z+z+z+w+y+z+z+z+z+A+z+m+a.+ # % % * & . . T.z+A+w+z+z+z+w+w+w+z+z+z+B+F+E+G+'+h.%+9+9+|+|+}+}+|+|+|+5+}+$+L - . @ & . @ . @ . @ . . @ . . . @ # . @ $ @ + . J.7+|+7+f+9+}+}+|+9+f+%+7.S.r+r+k+l+h+s+s+k+k+k+k+l+[+l ; + - . - . . - . b 8 $ + . - - - = = . ! 4.X.l+k+k+s+s+s+h+h+h+s+r+e+6.d Y +.@.` +.U Z Z Y Y Z Z X Y X X X X X X X ` +. . .+.n ' . # % + + * d ` V T +.+.Y Z Y Y Y U +.Y @.e ", -"e @.Z +.U ` Z +.+.Y Z U ` ` U c ' . # @ . . . + $ @ . @ $ . . . . - - @ ' e M U T Z Z Z U U Z Z Z X e (.(+_+^+{+<+<+:+:+:+:+:+(+(+<+:+{+u.@ + $ @ . + @ $ . + . . . @ @ . . . . + =+(+:+:+:+:+(+:+:+:+:+0+O._.w.W.U.R.R.U.U.U.U.R.R.U.U.U.U.U.U.U.U.:.. . . . . . . . w.`.R.Z.U.U.U.R.R.U.U.U.R.R.U.R.@+@+R.R.W.G.z j '.&.*.*.*.*.*.*.*.,.%.&.,.O j * . . . $ + + . . . + - . . . . . . @ $ $ < O #.'.=.%.'.%.#.%.=.'.>.q l w w B B B E B B x x x B B x o @ + . . . . . . . . . . . . . . . @ # % 3 w B x B B A w x x B B B E 2 s f.8.f.0.9.d.9.d.d.9.9.9.d.5...1 + . . . . @ @ . . . . . . @ @ . + $ , N 0.0.9.9.9.9.9.9.0.9.0.8.i.u r.v+A+z+v+v+y+z+w+w+w+y+y+z+w+v+y+y+w+w+w+A+y+m+a.+ % % & @ * $ + >+w+w+w+w+w+w+w+w+w+A+z+w+w+y+E+G+>+h.%+9+9+}+}+|+|+|+|+|+9+2+z.) @ + % % - - . . . . . - . . - . . . - . $ $ @ . z.2+9+}+|+9+}+}+|+9+7+K.3.S.s+k+k+d+k+s+k+s+k+k+k+k+l+E.; . . . . + + + $ + . - @ % @ . . $ + @ ! E.s+k+s+t+d+d+h+l+d+k+h+s+e+6.e Y +.@.` U Z U U Z U Y Y Y Z Z Y Y U Z Z Y U Y +. .Y n ' # . + . - @ ( P +. .Y Z Y U Y Z Z X +.Y @.e ", -"e ` +.+.` ` Z +. .U U U ` Z U @.e ( ; * @ . . . . + . . . . . . . @ % ' e M ` Z U Z U Z Z Z Z Y U Z e k.<+a+^+^+(+:+:+:+:+(+(+:+:+:+:+(+6+s.= + . . . . . . . # @ . . . . . + = +#+(+:+:+:+:+:+:+:+:+:+0+O._.u.Z.W.W.Z.U.U.U.U.U.U.U.U.U.U.U.U.U.U.}.. . . . . . . + Q.W.U.U.U.U.U.U.U.U.U.U.U.U.U.U.R.Q.R.Z.#+M.v q %.=.*.*.=.&.*.*.*.%.=.&.&.%.O j = + . . @ # . . + - . . . . . . . @ = | ~.O =.'.&.&.&.*.%.*.=.=.>.k 3 B B B x B B x B w B B x B B B h ; % @ @ + - . . . . . . . @ @ # % * 3 w A B B B B B x B B B B B A f s e.8.9.0.9.j.f.j.9.9.9.9.9.i.|...: . . + . . . . - + @ # - - + + = : u i.i.0.9.9.9.9.9.9.9.f.f.8.j.u r.B+C+z+w+y+y+z+y+w+w+C+G+y+y+w+z+z+y+y+z+A+y+m+a.+ @ & @ % * @ + T.G+w+y+z+z+w+A+z+w+z+z+C+w+F+E+G+'+h.%+9+9+|+|+9+9+|+|+}+7+8+m.- $ + $ $ . . . + $ . . . . . . $ + $ + . @ $ $ . C.f+9+9+9+}+}+|+|+9+f+$+p.S.t+s+l+d+k+s+k+s+k+k+s+k+k+d+B.. . . @ + = $ , = + $ $ + + + . @ @ ! E.n+k+k+s+k+h+h+h+h+d+k+d+r+e+6.e Y +.U ` +.U Z U Z Y Y Y Y Z Y Y Y U Z Z U ` @.U Y Z n ' @ . - - . % ( M @.+.Z Y Y Y Y Z Y Y +.+.@.e ", -"e M +.+.Y ` Z +.Y Y U Z U ` ` @.P n e } ' * @ . . + . . . . . - $ ; ' n ` X +.@.` Y Y Y Y Y Y Z Y Y e (.<+a+^+_+1+<+:+:+:+:+(+3+3+(+(+(+{+{+O.9 + # @ . . . . . . . . . + . , +0+0+(+:+:+:+(+3+:+(+:+4+4+O.[.M.#+W.Z.U.U.U.Z.Z.U.U.W.W.U.U.U.U.U.U.J . . . . . . . @ U.U.U.U.W.W.U.U.U.U.U.U.U.U.U.U.R.R.R.R.#+M.v q =.=.=.&.*.=.=.=.=.*.=.&.&.&.%.%.j $ + + @ # . @ % # @ % @ . @ $ $ < 0 O #.>.*.=.=.&.&.=.>.#.&.=.>.q o B A w w x B x B w B B B B B B w 3 ' * % @ . . . . . . . . . @ % ; h I w B B B x B B B B B B B B E 2 s f.8.f.0.9.j.9.j.f.9.9.9.9.9.9.i.N : = $ $ @ . . . . . . . . + = 1 N i.5.9.f.j.9.9.f.9.f.9.f.f.8.j.u I.v+C+z+w+y+z+z+z+z+y+y+y+C+C+w+y+y+z+z+z+E+F+v+a.+ + + . + $ . . x+F+w+y+z+z+z+w+z+z+z+z+z+B+F+E+G+>+h.%+9+|+}+|+9+9+}+}+f+7+$+L - - + . + $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ @ . + . J.7+9+9+9+9+}+}+|+|+f+%+z.S.r+r+k+l+s+t+s+s+k+k+q+o+k+l+l+X.b . & & @ & = $ + + . @ # + + % R X.[+s+k+k+q+s+h+h+h+s+k+h+s+r+e+6.e Y +.` ` U Z Z +.Z Y Y Z Y Y Y Z Y Y Z Y X Z +. .X P e ( * @ . . . { E P ` Z Y Y Z Y Y Y Y U +.Y @.e ", -"e @.+.+.Z ` @.+.X Z Z Y Z Z Z Z +. .Z M e ( ; ; * & % & * ; % % ' d n M X +.+.@.U Y Y Y U Y Y Y Z .e 1.(+^+4+4+1+6+3+3+:+:+3+3+3+:+:+:+3+0+0+V.w.H @ @ . . + + . + + - F u.{+4+4+4+(+:+(+3+3+:+:+:+4+4+4+O.[.M.#+Z.U.U.U.Z.Z.U.U.W.W.Z.Z.U.U.W.#+M.f . . . . + . . @ U.U.U.U.W.U.U.U.U.#+U.U.U.U.Z.W.W.U.Z.Z.#+M.v q =.=.&.&.&.=.=.=.=.*.>.=.=.&.&.,.,.k < , $ $ = $ $ $ $ $ $ = $ < f m #.#.#.>.=.*.=.&.&.=.>.#.=.*.>.q l I B w x B x x B x B B B B x x B A w 3 * % @ . @ @ @ @ % % % + f w I w B B E A w B B B B B B B B E 2 s f.8.9.0.j.j.9.9.9.9.9.9.j.b.d.f.i.|...: , = + $ $ $ $ = $ $ : u |.9.d.e.e.f.j.f.j.j.j.j.j.j.f.8.j.s r.v+A+z+z+y+z+z+z+y+z+z+B+B+z+z+z+z+z+C+y+B+B+m+a.- @ . - - + + { >+y+y+x+z+z+z+z+z+z+z+z+w+y+y+A+G+'+h.%+9+9+|+|+9+|+|+9+}+}+%+5 - - - ) - - - @ - - ) @ - - @ - - - + . - - ) - ) K.9+b+b+b+9+}+|+|+|+7+%+p.S.r+r+s+l+h+s+s+k+l+d+k+o+t+k+k+l+l+A.R & . & % % @ & # . . b J E.[+l+k+k+k+s+k+h+h+s+s+s+k+h+h+r+e+6.e Y +.@.` U Z Z Y Y Y Z Y Z Y Y Y Y Y Y Y Z U Y Y Y P n } ; ; ; * * ' i P X +.Y Z U Y Z U Y U +.Y ` e ", -"e @.Z +.Z ` @.+.Z Z Z Z Z Z Z Z +.+.+.@.` P n d } d i i } i n e e M ` Z Y +.+.+.U Z Z Y Z Z U U Z Y e k.a+a+^+_+1+<+:+:+(+(+:+3+3+:+:+(+(+3+(+:+:+{+{+ +u.[.[.[.[.[.v.0+0+4+:+a+3+<+3+(+:+:+3+3+:+:+:+3+0+O.[.w.#+#+U.U.U.W.W.U.U.W.W.U.#+U.U.U.W..+w.U.U.U.U.U.U.U.#+U.U.U.U.U.U.U.W.U.U.U.U.U.U.W.W.`.W.R.Z.#+M.).q =.*.=.*.*.=.=.=.=.=.=.=.=.%.&.&.&.k.>.#.O q j j j k j j m q q #.#.>.=.*.,.%.=.=.=.'.=.*.*.*.=.&.>.q o B w B x x B B B x B B B x x x B B y w I I h 2 ; 2 2 3 3 h l I I w w A B A A B A B B B B B B B B E 2 s e.8.f.0.j.9.j.9.9.j.9.9.j.b.8.e.e.f.0.i.|...u s s u s s N ..i.0.9.b.8.8.8.f.f.f.9.j.f.f.9.j.f.8.j.s r.B+C+B+y+w+z+z+z+z+z+z+z+y+y+w+z+z+y+z+w+y+G+B+x+m+m+j+j+j+j+j+x+B+C+y+B+z+z+z+z+w+w+z+z+C+B+y+E+G+'+h.$+9+|+|+|+|+9+9+|+|+9+7+2+8+8+8+8+8+2+2+}+2+}+2+}+2+2+}+2+}+2+}+}+2+&+&+8+&+8+9+b+}+9+9+}+}+9+b+7+$+m.]+r+r+s+l+h+s+h+h+k+s+s+s+t+o+k+t+k+l+l+[+X.E.B.c.c.y.c.E.X.X.[+l+t+e+k+h+q+q+q+h+h+s+s+s+k+h+h+r+e+6.e +.+.` ` +.Y Y Z Y Y U Y Y U Z Y Y U Z Y Y +.X U @.` M M M M M M M M P .+.U Y Y Y Y Y Y Y Y +.Y @.e ", -"e ` +.+.Z ` @.+.Z ` @.Z Y Y Y +.Y U U U U ` ` ` P P P ` ` P P P ` .+.U Z U U U U Z U Z Z U Z Y Z Z e 1.<+a+_+(+(+:+:+:+:+:+:+:+:+<+<+^+^+:+(+=+<+(+:+:+(+_+=+=+:+=+0+(+4+(+:+<+:+:+:+:+(+:+:+:+:+:+:+:+4+O.[.M.#+U.U.U.U.U.U.R.R.U.U.U.W.Q.U.U.U.W.Q.U.U.U.U.W.U.U.U.U.U.U.U.U.U.U.U.U.U.U.R.R.U.U.R.@+++Q.R.W.M.v q '.&.*.=.=.=.=.=.*.=.=.*.=.%.&.%.&.%.%.%.%.%.%.%.%.%.%.*.%.%.%.%.=.'.%.%.'.=.=.=.=.&.&.*.%.#.=.=.*.q o B w B x x x B B x x B B B x w B x x x A I x w A x B A x A A A A x x x x A A B B B x B x B B B B E 2 s f.8.f.0.j.d.9.d.d.9.9.9.9.d.d.9.d.b.d.f.i.i.5.i.0.0.i.5.0.i.0.f.9.f.d.d.d.d.9.9.0.9.9.9.9.9.0.8.j.u r.z+D+z+v+v+w+y+z+w+w+w+z+z+w+w+z+y+w+w+v+y+w+z+y+m+x+F+D+v+v+x+x+D+D+w+y+w+w+z+w+w+w+z+w+w+y+z+D+C+>+h.%+9+|+|+|+}+|+|+9+|+9+|+}+}+}+}+|+|+5+|+|+|+|+|+|+|+|+|+|+|+|+|+|+|+}+}+2+7+|+|+b+}+|+9+}+}+|+9+f+$+p.S.t+t+k+d+k+k+h+u+d+d+h+s+s+e+k+k+k+k+k+k+e+e+e+e+d+d+d+d+d+k+e+e+k+k+t+r+l+d+d+d+d+d+d+k+k+k+k+s+e+6.d Y +.Z ` U Y Y Z Z Y Y Y Y Z Z Z Y U Z Y Y U U U ` ` ` @.Z X Y U U ` U Y U U Y Y Y Z U Y Z Y +.+.@.e ", -"e ` +.Z ` ` @.+.` Z U Y Y +.Y Y @.` @.U U U Y +. .T . . .+. .T +.T T U P M ` +.+.Y Y Y Y X Z Y X Y e 1.<+^+!+_+(+:+:+:+:+(+(+:+:+:+^+^+<+:+<+<+1+<+<+<+:+:+3+<+<+:+(+4+:+:+a+:+<+a+:+:+:+:+:+:+(+(+<+:+4+O.[.M.Z.W.W.Z.U.U.U.U.W.R.U.W.U.U.Q.U.U.U.U.U.U.U.U.U.U.U.U.U.Q.W.U.U.U.U.R.Z.U.U.Z.W.U.U.U.W.R.R.U.#+M.v q =.*.=.=.=.=.=.=.*.#.=.=.#.*.%.,.,.&.&.&.&.,.&.%.'.%.'.%.'.&.&.!.{.&.&.&.&.=.=.=.*.=.'.*.*.%.=.=.*.q o B A B x x B x x A w x w A B B y B B x B B y y x x y y x A x y y B B x B B B A w w B B B B B B y E 2 s e.8.f.0.9.9.j.j.9.f.9.9.9.0.f.f.d.8.8.d.f.d.d.9.e.d.8.f.d.b.9.f.0.0.0.0.0.d.f.9.9.9.f.9.0.9.0.8.j.u r.v+C+B+y+w+z+z+z+v+w+z+z+z+w+w+z+z+z+y+w+z+A+A+z+F+E+D+D+D+D+z+z+C+D+w+y+z+z+w+A+w+C+z+z+z+y+F+E+C+'+h.%+9+9+|+|+|+}+|+}+|+5+|+}+}+;+}+5+b+}+2+|+}+}+2+|+}+}+9+7+7+9+}+2+}+b+b+}+}+b+5+b+}+|+9+}+}+|+9+9+$+3.S.q+k+d+l+s+t+h+h+d+d+l+s+k+k+k+q+q+k+s+k+t+s+s+k+k+r+s+k+t+s+r+s+s+s+s+k+h+l+l+k+h+h+h+k+k+k+k+r+e+B.e Y T @.` Y Y Y Y Y Y Y Z Y Y Z Z Y Y Y Z Y +.Y U U Z Z +. .T T .@.Y +.U U U Y Y U Y Y Y U Y +.Y @.e ", -"e M Z Z ` ` ` @.` Z Z ` @.Z ` ` ` Z ` ` ` @.U Z @.` @.` Y U @.` Z Z Z ` @.@.@.Z Z ` Z @.Z ` @.Z ` Z n 1.<+<+(+0+_+_+4+:+3+:+:+4+4+^+_+_+^+:+:+^+^+:+:+4+:+(+:+3+:+:+4+_+(+(+:+:+_+3+:+:+(+:+4+(+<+:+_+_+p+P.(.G.#+++++W..+W.W.W.W..+W.`.W.`.W.W.W.W.U.W.W.W.W.`.`.W.W.W.W.W.Q.W.W.W.W.W.W.W..+`.W.#+#+#+W.W.W.#+M.m q >.&.&.'.&.=.&.&.=.=.=.=.=.=.=.=.&.&.'.&.=.&.&.&.&.&.&.&.=.&.&.'.&.=.=.&.&.&.&.&.&.&.'.&.&.=.&.&.=.O 3 B A A x x y A y y y y y y y y y B y x y x B B y y z z y y y x y y y y x B x y y B y y B y y y B E h s f.8.8.e.i.e.d.9.e.9.j.j.e.d.f.f.d.9.e.b.9.9.e.9.d.e.9.d.e.9.9.e.j.e.0.j.j.j.j.e.9.d.e.j.j.j.b.d.j.Q S x+D+D+z+y+B+G+y+y+y+y+y+y+z+y+y+y+y+y+y+y+y+y+G+y+y+y+y+z+y+y+y+y+y+y+y+y+B+B+y+y+z+y+y+y+y+G+C+C+>+h.$+9+|+9+|+}+9+}+}+9+9+9+}+}+|+}+9+9+|+|+9+|+|+|+|+|+}+9+9+}+|+9+|+|+9+|+|+9+|+|+|+}+}+}+}+f+f+}+f+%+p.S.s+t+t+e+k+k+s+k+k+e+o+t+s+k+k+k+o+s+k+k+s+k+o+k+k+k+s+k+k+s+s+s+s+k+k+s+k+k+k+k+s+k+k+h+e+o+h+t+o+6.n Y X U .U Z ` @.` U U Z ` Z ` @.Z ` @.Z ` @.Z ` ` Z @.Z ` ` Z @.@.` ` ` ` @.` ` U @.` @.` ` +.Z ` e ", -"P @.+.+.U +.+.+.T Y +.+.+.+.+.+. . .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.T +.+.+.+.+.T T +.+.+.+.+.Y n 1.{+j+1+:+<+<+a+<+<+<+<+a+a+a+:+<+a+a+6+:+<+a+a+1+<+a+a+<+<+<+<+a+a+a+:+a+:+a+a+1+a+<+a+<+<+:+^+:+p+P.}.M.#+U.`.U.#+#+.+W.W.R.W.W.W.W.W.W.W.W.W.W.W.U.W.W.W.W.W.W.U.W..+#+W.W.Z.W..+W.U.W.W..+W.R..+W.U.#+Q.q q *.&.&.&.&.'.*.&.&.&.=.=.=.=.=.=.&.'.=.=.=.&.=.=.=.'.'.&.=.=.&.&.=.=.=.=.&.&.&.=.=.=.'.=.=.%.=.'.'.k o B B B A B A A x B x x B x B y x B x B E B B B B B x B B x B B B B x B x y B B B B B B B B x B B K f s f.8.8.d.5.e.9.b.8.8.8.b.9.b.d.d.d.8.d.d.d.8.d.d.d.d.d.e.b.d.8.8.9.8.8.8.8.8.8.d.8.8.8.d.8.8.8.8.j.u I.F+F+E+A+C+A+C+C+A+C+C+A+C+C+A+C+C+C+C+A+C+C+C+D+A+C+C+C+C+A+C+C+C+C+A+C+D+C+D+C+C+C+C+C+w+y+C+A+D+-+n.;+b+b+b+|+b+b+b+b+|+b+b+9+b+|+9+9+b+|+9+9+b+9+b+9+|+b+9+b+9+b+9+|+b+9+b+b+b+9+|+b+b+b+9+}+}+9+9+9+;+p.X.r+r+r+k+h+q+r+q+h+h+q+q+r+q+q+q+r+r+r+r+q+h+r+s+h+q+r+q+s+h+q+h+q+s+h+q+q+q+s+s+q+r+r+q+h+q+q+r+o+6.n ` Z Y Y U T +.T +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. . .+.+.T .+.+.+.+.+.+.+.Z @.e ", -"M Y . .Y Y +.+. .+.+. .X X X +. .+.+.+.+.+. .+.X X . .Y +.+.X Y +.Y +.Y +.Y .Y +.+.+.+.Y Y . .P i l._+a+1+a+6+3+a+a+6+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+6+a+a+a+a+a+6+a+a+a+a+6+a+a+a+a+a+a+a+a+a+a+1+++(.R.#+#+#+#+#+#+#+#+#+#+#+#+#+U.Z.#+#+#+#+.+#+#+#+Z.#+#+#+#+Z.Z.#+#+#+#+#+#+#+#+U.#+#+#+#+#+Z.U.#+,+V.v ~.l.*.>.*.=.>.>.*.%.*.#.*.>.>.*.=.*.*.*.*.*.*.*.*.*.*.*.*.*.>.*.*.=.*.*.*.*.>.*.*.>.*.*.>.#.*.>.*.*.k 3 B w I I z w w A A A w B w I I A B w w B A A A A B w w B A w A A A w A A w w B A w E w w B w B I }.j N i.e.d.i.j.e.f.9.d.f.f.d.d.f.f.d.f.f.9.d.f.9.d.d.f.f.d.f.f.9.f.f.e.d.f.f.9.f.f.d.9.f.f.9.f.f.8.j.i.s I.x+F+F+F+E+E+F+F+E+z+G+G+G+G+G+G+D+G+G+A+D+G+G+G+D+A+D+G+G+A+G+D+D+G+A+D+G+G+G+A+G+G+D+G+F+F+G+D+G+-+n.%+f+f+f+7+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+7+f+f+f+7+f+f+f+7+f+f+f+f+f+f+9+f+7+$+m.]+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+t+S.c ` Z Z M Y . .X +. .Y .X +.Y Y .X +.X X +. .+.Y Y +. .+.Z +.+.X +. .+.+. . .+. .Y +.+. .+.` ` M e ", -"} p e e e e e e e e e e e e e e e e e e d d e e e e e e e e e e d e e e e e e e e e e e e e e e e n } z k.q.w.u.P.u.q.q.q.q.q.q.q.u.u.q.q.q.q.q.q.q.q.q.q.V.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.F.w.w.[.8 }.k.k.[.[.w.1.~.[.}.[.[.}.}.}.[.}.}.}.[.}.}.[.}.[.m }.k.}.[.}.[.}.}.~.(.}.}.}.}.[.[.}.}.}.}.}.[.[.[.7 0 k j j j q j j j j q k k j j j j j j j j j k j j j j j j j j j j j j j j j j j j j j j j j j j j j < ' 3 l l l 3 l l 2 2 2 2 3 2 2 2 2 2 3 h 2 2 2 2 2 l l 2 2 l l 2 l h 2 2 2 h l 2 2 2 h 2 l l 2 2 l 8 < 1 u N Q N u Q N u u u N N u Q N u N Q N u N N u N N u N Q N u u N u u u Q N u u Q N u N u N u Q Q ,.D a.H.T.'+T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.-+T.T.T.T.T.I.T.r.L n.C.C.C.C.C.C.C.n.C.n.n.n.N.C.C.C.C.C.C.m.n.N.C.C.C.C.C.n.C.C.m.N.C.C.C.n.n.C.C.C.C.n.C.C.C.C.C.C.n.3.c.E.y.y.E.E.E.*+E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.*+E.E.E.E.E.y.y.E.E.E.E.E.E.E.E.E.E.E.E.E.E.y.A e c c n n e e e d e d e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e c c n e ", -"R B.y.B.6.c.6.6.6.c.6.6.B.c.6.6.6.6.6.6.6.B.B.6.6.c.6.6.B.6.c.6.6.B.c.6.c.6.6.c.c.6.c.6.6.6.c.6.B.B.R l I r d d y r r i i p p i i y p p p y p p i p B p p p p y p B y B d p } } p y B p p d p p p p y y y 3 0 (.[.[.[.[.[.[.[.<._.[.[.[.[.[.[.[.[.[.[.[.[.[.[._.[.[.[.u.[.[.u.u.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.7 J (.~.~.~.~.~.~.~.).}.~.~.}.~.~.~.~.}.~.~.~.~.~.~.~.~.).).~.~.~.~.~.~.~.(.).~.~.~.~.~.~.~.~.).}.}.).h m 0 k m k m k m k k k m k k m k m m k k k k m m k k k 0 0 k k k k 0 m k k m 0 k k k k m k k k k k w 2 ; j | 7 j | 7 < 2 2 2 2 2 2 < 0 2 0 7 v 2 < 2 2 2 0 2 2 h < < < 0 2 2 2 < 0 2 7 0 0 2 h 2 0 2 | v h < 9 S u N u S S S S S S S S S S S S D S S S D S S S S S S D S S S D S S S S S D S S S D D S D S S u N t J t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.H.t.t.t.t.t.t.t.t.t.t.t.t.t.H.t.t.t.t.t.t.t.D.t.x.t.t.D.D.H.L L m.n.n.7.m.n.7.m.m.m.m.n.m.m.m.n.m.n.m.m.m.n.m.m.m.n.7.n.m.7.m.n.n.m.m.m.m.n.m.m.m.7.m.n.m.m.7.n.m.l A B.B.B.6.6.6.6.6.6.B.6.B.c.6.c.6.6.c.6.c.6.6.B.c.c.6.6.6.6.c.B.c.6.c.6.6.c.6.6.c.6.6.B.c.6.c.B.B.B.R ", -"A.n+e+d+d+[+d+d+e+e+e+e+e+e+n+e+e+e+e+e+e+e+e+e+e+e+e+n+e+e+e+d+n+e+e+e+l+e+e+l+e+e+e+e+e+e+e+e+e+n+E.E e P U +.@.` ` ` ` ` ` ` ` ` P P ` ` ` ` ` ` P ` ` ` ` ` ` P ` P @.` P ` ` ` P P ` ` ` ` P P ` U @.e ;.O.a+<+{+{+(+{+{+{+{+{+4+{+{+(+{+{+{+4+{+{+4+:+{+{+:+:+:+3+{+(+{+(+{+(+{+{+{+{+(+(+{+(+3+{+{+{+(+3+P.[.F.W.W.W..+W.W..+W.W.W.W.W.U.W..+W.W.W.R.W.W.W.W..+R.W.U.W.W.W.W.W.W.R.W.W.W.W.W.W.R.W.W.W.M.W.W.W.W.}.q #.>.>.#.#.#.#.#.#.#.#.>.#.#.#.%.#.#.#.#.#.#.#.#.>.#.#.#.#.#.#.#.#.#.>.*.#.#.#.#.#.#.#.#.#.#.#.#.k.k l A A E A w E E E E E E E E E E E E E B B E E E E E E E E E E E E E E E E E E E E E E E E E E h E E 3 C 5.f.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.2.2.i.5.i.i.i.i.i.i.5.i.i.i.5.i.i.i.i.i.i.j.0.i.i.i.5.2.2.0.f.0...^.m+B+g+v+v+x+g+g+g+g+g+x+x+B+B+g+B+x+g+g+B+x+x+g+g+g+x+x+g+B+g+x+x+g+B+g+x+x+x+B+g+x+y+z+B+v+v+B+B+g+t.C.8+7+7+;+2+2+7+}+}+}+}+}+2+;+}+7+}+}+;+}+}+}+}+}+;+7+7+2+;+7+}+7+7+;+}+7+7+}+7+7+}+}+}+}+7+}+}+}+%+m.y.l+e+n+~+~+e+e+e+e+d+e+l+e+e+e+e+e+e+e+n+e+e+e+n+e+e+e+e+e+e+e+e+e+n+e+e+e+e+e+e+e+e+e+e+e+d+d+e+l+E.", -"E.t+q+q+q+q+q+q+r+s+t+t+r+r+s+t+r+r+q+q+r+r+r+q+r+s+t+t+t+r+t+t+r+r+t+r+q+r+r+q+s+r+r+r+r+r+s+t+r+t+*+E P .T .X +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Y +.T c ;.O.6+a+3+4+4+3+4+3+3+4+3+4+4+:+3+4+4+3+6+6+3+3+4+(+3+3+4+3+3+<+3+4+4+3+3+4+4+3+3+3+:+3+3+4+0+4+^+4+{+_.F.#+W.Y.{+`.Y.{+`.U.W.W.U.Z.U.`.W.#+U.W.`.`.W.U.W..+#+U.W.W.`.`.`.Z.U.U.W.`.`.W.W.U.Z.W.V.++U.U.Z.U.).q &.'.,.%.=.=.>.=.'.=.=.,.*.=.=.%.&.'.'.=.&.&.&.'.'.=.=.=.=.=.'.*.*.=.=.=.=.=.*.%.'.=.=.*.*.=.=.=.#.k 3 y E p E B E B E E B E B E E E B B E B B E B B E B B E E B E E B E E B E E E B E E E E p B B B E E 3 s 0.d.j.b.b.e.e.e.b.b.b.e.e.b.b.b.b.e.b.b.b.b.b.e.b.e.b.b.e.b.b.e.e.e.b.e.b.b.b.8.b.b.b.b.d.f.d.d.e.Q S m+D+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+D+C+C+C+C+A+C+C+C+C+C+C+C+C+C+C+A+C+C+C+C+A+C+C+E+E+C+C+C+D+g+x.K.9+b+9+9+9+9+b+9+9+9+9+b+9+9+9+9+b+b+9+9+b+b+b+9+9+b+b+9+9+9+b+9+b+b+9+9+b+b+9+9+9+9+b+b+b+b+9+b+}+C.*+t+t+t+k+s+r+r+t+t+t+r+q+r+r+s+r+r+r+r+s+r+r+r+s+r+r+r+r+r+r+r+t+r+q+r+t+t+r+t+r+r+t+t+r+t+q+r+o+t+y.", -"E.l+u+u+l+l+u+h+s+h+s+s+q+s+k+s+s+s+h+h+s+k+h+q+s+s+k+s+s+s+k+s+k+s+h+k+h+s+q+h+s+s+s+s+s+h+k+k+s+t+E.i U .T +.P Y +.X X X +.+.X Y Y +.+.Y Y Y Y X +.Y Y Y Z Y +.Y Z Z Z Y Y Z Z +.Y Y Y +.X Z Y +.` X +.M ;.++a+6+6+<+<+6+3+<+<+<+6+a+<+:+a+a+:+a+:+<+a+:+a+:+a+<+a+<+<+<+<+<+<+<+:+3+6+a+<+:+<+6+6+3+4+^+:+6+=+[.w.`.Z.U.`.U.U.Y.U.W.W.U.U.Z.U.`.=+U.U.U.U.=+Z.U.U.++V.Z.Z.U.U.{+V.Z.U.U.Z.U.U.V.V.W.U.Z.Y.`.W.Z.Z.U.(.q ,.%.'.,.,.%.'.=.&.=.&.=.=.&.&.&.&.&.&.&.&.&.&.=.=.=.=.&.&.=.=.=.'.=.=.=.&.&.=.'.&.=.=.=.=.=.=.&.|.q k z E B B A x z z A z z z z z z z z z z z z z z x z z z z z z z z z z z x z z z z z y x r z z z B B 2 s f.8.b.d.f.9.9.0.9.9.9.9.0.9.d.9.9.9.9.f.d.d.9.f.d.9.9.9.9.9.9.9.9.9.0.0.9.d.9.0.0.9.9.f.d.j.j.e.f.Q S m+F+E+z+F+E+E+z+z+E+E+E+E+E+z+z+E+E+z+z+z+A+E+A+A+z+E+E+E+z+F+E+E+E+z+w+z+A+E+w+w+F+F+y+v+w+z+E+G+g+t.K.f+f+}+7+7+f+f+7+}+}+7+7+}+}+}+7+f+f+}+}+f+7+f+}+7+f+}+7+}+}+f+f+7+7+}+}+f+f+}+}+7+}+}+f+}+f+}+7+$+m.*+n+r+q+h+q+q+u+u+k+s+s+s+h+k+k+s+s+s+h+k+s+s+s+k+h+q+s+s+h+h+s+s+s+s+k+h+s+s+s+k+s+s+s+s+d+s+r+e+s+E.", -"E.r+t+k+d+k+s+k+d+k+k+k+l+l+k+k+k+k+k+k+k+k+k+l+l+e+k+e+t+k+t+e+t+d+k+k+d+k+k+k+d+k+k+h+l+k+k+k+l+t+E.i ` T +.` ` X +.X ` ` Z U X +.U Y Y U U U U U Y U U U U U Y U U Z U U U U U Y Z U @.Y Z Z Z Z Z +.X n ;.=+a+:+:+:+:+:+:+:+:+:+:+(+:+:+:+3+<+:+(+(+3+{+<+(+(+(+3+:+:+<+:+<+<+=+:+<+<+<+:+:+:+:+:+<+:+^+:+3+=+[.w.#+U.W.R.U.U.U.U.Y.++R.`.Q.U.U.Q.U.U.U.U.Y.Z.U.U.V.R.Z.U.M.W.Y.U.U.U.Z.Z.U.U.Y.Y.U.U.Z.W.W.W.U.U.W.).q *.%.=.%.*.*.'.=.%.=.=.=.=.=.=.=.=.=.=.=.%.=.=.&.&.&.&.&.=.>.>.=.=.=.*.*.=.=.*.=.=.&.=.=.&.&.*.*.{.k h B w w z x x x x A x x x A A x x x x x x x x x x x w w A A w A A x A A x w w x x x x x x x x z B B 2 D 0.d.d.9.f.f.9.f.f.f.f.9.9.9.d.9.9.0.i.0.i.i.f.0.d.0.0.0.0.0.9.f.9.j.d.j.f.9.f.f.f.f.f.f.d.i.i.d.e...^.m+E+y+y+w+z+z+y+w+w+z+z+y+y+v+y+y+y+w+v+v+z+z+y+w+v+w+w+z+w+E+E+w+E+w+w+z+z+z+w+w+z+z+z+y+v+z+E+G+g+t.N.f+9+|+}+7+}+9+}+|+f+}+}+}+}+}+|+f+}+|+9+}+}+}+7+2+7+|+|+|+}+2+}+f+}+}+7+7+f+}+}+}+}+}+|+|+}+}+f+7+n.y.u+r+h+k+h+h+l+s+k+k+k+h+h+d+d+k+t+s+k+t+e+k+h+k+k+h+q+h+k+k+l+l+l+l+k+k+k+t+l+d+k+k+k+k+k+k+h+k+s+E.", -"E.t+o+k+l+k+s+k+l+k+k+h+l+h+d+h+k+k+k+k+k+k+k+h+d+d+k+e+e+e+e+n+s+l+k+e+k+k+k+d+k+k+d+h+h+k+k+k+k+t+E.p P .Y ` @.+.+.Y ` ` @.U +.+.@.@.U Z Z U U Y U ` Z ` Y Z U ` U ` U U ` U ` U Z U U Z Z Z U Z Z +.X e ;.=+a+<+^+:+:+:+(+:+:+:+(+(+:+=+(+4+3+:+:+(+(+(+(+:+(+4+:+:+:+:+(+a+<+<+:+<+:+:+:+:+:+:+:+:+(+<+a+3+O.[.w.#+U.U.U.U.U.U.U.Z.V.U.W.U.U.W.W.U.U.U.U.W.U.U.Z.W.Z.Z.U.U.U.W.W.U.U.U.U.U.U.U.U.U.U.U.U.R.R.U.U.M.~.q =.'.'.#.*.=.'.=.*.=.=.=.=.=.=.=.=.*.*.*.*.*.=.=.=.=.=.=.*.>.#.=.=.*.=.=.*.&.=.*.=.=.*.=.=.=.=.&.&.k h w w A y x x B B B B B B A A B B B B B A A B B A A B x A w l A w B w w A A w B B B B B B B A z B E 2 s 0.d.e.9.9.f.f.f.9.9.9.9.d.d.9.f.0.0.0.j.0.0.f.f.d.f.f.f.d.i.d.9.9.9.e.j.j.9.9.9.9.9.9.9.d.0.0.8.j.N ^.v+E+z+w+w+z+z+w+y+v+y+y+y+z+v+y+y+z+z+v+y+y+y+y+y+y+y+y+y+y+w+z+w+w+w+w+y+y+y+v+w+B+z+A+y+v+z+A+y+j+t.N.f+9+|+|+}+}+|+}+|+}+|+|+|+|+|+9+9+|+}+|+|+|+|+}+7+|+9+}+9+}+7+|+9+9+}+7+7+f+}+7+|+|+|+|+|+}+|+9+7+m.E.u+s+k+d+h+k+k+k+k+k+k+k+s+l+l+k+s+s+k+e+e+k+k+k+k+h+l+h+k+k+l+h+h+k+k+k+e+e+l+d+k+k+h+h+k+k+k+s+h+E.", -"E.u+t+k+l+k+s+h+h+h+h+s+s+s+l+l+k+l+h+k+k+s+q+q+q+d+d+s+l+k+s+h+s+k+h+k+k+s+s+l+k+l+l+h+s+h+h+k+u+t+E.p P +.X ` @.X @.@.` ` ` X +.X @.@.Z Z @.` U Z Z @.U ` ` @.Z ` Z @.Z Z ` U ` Z Z Z Z Z Y Z Z Z @.+.+.n ;.=+a+<+(+:+(+(+:+:+(+:+3+(+:+:+:+4+:+(+(+:+3+3+<+<+:+:+3+4+(+{+3+6+<+<+<+6+3+:+:+:+:+3+3+(+(+<+6+3+O.[.w.#+U.U.U.Z.U.W.U.U.W.U..+#+Z.U.W.U.U.U.U.U.R.Z.U.U.#+U.U.W.W.W.W.Z.U.U.U.U.U.U.U.U.U.Z.W.Z.W.U.#+U.).q =.'.=.%.>.=.&.&.=.=.=.=.*.=.=.=.%.%.%.=.=.*.*.*.=.=.=.=.=.*.*.*.=.=.*.=.&.&.=.*.*.*.*.=.*.&.=.&.=.k f E w A y B B B B B B B B B B B B B B B A A x x x y y x A A A A w B A A w B A B B B B B B A B z B E 2 s 2.8.b.9.f.j.9.j.9.9.9.9.f.9.9.f.0.j.j.e.d.9.9.d.d.8.d.d.d.f.d.f.9.9.9.i.j.9.9.9.9.9.9.j.9.0.0.8.j.N ^.v+E+z+z+w+z+z+z+z+y+y+y+y+z+v+z+C+E+z+y+y+z+y+y+y+y+B+y+y+y+y+y+B+B+y+C+z+y+z+v+y+y+C+G+y+v+y+A+G+m+D.K.f+9+|+|+}+9+|+7+|+}+9+9+7+9+9+9+9+9+}+}+|+9+9+}+}+|+9+|+9+|+|+|+b+9+|+|+}+}+7+}+9+|+9+9+|+}+9+9+2+7.E.u+r+s+k+h+s+s+k+h+h+k+s+s+d+d+k+q+h+k+k+l+s+k+k+k+k+k+k+k+h+q+h+h+h+k+l+n+k+h+l+h+s+h+u+k+h+s+t+t+B.", -"E.l+t+k+s+s+s+q+s+h+h+s+s+s+h+h+s+q+h+l+s+r+q+q+q+l+h+q+l+s+h+q+q+r+r+s+k+h+s+k+k+l+h+s+s+h+h+s+l+t+E.y ` +.X ` X X ` ` ` ` Z +. .X @.Z Z Z +.Y Y X @.Z Y X ` +.@.Z Z +.Y Y Y Y Y Y Z @.@.Z Z Z Z Z @.+.X n ;.=+a+<+3+:+:+3+3+3+:+:+3+4+:+:+3+3+3+3+4+3+:+<+^+^+<+^+3+4+(+(+3+4+:+:+:+3+3+3+:+:+:+3+3+3+:+<+3+4+O.[.w.#+W.U.U.U.W.W.U.Z.R.U..+R.U.U.W.#+#+U.U.U.W.W.U.U.W.U.U.W.W.U.#+#+U.U.U.#+#+U.U.U.U.Z.W.U.U.U.#+U.}.q *.'.=.*.*.*.&.=.=.=.=.&.&.=.*.&.'.'.&.*.=.=.*.*.=.=.=.=.*.=.&.=.=.=.&.=.=.=.=.=.&.=.=.=.*.=.=.=.=.k 8 o w A x B B B B B B B B B B B B A A B B B x y B x x x x A A A A w A x A B A B B B B B B A B z B E o s 0.d.e.9.f.f.j.9.9.f.9.0.0.0.f.d.e.e.e.b.8.d.d.8.d.8.8.9.d.d.d.9.9.0.d.f.j.9.9.9.9.9.j.j.9.i.j.8.j...^.v+E+z+z+w+z+z+z+z+y+y+z+z+z+z+z+A+E+E+E+E+z+E+F+w+z+B+y+z+y+y+y+B+y+y+z+z+z+z+C+z+y+A+z+y+y+z+E+F+g+t.K.f+9+9+}+7+9+9+f+|+9+f+9+9+}+9+9+f+9+|+|+9+9+f+b+b+b+f+9+|+|+|+9+b+|+|+9+9+}+7+}+9+9+9+|+|+9+9+9+}+n.E.u+r+k+s+h+s+s+s+h+h+q+s+s+k+k+h+h+s+s+k+h+s+s+k+k+k+k+k+h+s+s+q+q+h+k+q+q+l+s+h+h+s+s+l+k+h+s+s+t+E.", -"E.t+t+k+l+k+q+h+s+k+h+h+s+h+k+k+q+q+h+k+s+s+s+s+s+s+q+q+q+k+k+s+r+s+s+k+q+t+s+k+k+s+s+s+h+h+h+s+s+t+E.p @. .@.` Y @.` ` @.Z U Y +.+.X X +.+. .+.+.+.@.Y . .+.+.Y X +. .+.Y X X X +.Y Z Z Z Z Z Z Z Z +.X e I =+a+6+3+:+^+4+3+:+:+(+(+4+(+:+3+4+4+<+:+4+0+4+0+^+^+_+^+_+4+{+0+4+4+4+(+:+3+3+(+:+:+3+4+^+:+<+:+4+{+[.w.#+W.U.U.U.U.Z.#+U.W.#+#+R.U.U.U.U.U.U.U.U.U.#+#+U.#+.+U.Z.U.U.U.#+#+U.U.U.U.U.U.U.W.#+U.W.U.U.U.U.(.q *.'.=.*.*.*.&.&.=.*.=.=.=.*.*.&.&.&.'.'.'.*.%.%.%.'.'.=.=.&.&.&.=.*.=.=.=.=.=.=.=.&.=.&.=.*.=.=.=.k f E w x z B B B B B B B B B B B B A A B B B B x B B A A w w w A x w A A B A A B B A B B B B B z B E o s 0.d.e.9.f.j.9.f.9.9.f.0.j.j.0.j.d.e.e.e.d.d.9.d.9.d.d.d.d.d.9.j.9.0.f.d.9.j.9.9.9.9.9.9.9.0.j.8.j.N ^.v+G+y+z+w+y+z+z+z+z+z+z+z+z+w+A+z+A+D+D+A+A+F+E+z+E+z+y+w+w+E+A+A+E+z+w+y+z+z+z+z+y+A+z+y+y+z+z+G+g+t.N.7+9+|+}+7+f+9+9+}+}+9+9+9+}+|+f+9+9+|+|+9+}+9+5+b+9+f+9+9+7+2+7+f+}+|+b+9+}+}+}+9+9+9+9+|+|+9+9+}+m.E.u+t+k+k+h+s+s+s+h+h+h+s+s+t+o+r+k+t+s+k+s+s+r+s+k+s+s+s+t+o+o+t+t+s+l+h+u+l+h+h+h+h+s+s+h+h+s+s+s+E.", -"B.t+t+k+l+d+h+k+h+k+d+k+l+l+k+k+s+s+k+k+s+s+s+n+[+~+[+~+d+d+s+s+s+h+k+k+l+s+k+k+k+k+l+h+h+h+k+h+k+t+E.p ` +.U @.U ` @.@.Z Z @.` U +.@.` ` ` ` ` @.` ` Y ` ` ` Z Y ` ` ` ` Y ` Y ` ` Z Z U Z Z Z Z Z +.+.X e ;.=+a+3+:+:+^+^+:+:+:+:+:+(+:+:+:+:+4+6+:+0+0+1+!+!+@+!+^+0+0+0+0+0+{+(+<+:+(+:+:+:+:+:+^+(+:+<+:+4+O.[.w.#+Z.U.M.R.U.U.W.R.R.U.U.U.Q.U.R.U.U.U.#+#+U.M.w.G.M.)+Z.Z.U.U.U.U.U.U.U.U.U.W.R.U.W.W.`.V.R.U.U.U.).q =.%.=.%.*.%.=.=.*.*.=.=.*.*.=.&.=.'.,.'.%.#.q q q #.>.*.*.%.'.=.=.=.=.=.=.=.=.*.*.=.*.=.=.=.*.=.'.k h w w y y B B B B B B B B B B B B B B B B B A A A 3 w w l h w o w B B A A A A B B A B B B B B z B E 2 s 2.d.9.0.0.9.9.f.f.9.f.9.d.e.j.j.j.i.i.9.i.2.2.2.2.2.2.5.5.5.i.i.d.d.9.d.9.9.9.9.9.9.9.9.d.i.0.8.j.N ^.v+G+y+w+v+z+z+z+w+w+z+z+z+z+w+z+z+z+y+y+y+y+m+m+m+m+m+y+y+z+E+E+A+D+w+w+y+z+z+w+y+z+A+A+y+v+z+A+G+g+h.N.f+9+b+}+}+}+|+}+|+}+|+}+|+|+}+|+9+9+}+}+|+|+9+|+7+9+;+%+%+%+$+$+$+;+}+b+b+|+}+}+}+}+|+}+}+|+|+9+;+m.E.u+s+s+k+k+h+k+k+k+k+h+h+h+k+t+t+s+s+t+n+s+s+t+t+s+s+s+s+t+t+o+t+t+s+l+l+h+s+k+k+d+k+h+k+h+d+s+s+s+B.", -"E.l+t+k+l+l+k+k+h+k+d+h+h+l+k+k+k+k+k+n+[+X.E.c.R R R R R R c.E.X.n+l+k+l+k+k+t+k+d+l+h+h+k+k+h+h+t+E.p P +.X @.U @.Y +.Y U @.P P n e d d d d e e d e e d d e e e p e e e n e e e d @.Z Z Z U Z Z Z Y +.X n ;.=+a+:+(+:+:+:+:+:+:+:+:+<+:+(+(+:+3+3+P.q.}.].7 7 L 7 F [.u.u.O.0+0+(+(+:+(+:+:+:+:+(+(+(+:+<+:+3+O.}.w.#+U.U.M.W.U.U.U.R.R.U.U.U.@+R.Q.#+U.w.J J J 8 8 8 8 [.J ).w.U.#+W.U.W.U.U.U.W.R.R.W.R.Y.V.R.U.U.U.).q =.*.=.#.*.*.&.*.*.*.&.=.*.*.=.=.%.>.q j < < < < < < < | j j O O =.=.*.=.=.=.*.=.=.*.*.*.=.=.=.*.'.k 2 E A y x B B B B B B B B B B B B B B B B B A w 2 ; ; ; * * ; 3 r B A A A A A B B B B B B B B z E E 2 s 0.d.9.f.f.f.f.9.0.0.9.e.e.j.f.i.5.Q N u 1 1 : : : : : t t s N 5.i.j.9.d.9.9.9.9.9.9.9.9.d.i.i.8.j...^.m+E+z+v+w+z+z+y+y+w+z+z+z+z+y+y+y+x+ +x.a.a.W W W W W ^.x.T.>+y+y+y+w+w+z+y+w+w+w+z+A+A+y+y+z+A+G+g+h.N.f+9+9+}+}+|+|+|+}+}+|+|+9+}+}+|+9+|+}+|+|+9+|+$+$+n.L L L L L L L J.2+9+b+|+}+|+|+}+|+}+|+|+|+9+7+m.E.u+t+k+l+d+k+k+h+k+k+k+h+h+e+E.E.E.E.c.c.c.c.E.B.c.c.c.c.B.E.E.E.c.c.B.~+h+k+k+k+l+k+h+k+d+l+s+s+t+E.", -"E.s+s+k+l+h+s+h+h+h+h+h+s+s+k+k+k+s+l+X.R b ! @ + + + + + + . - b B.]+s+l+l+s+r+s+l+s+s+h+k+h+q+h+t+E.p ` +.Y ` @.X +. .+.Z ` P e ( & * * * * * * * * * * * * * * % * * * * * ; * & @.Z Z Z Z Z Z Z @.+.X n ;.=+a+:+(+:+:+3+:+:+:+:+:+3+3+:+4+<+P./.4 { . . . . . @ . + ^ 4 4 (.O.{+{+:+3+:+(+:+:+3+3+:+:+:+<+6+O.}.w.#+U.W.W.U.U.U.U.U.W.U.Z.U.++R.R.k.J 8 @ . . . . . . . . @ 8 J q.W.U.U.U.Z.Z.U.Z.W.W..+W.W.U.U.U.U.).q *.=.>.>.*.=.&.*.=.*.&.=.=.=.&.#.k | < = % % @ @ @ @ @ + = | 7 O &.=.=.*.=.=.=.=.&.=.=.*.=.=.=.=.%.k 2 w w x y B B B B A A B B B B B B B B B B B I f * % % % % @ % ' r B A A B A A B B B B B B B B z B E f s 0.8.e.9.9.9.9.9.0.f.9.9.e.f.0.5.s : : = . . . @ @ @ . @ + , : 1 N 2.j.9.9.9.9.9.9.9.9.j.d.i.0.b.j...^.m+E+y+y+z+G+z+z+z+z+E+F+z+y+y+v+T.W 8 @ % % # % % % % @ ~ [ W x.'+x+y+w+z+y+z+w+z+y+z+A+y+y+z+A+G+g+o.K.f+9+9+}+}+f+9+|+}+}+9+9+9+}+|+9+9+|+|+9+}+9+9+$+h./ + @ @ @ . - - 3.8+}+b+9+|+9+9+9+f+|+|+|+9+9+7+m.E.u+t+k+d+l+s+h+k+k+k+k+s+h+[+4.b ! & ; & * # ) ! # ! - ! # # ! ! & # b X.l+k+k+h+h+h+h+h+l+h+s+t+s+E.", -"E.s+t+h+l+h+h+q+h+k+s+q+q+q+s+k+s+~+E.a @ @ + $ = = + . + + + $ + * R E.l+l+s+s+h+s+h+s+s+h+h+s+s+t+E.p ` +.Y ` Y Y +.+.X X Y ` i @ . + + . . + + . @ @ . . . + + + + + + + . + . . @.Y Z Z Y Y Z Y @.+.X e ;.=+a+3+(+:+3+3+:+(+:+:+3+4+3+(+(+s.4 + + . - . . . . . . + $ + . + 4 u.)+4+4+4+4+(+(+3+3+:+:+(+3+3+O.[.w.#+U.U.U.U.U.W.W.U.W.#+#+W.Q.Z.J * . . . + . . . . . + . . . . 8 }.U.W.W.#+U.U.U.W.#+W.U.U.U.U.#+U.(.q >.'.*.*.*.=.&.=.=.=.&.=.=.O q < = + . . @ # # @ # # @ . . $ $ < O >.%.%.=.=.=.>.=.&.=.*.&.&.*.=.=.k 2 w w A x z B A B A A B A A x B B B B B B y h @ # # @ @ @ @ @ * h B x x w x B B B B B B B B B z B E l s 2.8.e.9.9.9.j.9.9.9.9.j.j.i...1 , + + @ % @ # - # . # $ . + $ + , s 5.5.j.9.j.9.9.9.9.e.9.0.0.8.j.N ^.v+E+z+z+z+z+z+z+z+z+A+E+y+x+m+x.] @ % & % % % % % % * @ + . . + g T.x+y+E+A+z+y+y+y+z+z+y+y+z+E+G+g+D.N.7+9+b+|+f+}+9+9+|+}+9+f+9+|+9+f+9+f+|+f+}+9+9+A.) . + @ % @ # @ . z.2+|+9+9+|+|+9+9+9+9+|+9+9+9+}+m.E.u+t+s+k+s+s+q+k+k+h+l+h+q+X.5 . @ % $ @ % @ . . + + . . + + + + $ + b X.s+s+s+h+s+h+s+s+h+h+s+t+s+E.", -"E.l+t+s+l+h+h+s+r+k+k+h+u+h+k+s+~+R . + + . . + $ $ + @ + + $ + . @ . a E.s+k+r+h+s+h+s+s+h+h+s+h+t+X.p ` +.X ` X ` Y +.Z Y +.` r + @ @ @ @ @ @ @ @ % @ @ @ @ $ $ @ + + + + . . . . @.X Y Y Z Z Y Y Z +.+.e ;.=+a+6+(+(+:+3+(+(+:+:+4+3+0+{+u.~ . . . % . . . . . . . . + . . . . 8 w.{+(+(+4+:+:+(+(+(+:+<+3+4+{+[.w.#+U.U.U.U.Z.U.W.U.W.W..+#+M.J + . . . . . . . . + + . . . . . . { }.W.#+#+#+U.U.U.W.W.W.U.U.U.#+U.).q *.&.=.>.*.=.&.&.*.&.&.=.>.~.< $ . . - - . # @ @ # # @ . . . . . < O #.'.&.=.=.>.=.=.=.*.=.&.*.=.&.k 3 K w x x y B A B A A B A A B B B x x A A x 2 . # . @ . . . . @ 3 B B x A x y B B B B B B A B z B E 3 s 0.d.d.9.9.9.j.9.9.9.9.b.j...: + . . . @ % @ . - . . @ $ @ . . - + = u {.j.9.b.d.9.9.f.d.e.0.9.8.j.N ^.v+E+z+z+z+A+z+z+z+A+E+E+F+m+a.@ @ % % @ . . + . @ @ % $ . . % @ @ g '+y+E+D+E+y+B+B+z+z+y+y+z+E+G+g+t.N.7+9+b+}+}+9+9+|+|+9+9+9+9+}+9+f+f+9+|+}+}+9+;+! @ + . . . . . $ . n.f+|+|+|+|+|+9+9+9+|+|+9+9+9+}+m.E.u+r+s+k+s+h+l+h+k+h+l+h+s+X.) . @ $ $ $ @ + . + + + + + . . . + = + b X.s+q+h+h+s+h+s+s+h+h+s+t+t+E.", -"E.l+t+k+l+k+k+h+t+k+d+h+h+h+k+[+R % $ $ $ + # @ @ @ @ @ + @ . - - . + - b [+e+k+s+k+h+h+k+k+k+h+h+t+X.p P +.Y ` Z @.+.+.Z @.+.` } % @ @ @ @ @ @ @ @ % @ @ @ @ % $ % + . . . . . . . ` Y Y Z Z U U Y U +.X n ;.{+a+3+(+:+:+:+:+:+:+^+^+:+0+u.= @ . . . @ + . . . . + + . . . . . . @ { P.(+4+(+<+:+:+3+:+:+<+:+3+O.}.w.#+U.U.U.U.Z.U.Z.R.M.W.L.`.}.@ + + . . . . . . . . . . . . . . . . { }.U.#+W.U.U.Z.W.W.R.W.U.U.U.W.).q =.=.=.#.*.*.&.=.*.&.&.%.#.| = + . + - . @ @ $ @ @ % @ @ . . + @ $ < O %.=.&.=.*.=.*.=.*.=.*.*.&.=.k 2 E A x y B B B B w A x x B x x B x A w w 3 & . + @ @ . . . . @ 3 x x B A B y x x B B A x A B z B E 2 D f.d.9.9.9.9.9.9.9.9.9.j.5.s = + + . . # # . . + + # . . @ . @ . + $ : t i.9.d.d.9.0.9.d.d.0.9.8.j.N ^.v+E+z+w+w+z+z+z+w+w+D+z+x+x.+ @ @ @ # . . # . . . @ % + . . @ + # @ W x+F+E+A+y+B+z+z+z+y+y+z+A+A+g+t.K.f+9+9+}+}+|+|+|+}+}+|+|+|+|+|+|+f+9+b+}+7+$+L - + . + + . . . @ . J.f+|+|+|+|+|+|+|+|+|+|+}+|+9+7+m.E.u+r+k+d+k+h+l+h+k+h+k+k+q+X.) . @ $ $ $ @ . . . . . . . . . + $ $ + b X.s+h+k+k+l+k+k+h+k+l+k+k+s+E.", -"E.t+o+k+d+k+s+h+h+d+l+q+k+k+d+E.! @ # $ = $ @ % ! R c.R b @ . . . + = @ & c.n+k+t+k+k+h+k+e+k+h+k+t+E.p P +.Y ` Y Y X Y @.@.+.Y d % . . . . # @ . . . . . . . @ @ @ + . . . . . @ . ` U Y U Y Y U U U +.X e ;.=+a+:+:+:+:+(+:+:+:+:+:+:+{+7 + @ . . + @ . @ 4 J )._.] + . . . . + + . u.(+4+(+<+:+<+<+<+:+:+:+3+O.}.w.#+Z.U.U.U.U.U.U.R.M.#+L.F.@ . . + . + . . @ 8 J J 8 . . . . . . . . 8 q.Y.W.U.U.W.W.Z.Q.R.U.U.U.W.J q =.=.=.#.*.*.&.*.=.&.=.%.O , # . . . . @ + $ , < < $ $ @ @ + . . @ = j *.%.=.*.*.=.=.=.*.=.#.=.=.*.k 2 E A x y B B B x A A B B A y y A w w l ; & @ . . . . . . . . @ h x y B w B x A A x x A x B A z E E 2 D 0.8.e.9.f.9.9.9.9.9.9.i.N : @ @ @ . + . - . = , : , + - + . # . . + = , 2.j.e.9.9.0.j.j.9.0.f.8.j...^.m+E+z+w+v+w+z+w+w+w+D+y+ +] @ @ % @ @ - - [ ].a.].9 @ . . @ @ @ . . $ +y+D+A+w+w+w+A+A+z+y+w+A+E+m+h.N.f+|+|+}+}+}+|+|+}+}+|+|+|+|+}+|+b+|+|+%+%+L - . . . + + + . . @ . z.7+b+9+|+|+|+|+|+|+|+|+}+|+9+7+m.E.u+t+k+d+d+k+h+k+h+k+k+k+q+c.) . @ @ + @ @ + + + + @ + + + + + + + + a X.e+k+k+k+d+k+k+h+k+d+k+s+s+B.", -"B.s+o+k+l+k+h+s+h+d+h+h+s+l+X.R # # . + $ $ % b E.d+t+n+E.# @ @ + $ $ $ & ! [+s+k+s+h+h+h+k+h+h+s+t+E.p P .X ` Y Y Z Y @.` +.X e & . . . . . + @ . . # . % @ @ . + . . . . @ % * ; @.Y Z U Y Y Y U Z +.X e ;.=+a+6+(+:+:+3+:+:+:+:+:+3+O.+ @ $ . . # @ + J Q.)+)+1+u.{ # . . . + + . 7 O.4+(+:+:+(+3+:+:+:+:+4+{+[.w.#+U.U.U.U.#+U.U.U.U.#+`.J . . . . . + . @ }.M.#+Z.M.J . . + . . . . @ (.L.W.W.U.U.U.W.Z.W.U.U.#+U.J q =.'.=.%.*.=.&.=.&.&.=.%.| $ % # . . @ @ $ , j O j < = + $ @ . # % $ | q >.=.=.=.&.&.*.*.*.=.&.*.'.k f -.A x y B B B B A A B B B B x w l 2 % + @ . . . . . . . . . % o B B B A B y E A B B B B B A z B E l t 0.d.e.9.f.9.j.9.9.9.9.5.C $ . . @ # . . + , 1 N Q N : = + . - - - . . @ N f.j.j.9.0.j.9.9.0.0.b.j...^.m+E+z+z+w+z+z+z+A+A+D+m+_.+ % % & @ % + + T.j+x+j+m+g . @ % @ . . + + a.m+E+E+z+z+E+E+z+y+y+z+E+E+g+t.N.f+9+b+|+}+}+|+9+9+|+9+9+9+}+|+|+b+9+7+&+n.- + . . . . + + . . $ . z.2+b+|+}+}+}+9+9+|+|+|+|+9+9+}+m.E.u+s+s+l+h+h+h+h+h+h+h+h+q+b - . $ $ @ - - + + + + + + + + + + . . + a X.n+s+h+h+h+h+h+h+h+h+s+t+t+B.", -"E.l+t+k+l+k+h+s+s+d+h+k+s+l+E.{ @ @ . . + @ ! y.t+r+r+t+~+R $ @ @ # ! b b I X.s+k+s+s+h+s+h+k+s+s+r+E.p P .X ` U Z Y +.@.@.+.X e 3 ' ' ' ' ' ' ' ' ' ' ' ( ' ' % @ . . . - & ; ' e @.Y Y Y Y Z Z Z @.+.X n ;.=+a+3+(+:+:+3+:+:+:+:+4+^+s.. # @ . + . . , Y.,+(+0+4+0+).. . . . . . + + P.4+(+(+:+4+4+:+:+:+3+3+O.[.w.#+#+U.U.U.#+U.U.U.#+U.M.@ . . . . . . . J U.W.W.#+#+Z.J . + + . . . . { w.#+W.U.U.W.W.U.U.Z.Z.#+U.(.q =.'.=.*.*.=.&.&.*.*.'.q , $ # # . . $ $ , j %.%.#.O m = $ @ # @ @ + = j >.%.'.=.=.=.=.=.=.=.=.=.'.k f R B A x x B B B A B B x A w o 2 ; @ . . . . . . . . . . . . % h B B B A B y B B B B B B B B z B E o t f.d.e.9.9.9.9.9.9.9.e.N 4 $ . - @ @ . + , N i.e.d.i.|.s @ + . . . - - . u 0.f.9.f.f.f.f.9.0.0.8.j...^.v+E+z+z+z+z+z+z+z+A+y+j+g . @ % @ - % + ].x+y+E+E+F+j+- @ & # . . @ + a.m+z+A+A+z+A+D+E+y+y+z+E+G+g+t.K.f+9+b+}+}+}+|+9+|+9+|+9+9+|+9+9+9+f+2+n./ @ $ + + + . . . . . $ . n.f+|+9+}+|+|+|+|+9+9+|+|+9+9+7+m.E.u+t+t+l+h+l+s+s+h+h+s+h+q+b - # + $ @ > ) b b b b b b R b b b R b b c.[+q+r+h+h+s+s+s+s+h+s+s+t+t+E.", -"E.t+t+t+l+k+s+s+q+l+k+s+s+e+a $ @ @ - . @ @ R o+t+t+t+t+l+X.b R R c.E.X.X.[+s+h+d+q+h+h+s+k+k+h+s+r+E.p P +.X ` Y X +.Y ` ` +. .M d P M M M M P M M M M M M n i ; & . . . @ * ( e P Y Y Y Y +.Y Y Y @.+.X n ;.=+a+3+(+:+:+3+3+:+:+:+3+_+(.+ # @ . . . = 7 0+4+_+4+4+4+q.- . . . . . . . P.4+(+(+4+(+:+:+:+<+a+3+O.[.w.#+Z.U.U.U.U.U.U.U.U.#+q.+ . . . . . . + M.#+.+V.`.U.U.M.{ . . . . . . . }.Z.U.U.Z.U.U.U.U.U.U.U.W.~.q =.'.'.>.>.=.&.*.=.'.*.q = @ - . - # @ = m %.,.,.%.>.O | $ @ # # . @ $ | #.>.%.=.=.=.=.=.=.=.*.=.=.k h w A A x y B A B x x B B B 2 * % @ @ . . . . . . . . . . . . . h B B x A x y A B B B B B B B z E E 2 t 0.8.e.9.9.9.j.9.9.9.e.N , $ + # % @ . $ 1 2.j.b.8.9.i.|.@ $ + . + + . . : 0.j.9.9.f.d.f.9.0.0.b.j...^.v+E+z+z+z+z+z+z+z+y+y+m+x.H 9 g g - @ { m+x+A+D+D+D+x+. % * @ + . % + a.m+z+A+w+z+C+A+z+B+y+z+E+G+g+t.K.7+9+9+}+}+9+|+|+|+9+|+9+9+}+|+|+f+2+z./ . # @ # + + . . . + @ $ . J.7+9+b+9+|+|+|+f+9+|+|+|+9+9+7+m.E.u+t+h+d+h+u+s+h+k+h+l+h+q+! . @ $ @ # $ ! X.~+[+~+~+[+e+~+~+~+d+[+X.~+s+q+q+h+h+h+h+s+s+k+h+s+s+t+B.", -"B.l+t+t+l+k+h+s+l+l+h+s+s+*+a $ = + - . @ @ c.t+t+d+k+t+s+l+d+s+s+s+t+s+t+t+t+k+d+h+h+s+k+h+k+h+h+t+E.p P +.Y ` Z +. .+.` ` . .` ` +.+.+.X +.+.+.+.+.+.X ` e } % # . . . @ ; n M +.Y Y Z Y Y Y Z Z Z +.X n ;.=+a+:+(+:+:+3+:+:+:+:+3+{+w.+ @ @ . - - = 9 0+(+:+:+:+:+M.{ . . . . . # + O.4+(+:+4+:+3+:+:+:+3+3+O.}.w.#+Z.W.W.U.U.U.U.U.U.W.(.- + . . . . . * M.W..+++`.U.U.#+8 # . . . . . . J M.W.W.U.Z.U.U.U.U.U.U.U.).q =.'.=.#.*.*.=.=.=.&.=.| $ + - # . @ @ , j =.'.%.,.%.t : $ % % # . + $ , O %.%.'.=.=.=.=.=.=.=.*.&.k 2 w w A y B A B B A A B w r * . . . . . . . . . . . . . . . . % h B B A A y x B A B B B B A B z B E 3 s 2.8.e.9.9.9.9.9.9.9.e.N = + + @ % @ @ + u 5.i.f.d.9.j.i.# = + + + + + . : 2.0.d.d.9.d.f.9.f.0.b.j...^.v+E+z+w+w+z+G+C+z+w+F+F+F+y+>+>+T.a.H W y+y+A+A+A+z+j+{ & ; % . + & @ r.m+F+E+z+z+z+A+z+y+y+z+A+G+g+t.N.7+9+b+}+}+9+9+|+}+|+|+|+9+}+}+|+f+%+5 . + . @ @ # % . . . + @ $ + m.f+9+9+|+|+|+|+|+|+}+}+9+|+9+}+m.E.u+t+s+k+h+k+l+h+k+k+u+k+t+! + + $ @ + . R [+t+t+t+t+o+t+s+s+q+u+s+k+k+d+s+q+k+h+h+h+h+h+d+h+s+t+t+E.", -"B.l+t+k+d+d+k+k+l+l+k+s+s+c.{ $ $ + . . + ! E.t+o+d+[+[+[+~+~+d+r+s+o+t+t+t+t+k+n+k+k+h+h+k+k+k+h+t+X.p P +.Y ` Y +.+.+.` ` .+.P ` +.X +.X +.U +.+.+.U ` e ( & . - . . @ ; r M Y T Y Z U Y Z @.U U U +.+.n ;.=+a+<+:+:+:+:+:+:+:+:+:+4+P.$ $ @ . . . $ , _+0+(+(+:+3+k.+ . + . . + . 9 P.4+(+:+:+<+:+(+=+:+^+3+P.}.w.#+U.R.R.U.U.U.U.U.U.U.J . + . . . . + ; M.R.W.W.R.W.U.U.).@ . . . . . + 8 w.W.R.U.U.U.U.U.U.U.U.U.).q =.'.=.%.*.*.'.=.q *.%.: @ . . @ @ . @ < O *.&.'.%.,.>.m $ @ @ + . - # = j %.%.%.*.=.&.*.=.&.&.=.'.k 2 B w B y x A B B w w B w 3 & . . . . # @ . @ @ . . . . . . # % o x B w z y A B w B B B A w B z B E 3 s 0.8.d.9.f.9.9.9.9.9.9.2.u D 1 : : : : 1 s 5.f.f.d.9.d.0.# $ + + + + + - 1 i.0.d.9.9.d.9.9.i.0.8.j.N ^.v+E+z+w+v+w+z+z+w+w+D+F+w+D+z+y+x+x+x+m+w+w+D+y+y+m+t.. % & % @ @ % > +x+A+E+z+w+w+A+w+y+y+z+A+z+g+t.K.f+|+|+}+}+}+|+|+}+|+|+|+9+|+}+|+%+L - @ $ + @ - / a { + @ # # $ + m.9+9+|+|+9+|+|+}+}+}+}+|+|+9+7+m.E.u+k+k+k+k+k+d+k+k+k+k+s+X.! @ @ + $ @ - 4.[+s+k+[+~+~+[+e+e+t+k+k+h+k+k+s+l+d+k+k+k+d+h+l+k+s+s+t+B.", -"E.t+t+k+l+h+s+q+s+u+l+t+s+R @ + - - + . @ b *+t+[+E.c.R R R c.c.X.X.d+k+t+q+q+d+k+h+s+h+s+k+s+h+h+t+E.p ` +.X ` Z Y Y Y Y Y X +.Y Z Z Y Y Y Y Y Z X T @.n ( @ . . . - @ ' e M Y +.+.X Z U Y Y Z Y Y Y +.X n ;.=+a+a+:+:+:+:+:+:+:+(+:+4+O.9 + + + # @ + $ v.)+)+0+4+=+8 # . + + . + + _.=+3+:+(+:+3+(+(+<+<+:+4+=+[.w.#+U.U.U.U.W.U.U.U.U.U.J @ . . . . . + 8 M.#+U.U.U.U.U.#+J @ . . + + . . @ k.#+U.Z.Z.U.Z.U.U.U.W.W.).q =.'.=.%.*.%.=.=.=.*.#.= . - . . . . $ j >.=.=.=.=.'.*.k < . . + + . - % m >.&.*.=.=.=.*.=.=.=.=.'.k 2 I w y y B A A B A A B w ( * . . . . # % @ * * # @ @ . . . . @ h y B A w x x B B B B B w B B z E E 2 s 0.d.d.9.9.f.j.9.9.9.9.9.e.d.d.e.e.e.d.d.2.9.b.8.8.f.0.Q . $ . - - . + + N d.8.d.9.9.9.9.9.i.j.8.j...^.v+D+z+y+w+z+z+z+z+z+z+z+z+z+w+z+A+z+A+D+D+A+m+j+j+x.@ - . % % % @ % W m+B+B+y+y+z+D+D+E+y+y+z+E+G+g+t.K.f+9+b+}+}+}+}+}+9+9+b+b+b+|+}+8+L @ @ $ $ . . L $+n.) $ @ @ @ = + J.f+|+9+9+|+|+9+|+f+|+|+|+9+9+7+m.E.u+s+k+d+h+s+s+k+k+h+t+t+E.% @ % @ @ % $ 4.*+X.B.R R R 4.4.E.*+[+l+l+h+q+k+s+h+k+h+h+h+s+k+h+k+t+t+B.", -"E.t+t+s+d+h+r+q+s+d+k+o+s+b + + . . . @ @ b X.X.4.# @ % @ @ @ $ # R X.~+s+q+h+h+d+s+s+s+s+k+s+q+h+t+E.p U .Y ` X +.Y Z Y Y Y Y Y Y U Y Y Y Y U Y X +.@.e ' % . - . . % } n P +.+.+.X U U Y Y U Z Y Y +.X n ;.{+a+6+(+:+:+3+:+:+:+:+:+4+(+[.+ @ + . @ + # + J w.O.O.4 . . . . + + . { O.<+:+:+:+:+(+4+(+:+a+a+3+O.[.w.#+U.W.U.U.W.U.Z.U.U.U.}.@ + . . . . . @ M.U.U.U.U.U.U.U.8 + . . + + . . @ k.#+U.W.W.U.Z.U.U.U.Z.U.).q =.=.=.*.*.=.&.=.*.*.#.= @ + . . . . @ m >.*.=.=.*.=.'.q < @ . + + . . + | >.=.=.=.=.=.=.=.=.=.=.&.k h R w y y x B B B B B A A ( & . . # % % % f f @ @ @ @ . . . # & o A B A B y y B B B B B B B B z B E 2 s 0.9.9.9.9.9.9.9.9.9.9.9.j.9.9.j.j.9.9.d.e.9.8.d.f.i.5.1 # . . - - . + $ Q 0.9.d.9.j.9.j.d.0.9.8.j...^.v+E+z+z+z+z+z+z+z+z+z+z+z+z+w+z+z+z+z+A+z+m+t.a.] - + - . + . . - ~ I.y+y+y+G+w+w+G+A+E+y+B+z+E+F+g+D.K.f+9+b+}+}+9+9+}+|+9+9+b+|+|+2+n.- - $ $ @ . / C.2+J.) $ % @ . $ . m.7+|+|+}+9+9+|+9+9+|+|+9+9+9+7+n.E.u+r+s+d+h+s+s+k+l+h+r+n+R @ . @ @ $ % # :.b * % % $ $ @ + - 5 E.~+l+l+h+q+s+s+h+s+s+s+s+k+s+s+t+t+E.", -"B.u+t+k+l+k+h+s+s+h+k+s+[+b + + @ # # % & J :.a ) - + $ $ + + . - - / c.d+l+h+q+q+h+s+s+s+k+s+s+s+r+X.p ` +.Y ` @.X Y Y Y Y Y Z X +.Z Z Y Y Y Y Y Y ` M } * @ . . # & * i M U Y +.Y Y U Y Y Y U Z Y Y +.X n ;.=+a+<+(+:+:+3+3+3+:+:+3+(+0+{+_.@ . # @ . . . @ . . . . . . . . . + $ u.{+(+(+4+:+:+4+4+(+:+:+3+4+O.[.w.#+Z.U.U.U.Z.W.Z.U.U.U.}.. . . . . . . . w.#+U.W.U.W.#+M.{ . . . . . . . # }.#+U.U.Z.Z.U.U.U.U.W.U.}.q '.=.=.#.*.=.&.=.*.%.#.= @ # . . - . + j %.>.=.=.=.=.'.j = + . + + . @ @ | >.=.=.=.=.*.=.=.=.=.=.=.k 2 B w z y y B B B B B B B 3 % # @ @ % ; 3 A h { . . . . . . . @ h A y B A y B B B B x B B x B z B E h 1 0.b.d.9.9.9.9.9.9.9.9.9.j.9.9.9.9.j.j.9.b.e.f.f.5...1 = @ # . - - + = , 9.f.f.f.9.9.e.e.9.f.f.8.j...r.v+E+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+y+T.. + @ @ + @ + . - ) 5 +x+y+C+A+z+w+y+B+z+A+y+v+A+E+E+v+D.K.f+9+b+}+}+9+}+}+9+9+}+}+7+8+n.- . @ $ + . - m.}+2+n.) $ @ # . $ . m.f+9+|+}+9+|+}+9+9+|+}+|+9+9+}+m.E.u+t+s+k+h+s+r+k+l+l+u+l+b + . . . + + + . @ % $ $ = = + . - # % l S.l+l+s+t+k+k+h+s+s+s+k+h+s+t+l+E.", -"E.s+t+d+d+h+k+h+s+d+k+t+[+b @ + @ % @ % @ { % @ @ @ + + + . . . . % @ @ c.d+s+h+q+s+s+h+s+k+k+s+s+t+E.K Z .Y ` Z +.+.Y Y Y Y Y Y Y Z Z Y Y Y Y X @.n d ' % @ + + @ ; ( n M Y Y +.U Y Y Z Y Y U Z Y Y +.X n ;.{+a+<+:+:+(+4+3+(+(+:+3+4+{+{+{+[.+ @ # # # @ . . . . . . . . . + $ u..+0+3+:+:+:+:+3+:+:+:+:+3+3+O.[.w.#+U.U.U.U.U.U.U.U.U.#+w.@ . . . . . . . J M.Z.`.U.`.R.}.{ . . . . . . . . }.#+U.U.U.Z.U.U.U.#+#+W.).q *.&.=.#.>.*.&.=.*.*.#.= . . . . . . $ 0 #.=.&.=.*.=.'.q , + . + + . # # < >.=.=.=.=.=.=.=.=.=.=.&.k h w w A B B A A B A B A p z * % * 2 f I w A f @ @ . . . . . . # h y z B x x B B x A B B B B B z B E 2 t f.9.d.9.9.9.j.9.9.9.9.9.9.9.9.9.9.9.9.d.8.d.i.2.t 4 . . # @ - - . $ , s 0.f.f.0.f.9.9.9.d.0.f.8.e.N ^.m+E+z+z+w+z+z+z+z+w+z+z+z+z+w+z+z+z+z+y+x+j+$ @ * * % % + . @ W +j+x+z+D+C+z+y+y+B+E+E+y+y+z+z+F+g+t.K.7+9+|+}+}+f+}+|+|+|+}+7+&+J.L . % $ + - - 7.8+}+2+C.) + @ . . $ + m.f+b+9+}+}+|+9+9+9+|+}+|+|+f+}+m.E.u+t+k+d+h+s+t+k+k+u+u+l+* @ . . + + $ + - . . + . . . . . # % # % ; E.l+s+o+h+k+h+s+h+s+h+h+s+t+t+B.", -"E.t+t+k+d+k+k+h+s+d+k+s+~+b + + $ @ @ @ @ . @ % . # - - - - . . + = + # & E.l+d+t+k+h+k+h+s+k+k+h+t+E.p ` +.Y ` X Y Z Y Y Y Y Y Y Y Z Z Y Y Y Y Y ` e ' * % . . + $ ' n M ` +.Y Z U Y Z Y Y Y U Z Y Z +.X n ;.=+a+<+:+:+:+:+:+:+:+:+3+3+(+{+0+R.4 @ @ @ @ @ + . . . . . . @ . + J M..+(+:+:+:+=+(+:+:+:+:+<+<+3+O.[.w.#+U.U.W.U.U.U.U.Z.U.#+U.f . . . . . . + . J k.@+G.@+~.* @ + + . . + . . . J #+U.U.U.U.U.U.U.U.#+U.J q =.'.'.%.*.*.'.=.*.%.#.= + . . . - . @ m #.'.&.=.*.&.&.q < @ . + + . . + | *.=.=.=.=.=.=.=.=.=.=.&.k 2 w w A x B x B B A A A A 3 3 2 h I w A A B h { . # # . . . # * o A A A x y y B B w x B B B B z B K 2 s 2.8.b.9.9.9.9.9.9.9.9.9.9.9.d.9.f.9.9.d.d.0.5.t = . . - & . - - = = 1 |.0.f.9.9.d.d.d.9.9.0.0.b.d.N ^.m+E+w+w+v+w+z+z+w+w+w+w+w+w+v+v+z+w+z+v+x+I.$ % % ; & % % # - + W ++j+B+E+D+w+w+y+y+z+z+w+v+w+w+y+g+D.N.7+b+b+}+}+}+|+9+|+}+2+8+J.L - % $ $ - - L 2+2+}+2+C./ $ + . . $ . J.f+9+}+}+|+|+|+|+9+|+}+|+9+9+}+m.E.u+s+s+k+h+k+k+k+k+d+d+~+* @ . - + + $ $ . . - - - - - - . + @ $ @ % b ~+t+o+h+k+k+k+h+h+k+k+h+t+t+E.", -"B.l+t+k+l+h+s+k+s+d+k+k+~+b + + @ $ + @ @ # @ @ & b 6.R - - . = , $ + @ @ a [+d+h+h+s+s+s+k+s+h+h+q+X.p P +.Y ` Z X Z Y Y Y Y Y Y Y Y Y Y Y Y U Y P ( * % . . + + % e M U Y U +.U Z Y Z Z Y Y U Y Y Z +.X n ;.=+a+<+:+:+:+:+:+:+:+:+:+(+{+{+s.@ . . # . . . + . . + + + . @ # + + 4 w.{+:+4+(+:+(+3+4+:+:+:+:+3+O.[.w.#+U.W.R.U.U.U.U.U.U.U.Z.q.# . . . . . + + @ 8 J m < . @ @ + + . . + . . . J #+U.U.U.U.U.U.U.U.#+U.}.q '.'.*.#.>.*.&.=.*.%.q % . . . . . . $ j %.%.=.=.&.=.=.q , + . + + . . + < >.=.=.=.=.*.=.=.=.=.=.*.k f E w y y y x B B B B B B w I I I I x y y y 3 * . @ @ . . . . @ o B B x A A y B B B B B B B B z B E l s 0.8.e.9.9.9.j.9.9.9.9.f.9.9.9.9.j.9.9.9.i.5.s $ + ) - - # # + $ , 1 Q f.0.9.f.9.d.9.j.j.9.0.0.8.j...^.v+E+A+w+w+z+z+z+z+w+z+z+z+z+w+y+z+z+B+v+x+I.+ + + + @ & & % @ + . - g j+y+C+A+w+y+y+z+E+y+y+z+A+G+g+t.K.f+9+|+|+}+}+|+b+|+}+2+&+L - . $ $ + - 5 &+7+f+}+2+C.) + @ . . $ . m.7+9+9+|+9+|+}+|+9+|+|+|+9+9+}+m.E.u+t+k+k+h+q+s+k+d+h+q+X.; @ # + @ . . . - ! I 6.a / . @ $ $ $ = $ + # R s+t+k+k+h+k+s+s+k+k+h+s+h+B.", -"E.t+o+k+d+k+s+s+h+h+s+r+~+b + + - . + = $ @ @ R ~+s+s+s+X.R @ $ , % $ + # / y.l+k+h+s+h+s+k+h+h+s+t+E.p ` +.Y ` X +.Y Y Y Y Y Y Y Y U Y Y Z Z Y X c * * . - + + + * n ` Z +.+.+.U ` Y U Z Y Y Y Y Y U +.X n ;.=+a+:+:+:+:+:+3+3+:+:+3+4+=+F + + . # @ . . + $ { { ~ $ $ + - . - + . ] P.3+4+:+(+4+4+4+(+<+3+:+4+O.[.w.#+U.U.U.U.U.U.U.U.U.U.U.U.f @ . . . . . + + . % @ + + . + + . . . . . . . J #+U.U.U.U.U.U.U.U.U.U.(.q *.'.=.%.>.=.&.=.=.%.#.$ . . . . . # $ 0 #.'.=.*.=.=.=.q , . . + + . - + < >.=.&.=.=.=.=.'.=.=.=.=.m l E w y y B B A B A A w A x w A B B x B B p ( * @ @ @ . . . . @ h B x A I x B B B B B B x x A z B E o s 2.d.b.9.9.9.f.9.9.f.f.j.j.9.9.9.9.9.9.i...1 = + - . + @ % @ + = : |.0.b.f.0.f.9.j.j.j.9.9.i.i.b.e...^.v+E+z+z+z+z+z+z+z+A+z+z+z+z+A+z+z+z+z+y+x+H.> ~ / ) . . . @ @ + + - + W x+G+z+z+z+y+E+E+y+y+z+E+G+g+t.K.f+9+9+|+}+9+9+b+|+}+8+n.. + $ $ . - 5 N.2+f+5+9+2+C./ + + . . $ . J.f+b+9+|+|+}+|+9+9+|+|+9+9+9+}+m.E.u+t+s+d+s+s+t+s+d+q+s+*+b % % { & & # ) 4.[+s+s+s+*+R ; % . . $ = $ . a X.l+h+k+k+h+h+s+k+h+s+s+u+E.", -"E.t+t+s+s+s+q+q+s+k+k+t+[+b + + - - $ = $ @ R [+t+t+t+t+t+~+R % % % % . - 5 b n+k+s+s+s+s+h+h+s+s+t+E.p U .Y ` X Y Z Y Y Y Y Y Y U U Y Y X Y Y Z n @ % . + + . @ ; M ` +.+.+.+.Z U Y U Y Y Y U Z Y Z +.X n ;.{+6+6+3+(+(+3+3+:+:+:+3+:+u.+ + $ . . . + . ~ }.0+,+:+[.. . . . + . + . 9 P.(+:+:+:+4+3+:+:+3+4+4+=+[.w.#+Z.U.U.Z.W.U.U.U.U.U.Z.#+M.{ # . . . . . . . . . . + + { . . . . . . . . }.#+U.U.W.W.U.U.U.U.#+W.~.q =.'.'.*.*.%.&.=.=.%.k = . # . . . @ $ j *.'.&.=.=.=.=.q , + . + + . . @ < >.=.*.=.=.=.=.=.=.=.=.=.k f I w B y B B B B x B B A z x y x B y z p p l @ @ . . . . . # & o B y B w y B x B A B B x A A z B E 2 s 0.9.j.9.f.j.9.9.9.9.9.j.j.9.9.9.f.0.9.Q , = + . . - $ $ $ $ $ : N i.i.b.9.f.j.f.e.j.j.e.9.0.0.d.g...^.v+E+z+z+z+z+z+z+z+z+z+z+z+y+w+z+z+E+z+z+y+>+T.1+1+T.W . . . @ # . . + + T.y+z+E+z+z+E+A+y+y+z+E+G+g+D.K.7+9+b+}+}+9+9+|+|+2+n./ - . $ @ . / m.2+7+}+b+7+7+C./ + . - . + . z.7+|+}+}+}+}+9+9+9+|+|+9+9+9+}+m.E.u+r+s+d+s+s+k+t+d+q+r+q+n+`.`.E.E.R b X.n+s+t+o+o+t+~+R * - - + = $ - / c.s+s+h+h+q+q+s+h+h+s+t+t+E.", -"E.u+o+s+k+l+s+q+l+d+t+s+[+b @ + + @ # @ % * 6.t+t+l+h+q+h+l+E.@ @ $ . + $ $ & l+k+s+s+s+s+h+h+s+h+t+E.p P T @.` Z Y Z Y Y Y Y Y Y P P Z +.T +.P e ' % % @ - . # ' n X Y Y Y Y Y Y Y Z Y Z Y Y Y Y U Z +.+.e I =+a+:+:+:+:+3+:+:+:+:+4+O.4 + . . . # + $ ~ 1+{+{+:+3+4+w.. . + + . @ % # }.{+_+:+6+4+4+(+:+:+:+4+O.[.w.#+U.U.U.U.U.U.U.U.U.Z.Z.U.#+M.f . . . . . . . . . . . 8 }.{ . . + . + . . }.U.Z.Z.U.Z.U.U.U.U.#+W.~.q *.=.&.%.>.=.&.=.=.%.#.$ . @ # . . . $ m #.=.'.=.*.=.'.q < + . . . + . + | >.=.&.=.=.=.=.=.=.=.=.&.k 2 I I A y B B B B B B B B B B B B B B A A B l { . @ @ . . . . # o A B A w B p A B w B x B B B z x B 2 s 2.8.9.9.9.9.j.f.f.9.9.j.j.0.0.d.j.5.t $ + . . - - @ $ + = : u |.i.j.j.i.e.9.9.0.j.9.8.e.d.i.i.8.j...r.v+E+z+z+y+y+z+z+z+y+x+B+B+x+w+z+y+E+F+z+z+A+z+y+y+x+x+x.. . @ # . - @ @ 7 g+E+F+y+y+A+z+y+y+y+E+D+g+x.N.2+f+b+}+}+9+}+2+|+$+. $ . . @ ) ) 7.7.n.J.J.C.:.}.7.) + . + @ @ . J y.m.J.$+b+b+|+9+9+|+}+}+9+9+7+n.E.u+t+t+k+s+k+k+l+d+s+t+r+r+s+q+t+r+u+l+q+q+d+u+l+d+h+q+E.& @ . @ @ $ = @ c.s+h+h+h+h+s+s+k+h+s+s+t+E.", -"B.l+k+s+k+d+k+s+l+k+t+s+s+b @ + @ # . . # b E.s+k+k+k+s+k+l+X.! @ $ . + + # & X.e+k+k+k+h+k+k+h+h+t+E.p @.+.X ` X X Y Y U Y Y Y Y @.` ` +.T +.P i * @ @ . . - . } n Y Y Z U Z Z Y U Y Z Y Y Y Y Y Y U +.X n ;.=+a+:+(+:+:+:+(+:+:+:+(+O.@ . . . # % @ $ F {+1+=+=+<+:+1+8 + . . . @ @ + 4 O.(+:+<+<+:+(+:+<+<+4+V.[.w.#+Z.U.`.W.U.U.U.U.U.U.U.U.U.U.M.}.{ . . + . . + . @ }.Z.).@ . . + + . . { }.U.W.U.U.U.U.R.R.U.U.M.).q =.%.=.#.>.%.&.&.*.*.#.= @ # . - . . + | O =.!.,.#.,.%.q , + . . . . + $ | *.=.&.=.=.=.=.*.=.=.*.&.k 2 E w A y B B B B B B w A B B B B B B B B x 3 * . @ @ . . . @ * o B B B w B B B B B B B B B B A A E l s f.8.e.9.f.9.f.f.9.9.f.9.9.9.0.i.5.u $ $ + . - . - + . > 1 u i.0.9.9.9.0.d.9.j.0.0.f.d.e.d.0.f.8.j.N ^.m+E+z+w+v+w+C+C+y+w+C+w+C+w+D+D+A+v+y+w+D+D+z+y+w+w+F+x+g + $ + . . % @ ] >+D+z+v+w+A+w+w+v+w+A+z+m+h.N.f+|+|+;+}+|+}+2+|+$+- $ . - . $ @ + . % - @ - - - - - . . @ $ $ + - - - 5 C.b+|+}+|+|+}+|+|+}+}+7+m.E.s+s+k+d+k+k+k+d+d+k+s+k+k+k+k+s+k+d+k+h+s+k+d+k+l+k+s+E.b @ . . @ $ $ @ I n+k+k+k+k+h+h+k+k+s+t+s+E.", -"E.l+s+s+h+d+h+s+l+k+t+s+s+c.# + @ @ . . . b X.e+t+k+h+q+s+k+X.! @ + . . . # & X.o+h+h+s+s+k+k+h+h+t+E.y P +.X ` Z U Y U Y Y Z Y Y @.` U X .+.M } * @ @ @ . - & } M U Z Z Z Y Z Z Z Z Y Y Y Y Y U Y Z +.X n ;.=+a+^+(+:+(+3+:+:+:+:+{+w.. + . . # @ + $ M.0+4+<+<+:+:+.+[.. . . . . . + = O.4+<+<+:+3+:+:+<+:+_+{+[.w.#+Z.U.W.U.U.U.U.U.U.U.U.U.U.U.#+U.U.k.F f f f }.}.M.U.#+8 + . . . . . + $ }.W.R.U.U.U.U.U.U.U.W.W.}.q =.'.=.%.#.*.&.=.=.=.#.= @ # . - . . + < #.%.'.=.*.%.#.j * @ . . . @ @ % k =.=.*.=.=.=.=.=.=.=.=.&.k h R w A A B B B B x B B B B B B B B B B B B l ! @ . . . . . @ % f B B B w B B B B B B B B B B z B K f s 0.8.e.9.9.f.9.9.0.0.9.e.e.0.0.2.u : + # % @ . - + + = : Q 0.0.9.8.8.d.d.e.9.9.0.0.f.9.j.d.0.j.8.j...^.v+E+z+w+w+z+y+y+y+w+A+C+w+C+v+w+A+z+x+y+v+z+C+C+w+y+A+x+a.. # . - - @ $ . '+F+w+y+z+A+A+y+y+z+A+G+g+o.K.f+9+|+}+}+9+|+2+b+;+. $ . ) . $ $ $ $ & % $ @ - . . . . . . . @ @ . + + / C.f+|+9+9+|+|+|+|+9+9+2+m.E.u+t+k+d+h+q+s+d+h+k+o+e+u+s+k+k+o+k+l+k+t+q+q+k+k+s+n+*+b + . . # + $ # R s+l+d+h+h+h+h+d+d+s+s+t+B.", -"E.u+t+s+d+l+s+s+u+k+k+q+s+6.& @ . . . . + b X.t+r+s+s+r+t+s+X.! . + . . # @ { X.s+h+h+s+h+s+k+s+s+t+X.p P +.Y ` Z Y Z Y Y Y Y Y Z Y @.` +. .` e ' % @ $ @ . @ * e ` Y Y Y Y Y Y Y Y Z Y Y Y Y Y Y U @.+.X n ;.=+a+6+:+:+:+:+3+:+:+:+^+/.. + . . . . + $ v.0+0+=+:+3+:+0+u.$ + . . @ % @ . O.3+<+3+3+4+4+:+<+<+6+O.}.k.#+U.U.U.U.U.U.U.U.U.U.U.#+U.U.U.U.#+U.W..+ +Y.U.U.U.U.#+8 . . . . . . @ 8 w.`.U.Z.U.U.U.U.U.U.#+W.).q =.'.'.*.*.=.&.=.=.=.=.0 $ + . . . . @ < #.>.%.*.=.%.>.m @ @ . . - . @ = q &.=.*.=.=.=.=.=.=.=.*.&.m h I E I y x B B B B B x B B B B B B B B B B l + @ @ . . . . . { h B B A x B x B B B x B B x B y B E 2 s 0.9.e.9.9.9.9.9.9.9.f.j.j.i.5.s , = . @ % . + = , : u |.d.j.9.8.8.8.8.8.e.j.9.9.9.j.i.j.d.i.0.8.g...^.v+E+z+w+z+z+z+y+z+E+D+G+x+x+x+x+x+y+j+T.x+G+w+z+A+z+D+x+H.> + . . . @ @ . j+D+w+v+y+E+A+y+y+z+E+E+g+t.K.f+b+b+}+}+9+9+7+|+;+. $ . - . - + . - . . . . $ $ $ @ . . @ @ @ @ $ = $ - z.7+b+9+9+|+|+|+|+9+9+}+m.E.u+t+k+d+h+s+s+u+k+s+k+l+l+[+e+[+d+d+e+k+k+s+q+h+k+t+t+X.b + + . + $ $ # c.s+h+d+h+h+s+s+h+h+s+s+t+E.", -"E.l+s+o+k+l+d+h+q+d+l+h+q+X.a + . . + + + # E.t+t+k+e+t+s+n+X.! + . . . # @ { n+t+s+s+s+s+h+h+s+s+t+E.p P +.Y ` Z Z Y Y Y Y Y Y Z Y @.` X X P e & + + @ . - @ ' n Z Y Y Y Y Y Y Y Y Z Z Y Y Y Z Z Z +.+.X c ;.<+a+<+(+:+:+3+4+_+:+^+1+z.@ + + . . # @ - M.1+4+<+<+:+:+0+_.. + + . @ @ + . O.3+^+4+6+:+3+:+3+^+4+=+[.w.#+U.U.U.U.U.U.U.U.U.U.U.#+U.#+#+W.`. +U.U.W.W..+W.U.#+M.8 . . . . . . . J W.#+U.U.U.U.U.U.U.U.#+W.(.q =.'.'.*.>.=.&.*.&.&.%.j $ . . . . . @ = j #.%.*.*.#.#.< @ . . . - . @ < *.=.*.*.*.=.=.=.=.*.=.=.'.k h I I z y i B B B B B B B B B B B B B B B B 3 * @ @ @ . . . @ % h B B B w x B B B B B B B B B z B E 2 s 0.b.b.9.9.j.9.9.9.9.9.j.j.5.t = + # - - % @ + = : 2.e.e.9.f.e.e.8.j.0.d.f.f.0.f.9.9.f.0.9.i.i.8.j...^.v+E+z+z+z+z+z+z+z+z+y+m+T.x.u.W g 5 @ ~ x+y+A+D+A+z+D+x+H.~ + @ # . $ @ % m+D+w+v+G+A+z+y+y+z+E+G+g+t.N.9+9+b+}+}+7+|+}+9+$+. $ . - $ - . . . . . + + . $ % + @ @ . . @ @ + $ $ - m.f+|+9+9+9+|+|+9+9+9+7+m.E.u+r+s+k+h+s+s+h+h+s+l+X.X.E.y.y.b l b X.e+k+t+s+k+o+t+E.! @ @ @ . + $ # c.t+h+h+h+h+s+h+h+s+s+t+t+B.", -"E.u+s+s+k+l+s+q+k+h+s+u+t+[+b + + . + + + @ c.s+s+k+l+s+r+s+E.+ $ . . . . @ ; n+s+q+s+s+s+k+s+s+h+t+E.p P +.Y ` Z U Y Y U Y Y Y Y U U U Y Z ` d @ + + @ # @ @ ' M +.Y Z Z Y Z Z Y Z Y Y Y Y Y Y U Z @.+.X n ;.=+a+<+(+:+3+3+3+:+:+:+0+G.+ + . . # @ + + _.0+0+4+<+3+4+0+8 # . . . . @ # = L.4+<+<+6+3+:+:+:+6+4+O.[.w.#+Z.W.U.U.W.U.U.U.U.#+Z.#+w.}.}.}.I f { @ M.W.U.U.U.#+w.{ . + . . . . @ }.#+U.U.U.#+U.U.U.U.W.#+U.}.q =.%.'.#.*.*.&.*.&.&.%.q = + - . . . + @ m #.>.*.=.>.O , @ @ . . . . $ | #.=.*.*.=.&.*.*.=.=.=.=.'.k 2 E I y y B B x B B B B B B B B B B B B B B l ! @ . . . . . . { h B E w B x B B B x B B B x w z B E 2 s 0.d.9.9.9.f.f.f.9.9.f.9.j.s = $ . . . - - # + : ,.i.i.j.i.|.i.i.5.|.v.i.0.f.0.0.9.9.j.j.9.f.e.8.j...^.m+E+z+w+v+y+z+z+y+w+v+x.$ + + + + + $ ~ H.x+F+F+y+z+E+x+g . @ % # . . + ^ m+D+w+z+z+A+A+y+y+A+A+G+g+t.N.2+9+b+}+7+9+9+}+9+$+@ $ . - . & & @ @ $ $ + $ + . + - . . @ # @ @ . + . - m.f+|+}+}+9+|+}+}+9+9+2+m.*+u+t+s+d+h+q+q+q+k+o+X.& % # ) . @ & @ 4.*+t+s+k+k+s+n+E.# $ . . @ + + ! *+t+s+k+h+s+s+h+h+h+s+s+t+E.", -"E.l+s+s+d+d+l+s+s+h+h+s+k+s+E.{ + . + $ $ @ b X.[+k+k+k+e+[+4.+ $ + . - + % c.n+t+k+k+k+k+s+k+s+s+t+E.p ` +.Y ` X +.Y U Y Y U U Y U U Y Z Y M ( @ - + . # @ % } M T Z Z U Z Y Z Z Z Z Y Z Y Y Y Y Y U U Y n ;.=+a+<+(+:+:+(+:+:+:+:+(+O.@ + . . # @ + + = v.4+:+:+:+(+u.. . . . . . @ + 4 O.:+:+:+(+(+=+(+:+:+3+O.}.w.#+U.R.R.U.U.U.W.R. +R.w.k . . . . @ . . . k.R.Q.`.#+Z.8 . . . . . @ @ 8 w.U.U.U.W.U.U.U.R.R.U.U.M.J q =.=.=.%.*.*.&.*.=.&.,.#.$ . - . . . @ @ < q O >.#.q | $ # . + . . @ = | =.%.*.=.=.*.=.=.*.*.*.*.=.k 2 E w A x B B B B B x A A B B B B A A B B x l + @ @ . . . . . { o B B B w B y B B B B B B B B I p B 2 s 0.9.9.9.9.f.f.f.9.9.9.i.Q : + - . @ @ . . . + + $ = , , = , , = = = = , 1 0.0.0.j.9.9.9.d.0.0.8.j...^.m+A+y+y+w+z+y+G+C+v+y+-+) $ * % $ @ ; + ^ x+y+w+w+w+x+T.> $ * @ . + - + a.m+D+D+w+z+w+w+w+v+w+w+z+g+o.N.2+9+9+|+}+}+|+}+5+%+@ $ @ - . - + - + - - - @ - ) ) . - # @ @ @ + . # - 5 C.9+b+}+}+}+|+|+|+|+9+;+m.E.s+t+k+d+k+q+h+k+t+o+~+{ * @ $ $ $ $ @ ! E.n+e+l+l+s+*+b $ $ + @ @ + . a ~+k+k+k+d+h+h+h+k+k+s+s+t+B.", -"E.l+k+s+d+l+h+k+q+d+l+t+t+e+X.b . . + $ = $ * b *+s+l+s+[+c.% @ $ # - . - * F.l+e+h+h+s+h+k+k+s+s+t+E.p ` +.Y ` Z Y Z Y Y Z Y Y Z X +.U U Z M ' # . + . # @ % z Y T Y Y Y Y Y Y Y Y Y Z Y Y Y U Y Y Z +.+.e I =+a+6+:+:+:+:+:+:+:+:+4+O.4 + . . . . + + + ) v.<+:+3+s.$ + + . $ + . @ . }.{+(+<+<+:+(+:+:+:+<+4+O.[.w.#+U.U.W.U.U.U.Z.U.U.U.#+:.+ . . . . . @ # @ w.U.R.M.8 + . . . . @ $ $ 3.@+W.R.R.U.U.U.U.W.U.U.W.W.}.q =.'.=.#.*.=.&.*.=.&.,.,.0 @ - . . . $ @ $ | k q q k , $ % @ . . + . = j '.&.*.=.=.=.=.*.&.=.=.=.=.m f I w y y B B B B B B B B B B B B B B B x B l ! @ . . . . . @ % h B B A x B x B B B B B x B B y B K f s 0.8.e.9.0.j.9.9.f.f.9.2.u , . . . @ $ $ + . . - - ) . . - @ + . - - - . , |.i.0.j.8.e.e.d.0.0.b.b...^.v+E+y+y+w+z+z+y+y+z+z+j+W @ * % . @ ; @ + H x+z+z+w+>+g + $ % % @ + - # O.j+D+E+y+z+A+z+v+x+z+A+z+g+t.K.f+9+|+}+}+}+|+9+5+}+7.}.7.7.}.7.7.7.7.7.7.n.n.].7.5 - - . @ $ $ % 5 m.7.m.%+b+b+|+|+9+|+}+|+9+9+}+m.E.u+s+k+d+h+h+q+s+o+e+l+E.& @ + $ = , $ $ ! X.h+d+q+X.3.- % $ + . . + $ :.t+t+h+k+k+h+d+h+s+k+s+s+t+B.", -"E.u+t+t+s+h+k+q+h+u+q+s+s+s+k+X.a + + $ $ + @ - - & f 8 ) . - . + , $ . # R l+h+h+s+s+s+s+h+h+s+s+t+X.p U .Y ` X Y Y Z +.+.Z X +.+.+. . .` e & - . & @ . @ ' M Y +.Y Y Y Y Y Z Y Y Y Y Y Z Z Y Y Y Z +.X n ;.{+6+3+4+:+:+3+:+:+:+:+4+)+w.+ + + . . . . . . { { f { . & # @ @ @ . . @ _ P.3+:+3+:+4+4+<+<+^+4+3+O.[.w.#+Z.U.U.U.U.U.U.U.`..+W.U.f . . . + . . . . . f f @ . . . . . . . . 8 M.#+W.U.U.U.U.U.U.U.U.#+U.U.).q &.'.=.%.>.*.&.*.=.&.&.%.#., ; @ . . . . + @ . + @ + + . . + + @ % % j '.&.&.=.=.=.=.=.=.=.=.=.=.&.k 3 E w A y B B B A B B B B B B B B B B B B x 2 + . @ @ . . . @ ; h B w w B x p B B B B B x B B z B E o t 2.e.b.9.f.j.9.9.j.f.d.s ! @ @ + @ $ + . . . . . . . . . . . . . . . . . + 5.i.9.5.j.8.j.j.0.0.d.g...r.v+E+z+z+z+z+z+z+z+z+z+y+-+^ + + % ; $ . . . { J J { - - . - # # . . + ^.v+F+z+z+z+z+E+y+y+z+E+D+G+g+t.K.f+9+b+|+}+9+9+9+|+9+}+}+}+}+}+}+}+}+}+|+}+}+}+|+2+J.) + $ = $ % @ m.f+b+9+|+}+}+9+9+9+9+9+9+9+9+7+m.E.u+r+k+k+h+d+l+s+k+k+u+k+b + + + + + + + . # 8 8 { # . + + + = = $ & l ~+q+r+k+k+h+s+h+h+h+s+s+t+t+E.", -"B.u+t+s+d+l+k+s+h+k+k+s+s+s+d+t+c.+ . + $ $ + + . # + . - + . - . = + # b [+l+d+k+s+s+s+s+h+s+s+h+t+E.p ` +.Y ` Z Y Y U Z Y Y Y Z +. .T +.M ( * . . @ - + @ ' n Y X Y Y Y Y Y Y Y Y Z Y Y Y Y Y Y Z +.+.X n ;.=+a+3+3+:+(+4+3+3+:+4+0+0+)+F + + . . + . . . . + @ # . # . # # . . . . C :+3+:+:+:+3+3+(+(+6+<+4+O.[.w.#+U.U.U.W.W.U.U.U.W.W.U.U.w.@ . . + . . + + . . # . . . . . + - + 8 w.Z.#+U.U.Z.Z.U.U.U.U.U.U.#+U.}.q '.=.'.%.>.=.&.*.&.&.*.=.#.k < @ + + . . . . . . . . . . @ $ $ % % < q '.&.&.=.=.=.=.=.=.=.=.=.=.&.k h I w y y y B B B B B B B B B B A A B B B B l { . . . . . . @ ' o A w A B B B w x B B B B B w z B E 2 s 0.e.9.9.9.9.j.j.f.f.e.N + . $ $ + + + + @ $ $ . . . + $ . $ $ . . . . $ $ v.i.j.j.j.8.e.9.f.0.8.e...^.v+E+z+z+w+z+z+z+z+z+E+y+j+s.+ + @ & . - . . # # - - @ @ @ . - . - # ] '+B+E+A+w+z+z+z+z+y+z+E+A+G+g+t.K.f+9+9+|+}+7+9+9+|+9+9+9+9+9+9+9+9+9+9+9+|+9+f+5+f+C./ @ % @ . $ . 3.2+|+b+9+}+}+9+9+9+|+|+9+9+9+}+n.E.u+r+t+k+s+s+s+s+d+k+l+q+X.{ . . + + . + + . - - - - @ . - . $ @ % b X.l+s+r+h+h+h+s+s+h+h+s+s+s+u+E.", -"E.t+t+t+l+k+q+s+s+h+h+k+k+h+d+q+[+I % & @ + + $ $ + + + + + $ . . + . b X.[+d+h+s+s+h+s+s+h+h+q+h+t+B.p P +.Y ` X Y Y Y Y Y Y Y Z Y U X Y M ( @ . - . - - @ ' n M ` Y Y Y Y Y Y Y Z Y Z Y Y Y U Y Y Z +.X n ;.=+a+:+_+:+:+3+:+(+(+:+3+0+0+V.9 + . + ) % . . . + @ . . . . . . . - + F (+3+3+:+:+:+:+3+:+:+3+6+a+{+}.w.#+U.W.R.U.U.U.U.W.W.W.U.Z.#+}.. . . . . + . . . . . . . + + . @ % k.W.#+U.U.U.U.U.U.U.U.U.U.U.W.W.(.q =.=.=.%.>.=.&.=.%.=.'.>.#.O k % $ + + + . . . . . . @ # . + + - < k #.>.&.&.=.=.=.=.=.=.*.&.*.=.'.k 2 R I A y B B B B B B B B B B B B B B B B B l { . . . . . . @ ' h w A x B B B A B x B B B B A z B E 2 s 0.d.e.9.9.9.j.j.9.0.8.u # . + + @ @ . + . + + . . . . + . + @ . $ . . # = 5.i.9.9.e.e.j.9.f.9.8.j...^.m+E+z+A+z+y+z+z+z+z+E+z+x+j+a._ # + . + . . . + . . & & * % # - # ] -+x+y+z+z+y+y+y+y+y+y+z+D+D+G+g+t.K.f+9+b+}+}+9+9+|+|+9+9+9+9+|+|+9+9+9+}+9+9+9+9+b+|+C.5 % % @ # $ . m.7+}+9+}+}+}+9+9+b+|+}+}+9+9+7+n.E.u+t+s+d+q+s+s+t+k+k+k+h+q+E.; % @ # $ = , + . . . . . . - # % + a y.n+k+s+s+s+k+h+s+s+s+h+h+s+t+u+E.", -"E.k+t+e+d+k+s+s+k+k+h+h+d+k+l+d+k+e+E.! + @ @ . + + @ @ @ @ + . # % b E.n+l+k+s+s+k+k+h+k+k+k+s+k+t+E.p P .X ` Z Y Y Y Y Y Y Y Y U U Z ` n } & . . @ . . % } M @.` Y Y Y Y Y Y Y Y Y Y U Y Y Y U Y U +.X n ;.{+6+:+(+:+:+:+:+:+:+:+(+{+{+4+V.F + + + # . . . . # . . + . + . + = }.{+:+:+:+:+:+:+:+^+(+:+<+6+p+V.}.w.#+U.U.Z.U.U.Z.U.W.R.U.Q.W.U.w.w.@ . . . . . . . . . . . . . @ 8 w.U.U.U.U.U.U.Z.U.U.W.U.U.U.U.#+U.).q =.'.=.#.*.,.&.&.%.%.=.*.>.#.#.j , = $ $ @ @ % % @ @ # @ % @ . < q #.#.#.=.=.*.*.=.=.=.=.*.*.*.&.%.k h A w y y B B B B B B B A B B B B B B B B B l @ @ @ @ @ @ @ @ ' l I w x B B B B B B B x B B B z x B 2 s 2.8.e.9.9.9.9.0.f.0.2.: - - - - - - - . # . . - . . . . - . # . # . . . = 2.j.9.0.j.j.d.d.f.9.8.j.N ^.m+E+z+w+w+z+z+z+w+w+D+z+y+x+m+x.] . $ % @ & @ % $ & * & % + @ . a. +j+v+z+D+E+w+y+v+w+y+y+z+A+A+y+'+D.N.2+|+|+}+}+}+|+9+|+|+|+|+9+|+|+9+9+9+|+|+|+9+9+}+2+n./ # @ = $ @ . J.f+}+|+|+|+|+}+|+}+}+|+}+|+}+2+m.E.u+s+k+d+d+s+k+s+k+h+d+d+s+l+E.R & @ . + = $ $ $ $ + + $ $ $ & a *+e+t+l+h+k+k+k+k+k+h+k+k+k+h+s+t+B.", -"B.u+t+k+d+k+k+s+h+k+k+k+h+l+k+d+s+r+s+X.c.b # . . @ @ % % + # b f E.~+d+e+o+k+k+h+h+h+h+s+k+k+h+s+q+E.p U .Y ` Z U Y Y Y U U Y Y U U Y ` n } ' * * * * * ; p M U Z Y Y Y Y Y Y Y Y Y Y U Z Z Y U Y U +.+.e I =+a+6+:+:+:+:+(+:+:+:+:+4+4+(+0+{+P.F @ . @ . . . . . . $ $ + 7 F O.{+(+(+:+:+:+:+:+:+(+(+:+:+<+3+O.[.w.#+U.U.U.U.U.Z.U.Z.W.U..+R.W.W.W.w.J @ . . . . . . . . . @ 8 }.M.U.U.U.U.U.W.W.W.W.R.U.U.U.U.U.W.W.}.q *.'.=.%.*.*.&.%.&.,.%.*.=.%.%.#.O j , $ @ % % @ @ $ $ @ = , < k #.>.%.%.&.&.*.*.=.=.=.=.=.*.*.=.&.k f B w z y B B B B B A B B B B B B B B B B B l @ & % @ @ @ % % ; l I I B B A B B B w B B B B x A B K 2 t 2.8.e.9.9.9.9.0.f.d.f.: . + . + + + . + + + + + + + + + + + + + + + + + : 0.e.j.0.j.9.d.9.0.0.8.j.N a.v+E+z+z+w+z+z+z+z+A+D+A+y+y+x+x+j+I.7 @ @ $ . @ + @ @ + + + g -+j+j+v+w+A+A+y+v+y+y+A+z+w+w+z+A+G+g+o.K.7+|+|+}+}+}+9+|+|+|+|+9+9+|+|+9+9+|+|+|+}+9+|+}+f+n./ . . . - + . C.}+}+f+}+|+9+|+9+9+|+|+|+9+9+;+m.E.u+t+k+d+h+k+k+s+e+d+h+k+d+k+k+[+E.R @ + + + @ % % % @ @ % b E.[+e+t+t+t+h+k+h+k+h+h+h+s+k+h+s+t+t+E.", -"E.t+t+k+d+k+t+s+s+k+k+l+q+h+k+k+s+r+q+k+[+~+X.E.E.c.4.c.c.c.E.X.[+d+l+s+k+s+s+k+h+h+h+s+s+k+k+s+h+t+E.p ` +.Y ` X +.X Y Y Y Y Z Z Y U Y Y P n e n n e n n n U X U +.Y Y Y Z Y Y Y Y Y Y Y Y Y U Z Y Z +.X n I =+a+6+:+:+(+3+:+:+:+(+:+6+3+=+(+4+0+{+V.P.l.[.[.[.[.[.[.J.v.O.)+(+4+(+(+3+3+3+:+:+:+(+3+<+:+3+3+4+O.[.w.#+U.U.U.U.U.U.U.U.U.U.W.Z. +W.#+W.U.M.w.w.J J J z J ).w.M.M.U.#+U.R.R.W.W.U.W.Q.R.W.U.U.U.U.W.#+W.).q =.'.'.#.=.=.&.&.&.&.%.*.&.%.'.>.%.>.#.O k k < < | | m j O O O #.%.%.=.*.=.=.=.*.=.=.=.=.=.=.=.=.&.k 2 R w A y B B B B B B B A B B B B B B B A A A w l l l l l l l l w A A w B p B x B A B B B B B z B E h u 2.d.b.9.9.9.9.9.9.d.f.2.5.5.5.5.5.5.5.2.5.5.5.2.5.5.5.5.5.5.5.5.5.5.5.5.!.j.b.d.0.j.j.9.d.i.i.b.j.N ^.v+E+z+z+w+z+z+z+z+w+w+z+G+z+v+y+y+x+j+j+x.x.H.x.x.x.r.x.-+j+m+y+y+y+y+w+A+z+y+y+w+z+z+z+y+z+E+E+G+g+t.K.f+|+|+}+}+9+}+}+|+|+|+9+9+|+|+}+9+}+|+|+|+9+}+b+f+2+$+&+$+&+&+&+$+;+}+}+7+}+|+|+|+9+}+}+}+}+9+9+7+n.*+u+s+k+d+s+t+s+s+k+k+s+s+k+k+q+q+d+~+~+E.c.4.4.4.4.4.E.X.X.~+n+l+k+k+s+s+k+h+h+k+h+h+s+h+k+k+s+s+s+E.", -"B.l+t+s+l+s+s+s+h+k+k+q+h+h+h+k+q+s+s+h+k+l+d+k+d+~+n+d+d+d+k+k+s+t+t+s+s+s+q+u+d+h+h+s+s+s+s+s+h+t+X.y P +.Y ` Z Y Y Z Y Y Z X +.@.` X +.Z @.` ` @.X ` P ` U +.U +.Y Y @.Y Y Y Y Y Z Y Y Y Z Y Z Y Z +.X c A {+a+:+(+:+:+3+:+:+:+3+3+<+<+<+(+{+4+0+4+4+(+:+=+=+_+(+(+<+(+4+0+4+4+:+:+3+3+4+:+:+(+(+3+:+:+3+3+p+=+}.k.#+U.U.U.U.U.W.W.U.U.U.Z.U.Y.U.W.R.U.U.U.#+W.U.R.M.M.Z.Z.U.U.U.U.#+Z.Z.W.W.W.W.W..+W.U.U.U.U.Z.Z.U.}.q =.'.'.*.>.'.&.&.'.=.*.>.*.=.&.*.*.=.*.*.*.*.*.*.>.%.%.#.>.%.*.&.&.&.&.&.=.*.=.=.=.=.=.=.=.=.=.=.&.m 2 E I A y B B B B B B A B B B B B B B B B A B B B x A A A x A I I A A x B y B B B B x x B B B z B E 2 s f.9.e.9.9.9.j.9.9.0.0.j.j.9.d.b.j.e.e.d.j.j.d.b.9.b.j.j.9.b.j.e.j.j.j.b.N e.8.8.f.0.9.f.d.0.9.8.j...^.m+E+z+z+z+z+F+z+z+z+B+B+z+z+A+y+F+z+y+y+v+z+v+v+v+v+x+v+y+y+F+F+A+z+v+z+A+E+y+y+v+z+C+y+y+z+E+D+G+g+t.K.f+b+9+}+9+9+|+f+|+9+9+9+9+|+9+f+9+f+|+9+9+9+9+|+b+9+f+7+f+9+b+2+2+f+|+|+f+7+9+b+f+9+9+9+|+9+9+9+7+m.E.u+t+r+k+d+s+s+h+s+h+h+s+l+s+s+h+s+k+s+k+d+d+k+e+[+e+k+k+n+k+s+s+l+l+k+l+q+h+s+s+h+h+s+s+h+s+s+q+h+E.", -"E.u+t+t+l+k+r+q+h+k+l+q+h+s+h+h+h+l+l+l+l+s+q+r+r+s+s+s+q+r+s+s+t+t+t+s+s+s+q+u+l+s+s+h+s+h+h+s+s+t+E.p U .X ` Z Y Y Y Z Y Y Y Y Y Z +. .+.+. . .T T +.@.Z +.+.+.Y Y Y +.Z Y Y Y Y @.Y Y Y Y Y U Z Z Y Y n ;.O.a+6+3+^+3+3+(+:+:+(+6+a+<+<+<+(+4+4+4+:+3+3+3+a+:+<+<+4+4+(+3+^+<+<+:+4+(+3+^+:+3+^+3+3+:+6+6+4+{+}.w.#+U.U.U.U.U.W.W.U.W.U.U.U.W.U.W.W.U.U.U.U.W.U.W.`.U.U.U.U.U.U.U.U.U.U.U.U.W.W.U.`.`.W.U.Z.R.Z.#+W.~.q =.&.=.#.*.'.&.&.'.*.>.*.=.&.&.'.=.=.=.&.&.&.=.&.&.'.'.&.&.'.'.&.{.!.&.=.=.=.*.=.=.=.=.=.=.=.=.=.'.q h A w B y B B B A B A B B B B B B B B B B B B x y y y y y y A I I w w A B B B B B B A B B x A z B E l s 0.d.b.9.9.9.9.9.f.f.i.j.d.d.d.b.9.d.8.d.9.e.8.f.9.d.9.9.d.d.d.d.9.9.9.d.2.e.8.d.f.f.9.f.9.f.f.8.b...r.v+E+z+z+z+z+z+z+z+G+B+B+z+z+z+E+D+C+z+z+z+E+z+z+z+F+E+C+D+A+z+C+C+z+y+y+E+E+y+y+z+D+D+z+y+z+E+D+G+g+t.K.f+9+9+|+}+9+}+9+|+9+9+9+9+|+9+9+9+9+|+9+9+9+9+9+9+9+9+|+b+5+5+|+9+b+5+9+7+7+9+b+9+9+9+|+|+9+9+9+}+m.E.u+r+s+k+h+s+t+t+k+k+t+s+t+k+s+s+q+s+s+r+q+q+s+s+s+s+t+r+s+t+t+q+s+l+l+u+h+q+s+h+s+s+s+s+k+s+s+t+t+B.", -"E.u+e+s+k+d+s+k+h+d+l+h+h+k+d+k+h+l+l+h+l+l+h+h+h+l+h+h+h+h+d+k+k+k+k+d+k+h+d+l+d+k+h+k+k+d+k+k+h+o+E.d M @.@.U @.Z U +.X +.+.+.+.U U +.+.Y Y +. .+. .Y U Y +.Y +.U +.Y .U Y +.Y U +.Y U U Z U U +.P ` Y n I =+a+:+(+<+1+1+1+<+<+<+:+<+<+:+<+<+1+<+:+:+1+4+:+<+(+{+1+1+(+1+1+1+:+=+<+1+1+1+1+:+<+:+<+:+{+(+<+6+P._.w.#+U.U.R.R.W.R.W.R.W.R.W.R.U.U.W.R.W.R.Q.W.`.W.R.R.Z.U.R.R.Q.#+R.W.W.W.W.W.#+.+R.R.W.W.Q.`.@+U.W.U.).q =.%.>.*.*.*.=.=.=.*.*.=.=.=.=.#.*.=.*.>.*.=.*.*.=.=.=.=.=.=.=.*.%.'.=.*.=.=.*.*.*.=.=.=.=.*.=.*.>.k h R E A y z B y B B B B B B B B B y x B B B B x y B x x B x B A A B x A B B y B B B y B B B B y B B 2 s 2.0.9.0.f.0.0.f.0.0.0.j.f.f.9.0.i.i.f.9.f.0.0.f.0.0.9.i.0.0.0.9.0.9.0.0.f.0.0.0.f.0.0.0.i.i.9.i.i.N S g+E+z+w+w+w+A+z+w+w+z+z+w+C+w+w+A+w+C+w+w+w+z+A+w+w+A+A+w+w+D+w+C+w+w+v+A+A+w+v+w+A+E+z+y+w+E+D+D+g+o.K.f+|+|+}+}+}+|+}+}+|+}+}+2+|+}+}+}+}+}+9+|+|+}+}+|+}+9+|+}+|+|+9+9+}+|+9+}+}+}+}+}+7+7+|+}+|+}+}+%+7.E.u+t+q+t+t+k+k+k+k+d+k+h+s+h+h+h+h+s+l+k+s+h+h+k+l+l+k+k+l+d+h+h+k+k+k+h+h+k+h+k+k+k+h+h+d+h+s+e+s+E.", -"E.l+k+k+l+k+k+d+h+d+d+k+k+k+d+l+k+k+k+l+d+d+l+k+l+d+l+k+k+k+k+d+k+l+k+d+d+l+k+h+k+d+d+k+k+k+d+d+d+t+B.e P @.@.U @.Z ` ` ` ` ` ` ` ` ` ` @.@.` ` ` ` ` ` ` U ` ` @.` @.` @.` ` @.` ` @.` ` Z ` ` ` @.` Y +.c I =+a+^+{+:+:+(+(+(+{+:+(+:+:+:+_+(+<+:+_+{+4+(+(+{+4+(+4+(+(+:+:+:+(+:+:+:+(+(+(+(+:+(+:+(+{+{+<+6+=+(.1.#+U.U.Z.W.W.U.Z.R.U.R.U.Z.`.U.U.Z.U.Q.R.W.++Y..+W.U.U.Z.Q.@+++Q.Q.Q.Q.W.R.W.++O.Q.W.Z.Q.Z.`.`.++Z.(.q =.%.=.*.=.&.=.=.=.*.=.=.=.*.=.*.*.*.%.>.*.*.*.*.=.=.=.=.=.=.=.=.*.=.*.*.*.=.=.*.=.=.=.=.=.=.=.=.=.k 3 I o x A y y y y y y y x B x y x y y y y y y y y y y y y y y x y y x y y y y y y y y y y y B B p y f s i.0.9.0.f.f.9.i.i.f.f.9.9.0.0.j.j.0.f.f.f.0.0.9.0.f.9.0.j.f.i.j.0.f.f.f.9.0.j.j.f.0.j.j.i.0.d.j.j.N S g+F+y+y+y+y+y+y+y+y+y+y+B+B+y+y+y+y+y+y+y+y+y+y+y+y+y+y+v+y+y+y+B+B+y+y+y+y+y+v+y+y+y+y+v+y+y+v+G+g+o.K.f+|+}+}+2+7+}+9+|+7+7+|+7+}+}+}+7+2+|+9+9+9+7+}+7+7+2+}+|+}+7+}+7+f+7+f+9+|+}+7+7+}+7+}+|+}+}+7+%+7.E.u+q+d+k+q+d+h+k+k+d+k+l+h+k+k+k+d+d+d+d+h+s+l+k+k+k+l+l+k+d+d+k+k+k+d+d+d+k+l+d+k+k+d+l+d+d+s+k+l+E.", -"X.t+t+k+t+e+t+t+s+k+k+k+s+s+k+k+k+s+s+k+k+k+k+s+k+k+k+s+t+k+k+k+s+s+k+k+k+s+k+k+k+k+t+k+s+k+k+h+h+r+X.i ` +.+.+.Y @.Z @.Z @.@.@.` @.@.` @.@.@.@.@.@.@.Z @.` ` ` ` ` ` ` ` Z @.` ` ` ` @.Z ` @.@.` ` +.T T P ;.=+a+:+_+_+_+4+(+(+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+(+_+4+_+(+4+(+4+_+_+_+_+_+_+_+^+_+4+4+_+^+:+<+6+O.1.1.#+U.U.Z.U.W.W.Z.U.U.U.W.U.W.U.U.U.Z.W.Z.W.V.#+W.U.U.U.W.W.`.`.W.W.W.W.W.W.W.`.Y.W.U.Z.W.W.W.W.V.W.(.q &.=.&.=.'.&.&.*.&.=.=.&.&.&.&.&.&.&.'.&.&.&.&.&.=.=.'.'.'.=.=.&.&.=.%.&.=.&.&.=.&.=.=.=.=.&.&.&.=.q 2 z w x A B y r x x y r w A y x x y y r r y x x A A x y x x x y y x y y x x x y x r x r r x B p e y 2 u 0.d.8.d.9.9.j.j.j.e.e.e.j.j.9.e.e.9.e.9.e.e.9.e.f.e.e.9.j.j.j.j.0.9.e.9.9.j.9.j.9.9.e.j.d.8.8.b.d.Q ^.i+G+B+z+z+z+y+y+y+y+y+y+y+y+v+y+y+y+y+y+y+y+y+y+B+y+y+y+y+y+y+y+y+y+y+y+y+y+y+v+y+y+y+y+v+y+y+y+B+g+t.K.f+f+9+7+7+}+}+f+9+9+9+|+9+b+9+|+b+}+|+9+9+9+b+9+|+f+}+}+9+|+b+9+9+}+}+9+9+}+|+|+|+9+|+|+9+9+|+9+}+n.y.u+h+d+d+q+k+t+s+k+k+k+s+k+k+s+k+t+k+k+k+k+k+l+k+k+k+l+k+k+k+k+k+s+k+k+k+s+k+k+k+s+k+h+s+l+k+l+l+l+E.", -"E.q+t+t+o+e+t+t+r+s+k+t+t+r+t+k+t+t+t+t+t+t+t+r+s+k+t+t+t+s+k+s+r+r+t+t+s+r+t+t+k+r+t+t+r+t+k+t+r+q+X.d @.X T +.Y X +.+.+.+.+.+.+. .+.+.+.+.+.+.+.+.+.+.+.X +.+.+.+.+.+.+.+. .+.+.+.+.+.+.X .+.X .T T V P ;.=+a+<+:+^+3+3+3+3+^+_+<+3+_+:+:+4+4+3+6+:+^+6+^+^+<+^+<+_+<+4+6+_+6+^+_+^+3+_+^+<+3+4+6+:+:+<+a+6+O.}.w.#+W.U.U.U.U.W.`.`.U.U.W.U.`.U.U.U.`.`.W.`.W.W.`.U.W.U.W.U.Z.U.U.U.W.U.U.W.W.U.`.U.W.U.U.`.U.W.W.W.J q '.,.%.%.'.%.&.'.'.%.,.=.'.%.=.&.&.&.&.&.&.&.&.'.=.&.'.'.'.%.%.'.&.'.=.%.'.&.=.%.'.=.,.%.=.=.=.'.&.q 2 w I w w E w A A A A A E w A A A A A A A A A A w A B A w A B A A x A A A A x A A w A w A w w B p B f u f.8.8.d.d.d.d.8.d.d.d.9.e.b.d.d.e.b.b.9.d.e.b.e.d.e.8.9.b.b.d.8.b.b.d.e.b.b.9.b.b.9.b.e.8.8.8.8.8.Q a.i+A+C+C+A+A+C+C+C+A+A+C+A+C+C+C+C+C+C+A+D+C+C+C+D+C+C+C+C+D+C+C+C+C+D+A+G+C+C+C+C+C+C+C+A+A+D+D+C+g+D.K.b+b+b+|+}+9+b+9+b+|+9+b+|+b+|+|+b+b+|+|+|+|+9+b+|+b+b+|+b+b+b+9+|+b+b+b+9+9+|+|+|+b+b+|+9+|+b+5+}+m.y.u+s+l+l+q+r+t+t+t+t+r+t+r+t+s+t+t+s+k+k+t+t+r+s+t+r+r+r+r+r+r+s+r+t+t+s+t+r+s+t+s+t+r+r+t+s+q+t+l+E.", -"X.u+q+u+r+u+u+u+u+u+u+q+q+q+q+u+q+q+q+q+q+q+q+u+u+u+u+q+q+q+s+u+q+u+q+q+u+u+q+q+u+u+q+q+u+q+u+u+q+r+X.K P Z +.P @.X .+.+.+.+. . .+.X X +.X X X +. .X X X +. .X +.X X X +.+.+.+.+.+.X X X +.+.+.+.+.X +.Y n ;.(+a+a+6+6+a+6+6+a+a+6+6+6+6+a+a+p+6+p+a+a+3+a+a+a+a+a+a+3+6+a+6+6+p+a+a+6+6+3+6+6+a+a+a+a+a+6+p+p+=+[.u.0+#+#+#+#+#+#+#+`.#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+`.#+#+#+#+#+#+#+#+W.).k =.%.%.%.%.%.*.*.*.%.%.*.*.%.*.&.'.'.'.'.%.=.'.=.*.*.*.%.%.*.%.*.*.%.%.%.%.*.*.*.*.*.%.>.*.*.*.*.>.k h x A A I R E B R I I E E A R -.w E E E E I -.A I I A B E E B w E R I A B I R w w E w I E R I x A K l s i.9.d.f.9.e.d.d.d.e.e.9.d.d.e.9.9.f.9.e.d.f.d.9.d.9.d.e.d.d.e.d.d.d.9.e.d.d.9.d.d.f.d.d.j.d.j.j.j.N r.v+F+E+E+E+G+G+F+E+E+F+G+E+G+F+E+G+G+G+z+F+E+G+G+F+D+E+G+F+F+A+E+G+G+D+F+G+E+G+G+F+G+D+D+E+E+D+D+G+m+D.$+7+b+b+f+7+b+b+f+9+f+f+f+f+f+f+9+9+f+f+f+f+f+f+b+b+b+f+f+9+f+f+9+9+b+9+7+f+f+9+b+b+9+f+9+b+f+f+f+2+J.B.q+q+u+u+u+q+q+q+r+r+u+q+u+q+u+q+q+u+q+u+q+q+u+u+q+q+q+u+u+u+u+q+q+q+q+q+q+u+u+q+u+u+q+q+q+u+q+q+u+E.", -"c.S.S.*+X.X.X.X.X.X.X.X.X.X.X.X.X.S.S.X.X.S.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.S.S.X.X.X.S.S.S.X.X.X.X.*+E.o e c c n c n n n n n n c c n n n n n n n c c e n n n c n n n n n n n n n n n n n n n n n c n e e p B ).u.P.P.O.O.O.P.P.++O.P.O.P.O.O.O.O.O.++P.P.P.P.O.P.P.O.P.O.P.P.O.O.P.O.O.O.P.O.P.O.O.O.O.P.P.O.O.V.u.F ].u.w.w.w.w.w.k.w.w.w.w.w.w.w.w.w.w.k.w.w.w.G.w.w.w.w.w.w.w.w.w.w.w.w.w.k.q.w.w.w.w.w.k.k.k.w.w.k.k.f m C q q j q j C q q q q C j q q q q q q q q q q q q q j j q j j q q q j q q j j j q q j q q q j q O 0 2 v 3 3 h I l o b l l o f l l l l l h o o f f o l f l l l f o l l f l l o f I l l o f l o I l 0 h o 2 D N Q N Q 2.2.Q N Q Q Q 2.Q N Q 2.2.2.Q Q Q 2.2.2.2.Q 2.2.N Q Q 2.N 2.Q 2.N 2.2.2.N Q 2.2.N N N ..!.s S T.i+-+-+-+'+-+-+-+-+-+m+-+-+-+-+-+-+'+-+-+-+-+-+-+-+-+-+-+-+-+-+'+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+m+I.L m.N.K.K.C.C.C.K.C.N.N.N.N.C.N.C.N.N.N.C.N.C.N.C.N.C.C.C.N.N.C.N.N.N.C.C.C.C.C.C.N.N.C.C.N.C.N.C.N.J.].6.~+*+X.X.S.X.S.X.X.X.X.S.X.X.X.X.S.X.X.X.X.X.X.X.X.X.S.X.X.X.X.X.X.S.X.X.S.S.X.X.X.X.X.X.X.X.S.X.S.c.", -"5 p.3.m.7.3.3.m.7.3.7.7.3.m.7.7.3.7.7.3.3.7.m.m.3.7.p.z.3.7.7.3.3.m.3.7.7.3.m.3.7.m.z.3.m.7.7.7.z.J.R f 6.-.K -.-.-.6.6.-.-.-.-.-.6.6.-.-.6.-.-.-.6.-.6.-.-.-.6.-.-.-.6.-.6.-.-.-.6.-.6.-.-.-.6.-.-.6.6.c.R o ;.z r B w y w I A x A w w B B A B A w A w w w x A w B A A A w w A w x A B A A w w B B B A y r y B w f [.[.[.[.[.[.}.}.[.[.[.[.[.[.[.[.[.[.}.[.[.[.(.[.[.[.[.[.[._.[.[.[.[.[.[.}.[.[.[.[.[.[.(.(.}.[.}.(.}.7 7 }.v v v v v J v v v v J v v v v ).v v v v v v v v v ).).v v v v v v v v v v ).v v v v v ).).v v ~.2 < v 0 k 0 0 0 k 0 0 0 0 v 0 0 0 k 0 0 0 0 0 0 0 0 0 0 v 0 m k 0 0 0 0 k 0 0 0 0 0 0 v 0 0 0 0 j 0 o < | t m v | | | m | | v v | | | | m | | | | | m | | | | m | | | | | | m | | | m | | | m m | m | 7 v 0 < : S S ^.^.^.^.^.^.^.^.^.^.^.^.S S S ^.^.^.^.^.S ^.^.^.^.^.S ^.^.^.^.^.^.^.S ^.^.^.^.^.S ^.S S ^.^.S S 9 L o.n.o.t.t.o.o.t.t.t.t.o.t.t.h.h.t.t.t.o.t.h.t.t.t.o.t.h.t.t.t.t.t.h.h.t.t.t.t.t.t.t.t.t.t.t.t.o.o.g L p.m.m.3.m.z.3.7.7.7.3.m.7.7.7.7.m.7.7.m.7.m.7.3.7.3.7.m.m.3.3.7.7.3.7.7.m.3.3.7.7.7.7.m.7.7.A.m.z.7.", -"n.;+%+%+%+$+$+%+%+%+%+%+%+;+;+%+%+;+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+;+%+%+%+%+;+%+%+%+%+%+;+%+%+%+;+7+m.3.*+~+~+[+[+~+[+[+~+~+[+[+[+e+[+[+[+e+[+[+[+[+[+e+[+[+[+e+[+[+[+d+[+e+[+[+~+[+[+e+[+[+[+[+[+[+[+[+d+X.-.e M U ` M M P P M M P P M c c c M M P M P P ` ` ` P ` P P P M P M M P M P P M P M M M P P P U ` M n B V.++=+=+P.=+=+=+=+=+=+=+=+P.=+=+P.=+P.P.=+P.=+=+=+P.=+=+=+=+P.O.=+=+=+P.=+=+=+=+P.=+=+{+O.P.=+{+{+=+[.:.M.M.M.G.R.M.R.M.M.M.G.G.G.G.M.M.M.M.M.M.M.G.G.M.M.M.M.G.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.).0 O *.*.*.#.>.%.*.>.>.*.#.%.*.>.*.>.>.*.>.>.=.%.>.*.>.#.#.*.=.*.>.*.>.%.>.*.>.*.>.#.>.*.>.>.>.!.,.1.m 2 0 A E o o o B o o o o o o o o o o o o o o o o o o o o o o o o o o B o o o E o o o B A o x 3 l o y 6 j ..2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.0.2.2.2.2.2.0.2.2.2.2.2.0.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.5.2.2.2.5.5.u '+m+m+m+g+g+m+v+g+m+g+m+m+m+g+i+m+v+m+m+i+m+m+g+m+g+m+m+v+g+m+g+m+g+m+m+v+m+m+v+m+m+m+m+g+m+m+m+g+i+t.m.$+;+;+K.%+;+$+%+%+%+%+;+%+%+%+$+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+;+%+%+%+;+%+C.", -"N.7+9+b+9+f+f+f+b+b+b+b+9+9+9+}+9+b+9+b+b+9+9+9+b+b+b+9+9+9+b+b+f+9+b+b+b+b+f+9+}+f+f+9+9+9+9+9+9+f+N.A.l+r+t+t+t+r+r+r+q+r+t+r+r+t+o+t+r+r+r+s+t+t+r+r+t+t+t+t+t+t+t+t+r+r+t+t+r+t+r+s+r+r+t+t+r+r+t+t+r+X.-.P +.+.+.X X +.+.X Y X +. .+.+.X Y Y +.Y +.+.+.+.+.+. . . .X Y Y Y Y . .+.Y +.X X Y Y +.Y @.+. .X ` p V.p+3+3+3+3+3+3+p+3+3+3+4+3+6+3+3+3+3+3+3+3+3+p+3+3+4+p+4+4+6+3+p+6+3+3+3+3+3+3+3+3+3+3+4+3+3+4+p+3+_.F.#+#+#+W.#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+}.j #.=.=.=.*.=.=.&.=.=.&.&.&.&.=.=.=.=.&.=.'.&.&.&.&.&.=.&.&.&.=.=.=.=.'.'.&.&.=.=.'.&.&.=.=.&.!.'.#.k 2 w B B B B B B B B B B B y y y y B B B B B B B B B B B B B B B B B B B B B B B B B B B B A B B B y z j 5.b.b.b.e.e.j.j.e.e.e.e.e.j.e.e.j.e.b.e.e.9.e.b.b.e.i.j.j.d.e.j.j.b.e.e.e.j.j.b.e.j.d.b.j.j.e.g.j.i.N m+G+G+C+z+B+G+C+G+D+C+G+G+E+z+D+D+D+D+A+G+D+D+G+D+C+C+G+D+D+A+C+C+G+G+A+D+G+C+D+D+E+E+G+G+G+E+G+G+F+D.m.2+b+b+9+f+9+9+9+9+9+9+f+9+9+b+f+9+9+9+9+9+f+9+b+9+9+9+f+9+9+f+9+9+9+b+9+9+b+9+9+9+9+9+9+9+9+b+f+7+C.", -"N.2+|+5+|+f+}+9+9+|+|+9+9+9+|+}+9+9+9+9+9+9+9+9+|+|+f+}+}+}+|+9+}+}+|+|+b+9+7+7+2+9+9+9+9+|+|+|+9+9+C.4.d+r+t+k+l+h+s+q+h+h+h+h+h+k+o+o+s+l+l+d+l+l+k+k+h+s+s+r+s+s+s+t+l+l+k+k+s+t+s+l+h+h+s+h+k+h+s+t+t+X.K P .Y @.Y Y Y Y Y Y Y X .+.+.U Z Y Z ` Y Y U U U Y Z X +.U @.P ` Y +. .+.Y Y Y Y Y Y Y @.@.Y +.+.P B O.a+:+:+(+3+3+:+:+(+:+4+3+:+:+:+4+3+4+(+:+4+4+(+(+(+^+4+^+^+:+<+3+6+:+(+:+3+:+:+:+:+:+(+(+(+:+4+0+(+_.}.#+U.W.U.U.U.U.U.U.U.U.W.W.W.U.W.U.U.U.U.U.Z.U.U.U.U.Z.Z.U.U.U.W.U.W.W.U.Z.U.W.Z.U.U.W.U.Z.U.U.U.#+).j >.'.'.=.=.=.=.=.*.=.=.=.=.=.*.=.=.=.=.=.=.=.=.=.=.=.=.=.&.=.=.=.=.=.'.&.&.&.=.*.=.=.&.=.*.&.&.=.=.q 2 o B y x B B B B B B B B y y y y x x A x x A x x A x A B x B B B x A x B A B B B A B B B w B B z x l C 2.d.9.9.9.9.9.9.9.9.9.9.j.9.9.f.9.9.e.9.f.0.j.b.e.9.i.0.9.9.f.f.f.e.9.9.9.9.9.9.9.9.d.d.0.0.j.b.j.Q S m+F+E+E+y+y+z+C+y+z+z+z+F+z+w+z+G+C+G+y+z+z+C+y+z+G+G+y+G+z+z+G+z+F+z+w+z+E+A+A+z+z+z+z+z+A+z+z+A+z+t.n.f+|+9+9+9+9+9+9+}+|+9+9+9+7+f+f+f+f+|+}+|+|+9+9+}+}+|+9+9+|+}+}+f+b+b+9+b+9+f+|+9+9+9+f+}+9+9+}+7+C.", -"C.2+9+b+|+}+}+|+7+}+}+}+9+9+|+9+}+}+}+}+|+}+}+}+}+}+}+7+}+}+}+}+}+|+|+|+}+|+}+7+2+|+|+|+|+|+|+|+|+9+C.4.d+r+s+d+d+h+k+k+k+k+k+k+k+k+e+e+l+l+l+d+l+l+k+k+k+h+h+k+k+k+k+k+k+l+e+s+l+s+s+k+d+k+h+h+l+h+k+r+t+X.E c +.Y @.U Y Y Y Y U U Y ` @.Y Z Y +.U Z Z ` Z Z ` Z ` Z +.U @.` ` ` ` Z Y U U Y Y Y Y Y ` ` U .+.M A O.a+^+:+:+:+:+:+(+:+(+4+:+:+(+:+(+:+:+:+:+:+:+:+:+:+:+:+:+:+(+<+6+<+:+:+:+:+:+:+:+(+(+(+(+:+:+^+_+(+_.}.#+U.U.R.R.U.U.U.R.U.U.U.W.L.Z.U.U.U.U.U.R.W.W.U.U.U.Z.U.U.U.W.R.R.V.V.R.Z.U.U.U.R.U.W.U.Z.W.U.U.W.).7 %.%.'.*.=.=.=.=.=.=.=.=.=.&.%.%.%.*.=.=.=.=.*.*.*.>.=.=.=.=.=.=.=.=.%.&.'.'.&.*.*.&.=.*.=.=.=.&.*.k 2 o B y x B A A A A A A B B B B B B A A A x x B y x x B A B B B B B A x B A B A B B B A B w A B y y f C 2.9.f.9.9.9.9.9.9.9.9.9.9.f.9.9.9.9.d.f.f.9.e.d.d.f.0.9.b.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.0.0.j.e.0.2.S m+F+E+z+B+y+z+z+y+y+z+z+z+z+w+v+y+y+y+y+y+y+y+y+B+y+y+y+y+y+z+y+y+z+z+z+z+z+z+y+w+z+z+z+z+w+z+z+A+w+t.n.7+|+|+}+|+|+|+|+|+|+|+9+|+7+2+7+7+f+|+|+|+}+}+}+}+}+|+9+|+}+}+}+}+}+|+|+|+9+}+|+|+|+|+|+|+}+9+|+7+C.", -"C.7+9+|+|+}+}+|+2+}+}+}+9+9+|+b+|+}+}+|+|+|+}+|+|+|+|+}+}+}+|+}+|+9+9+|+}+9+9+}+}+}+}+}+|+|+|+|+|+9+C.4.d+s+k+d+d+k+h+k+k+k+k+k+k+k+d+d+l+l+h+k+s+s+l+k+k+h+h+k+k+k+k+k+k+k+e+l+l+k+h+k+l+k+h+h+d+h+k+s+r+X.E P .Y @.Z Z Y Y U Z U U ` ` U Z Y .+.+.Z ` Z Z @.Y ` Z +.+.Y @.` ` ` P Z U Y Y U Y Z Y ` P @. . .M A P.a+(+:+:+:+:+:+(+:+:+:+(+=+<+(+:+:+:+:+:+:+6+:+:+<+(+^+(+:+:+:+:+:+:+:+:+:+:+:+:+:+(+(+(+=+(+^+_+:+_.}.#+U.U.U.R.U.U.U.R.U.U.U.W.L.Z.U.W.U.U.U.R.W.W.U.U.U.U.U.Z.U.W.R.U.V.V.R.U.U.U.U.R.U.U.U.U.R.U.U.W.).7 %.%.'.%.=.=.=.*.=.=.=.=.=.'.'.'.'.=.*.*.=.=.=.*.*.>.=.%.%.%.*.*.=.*.%.'.%.&.=.*.*.=.*.*.=.*.=.=.>.k 2 w B y x B A A A A A A x B B A B A w A w x x B x y B B w B B A x B x A B B B A B B B A A A B A y B l C 2.e.9.9.9.9.9.9.9.9.9.9.9.f.9.9.9.9.f.0.0.9.9.j.9.0.d.9.8.9.f.f.e.d.9.f.9.9.9.9.9.9.d.9.0.0.9.e.0.2.S -+z+A+A+v+y+A+A+y+y+z+A+z+z+w+w+y+B+y+w+y+y+w+z+y+v+y+y+y+v+y+y+w+A+w+w+z+y+v+v+v+w+z+A+w+v+w+z+z+B+t.n.7+|+|+}+|+}+|+}+|+}+|+9+|+}+7+}+}+9+b+b+|+|+}+|+|+|+|+9+|+}+}+}+}+}+}+|+|+|+}+|+}+|+|+|+|+}+9+|+2+C.", -"C.2+9+b+|+}+}+|+7+}+|+|+9+9+f+b+b+b+b+b+b+b+|+b+b+|+b+b+b+b+|+|+9+9+9+|+|+b+|+9+|+|+|+|+9+}+|+|+9+9+C.4.d+r+t+d+l+h+h+k+k+h+k+s+s+l+l+h+q+s+s+t+t+t+s+t+s+s+t+k+k+t+s+k+k+k+k+t+k+s+s+h+l+h+h+h+l+h+k+s+r+X.E P .Y @.Z Y Y Y U Z Z U Z @.Y X +. . .+.Y +.X X X Y Y @.+.+.Y +.+.` ` ` Y Y Y Y Y Y Z Y Y ` Z .+.M A P.a+:+:+:+:+:+^+^+:+3+4+(+:+:+4+3+4+3+:+:+^+4+4+:+6+(+0+0+^+:+:+(+4+:+(+:+3+3+:+:+:+3+4+(+(+(+3+4+(+<.}.#+U.U.U.U.W.U.U.U.U.U.W.#+`.U.U.#+W.R.W.U.U.W.U.U.U.`.`.U.Z.Z.U.`.W.W.U.W.Z.W.U.U.U.U.U.U.U.U.W.#+).j >.=.=.=.=.=.=.=.=.*.=.=.=.'.'.&.&.&.=.%.%.=.*.%.'.'.%.%.,.%.*.>.=.*.%.*.=.&.=.*.=.*.=.*.*.=.=.=.#.k 2 w B y B B B B B B B B A A B A w A w w w w w A A x A A w B B w B A A w A B B B B B B B B A A A y B 3 C 2.e.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.f.d.0.j.j.b.0.i.e.j.d.9.0.0.9.b.9.f.j.9.9.f.9.9.b.d.0.0.9.e.i.2.S -+G+A+E+v+y+z+C+y+y+z+A+z+z+z+y+z+z+E+z+E+z+F+E+w+w+E+E+z+w+z+F+z+A+z+A+A+z+y+x+y+z+z+z+z+w+z+z+G+g+t.n.f+9+9+9+}+}+9+}+|+}+9+9+9+|+|+9+9+b+b+b+9+9+b+b+9+9+9+|+b+|+}+}+7+}+}+|+9+9+9+|+}+}+9+9+}+|+9+}+7+C.", -"N.7+9+9+|+}+}+9+9+b+b+|+9+7+7+7+9+b+9+9+9+b+9+9+9+9+9+b+b+b+b+b+f+7+7+f+7+b+9+b+|+9+9+9+9+|+9+9+9+f+C.4.d+r+t+l+l+s+s+s+h+h+h+s+s+s+s+q+q+s+t+t+t+e+d+[+~+e+o+s+s+o+h+t+t+r+s+o+k+t+s+h+d+s+s+s+h+h+k+r+t+X.K c +.X Z Y Y Y Y Y Y Z Y +.+.X +.Y Y X @.@.Z ` ` ` ` @.` Z Z @.X .+.U Y X Y Y Y Y Z Z Y ` ` +.+.+.M x O.a+3+:+(+:+3+:+^+(+4+4+4+:+(+:+4+4+4+0+4+4+3+_+!+)+0+p+0+_+(+4+4+4+:+:+3+3+3+:+:+3+3+4+(+(+4+3+3+{+<.k.#+U.U.U.U.W.U.U.U.U.U.U.#+U.U.U.#+R.Q.Z.U.#+W.M.M.R.W.W.M.M.Z.W..+W.U.W.W.Z.U.U.Z.W.W.U.U.U.Z.W.Z.).j >.=.=.=.*.=.=.=.=.=.&.=.=.'.'.'.'.=.*.%.%.>.*.%.%.%.%.%.%.%.*.>.*.*.=.=.*.&.=.*.&.=.=.=.*.=.=.=.>.k 2 o x B B B B B B B B B w A A w w w A I w I I w w w I A A A A w A A A w w B B A A B A A B A E B z B 3 C 2.9.j.9.9.9.j.j.9.9.j.j.j.j.9.9.9.9.d.9.d.e.b.j.0.2.i.i.0.2.2.2.2.j.9.9.j.j.9.9.9.9.d.9.0.0.e.e.i.Q S m+G+E+E+y+y+B+C+z+w+E+E+A+G+y+y+A+F+E+A+E+E+F+F+y+G+F+E+A+E+E+F+F+B+z+A+A+A+z+y+z+z+z+z+z+z+z+z+z+B+D.m.f+9+9+9+}+9+9+9+9+|+9+9+9+|+|+b+9+9+f+7+7+7+}+;+2+7+f+f+f+}+7+7+7+}+}+|+9+9+|+|+|+f+f+9+|+|+9+7+f+C.", -"C.7+9+b+}+}+9+9+b+b+9+f+$+N.C.J.J.N.N.N.N.N.N.N.N.N.$+N.N.N.N.N.N.J.&+N.N.K.f+9+9+9+9+9+9+9+9+|+9+f+C.4.d+r+s+k+h+h+s+s+k+h+h+h+q+s+k+k+s+n+~+X.c.c.c.R 4.c.E.E.E.X.~+t+t+t+k+s+s+t+s+h+h+s+s+s+k+h+s+r+t+X.E P +.X Z Y Y Z Z X Y Z Y +.X @.` P M n e d d } } } d d d e M M @.+.+.+. .Y Y Y Y Y Y X X ` ` +.+.+.M A O.a+(+3+(+:+:+3+3+:+4+4+3+:+:+6+4+3+V.O.u.u.].C C J u.u.O.:+4+4+(+4+(+:+3+3+(+:+:+:+:+3+3+:+^+^+3+(+_.}.#+U.U.U.U.U.U.U.U.U.U.U.#+U.U.U.#+#+Q.W.U.`.}.J J J J J J }.Z.U..+W.W.U.Z.W.U.U.Z.U.W.W.U.U.Z.U.#+).j >.=.&.=.=.=.=.=.=.=.=.=.=.%.%.%.#.O j m m j j j j m m j j O >.*.*.=.=.*.%.=.&.*.*.=.=.&.*.=.=.=.*.k 2 w B y B B B B B B B B B A w w w l l o 2 ; l f ; ; ; l ; B w w A w A w w B B B A B A A B A E B z B 3 C 2.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.j.9.d.9.e.e.j.i.2.s u s s 1 s s s 5.0.9.j.9.9.j.9.9.e.9.0.0.e.j.i.Q S m+F+E+E+y+y+z+C+z+A+D+E+G+x+'+'+T.>+T.>+>+T.m+'+'+'+T.'+>+'+>+'+T.T.m+v+z+A+A+z+z+z+z+z+z+w+z+z+z+B+t.m.f+9+9+9+9+9+9+}+|+|+9+9+9+|+|+}+f+7+$+z.J.7.7.7.7.m.n.J.J.$+f+7+}+}+}+f+f+9+|+}+|+9+9+9+|+|+9+}+7+C.", -"C.7+|+b+}+}+}+9+9+|+}+2+L 5 ) ) - / / / / / / / / ) 5 / ) / - ) / - 5 5 5 5 2+7+}+|+9+|+|+9+}+}+9+9+C.4.d+r+k+k+k+h+k+k+k+k+k+l+q+k+l+[+X.E.R ! + @ + $ . + + @ ! b 6.S.~+l+k+k+k+l+h+k+l+h+h+s+k+k+k+r+t+X.E P +.Y @.Y Y Z Y U Y Z Y X Z P n e } ' ; % % & & & % % % 3 ( i P Z Y . .Y Y Y Y Y Y Y Y @.` Z +.+.M B O.a+:+:+:+:+:+:+3+:+:+3+:+:+6+!+P.u.8 _ . . . . . . + $ 4 _.P.(+3+4+(+:+(+(+:+(+:+:+3+4+0+:+^+^+4+:+<.}.#+U.U.W.U.U.U.U.U.U.U.U.U.W.W.U.W.R.++`.Z.w.{ . . . . . . 8 M.W.W.W.R.U.Z.W.Z.W.U.U.Z.W.U.U.U.U.#+).j %.'.&.=.=.=.=.=.*.=.=.=.&.*.O j m , @ # @ @ + + @ @ $ $ = < t >.*.=.*.*.=.=.=.=.*.=.=.=.*.=.&.=.=.k 2 w E y x B B B A A B B A w w w o 2 ; ; % @ @ + @ @ @ @ @ ( 3 o w I w A I A B A B B B B B w B B x x l C 2.9.9.9.9.9.9.9.9.f.9.9.9.9.f.9.9.9.e.f.0.f.i.2.s = $ + . + $ $ = !.i.9.9.9.9.f.9.9.d.e.0.0.j.e.j.2.S -+F+A+A+y+y+z+C+z+v+w+y+B+j+9 g ~ g ~ g g ~ g ~ g ] > g g ] g _ ~ _ a.>+y+z+z+z+w+z+z+z+z+w+z+z+z+B+t.m.f+b+b+}+9+|+|+}+|+}+|+|+|+|+}+%+N.7.5 ) . . . . . . . - @ L %+7+f+}+}+}+f+9+|+|+}+|+|+9+9+|+9+9+7+C.", -"C.7+}+|+|+}+}+|+|+}+7+8+5 . + @ + @ @ $ $ @ @ @ % % % % @ @ @ @ @ % @ . - / &+7+|+|+9+|+|+|+}+|+|+9+C.4.d+s+k+d+l+k+k+k+k+k+k+s+s+l+]+E.a # @ @ + $ @ $ $ $ $ @ + @ ; ; R X.d+e+k+d+h+k+d+h+h+k+k+k+k+s+t+X.K P .Y @.Y X Y U U Y Y Z +.@.n } ; & . @ + . . + . . . . % * ; } e @.+. .X Y Y Y Y Y Z Y @.P ` +.+.M A O.a+^+:+:+:+:+:+(+:+:+:+(+4+=+C 7 + @ @ @ @ . . . . $ $ + . $ <.{+{+:+:+(+(+(+(+=+:+:+(+(+:+:+^+4+:+_.}.#+U.W.Q.U.U.U.U.R.Z.W.W.W.V.U.W.R.Q.@+`.w.8 @ . . . . . . 8 M.Z.W.W.R.U.U.U.Z.R.U.Z.U.U.W.U.U.U.#+).j %.%.'.*.*.=.=.&.=.*.*.*.*.k < = + @ % # # @ @ @ # @ @ # % $ : < j #.*.%.%.*.*.&.*.*.=.*.*.=.&.=.*.q 2 I B x A A B x A A B A w I l ; * * % % @ . @ . . . . . # * * * ; 3 w w A A B A A B B B B A A B x y l C 2.e.9.9.9.9.9.9.f.9.9.9.9.9.9.9.9.9.f.0.f.i.5.u = + . - - . - - = ..0.9.9.9.9.9.9.9.d.e.0.0.9.e.j.2.S -+z+w+y+y+w+z+A+w+w+w+w+x+j++ + # # # # # # # # # @ # @ @ @ @ @ $ $ F '+y+w+A+z+v+w+z+z+z+w+z+z+A+y+t.m.f+5+|+}+9+|+}+}+|+9+|+|+}+2+%+n./ . @ % % = = = $ % $ @ @ ) L n.%+7+7+}+b+b+|+|+|+|+}+9+|+|+9+9+7+C.", -"C.7+9+b+}+}+9+9+9+9+|+2+5 . + + . @ @ + @ @ + @ % % % % @ . . . . - . @ + / &+}+5+9+9+9+9+}+9+|+9+9+C.4.d+s+s+k+k+q+q+h+d+k+t+t+t+~+6.; . - - . + $ # . + @ + @ - . % @ + b *+o+t+k+s+k+h+h+s+s+k+h+d+q+r+X.K P .X Z Y X +.Y Y Y Z Y +.M ( % . . . + $ @ @ @ . @ . . % % @ . ; e P .+.Y Y Y Y Z Y Y @.` Y .+.c y O.a+(+:+<+(+:+:+:+:+4+_+0+)+F + . . & % @ @ # . . . # % $ @ . > [.,+{+(+4+(+0+(+:+3+:+3+4+(+(+3+3+(+_.w.#+U.U.R.U.U.U.U.R.W.R.W..+++Y.W.U.U.#+R.J # . . . . . . . 8 M.#+U.U.U.U.U.U.U.U.U.Z.U.W.U.U.U.Z.#+).j *.'.=.%.=.*.=.=.&.'.%.%.j $ . + + # . . @ @ + + . . . . $ + @ . = m #.,.,.%.=.=.=.=.=.=.=.=.'.=.>.k 2 A B y A A A B B B B A l l f . # @ @ @ . . . + @ . . . @ @ . . . * I I y x B B B B B B B z w A x B 3 C 0.e.9.f.9.9.9.9.f.9.f.9.f.f.9.9.9.9.9.9.d.5...: . . @ + + $ @ . $ 5.9.9.9.9.9.9.9.9.e.9.0.0.9.e.9.Q S '+D+D+y+y+w+A+z+A+z+E+D+y+++. + . - . . . . + @ . @ # @ # @ @ # & @ W m+A+D+E+y+y+z+z+z+z+z+z+z+G+x+D.m.7+b+9+9+|+9+}+2+9+5+b+9+7+A.L - + @ % & % = = $ @ $ @ @ . + $ . L %+2+f+5+b+}+|+|+|+}+9+|+9+9+9+7+C.", -"N.7+9+5+}+}+f+9+9+9+7+2+L . $ @ # . . . . # # . @ % @ @ . + . . . + @ $ . ) 8+}+b+f+9+9+9+|+9+}+9+9+C.4.d+r+t+k+k+u+u+l+l+t+o+t+k+E.& @ @ . - - + $ @ + . @ . $ % $ @ @ % + 4.[+t+s+s+h+s+h+s+s+h+h+l+q+r+X.E M .X X +.U Y U U Z U Z P } ; @ . . . . . $ * % % $ . . @ . . @ * ( n @.Y Z Y U Y Y X Y ` @.+.+.+.M y O.a+(+:+:+3+3+:+3+(+0+4+{+F + @ . . @ @ . - . + + . @ @ # + + # > w.)+_+{+3+3+(+:+:+3+3+3+(+{+3+3+(+_.k.#+U.U.U.U.U.U.U.U.W.U.R..+W.W.U.Z.#+M.J . . . . . . . . . 8 F.Z.U.Z.U.U.U.U.U.U.U.W.Z.W.U.U.U.W.#+).j >.&.=.=.=.>.=.&.&.'.,.#.| + - . . @ @ @ % @ @ . . . - . + . . # $ , O #.%.=.=.=.=.=.=.=.=.=.=.=.*.k 2 A B B x x B B B B B B l { @ @ @ + . . . # . @ @ # . @ @ . @ . . @ f w B B x B B B B B B x A A x B l C 0.e.j.9.9.9.9.9.9.9.9.j.9.9.9.9.f.9.e.f.i.2.1 = . . . . . + @ . + 5.0.9.j.j.9.9.9.9.d.e.0.0.j.j.j.2.S >+G+D+y+y+A+A+z+C+y+E+D+y+ ++ + . - . . @ # @ % # + . + . . . + % % W m+z+D+A+y+y+z+z+z+z+z+z+z+z+B+t.n.7+|+9+}+}+9+f+}+|+b+b+f+7+a - - . . % @ + + . . . + $ % % % @ . ) h.2+7+b+b+9+|+|+}+9+9+|+|+|+9+7+C.", -"C.7+f+b+|+}+f+9+}+|+b+8+5 + $ @ @ . - # @ @ @ @ @ . # # . . . . # @ % @ . / 8+7+|+|+9+|+9+|+9+9+|+f+C.4.d+q+t+l+l+l+l+u+l+l+s+r+X.b @ # @ + . - @ # b b b b # . @ + . + + @ a E.l+u+h+k+h+h+s+s+h+h+s+r+t+X.K ` .Y Y +.Y Y U Z Z Z ` e ; @ . . . . @ @ & ' ( ( ; @ . . . . . @ * d P Y Y Y U U Y X X ` @.Y +.X c x O.a+(+:+:+(+3+:+:+:+_+(+O.+ + . . . . . . - > ~ $ + $ + . . + + . { O.4+0+4+4+3+:+:+:+4+(+:+3+3+4+:+_.}.#+Z.W.U.Z.U.U.U.U.U.Z.W..+U.U.#+Z.M.f + + . # . . . . . . 8 M.#+W.U.U.U.U.#+U.U.U.U.U.U.U.Z.U.Z.#+).j >.=.=.=.=.#.=.&.&.'.%.j = + + . . @ @ @ @ $ = $ @ # . . # . . . @ $ m #.%.'.*.*.=.=.=.=.=.=.=.'.*.k 2 w B y x A B B A A B B f @ @ @ @ @ . . @ & % & { % @ % @ . . . . @ ; A A B B B B B B B B A B B y B l 7 2.d.j.9.9.9.j.j.9.9.0.j.9.f.9.9.j.j.8.0.5.1 $ $ @ + . . . + @ - + 5.0.9.9.j.9.j.9.j.b.d.0.0.e.b.j.2.S m+G+D+y+x+z+E+z+E+v+z+D+y+x.+ . . + . # % & % % @ + @ @ @ @ @ @ % @ W j+y+A+C+G+y+z+z+z+z+z+z+z+z+y+D.n.7+b+|+}+}+9+9+7+}+|+b+8+n./ - + @ $ @ . - 5 L L 5 - @ $ % % % @ . / J.2+9+b+|+|+9+9+9+f+|+|+|+9+7+C.", -"C.7+9+|+|+}+9+9+}+9+9+2+5 @ @ @ + + @ + + + + @ . ) - - . @ . . @ % @ - - 5 8+2+}+9+|+|+}+}+|+9+}+9+K.4.d+s+k+d+l+d+l+l+l+l+t+t+E.# % % . + $ + # b *+s+n+X.R - @ $ + + + % - R d+s+h+k+k+s+s+s+h+k+k+t+t+X.K P .Z @.Y Y Y @.` Z @.M ( % . - + + @ % ; ( e P P d ( @ . . - - . * ( i ` Y @.U U Z Z Z ` @.U +.X M B O.a+(+:+:+(+:+:+:+:+{+(+F + + . . . + + + 8 u.u.}.8 + + + . + + . . ].<+4+4+4+:+<+<+:+:+:+:+3+3+4+:+_.}.#+Z.#+U.U.U.U.U.U.U.W.U.W.U.U.M.w.8 # + + . . . . . . . . 8 R.#+W.U.U.U.U.U.U.U.U.W.U.U.Z.U.U.U.#+}.j >.*.=.=.=.=.&.=.&.%.#.| $ @ + . . @ $ $ , | j j < = $ @ @ + . @ $ $ = O ,.=.=.=.=.=.=.=.=.=.=.=.*.k 2 I B x B A A B B A A 3 * . @ @ @ . . . % 3 h I f f & @ . . . . . @ & 3 A x B B B B B x B I E B y B 3 C 0.e.j.9.9.9.9.9.9.9.9.9.9.9.9.f.9.j.e.2.1 = + . $ $ . . . + @ . $ 5.j.9.9.9.9.9.f.9.d.9.0.0.j.j.e.2.S '+E+E+y+y+z+E+z+z+v+y+E+y+W # @ - . + @ $ % @ @ % % % & & % & % @ . W j+y+C+G+y+z+z+z+z+z+w+z+z+G+B+t.n.f+b+|+}+}+b+9+7+|+|+}+J.5 . - + $ + . . 5 C.2+7+$+L - $ @ % % @ . . L $+f+b+|+|+|+|+9+9+}+9+b+b+2+N.", -"C.7+9+|+|+}+|+9+}+9+9+f+L 5 / / / / / / / / 5 / / 5 5 ) . $ + . @ $ @ - L N.2+}+}+9+|+9+}+}+}+9+9+9+n.4.d+r+s+d+l+l+l+h+k+e+t+t+c.% @ . + $ $ + a *+l+d+l+e+[+b @ @ + + + $ # b d+k+k+k+k+k+h+k+k+k+l+q+t+X.K P .X Z Y Y @.Z Z @.@.n % @ . - . @ @ % } M @.@.Y P n ( @ . + + . % * f M X Z Y U U U Y @.` X .+.P B O.a+(+:+:+:+:+:+:+:+(+O.+ + . . + @ + + ~ ,+0+0+0+O.8 + + + + + + + ^ P.3+:+3+:+(+:+:+:+:+(+(+:+6+:+<.}.#+U.U.U.U.U.U.U.U.U.U.U.U.M.w.8 . . . . . . . . . . . . . 8 M.#+Z.W.R.U.U.U.U.U.U.U.Z.W.R.U.U.U.W.).j >.,.'.=.=.=.=.&.=.#.q , + + . . . # @ , j #.%.%.O k < + $ + # # # $ = j %.&.=.=.=.=.=.=.*.=.&.=.>.k 2 w B y x B B B A A w ( ; % % @ # @ @ + * A A A w l f @ # . . . . % & 2 I B B B B B B B B w A A x B l C f.d.f.9.9.9.9.9.9.9.9.9.9.9.9.d.d.9.i.u = + - . . $ . . . + + - = 5.j.9.9.9.9.9.9.9.b.d.0.0.j.j.j.2.S -+A+E+w+v+w+A+A+z+y+y+A+x+_ @ % @ @ + . . 4 4 [ 9 [ [ 9 _ 9 9 [ [ [ a.m+y+z+A+z+v+w+z+z+w+v+w+w+A+w+x.n.f+b+9+|+|+|+|+}+|+9+2+L - + + = $ @ - 5 J.7+}+}+2+N.5 . . - - / / / L K.}+|+|+|+}+|+|+|+}+|+9+9+7+C.", -"C.7+9+9+|+}+|+9+}+|+|+f+%+N.$+$+$+$+$+$+K.K.K.K.$+$+J.J # @ $ + @ @ - 5 K.f+|+}+}+9+|+|+9+|+|+9+9+9+n.4.d+r+s+d+l+h+q+h+d+t+t+~+R % $ . . + $ # c.s+q+h+e+o+e+y.. @ . + . + @ % d+s+s+k+k+k+s+s+k+h+h+q+s+X.K P +.Z ` U Z Z Z @.@.U e . . - + @ % @ * M @.X +. .Y P M @ . . . . @ % % c Y Y Y Y Y X X @.` Z +.+.M B O.a+:+<+:+(+:+:+:+(+{+[.+ + . . @ % + $ v.0+0+4+:+4+s.~ + . . # # @ + [.4+4+:+:+:+<+:+4+(+:+(+:+3+:+u.}.#+U.U.U.U.U.U.#+U.U.U.M.}.f . . . . . . . . . . . . . . + 8 F.Z.U.W.R.U.U.U.U.U.U.U.Z.W.U.U.U.U.Z.).j ,.,.'.*.=.*.*.&.&.=.k % @ + . + - @ $ | O %.'.%.%.%.j @ % @ . - # @ $ j #.&.=.=.=.=.=.=.=.=.=.=.>.k 2 I A y A B B B B A w ( ' * * * * & @ % l A w w A I l % % . . . . @ % ; w B B B B x B B A y A A z B l C 2.e.9.9.9.f.9.9.9.9.9.9.f.f.9.9.9.e.t = $ . - . . @ . . . + @ . + 5.0.9.9.9.9.9.9.9.d.d.0.0.9.d.j.2.S '+G+A+y+y+z+A+z+y+y+z+A+v+- $ % % % + . g '+1+'+'+'+>+>+'+>+>+>+j+'+>+m+y+z+z+C+w+z+z+z+z+w+z+z+C+v+t.n.f+b+|+}+9+|+f+9+|+}+;+) @ - + @ % @ - m.%+f+9+9+7+%+7.5 5 L h.m.C.N.%+}+7+}+9+|+|+9+9+9+9+|+9+9+7+C.", -"N.7+9+5+|+}+}+9+}+|+|+5+7+2+2+f+f+9+f+f+f+9+9+b+f+8+J.5 @ @ $ @ @ @ 5 $+f+b+b+9+9+9+9+|+9+}+9+9+9+9+C.4.d+r+s+k+k+h+q+r+s+k+t+[+R % $ . . + $ # c.s+u+h+t+o+s+E.@ % . . - + . % d+t+s+k+h+s+h+s+k+h+h+q+r+X.E P .X Z U Z Z @.` ` +.c # - - + @ & @ ; X .+.+.+.Y Y X * + + . . . @ . c +.U Y Z @.X X ` @.Y +.+.P B O.a+3+(+(+:+3+:+:+:+{+J + . . - # @ $ , {+{+4+4+:+3+1+8 # + . % % % + C !+4+4+(+:+<+:+:+:+:+<+(+3+:+_.}.#+U.U.U.U.U.U.Z.U.U.U.}.. . . . . . . + + . . . . . . . . 8 F.Z.U.U.U.U.U.U.U.U.U.U.U.W.U.U.U.W.#+).j >.=.'.*.=.=.=.=.*.%.j $ $ @ . . . + = j !.!.&.'.,.%.O = % # - + @ @ $ | '.&.=.=.=.=.=.=.=.=.'.=.>.k h A z i A A B B B B B A w I h 2 ; ; * * h r y x A w l % & . . . . . @ h w B B B B B B B B z x B B B 3 C 2.e.j.f.9.9.9.j.9.f.f.f.j.0.0.j.9.f.$ $ + . - # # % . . . + + - + 5.j.9.9.j.9.9.9.9.e.9.0.0.i.j.e.2.u '+F+D+y+y+z+A+z+y+x+y+A+m+# @ . * % + $ a.x+F+D+z+F+F+E+E+E+F+E+F+F+F+z+z+z+w+w+z+z+z+z+z+z+z+z+G+B+D.m.7+9+9+f+9+|+f+b+|+}+m.+ $ $ $ % * @ - $+f+f+f+9+f+7+%+%+7+7+7+2+7+f+f+}+}+f+|+|+9+|+9+9+}+9+9+9+7+C.", -"C.7+9+b+9+}+9+9+7+|+b+b+|+}+}+b+b+9+9+9+f+9+9+9+f+K.L . @ $ @ . . ) a.$+5+b+5+b+|+f+9+9+9+|+9+f+9+f+C.4.d+r+t+k+s+q+k+t+s+l+t+e+c.@ + - ) - + - R l+u+s+r+o+[+3.% @ + - @ + $ f d+t+s+h+s+s+s+s+h+h+l+q+t+X.E M +.X @.U Y @.Z @.` @.c @ @ - # % % % * .+.+.Y Y +.Z .* @ # . . . - . n U Y X Z @.Z Z ` ` X +.+.M B O.a+3+:+:+:+3+3+3+(+{+_ + + . @ @ . + F )+4+4+4+:+<+,+8 + + + . @ @ @ 9 P.4+(+4+(+4+4+4+:+(+4+4+4+:+<.k.#+U.U.U.U.U.U.U.U.U.W.}.. . . . . + . . . # . . . . . . . 8 R.#+U.U.U.U.Z.U.U.U.U.U.Z.Z.U.U.U.W.#+).j >.'.'.=.*.=.=.=.=.#.j < 2 < = $ + $ < q %.'.'.'.%.>.j < @ # . @ @ @ % 0 %.&.=.=.=.=.=.=.=.=.'.*.*.q f w B y x B B B B B A A A w w I w I w w w r d A I w 2 & % . . . . @ % l A B B x x B B B B w A B B B o C 0.e.9.9.9.9.j.j.9.f.0.f.9.9.9.j.0.u # . . . + @ $ v + . . + @ . $ 5.0.9.9.j.9.9.f.j.b.d.0.0.e.e.j.2.S '+F+D+y+x+z+E+z+w+y+y+y+I.# & $ ; % . @ t.F+E+D+w+y+w+z+w+z+E+E+E+F+E+w+C+G+G+G+y+G+C+z+z+z+z+z+G+B+t.m.7+9+9+9+9+|+b+b+9+f+L - , @ $ % $ @ L ;+b+7+2+}+}+}+}+}+}+f+f+b+b+b+5+9+}+}+9+9+|+}+9+9+}+}+9+9+f+C.", -"C.7+f+b+}+}+f+9+}+|+|+}+|+9+}+|+}+}+|+9+b+b+9+f+$+:.+ $ = @ $ . 5 K.9+}+}+9+}+}+|+}+9+|+|+|+|+}+|+f+C.4.d+q+s+d+l+s+k+u+s+s+k+s+S.& . + $ $ @ + b X.t+o+o+d+X.! . ) $ $ = + % y.d+s+s+k+h+s+k+s+h+h+h+q+t+X.K P .X @.Z @.@.Z @.@.@.d @ . . - @ @ @ * +.@.@.` Z @.U Z & + + . . . . @ & d +.T @.` +.+.` ` X +.+.M A O.a+3+:+:+:+3+(+:+(+.+. . + . . . . . [.(+3+:+<+:+4+_+_.$ @ @ @ . + . ] O.0+^+:+<+:+4+(+(+:+:+^+3+:+<.k.#+U.U.Z.U.W.U.U.U.U.#+}.. . . . . @ + { { + . . . . . . . 8 F.Z.#+Z.Z.U.U.W.W.Z.U.U.U.U.U.U.Z.W.#+).F >.=.&.=.=.=.=.=.=.=.=.=.&.$.$.$.>.#.q *.=.&.!.!.>.O m = # @ $ + # @ % 0 >.,.&.*.*.=.&.*.&.=.&.=.*.q 2 I A y x B B B x B B B B B B B B B B B A I l I l 2 ; % @ . . . . % ; I I B x B B A B B B A w A y y l 7 2.d.9.9.9.9.9.9.9.9.0.f.8.d.5.5.: + , . ) - + : ..Q $ . . + + - = 5.j.9.9.9.9.f.9.9.d.d.0.0.9.b.j.Q S -+G+E+E+y+y+z+C+z+w+F+x+x.. . - . . + . +j+j+I.x.x.a.x. +j+v+E+E+z+E+E+E+A+G+B+y+z+z+z+z+w+z+z+G+B+D.m.f+b+|+}+7+}+b+|+}+8+5 . @ & % % - - h.;+}+8+&+J.h.7.7.t.D.&+8+2+9+5+5+b+7+2+9+}+|+9+f+9+|+9+9+9+7+C.", -"C.7+}+|+|+|+}+}+|+|+|+|+|+|+}+}+|+}+|+9+|+|+}+}+C.) - $ $ @ @ - L 5+9+|+}+9+}+|+|+|+|+|+|+9+}+|+|+9+C.4.d+s+k+d+d+k+h+k+e+k+k+n+~+R + # @ $ $ @ . ! E.X.[+E.b $ $ $ . + . @ ; X.l+s+k+k+k+k+h+h+d+k+d+k+t+X.-.M .Z ` U @.` ` ` U G c # . . . # % % & X U Y .Y Y U ` & . . . # . . @ * d +. .@.` Y Y P ` +.+.X M B O.a+(+:+:+:+:+(+:+:+V.+ . . . . . . # [.(+<+:+<+:+(+0+[.$ + . @ # + + ] u.0+^+^+:+<+:+^+_+:+(+{+:+=+<.}.Z.U.U.Q.U.U.U.U.U.U.U.}.. . . . + . @ k.}.{ . . . . . . . 8 R.U.U.L.v.W.U.U.Z.R.U.U.U.Z.Q.U.Z.U.#+).j ,.=.=.*.=.=.&.=.=.=.=.=.=.&.=.*.*.*.*.=.*.%.,.,.>.k < @ # @ + # @ # * O >.%.*.*.*.&.=.*.*.=.&.=.#.k 2 w B B B B B B B B B A A B A A B B B B x z 2 ; @ % @ @ @ . . @ @ * h A A B B B B w A B x B B B y B o C 2.d.9.9.9.9.9.9.9.9.d.9.9.0.5.1 = @ + - - + = s |.Q + . . + @ # + 5.9.9.j.9.9.9.9.9.e.e.0.0.9.e.i.2.S -+z+A+A+v+v+z+A+A+D+A+m+W @ . . + . # . x.9 @ # @ @ @ @ - ] a.-+x+y+w+v+w+z+z+v+w+w+w+z+y+w+z+w+G+B+H.n.f+|+|+}+|+}+9+|+}+&+) . . $ $ $ . - 7.$+N.L / - - . + . . / h.$+7+b+b+b+}+}+}+}+9+|+|+|+}+|+9+9+2+C.", -"C.7+9+9+|+}+9+9+|+}+|+9+9+9+|+|+}+}+|+|+|+}+7+K.L . . $ $ @ - 5 C.9+9+|+}+9+9+}+|+|+|+9+9+|+9+9+9+9+C.4.d+r+s+d+h+s+s+k+k+k+o+t+s+X.a / @ % + . . @ % @ . . @ @ + $ . - . ) E.l+k+q+h+d+k+h+h+h+d+k+l+q+t+X.K P .X Z U @.@.Y @.` @.d . . . - @ % % * M Z +.T T +.` M % . . . @ # . . & e +. .@.` +.Z ` @.U +.+.M A P.6+(+:+:+:+:+:+:+(+M.. + . . . . . . u.(+4+<+<+:+{+4+u.{ . . . . . + @ w.0+:+<+:+:+{+{+:+(+_+:+4+^+v.}.#+U.U.U.U.U.U.U.U.U.U.}.. . + . @ J w.M.}.{ . . . . . . . 8 R.U.U.U.`.#+U.U.U.U.U.U.U.U.U.U.Z.U.#+).j >.%.&.*.=.=.=.=.=.=.=.=.=.*.'.=.*.*.=.&.&.'.,.#.j < $ @ . . . @ $ + , #.,.=.*.*.*.*.=.*.&.*.=.=.*.k 2 w B p y A B B B B B B B B B B B B B B A 2 % % $ . . . . # @ % ' 2 I A I B B B B x B B B w B B z y o C 0.b.9.9.9.9.9.f.9.9.9.9.f.2.s = + - - - + , s i.|.Q + . . + @ - + 5.j.9.9.9.9.9.9.9.e.e.0.f.d.e.j.Q S -+G+A+A+v+y+z+C+A+D+z+j+9 $ # . . . @ + # + + @ @ & * ; * @ . . a.m+y+z+z+A+z+z+w+z+z+z+z+w+A+z+G+B+t.m.f+5+9+}+}+2+9+9+}+&+/ . $ + . . + . J 7.5 - @ % $ % @ # - - ) 5 N.9+9+|+9+9+|+|+9+9+9+|+|+|+b+}+8+C.", -"C.7+9+9+|+}+f+b+9+}+|+9+9+9+}+|+}+}+9+b+|+7+8+7.) - @ $ + - / L $+}+}+}+9+7+b+7+|+9+|+9+9+|+9+9+9+9+C.4.d+r+s+d+l+h+h+h+s+t+t+t+t+l+X.b . + = + + + $ @ - - . . . - @ . { E.[+k+q+s+h+h+h+h+s+h+h+h+h+q+t+X.E M +.Z ` U Y Z U Z Y ` e @ . . - . # @ % d M Z T T @.M n @ . . . . . . . % e .+.Z Z Z Z ` ` X +.+.M B O.a+(+:+:+:+:+:+:+=+v.+ + . . . . . . w.(+(+a+3+:+4+0+u.~ + @ % @ . . . u.4+:+<+:+(+4+:+(+(+{+4+4+:+_.}.#+U.U.W.U.U.U.#+U.U.U.}.. . $ J w.#+U.#+w.{ . . . . . . . a F.W..+.+W.`.W.U.U.U.U.U.U.U.U.U.U.W.#+).j >.'.&.=.=.=.=.=.=.=.=.=.=.*.'.=.=.&.&.&.&.%.O j | $ $ @ . . . @ + = O %.=.&.=.&.*.=.&.*.*.=.=.=.#.k 2 w x y x A A B B B B B B B A A B B B B w 8 @ # @ . . - # @ @ * 2 I z y y B B B x B B B B B B B z y f C 2.9.9.9.9.9.9.9.9.9.d.e.i...: + . - ) + , u i.j.i.N + . . + + - + 2.f.9.9.9.9.9.9.9.e.9.0.0.j.b.j.2.S -+G+z+z+y+x+z+C+z+z+y+j++ # & % . . @ & $ $ % ; @ . @ % % @ + . @ W j+x+y+F+z+z+z+z+z+z+z+z+z+z+z+y+D.n.b+9+9+|+9+7+9+b+f+N.) . $ - . + + . < $ . $ $ % % % % % % @ + . 5 $+2+}+b+b+|+|+|+9+9+9+|+9+9+9+7+C.", -"C.7+9+b+}+}+7+9+9+|+|+9+9+f+9+9+7+f+b+b+|+2+J./ . + . @ @ - 5 $+2+}+9+|+9+7+|+9+9+9+9+9+9+9+9+9+9+f+C.4.d+r+t+k+h+s+l+l+k+s+t+s+k+l+[+E.b + $ $ + = = $ - - + . . - . . E.l+l+k+q+q+h+h+h+h+s+s+h+h+k+q+t+*+E ` .X Z Z Z Z Z @.` X M * % . . . # @ % ; i M P P M B ; # . . @ # . . . & n . .Y Y +.X ` ` Y +.+.M y O.a+3+3+(+:+:+:+:+:+J.@ + . . . @ . . w.(+:+_+3+:+_+0+O.{ . @ @ . . . . [.0+:+:+:+(+4+4+(+{+:+3+4+(+_.w.#+U.W.W.W.W.U.Z.U.#+W.}.f }.U.U.U.U.U.W.w.{ . . . . . . . 8 R.U.W.W.U.U.U.U.U.U.Z.Z.U.U.U.U.U.Z.#+).j *.'.&.=.=.*.=.=.=.=.=.=.=.=.%.'.&.&.=.*.=.>.j = $ $ $ @ . @ $ @ = j %.%.&.&.*.*.&.&.*.&.*.=.=.=.*.O 3 w B y x B B B B B B B B B B A A B B A I 8 % . - + . . . . . @ ; h I A A B B B B B B B B A A B y y 3 C 2.e.9.9.9.9.9.9.9.9.j.5...: $ + - - + $ 1 0.9.j.i.u + . . + @ # + 5.j.9.9.j.9.9.f.j.e.e.0.i.j.b.j.2.S m+G+E+F+B+y+z+C+y+v+x+<++ * & & . . . @ + + . % - + + @ % @ $ $ + + _.j+y+F+A+y+y+z+z+z+z+z+z+z+G+g+t.m.7+9+9+b+f+7+b+b+}+N.{ $ . - . . $ $ $ $ @ @ $ $ @ @ @ % * $ = + . 5 $+7+b+b+}+|+9+9+f+9+|+}+9+9+7+C.", -"C.7+9+b+}+}+f+9+9+|+|+9+9+9+9+|+|+f+b+b+}+$+L @ # . $ + . ) n.7+}+9+f+}+}+9+|+}+|+9+9+9+9+9+|+9+9+9+n.A.d+h+t+s+s+s+q+l+k+s+s+k+l+X.:.! @ @ + . . . = . # @ + + $ + . . - R X.l+u+t+h+h+h+s+s+s+h+h+k+r+t+X.K P .X Z U U Y Y U U @.P d * @ + . # @ @ % ; ; } d ( & @ . . . . . . . . % e +. .@.@.Y Y @.P Z .+.c B O.a+3+:+:+:+3+3+3+^+v.@ + . . . @ . - v.(+3+:+a+:+:+4+u.~ $ @ . . . . . [.4+6+<+:+(+4+4+4+{+(+{+3+{+[.w.#+U.W.`.#+W.U.U.Q.W.Z.#+U.U.U.U.U.U.U.#+w.{ . . . . . . . a F.Z.U.U.U.U.#+U.U.U.W.W.U.U.U.U.U.U.#+).j >.%.=.*.*.=.=.*.=.=.=.=.=.*.=.=.=.=.>.#.q | $ . @ $ @ . . . @ $ | #.%.'.'.&.&.*.*.*.&.*.*.&.&.=.#.k 2 w B y x B B B x B B B B B B B B B B B A 2 @ @ @ . . . . + $ @ @ * 2 A A w B B B B B B x A E y y x 3 C 2.e.f.9.9.9.9.9.9.9.0.5.1 + # @ . + = : |.9.8.8.0.u . . . + @ - + 5.9.9.9.9.9.9.9.d.d.d.0.0.j.j.9.2.S -+G+E+E+y+y+z+C+B+y+v+T.# . . . . . . - ) + a.g { - . $ * ; * % % @ > I.y+z+E+A+w+z+z+z+z+z+z+z+G+B+D.n.7+9+9+9+}+7+b+9+}+N./ . + + - $ $ $ # . . - L L ) - - % % $ $ $ + - 7.7+f+9+9+|+9+9+9+9+|+9+b+|+2+C.", -"C.7+9+|+9+}+}+}+|+|+|+|+|+|+}+}+}+f+9+9+9+C./ % % + + + . 5 $+7+|+}+9+}+}+9+9+}+}+|+|+|+|+|+9+|+|+9+n.4.d+s+s+d+l+h+k+k+k+k+k+k+~+R . # @ $ @ . - - * % ) @ @ + $ + + . . % b [+l+s+h+k+k+k+d+h+d+k+k+k+s+X.E c .Y ` U Y Y Y U U Y @.n ( * . . # @ . . . @ & & @ . . . . . . . . . . % e +. .@.` Y Y ` ` Z +.X M y O.a+(+:+:+(+:+:+:+(+F.@ . . . . . . . w.{+<+:+:+:+(+0+u.= @ . @ @ . . . [.4+:+:+:+:+:+(+^+:+(+:+4+(+_.}.#+U.Z.v.`.U.U.U.U.U.U.U.U.U.U.W.W.U.U.U.w.{ . . . . . . . a F.Z.U.W.R.U.U.U.W.R.U.U.U.U.U.U.U.U.#+).j >.'.&.=.*.=.*.=.*.=.=.=.=.%.*.=.*.=.>.q < # % @ . . . - + @ $ | O %.&.*.=.*.*.*.*.&.*.*.*.*.=.=.=.q 2 w A B B B B B B B B B B B B A A B B B A 2 % % % . . . . . . . . & & ; A B B B B B B B B A E B z x 3 | 2.d.9.9.9.9.9.f.f.0.N u + - # % $ = 1 ,.d.8.8.9.0.u . . . + + - = 5.j.9.9.9.9.9.d.0.9.e.0.f.9.e.j.2.S -+y+A+A+v+x+z+A+z+z+v+D.- - - - - ) . - H.m+x+x+x+-+[ . # & % & ; * @ a.v+y+w+w+v+w+w+z+z+w+w+w+z+v+t.n.f+5+|+}+}+}+|+|+}+N.- . @ # . + . . . - L %+2+f+8+J.5 . @ @ @ $ @ @ a C.7+|+}+}+|+|+9+|+}+9+9+}+7+C.", -"C.7+9+|+|+}+}+9+|+|+|+|+9+9+9+|+}+}+|+b+%+L . = = @ $ $ - L $+f+b+}+|+}+9+|+9+|+|+9+9+|+|+|+|+|+}+9+n.4.d+s+k+d+l+k+k+l+l+l+d+l+E.! . $ $ $ % % # ; B.n+[+E.R - + . + $ + & % R d+k+h+d+h+h+s+h+k+k+k+q+t+X.K c +.Z Z .+.Y Y Z U Z Z ` d * $ . . # @ . . . . . . . . @ @ # . . . @ . & e Y T Z @.+.X ` @.+.+.+.M y O.a+(+:+:+:+:+:+:+(+w.@ . . . . . . + w.(+3+<+3+:+4+(+u.{ . . . . . . . [.0+^+^+<+:+(+:+:+(+_+:+4+(+_.}.#+U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.w.{ . . . . . . . 8 G.U.U.U.W.U.U.U.U.U.U.U.U.U.U.U.U.U.#+}.j >.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.>.j * & % # % # - + . . . = O %.%.&.=.*.>.=.*.=.*.&.*.=.=.&.=.=.q 2 w B B B B B B B B B B B B B B B A B B w 2 ; 2 f 2 @ @ . . . . . @ $ @ h B B B B x B B B x A A z y o | 2.d.9.9.9.9.9.9.9.0.s = $ . # @ + , Q i.i.8.8.8.0.u . . . + @ # + 5.0.9.9.9.9.9.f.f.d.d.0.0.9.e.i.Q S m+F+E+F+v+y+z+C+z+D+D+z+j+ + +H.[.f 9 +x+y+F+D+w+x+'+[ @ + + + * ; @ g '+G+z+w+w+w+z+z+z+w+A+z+G+B+D.m.7+9+|+|+9+7+9+9+}+N./ . $ % $ % @ - - h.J.}+b+b+b+8+m./ + + . @ % % / n.7+}+9+|+|+|+9+|+|+|+b+}+2+C.", -"C.7+9+b+|+9+9+9+9+|+|+9+9+f+|+|+b+9+9+8+7.) - . + . # . 5 C.f+}+b+f+|+|+9+9+9+9+|+9+9+9+9+|+9+9+9+9+C.4.d+q+t+k+k+q+h+k+k+k+s+E.b + + . + + @ % b ~+s+s+s+h+d+4.@ $ + + + . + + E.t+s+h+h+s+s+s+h+h+s+h+r+*+E P .X Z Y X Y Y Y Z X Y @.` n ' * . - . . . ) - . & ; e 3 % % # . . . . ' n P X .+.Z Y @.` +.+.+.P B O.3+:+3+:+<+3+^+_+:+P.+ . . @ . . . . v.0+_+a+_+:+<+,+w.~ + . . . . + @ u.4+6+a+:+4+^+3+3+:+(+4+4+:+<.k.#+U.U.U.U.U.U.U.U.U.U.Z.W.U.U.U.U.#+U.U.w.% @ . . . . . . J U.U.W.W.U.U.Z.Z.Z.U.U.U.U.U.U.U.Z.W.#+).k >.=.'.=.=.&.&.=.*.*.=.&.&.%.,.,.#.| $ . . . + . . . + $ : 1 #.#.&.&.&.&.=.=.=.*.*.=.=.*.=.=.&.'.'.O f w B p y B B B B A w A x y y B x y B B B w x y B A w 2 % . . . . . . . @ B B B B B B B A x B B z x 3 t 2.9.j.j.9.9.e.e.9.N $ = $ $ $ = = 0 ,.N ,.N ,.N N u + . - . $ + + m O s u j.b.9.f.f.d.e.0.0.j.b.9.Q S -+D+D+y+y+z+z+z+B+v+z+C+z+z+v+F+E+A+z+v+C+z+B+x+D+z+y+W . % % % @ @ % % I.F+A+z+z+A+C+z+z+A+z+z+G+B+D.m.f+b+9+9+}+9+9+9+f+N./ $ @ # + + + $ . K.b+9+9+|+|+9+8+3.. @ $ @ @ $ @ 5 8+b+f+|+9+9+9+9+9+9+9+}+7+C.", -"C.7+9+9+|+9+9+9+}+|+9+9+9+9+|+|+9+9+f+8+7.) . . . + - - 5 $+9+|+|+f+9+9+9+9+9+9+|+9+9+9+9+|+9+9+9+f+K.4.d+r+t+s+k+h+h+t+t+k+s+E.- $ + . + . . { c.s+t+k+s+s+d+X.b @ . + $ . . $ R o+s+h+h+s+s+s+h+s+s+q+t+X.K ` .X Z Y Y Y Y Z Y Y +.+.@.P n } ' % @ % % . @ % ( e M ' % % # . . . . ' n @.Y Y U Y Y @.` X +.+.M B O.a+3+3+^+_+3+3+3+:+=++ . . @ . . + . :.(+(+<+3+:+3+0+w.{ . . . . . + ] u.3+<+<+:+4+_+4+(+:+:+(+4+:+_.}.#+U.#+U.U.U.U.U.Q.U.U.U.Z.U.U.U.U.U.U.U.w.{ . . . . . . . 8 F.Z.W.U.U.W.W.W.W.U.U.W.W.U.U.U.W.Z.#+).j >.'.'.=.*.&.&.=.%.*.=.&.&.'.%.>.| = $ + @ # - . @ @ @ < q O #.*.=.&.&.'.*.>.=.*.&.=.=.&.=.=.&.'.*.j h A B y x B B B B A w I I A z B A x x w A B B B y A I l @ . # @ . . @ . . A B B B B B B B w E B z x l C 2.e.f.9.9.9.9.9.e.N . + + + . + . . = = = = = = $ = . . . . + + + - $ , : 5.e.9.0.0.e.e.0.0.j.j.j.2.S '+F+E+x+x+A+D+z+C+v+z+z+D+C+w+A+D+E+y+y+w+z+z+B+A+w+y+r.~ @ & @ . @ % . x.y+E+z+z+z+z+z+z+z+z+z+G+w+t.m.7+9+9+9+b+}+b+b+}+2+/ @ = + . . . + 5 $+b+b+f+|+|+9+7+m.- @ @ @ % % @ L b+b+f+9+9+9+f+}+9+9+b+9+f+C.", -"C.7+f+b+|+}+|+9+|+|+|+}+|+9+}+|+|+9+7+N.L . @ . . + . - 7.7+}+|+|+9+9+|+9+9+9+9+9+9+9+|+9+}+9+9+9+7+C.4.d+r+s+d+l+q+t+t+k+k+d+c.+ + + . - - # a *+l+s+s+s+k+l+~+R + - . @ . . + b e+s+k+h+s+s+s+k+h+s+q+t+X.E P .X Z Y Y Y Y Z Z U X +.+.Y ` M M e } ( ( ( p i M @.U ' % @ . . . . @ 3 e @.Y +.Y @.Y Y @.Y +.+.M y O.a+3+:+:+:+:+3+3+(+{+$ . . . . . . + }.(+3+_+a+3+:+0+).$ + + + . . + 4 O.0+:+<+:+!+^+:+:+:+3+3+3+:+_.}.#+U.U.U.U.U.U.U.U.U.U.U.Z.U.U.U.U.U.U.U.w.{ . . . . . . . 8 G.U.W.U.U.U.U.Z.W.U.U.Z.U.U.U.U.Z.U.#+).j ,.,.'.*.=.&.=.=.*.>.*.&.$.%.O | = $ @ . . . @ @ % % m #.%.%.=.*.=.&.=.>.*.>.&.*.*.=.=.=.=.=.&.=.*.k 2 I E B x x B B B A w w w w w w A x A w z A A x y A I l @ . . . . . . . . A A B B B x B B B B B y B o C 2.d.9.9.9.9.d.9.d.N . . . - - + . . - - + . . + . - . . . + + . . + + + = ..e.d.d.e.e.e.0.0.e.e.i.2.S '+D+D+y+y+A+C+F+z+A+w+w+z+z+A+A+F+F+x+y+z+A+z+z+D+E+y+T.] # @ - . . + # x.G+z+z+z+z+z+z+z+w+z+z+G+g+t.m.7+9+9+}+9+}+f+9+}+8+/ - $ + + . + . L $+9+5+b+9+b+9+2+z.- @ . . @ @ + 5 %+b+|+|+9+9+9+f+|+9+9+9+7+C.", -"C.7+9+b+|+9+f+9+9+|+|+|+|+9+|+|+9+|+7+C.5 @ % @ . + + 5 $+7+|+}+}+}+}+|+|+9+9+|+}+|+|+|+|+|+|+|+|+9+C.4.d+s+k+d+l+s+k+k+k+s+d+R @ . $ . - @ @ b [+o+k+k+s+k+k+[+c.+ - . @ . + $ % d+h+k+k+h+h+s+k+k+d+q+t+X.K P .Z ` Z Y Y Y Z Z Z +. .U U @.@.@.Z P M M P P Z @.U Y * % # . . . @ @ d P Z X Z Z @.+.` P +. .+.M B O.a+(+(+:+:+:+(+(+:+{+9 + @ @ . . . - F )+(+:+=+(+:+0+J @ . . . . . + 4 O.3+<+:+:+:+:+3+:+:+:+:+3+:+_.}.#+U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.w.{ . . . . . . . 8 G.#+Z.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.#+).F %.'.'.=.*.=.&.%.=.%.%.*.=.q | , $ @ @ + . . % $ = 0 #.'.&.&.=.=.=.&.%.=.%.*.*.*.&.=.=.*.*.=.&.'.*.O 2 E B B B x B B A w w w w I I I I w o h w A A x y B A I 2 . . . . . @ . . A B B B A B B B A A x B B l C 2.e.9.9.9.9.f.9.9.N . + + + + + + . . . . . . - . . . . . + . + . + + - : 5.j.d.d.d.b.e.0.0.9.b.j.2.S '+D+D+y+x+z+A+w+w+w+y+y+y+x+w+x+x+x+x+x+v+A+D+E+w+A+y+T._ + + - . . . . x.E+D+w+v+w+z+z+A+w+w+z+A+w+t.n.7+9+9+}+|+|+|+|+9+2+L ) . + + . @ % L $+b+b+|+9+b+|+7+C./ % @ @ @ $ + 5 %+5+}+}+|+|+|+|+}+|+9+9+7+C.", -"C.7+9+9+}+f+9+|+9+|+|+|+|+9+|+|+9+9+8+L . + @ + + + - 5 &+7+b+9+}+|+|+|+}+9+9+9+|+|+9+9+9+|+|+|+}+f+m.4.d+t+s+k+k+h+q+h+t+t+~+R @ + + . - + + b X.l+k+k+k+s+o+[+:.. - . # . + + + d+h+k+k+k+h+h+k+k+h+q+t+*+E M +.X @.Y Y Y Z Z U Y Y U ` ` Z ` @.G Z M M U T T T Y ` & @ # . . @ @ @ d P ` +.X Z @.+.@.P Y .+.M B O.a+(+:+:+:+:+:+:+:+{+[.. . # @ . . + @ {+4+a+:+(+4+3+8 . . . . . . . F =+4+3+:+<+:+_+:+:+:+:+:+3+:+_.w.#+U.U.U.U.U.U.U.U.U.U.Z.U.U.U.U.U.U.U.U.w.{ . . . . . . . 8 F.W.U.W.R.U.U.U.U.U.U.U.U.U.U.U.U.U.W.).j >.=.&.=.*.=.&.=.=.=.>.#.#.< $ $ $ @ + . - . @ < k #.,.%.'.&.%.%.&.&.'.&.'.&.=.=.=.=.=.=.=.=.&.'.*.k 2 I E y x B B B A w A w 3 f f * * * * * f B y A x A I l ; @ . . . . # . @ B B B B B B B B A I E x x h | 2.e.9.d.d.d.9.9.d.N . + . + + . + + . . . . . . . # . . . . . . + + . . : 2.e.d.f.d.8.d.0.0.e.b.j.2.S -+G+A+z+y+z+A+z+z+y+x+x+'+'+T.T.H H ] v+z+A+A+A+w+w+y+H.[ . + - . . # + I.E+D+z+y+z+z+z+z+w+z+z+A+w+D.m.f+5+9+9+9+9+|+|+|+}+n./ . + . + @ @ / $+7+9+9+}+|+|+7+n.- @ + . @ % @ L b+b+|+|+}+}+9+9+|+|+9+9+f+C.", -"C.7+9+b+|+|+|+|+9+|+|+9+9+|+|+|+b+b+%+L # % @ @ + + - L 8+b+b+}+}+9+9+|+|+}+9+}+|+|+9+9+}+9+|+|+|+9+K.4.d+q+s+d+l+h+l+k+e+s+s+c.+ @ @ . - + @ & E.l+k+h+k+s+s+d+b . . . . . . $ b d+h+k+h+h+s+s+h+h+s+q+t+X.K P .Z ` Y Y Y Y Z U X @.M n n n n e e } } M .T T .M e % # . . . @ % * M U +.X U Z Z +.@.` X +.+.M B O.a+3+(+(+:+3+:+:+(+_+v.. @ . % . . + + w.0+3+4+4+{+w.{ . . . . . . . [.0+0+3+<+:+3+3+(+(+:+:+(+4+:+_.}.#+U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.Z.Z.U.U.w.{ . . . . . . . J U.U.U.Z.W.U.Z.Z.W.Z.U.W.U.U.U.U.U.U.#+).j >.=.=.=.*.=.&.=.%.>.>.#.k $ @ # @ @ . . . $ | ~.l.>.*.*.>.#.%.>.*.*.%.#.&.&.=.=.=.=.=.=.*.=.&.&.*.k h I A B x B A A B A h ' * % % % % % % * l w x z B x w w @ # . . . . . + @ A B B B B B B B B A B z B o | 2.d.9.9.f.9.9.f.d.N . . . - # . - . - - - . . . . - . . . . . + + + + + = Q d.d.0.9.b.9.0.0.i.j.j.2.S '+D+D+y+x+w+A+z+F+m+I.{ { > > > - + $ I.x+y+E+E+z+B+x+a.> + - . . . . g >+z+A+G+z+A+z+z+z+v+z+z+G+B+t.m.f+b+9+9+}+f+b+b+|+2+&+/ . . . + @ % - z.7+f+}+|+}+}+8+3.# % + . . $ . L f+b+|+|+9+9+9+9+|+|+b+7+7+C.", -"C.7+9+b+|+9+9+9+9+|+|+|+9+9+|+|+9+9+K.L # $ @ . . + / J.7+5+b+|+7+9+9+9+f+f+9+f+9+9+9+9+f+|+9+9+b+f+C.4.d+r+s+k+s+q+r+s+k+k+s+E.# + # . . + = % I d+s+k+k+k+l+E.@ + . + $ . + @ R s+s+h+s+h+s+s+h+h+s+q+t+X.E M +.X Z Y Y Y Y Y Y Y P } ; ' ' ; * % & ' n Y . .` n ' @ . . . . @ & 2 M Z +.Y U Z Z +.@.` X +.+.M A O.p+3+:+(+3+3+:+3+:+{+{+@ - . # + . . + 9 (+0+0+4+1+F . + + . . . . % w.0+4+4+:+^+^+3+4+3+:+3+3+3+:+[.k.#+U.U.U.U.U.U.U.Q.U.U.U.W.U.U.U.Z.W.W.U.w.{ . . . . . . . 8 R.#+W.U.U.W.W.Z.Z.W.W.Z.Z.U.U.U.U.Z.#+).j >.'.=.=.=.=.=.=.*.=.=.q < @ @ . . # . . + + @ $ , , , , = = = = = , , | #.%.=.=.=.=.=.=.=.=.&.=.*.O 2 I A B B B B A B A w 3 % @ @ # @ # . @ * w B B B B l 2 % . . . . . . . f A B B B B A B B B B B y y l C 2.d.9.9.d.9.9.f.9.N . + + + + + + + + + + + @ + + + . . . . . + + + $ = : Q b.9.0.f.d.9.0.0.9.b.9.2.S '+F+D+z+B+z+E+z+D+y+j+% + $ % @ $ $ @ g x+x+z+A+x+x+'+[ # % % @ . . @ ].m+D+A+G+y+z+z+z+z+A+G+G+G+g+t.C.7+9+b+}+9+9+b+b+|+}+8+5 @ + . . . @ + L 2+f+7+f+}+f+K.L @ @ . - . @ - n.7+b+9+9+9+9+f+b+|+9+9+9+2+C.", -"N.7+9+b+|+9+f+9+9+9+|+9+9+f+9+|+9+9+C.5 % % @ @ + + 5 N.9+5+b+9+f+9+9+|+9+9+9+9+|+9+f+9+9+}+9+9+9+9+C.4.d+q+s+d+k+q+s+k+k+k+s+E.! + . . + $ = % * c.d+u+r+s+E.& % = + + $ . + + c.t+s+h+s+s+q+q+k+h+d+q+t+[+-.P .X Y Y Y Y Y Y Y Y M l * & # @ + - + @ } P T +.P ' . . + + + . @ + f M +.+.+.Y Z Y +.Y @.+. .+.M B O.a+3+3+(+:+3+:+3+_+_+{+J . @ . . . . . ~ H u.v.s.4 $ + + . . + . . 4 O.0+3+a+<+:+4+4+4+4+:+:+3+3+:+_.}.#+W.U.U.U.W.W.U.W.U.U.U.U.U.U.U.U.U.U.U.w.{ . . . . . . . 8 R.#+U.W.W.U.Z.W.W.U.W.U.W.U.U.U.W.Z.#+}.j >.'.&.=.=.=.=.&.=.*.#.k * @ . . . . + + + . . + + + + @ # - # & & % % 7 q.%.=.=.=.=.=.=.=.=.&.&.*.k h A B p y B B B A A A ( ; . # . . @ @ + * 3 y y y B h ; & @ . . . . . . 8 B B B B B B B B B B B z y f C 0.b.9.9.d.9.9.9.9.2.| j 1 C 1 1 1 C 1 1 1 1 C : 1 : + . $ # + $ @ 4 k t s i.8.9.0.f.d.d.0.f.j.j.j.2.u '+G+A+y+y+A+D+z+D+y+j+a.# % & & % * + + W v+G+A+B+-+9 + + % % @ . . + +x+D+A+G+z+z+z+z+z+z+y+G+C+w+D.n.f+9+9+|+f+7+9+5+9+}+8+C.) . . @ @ $ $ ) L ;+9+9+9+;+h.) @ @ . - - + 8 A.f+b+}+|+9+9+9+b+}+9+9+9+f+C.", -"C.7+9+|+|+}+}+|+}+9+|+}+|+9+}+|+b+f+7.. $ $ $ $ + $ 5 %+9+b+|+}+}+|+|+|+}+|+|+9+|+|+|+|+|+|+|+}+|+f+n.4.d+s+s+k+k+h+h+k+k+k+l+n+c.# + + + + . @ # # ! b R b { @ @ + - + $ = % ; ~+e+k+d+k+k+k+k+d+k+k+q+r+X.E M +.Y @.Y Y Y Y Y Y X ` d ' * . . - . @ @ * ' 2 ; ' % % @ - - - . & } M Z X Y Y U Z Y Y @.` @.+.+.P A P.a+4+<+:+<+:+:+:+(+:+4+P.@ - . + @ + . + + ~ ~ + + % % @ @ - . . + s.<+(+:+:+:+:+:+(+:+(+:+(+(+0+:+<.k.#+U.U.U.U.U.U.U.Q.U.U.U.U.U.U.U.U.U.M.U.w.{ . . . . . . . 8 M.`.W.V.++W.W.U.W.R.U.U.W.Z.R.U.W.U.#+).j *.'.'.%.=.=.%.%.%.%.O , @ # . . . . + + + . . . . . . . # . # # - . @ = O |.*.*.=.=.=.=.*.=.=.&.*.k 2 w B y x B B B A B B x * . . . . # # + @ % * & * % % % @ @ . . . @ % 2 I B B B B B B B B B B B z y o C 2.d.0.9.9.9.f.9.9.f.i.i.0.0.0.0.0.0.0.2.2.i.0.i.2.N + . . . + . @ t 5.i.0.0.9.d.f.f.d.d.0.0.9.b.j.2.S '+F+A+z+v+z+A+A+E+E+v+j+% @ % ; % % + # + [ W W g [ - . . @ @ % @ + W m+y+z+A+A+w+z+z+y+w+v+v+z+z+B+t.n.f+9+|+}+|+|+|+|+}+}+f+|+n.# % % % $ @ . - ) W ].5 / - - . % * % @ - L 8+}+f+|+}+|+|+|+}+|+}+9+9+7+C.", -"C.7+9+|+|+}+}+|+|+|+|+|+|+|+}+}+b+;+L . @ % # . % % 5 $+9+|+|+}+|+|+|+|+|+|+|+9+}+|+|+|+|+|+}+|+9+9+C.4.d+r+k+k+k+k+h+s+e+k+h+l+S.b . - . + . + + + . - . . + - - . + + + % % E.l+k+h+d+k+h+h+h+h+d+d+q+t+X.K M +.X Z Y Y Z Y Y Y Y Y P i ' # . . # % @ . $ @ . # # @ @ . . . @ ( c G +.Y Y Z Y Y Y Y @.` X +.+.c B O.a+4+<+:+:+(+_+:+:+<+(+{+[.+ + + @ + . . @ + . # . % @ # . + . # J O.<+:+:+:+:+:+(+(+(+:+(+(+(+4+:+<.}.#+U.Z.U.U.U.U.U.R.U.U.U.U.U.U.#+U.U.R.W.w.{ . . . . . . . 8 R.W.U.Y.Y.W.W.U.U.R.U.U.U.U.R.U.U.U.#+).j >.'.=.*.*.=.'.'.%.#.| = . . . . . . . . . . . . . . . . . . . . . . @ , %.,.=.*.=.=.=.=.=.=.=.'.*.k 2 w B B B B B B B B B B l % @ . . . . . . . # . # . @ # . . . . @ $ ; h A B B B B B B B B A B B z x 3 C 2.e.f.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.0.9.9.e.9.Q + . - $ $ - = 5.j.9.e.9.9.f.9.9.d.d.0.0.9.d.i.2.S -+F+A+A+v+y+A+A+A+w+w+x+x.% $ * @ @ . . . . - - % @ # @ @ # @ % @ H '+x+y+w+A+z+w+w+z+z+z+w+A+z+z+v+D.n.f+b+|+|+|+}+}+}+|+}+9+|+;+{ @ # @ @ + @ @ + + . . . + . . @ % $ . L &+}+|+b+|+|+}+}+|+|+|+}+9+9+2+C.", -"C.7+b+b+}+}+f+9+}+}+|+9+9+9+|+|+9+K.L # % % . . % @ L 2+}+|+|+9+9+9+9+|+9+9+9+9+|+9+9+9+9+|+|+9+9+f+C.4.d+q+s+d+h+h+t+s+k+k+l+l+l+B.* @ . @ $ $ = $ . - . . . . . . + + . . 4.~+l+s+h+l+s+h+h+h+h+h+k+q+t+*+K P +.Y @.Y U Z Z Y Y Y @.@.M } % # . . @ @ + @ @ - . . . @ @ % & ( e ` Y Y Y Y Y Y Y Y X @.` X +.+.M x O.a+(+:+:+(+3+(+:+:+<+(+(+)+F + + . @ . . @ @ # . @ # . @ @ . + 4 V.4+:+3+:+:+:+^+^+<+4+(+{+3+3+3+(+<.k.#+Z.Z.U.U.Z.W.U.U.U.U.Z.Z.U.U.#+U.U.W.W.w.{ + + . . . . . 8 G.W.W.U.U.U.W.W.W.R.U.U.Z.Z.U.U.U.Z.#+1.j >.=.&.=.*.&.'.&.%.q , @ - . . . . . . . . . . . . . . . . @ $ + # @ @ = #.&.=.=.=.=.&.=.=.=.'.=.*.k 2 I E y x B B B B B B B w 2 * @ @ @ . . + . . . . . . . . . . . % ; 2 w A B B B B w A B B B w x y y 3 | 2.e.9.9.9.9.j.9.9.9.9.j.9.9.9.f.9.9.9.0.f.0.9.j.0.Q $ + . $ . - $ ..j.9.j.j.f.9.9.9.e.e.0.0.j.j.i.2.S m+F+D+z+v+y+z+C+z+A+y+B+j+a.% @ @ $ @ @ @ @ # # ; % & % % @ @ # g '+x+y+z+E+E+z+z+z+z+z+z+z+z+z+G+B+t.m.7+9+9+b+9+f+9+}+}+f+9+9+9+J.5 + - . + $ $ @ @ @ # @ @ @ $ + . - L &+2+}+b+b+}+|+}+9+9+7+|+9+9+9+7+N.", -"N.2+9+9+|+}+9+9+f+}+|+9+9+}+|+9+7+N.5 @ @ $ + + . - 7.7+9+9+}+f+b+f+f+|+9+9+|+9+9+9+9+f+9+9+|+9+9+f+N.4.d+q+s+l+s+h+s+t+s+k+l+l+l+~+E.b % @ @ @ + $ $ $ @ + $ $ + + @ @ ! E.e+o+k+k+s+h+h+k+s+s+h+h+s+q+t+X.K P .Y Z Y Y U U U Y Y X .Y e i ; @ % @ . - . . . . . . @ * ' i M P @.@.Y X Z Y U Z Y X @.` +. .+.M B O.a+3+3+:+3+3+3+3+:+:+p+(+0+=+}.+ + # + . + @ . @ . + . $ . . J V.0+4+:+3+3+3+:+^+3+3+(+4+_+^+(+3+{+[.}.#+U.U.R.U.Z.W.U.U.U.U.Z.W.U.U.U.U.U.U.U.w.{ + + . + + . . 8 M.#+Z.U.U.U.W..+W.Z.U.U.W.W.U.U.U.W.#+}.j >.=.&.=.*.=.'.'.'.q = $ @ . @ @ @ # @ @ # @ @ @ @ @ # @ @ @ $ $ @ % % = #.&.=.=.=.=.=.*.&.=.=.*.>.k 2 w A y x B B B B A A B A w l ; * @ . . . . . . . . . . . @ % % ; o w w A B B w B B B B B A A x z y l 7 2.e.9.9.9.9.j.j.j.9.9.9.j.9.9.j.j.j.9.j.0.j.j.i.0.Q + - . . . ) . ..j.9.9.j.j.j.9.j.e.e.0.0.9.e.i.2.S -+G+E+F+y+y+z+z+z+z+y+F+x+x+x.] . @ @ @ $ $ & & * % % @ @ . . W '+x+y+z+z+z+z+z+w+z+z+z+z+z+z+z+z+x+D.m.7+|+9+9+9+9+7+9+}+9+9+}+9+8+n.h.) - - @ $ @ @ @ @ @ @ @ % @ - L N.2+9+9+5+b+9+|+}+9+9+}+9+f+9+9+f+C.", -"C.7+b+b+9+}+9+9+9+9+|+|+9+9+|+9+7+n./ . . . + . . ) n.f+9+9+}+}+f+9+|+|+|+9+|+9+|+|+9+|+|+|+|+9+}+f+C.4.d+s+s+l+h+s+s+s+s+k+h+l+k+l+n+X.c.b # . @ + + @ % @ @ + . . b R X.d+h+t+s+s+h+k+k+h+h+h+k+k+k+h+t+X.K P +.X Y Y Y Y U Y Y Y +.T +.` n i o ' % @ @ @ * @ @ @ * * ( e M Y X Z U Y Y Y U Y Y Y X @.@.U +.+.c A O.a+3+:+(+:+:+:+:+:+_+4+:+4+0+{+O.F @ . . + . . # . . . ] F u.V.{+4+(+:+3+3+:+:+:+:+(+3+4+_+(+(+4+^+v.:.#+U.U.R.U.W.Z.U.U.U.U.U.W.U.U.U.#+#+U.M.}.{ . . . . . . . 8 M.U.U.W.R.U.W.W.W.U.U.U.U.W.U.U.U.W.#+k.j >.*.%.=.=.=.=.&.#.q % @ @ @ . @ # @ # # @ # . @ @ @ @ @ # @ $ $ + + @ , *.&.*.*.*.*.=.*.=.&.=.=.*.k 2 w B y x B B B B A A B x x w w 3 * @ @ . . @ @ . @ @ @ @ ; ; 2 l I I A I B A A B B B B B A B B z B l C 2.e.9.9.9.9.9.9.9.9.9.f.j.j.9.9.9.9.j.j.f.9.j.e.0.N = + . $ $ . + ..0.9.j.9.9.9.9.9.e.e.0.0.e.e.i.2.S m+y+E+E+y+y+z+C+z+y+z+C+B+B+v+'+J g + @ @ @ @ @ @ @ @ . + W T.j+x+B+w+w+z+z+z+z+z+z+z+z+z+z+z+z+G+x+t.m.7+9+9+}+}+9+f+|+|+}+|+7+9+}+7+%+n.L - . - . # . # . + . ! 5 n.$+2+7+}+|+b+b+}+9+f+9+f+f+}+9+9+9+7+C.", -"C.7+|+9+|+}+}+9+|+}+|+9+9+9+|+|+f+%+J.z.A.z.J.J.z.J.;+9+9+|+}+}+f+|+}+}+|+9+|+|+|+}+|+}+|+|+|+9+|+9+C.4.d+r+s+d+d+k+k+l+d+l+d+l+k+s+s+l+[+~+E.c.c.R R R 4.R R c.E.E.X.[+l+k+t+s+s+k+h+d+k+h+h+h+d+k+s+s+r+X.E P +.Z @.U Y Y Y Y Z Z +. .+.Z P n e d i ( ( ( } ( ( ( ( i n P Y . .Y @.Z Y Y Z U U Y Y ` ` @.+.X M x O.a+(+:+:+:+:+(+(+:+:+^+3+:+(+3+4+O.w.u.}.F F F F F C q.O.O.{+{+(+<+:+:+:+(+(+:+:+:+:+(+(+(+:+:+4+^+/.}.#+U.U.R.U.W.U.U.R.U.U.U.U.U.U.U.U.U.U.W.M.q.k.w.w.w.w.w.}.w.W.U.U.U.U.U.Z.U.U.U.U.U.U.Z.U.U.U.U.#+).j %.%.'.=.=.=.=.&.#.#.O k j j j j m m j j j k j j j j k j m j j j j j j j &.&.*.*.&.=.=.*.*.=.=.=.%.q 2 A B y x B x B B B B B x y x A A l l l * * ; ; * ; * 2 2 l l A A A w A A B A B B B B B B B w A y y l C 2.e.9.9.9.9.9.9.9.9.9.9.9.9.f.9.9.9.9.9.9.j.e.9.f.N ..t ....Q t N i.9.f.j.9.9.f.9.9.d.d.0.0.j.j.j.2.S -+y+A+A+v+y+z+A+z+v+w+z+v+y+y+y+j+j+T.a.a.W a.a.a.a.a.I.T.m+x+x+B+z+A+A+A+A+z+y+y+z+z+z+z+w+w+z+z+y+t.n.f+b+|+}+}+9+|+}+|+}+}+}+}+b+9+f+2+%+N.m.m.7.L L L L L m.A.N.}+7+}+}+|+|+9+|+}+}+9+}+}+|+|+}+9+9+2+C.", -"C.2+|+b+|+}+}+9+|+}+|+9+9+9+|+}+9+b+7+2+2+f+9+9+7+7+9+b+b+}+}+9+b+|+}+}+|+9+|+|+|+|+|+|+|+|+|+9+9+9+C.4.d+s+k+k+d+k+k+k+d+d+l+k+s+t+k+k+s+s+t+d+d+[+[+[+[+[+[+d+n+n+n+l+l+s+s+q+s+k+h+l+h+h+h+h+k+k+k+q+t+X.K c .Y ` Y Y Y Y Y Z Y Y Y X +.+.Z ` P M M M M M M M M P M P @.X .+.Y ` @.Y U Y U Z Y Y @.` Y +.+.M B O.a+(+:+:+:+(+:+(+:+<+^+:+^+<+(+4+1+4+:+{+O.=+{+P.P._+{+0+(+(+<+a+<+:+:+:+(+:+:+:+:+(+(+(+(+{+(+3+=+_.}.#+U.U.R.U.U.U.U.R.U.U.U.U.U.U.U.U.U.U.U.U.W.#+U.U.U.#+#+M.M.#+U.U.Z.W.U.U.Z.U.U.U.U.U.U.U.U.U.U.#+).j %.'.'.%.=.*.=.&.*.>.q *.*.>.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.#.>.>.>.#.#.&.&.=.*.=.=.*.*.*.&.=.&.*.k 2 w B y x B B B B B B B B x x B x B A w w w l h o l l l w x x B B z A A x B B B B B B B B A A A y y f C 2.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.j.9.9.j.e.j.f.2.j.i.j.e.9.i.0.8.d.9.9.9.9.9.f.9.d.d.0.0.9.e.j.2.S -+F+A+z+v+y+z+A+y+y+v+v+z+z+w+z+F+x+F+m+m+m+m+j+m+m+v+y+y+z+y+y+z+z+w+z+z+w+y+y+w+w+z+z+z+w+w+z+z+B+t.n.7+b+|+}+|+}+|+|+}+|+}+|+|+b+b+|+9+9+f+2+2+%+%+%+%+%+;+2+2+7+9+|+|+|+|+|+f+|+}+}+}+}+|+|+|+}+9+9+7+C.", -"C.2+9+9+|+}+}+}+9+|+|+9+9+9+}+}+b+5+9+}+b+5+5+b+}+7+}+b+b+|+2+f+9+9+}+}+|+9+9+}+}+9+9+9+|+|+}+|+9+9+C.4.d+r+t+k+k+t+s+s+d+d+s+t+t+s+k+k+h+s+s+q+q+q+q+q+k+s+t+q+t+s+t+u+h+h+l+l+h+q+h+h+l+h+s+l+h+s+s+r+t+X.E P T +.@.Y Z Z Z Y Y Y @.` Z +. .T .Z ` +.X +.+. .Y +.+.@.@.Y +.+.Y Z @.Y Y Y Y Y Y Y X @.` Y +.+.M A P.a+:+:+:+:+3+:+3+:+_+_+:+4+<+:+4+<+<+:+:+<+3+6+:+:+4+{+4+(+:+6+a+<+:+:+(+(+3+:+:+:+:+4+(+(+(+(+3+:+[.}.#+U.U.`.U.U.Z.U.U.U.U.U.U.U.U.U.Z.W.W.U.U.#+U.U.U.U.U.#+Z.U.#+U.U.Z.R.U.U.U.W.U.U.U.U.W.R.U.U.U.#+).j >.'.'.*.=.=.=.>.*.&.=.&.!.{.%.'.'.'.'.'.'.'.'.'.'.=.'.'.'.%.>.>.'.%.>.*.&.&.&.*.*.=.=.=.*.=.=.=.>.k 2 o B x B B B B B B B B x y x x z x B x x w A x A B A x A y y z y x z B A B B B A B B B B A B B y B l C 0.d.0.f.9.9.j.9.9.f.f.j.9.9.9.9.9.9.j.9.9.e.e.9.0.0.j.0.9.8.9.f.0.8.9.9.9.9.9.9.9.9.d.e.0.0.9.b.j.Q S m+G+A+z+y+y+z+E+y+v+z+B+z+z+A+A+E+E+E+D+E+E+z+F+E+A+C+z+C+z+z+z+z+z+y+y+y+y+y+z+z+z+z+z+z+w+z+z+z+y+t.m.9+|+|+}+|+}+}+7+|+|+f+}+9+}+f+}+9+|+9+|+9+b+b+b+b+b+b+9+b+|+9+b+9+|+|+7+7+f+|+}+|+}+9+9+|+|+9+9+7+C.", -"C.7+9+b+|+}+}+9+9+|+|+9+9+9+|+|+9+b+b+9+9+b+b+b+9+}+|+b+9+|+7+}+9+9+|+|+|+9+9+|+|+9+9+9+9+|+|+9+b+9+n.4.d+r+t+k+l+t+t+s+k+k+t+t+t+t+k+s+t+t+s+s+s+r+r+r+k+s+t+s+t+s+t+q+r+s+k+s+t+s+r+k+s+r+t+t+s+s+l+r+r+X.-.P T +.+.+.+.+.+.+.+.+.X X +.+.+. . .+.+.+. . .+. . . . . .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Y @.Z +.+.M A O.3+4+4+:+:+3+4+3+:+^+^+3+3+:+:+(+4+:+<+:+:+4+3+<+:+:+(+4+:+<+3+:+:+(+:+(+4+3+:+:+(+4+4+(+(+4+4+4+:+<.}.#+U.Z.U.U.U.Z.W.U.U.U.U.U.U.U.U.Z.W.U.U.U.#+U.U.Z.U.U.U.U.U.U.U.Z.U.U.U.U.W.W.U.U.U.U.W.W.U.U.U.#+).j >.'.'.=.=.&.&.*.&.&.&.&.{.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.=.=.=.'.=.&.&.&.&.&.&.&.&.&.&.=.=.=.*.O 2 A z B B B B B B B B B x y y x x B B x x A x x B x B x x x B y x B x B A B B B B B B B B w w A x B 3 C 0.d.e.d.d.e.d.9.e.d.d.e.b.d.d.d.d.e.e.d.9.8.d.d.f.d.e.d.9.8.8.9.9.8.d.j.j.e.j.e.e.e.e.9.f.0.j.j.i.Q S g+D+D+A+E+z+E+A+C+A+A+G+C+C+A+A+D+C+D+D+D+D+C+C+A+E+C+C+C+A+A+A+C+C+z+z+C+G+z+E+A+A+C+C+A+A+A+C+C+y+D.C.9+b+9+}+9+9+9+f+9+|+9+}+9+}+}+}+9+|+|+|+9+9+b+b+9+b+b+b+9+b+b+9+b+9+|+f+f+f+9+|+9+|+9+9+|+9+b+9+7+C.", -"C.7+9+b+|+}+f+9+f+|+|+}+9+9+9+9+9+}+9+9+}+9+f+}+9+9+9+9+}+|+|+|+f+9+9+|+|+9+}+9+}+9+}+9+9+}+f+9+f+9+C.4.d+r+s+l+d+s+r+s+s+s+s+r+r+s+k+k+r+s+s+s+s+r+s+t+k+s+s+s+k+k+k+k+r+r+k+t+r+k+s+s+s+t+s+r+s+k+u+q+r+X.K P +.Z U +.+.+.+.+.X X +.+.+.+.X X +.+.+.+.X +.+.X +.X X +.X +.X X X X X X +.X +.+.X X +.X Z Y +.+.M y O.4+4+(+(+3+4+4+:+(+^+3+3+3+:+:+4+4+4+3+3+4+4+4+3+:+3+4+4+3+:+4+4+4+3+:+4+4+4+3+:+:+4+4+(+(+4+4+4+:+<.}.,+U.U.U.U.U.#+W.U.U.U.U.U.U.U.U.W.W.U.U.U.U.Z.U.W.Z.U.U.U.U.U.W.W.U.U.U.U.Z.U.U.U.U.U.U.U.U.U.U.#+).7 %.'.&.&.=.=.'.&.=.&.&.&.=.%.=.&.=.=.=.=.&.=.=.=.=.=.=.&.&.&.&.&.=.=.'.&.&.=.=.=.=.&.&.&.&.=.&.%.'.O 3 x w A x B B B B B x B B x x B B B B B B B B B B B B B B x B B B x B x B B B B B B B B x E w x x B l C 2.9.9.d.d.9.d.9.9.d.d.9.d.9.d.d.d.f.d.d.d.d.e.9.d.d.f.d.9.d.d.e.9.d.e.e.e.e.e.e.e.9.e.e.9.j.j.j.j.2.u '+F+E+E+A+z+A+z+C+z+z+z+C+z+z+z+A+A+E+z+z+z+G+C+A+z+A+C+z+w+z+z+G+C+z+z+z+A+A+z+z+A+C+z+z+A+z+C+C+x+t.C.f+b+b+}+}+9+f+9+f+}+9+9+9+}+}+9+f+f+|+}+9+9+9+9+}+}+9+9+}+|+9+}+9+f+|+9+9+f+9+|+}+|+9+}+|+9+5+9+2+C.", -"N.2+9+|+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+9+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+f+N.4.d+r+s+k+l+l+l+l+l+l+l+l+l+l+l+d+l+l+l+l+l+l+l+d+d+l+l+l+k+d+l+d+l+l+d+l+l+k+l+l+l+l+l+l+l+d+l+h+t+X.K P +.@.` @.@.` @.` ` ` ` ` ` @.` ` @.` ` ` ` ` ` ` ` ` ` @.` ` ` ` ` ` ` ` ` ` ` @.` @.@.` @.Y +.@.n x O.a+:+:+(+:+:+(+(+:+^+:+(+3+:+:+(+:+(+(+:+(+:+(+:+:+3+(+(+(+:+(+(+:+:+:+:+(+:+:+:+:+:+(+(+(+(+(+:+(+<.k.#+U.U.U.U.U.U.Z.R.W.U.U.U.R.W.U.W.U.U.U.U.U.U.W.W.W.U.U.U.Z.U.W.W.W.R.U.U.U.Z.R.U.U.U.U.U.U.U.U.Z.O C ,.%.'.=.=.%.=.%.#.%.>.*.*.%.>.*.>.*.>.>.'.*.>.>.>.*.*.>.*.>.*.#.%.=.'.*.>.*.*.#.*.>.>.#.>.%.=.%.%.q 3 w w A x B B B x x x A B B B A B B B B B B B B B B B B B x x B B B x B B x A B B B B B A B A x x B l C 2.d.f.0.f.f.0.f.0.0.0.f.0.0.0.0.0.0.f.f.f.0.9.0.0.f.f.9.0.f.0.9.0.0.0.0.0.0.0.0.0.0.f.9.0.0.j.j.i.2.S -+B+y+z+z+y+z+w+z+y+y+y+y+y+w+y+y+y+y+y+y+y+y+y+w+y+y+y+x+v+y+y+y+y+y+y+y+y+y+y+z+y+y+y+y+w+y+y+G+B+x.n.7+9+9+}+}+}+7+}+}+}+|+}+}+}+}+}+}+}+}+}+}+}+|+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+9+2+2+N.", -"C.2+|+}+}+}+}+|+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+f+}+}+}+}+|+}+}+}+}+}+}+|+}+}+}+}+}+}+|+}+}+}+f+n.4.d+r+k+l+d+l+l+l+d+l+l+l+l+d+l+l+l+l+d+d+d+l+l+d+d+l+l+d+k+d+l+d+l+l+d+d+l+s+l+d+l+d+l+l+l+l+l+h+t+X.-.M +.@.` ` ` ` P ` ` ` ` @.` ` ` ` ` ` P ` @.` ` ` ` ` ` ` @.@.` ` @.P ` ` ` @.` ` ` ` ` ` @.U X @.n A O.a+:+:+=+:+:+:+(+:+(+(+(+:+(+:+:+:+(+=+<+:+:+(+:+(+:+(+:+(+(+:+:+:+:+:+(+:+:+:+=+:+:+(+:+:+(+:+(+(+<.}.U.U.U.U.W.U.U.U.R.U.U.U.U.R.U.U.Z.U.U.U.U.Z.U.W.Z.U.U.U.U.U.U.U.U.W.R.W.W.U.W.R.U.U.U.U.U.U.Z.Z.#+~.j %.%.'.*.=.>.>.*.>.%.>.*.*.*.>.*.>.>.#.#.%.>.>.>.>.*.>.>.*.#.*.#.#.*.>.*.>.*.*.#.*.>.>.#.>.*.%.*.>.k h I B A A B B B B B B A A B B A A B B B B B A A B B B B A B B B B B B B B B A B B B A A E B A x x B l C 2.d.f.0.0.f.0.0.0.0.0.0.0.0.f.0.f.0.0.0.i.0.f.0.f.0.f.f.0.0.0.f.0.0.i.0.i.0.0.0.0.0.9.d.9.0.9.9.i.2.S -+x+y+z+y+B+y+v+y+y+y+y+B+y+y+y+y+B+B+v+y+B+B+y+y+y+y+y+y+y+y+z+y+y+v+v+y+y+y+y+y+B+y+y+y+y+y+y+y+B+x.n.2+9+}+}+}+}+|+|+}+}+}+}+f+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+}+|+}+}+}+}+}+}+}+}+}+}+}+|+}+}+}+}+7+2+2+N.", -"C.7+9+9+|+}+9+b+9+|+9+9+|+|+|+b+b+9+9+b+9+9+9+9+|+|+b+9+|+|+|+|+9+9+9+|+b+9+9+9+|+|+b+b+9+|+|+9+9+f+C.4.d+t+t+s+s+k+s+s+s+s+s+t+s+k+k+s+s+k+k+k+h+h+s+k+k+k+s+s+k+h+h+k+s+s+h+k+t+s+h+k+k+s+k+t+e+k+l+q+r+X.K P .U U +.+.Y @.Y X X Y +.Y @.+.X X +.Y X U Y X X +.+.+.Y +.U Z Y +.Y X X X +.Z X Z Y X X Y Y +.+.c x L.p+4+:+:+(+4+4+:+:+(+(+3+3+:+:+3+:+:+(+:+3+:+4+:+(+(+4+4+:+:+^+^+:+(+:+:+3+(+:+:+(+4+4+(+(+4+(+4+:+_.}.W.U.U.U.U.U.U.W.U.U.U.U.U.U.U.U.W.U.U.U.U.W.#+U.U.U.W.W.U.U.U.U.Z.U.U.W.W.U.U.U.U.U.U.U.U.U.U.Z.#+).j l.,.&.=.*.*.*.=.=.*.=.=.=.*.*.=.*.*.*.*.*.*.=.*.*.*.*.=.=.=.=.=.*.*.*.=.=.=.=.*.*.=.=.=.=.=.%.=.*.j h A A A B B A A B A B B B B A A A B A A A A B A A A B B A B B B B B B B A B A B B A A A B E A z x B l C 2.f.9.9.j.9.9.e.e.9.9.0.0.9.9.e.9.f.9.9.9.e.9.j.9.9.9.9.9.9.9.9.9.e.e.0.j.d.d.9.9.9.e.e.9.9.j.j.j.2.S >+B+E+A+w+F+z+A+z+z+z+z+z+z+z+z+w+z+z+w+z+z+z+E+z+z+z+z+z+z+z+z+z+z+A+w+z+z+z+z+z+z+E+z+y+y+z+z+A+y+D.C.f+b+}+}+|+9+9+9+|+}+9+9+9+|+9+9+b+|+|+|+9+|+|+|+|+9+9+9+|+|+9+b+9+9+|+9+b+b+9+|+|+9+9+b+}+|+|+7+2+C.", -"C.7+b+5+9+}+9+b+b+b+b+9+9+9+|+b+b+9+9+b+9+9+b+b+|+|+b+b+9+|+|+|+b+9+9+b+9+b+9+9+|+9+b+b+9+9+9+b+9+f+C.A.d+r+t+t+s+s+t+t+t+s+s+t+t+s+s+t+t+t+s+s+s+t+s+s+s+t+s+o+t+s+s+s+s+t+s+s+r+t+s+s+k+t+s+t+s+t+s+q+u+S.p U T +.+. . .+.+.+.+.+.+.+.+.+. . .+.+. .+.+. .+. . .+. .+.+.+.+.+.+. . . . .+.Y X +.+.+.+.X +.+.+.M x V.p+(+(+<+:+4+^+(+:+:+:+:+3+:+:+3+3+4+(+(+:+(+(+:+3+:+4+(+:+^+^+4+:+:+:+3+3+3+(+:+(+4+4+(+{+4+4+3+:+_.}.#+#+U.U.U.#+U.W.U.U.U.U.#+U.U.Z.W.W.U.U.Z.W.W.U.U.U.W.W.Z.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.#+).j O ,.&.'.*.=.=.'.=.=.=.'.=.%.'.=.&.=.=.=.=.=.=.=.=.'.=.'.=.=.=.=.=.=.=.'.'.=.&.=.&.'.*.&.=.'.,.%.>.k h A B B A A A w A A A A A A w w A A A A w A A A w A A A A A A A A A B A A B w A A A A A B w w z x B o C 2.d.e.e.e.e.e.d.e.e.e.j.e.d.e.d.b.e.j.9.e.b.b.e.e.e.e.b.e.e.e.e.j.d.b.e.e.b.e.9.e.e.e.9.9.9.j.j.j.2.S m+F+E+D+E+E+D+D+A+A+A+E+E+D+A+E+z+E+E+A+A+E+E+D+w+A+z+z+E+E+A+E+E+E+A+A+z+E+E+E+A+E+E+E+E+w+E+F+E+v+D.N.9+5+|+}+|+9+b+b+|+9+b+b+b+|+|+9+9+9+|+|+9+9+9+9+|+b+b+9+9+|+9+b+9+b+|+9+b+b+b+|+9+|+9+b+|+9+5+9+2+C.", -"N.2+9+b+f+7+7+9+f+f+7+7+f+9+f+f+f+7+7+f+f+f+f+7+7+}+f+9+f+f+7+f+9+9+f+f+7+9+f+7+f+f+f+9+7+f+f+9+7+7+n.y.d+q+r+s+l+s+q+t+t+s+s+s+q+q+r+r+s+r+s+s+r+s+r+t+r+r+s+t+t+s+s+s+q+r+s+s+u+t+s+s+s+s+q+u+s+r+s+q+u+S.K P +.X Y Y Y Y ` @.X Y Y ` Y @.+.+.+.Y @.@.@.Y Y Y @.Z X +.+.Y Y +.` ` X +.+.Z Z Z @.@.Y +.+.+.+.Y M A =+p+p+3+3+3+4+0+p+3+4+3+p+p+4+3+p+p+4+3+3+3+p+0+4+3+3+p+p+3+0+3+p+3+3+4+4+p+p+3+3+p+4+4+0+4+4+4+p+3+/.F.#+#+#+U.#+#+#+#+U.#+#+#+#+#+#+#+#+#+U.#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+U.#+#+#+#+#+#+#+#+#+#+#+#+#+#+k.j =.'.'.%.*.=.=.%.=.&.&.=.=.=.=.=.&.=.*.=.=.=.=.=.&.&.=.'.=.=.'.=.%.'.=.=.'.=.&.=.&.=.=.&.=.&.,.'.*.O h A E B A B B w A B A A A A A A w A A w A B A A B A A A B B A A w A A w A A A B A A A A B E A z x B o C 2.9.j.0.j.i.0.0.j.i.j.0.9.j.j.0.j.j.0.f.i.9.j.j.9.i.j.j.j.j.0.f.i.j.j.f.i.j.j.f.0.9.j.0.f.f.0.j.i.5.S m+G+F+E+z+F+E+F+G+F+E+G+E+G+F+F+G+z+F+G+E+G+G+D+F+G+G+F+F+E+F+E+G+G+G+G+G+E+F+G+G+F+F+E+E+z+G+G+G+B+D.C.f+b+9+f+f+f+9+9+f+9+9+7+9+f+f+f+7+f+f+f+f+f+9+f+f+f+f+7+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+5+9+2+N.", -"n.$+%+%+%+%+$+%+%+%+$+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+$+%+%+%+%+%+%+$+%+%+%+%+%+%+%+%+%+$+m.c.]+~+~+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+~+]+]+]+]+]+]+]+]+~+]+]+]+~+]+]+]+]+~+]+]+]+]+~+[+[+E.w n ` P P c c M n M c P c M P n P P c P n c n P P P n c P c M c P P M n M P P P c P M M P ` ` P ` P e h r. +^+=+=+<+1+=+=+=+=+=+=+^+P.=+=+=+=+=+=+^+=+<+=+=+^+=+=+=+=+=+1+<+=+=+=+=+=+=+=+=+=+=+<+=+=+=+=+^+/.}.M.M.M.G.M.M.M.G.w.M.M.M.M.M.M.M.M.M.w.M.M.M.M.w.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.G.M.M.M.G.F.}.0 q *.=.>.q *.*.q *.*.>.>.*.*.>.*.*.#.*.*.>.*.*.#.#.*.*.*.*.q >.*.>.*.*.*.*.*.*.*.*.*.=.q =.*.%.=.=.j l 3 o B A A A o o A A A A o o o o o o o o B A o B o A A A o A A l A A o w l A A A o w A A E A A r E l t 0.f.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.0.2.2.2.2.2.2.2.2.2.2.2.2.0.2.2.2.2.0.0.2.N D T.x+m+m+m+i+m+m+m+m+m+m+m+m+m+g+m+m+m+m+m+m+m+m+m+m+m+m+m+m+i+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+m+'+x.m.%+%+%+%+%+%+%+%+%+%+%+$+%+%+%+%+%+%+%+%+%+%+%+$+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+$+%+%+%+%+;+%+$+n.", -"L o.n.o.o.o.n.o.o.h.o.o.o.o.h.o.o.o.o.o.o.o.o.o.o.n.o.o.n.o.h.o.o.o.o.h.o.o.o.o.n.o.o.o.h.n.h.o.o.o.L 5 A.A.A.4.4.A.y.4.4.4.4.A.A.4.4.4.4.y.4.c.4.4.c.c.4.4.4.4.4.4.4.4.A.4.4.4.A.4.4.4.4.A.4.A.4.4.p.m.m.3.b -.K K K K K K K K K K K K p p K K -.K K K E K K K p K K K -.K K K K p K K K K K K K K K p K K K K -.f f (.;.1.v ).[.I ;.~.~.1.~.;.~.~.;.v ).).~.;.;.[.J ).;.~.1.).).;.}.k.;.v v ;.;.v I 1.I ).}.v ;.;.~.~.{ 4 ].(.}.(.}.[.[.(.[.(.[.[.}.[.[.}.(.}.}.}.[.[.}.[.[.[.}.[.[.[.[.[.}.[.[.[.(.[.[.[.}.[.[.(.[.[.(.(.w.4 < v m m k m m j m m j v m k m m m k m m m m j j m v m k j m v k j m m k m m m j k m m j v j m j m O 0 2 0 0 0 h 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 h 0 0 0 0 0 0 0 0 h 0 k 6 3 2 | s s t t t s t t t s 1 t t s 1 1 1 t C 1 t t s 1 | t 1 s 1 1 s C t s 1 1 s t t t s t t s t t t t t | , H r.r.r.^.^.^.r.^.^.^.^.^.^.^.^.^.r.^.^.r.^.a.^.^.^.^.r.^.^.^.^.^.^.^.^.r.r.^.^.^.^.^.^.S ^.^.^.^.N J L n.h.n.o.o.o.n.n.h.h.o.o.o.h.o.o.o.o.h.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.h.o.o.o.o.h.o.h.o.o.h.o.o.n.D.L ", -"x.T.'+'+'+'+>+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+>+>+'+'+g+'+'+'+'+'+'+>+'+'+'+'+>+'+'+'+'+>+'+'+'+'+r.L N.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.C.N.N.N.N.N.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.n.4.X.~+X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.*+[+X.X.X.*+X.*+X.X.*+X.X.X.X.X.~+X.X.X.X.X.X.X.X.X.[+S.*+*+X.[+*+R c G c c c c c c c c c c c c c c c c e n c P c P n e c c n e c c c @.P c c c c c c c c c c c P G c n ( ^. +O.O.s.O.P.P.P.s.v.O.P.P.P.P.P.O.O.O.O.O.O.O.P.P.P.P.P.P.P.P.P.P.P.P.P.!+P.P.P.P.P.P.P.s.P.!+P.v.J J M.F.F.w.w.F.F.w.F.w.w.F.w.w.F.F.w.w.w.w.F.F.w.w.F.w.w.F.F.w.w.F.F.w.w.F.F.w.w.q.F.w.w.w.w.F.F.F.M.1.k #.%.%.q q %.%.*.*.q q q q q *.q q q q q q %.q q q q q q %.q q q q q q q %.q q %.q q %.q q %.%.>.%.q 2 3 o B 3 3 3 y p 3 3 o o o o o o o o 3 3 3 3 o o ( o o o 3 o h l o o o o 3 3 3 3 3 p B o r y o B 3 ( 2 u ..Q Q Q Q Q Q Q Q Q Q Q Q Q Q ......Q N ......Q ..Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q N Q 2.0.| ^.g+c+g+'+>+'+g+>+'+>+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+>+'+'+'+'+'+'+'+'+>+>+'+'+g+g+x.", -" +x+B+G+A+G+G+D+F+E+D+G+G+D+E+E+G+G+G+D+D+C+E+D+D+G+E+G+G+G+G+G+G+D+G+G+G+F+D+G+G+D+D+G+D+D+G+G+D+G+'+h.8+f+f+2+f+b+2+7+f+9+f+7+2+7+b+9+9+b+b+b+b+b+b+b+f+b+b+b+9+9+7+2+f+7+2+2+2+f+2+7+2+f+7+7+7+2+7+f+f+N.3.]+u+r+t+l+l+s+s+s+l+l+u+u+s+s+s+t+t+t+s+s+s+u+q+s+t+q+t+u+s+q+s+s+s+s+s+s+s+s+l+l+s+u+s+u+s+t+q+q+o+c.c .@.` ` ` ` ` ` ` @.@.@.@.` Y ` @.P Z X .+.+.X Y +.X Y @.Y Y X .Y ` ` ` ` @.@.@.Z @.` @.Y Z @.` i v.0+4+4+3+4+p+p+p+3+3+p+p+p+0+0+p+4+4+4+4+p+4+4+4+p+4+p+3+3+p+p+p+p+p+p+p+3+p+p+4+p+p+4+p+3+3+p+p+4+u.[..+#+#+`.`.#+#+#+#+#+#+#+#+#+Z.#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+Z.#+#+#+#+#+#+#+U.#+#+#+#+#+#+#+Z.#+}.k *.&.&.&.*.*.=.=.=.*.*.*.*.*.=.*.*.=.*.%.'.%.*.%.%.'.>.*.'.%.%.%.%.*.#.>.=.*.*.=.*.*.=.*.%.'.%.*.*.O h l A B B A B B B B B w w A w A A B A B B A w A A w B B B B B w w B w B B B B B B B B B B w A B B B A v 2.i.i.j.i.i.i.j.i.j.j.j.j.i.i.i.g.g.g.g.j.j.j.j.j.j.i.j.j.j.j.j.0.0.0.0.i.i.i.i.i.i.i.i.j.0.i.f.j.i.S -+G+G+F+y+F+D+G+G+D+G+F+F+F+G+G+G+D+G+G+E+D+G+G+G+D+D+G+D+C+G+G+G+G+G+A+F+D+D+G+D+D+G+G+D+G+G+G+G+y+T.", -">+G+B+A+z+y+C+z+E+E+D+A+A+E+D+D+A+A+E+D+D+D+E+D+A+E+A+A+G+z+z+y+z+D+D+D+A+D+D+A+w+A+D+C+D+D+D+C+D+C+-+h.7+b+b+|+|+9+9+9+|+|+9+9+b+9+|+9+9+b+b+b+b+b+b+b+9+|+b+9+9+|+9+}+b+}+}+}+9+b+9+9+9+9+9+9+9+9+f+9+b+K.A.~+u+r+t+s+s+s+k+s+t+s+l+q+k+k+s+t+s+o+s+q+q+q+q+s+s+h+h+t+k+s+k+t+k+s+k+k+t+t+s+k+s+t+s+l+d+e+r+q+*+c.n .U Y Y Y Z Z Y X X +.X X Y Y Y X X +.+. .T T T . .+.+.X Y Z Y Y Y U X Z Y Y Y Z X +.Y Z Y +.X @.d s.4+4+4+<+4+4+4+3+(+:+4+3+3+_+{+:+<+^+:+6+6+3+:+(+(+(+(+4+(+4+4+4+(+:+:+4+4+(+4+<+a+(+3+:+:+:+<+4+4+u.}.#+W..+U.`.U.U.U.U.U.U.U.U.U.U.U.W.#+Z.U.U.U.U.U.U.U.#+U.U.U.U.U.Z.U.U.U.U.U.U.U.U.U.U.U.Z.U.V.U.#+}.m *.=.&.=.=.=.=.=.'.=.=.=.&.&.'.'.=.&.&.&.&.%.&.'.,.'.%.'.=.%.=.*.%.'.%.'.=.&.=.'.&.'.=.=.=.%.%.=.*.k 3 l A B B B B A A B x B B B y B x B B B B B B B B B B B B B x B B B B B B B A A A B B B A A A A B A A m 2.i.j.j.j.9.e.e.j.9.9.9.9.j.9.9.8.8.d.8.8.b.d.8.d.e.9.e.e.e.9.9.j.j.j.j.j.j.j.e.e.j.j.b.e.e.j.b.e.0.S -+E+D+z+y+A+z+z+E+E+E+E+E+A+E+E+D+D+D+D+E+D+A+D+D+E+D+D+D+D+A+E+D+E+D+E+z+A+A+A+E+E+A+C+E+D+A+z+z+F+I.", -"'+z+z+C+z+z+E+z+y+B+y+y+y+y+y+y+y+y+z+B+y+y+y+B+B+z+z+z+y+y+y+y+y+y+y+y+y+y+y+y+v+y+y+B+B+B+B+z+y+F+-+n.7+b+9+|+|+}+|+|+|+9+9+|+|+}+2+7+2+7+f+}+|+|+9+9+}+|+7+}+7+}+|+9+|+9+|+|+|+|+|+9+|+9+|+b+b+|+7+b+b+K.z.[+u+r+t+t+s+t+k+e+o+t+l+u+k+k+k+h+k+t+k+l+q+h+l+l+h+h+u+o+k+o+k+k+k+o+e+k+k+t+s+k+t+t+s+l+d+e+r+r+*+c.n T Y X +.Y X Y X +.Y +.Y X +.Y X Y Y X Y +.+.+.Z @.Y @.Z U @.` ` ` ` Y +.+.Y Y Y Y Y +.X @.X +.+.@.d s.3+4+4+:+3+(+(+4+(+:+3+3+_+:+:+3+a+3+:+a+<+:+3+3+(+:+4+4+(+:+(+(+4+(+(+(+:+(+(+<+3+:+3+(+(+:+(+3+0+u.).#+W.#+M.{+U.U.U.U.U.U.U.U.W.W.Z.W.W.U.U.U.W.W.W.W.Z.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.W.++#+#+k.m %.=.&.=.=.=.=.*.*.=.*.*.=.=.=.=.=.*.*.*.'.&.&.'.%.'.=.=.=.=.'.%.&.%.%.&.=.=.*.*.'.=.*.*.%.%.=.=.*.q 0 o A B B B B B B A A B B y p A x B B A x B B B B B B B x x B B B x B x B B B B B B B A w A A w A A o | Q i.j.j.9.9.9.e.j.9.j.j.e.9.j.9.8.d.f.d.0.f.i.f.9.f.f.f.f.9.d.0.j.9.9.9.9.j.j.9.e.e.e.e.e.e.9.9.j.i.S '+E+D+C+y+A+y+y+y+y+w+z+z+C+y+y+x+y+B+B+y+y+y+y+y+y+y+y+B+y+y+z+z+y+z+w+z+z+z+y+y+y+y+z+x+v+y+A+z+F+T.", -"T.x+z+z+w+y+y+A+y+y+x+y+y+y+x+v+z+D+w+w+w+z+F+y+v+v+v+y+z+A+A+A+z+x+y+y+y+y+y+x+y+y+y+B+x+y+x+y+y+G+-+h.;+9+|+}+}+}+}+}+|+|+9+9+}+}+}+7+}+}+7+}+}+}+}+}+}+}+f+}+|+|+9+9+}+|+|+}+}+}+|+|+}+|+|+f+|+}+2+9+b+N.3.~+u+k+k+k+k+k+k+k+k+k+s+q+k+k+k+k+k+k+k+d+s+h+d+d+d+h+s+l+k+k+k+k+k+k+k+k+k+h+k+k+h+k+k+l+l+k+h+l+*+c.n T Z Z Z U Y Y Y Z Z Y Z Y Y Z Y Y +. .Y U Z P ` ` Z ` Z Y @.@.Y Y Y Z Y Y Y U Z Y Y @.` ` Y Y Z ` d P.3+<+4+:+<+(+:+{+:+(+(+:+^+:+(+(+(+(+:+:+{+(+(+(+(+:+(+(+:+(+(+(+:+(+=+:+:+:+:+(+(+:+:+:+:+:+4+:+_+[.}.Z.W.`.M.R.U.U.U.U.U.U.U.U.Q.Q.W.R.W.U.U.U.W.Q.Q.Q.R.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U..+U.#+w.m #.%.=.%.>.>.*.>.#.*.>.>.*.%.>.*.>.#.*.#.%.=.&.=.%.>.*.*.%.%.*.=.=.=.&.'.*.*.#.%.%.*.>.*.*.%.%.'.*.q 0 w A B x x B B B A A A B B B x x x x x x A w B A B B A y B x x B y B B A B B B B B B A w A A A B B B | Q i.9.9.9.9.9.9.9.f.0.0.9.f.0.f.d.e.d.d.f.d.f.0.9.d.0.9.f.d.9.9.9.9.9.9.9.9.9.9.f.0.0.0.f.f.0.0.i.i.S T.G+A+y+y+A+z+z+z+w+w+z+w+z+w+w+y+y+z+w+y+y+y+z+z+z+z+z+y+z+z+y+y+y+y+w+z+y+y+y+v+x+x+y+x+x+y+y+z+w+H.", -"I.B+z+z+w+y+y+A+E+z+w+z+z+z+w+w+E+D+D+E+w+w+F+w+y+y+y+B+z+E+D+D+D+A+z+w+z+A+z+A+z+z+z+C+z+z+z+w+z+B+T.n.2+9+|+}+}+9+f+}+}+|+|+f+9+9+|+b+b+9+}+;+7+2+}+}+9+9+9+5+5+5+}+9+}+}+}+}+}+}+}+}+}+}+}+7+}+}+2+f+b+N.3.~+u+k+k+k+k+k+k+k+k+k+s+t+t+t+s+s+s+n+e+d+~+d+d+s+k+e+o+d+k+k+k+k+k+k+k+h+h+s+k+k+h+s+s+l+l+h+h+l+*+c.c .Z Z Y Z Z U Z Z Z U Z Z Z Z Y Y T T +.@.P M M P ` U @.+.+.T T .X Z Z Z Z Z Z Z Z @.` ` U Y @.` d s.3+(+4+(+(+4+4+:+:+:+_+(+_+(+(+0+0+4+^+_+,+++(+^+(+^+^+(+(+(+(+:+:+:+:+3+:+(+:+:+:+:+:+<+<+:+:+4+4+[.}.W.W.W.`.`.U.U.U.Z.U.U.Z.Z.`.M..+#+U.Z.M.M.U.Z.`.`.#+U.U.Z.U.U.U.U.U.U.U.U.U.U.U.U.U.U.Z.`.U.U.`.U.k.m #.*.=.*.#.>.*.*.#.>.*.>.>.>.#.*.*.*.*.>.#.#.%.*.>.#.>.#.#.*.#.=.*.=.&.,.=.>.#.*.*.%.#.*.%.%.'.=.>.O h A A B A A B B B B A A A A B B B B A A w I I w w w A w A A A B B B w A B B B A A B B A A B B A B B B m 2.i.9.j.9.9.9.9.0.f.d.9.f.9.f.0.e.j.e.d.d.9.e.j.j.f.f.0.d.d.e.b.e.9.9.9.9.9.f.9.f.0.0.0.0.0.0.0.j.j.S T.G+C+y+x+w+A+A+A+A+z+z+y+C+A+D+A+A+A+A+z+A+A+D+D+A+D+D+A+A+E+B+B+y+w+z+A+A+A+z+w+z+z+z+C+w+z+y+z+y+T.", -">+y+F+z+z+z+z+z+E+A+A+E+A+z+A+A+F+x+m+j+T.I.I.I.T.'+j+j+v+y+A+D+E+D+A+w+A+D+A+A+A+z+A+C+z+A+A+D+C+G+-+n.;+9+9+}+|+9+9+9+|+|+9+9+9+9+}+}+;+$+N.n.n.m.m.J.K.%+%+|+b+|+9+9+9+9+9+|+9+9+9+|+|+}+9+9+|+|+7+}+9+K.3.~+q+r+k+h+k+q+s+k+k+k+s+t+t+k+l+d+X.X.E.E.c.c.E.X.~+[+d+s+k+s+s+s+s+k+k+h+s+s+h+k+s+s+q+l+d+h+q+u+[+c.n .Y Y Y Y Y X Y Y Y X Y Y Y Y X +. .Y P e d d ( i i c M ` Y X .+.Y Y Y Y Y Y Y Y Y Y @.` Y X X @.d s.p+:+4+:+:+4+4+3+(+:+_+_+4+3+=+{+V.O.v.D s.z.u.v.P.P._+(+3+4+3+:+4+(+:+:+(+4+:+:+4+:+(+:+:+3+:+4+4+[.).#+W.W.W.=+#+Z.U.Z.U.U.U.R.@+++G.M.w.}.}.}.:.k.4.A.G.M.W.U.U.U.U.Z.Z.U.U.W.W.U.U.U.U.U.Z.U.U.Z.W.#+w.k >.=.=.=.=.=.=.=.=.=.=.=.=.*.'.=.=.=.=.*.#.#.O j k j j m m q #.#.%.=.*.=.'.=.=.=.%.'.'.'.%.%.&.'.*.q 0 h w A A A x B B A A A l l w w w w w l l o o l l o l A w w l o w w w A B x x A A B B w w A A A B B B | Q i.9.9.9.9.9.9.0.f.9.f.f.f.f.f.5.!...u u u !.s N 2.2.2.i.j.j.j.j.9.9.9.9.9.9.9.9.9.9.e.e.9.d.e.9.i.S '+G+C+y+y+w+y+B+m+m+m+j+j+j+g+m+m+m+m+g+g+m+g+g+m+m+g+g+g+g+j+j+g+v+B+z+A+C+D+z+A+A+z+C+z+A+C+z+F+G+I.", -"T.G+E+A+z+z+E+A+z+z+z+z+z+z+v+v+D.].$ + @ @ + @ @ + $ g a.T.m+x+F+z+z+z+z+z+z+z+A+z+z+z+z+z+z+z+z+G+-+n.2+b+b+|+|+9+9+9+b+9+9+9+f+2+J.n.L - . - @ @ @ . . / L n.%+8+9+9+b+9+9+b+9+9+b+9+|+b+b+b+9+|+7+9+9+N.3.~+u+t+t+k+s+q+q+s+s+s+s+k+l+X.E.4.! * * @ @ $ + . ! 4.E.[+k+k+s+q+s+s+k+h+t+s+s+s+r+s+q+l+l+q+q+r+~+-.n T +.+.Y X +.+.X +. .+.+.X X X +.+.P M } ( * % . . & ' } n M P ` M ` +.+.+.+.+.X +.+.Y Y Y X +.+.@.d v.4+:+4+(+4+4+4+(+{+:+3+{+{+ +_.9 . . @ + @ $ + + + > 9 s.P.{+0+0+4+(+:+:+:+3+:+:+:+(+4+:+:+:+3+3+4+[.}.#+.+`.U.W.Z.W.W.U.U.W.Z.U.w.}.8 @ . . . . . . @ @ @ f k.M.Z.U.U.W.W.U.U.W.U.U.U.Z.U.U.U.U.U.U.W.#+k.m %.=.&.=.'.&.&.&.&.&.&.&.&.=.&.&.=.&.&.=.O 0 < = . $ $ , , , #.*.%.=.%.'.&.&.&.&.&.&.&.&.'.'.'.&.=.q k h A B A B B B B x A 2 2 ; * ; ; ; ; ; * ; ; @ ; * ; ; ; * ; ; 2 w w A B B B B B B A B B A A B A B o m 2.i.d.e.9.9.9.8.9.9.9.9.0.0.f.f.[ = + + + # . @ $ : 1 u 5.5.i.i.e.e.9.e.e.e.e.9.d.b.e.e.e.d.8.b.e.0.S T.D+C+z+y+A+x+x+W ] W _ W 7 : ^ W _ g 9 ^ ] 7 g g ] 7 ^ g g ] ] 9 x.x+x+y+F+z+z+w+z+z+z+z+w+z+F+z+E+I.", -"I.G+D+z+x+y+A+z+y+A+A+A+F+x+P.* + + . . + @ @ # @ % . # # + 4 F.x+y+z+w+A+y+y+z+w+z+z+z+z+z+z+z+z+G+-+h.2+9+b+|+}+2+2+b+b+b+b+2+&+].% . + $ $ % % % $ $ $ $ + . - J.2+7+|+|+b+9+7+2+}+}+|+|+f+9+|+|+7+b+b+N.3.~+u+h+k+k+k+h+q+s+s+r+e+[+E.! . + + . + + + . - + . . - b E.d+t+r+t+q+d+h+h+s+h+k+k+s+s+k+d+l+q+r+[+6.c .Y Y Z Z Y Z Y Z T +.` M M M Z Z M e ' % + + . . . @ i P Y X Y Z Y Y Z U Y Z U U +.+.Z U Z Z Z P d s.4+:+4+:+4+:+4+4+:+(+0+V.}.+ . @ % @ @ # . . . . . # + . @ }.#+)+0+4+:+<+3+3+<+<+:+:+:+:+(+:+3+3+4+[.}.#+W.W.W.W.Z.Z.#+U.W.Q.M.}.+ . . . . . . + + . . . . + . { q.U.#+U.U.W.U.W.R.U.U.Z.U.U.U.W.U.W.Y.#+k.k #.&.&.=.=.=.=.*.*.=.=.=.&.=.=.*.*.*.'.#.a . . . . . . . . % #.&.&.&.*.*.'.=.=.=.=.=.=.=.*.%.'.&.&.q h l w B A A B B B B I 8 + @ . . . . . . . . . . . . . @ @ . . @ 2 A B A A B B B B B B B B B B A A A o m Q i.9.9.d.f.9.e.j.j.f.0.2.s @ . * & = + + $ . & # + . + : ..i.j.j.j.9.9.9.9.9.9.9.f.f.9.9.9.9.9.e.j.S '+F+C+z+y+w+D+j++ & & @ # # . # # # # # # # # # # # # . @ @ @ $ . ].x+w+z+E+w+z+w+z+z+C+y+y+z+z+A+y+T.", -"I.y+D+z+y+v+A+z+y+y+A+A+y+x.) # $ + . @ % @ . # % % . . . @ . - a.x+y+D+v+y+y+w+A+w+w+w+z+w+w+w+w+G+T.n.2+9+|+}+}+7+}+b+b+|+|+$+L - . . . $ @ # . @ + $ $ $ . . + - n.2+}+|+|+|+}+}+}+}+|+|+|+|+|+|+7+f+9+K.3.~+q+s+k+k+l+l+s+s+k+e+~+R + . @ + . + $ $ + - + + + - - - ! E.n+k+t+k+d+k+h+k+k+k+k+h+h+k+d+d+k+t+[+6.c T Y Y Z U Y Y Y Y +.U U Z Y Y +.+.M } ; $ @ % # . . @ i ` Y Y +.Y Z Y Y Y Y Y Y Y +.+.Y Z Y Y Y P d u.4+(+<+=+:+<+:+:+:+{+=+@ + - . @ @ # . + . . + + . . . . . . ].<+0+(+(+:+:+:+<+:+:+:+:+:+:+:+:+(+4+[.}.Z.`.`.R.R.U.U.U.U.U.Q.l @ . + + . . + . + + @ @ . . . . . { }.W.U.U.`.W.U.Q.U.U.U.U.U.U.Q.W.`. +#+k.m >.=.=.*.&.=.=.=.*.&.=.=.&.=.=.=.*.*.%.j # + + . . . . . . $ #.&.&.&.*.#.=.=.=.=.=.=.=.=.#.>.&.&.&.q 0 l A B B B B B B B A f . @ . . . . . . . . . . . . . @ . @ # . ; l A B B B B B B B B B B B B B A A o | 2.9.9.9.d.d.d.d.d.0.2.|.u = + - % @ . . . . - @ - - - . + , t 5.i.f.9.9.f.f.f.f.9.9.f.f.f.9.9.9.e.d.S T.A+A+y+v+w+D+x++ $ @ . . . . . . . . . . . . + + . . . @ @ % % + ].x+w+w+w+w+w+w+z+y+y+y+v+w+z+D+G+H.", -"I.B+D+z+x+w+A+z+z+w+z+x+x.> + % % % @ @ @ . + . . @ . . @ % @ # > H.x+y+z+z+z+y+w+y+z+z+z+z+z+z+z+D+T.7.2+9+9+|+}+7+b+b+|+9+%+L - - + + + + . - - - . . # & @ . # . 5 n.2+2+|+9+9+}+9+|+}+|+|+9+}+|+7+9+b+K.3.~+u+s+k+h+l+l+k+k+e+~+R % & @ . $ + . . % % @ # $ $ $ + @ . ! X.l+s+k+k+h+s+h+k+k+k+s+s+k+l+l+q+r+[+-.P T Y Y Z U Y Y Y Z ` ` X .+.+.Y @.} ; @ . . @ # . . @ i M +.+.Y U U Y Y Y Y Y Z Y Y Y Y Y Y X Z P d s.p+:+:+:+3+:+3+:+_+{+9 + + + . . . . . $ @ . $ + . . . . . . # F :+0+{+4+:+:+:+:+(+(+:+<+:+(+3+^+4+[.}.Z.W..+w.Q.Z.U.U.W.@+8 $ . + . . . . + + . . . . + . . . . . { k.U.U.`.#+U.U.U.U.U.U.U.U.U.U.Z.W.#+k.m #.*.&.=.&.=.*.&.=.=.=.=.&.&.=.=.*.>.j : . . . . . . . . . = #.&.&.=.*.*.=.=.=.=.=.=.=.=.%.%.'.&.&.q 3 w A B A B B B B B w ! @ @ @ . . . . . . . . . . . . . . . . . 2 I A B B B B B B B B B B B B A A A o | Q i.9.9.9.f.9.9.b.5.N 1 = $ . . & . . + $ + + - . @ - . . $ : D 2.9.0.f.9.0.0.9.9.9.9.j.9.9.9.9.e.j.S -+F+C+y+y+A+D+y++ + $ + . # . . . + . # . . . . . . . . @ @ & * . a.x+y+w+z+z+y+w+z+y+y+y+w+C+z+D+G+I.", -"T.G+D+y+y+z+D+z+A+A+x+'+_ + % ; * % @ . . > ~ ) - . . . @ @ . . . [ x+y+z+z+z+z+w+z+z+z+z+A+y+z+z+G+T.n.}+9+b+9+|+b+5+b+|+2+n./ . . + + + . . ) / 5 5 ) - . @ % @ + @ - C.2+|+b+9+9+|+|+9+9+|+9+|+|+7+b+b+K.3.~+u+s+l+d+h+h+r+t+[+E.! % @ $ $ $ . . # & & & @ + $ $ + $ . + 4.[+l+k+t+s+q+h+h+h+h+h+s+s+k+h+q+q+[+c.c .Z Y U Y Y Y Y Z Y Y +.T +.` M e ; @ . . . . . . . * d P +.+.Y Y Y Y Y Y Y Y Y Y X +.Z Z Y +.@.M i I.p+:+4+:+:+:+4+4+{+[.$ + . . . . + + + # + $ $ + . @ + + . . . ] u.0+:+4+:+3+<+:+:+:+:+^+:+(+3+:+4+[.}.#+`.W.W.=+Z.W.Z.U.J @ . . + + . . . @ @ { . . + + . . . . . @ J #+Z.v.#+W.Z.U.U.U.U.U.U.U.U.Z.U.#+k.m #.'.=.=.=.&.=.=.=.=.=.=.=.=.=.*.#.O | = . + . . . . . . + = #.&.=.=.%.*.=.=.=.=.=.=.=.&.#.%.'.&.&.6 3 h A B A A B B B B 3 * . @ . . . . . . . . . # . . . . . . . . 2 I A B x B B w A B B B B B x w E E x 0 2.i.j.e.f.9.e.9.j.5.1 + . - . # - + $ = , , $ . $ % % # + $ = : 2.9.9.9.9.9.j.9.9.9.j.9.9.9.j.j.j.j.S -+F+D+z+y+w+D+j++ + % $ + @ @ + # $ @ @ @ @ - . . . . # . . % $ + ].x+w+z+C+E+z+w+z+z+z+y+w+y+z+A+F+T.", -"I.G+D+z+y+z+D+z+E+z+x+W + . % & % # . @ W T.j+j+s.g - @ & @ @ . @ ] I.x+z+A+E+z+w+z+z+z+z+z+z+z+z+B+-+h.%+9+9+9+|+b+5+9+}+N.5 . @ $ $ @ . - 5 m.$+8+&+7.) - - % $ $ + + 5 8+}+|+b+|+9+}+|+9+9+9+9+9+7+b+b+K.A.]+q+r+l+l+l+h+q+s+[+R + . + = $ + . ) R y.E.R { % $ $ $ + $ @ % E.n+k+k+s+s+s+h+h+k+s+h+k+d+l+q+r+[+6.c .Y Z U U Y Y Y Y .+.+.Y P e ( ; @ . - . # # # . . * d P +.Y Y U Y Y Y Y Y Y Y Y +.+.Y Y +.+.@.` d s.3+:+4+:+:+:+:+0+{+, = + . . # . + + + f [.s.4 @ # + + . . . + + F :+4+(+_+^+_+:+:+3+3+:+:+:+:+3+4+q.}.#+.+W.Z.Z.U.U.#+M.{ . . . . . . . { }.W.#+M.J @ . . . . . . . { M.W.U.U.U.#+U.U.U.U.U.#+U.U.Z.U.#+w.k >.=.&.&.&.&.=.=.=.=.=.&.&.=.*.#.O < . + + + . # . . . . . = #.=.=.=.=.*.=.&.=.*.=.=.=.&.#.%.'.&.'.q v f A B B B B B B B h + # % @ . . . . . # # # % . # . . . . . @ 2 B B B B B B B B B B B B B B B B A o m Q i.e.9.f.f.9.b.j.!.= - ) - # @ + = : N |.v.u : * & & & % # + @ N f.0.9.9.9.9.9.9.j.j.j.j.9.9.j.j.j.S '+G+C+y+y+C+F+j+$ $ * . . @ $ $ % # @ $ $ $ @ . . . . @ @ @ % % . a.x+E+A+z+z+z+B+y+z+z+z+w+y+y+A+G+T.", -"T.G+A+z+y+z+D+z+E+z+x+g + $ @ @ $ @ . a.m+y+F+y+x+T.] @ & @ . . + = 4 y+w+D+D+z+z+z+z+z+z+w+z+z+z+G+T.C.2+9+|+9+|+b+b+9+8+L ) . $ $ % @ . / m.&+8+7+7+2+C.5 . + $ $ = $ ) C.2+}+b+|+9+|+9+|+9+9+|+|+7+f+f+K.m.[+u+h+l+l+s+q+h+n+X.! @ @ $ $ $ - # R ~+n+l+[+E.& % $ + + . @ + c.[+k+k+s+s+s+h+h+h+s+s+k+l+l+q+r+[+6.c .Y Y Y U Y Y Y Z Y P ` n ( ; . . . - . . @ % % # . @ i ` +.+.Y U Y Y Y Y Y Y Y Y Y Y Y Z Y Y @.P d v.3+:+:+:+:+4+:+0+v.- + + . @ % + # _ P.0+0+0+0+q.@ . . . + + . + 4 s.0+0+4+:+^+_+3+:+3+3+(+:+:+3+4+[.}.#+W.W.W.U.#+Z.#+).@ . . . + + . @ 3.++R.U.U.M.J . . . . . . . + }.U.U.U.U.W.Z.U.U.U.W.U.U.U.U.U.#+w.m *.*.&.=.*.=.=.=.=.=.=.&.=.*.>.O < + + + . . @ $ . . . . . = %.=.=.=.*.*.*.*.*.&.=.*.=.=.%.*.&.&.'.O h l A B B x B B B B 3 % # @ . . . . # % % % % % % % % % @ % @ & 2 z x B x B B x B B B B B B B B B B B j 2.f.e.9.9.9.9.b.5.1 + - - % @ + $ , Q 0.f.0.i.N $ - @ @ + . . . Q 8.f.j.9.9.f.f.f.f.9.9.9.9.9.9.9.j.S T.F+C+y+y+w+F+x+~ + { / - + . + ~ { . + . . + $ + . . . . + . + g m+y+z+E+y+y+z+w+y+z+z+z+w+y+z+D+G+I.", -"I.G+D+y+y+v+A+w+D+z+'+9 . @ @ - @ @ ~ T.y+y+z+D+z+j+a.. % @ . @ % % 9 y+w+A+A+z+w+w+w+w+z+w+w+w+z+G+T.h.%+5+b+|+}+b+9+7+$+L . @ @ % % % - L $+7+5+b+|+}+8+7.- @ $ $ = $ ) 5 2+2+}+|+|+|+|+|+|+|+9+}+7+f+9+K.3.]+u+q+k+d+l+q+s+[+3.) = $ + + . - / X.n+s+s+k+[+R @ . . @ # . . $ X.d+t+k+h+h+k+k+k+h+h+k+k+k+s+r+[+6.c T Y Y U Y Y Y Y U M p ( ; % . . . . . . . @ & @ . . @ i ` Y U U Y U Y Y Y Y Y Y Y Y +.Y U Y Y ` M d s.4+:+:+:+:+_+{+{+].+ + . . @ % # + [.)+0+4+{+{+,+J . + + . . . + ^ /.0+_+{+(+:+:+(+:+:+:+:+:+:+(+4+[.}.W.`.`.R.Z.U.U.U.J + & % @ . . . J R.R.Q.Q.W.#+}.. . . . . . + { }.U.U.U.U.U.U.Q.U.U.U.U.U.U.Z.Z.#+}.m >.=.&.=.=.*.&.=.*.*.*.&.'.=.*.j = @ @ @ . . + + . . . . . = #.=.&.=.*.%.=.*.*.*.*.*.*.=.#.>.=.&.'.6 3 l A B B A A B B A l % @ . . . . . # h 2 2 2 h 2 2 2 2 f 2 f 2 l B y B B B w A B B B B B B x A w w o | Q f.9.9.9.9.9.f.N = + # & @ $ $ = s 5.8.8.e.i.Q , , , 1 1 u u N 0.d.9.9.9.f.f.9.9.9.9.9.9.9.9.9.9.j.S T.F+A+z+y+w+D+y+T.1+T.T.>+T.T.T.T.T.T.T.T.T.&+:.% . . + + . @ W j+y+E+w+v+z+y+w+w+w+w+y+w+w+w+w+D+G+H.", -"I.B+D+z+x+v+A+z+z+y+1+[ . . . . % $ ~ I.y+E+D+D+E+i+a.. @ . . # % ; 9 x+E+D+A+w+w+z+z+z+z+w+w+z+z+G+T.7.2+9+|+|+|+9+9+7+N.5 # @ @ % % + - L $+|+5+5+b+|+7+@+- @ $ $ , $ . 5 C.2+}+9+9+|+|+9+|+|+|+|+7+|+b+K.3.~+u+q+k+l+d+s+t+X.b + $ + + . . - R n+[+t+q+s+l+E.) - . . @ # . . E.d+k+s+s+h+k+k+k+h+h+k+k+k+s+r+[+6.n .Y Y Z U Y Y X @.} ; @ . - - . @ @ . . . @ & @ . . . i ` +.Y Y U Y Y Z Y Y Z Y Y Y Y Z U Y Y Y P d u.4+:+:+:+:+:+{+0+9 + + . @ @ & @ _ {+4+{+0+4+:+,+k.@ . . . . . + ^ _.0+(+_+4+:+:+:+(+:+:+:+:+:+3+4+[._.W.W..+`.U.U.W.W.W.@+F.}.m v { . }.R.Q.Q.R.U.#+}.. . + + . . . { }.U.U.U.U.U.W.U.U.U.U.Z.U.U.U.U.#+k.m #.=.&.=.=.=.=.=.=.=.=.&.&.%.j < @ . . - + + + . . + + . . $ >.&.&.*.*.*.=.=.=.=.&.=.=.=.=.*.&.&.&.*.0 l A B B B B B B B h @ @ @ . . + + % A A w w A A w w I I I w I A p i x B B B B B B B B x x x B A A A | Q i.e.9.9.9.9.0.s = + # & & $ $ $ v.e.8.8.8.9.i.N |.i.0.j.d.d.d.0.j.9.0.0.9.j.9.9.9.9.9.9.9.9.9.e.9.S T.E+C+z+w+C+D+A+x+x+F+F+F+F+z+F+y+F+F+y+y+D+].% . . . . . . g j+x+y+E+D+D+y+y+w+w+y+z+z+z+w+w+z+A+G+T.", -"T.G+D+G+y+z+D+z+A+z+y+g % * @ . . + $ r.x+z+D+D+z+j+t.@ @ @ % & @ = W x+y+z+z+C+w+z+z+z+C+y+z+E+z+G+T.n.2+5+b+9+9+}+b+f+N.5 @ $ . . $ @ / n.f+|+}+7+9+b+f+$+L . + + $ @ @ . 7.2+|+9+9+|+|+9+9+f+|+|+7+b+b+K.p.[+u+s+k+q+l+r+t+X.! + . . - + + { c.t+k+k+s+q+u+l+b % $ + - . . $ c.~+s+s+s+s+h+k+s+s+s+k+l+k+s+r+[+-.c .Y Z U Y Z Y Y @.i ; $ - . . . . * % . - . @ % # . * d P +.+.Y Y Y Y Y Z Y Y Y Y +. .@.` Y .+.P d s.p+a+4+:+:+4+:+4+<.9 g g $ $ $ # ].=+6+:+:+a+a+4+_.> # + + % & $ ^ _.0+0+_+:+3+3+:+:+3+3+:+(+:+3+4+[.}.#+`.W.U.U.W.Z.Z.U.U.U.#+#+U.U.M.M.#+R.R.U.#+M.8 + . . + . . . { M.#+U.U.#+U.U.U.U.U.U.Z.U.Z.(+`.#+k.m #.=.&.&.=.*.*.=.&.&.&.&.*.k < @ @ . @ = , , < $ $ $ . . . $ >.'.&.=.*.=.=.=.=.=.=.=.=.=.%.*.&.&.'.q 0 l A B A A B B A l * @ . @ @ . . . f x y A x x x I I B y x x B z y B B w A B B B B B B B B A A B B B | 2.j.e.j.0.9.9.2.# $ . + . . . + u 0.i.8.8.9.f.r.f.9.f.f.f.9.j.e.j.j.9.9.9.j.9.9.9.9.j.9.9.9.9.9.e.j.S '+F+D+y+x+A+z+z+z+w+z+z+z+z+z+y+y+A+D+D+x+=+] - . % ; * @ W m+A+z+G+C+A+z+z+z+z+z+z+z+z+z+y+z+z+D+E+I.", -"I.G+A+z+x+z+E+z+C+A+c+_.$ % % . { $ . a.m+y+y+E+F+ +] # @ % @ @ @ ^ T.x+y+w+z+z+w+z+C+z+z+w+z+z+z+B+-+h.%+9+9+9+9+9+9+f+N.5 @ % @ @ $ @ / n.7+9+|+}+b+|+7+$+/ . + = + @ @ . h.&+b+9+9+}+|+9+9+9+9+9+7+f+b+N.3.]+u+q+s+k+l+q+t+E.@ + . . - + $ & y.s+k+l+s+s+s+l+b % $ + . - . $ R [+s+t+s+s+s+s+s+s+s+s+k+s+q+r+o+c.c .Y Z U Y Y Y Y @.} % . . . + @ & ; % - - . % % @ . @ i ` Y +.X Y Y Y Y Z Y Y Y @.Y +.@.` Y .+.P d P.p+4+3+:+:+4+:+0+4+4+0+_+4+(+4+v.=+(+4+(+:+3+<+)+J + + . . @ % @ 4 u._+0+4+^+_+:+3+:+3+:+:+(+3+(+4+[.}.#+W.W.U.Q.W.U.U.U.U.U.U.U.U.W.#+U.Z.@+@+W.M.J @ . . . . . . @ J #+U.U.W.U.#+U.U.U.U.U.W.U.U.Z.U.#+k.m #.=.&.=.*.=.=.=.=.'.&.=.O < $ % . - # + | m < & $ + . . . = >.=.=.=.*.=.=.=.=.=.=.=.=.=.%.=.&.&.&.q h l A B A A B B A I 8 . . . . . . # f w A h 3 2 2 2 h A I I w B y B y B B B B B B B B B B B B A A A o m 2.j.e.9.9.9.9.Q # . . . . . . + N 5.5.5.0.Q Q u N Q |.5.i.5.j.e.9.9.9.j.j.j.j.9.9.9.9.9.9.9.9.9.d.9.S T.G+C+z+y+C+z+z+z+A+z+z+z+z+w+B+B+C+D+D+j+a . + - @ * % > x.y+z+z+z+z+z+z+z+z+z+z+z+z+z+z+w+w+z+A+G+I.", -"T.G+D+y+y+w+D+E+G+y+x+'+9 # . . @ @ + @ W j+x+x+T.4 . @ @ @ $ . + 9 x+y+y+C+z+z+z+z+z+z+z+w+z+z+z+D+T.7.2+9+b+|+|+9+b+9+K.5 . @ @ @ % # ) 7.7+}+|+9+9+|+}+$+/ . $ + + . @ . 5 2+b+9+9+}+|+9+9+9+|+|+7+9+b+K.3.~+q+s+k+k+h+r+t+E.+ @ . @ - + + ) *+s+k+d+s+t+s+[+b % $ + . . . + l ~+s+s+q+q+k+k+s+s+s+k+d+l+q+r+[+6.n .Y Y Y X +.Z X ` 2 @ . ) + & ; ; e 2 . . . & % # . @ i ` Y X Y Y Y Y Y Y Y Y Y Y X +.@.` @. .+.P d P.p+:+4+:+3+4+:+4+4+4+4+_+4+(+4+0+4+4+(+(+4+:+3+q.{ . + + + + + + 7 !+{+(+4+^+_+:+_+:+3+3+:+:+3+3+4+[.}.W.W..+U.W.W.U.U.U.U.U.U.U.U.W.Z.U.R.k.}.J 8 . + . . . . . # 8 M.U.U.U.U.U.#+U.U.U.U.U.U.U.U.Z.U.Z.k.m #.*.&.>.>.=.=.=.*.*.=.q | $ & @ . + + , O O < @ . . . . + = #.&.=.=.*.*.=.=.=.=.=.=.=.=.%.%.=.&.&.6 3 o A B B B B B A l + . . . . . . + % * * @ % @ @ . @ & 2 I w B B p y B B B B B B B B B B B A A w w B < N j.e.j.0.d.e.Q # - . . . . . + u |.N 1 , , = , = , , 1 N 0.0.j.9.9.9.9.j.9.9.9.9.9.e.e.9.9.9.9.e.j.S -+F+A+z+y+A+z+C+z+w+z+z+z+z+A+w+C+z+w+y+a.. @ @ . # % + x.y+y+z+z+z+z+w+z+z+z+z+z+z+z+z+z+A+z+E+D+E+T.", -"I.B+D+y+y+v+A+z+z+v+z+F+H.> + . @ % @ . . . + $ . . @ % % @ . . > T.y+w+D+A+z+w+w+w+z+z+w+w+w+z+w+G+-+m.2+9+|+}+|+9+9+9+%+L . @ @ @ @ + - L 7+|+5+|+|+|+}+$+- @ $ + + $ @ . 5 2+9+9+}+|+|+|+|+9+|+|+7+f+b+N.3.~+u+s+s+k+k+s+k+c.+ + . . - @ $ & X.k+k+l+k+s+k+k+y.% $ + . . . + ! X.s+k+s+h+k+k+k+k+s+k+d+d+q+r+[+-.c .Y Y Y Y X Y X ` 2 % . @ & ( d e M d * # . @ # . . @ d ` +.X Y Y U Y Y Y Y Y Y Y +. .@.` Y .+.P d s.3+:+<+:+(+:+:+4+:+_+(+_+(+(+(+_+(+4+(+(+{+0+u.[ + + + + . . + > _.0+(+_+:+:+:+:+:+:+:+:+:+:+:+:+4+[.}.W..+`.U.W.W.U.U.U.U.U.U.U.R.G.U.R.R.J @ . . . . . . . . . 8 q.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.Z.U.#+k.m #.=.=.=.=.=.*.*.%.*.>.j = @ % @ . + = k >.O m @ . . . . . = #.'.&.=.*.>.=.=.=.=.=.=.=.=.%.'.&.&.*.q 0 w A B B B B B A l % . . . . . . @ @ + $ . . . . . . # # & 2 A y x y B B B B B B B B B B B A E B x o f Q 9.b.j.0.e.9.u . . . . . . . + N j , $ + . @ @ @ + - $ , u 0.0.f.9.9.9.9.9.9.9.9.d.9.f.9.d.9.9.e.9.S T.E+D+z+y+w+w+w+z+w+w+w+z+z+A+D+z+y+x+'+[ . @ % % $ . W j+y+w+z+z+w+y+w+A+z+A+w+v+w+A+z+z+w+w+z+A+E+I.", -"T.G+D+y+y+v+z+z+z+A+D+A+x+x./ . $ @ @ # . . + + . + @ % @ . . / '+x+y+D+D+A+z+F+w+z+z+z+z+w+z+z+C+G+T.h.2+9+b+9+9+9+9+9+%+L . . . . @ @ . 5 C.7+7+7+}+2+%+7.- @ $ $ + @ @ + ) 2+|+9+9+|+|+}+|+9+|+|+7+f+b+K.3.]+q+s+k+k+s+s+[+R @ . # . - + $ ! X.s+k+s+h+s+s+l+y.$ + . . . . @ % X.s+s+s+h+k+k+k+s+k+k+l+l+s+t+[+6.c .Y Y Y Y Y Y X @.} ; ; ( i e P @.@.d ; @ . @ @ # . @ i ` @.+.X Y U Y Y Y U U Z U +.+.@.` X +.X M d s.p+<+4+<+:+:+<+:+:+:+:+4+(+:+(+(+:+_+{+(+4+u._ + + . . . + + + 4 P.4+<+(+(+:+:+:+:+:+(+:+:+:+:+:+3+[._.#+`.W.Q.Q.W.U.Z.Z.U.Z.U.U.U.U.U.U.G.8 . . . . . . . . @ J M.Z.U.U.#+U.U.U.U.U.U.U.U.U.U.U.U.Z.U.#+k.m #.*.&.=.#.=.=.*.*.O | = @ @ . # @ % m #.%.#.| + . . . . . = #.&.&.=.*.*.&.=.=.=.=.=.=.&.#.*.&.&.'.q 0 R -.A A B y p A l % . . . . . . . . . + . . - . . . - . . & 2 l B y B B B B B B B B B B B A A B w o m Q f.d.f.0.j.e.f.. + + . . . . + : = + - . . & % - . - . = , 1 5.j.e.0.f.9.9.9.9.f.9.9.9.9.9.d.9.e.j.S T.F+C+y+w+w+y+z+z+w+z+A+C+z+D+A+z+G+c+g . @ @ @ % @ > +x+A+A+A+z+z+z+z+z+z+z+z+w+A+y+z+w+w+z+z+D+G+H.", -"I.G+A+z+y+y+A+z+C+A+D+D+x+x+ +] . + . @ % % @ @ @ . + @ @ . [ +1+B+z+A+A+F+z+z+w+z+z+z+z+w+z+z+z+B+-+m.2+b+b+|+}+}+b+b+9+C.) @ . . . @ @ - L N.&+8+8+&+n.- - $ $ $ + % @ + - 2+b+9+}+|+|+|+}+f+|+|+7+f+b+K.p.[+u+q+h+l+l+s+d+c.@ . + . . + $ & X.s+k+d+s+q+s+d+y.. . + + . . @ @ X.k+k+s+s+s+k+k+s+s+k+k+k+q+r+[+-.n +.Z U U Y Y +.Y Z e p e e M Y .+.U n * # . @ @ . . * d P X Y Y Y Y Y Y Y Y Z U Y +.+.` ` X +.Y P d v.3+4+(+:+:+:+4+3+:+(+3+:+3+:+:+:+4+4+0+0+}.~ + $ + . . . . . @ }.0+4+:+:+<+3+3+:+(+:+:+3+:+:+:+3+4+[._.#+W.`.W.Q.Z.U.Z.U.U.U.U.U.W.R.W.U.M.8 . . + + . + . . . { J F.Z.#+Z.Q.U.U.U.U.U.U.U.U.U.U.U.Z.U.#+w.k #.&.=.*.*.&.'.%.#.k < @ . . . @ $ | #.%.'.#.< . @ - + + + $ >.&.&.=.*.*.=.=.=.=.=.=.=.=.*.=.&.&.&.*.0 l A x A A B y A l @ . . . + + @ # @ . . . . . . . . . . @ @ * 2 w A A B B B B B B w r p x A A A A A v Q d.d.f.9.j.j.u . . + . . . . . + + . . . . # @ & # . - + $ , s 2.9.j.9.9.9.9.9.9.9.9.9.9.9.9.9.d.9.S '+E+C+y+y+w+z+z+z+w+z+w+z+z+y+A+F+x+x.] @ @ $ @ . . a.m+y+w+w+z+z+z+z+w+z+z+z+z+w+z+z+z+z+w+z+z+A+E+I.", -"T.B+D+F+x+z+C+z+z+z+w+y+j+s.] - - . @ @ % % % @ . . + @ @ @ . [ H.B+y+w+A+F+y+z+w+z+z+z+z+A+z+z+z+D+-+h.%+9+|+9+9+|+9+b+9+N.L - @ . @ $ $ @ - 5 L J.m.5 / - + $ $ @ + # & . - 2+b+b+9+9+9+9+9+f+|+|+7+9+f+N.3.~+u+r+k+k+l+l+e+c.+ + + . . + + ! ~+s+k+h+s+s+t+l+y.. + + + . . $ % X.s+t+s+s+k+k+s+s+s+k+k+s+q+r+[+6.c .Y Y Y Y Y Y Y Y Z @.M P ` Y X X U e * # . # . . . * d P Y X Y Y Y Y Y Z Y Y Y Y +.+.@.` Y +.Z P d s.p+p+3+(+:+4+(+3+:+:+3+3+3+:+:+4+3+0+!+7 + . . @ @ @ $ . . > [.,+0+4+:+<+3+6+a+:+3+:+3+:+:+(+:+3+p+[.}.#+W.W.W.W.U.Z.Z.U.U.U.U.U.U.W.Z.#+F.8 + + + . . . . . . . @ { u.#+#+Z.U.U.#+W.U.U.U.U.Z.U.U.Z.U.#+k.m #.=.&.=.*.&.=.#.O < @ @ + . . + | #.'.&.'.#.< . . - + . - = #.=.=.=.*.=.=.=.=.=.=.=.=.=.*.=.&.&.=.O 0 l A x A A B B A ; @ @ % @ . + # # @ $ @ & % @ @ @ @ . . # . @ ; f l A B B B B B B B B x B A A A E E | Q d.d.f.9.b.d.u . . . . . . . . - . $ , m : , = $ $ # . . . + $ Q f.0.9.9.9.j.j.9.9.9.9.9.9.9.9.e.j.S -+G+D+z+y+C+z+C+z+z+z+z+z+z+v+y+z+j+9 @ % @ + + . > I.y+E+z+z+z+z+z+z+z+z+z+z+z+w+z+z+z+z+y+z+z+D+G+T.", -"I.G+D+z+y+z+D+z+y+v+F+m+W - . + - - . @ % % % @ + # @ & & % @ . > a.A+w+z+G+y+z+A+z+C+z+z+z+y+z+z+G+T.7.%+5+b+f+9+|+9+b+7+8+7.> @ @ + + $ @ - - - ) # - - . = = $ - + @ % . - 2+b+9+|+|+9+9+9+9+|+|+7+9+b+K.3.~+q+r+k+k+s+s+k+c.@ $ . . - + $ ! X.s+s+k+s+q+t+l+y.@ . + . . . $ % X.s+s+s+s+h+k+q+q+s+k+k+h+q+q+*+c.P T Y Y Y Y Y Y Y Y +.Y Z ` U +.Z U ` e * # . . @ # . % i P +.+.+.Y U Y Y Z Y Y Y Y +.+.@.` Y +.+.P d s.p+3+4+:+:+:+:+:+:+_+:+3+3+:+3+3+p+P.4 $ + $ @ @ @ @ @ . > [.,+0+4+4+:+<+<+:+<+<+:+:+3+(+:+<+:+3+4+[.}.#+W.`.U.W.U.W.U.U.U.U.U.U.U.#+U.#+w.{ . . . . . . . . . . . . { w.Z.U.U.#+U.Z.U.U.U.U.W.U.U.Z.W.#+k.m #.=.&.=.=.&.$.=.| $ % @ + + . < O *.&.&.&.%.< . @ - + + . = >.=.&.=.*.*.=.=.=.=.=.=.=.=.=.&.&.&.*.q h l A x A A B B A ; . . . . . . + $ f w I l l 2 ; & & @ @ . @ # @ f }.w B B B B B B B B B x x B B A y 0 2.j.e.9.9.b.d.u . . . + $ . . . - + H !.5.5.N u = $ $ + @ # . @ Q 8.d.j.9.9.e.e.9.9.9.9.d.9.9.9.d.9.S '+G+C+y+y+z+z+z+z+z+z+z+z+z+y+y+F+H.] % % @ - . . _.j+F+A+z+y+C+C+z+z+z+A+C+z+z+z+z+z+C+z+w+y+z+A+E+I.", -"T.y+A+A+w+y+z+A+D+y+j+_.. . . . % & @ @ g T.m+>+x.[ @ @ % % @ - . + a.x+x+w+D+A+w+z+z+z+z+w+A+z+w+G+T.7.7+b+9+}+}+b+5+b+7+2+$+L - . $ @ % % % . . + , @ . # - + $ @ + $ @ @ - 2+|+b+|+|+|+|+|+|+}+9+7+|+9+K.3.~+q+k+l+d+d+d+d+c.@ + $ # @ + @ ! X.l+k+d+k+t+s+d+E.& + + + = $ @ @ X.k+h+h+k+k+k+k+h+h+k+e+k+q+q+[+6.c .Y Z U Y Y Y Y Z Y Y Z Y Y Z Z Z Z e % . . @ % + . @ i P +.+.Y Z Y Y Y Y Y Y Y Y X +.Z Z X +.Z P d s.4+<+:+:+(+:+(+_+:+<+:+_+(+_+{+,+}.~ + + . + . @ $ $ + > W =+{+=+:+:+=+:+:+:+(+4+_+:+:+:+:+:+(+:+4+[.}.W.U.U.W.=+U.W.U.U.U.U.U.U.U.U.W.L.u.:.).}.:.J % @ . - + . . . # 8 U.U.U.U.U.U.Q.U.U.W.U.Q.U.W. +`.k.m #.=.&.=.*.*.k ; + . + $ $ @ < j #.,.'.#.l.O j = . . - - + = #.#.=.'.%.&.=.=.=.&.=.*.=.=.#.*.&.&.&.6 3 h A B B B B x B A 3 3 o 2 ; ; ; l I I A y B A 2 & % @ # . # . . ; A A B B B B B B B B B B B B B B B m 2.0.9.9.9.0.f.2.. - + . + + . @ $ 1 0.0.i.j.j.f.u = . . # . . @ , N e.d.0.0.9.d.d.d.9.9.9.d.9.9.e.j.S T.G+D+y+v+w+z+z+z+w+z+w+z+z+D+x+j+[ + @ . . * % > T.z+y+y+z+A+z+z+z+w+w+w+A+z+y+w+z+z+z+w+w+z+z+A+G+I.", -"I.B+A+A+w+y+z+A+w+y+ +{ # . . . % % @ W '+y+G+G+B+T.9 @ % % . . - % 4 j+x+E+A+E+y+w+y+w+y+v+z+z+w+G+T.h.}+9+9+|+}+|+9+9+}+7+8+&+7.) + + @ % % % @ + + . ) 3.J . + # + + $ # 5 2+}+9+|+|+|+|+9+9+|+|+7+9+b+K.3.]+u+h+k+l+d+l+d+c.% @ $ @ # . @ * X.s+t+d+s+t+q+[+E.% + . $ = $ @ ! X.e+s+s+h+k+k+k+k+s+k+d+h+s+t+[+6.c .Y Y Y Z Y Y Y Y Y Y Y Y Y Y Y Y Y e % + . @ @ + . @ i P Y Y Y Y Y Z Y Y Y Y Y Y +.+.@.` Y Y @.P d s.4+:+4+:+:+:+<+<+_+:+:+0+_+_+1+}.@ # + + $ + . + @ . ] u.{+<+<+(+4+:+=+:+4+(+:+:+:+:+:+{+:+:+:+:+4+[.}.Z.`.W.W.Y.U.U.U.U.U.Z.W.W.U.U.U.Z.Y.`.M.R.W.U.w.~ # . . . . . . # ).U.U.U.U.U.R.U.U.Z.U.Z.U.Z.Y.#+k.m #.'.=.%.*.*.j + . . + $ @ = 7 C O O j t j j , = . . . . @ $ F k q q %.&.=.=.=.=.=.=.=.=.*.*.&.&.&.q 3 l y y A A B x x B A w w A A A w A A z B x B A l & % . . @ . . . ; A A B B B B B x B B B B A A B B B m 2.f.0.9.9.0.f.f.. . - . . + . - , |.b.d.f.j.9.9.N , . - @ % # + + t i.d.9.9.9.f.0.9.9.9.9.9.9.9.9.f.S -+F+A+y+y+A+z+y+w+A+w+z+z+y+D+x+x.> # . + + * % W m+y+B+y+y+w+w+z+z+z+w+z+z+z+w+w+w+y+z+y+w+y+z+D+E+I.", -"T.B+z+z+y+y+z+D+A+B+].@ + . . . @ @ [ T.y+F+z+A+C+y+x.% % % @ . @ $ ~ I.x+E+D+y+y+z+C+z+z+z+z+z+z+G+T.7.2+9+b+f+}+|+9+9+9+9+f+7+7+C./ . . @ # @ @ . - 5 n.J.L @ + @ - $ $ $ L 2+}+|+}+}+}+|+9+9+}+}+7+9+9+K.z.[+u+q+s+l+k+t+s+E.. $ $ # . . @ & E.l+s+u+s+t+t+[+c.& + . + $ + % ! ~+s+s+s+s+h+h+h+h+s+k+l+l+r+q+[+c.c .Y Z U U Y Y Y Y Y Y Z Y Z Z Y Y Y e % - . @ # + . @ i ` Y Y Y U U Y Y Y Y Y Y Y Y Y Y @.Y Y Y P d v.4+4+3+:+4+3+4+_+^+(+^+_+0+1+H + + + + + + . @ @ + D O.0+4+<+<+:+:+<+:+:+4+:+(+3+3+3+:+3+:+:+:+3+4+[.}.#+W.U.U.U.U.W.Z.Z.Z.W.Z.Z.U.U.W.W.W.#+W.W.#+#+U.J @ . + + . . . # 8 #+U.U.#+W.U.U.U.Z.W.U.U.Z.W.#+k.k >.=.&.&.=.>.< . . . + $ @ % % % % = , , , , = + + . . . @ @ 7 = , 0 #.&.*.=.=.=.=.=.&.&.*.*.=.&.&.q 0 l A B B B B B B B A A A A B z A z w w x B y I I ; # . . % # . . % A B B B B B B B B A B B x B B A B m Q f.9.e.f.i.i.2.. . . . . . $ . : 5.8.d.f.j.d.0.i.: . . + @ # + + s 0.d.d.j.j.9.9.9.9.e.j.9.f.9.9.j.u -+G+C+y+y+z+z+z+z+z+w+z+C+z+w+y+g . . . + . & @ x.y+z+y+B+B+z+z+z+z+z+z+z+z+z+z+y+y+z+z+z+w+y+z+D+G+H.", -"I.B+A+E+y+y+y+D+A+y+g # + + . @ @ . ].j+z+E+A+C+A+D+m+9 @ % & % % @ - L F+z+C+z+y+z+z+z+z+z+z+z+z+G+-+n.2+9+b+}+|+}+9+b+b+5+5+b+9+}+$+J.m.L 5 / 5 L n.%+2+&+5 @ @ @ . $ $ . L 2+9+b+9+|+|+9+9+9+9+}+7+9+9+K.3.]+u+s+k+d+s+s+s+X.- . $ . . . + ! E.l+s+l+t+s+e+n+b % + + + + $ @ b ~+s+s+s+h+k+k+l+h+s+k+d+l+q+r+[+6.c T Y Y Z U Y Y Y Y Z Z Y Y Y Y Y Y U d % - . @ @ + . % d P Y Y Y Y Y Y Y Y Y Z Y Y X +.Z Z Y +.Z P d P.p+(+:+:+:+4+(+<+(+:+4+{+1+9 + + + + . + + + @ > <._+0+4+<+<+a+6+4+(+:+(+4+3+3+<+3+3+:+3+:+:+:+3+4+[.}.#+W.W.W.U.U.Z.U.U.Z.W.Z.W.W.U.W.U.W.R.W.U.U.U.#+w.{ . + + . . . . { U.U.#+U.Z.U.U.W.W.Z.U.U.U.W.#+k.m #.=.&.'.=.*.| @ . . + + # @ @ # + + @ $ + + + + $ $ $ @ - + = $ % , #.%.=.=.=.=.=.=.=.&.#.%.=.&.'.q h l A B B B A w A w A B A A w y y x B w x z B I I ; @ . . @ . . . % 3 B B B B B B B B B B B A A B B B m 2.f.9.d.f.0.j.0.$ + . + . + @ + s 0.8.8.f.j.d.f.i.1 + @ $ @ . + = s 0.d.0.j.e.9.0.9.9.9.f.9.9.j.j.j.S -+F+C+y+y+A+z+z+z+z+z+z+z+z+y+-+] + + + . . @ _ '+y+y+B+B+G+C+z+z+z+z+z+z+z+z+z+z+z+z+z+z+y+C+y+D+G+T.", -"T.B+A+E+y+y+y+A+z+m+g + @ @ . % @ @ ].m+E+D+D+D+D+E+j+W . @ % % % % . 5 B+E+A+z+y+z+z+z+z+w+z+z+z+B+-+n.2+9+9+9+9+}+}+9+9+b+5+b+5+5+b+}+7+%+$+$+$+;+9+b+7+&+- @ % - . $ @ - h.}+b+9+9+9+|+9+9+|+|+|+7+9+b+K.p.[+u+q+h+k+k+k+s+S.& . $ . . + + % 6.l+k+l+s+t+k+l+b # + - . + + + 4.~+s+s+s+h+h+h+k+s+s+k+d+l+s+t+[+-.c .Y Y Z U Y Y Y U Y Y Y Y Y Z Y Y Y i % - . @ # . . * d P Z X Y Y Y Y Y Y Y Y Y Y X +.U Z Y Y @.P i I.p+3+3+(+3+4+:+:+(+0+0+v.F . + + . + + + + . a u.(+4+4+(+:+3+6+<+4+:+:+4+4+4+:+:+3+(+3+3+:+:+3+3+4+[.}.Z.W..+`.R.W.#+Z.Z.#+U.#+#+#+#+U.Z.#+W.Z.U.W.#+#+M.8 . + + . . . . { R.#+U.U.Z.R.U.W..+U.U.U.Z.U.#+k.m #.=.&.'.=.>.| @ . . + + + # + @ @ . # @ . + @ @ + @ @ $ . - @ @ % , #.*.=.=.=.=.*.&.*.=.*.*.%.&.&.q h l A B B x A A A w w A x I I A A w w B A x A A I ; @ . . . . . . % 3 B B x B B B B B B B B B A B B r 0 2.9.9.9.f.0.j.0., # @ - + $ . + s i.8.8.f.b.9.0.i.1 + # $ @ . . $ s 0.d.f.i.j.9.0.9.9.9.9.9.9.9.j.j.S T.F+A+y+y+C+z+z+z+z+z+z+z+z+y+a.+ $ + . . @ @ a.m+F+E+E+z+z+z+z+z+z+z+A+z+z+z+z+z+y+z+z+y+z+z+z+D+y+I.", -"I.B+A+A+w+y+z+A+A+>+_ + @ # . @ @ @ W m+y+w+D+E+D+E+'+W # @ % @ @ * + [ x+z+z+w+y+z+z+z+z+w+z+z+z+B+H.n.;+b+9+|+|+}+}+|+|+|+9+9+9+9+9+9+f+7+f+9+b+b+5+|+2+J.. + # . . $ . ) C.}+9+9+9+|+|+|+9+|+|+|+}+|+b+K.3.~+q+k+k+k+k+s+s+~+R + . . + + + # R l+d+d+k+s+d+~+& . + . . + + + c.d+s+k+h+h+h+k+k+k+h+k+k+l+s+t+[+6.c T Y Y Y Z Y Z Y Z U Y U Y U Z U Y U d % - . @ $ + . % i M X Y Y Y Z Y Y Z Y Y Y Y Y Y Y Z Y Y Z P d s.3+:+:+(+:+(+:+<+(+{+1+4 # @ $ + + + + + @ F Q.)+{+(+4+0+(+:+:+:+(+:+=+:+(+:+<+(+:+:+:+:+:+:+:+(+4+[.}.W.`.`.R.R.U..+M.w.w.w.}.).f 8 { }.U.U.U.U.W.W.W.G.< . . . . . . . { `.U.U.U.U.R.U.U.U.U.U.U.U.Z.#+k.m >.=.=.&.'.>.| + . . + + + + + + @ . + + . . @ @ + @ . @ - . . @ @ < #.*.=.=.=.*.*.=.*.*.*.=.=.&.&.q h l A B A A w w w h 3 3 h 2 3 ' ; f I B B y B x I ; + . . . . . + * o A B B B B B B B B B B A A B B x m Q i.e.9.f.0.9.0.1 = @ . # % . + : i.8.8.d.e.d.0.i.: . + $ $ . + + s 0.d.9.j.j.9.9.f.9.9.9.f.9.9.e.9.S T.G+A+y+v+w+z+z+z+w+w+z+z+z+j+g + $ @ . + @ . s.x+E+D+E+y+y+w+w+z+z+A+w+w+z+z+z+w+w+z+y+w+w+w+y+E+F+I.", -"T.B+A+A+w+y+z+A+E+x+9 + @ @ . @ % @ W m+y+E+E+z+w+z+'+_ @ @ @ # @ % + g x+z+F+y+y+z+z+z+z+w+z+z+z+G+-+n.2+9+9+|+|+|+}+}+7+7+8+$+N.C.C.C.m.L C.9+b+5+9+9+2+7.. $ + + + $ . / $+;+|+9+9+|+|+|+9+9+|+|+}+|+9+K.3.~+u+h+k+k+s+t+t+~+c.+ . - + + + # b ~+l+d+o+s+l+y.% . + . . + . + E.e+k+s+h+s+k+k+k+h+h+k+k+l+q+t+[+6.n .Y Y Z Y Y Z Y Y Y Y Y Y Z Y Y Y Y e % . . @ % @ . @ i ` X Y Y Y Y Y Y Y Y Y Y Y +.X Z Z U Y Y P d u.3+:+{+:+<+(+<+:+1+{+_.- + + % @ + + + @ ].)+.+0+0+0+0+0+0+0+0+4+6+3+:+<+(+(+3+(+(+:+:+:+:+:+(+(+4+[.}.W.W.W.{+`.#+++w.8 { { @ @ @ . . J M.U.U.U.Z.R.++4.< . . . . . . # f W.U.U.Z.U.U.U.U.U.U.U.U.U.`.`.k.m >.*.=.&.=.>.| + . . + + + + + . . @ @ . . . . @ + @ + . . . . @ @ , O '.=.=.=.*.*.*.*.&.>.*.&.&.&.q 0 l w B A I w A 2 ; ; * * * * % & f w A A x y I I * . . . @ . . + 2 w A B B B B B B B B B B A A A A A m 2.j.j.j.9.0.0.i.O , + - . @ . . = |.e.d.f.9.9.f.2.: . @ @ + . + $ t i.d.9.9.9.0.f.9.9.9.9.9.9.9.e.j.S T.y+C+w+y+w+z+z+z+w+w+y+z+A+'+] + % @ . + @ + +x+E+A+z+y+w+w+w+z+z+z+v+w+z+z+y+v+w+z+z+z+w+w+z+A+E+T.", -">+B+z+z+y+y+z+D+E+y+9 @ $ + . @ * % ~ x.v+F+z+y+y+v+x.+ @ @ @ . . & > a.x+F+z+z+y+z+z+z+z+A+z+z+z+G+T.n.2+9+9+}+|+9+9+7+2+K.h.L 5 [ ) ) - + 5 ;+9+9+9+9+7+/ + , + - - @ + L 2+}+|+9+}+|+|+|+9+9+|+|+7+f+b+K.3.]+u+s+k+k+s+t+t+d+E.. . . . . + % ! 6.s+l+t+s+[+R % . . - - . . = X.e+k+s+s+s+h+h+k+s+h+k+k+l+q+r+[+-.n .Y Z Z Y Y Y Y U Y Y Z Y Y Y Y Y Y e % . . @ @ + . @ i P Y Y Y Y Y Y U Y Y Y Y U X X @.Z Y +.@.M d v.p+(+4+:+:+4+:+<+3+P.] + + @ % # . + . @ 4 J J F F J J J F F J F F <.3+4+4+:+:+:+(+_+:+3+:+:+(+3+4+u.}.W..+`.V.U.#+++M.8 . . . . . + + { }.U.U.U.U.W.`.:.@ . . . . . . . }.Q.U.U.U.U.U.U.U.U.U.U.U.Z.{+`.k.m #.=.&.=.=.*.< . . . + . . . . . . . . . . . # . . . - . + . . . @ , >.&.=.=.=.=.&.=.=.&.>.*.&.&.&.q 0 A A A A A A A 2 * & @ @ % @ @ @ 8 l y A x y A o & @ . . % . . . 2 w B B B B B B B B B B B A A B B B m 2.9.j.j.f.0.f.i.,.= + . + . . @ = ..e.d.f.f.d.9.N , - . @ @ . + $ s i.d.9.j.j.9.f.9.9.9.9.9.f.9.e.j.S T.G+C+y+y+C+z+z+z+z+z+z+z+z+T.> @ & % + . @ g '+z+D+E+F+y+y+y+z+z+z+z+z+z+z+z+z+z+y+z+z+z+w+z+z+D+z+T.", -"I.B+A+E+y+y+E+A+D+y+a.+ % % . - @ $ @ ] H.x+x+x+g+a.] . . @ . . - % ~ T.y+D+C+z+y+z+z+z+z+A+z+z+z+B+T.h.2+9+}+|+|+9+9+}+f+K.L . + $ % $ @ + ) n.2+2+2+$+L - . $ @ # @ . - J.7+b+b+9+|+|+|+|+9+9+|+|+7+9+b+N.p.[+q+r+k+k+s+t+t+l+X.b % @ @ . @ % . & :.*+X.X.I { % % @ + + @ % R [+k+t+t+s+s+s+h+k+s+h+k+k+d+q+r+[+6.c T +.Y Y Y Y Y Y Y Z Y Y Y Y Z Z Y @.d & . . @ . + . & d ` Y Y @.` @.Z Z Y Y Y Z Y Y Y Y U X X Z M d P.p+3+3+(+:+4+4+4+0+4 + $ . # @ + + . . + . . . . . . . . . . + + . F p+4+4+4+(+(+3+^+3+3+(+:+3+:+4+[.}.#+W.W.W.U.#+#+W.m @ . . . . + . . 8 k.W.#+#+U.}.$ . . . . + + . { w.W.U.#+#+U.U.U.U.U.U.U.U.Z.V.#+k.k #.=.&.=.=.#.j k 0 < m | < < < 0 < < < < < < = @ @ . . . @ $ < < j j #.>.=.=.*.=.=.=.=.=.*.*.&.&.&.q h I I x A A A A o ' % @ @ @ # # + + * A I ).A 3 * & % . + @ @ % * 3 z x B B B B B B B B B B B B A B A m 2.0.9.e.f.0.9.9.5.s $ . - . @ % = : u 2.i.i.5.2.: $ . @ # . @ @ s 0.9.9.f.j.j.9.9.9.j.9.9.f.9.9.e.j.S T.F+A+y+y+z+y+y+B+w+z+z+z+A+].- # @ @ + . @ a.m+z+A+z+F+z+y+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+w+z+F+E+z+H.", -"I.G+D+y+x+y+z+E+E+y+ +] @ % # . @ % @ @ ] W x.H.].{ - . . . @ % # $ 9 m+z+A+A+z+w+C+z+z+z+z+z+z+z+B+T.o.2+9+|+9+9+9+9+|+9+7+m.- $ % % % @ - ) 5 7.7.7.5 - - . % @ @ $ . 7.8+9+5+9+b+9+}+9+9+9+9+}+9+}+9+9+K.p.~+u+q+h+k+q+s+s+l+~+B.; # % @ @ + . . . a J b % % % % % $ $ . # X.d+t+t+r+q+s+k+h+h+s+s+k+k+l+q+r+[+-.c T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y @.n ; @ . . @ + + % i @.X +.Z ` Z Z Z Y Y Y Y Y X +.Y Z Y Y Z P d s.p+3+3+:+4+4+4+{+O.$ $ + . + . + + . . + + . . . . . + + . . + + + F 0+{+:+:+_+_+3+:+3+3+(+(+3+3+4+[.}.#+.+.+U.U.W.W..+++) @ . . . . . . @ ~ J }.}.J @ # . . + + . + . }.W.U.U.#+#+U.U.Z.U.W.W.U.U.Z.W.#+k.k #.=.&.=.*.>.*.>.>.*.%.#.>.#.q *.*.>.#.q #.q < % @ . + # @ $ O >.*.>.>.>.=.*.=.=.=.=.=.=.*.=.&.&.&.q 0 I I B A B B B A ( ; + % @ @ . . . @ * ; f ; & @ % % . - + @ & 2 B x B B B B B B B B B B B B B A A o m 2.i.9.e.9.9.9.b.j...1 + - . % % . $ ~ : s u t 1 = @ . . - . $ $ Q d.d.f.9.9.j.9.9.9.9.9.9.9.9.9.e.j.S '+F+C+z+y+C+y+y+B+w+y+z+B+G+8 . . . . . . . x.v+z+z+z+z+z+z+z+z+z+z+z+z+C+z+z+z+z+z+z+z+z+z+z+z+A+G+T.", -"T.y+D+y+y+v+z+A+E+w+x+a.- @ @ @ & * % @ @ . [ ] . - . + @ % & * * , +y+E+E+A+z+w+z+z+z+z+w+z+z+y+G+T.h.2+b+b+|+|+|+9+|+|+7+$+L - % & % @ # . - ) ) - + @ @ % @ @ + . 5 $+7+|+b+|+9+|+|+|+}+}+9+|+}+7+|+9+K.3.]+u+s+k+k+k+k+k+k+n+X.b + # $ $ + . . . . . . . @ @ $ @ . # . c.[+l+k+k+h+k+k+k+k+k+s+h+s+k+k+s+t+[+-.c +.Z Z Y U Y Y U Y Y U U U Y Y Y U +.e ' @ + . @ . . @ } M @.X +.+.Y Y Y U Y U Y U X +.Z Z Y Y @.P d s.4+:+:+<+(+:+(+,+8 + + + . + + . . . . . . . . . @ @ . . . . . + + J 0+(+:+:+^+(+:+:+:+(+:+:+:+:+4+[.[.#+U.W.M.R.W.W.R.++}.. . . . + . . . . . . . . . . . . + + + + { M.W.M.W.Z.R.U.R.Z.U.W.W.U.U.{+`.#+w.m #.=.&.=.*.=.=.>.*.=.=.*.=.*.>.=.=.*.>.=.'.>.m % # . . . @ % #.%.*.*.*.=.*.=.=.=.*.=.=.=.>.%.'.&.=.q 0 l A A A A A B A 3 ' @ % @ . . . . . @ @ @ @ @ @ @ @ . . @ % ; w w x B B B B A A B B B B x B B B A B m Q i.9.9.f.0.9.d.j.5.u , $ . # # - . + + $ = $ + @ # - - . + $ | 2.9.9.9.9.9.9.9.9.f.9.9.9.9.9.f.e.j.S T.G+C+y+w+w+z+A+A+z+v+y+G+m+> # . . . + . . T.z+y+w+w+z+z+w+w+w+w+z+w+w+w+z+z+z+v+y+z+z+z+w+A+z+D+F+I.", -"I.y+D+z+y+w+A+z+A+A+y+m+W + @ & % % % % # . . . + @ @ % @ % % % % r.x+w+D+D+A+z+z+z+z+z+w+w+z+z+z+G+T.h.2+b+|+}+}+|+|+b+b+7+8+J.5 . @ @ $ $ $ @ # # @ % $ % % $ @ $ L $+7+9+|+|+9+}+|+}+|+}+}+|+|+}+7+|+b+K.3.~+u+k+k+h+k+k+k+k+k+d+S.b @ @ @ + $ + + . . + + + $ = $ % @ a [+k+h+d+d+k+k+k+k+k+h+k+s+k+d+d+s+t+[+6.n .Y Z Z Z Y Y U Z Y Y Y Y U Y Y Y +.e ; . . . . . - @ ( M @.Y +. .+.U Z Y Z Z Z Z X +.Z Z Y +.@.P d s.3+:+:+:+(+:+<+)+. . . . . @ # . . @ # . . . . . @ @ . @ @ . . + + J 0+<+:+_+^+(+:+:+:+(+:+:+:+(+4+[.[.#+U.W.M.U.U.W.R.Q.Q.J . . . . . . . . . . . + . . . . . . + 8 w.U.U.M.W.U.R.U.R.W.U.U.U.U.R.V.`.#+}.m #.=.&.=.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.=.&.>.| @ @ @ + @ @ % >.%.%.*.%.&.=.=.=.=.=.=.=.=.>.%.&.&.=.q 2 l A A A A A B B B 2 @ @ @ . . . . . . . + + + . . . @ . % * h I w x A B B B A B B B B B B B B B A o | Q i.9.9.d.0.9.9.j.i.5.u : @ . - - # . # % @ . # # . - - + , 1 ..i.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.e.9.S T.F+D+y+v+w+D+A+A+w+y+y+z+>+> @ % @ @ @ # @ >+A+v+v+w+w+y+w+w+w+z+z+w+v+w+z+z+z+w+w+z+z+w+w+z+z+E+E+I.", -"I.G+A+F+y+y+E+z+z+A+w+F+m+a.> @ @ @ @ # @ @ . # % * % % @ @ @ _ a.m+F+w+A+E+G+w+z+z+z+z+z+z+A+z+z+B+-+h.2+b+|+}+}+9+9+b+b+}+7+2+C.5 . @ @ + $ $ % % % % $ @ @ + ) 5 %+7+}+9+|+|+9+}+9+}+|+f+9+9+|+|+7+9+b+K.3.]+u+q+k+l+l+s+t+k+k+t+n+E.b - + @ + $ $ + $ + + + + + + & R X.t+k+t+d+d+k+s+s+h+h+h+s+s+k+l+l+q+r+[+-.c .Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y P d % . . @ . . . % } ` Y Y +.T +.Y Y Y Y Y Y Y +.+.Z Z X +.Z ` d P.3+(+4+:+(+:+3+O.. . + . . @ # . . @ # . . . . . . . . @ # . . + + F 4+<+<+:+^+(+3+:+3+3+:+:+3+3+4+u.}.#+#+W.U.U.U.W.W.R.W.R.).8 @ . . . . . . + + . . . . . . @ 8 w.#+Z.`.@+R.U.#+U.U.U.U.U.U.U.R.W.U.#+k.m #.*.&.=.=.=.=.=.*.%.%.=.'.=.=.'.=.=.=.=.&.>.m @ % @ . @ % = *.,.%.'.*.&.=.=.=.=.=.=.=.=.%.=.&.&.=.k 3 l A B A B B B B B w f { + @ @ @ . . . . . . . . . . % & ; l I w x A A B B B B B B B B B B B B A w o m 2.0.e.e.9.f.9.9.0.9.j.2.s : $ - % % + @ @ # @ @ - . . + , 1 Q i.j.9.9.9.j.j.j.9.f.f.j.j.f.9.9.9.e.j.S -+F+A+y+y+C+D+E+A+z+y+y+y+T.+ % % # @ % @ % '+A+w+w+z+z+y+z+z+z+z+z+z+z+z+z+z+z+A+A+z+z+z+w+z+z+E+G+I.", -"I.G+E+z+y+z+E+z+z+A+C+E+E+x+s.]./ . . . @ @ . @ % % @ . + g W T.m+y+z+A+A+z+y+y+z+z+z+z+z+z+z+z+z+G+-+h.2+b+b+9+}+9+b+b+9+}+7+2+2+C.L / - . @ + . @ . . . . ) L z.$+|+|+|+b+|+|+9+}+9+|+9+9+9+9+|+9+7+9+9+K.p.~+u+s+k+l+q+s+s+k+t+t+t+k+X.4.b & @ @ @ $ + . + + . # 8 E.[+l+t+k+r+d+d+h+s+s+k+k+k+s+s+s+k+l+s+r+[+6.c .Y Y Y Y Y Y Y Y Y Y Y Y X Y Z Y M i % @ % % % . @ ; e P @.Y +. .+.Y Y Y Y Y Y Y +.+.Z Z Y Y @.` d v.p+(+4+:+:+:+(+J + . . . . . . . . . . . . . . . . . . . . . . . . F 4+4+<+6+:+^+3+:+3+3+:+(+3+3+4+[.}.#+#+W.V.R.#+U.#+U.U.#+R.q.J { # . . . . . . . . . . . 8 }.w.U.#+Z.`.++R.U.#+U.U.U.U.W.U.U.U.U.U.#+k.m #.=.=.*.%.=.=.=.=.=.=.=.&.&.&.&.&.&.'.'.&.>.< # @ + + + % , %.'.'.&.*.=.=.=.=.=.=.=.=.=.%.*.&.&.=.k 3 l A B B B B A B B A I f f * % % @ @ @ @ @ @ @ @ @ # ; 3 h w w A A B B B B B B B B A B B B A A A A B m 2.0.j.j.f.9.d.e.i.9.e.j.5.Q 1 = $ $ + + @ # @ # + + = : s Q 0.f.9.9.9.9.9.9.9.9.9.9.9.j.9.9.9.9.e.j.S T.F+C+y+x+C+E+E+z+z+y+y+y+x.$ . . . . # # @ >+G+w+y+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+w+z+z+D+y+I.", -"I.G+D+G+y+z+z+z+B+C+C+A+E+G+x+j+H.a.[.H g g g g g H ].a.x.'+m+F+F+y+z+A+E+y+y+y+A+z+z+z+z+z+z+z+z+G+T.h.2+9+9+f+9+9+9+9+9+|+}+7+f+7+$+C.h.L L 5 L 5 L L L 3.J.%+8+9+|+9+9+f+}+9+|+}+9+}+9+9+9+9+}+|+}+9+9+K.p.~+u+s+k+l+k+k+k+t+e+t+s+q+q+l+X.E.R R a b b b b R c.E.X.l+l+k+q+s+h+l+l+h+s+h+h+k+h+q+s+s+l+l+r+r+o+4.n T Y Y Z Y Y Y Y Y Y Y Y Y Z Z Y Z ` n i ( } } i } } d n @.Y Y Y X Y Z Y Y Y Y Y Y X +.Y @.Y Y @.` i x.p+3+4+(+3+4+4+q.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.u.4+6+a+3+:+^+:+:+(+:+:+(+:+(+4+[.}.#+.+.+)+U.W.Z.W.U.Z.Z.U.#+M.k.}.J 8 8 8 8 8 8 8 8 J }.M.Z.U.#+W.U.W.Q.#+#+W.U.U.U.U..+W.U.U.U.U.#+}.m #.=.&.=.%.'.=.=.=.=.=.=.=.'.=.=.&.&.=.=.&.>.j < < 8 j | m j %.&.&.=.*.*.=.=.=.=.=.=.=.=.%.%.&.&.=.q 0 w A B B B B B B B A w A A h 3 2 ; ; * * * * * * ; 2 3 w I A A A B B B B B B B B B B B B B A A B B o m 2.0.j.j.f.f.9.d.i.9.9.d.f.0.2.N t 1 : : , , 7 : 1 u N N |.i.9.j.j.9.9.9.9.9.9.9.d.9.9.j.9.9.9.9.e.j.S T.G+C+y+y+C+z+z+z+w+y+G+B+'+x.a.a.a.a.a.a.x.m+A+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+w+z+z+z+z+z+z+z+D+G+T.", -"I.G+D+G+x+v+A+z+B+G+z+z+E+E+w+A+y+x+g+m+>+>+>+>+>+j+m+y+y+z+z+z+z+z+w+D+z+y+y+z+w+z+z+z+z+z+w+z+z+G+T.7.%+b+|+|+9+|+}+}+}+}+9+9+9+b+9+9+f+8+%+K.N.$+%+N.%+8+7+b+b+5+9+f+}+7+}+}+}+}+}+|+|+|+|+}+|+|+7+9+b+K.3.]+u+q+s+l+d+l+k+e+e+t+h+q+h+d+l+s+[+[+*+X.S.X.S.d+t+t+t+k+k+k+l+h+l+k+k+h+h+k+k+h+h+h+h+k+d+l+q+r+[+6.c .Y Y Z Z Y Y Z Z Y Y Y Y Z Y Y +.T X P M @.Z @.Y ` P Y . .Y @.Z Y Y Y Y Y Y Y Y Y X Z Z Y +.` M i x.4+3+:+(+:+4+(+4+3+4+4+4+0+0+4+4+0+4+4+4+3+_+0+4+4+0+0+4+4+4+4+4+0+0+:+<+a+<+:+:+:+:+:+:+:+:+3+:+0+u.}.Z.`.U.W.W.U.Z.U.U.Z.U.U.U.U.W.W.U.M.w.w.w.w.w.w.M.U.#+Z.Z.U.U.U.U.Z.Q.R.W.U.U.R.U.U.U.U.W.V.Z.U.#+}.j >.=.&.=.=.=.=.=.%.'.=.=.*.%.*.*.*.*.*.=.&.=.>.#.O O '.=.#.#.'.!.!.*.*.>.=.=.=.=.=.=.=.=.%.'.&.&.=.q 0 f I B B B B B A A A A r y w A A w A 3 3 3 h 3 A w A A A A A A x B x B B B B B B A A B B B B B A A o m 2.0.9.9.d.f.9.j.0.f.0.e.9.e.9.e.5.0.2.Q N Q Q Q 2.9.9.9.j.j.e.j.j.9.9.9.9.9.9.9.9.9.9.9.9.9.9.f.j.j.S T.E+C+y+y+w+z+z+z+w+y+z+B+z+E+F+F+F+F+z+F+F+z+z+z+z+z+z+y+v+w+z+z+z+z+w+z+z+z+z+w+w+z+z+z+w+z+z+A+E+I.", -"I.G+D+y+x+v+A+z+y+y+y+z+A+A+w+w+A+E+D+E+A+A+A+A+z+z+z+w+z+A+z+y+w+w+w+E+z+y+y+z+w+z+z+z+z+z+v+A+z+G+T.7.%+b+b+|+|+9+}+}+}+}+|+|+9+b+b+|+|+f+f+}+7+f+f+7+}+7+}+|+b+b+|+}+}+}+}+}+}+9+}+|+|+}+|+}+|+|+7+}+b+N.3.~+u+h+k+k+d+h+k+k+k+k+k+h+h+d+l+h+k+r+r+l+h+l+h+k+s+t+r+t+k+k+d+s+l+k+k+k+h+s+k+k+k+k+k+k+d+d+s+t+[+-.n .Z U Z U Y Y Y Y Y Y Y Y U Y Y +. .+.@.@.+. . . .Y ` +.+.+.Y ` Z U Y Y Z Z Y Y Y +.+.@.@.Y X @.M d s.3+(+:+:+:+:+:+:+:+:+:+:+^+{+{+(+_+(+^+(+:+(+(+(+:+(+(+(+(+(+(+(+0+(+=+:+:+:+:+:+:+:+:+:+:+:+:+:+4+[.[.W.U.U.R.W.U.U.W.U.U.U.U.U.U.U.U.Z.`.U.W.U.U.U.U.U.U.U.U.U.U.U.U.U.W.R.R.R.U.U.R.U.U.U.U.U.)+)+U.#+}.k >.=.&.*.=.*.=.=.*.*.=.=.=.*.*.*.=.=.%.=.&.=.=.*.>.=.=.=.>.%.&.!.!.*.*.>.=.=.=.=.=.=.=.=.*.'.&.&.&.q 0 b I B B A A B A A B x y x B A B A B B w x A B B A B x A y A B y A x x B B B B B A A B B B B B A A B m Q i.e.9.f.f.9.d.0.0.f.9.9.d.d.8.d.e.0.f.9.f.9.e.d.e.9.e.e.9.9.9.9.9.9.9.9.9.9.9.9.9.f.9.9.9.9.9.9.j.u T.E+A+z+y+w+z+z+z+w+y+y+z+w+E+E+D+D+D+D+A+D+A+y+v+w+z+z+z+w+w+z+z+z+w+v+z+z+z+z+w+w+A+z+z+w+z+z+E+F+I.", -"I.G+D+y+y+y+D+z+y+z+z+z+z+z+G+z+z+z+z+z+z+z+z+z+z+z+z+C+z+z+z+z+z+z+z+w+z+z+z+z+w+z+z+z+z+A+z+C+z+G+T.n.2+9+9+}+}+|+9+9+9+|+|+9+9+|+}+|+9+|+|+|+9+9+9+|+|+9+9+9+9+}+|+}+9+9+|+9+9+9+9+}+9+}+9+9+|+}+7+9+b+K.3.~+q+s+k+k+h+q+s+s+h+h+s+s+s+k+k+s+h+s+k+s+h+k+s+k+l+s+l+s+k+h+h+s+s+k+h+s+s+s+k+k+s+s+s+k+d+l+s+t+[+6.c T Z U Y Y Y Z Y Y Y Y Y Y Y Y Y Y Y Y U Y Y Y U Y Y Y X Y Y Y Y Y Y Y Y Y Y Y Y Y +. .@.` Y +.Y P d s.p+4+4+(+:+:+4+^+:+:+:+:+:+:+:+:+3+3+:+:+:+:+3+:+:+3+3+3+:+:+:+(+4+(+:+:+(+3+3+:+:+:+:+3+:+:+:+:+4+[.[.#+W..+U.U.U.U.U.U.U.U.U.U.U.U.W.W.W.U.U.U.U.U.U.U.U.U.U.U.U.W.U.U.U.U.U.U.U.U.U.U.U.Z.W.U.W.{+`.#+}.m #.=.&.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.*.&.*.=.=.=.*.=.&.=.=.=.=.*.=.=.=.=.=.=.=.&.=.*.*.=.&.&.q 2 l A B B A A B B B B B B A B B B B B B A B B B B B B x B B x B B B B B B B B B B B B B B B B B B B B | Q i.b.e.0.0.9.8.9.d.9.9.9.9.9.f.9.f.9.d.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.e.9.u -+F+C+z+y+w+z+z+z+w+z+C+z+z+y+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+w+z+C+z+z+w+z+z+z+z+w+z+z+D+y+I.", -"I.B+E+E+x+z+E+z+y+C+C+z+z+z+C+z+z+C+z+z+z+z+z+z+z+z+z+z+z+z+w+z+z+z+z+z+z+z+z+z+w+z+z+z+z+w+z+z+z+G+T.n.2+b+b+|+|+|+9+9+|+|+9+9+9+|+|+9+9+9+|+|+9+9+9+|+|+9+9+9+9+|+9+9+}+9+|+|+9+9+9+|+}+9+9+9+|+|+7+9+b+K.3.]+q+s+k+h+h+s+s+k+k+h+s+s+s+k+s+s+s+h+h+s+h+s+s+h+h+s+q+s+k+h+s+s+s+k+h+s+s+s+s+k+k+s+s+k+l+l+q+r+[+-.c .Y Y Y Y Y Z Y Y Y Y Y Z Y Y Y Y Y Z Z Y Y Y U Y Y Y X X Y Y Y Y Y Y Y Y Y Y Y Y X +.` ` Y .+.P i +p+4+4+(+:+(+4+^+:+(+3+3+:+:+:+:+3+3+(+(+:+3+3+(+(+(+(+:+:+:+:+3+4+:+:+:+3+:+:+:+:+3+:+3+:+:+:+(+0+[.}.#+#+W.W.R.W.Z.W.U.U.U.W.Z.U.U.W.W.U.U.U.U.W.U.Z.U.U.U.Z.U.U.U.U.U.U.U.W.U.U.U.U.W.U.W.U.U.U.Z.U.#+k.m #.=.&.=.=.=.=.*.=.=.*.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.*.=.*.=.=.=.&.=.=.=.=.=.=.=.=.=.=.%.%.&.&.=.q 2 l A B B B B B B B B B B B B B B A B B B B B B B B B x B B B B B B B B B B B A A B B B B B B B B B B m Q i.b.e.f.0.f.b.f.d.9.9.9.9.f.f.j.9.9.e.9.f.9.9.9.f.j.j.9.9.9.9.9.9.9.9.9.j.9.9.9.9.9.e.9.9.9.9.e.j.S -+F+C+z+y+G+z+z+z+z+z+C+z+z+y+A+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+A+z+z+z+z+w+A+z+z+z+w+z+z+E+G+T.", -"T.B+A+z+y+w+E+z+z+y+G+z+z+z+z+y+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+w+z+A+z+z+z+w+z+z+G+T.h.2+b+b+9+}+9+f+9+|+|+|+9+9+|+|+9+9+|+|+|+9+|+9+|+}+9+9+9+9+|+9+9+}+9+|+}+9+9+9+|+}+9+9+9+|+|+7+9+9+N.3.~+q+s+k+h+h+s+h+k+k+k+s+s+s+h+h+s+s+h+k+k+h+h+s+h+s+h+s+s+k+h+s+s+s+k+h+s+q+s+k+s+s+s+s+k+k+l+q+r+[+-.c .Y Y Y Y Y Y Y U Y Y Y Y Y Y Y Y Y Z Z Y Y Z Y Y Z Y Z Y Y Y Y Y Y Y Y Y Y Y Y Y +. .@.` Y .+.P i +0+(+:+(+:+(+:+:+:+:+(+3+:+:+:+:+3+(+:+:+:+3+:+(+:+3+3+:+:+:+<+3+:+:+:+:+3+:+:+:+:+:+(+3+:+:+:+(+4+[.}.#+`.W.W.R..+Z.W.W.U.U.W.W.U.U.U.U.U.U.U.U.W.W.U.U.U.W.W.W.U.U.U.U.U.U.U.U.U.U.U.W.U.W.Z.U.U.Z.U.#+k.m #.*.&.=.=.=.=.*.=.=.=.=.=.=.=.=.=.=.=.=.=.&.=.=.=.=.=.=.*.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.'.&.&.=.q 0 B B A B A A B B B B B B B B B B B B B B B B B B B B x B B B B B B B B B B B A A B B B B B A B B B B m 2.i.b.9.0.0.9.d.f.9.9.f.9.9.d.9.9.9.9.e.9.9.9.9.9.j.9.9.j.9.9.9.j.j.9.9.9.9.j.9.9.9.9.9.9.9.9.9.e.j.S -+F+C+z+y+C+z+z+z+z+z+z+z+z+z+w+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+w+z+z+z+z+w+A+F+A+E+x.", -"I.G+D+y+y+y+A+z+z+y+z+z+z+z+y+z+z+z+z+z+w+z+z+z+z+z+z+z+z+z+z+z+z+z+z+w+z+z+z+z+w+z+C+z+z+A+y+z+z+G+T.n.7+b+|+}+}+9+}+}+|+|+|+9+9+9+9+|+9+|+}+|+|+}+9+|+|+|+|+|+}+|+|+|+|+9+|+|+|+9+9+|+|+9+9+}+}+|+}+9+9+N.p.[+u+q+k+h+h+s+s+h+h+k+s+h+h+h+h+h+h+s+h+h+s+h+s+k+h+h+s+k+k+h+k+s+h+k+h+k+h+h+k+k+s+s+s+k+k+k+q+r+[+6.c .Z Y Y Y Y Y Z U Y Y Y Y Y X Y Y Y Y Z Y Y Z Z Y Y Y Y Y Y Y Y Y Y Y Z Y Y Y Y Y X +.@.` Y +.+.M d s.^+3+(+(+:+:+:+3+:+3+:+3+4+:+3+:+3+:+:+:+:+3+:+(+:+:+:+:+:+:+^+^+:+:+:+:+:+:+:+:+:+3+(+3+:+3+3+:+p+[.[.#+.+.+R.W.W.W.U.U.Z.Z.Z.W.W.U.U.U.U.Z.U.U.U.U.U.U.W.W.W.W.U.U.U.U.U.U.U.U.U.U.U.U.U.Z.U.U.U.U.U.#+k.j >.=.&.=.=.=.=.=.=.&.=.=.=.=.=.=.=.=.=.=.=.=.*.*.=.=.*.=.*.&.=.=.=.&.=.=.=.&.=.=.*.&.=.&.%.=.&.&.&.q 0 o E B B A A B B A A B x B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B A B B B m Q 0.e.e.0.9.9.d.9.f.9.9.9.d.9.9.e.f.9.9.9.9.9.9.9.9.9.9.9.9.f.9.9.9.9.9.9.j.9.9.9.e.e.9.9.9.9.f.9.j.S T.F+A+z+y+A+E+z+z+z+z+z+C+z+w+y+z+z+z+y+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+w+z+z+z+z+z+z+z+z+z+w+z+z+A+E+I.", -"T.G+D+z+y+v+A+z+z+w+z+z+z+z+w+w+z+z+z+z+z+z+z+z+z+z+A+z+z+z+w+z+z+z+w+w+w+z+z+z+w+z+z+z+z+w+w+z+z+G+T.7.%+b+b+9+|+|+9+|+|+}+|+|+9+|+|+}+}+|+|+|+|+}+|+|+|+|+|+|+}+|+|+|+|+9+|+|+|+9+|+|+}+|+9+}+|+|+}+|+9+K.3.~+u+s+k+k+k+h+k+k+k+k+k+h+h+k+k+h+h+h+k+h+h+k+s+k+k+h+s+h+k+k+k+s+h+k+k+k+s+h+k+k+k+s+s+k+e+k+q+r+[+6.c T Y Y Y Y Y Y Y Y Y Y Y Y Y +.Z Y Y Y U Y Z Z U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U +.+.Y @.@.+.Y M d s.3+<+:+:+(+:+:+:+:+:+:+:+_+:+:+:+(+:+:+:+^+^+(+:+:+:+:+:+:+:+^+^+:+:+:+:+:+:+:+:+:+:+:+:+:+:+(+:+4+[._.#+W..+R..+Z.Z.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.W.W.U.U.U.U.U.U.U.U.U.U.U.U.U.U.W.V.`.#+k.k *.=.&.=.=.=.=.=.=.*.=.&.=.=.*.=.=.=.=.=.=.*.=.=.&.*.=.=.=.*.&.=.=.*.&.=.=.&.&.*.=.&.*.&.*.*.&.&.&.q 0 b I x B A A B B A A B B B B B B B B B B B B B B B B B B B B B B B B B B A A B B B B B B B B B B B B m 2.f.e.e.f.f.9.9.d.d.9.9.9.9.d.f.d.f.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.d.9.d.9.9.e.j.S T.E+A+y+v+C+w+z+w+w+w+z+z+w+w+w+z+z+z+w+v+z+z+z+w+w+w+z+w+w+w+w+z+z+w+v+w+A+w+w+w+w+z+z+w+w+w+z+A+F+T.", -"I.G+D+z+x+y+A+z+z+z+y+z+z+z+z+z+z+z+z+z+w+z+z+G+C+w+w+z+z+z+z+z+z+z+z+A+z+y+z+z+A+z+z+A+z+A+z+z+z+D+T.h.2+9+b+9+|+|+|+9+|+}+|+9+|+|+|+|+9+}+|+|+|+}+9+9+|+|+f+9+9+|+9+|+9+9+}+9+|+9+}+|+|+|+|+9+|+|+7+9+b+K.3.]+q+s+k+k+h+s+h+h+k+h+s+s+s+k+h+s+s+h+k+h+h+h+s+k+h+k+h+q+k+k+h+s+s+s+k+s+s+k+k+k+k+k+k+k+l+l+q+t+[+-.n .Y Y U U Y Y Z Y Y Y Z +.Z Y Z Y Y Z Y Y Z U Y Y +.Y Y Y Y Y Y Y Z Y Y Y Y Y Y Y X +.@.` Y +.Z P d v.3+(+(+:+:+:+:+:+:+:+(+:+3+:+:+:+:+:+:+:+^+^+3+:+:+:+3+:+:+:+:+:+:+:+:+(+:+:+:+:+:+:+:+3+:+:+:+:+4+[.[.#+`.W.U.R.U.U.U.U.U.U.U.U.W.U.U.U.W.W.R.U.U.U.Z.W.U.U.U.U.R.R.U.W.U.U.U.U.U.U.R.U.U.U.Z.U.U.{+Z.#+k.m >.=.&.&.=.=.=.*.=.*.=.=.=.=.*.=.=.=.=.=.*.=.=.=.*.=.=.&.&.*.*.&.=.*.*.=.=.*.=.*.&.*.=.=.*.=.&.&.&.q h o A B B x B B B B B B B B x B B B B B B B B B B B B B B B B B A B B B B A A B B B B B B B B B A B B | Q i.b.e.f.f.d.8.f.d.9.9.f.9.9.9.8.9.e.d.9.9.9.9.9.9.9.9.9.9.9.9.9.f.f.9.9.9.9.9.d.9.9.d.d.9.9.9.e.9.S T.G+C+y+y+v+z+z+z+A+z+z+z+z+A+z+z+z+z+z+y+z+z+z+w+z+z+z+z+z+z+z+z+z+z+w+z+z+z+A+z+z+z+z+z+z+z+z+D+y+I.", -"T.G+A+z+y+z+C+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+z+w+z+z+z+z+w+z+z+z+z+w+z+z+z+z+w+z+z+C+z+v+z+C+z+G+-+7.2+9+b+}+}+f+9+9+|+|+|+9+9+|+|+9+f+9+|+|+9+9+9+|+|+}+9+9+9+|+9+}+9+9+|+9+}+9+9+|+|+9+9+9+|+9+2+9+b+K.3.~+u+s+k+k+k+s+s+h+k+k+s+s+h+k+h+s+h+s+k+s+s+s+s+k+s+q+q+q+k+k+s+s+s+k+s+s+s+s+s+s+s+s+s+s+k+l+s+t+[+6.c T Z U Y Y Z Y Y Y Y Y Y Y Y Y Y Y Y U Z Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Z Y Y X +.Z ` @.+.Z M d s.p+4+4+(+:+3+:+:+:+:+:+:+:+:+:+(+3+:+:+:+:+:+:+(+(+(+3+3+:+:+^+3+3+:+(+:+3+(+(+(+(+(+:+:+:+(+(+:+p+[.}.#+.+`.U.U.U.W.U.U.U.Z.Z.U.U.U.U.Z.W.W.R.U.U.U.W.R.U.W.U.U.U.Z.W.W.U.U.U.U.U.Z.R.U.U.U.Z.U.U.Z.U.#+}.m #.=.&.=.=.&.=.*.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.*.*.&.*.=.&.=.=.=.=.=.=.&.=.*.=.=.=.*.=.&.&.=.q 2 l A B B B B B B B B B B x B B B B B B B x B B x B B x B A B B B B A A B B B B A B B B B A A B B B y m Q i.b.9.0.0.9.8.9.9.f.9.d.d.f.d.9.f.8.9.9.9.9.9.f.9.j.j.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.e.9.9.9.9.e.j.S -+F+C+y+y+z+z+z+z+z+z+z+z+z+w+y+z+z+z+A+z+z+z+z+z+z+z+z+z+z+A+z+z+z+z+z+z+z+z+z+w+z+z+z+z+w+z+z+D+y+T.", -"I.G+D+G+y+y+D+z+G+A+z+z+z+G+E+z+z+A+A+z+A+E+A+G+A+E+A+G+z+z+A+A+z+A+z+z+A+G+A+z+z+E+A+G+z+z+A+z+E+B+-+m.7+b+b+9+9+9+f+f+f+9+9+f+f+9+9+9+f+9+9+|+9+9+9+9+}+9+b+f+9+9+9+9+9+f+|+9+9+f+f+f+9+f+f+f+9+9+7+f+f+N.p.[+u+q+q+l+q+q+q+q+q+q+q+q+q+h+q+q+q+q+h+q+q+q+q+l+q+u+u+q+l+q+q+q+q+h+q+q+u+q+q+h+q+q+q+h+s+l+q+r+[+6.c .Z +.X X +.Y +.X X +.Y +.+.+.+.+.+.X X +.+.+.+.X +.Y X +.+.+.+.+.X X +.+.X X +.+.+.+.Y ` X . .U d P.p+4+3+:+3+6+3+3+:+<+3+3+3+3+3+3+6+6+6+6+3+6+6+3+:+3+3+3+3+3+3+3+6+6+:+6+6+6+6+<+6+3+3+6+<+6+<+3+p+[.[.,+#+#+W.U.Z.#+W.Z.U.W.#+#+U.U.U.W.U.U.Z.#+W.#+U.U.#+#+W.W.U.W.W.U.U.W.U.#+W.#+U.#+#+W.#+W.W.U.U.#+k.k O =.&.=.=.=.=.=.*.=.&.=.=.=.=.=.=.=.*.=.=.*.=.&.=.=.=.=.=.=.=.*.=.*.&.=.=.=.=.=.=.=.=.=.*.=.&.=.&.q h l A B B B B A A B B B B A B A B A B A A B B B B A B B B B B A A B w A A B B B A A B B x A A A B E y k f.j.d.9.9.f.d.8.e.9.d.d.d.e.9.e.9.9.9.f.d.e.9.e.9.9.9.9.9.9.9.e.e.e.e.9.9.9.9.9.9.9.d.9.9.9.e.9.e.i.S T.G+C+F+y+C+G+G+A+A+E+C+G+G+z+z+z+G+G+z+A+A+G+E+z+A+A+z+A+z+z+A+G+G+z+z+A+z+A+A+z+A+G+G+A+z+A+G+E+y+I.", -"T.z+x+v+y+m+v+y+z+z+y+v+B+y+y+B+z+y+v+w+z+z+z+z+w+z+z+w+w+w+w+w+z+w+z+w+w+z+z+v+z+w+w+w+E+w+w+z+w+B+H.n.;+}+7+2+}+7+2+2+2+2+2+7+7+7+2+2+7+7+7+;+2+7+7+2+2+}+2+2+7+;+2+2+2+2+7+2+2+7+7+2+}+2+2+7+2+2+7+2+8+p.E.[+n+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+l+d+d+d+l+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+k+k+S.K n ` ` Z @.U U U U U @.U U U @.U U U U U U U U U U @.U U U U U U U U U U U U U U U U U +.@.P ` U U U p T.<+4+4+=+(+<+4+^+(+a+4+(+^+(+^+<+<+a+a+a+a+a+a+:+^+^+^+(+<+<+(+:+a+a+a+a+a+a+<+a+a+<+4+<+a+<+a+a+_+k._.=+W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.W.M.W.W.W.U.W.W.U.W.W.M.W.W.W.W.M.U.W.W.W.M.W.W.W.U.M.W.U.F.W.}.m ).#.#.>.*.>.*.%.%.>.%.*.*.*.>.%.%.%.%.>.%.>.>.*.%.%.%.%.>.*.%.%.%.,.>.%.,.%.%.,.>.*.%.%.,.#.'.%.#.O < f A B A A A w w A w w E w E w E w E I I A A E A w E E B E E w I w B E w w A E A w I A z w w w l I I C d.0.0.0.0.0.0.f.d.j.j.0.f.9.f.9.0.0.9.f.j.d.f.0.9.f.f.f.0.0.f.j.0.f.f.0.0.f.f.f.0.0.0.f.f.f.9.j.i.5.u I.y+y+F+v+x+w+w+z+w+w+w+w+z+w+w+z+w+z+w+w+w+z+y+v+w+w+w+z+y+w+w+z+z+z+w+w+y+z+w+z+w+w+w+w+w+w+x+j+j+T.", -"W x.r.r.x.x.a.x.x.r.x.r.r.x.a.a.x.x.a.a.r.a.x.x.a.x.r.r.a.a.x.x.x.a.a.x.x.x.I.r.x.r.r.x.I.x.r.I.x.x._.4 o.C.n.h.n.n.n.n.n.n.h.n.n.n.n.n.n.h.n.n.n.n.n.n.n.n.n.n.n.h.n.n.n.n.n.n.n.n.h.n.n.n.n.h.n.h.n.h.H.h.5 3.p.y.4.4.4.y.y.A.4.4.4.y.c.4.4.y.A.4.c.4.A.E.4.A.4.4.A.4.4.4.A.c.A.4.4.4.A.y.y.4.A.A.A.y.c.A.p.p.4.3 p K K K B p p p B p p p B p K p p B B p p B B p p p p E p p p y B p p p p p B y p p p p y y K K p y ' F (.1.1.k.(.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.).1.1.1.1.1.1.1.1.1.1.R 1.1.k.J 9 _.}.}.).}.[.}.}.}.}.}.[.(.}.}.[.[.(.).}.}.}.).}.}.}.}.}.(.}.[.[.}.}.}.}.}.).}.}.}.}.[.[.}.}.[._.}.J < m k k j m k k m m m m k k m m m m m k k m m k k m m m m m k m m m m m m m m m m k k m m m m j q C v ; f 2 3 2 2 2 2 2 2 2 2 h 2 f 3 2 2 h 2 h 2 2 2 2 h f h 3 2 2 2 h 2 2 2 2 2 2 2 2 h f 2 3 2 2 2 2 2 2 < D s s s s s t s D s D C s s D s C C s t D s C C C s C s C C C C C s C C C D D D C C C s s D C C C k H W x.H.I.r.r.r.r.r.r.r.r.r.r.r.a.r.r.r.x.x.r.r.r.r.r.r.r.r.r.r.r.r.x.r.r.r.r.r.r.x.r.r.r.a.r.r.r.I.r.W ", -"< f F 9 f 9 f 9 8 9 9 9 9 9 < 4 8 4 8 7 H 8 7 H 9 8 m H 4 < g 4 < 9 k < 9 9 D < 9 D < 9 f D < C 9 D 9 _.I.T.T.T.>+'+T.T.T.T.T.'+T.T.T.'+'+I.I.T.T.T.T.T.I.T.I.T.>+T.T.T.>+T.T.T.'+T.I.T.T.T.T.I.T.T.-+-+I.r.L n.C.m.n.n.n.C.n.C.C.C.n.n.n.m.C.N.m.C.C.C.n.C.C.m.C.C.m.n.n.C.m.C.m.m.n.n.C.n.C.n.m.C.C.n.n.C.K.C.o.W 6.X.X.y.y.E.E.y.*+y.y.X.*+E.y.y.y.*+*+y.y.*+A.E.y.E.E.*+E.E.E.*+p.E.E.y.y.E.*+*+y.y.y.*+E.y.y.E.X.F.R ( d e n e e e e e i e e i e e e d d n e e e e n d d e e e d d d i d e e e e e e e e i e e e e e d e ' f u.u.q.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u._.F k.k.O 1.k.k.k.w.k.k.k.k.k.k.k.k.k.k.k.k.k.k.w.k.k.w.w.k.k.k.k.k.w.k.k.k.k.w.k.k.k.k.w.k.w.w.w.k.q.1.f v O k q q q j O O O k k k k k q q k O k k k k O k q O q q q O O O j k k k k q k k q k k k q k k k j 2 ; f f l f f 2 l f h f 2 2 2 f h h h h 2 f 2 f o h h 2 f l f l 2 l l 2 2 f f f f l l 2 2 l f 2 l l 3 0 j s N u u u ..s u s u s ....u s u s ..s s s u s u u ....u u s s u s N u s ..s s s u u ..s s ..Q Q u D ", -"H <._.<.<._.<._.s.<.<.<.u.<.<.<.<.<.<.<._.<.<.<.<.[.[.[.u.<._.u.<.u.u.<.<.}.u._.u._.<.u.<.<.[.}.<.s.D x.j+B+G+G+C+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+G+D+G+G+G+G+G+G+z+G+G+G+G+G+G+A+G+G+D+G+G+G+G+G+G+D+G+G+D+-+n.$+7+f+f+f+f+f+f+f+f+7+f+f+f+f+f+7+f+f+7+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+7+f+9+f+f+b+;+J.*+u+t+t+t+t+t+t+t+t+t+t+u+t+t+t+t+t+u+s+t+u+t+t+t+s+t+t+t+t+t+t+t+t+t+t+r+q+r+t+t+t+t+t+t+t+t+o+t+t+B.n P Y Y Y Y Y Y ` @.` ` @.` ` ` Z X Y @.Z Y Y @.@.` ` ` ` ` ` ` Z X X Y Y X X X X Y X X X Y Y Y Y M B w.1+0+p+3+3+4+4+4+p+4+4+4+4+4+4+p+p+4+4+4+4+4+4+4+4+4+4+4+4+3+4+4+4+4+4+4+4+p+4+4+4+4+4+4+4+4+4+4+p+u.(.)+,+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+`.`.`.#+#+R.k ~.#.&.=.&.=.'.'.'.=.=.*.'.*.*.&.&.&.'.*.'.*.'.*.'.'.*.&.&.&.*.*.'.'.=.*.'.'.'.*.%.'.*.*.>.#.>.>.#.>.k E B K E B E E E B B B B B x y x y x B y y y y x B B x B B x B B x y y B y x x y x y B y y y B B y z j Q |.b.e.j.i.b.j.j.b.e.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.e.e.j.b.j.j.j.e.j.j.j.e.j.j.j.b.d.0.i.N ", -"a.<._.<.<.a.<.a._.<.a._.<.a.^.<._._._.<.W ^.<._._._.<.<.<.<._.<.<.<.<._._._.<.<.<.<._.<._._._.<.<.a.9 x.y+D+E+C+C+A+E+E+D+D+D+E+E+A+E+A+C+E+D+D+D+E+A+A+D+D+D+E+A+E+E+E+D+D+D+A+A+D+D+D+E+A+D+D+D+E+z+C+G+-+n.;+5+5+b+b+b+b+b+9+b+b+b+b+b+|+|+9+b+b+9+5+5+b+b+b+b+b+b+5+|+b+b+b+b+9+b+b+b+b+b+b+b+b+5+b+|+9+b+9+%+m.*+q+q+r+t+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+q+t+r+q+q+q+q+q+q+q+q+q+q+q+q+q+r+r+q+q+s+s+r+q+q+k+B.c .+. .+.Z +.+.Z +.Y +.X Y +.X +.+.+.+.+.+.+.+.+. .+.+.+.+.+.+.+.+.+.+.+. .T +.+. .T T T +.+.+.+.Z d :.p+a+3+a+<+a+^+:+3+:+:+_+6+<+3+3+^+^+<+<+<+:+3+:+:+3+6+<+3+:+:+^+a+3+:+:+_+6+<+:+_+<+a+_+:+:+3+3+p+u._.U.U.W.R.Z.Z.Z.U.R.R.U.Z.Z.Z.Z.Z.Z.#+.+W.R.#+Z.W.W.Z.Z.Z.U.U.W.Z.Z.Z.Z.U.#+W.W.U.U.Z.Z.Z.U.`.U.W.#+G.j ,.'.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.=.=.=.&.=.k 3 B x x B x x x y y y y y z y z y z y z z y y y y y y y z y y y z z y y y z z z z y y z z y z y y E h N d.8.8.8.e.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.d.f.f.N ", -"D <.<._./.<.<.<.<.<.<.<./.<.<.<.<.<.<.<._.<.<.<.<.<.<.<.<.<._.<.<.<.<.<.<.<.<.<./.<.<.<.<._.<.<.<.}.f x.v+E+y+y+C+z+B+F+F+w+E+F+z+z+F+z+F+y+z+y+z+F+y+y+y+y+F+F+z+y+F+F+y+B+F+z+z+y+F+z+y+v+z+F+z+F+A+C+G+'+n.;+b+b+b+|+|+|+9+|+|+|+|+b+|+|+|+f+|+|+|+|+|+|+|+|+|+}+|+b+|+|+|+f+|+|+|+|+|+9+|+|+|+|+9+}+}+}+9+f+$+p.S.u+h+h+k+k+s+s+h+k+h+k+h+h+h+h+h+s+h+l+h+h+l+q+d+l+h+q+h+h+s+s+h+q+h+d+l+h+h+h+h+l+d+q+k+e+k+s+q+d+B.c Z +.T +.@.Z +.+.Y .+.+.+.Y +.+.+.+.+.+.+.+.+.X +.+.+.+.Y +.+.X +.+.+.+.+.+. .+.+.+.+. .+.+.+.+.X n q.3+a+a+:+:+3+a+3+<+a+6+^+4+:+<+3+<+a+<+:+3+3+3+:+:+6+a+3+3+<+a+3+(+:+:+a+_+a+3+:+a+:+3+3+:+a+a+:+4+u.[.M.W.W.R.Z.Z.Z.Z.Z.R.R.U.R.Q.R.Z.Q.R.Z.R.Z.R.Z.R.Z.Q.Z.Q.U.U.Y.Q.Z.Z.Q.W.Z.Z.Q.Z.Z.Q.Z.Z.Q.W.W.W.#+l.t ,.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.=.&.&.&.&.&.=.&.&.&.&.&.&.&.&.&.=.&.&.&.&.&.&.&.&.&.=.=.=.=.*.k 3 z z z y z z z y B B B E A B B B B y B y B y B B A B B B B B A y x B A B B B B B B B B x y B A B I 8 u f.8.8.j.0.f.f.9.f.9.f.j.0.9.j.j.j.0.e.9.j.9.f.f.f.9.9.0.f.9.f.9.j.9.9.f.9.j.9.j.f.j.j.e.f.9.8.f.0.Q ", -"F _._._.s /._.<.<.s /._.s /.F [.<.<.<.F _.D D <.D D <.<.<.<.<.<.<.<.<._.<.<.<.<.s <.<.<.<.<.<.<.<.[.9 r.v+D+y+x+v+y+y+y+y+y+y+y+B+y+w+v+y+y+y+w+y+y+B+y+v+y+y+y+y+w+y+y+y+y+y+w+y+y+y+w+x+y+y+B+y+v+y+D+G+>+h.$+b+|+}+}+}+}+}+}+}+}+|+}+}+}+}+}+f+9+}+}+}+}+}+9+}+}+}+}+}+}+}+}+}+}+|+}+}+f+}+}+}+}+}+7+2+7+9+f+N.3.X.u+d+d+d+d+l+d+d+d+d+d+d+d+k+d+d+k+d+d+d+d+d+l+d+d+d+l+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+l+n+[+k+d+l+l+B.c Y Y +.U ` Z @.@.@.Z Y Y Y Z @.@.` Z U U U @.@.Z @.@.@.Y Y Y Y Y @.` ` Z @.@.` Z @.` Z ` ` Z @.@.+.d [.<+<+<+(+{+(+:+:+(+=+<+<+:+:+:+<+:+:+:+:+:+:+:+:+:+:+:+<+<+:+:+:+:+:+:+:+:+:+<+:+:+:+:+:+:+:+:+_+0+u._.Y.W.`.U.{+V.U.R.R.R.R.U.U.V.)+U.Z.R.V.++Q.U.`.`.=+R.Q.U.`.w.(+U.Q.U.U.R.Q.U.W.=+Q.W.U.U.R.Q..+`.#+w.v q *.*.*.*.=.=.*.*.*.=.=.*.%.&.=.&.*.=.*.%.=.%.*.=.=.%.*.=.=.&.=.=.=.=.*.%.*.%.*.=.=.*.,.%.%.=.*.>.>.k o w A A A I A A A w A w E I x I I E I w E B x w B w E B x B w E B B w E E w B E I E E w x B E E I R 8 u f.d.d.d.0.0.0.0.d.0.0.0.0.0.0.0.0.0.0.0.0.f.0.0.0.0.0.0.0.0.0.0.0.0.f.0.0.0.0.0.j.5.0.0.0.0.d.d.i.N ", -"F <.<.<.<.<._.<.<.F <.<._.<.<.<.<.<.<.<.<.<.<.<.<._.<._._._._.<.<.<._._._._.<.<.a.<._._._._._._._.<.D r.B+D+C+w+w+z+C+z+C+G+y+C+C+C+C+y+G+C+z+C+y+z+C+y+z+C+z+z+z+A+C+z+y+C+w+w+z+C+z+z+C+C+z+y+C+z+F+E+E+-+h.N.f+9+|+|+}+}+9+|+|+|+}+|+|+9+9+9+|+9+|+9+|+9+9+|+|+9+9+9+}+|+|+|+|+|+9+9+|+|+|+|+|+|+9+9+|+b+5+b+%+7.X.u+h+h+h+h+h+q+s+h+h+h+h+q+h+k+h+s+h+h+h+h+h+q+k+k+h+q+h+h+h+h+h+s+h+h+s+s+h+l+l+q+q+q+l+d+s+q+u+e+y.c ` Y Y ` Z Z Z Z ` ` Z Z ` Z U ` ` ` M P ` ` ` ` @.U U Z U @.` @.` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` @.d [.a+<+_+_+.+(+:+3+(+(+<+:+3+(+(+:+3+(+(+(+:+:+<+:+:+3+(+_+(+:+(+:+<+4+:+<+(+(+4+:+:+:+:+:+:+:+4+4+4+u.}.Z.U.W.`.`.U.U..+@+++W.U.`.`.`.`.U.W.U.`.U.U.`.`.`.`.U.U.`.`.`.`.U.U.`.`.U.`.`.`.U.`.U.`.R.Q..+`.`.F.v q %.%.#.O >.>.#.>.#.*.%.%.%.=.*.%.%.*.#.%.O %.#.%.#.%.%.%.%.*.*.%.,.#.*.*.#.%.%.#.#.>.%.%.%.*.>.%.,.6 p E A A B B A w B B A A x B B B B B B B B B B y A B A A A A B B B A A B B A B B A A B B B A A B x z 2 u f.d.8.8.f.9.9.f.9.9.9.9.9.d.9.9.9.9.9.9.9.f.9.9.9.9.9.9.9.9.9.9.9.9.f.9.j.9.9.9.9.9.j.9.9.9.f.f.i.N ", -"D <.<.<._.<.<.<.<.<.<.<._.<.<._._.<.<.<.<._.<.<.<._.<.<._.<.<.<.<.<.<.<.<.<.<.s <.<.<.<.<.<.<.<.<.u.D x.y+D+A+y+z+z+z+z+z+z+z+z+z+y+x+B+G+A+E+A+C+C+y+y+z+z+z+z+z+w+D+D+D+z+w+z+B+y+z+w+z+z+C+z+y+z+F+A+G+'+h.%+b+9+}+9+9+9+9+|+|+9+f+f+9+}+9+9+9+9+}+7+7+7+b+b+9+b+b+b+9+9+9+9+b+|+}+f+9+9+9+9+9+f+9+}+}+|+b+b+$+7.*+u+s+s+h+h+s+s+h+l+u+k+h+q+q+q+q+q+q+h+s+q+h+s+h+k+h+q+q+h+h+s+s+s+d+d+t+t+l+d+h+q+q+h+s+l+d+s+q+e+y.c Y +.+.@.` U +.T X U ` @.U Z Z Z U Y +.+.T .T .+.+.+.+.Y Y +.+.+.+.Z U U Z U U Y Y Y Y Y Z Z Z +.p k.3+a+_+_+1+:+:+:+:+:+_+^+:+<+:+(+3+:+:+:+(+:+<+<+<+(+_+{+0+{+{+4+4+4+4+:+:+3+:+:+:+:+3+:+:+:+3+:+4+u._.Z.`.W.W.Z.W.W.W.Z.U.U.Z.Z.U.W.U.U.U.#+U.U.U.U.U.U.U.Z.Z.#+U.U.U.Q.W.W.U.W.Z.Z.Z.U.U.W.Z.Z.Z.Z.Z.,+G.m >.=.=.=.*.=.=.=.=.=.=.=.*.*.*.%.'.&.&.&.&.&.=.=.=.=.=.&.&.&.&.&.&.&.=.*.=.=.%.'.&.&.&.&.'.*.=.=.*.>.k o w w B x B B B B A w B A B A w y B y B y y y B B y y B y x B y A A B z z A A A x B B B B B x B B B 2 u d.8.0.0.9.j.j.j.f.9.9.9.d.0.9.f.9.b.8.b.f.f.d.9.f.f.9.9.9.d.8.b.9.0.0.0.d.e.9.9.9.j.j.9.9.9.d.d.f.N ", -"F <.<.<._.<.<.<.<._.<.<.<.<.<.<.<.<._._.<.<.<.<.<.<.<.<.<._._._._.<._.<.<.<._.<._.<.<.<.<.<.<.<.<.<.9 r.B+D+A+y+y+z+z+z+z+z+z+z+z+z+y+C+C+w+D+A+y+y+F+z+A+w+w+A+A+A+D+D+E+A+C+w+y+E+z+w+z+z+z+z+y+z+F+C+G+'+h.%+9+9+|+|+9+f+9+|+|+9+9+9+|+|+9+9+9+9+|+|+7+9+|+}+f+7+2+f+2+}+f+f+|+9+}+f+9+}+|+|+|+9+9+}+7+9+5+b+$+3.S.u+q+s+k+h+s+h+h+k+u+s+d+q+s+q+s+h+s+s+s+t+q+s+k+k+s+s+s+d+k+k+t+r+k+k+s+s+l+l+k+h+q+q+k+l+s+r+q+l+B.c Y +.+.U ` Z +.+.Z Z ` @.+.Y U Z Y U Z Z Z @.@.Z +.Z ` Z Z Z @.Z +.+.+.@.Z U @.Z Y Y Y Y Y Y +.Y @.d u.p+_+_+(+<+:+3+3+:+(+3+3+3+:+3+:+3+3+(+(+3+6+6+:+:+4+0+_+0+_+4+4+0+0+:+<+^+3+3+:+:+:+:+3+:+:+3+0+p+u.[.U.#+.+W.Z.U.W.W.U.U.W..+W.U.U.#+#+Z.#+U.U.U.U.U.U.U.U.U.Z.U.U.Z.W.`.U.U.U.W.W.U.U.U.U.U.U.U.#+R.#+;.0 #.=.=.*.=.&.=.=.=.=.=.=.=.*.*.'.|.&.*.*.%.*.*.#.*.*.=.=.=.=.=.,.*.&.=.=.=.=.&.&.%.'.&.&.=.*.=.=.*.>.k o A A B x B x B A B B A w I A I A I y A B y A A x B y B B B y x w w A A A B B A B B B B B B B B B B 2 N b.8.f.0.e.j.j.9.d.9.9.9.d.f.f.d.8.9.f.f.f.0.j.j.e.e.e.b.8.d.9.j.j.f.0.d.e.e.9.f.9.9.9.9.9.9.8.d.f.N ", -"D <.<.<.<.<._.<.<.<.<.<.<.<.F <.<.<._._._._._.F D F H _._._._._._._.<.<.<.<.<.<._.<.<.<.<.<.<.<.<.u.9 r.x+D+E+y+w+z+z+E+z+z+z+z+z+E+A+C+z+G+F+x+x+x+m+T.>+>+x+y+F+y+F+y+F+w+w+z+C+A+z+w+z+z+z+z+z+z+z+A+G+'+h.%+b+b+|+|+9+|+|+|+|+|+}+9+9+9+9+9+9+|+|+b+|+7+7+C.C.C.C.C.C.C.&+2+}+|+|+9+9+9+9+|+}+|+9+|+}+9+5+9+$+3.X.u+s+s+h+h+s+s+s+h+h+s+t+s+s+k+l+l+l+l+k+n+X.X.X.X.X.[+n+l+l+q+k+h+k+k+s+t+k+l+s+s+s+t+l+k+k+h+q+l+B.c ` +.+.@.` Y +.U Y Z Y +.+.Z ` @.Z ` ` M M n e e e n M M P ` ` @.Z Y U Y +.U U U Y Y Y Y Y Y Y Y Y d u.3+a+_+4+<+:+3+3+:+:+:+:+3+:+:+(+3+:+(+:+:+3+4+_+4+(+P.v.P.&+=+s.@+v.4+_+_+3+:+:+:+:+:+3+(+:+:+:+p+u.[.Z.#+W.W.U.U.U.Z.U.U.U.#+#+#+U.R.R.W.++@+W.`.W.U.U.U.U.U.U.U.U.#+ +U.U.U.U.Z.U.U.U.U.U.R.@+++Z.#+#+F.v !.{.&.=.=.&.=.=.=.=.=.=.=.>.*.%.'.&.#.#.#.#.#.O q k k #.>.#.,.>.>.,.*.%.*.&.=.%.'.'.&.=.*.*.=.=.*.>.k o B A B x x B B B A A z A A I I I I I I I I I w I I A w I I I I I A w w w x x A A B B B x B B B B A 2 N b.8.f.0.9.d.j.9.9.9.f.9.9.d.8.b.j.0.i.|...N Q Q Q N 5.i.5.i.0.5.i.e.d.e.f.f.f.9.9.9.j.f.9.9.8.e.i.N ", -"F <.<.<._.<.<.<.<.<.<.<.<.<.<.<.[.[.F H ^ = $ $ . . + + $ ~ 9 J _._.<._._._._.<._.<._.<.<.<.<.<._.O 9 r.B+D+z+y+y+z+z+z+w+w+w+z+z+E+w+v+y+j+ +W 9 + + . $ = + + { ].x+x+x+y+w+w+A+A+z+w+v+z+z+z+w+v+z+C+C+'+h.%+9+9+|+}+|+9+9+|+|+9+9+9+|+|+|+9+9+|+|+5+b+;+C.) . @ ) @ ) - n.;+}+|+|+|+|+|+|+|+|+9+9+}+}+|+b+9+$+3.S.u+h+k+k+s+k+k+k+k+s+k+s+s+k+l+[+X.E.b { . . & * # - - a b 4.X.~+l+k+k+s+s+d+d+l+k+k+s+k+k+k+k+h+l+c.c Y +.+.U ` U +.Z U Y .+.+.Y ` M n d } ' ; * & ; ; ; ; ' } d e M @.Y Y +.+.Z Z ` Y Y Y Y Y Y Y Y Y d u.3+_+_+(+1+:+:+:+:+:+:+:+:+:+:+(+(+:+:+:+:+^+^+4+_+C @ @ + + . + = 7 3+:+:+:+:+:+:+:+:+:+:+:+_+^+4+u._.Y.`.#+W.U.U.U.U.U.U.U.R.Q.++A.0 f < < f 8 9 f f ; 9 f f f { f f f f f }.U.U.U.U.U.Z.Z.U.R.Q.Z.R.W.G.m >.=.=.*.=.=.=.=.=.=.=.=.*.*.%.%.'.%.k k < , = = @ = * = ; , < O O #.*.*.%.*.=.%.'.'.&.=.*.*.=.=.*.>.k o B B B x B B B B A A w ; ; @ ; ; @ @ ; @ ; % @ @ * % { ; * { % ; * * ; ; 3 w B y B B B B B B x B E 8 u d.8.f.0.j.d.d.d.9.f.d.d.f.9.d.9.Q s 1 : = = = , , , , , 4 D ..|.i.9.d.e.9.9.9.9.f.j.9.9.9.9.9.9.f.N ", -"D <.<._._.<.<.<.<._._.<.<.<.<._.H H ~ @ + + + + + + + + . + + $ ~ g _._._._.<.<._.<.<.<._.<.<._.<._.9 r.B+D+z+y+w+z+z+z+z+z+z+z+z+z+y+x+T._ . + @ % $ % % $ % $ % $ . a.x+x+y+w+E+D+z+w+w+z+z+z+A+z+F+E+G+>+h.%+9+9+|+}+|+9+9+|+|+}+}+9+|+|+|+9+9+|+}+5+}+2+5 - . @ . & - . n.2+7+9+|+9+9+9+|+|+|+|+|+}+}+|+5+b+$+7.*+u+k+h+k+h+s+s+h+k+s+q+s+l+l+n+y.{ $ + + + + + $ $ + . @ & # * b X.n+k+k+t+t+k+l+d+s+q+k+k+e+o+k+d+B.n M .+.Z ` Z +.` U Y +.+.Y ` n } } ' * % @ . - - . . @ % ; ; ; } M P @.+.+.+.@.` Y Y Y Y Y Y Y Y Y d u.3+3+_+(+1+:+:+(+:+:+(+:+:+:+:+:+:+:+:+:+:+(+{+0+u.= + + . + + $ $ ~ 4+(+:+:+:+:+:+:+:+:+:+:+:+:+4+u._.Z.U.W.W.U.U.W.#+R.R.U.R.R.#+}.# . + . . . . . . # . . . - . . . . . . }.Z.Z.U.U.U.U.U.U.W.R.Z.W.#+w.m q =.=.=.=.=.=.=.=.=.#.=.*.#.%.>.O k @ = = $ $ + $ + @ @ % $ = , j O *.*.*.*.=.=.=.=.&.&.=.*.*.=.*.#.0 3 A A w A B B x y A z l & & @ % % # . # @ @ . . @ @ @ @ # . @ @ # . @ % * 3 A B A B B B B B x x B E 2 N e.8.f.0.j.f.9.9.j.9.d.f.f.f.i.u 1 : $ + @ . - . . . + + . + , u 5.i.9.9.j.f.9.9.9.9.j.f.9.9.8.9.f.N ", -"a.<.<.<._.<.<.<.<.<.<.<.<._.<.a.9 @ . . . . . . . . + + . . . . + ~ g _._.<.<.<.<.<._.<.<.<.<.<.<.u.9 r.B+D+E+y+z+A+z+z+z+w+z+z+z+y+j+W @ . . % & & @ # @ . # . . + + . g 1+x+y+z+D+z+w+z+z+z+z+z+w+z+C+C+'+h.%+b+b+|+}+|+9+9+|+|+9+9+9+|+|+9+9+9+|+}+f+2+L ) . $ $ @ * @ . @+2+9+b+|+9+}+}+9+|+|+9+9+}+}+9+5+9+$+3.X.u+s+k+k+h+s+h+s+k+s+s+k+l+X.b { @ + . . + + . + . , = $ $ + - % % c.d+k+t+t+k+k+l+s+q+k+l+k+s+t+d+6.c Y +.+.Z ` Y +.` ` Y +.+.` n } * % % @ . + - . . . + . . . % % * ( e P +.T +.Z ` Y Y Y Y Y Y Y Y Y d u.p+<+_+_+1+:+3+3+:+:+_+^+:+:+:+:+3+:+(+:+:+(+0+O.[ . . . + + + + + ~ 0+4+:+:+3+(+:+:+3+:+:+:+3+:+4+u.[.U.U.W.W.U.U.Z.U.U.U.U.U.#+W.J . . . . . . . . . . . . . . . . . . . . }.U.U.U.U.U.Z.Z.W. +V.Q.Z.#+G.m q =.=.=.=.=.=.=.=.=.=.=.=.*.>.O j = + $ . . . . . . - . . . + @ = = j *.>.*.=.*.*.=.&.'.%.*.=.=.*.>.k 3 B A B B B B x y w I l & @ @ @ . . . . . . . . . . . . . . . . . . @ % % ; w A x B B B B B B x B A 2 u d.8.0.0.j.9.9.f.d.d.f.f.f.Q D : $ . @ - . . @ @ @ % @ . . . + = 1 ..5.j.9.e.9.9.9.9.j.9.9.9.8.j.i.N ", -"F <.<.<.<.<.<.<.<.<.<.<.<.<./.: $ . @ @ . @ % @ . @ @ @ @ @ . @ @ $ = H F [._.<._.<.<.<.<.<.<.<.<.<.1 r.B+D+A+y+z+z+z+z+z+z+z+z+A+j+J . . . # @ # # . . . . . . - - $ + $ g x+x+E+A+z+z+z+z+z+z+z+z+F+A+G+'+n.%+b+9+}+9+9+9+9+|+|+9+9+9+|+}+}+9+9+9+}+&+h.) . $ $ $ # $ @ - n.2+|+|+9+9+9+9+9+9+9+9+9+9+}+9+b+9+$+7.*+u+s+s+h+h+q+s+h+h+s+s+s+d+b . . + - . . - . . . . + + $ + . . # + ! E.l+l+k+l+d+k+s+q+l+d+l+q+s+e+4.c Y U +.Z ` Y +.` ` Y +.X M } * % + + + + + + . . . . + + . . + + % ( M Z .+.@.` Y Y Y Z Y Y Y Y Y d k.3+_+_+_+<+3+3+3+(+<+3+3+3+:+(+3+3+:+:+:+:+4+O.4 + . . . . @ @ $ + 4 4+4+4+<+:+:+:+3+:+3+:+3+3+4+4+u.}.U.#+W.W.U.U.W.W.U.U.U.U.#+R.J . . . . . . . . . . . . . . . . . . . . }.U.Z.U.U.U.W.W.Q.`.`.U.Z.#+G.m #.=.=.=.=.=.=.=.*.%.&.&.=.*.O m $ @ + # . . . . . . . . - . . # + . m >.&.=.>.*.*.*.&.&.'.%.=.=.*.>.k o A A B B B x y B A A I % . # # . . . . . . . @ @ # . . . . . . . . . @ % l I w A B B B B B x x B E 2 u d.8.0.0.9.d.e.f.9.9.j.9.8.| = + . . . @ % @ . @ @ + + $ % + - . $ : N j.b.b.j.9.9.j.j.f.f.9.d.e.0.N ", -"F <.<._._.<.<.<.<.<._.<.<.<.7 , @ @ @ @ % @ @ % @ @ % % @ % @ @ @ $ + $ F _.<.<.<.<.<.<.<.<.<.<.<.u.9 r.x+D+A+y+z+z+z+C+A+z+z+z+C+T.. . . $ @ . - . % & @ % @ @ @ . * @ + { a.x+F+A+z+z+z+z+z+z+A+A+y+A+G+'+h.$+9+9+}+9+9+9+9+9+9+9+9+f+9+|+9+9+9+9+}+7.) + = @ $ $ . + + - n.2+f+|+|+9+f+9+|+|+9+9+9+}+}+b+5+9+$+3.X.u+s+s+k+s+h+s+s+h+s+s+d+y.b . $ = + . . . + + + $ . . - . . . . . % b X.r+t+t+t+s+r+q+l+n+t+q+q+d+B.n M +.+.` ` Y +.` @.Y .X n ' . . + . . $ @ @ # . + $ + + + @ @ . . ; d ` . .Z ` X Y Y Y Y Y Y X +.p u.3+a+_+(+<+:+3+:+:+:+:+3+3+:+:+(+3+3+:+:+3+=+F + # . . . @ @ & @ + { 0+4+4+<+3+:+:+:+4+:+:+:+:+4+p+u._.U.U.W.W.U.U.Z.U.U.U.W..+#+M.8 . . + + . . . . . . . . . . . . . . . . }.U.W.U.U.U.W.W.W.`.W.Z.W.#+F.v #.=.=.=.=.=.=.&.'.'.&.&.&.*.k = % % . . . . . . . - . . . . . - . . , q =.=.*.*.*.=.&.&.'.*.=.'.*.>.k l w A B x B B x y B w I % . . . . . @ . . . . # # . . . @ @ . . . . . . @ 2 A A A B B B B B B B B A 2 u d.8.e.0.e.d.f.f.d.9.d.d.8., @ # . . . $ = @ . - . @ . . @ % - - . = 1 5.j.8.j.f.9.j.j.9.9.j.j.j.i.N ", -"F <.<._._.<.<.<.F <._.<.[.H > + % % @ . + + ] 9 H _.H ^ $ + + - @ + + . { _._._.<.<._.<.<.<._.<.<.<.< r.z+D+z+w+w+w+y+y+v+w+z+y+m+W . . . @ % % . + , a.x.g . @ % & % + + # + 1+y+D+y+A+A+z+y+z+w+w+y+E+G+>+h.%+9+|+9+|+}+|+|+|+|+}+|+b+}+}+f+f+2+&+5 . . + + + - . @ + + . @+7+b+b+7+}+|+|+}+|+|+}+|+|+}+}+b+b+$+7.X.u+h+k+k+k+k+d+k+d+s+k+[+{ - - + + + + . @ % b 6.c.a & & $ $ + - . @ + c.n+k+k+k+l+h+t+o+k+e+s+s+d+-.n ` +.+.Z ` U +. .T X M n ; @ . . . + - % ' c @.P n ( % @ . . % @ @ * ( M @.Y Z U Y Y U Y Z U Y Y Z i k.a+a+_+(+1+:+:+(+:+:+:+:+(+:+:+<+3+{+{+0+{+F . . . . . # @ . @ # + ~ 0+_+:+:+:+:+(+:+(+:+:+:+:+(+4+u._.U.#+`.U.U.U.U.U.U.U.U.U.#+w.{ . . . + . + . - + . . . + . . . . . . . }.U.Z.U.R.Z.W.U.W.U.U.R.Q.,+1.0 #.=.*.*.=.=.*.=.=.=.&.=.O k $ + + $ - . # & , k q #.j $ $ $ + - . . % , j *.&.'.=.#.%.=.=.>.>.&.=.*.k o A A B B B B y p A A l % @ $ . . . # . . . . . . . . . @ % & % . . . @ % 3 A y x B A A B B B B B E 2 u d.8.0.0.9.f.d.d.d.f.9.i.: + + + . - - . @ 1 Q 2.Q 1 , + - > + # @ . = u 9.8.9.9.9.9.9.9.9.9.e.j.i.Q ", -"a.<.<.<._.<.<.<.<.<.H [.<.8 . . @ # . . + = 7 H <.<.<.H 4 $ . . @ @ . + + J _._.<.<.<.<._.<.<.<.<.<.9 r.B+D+E+y+y+w+z+y+z+D+z+x+I.] # . @ % & @ . W j+j+v+m+x.@ @ @ # . - . $ a.x+D+z+y+y+z+w+z+z+A+z+C+G+'+h.%+b+b+}+}+|+9+|+}+}+|+|+9+}+2+8+N.n./ - + + . $ . - @ % $ + . n.7+b+|+}+}+9+|+|+9+9+|+9+}+}+|+b+b+$+3.X.u+h+h+k+h+h+h+h+k+s+d+E.$ . @ . . + + . ! E.~+d+e+[+R & $ @ . . . + + R [+k+l+d+h+h+r+e+n+k+s+s+e+y.c ` .+.` ` Z +.T .Y M e ; + ) . + @ % ' d M U X P e ' . . + @ @ . % ( e P Y Y U Y Y Y Y Y Y Y Y U d u.3+_+_+(+<+:+:+(+:+:+:+:+:+:+<+6+3+(+0+!+(.# @ @ @ @ + . @ @ . . . { 0+(+_+3+:+:+:+(+(+:+:+:+:+_+4+u._.Y.U.W.W.Z.U.U.U.U.U.U.U.#+w.{ . . . . . . . . . + . . - . . . . . . . }.U.W.U.Z.U.U.U.R.@+`.Z.Q.#+G.m #.=.=.=.*.=.=.&.=.=.&.%.O < + + + + - . @ , O >.&.&.O j = @ @ @ . . % < j *.&.&.=.>.=.&.>.#.*.=.=.>.k o E w B B B B x y B w w ; & % @ @ @ @ % @ @ @ % @ @ @ # . @ @ @ . . . @ ; h A x B B B B B B B B B w 8 N b.8.f.0.9.0.d.f.0.f.i.Q , + + + . - . + : ..i.0.0.5.s = - . + . - . = u i.d.9.9.9.9.9.f.9.9.e.j.j.N ", -"H <.<.<.s <.<.<.<.<._._.F { . . . @ @ . + , /.<.<.<.<.<.H _ # . @ @ . + $ , _.<.<.<.<.<.<._.<.<.<.u.9 r.x+A+C+B+y+z+B+B+z+F+F+m+W @ @ . . @ & @ 4 +x+z+D+y+m+g # . . . + . + { x+D+z+z+z+z+z+z+z+y+F+A+G+'+h.%+9+9+}+}+9+9+9+|+|+9+9+f+2+C.5 / / - . $ + + $ . . # # @ @ - n.}+|+|+2+}+9+9+9+}+f+9+9+9+}+9+b+b+%+p.S.u+h+s+h+s+h+s+h+k+k+d+R . . = + + = + + c.~+t+e+s+k+X.b . - . . @ $ + b *+t+h+k+h+q+q+k+e+l+q+q+l+6.n M Y +.Z ` U +.+.Y ` M d ( * % % @ @ * ( e P ` .+.P } @ . . @ @ . % ( e ` Y Y U Z Y Z Y Z Y Z Y Z d q.a+<+_+(+<+3+3+3+:+:+3+3+3+<+<+<+3+0+4+v.= + # @ + # + . . # . . . ~ 4+3+a+3+3+(+:+3+3+3+:+3+3+3+4+u.[.U.#+#+Z.U.U.#+#+U.U.U.Z.Z.}.. . . + + . # 8 k.w.:.(.(.(.(.(.:.w.w.(.(.w.U.#+U.U.U.U.Z.W.U.U.Z.#+#+w.v #.&.=.*.=.&.=.=.=.=.'.%.j @ $ . + + . $ $ j >.>.&.&.,.m , @ + < < < k k O *.&.'.*.*.=.'.>.>.=.=.*.>.k o A A A B x B B y B A I 2 f f 2 2 2 2 2 2 2 2 f f f f % $ @ . . . . @ * l I w A B B B B B B B B B E < u d.8.f.0.9.0.e.e.f.f.j.Q = + + . . . + < l.5.f.j.9.0.N , + . . - - - + 1 j.e.9.9.9.j.j.9.9.9.8.j.i.N ", -"D <.<._./.<.<.<.<.<.<._.H = + . . + + . + 4 [.<._._.<.<.[.9 + . @ @ . + $ $ _._.<.<.<.<.<.<.<.<._.}.F r.B+E+A+y+z+z+G+y+z+D+E+m+W @ @ . . @ % . L x+D+A+E+F+x+-+. . @ . + . . @ m+E+y+z+y+F+z+z+z+z+F+A+G+'+h.%+b+b+}+|+9+9+9+|+|+9+f+%+m./ - - $ . $ $ $ $ @ @ . . . $ @ - n.}+9+|+7+f+9+9+9+9+9+f+9+|+}+}+b+b+$+7.X.u+l+k+k+h+s+s+s+h+e+d+R - @ . + @ $ . ! ~+l+o+s+h+o+s+R - . - + $ + . b X.q+h+k+s+h+q+k+l+k+q+q+l+6.c @.+.Z U ` Z +.@.U ` ` n n e } } ( * ' e ` Z Z +.+.P } & # + + . . % ( e @.+.Z ` Y Y Y Y Y Y Y Z @.d k.a+^+_+_+1+:+:+3+:+:+:+3+3+:+a+3+4+0+M.= + + . + . . . . + . . . + ~ 0+_+:+_+3+:+:+3+3+:+:+:+:+4+4+u.}.M.#+`.U.Z.U.U.U.U.U.U.#+U.J . . . + + . { }.Z.U.W.W.Z.W.Z.U.U.U.#+W.U.U.Z.W.W.U.U.W.Z.Z.W.R.Z.Z.,+G.v q '.&.=.*.=.&.=.=.=.&.#.0 @ @ $ + + + $ , O *.%.&.&.'.>.O j O #.#.,.O #.>.&.&.%.%.*.=.'.%.>.*.=.*.>.k o A A B x B B B B x y A l I I I A I I I w I A z I l 2 % @ . . . @ % * h I I w B B B B B B B B B B E 0 Q b.8.f.0.j.e.8.e.f.f.9.Q = + . . . + = : ..i.d.8.b.9.2.: + . @ # - - + 1 j.e.f.9.9.j.j.9.9.9.d.j.0.N ", -"F <.<.<._.<.<.<.<._.<.<.J @ + . @ @ + . + 4 _._.<.<._._.[.J + . . @ @ . + + F <.F <.<.<.<.<.F _.D <.D r.B+D+A+y+y+z+z+z+C+C+y+I._ + # . @ % @ ] x.y+A+A+A+E+y+j+@ $ @ . . @ $ + H.z+z+z+z+z+z+z+z+z+F+A+G+'+h.$+9+9+}+|+9+9+9+9+9+9+f+$+L # @ @ % $ $ $ @ @ % # . . . @ @ - n.7+9+|+2+f+9+9+9+|+|+9+|+}+}+9+b+b+%+7.X.u+h+h+d+h+s+h+s+d+s+d+4.b ! ! $ % * * b d+o+t+k+h+o+t+c.) - . . $ $ + b X.s+k+k+h+q+h+l+d+s+s+q+d+B.e M X +.` ` U +.Y Y +.+.` ` P M n n n n ` +.+.Y Y Y n ( % # + + . - @ ( M X +.U Z Y Y Y Y Z Y Y Y +.i w.<+<+_+_+<+3+3+:+:+:+:+3+3+:+:+:+0+O.4 @ + + . @ $ , 8 . + + . . . { 0+_+:+<+3+(+3+:+3+:+:+_+_+(+4+u.}.Z.#+W.W.U.W.Z.U.U.U.U.U.R.J . . + . . . { w.#+.+U.U.#+#+U.#+U.U.U.#+U.U.U.Z.U.U.U.W.Z.U.W.R.Z.Z.#+G.m q =.*.=.*.*.=.&.=.*.,.#.< @ @ $ . . + $ , >.%.%.&.=.=.&.%.,.%.=.&.'.#.>.*.=.&.%.'.=.&.&.%.*.*.'.=.*.k o E A B B B B x z B x A w w I I B x A A z A y x w 3 * % @ . . . @ * l I w A x y x B B B B A A B B B 2 N b.8.0.0.d.d.e.e.d.0.9.|., . . . . + = : ..i.b.8.b.0.2.: $ + @ # - - $ s i.d.9.9.9.j.j.f.9.9.9.j.i.Q ", -"_.<.<._._.<.<.<._.s /.<.H + + . . . . + = 7 _._._.<.<.F [.J @ . . @ @ . . + 7 <.<.<.<.<.<.<.<.<./.[.9 r.v+D+z+y+v+w+y+z+w+w+B+x.. @ . . . @ @ [ T.y+A+w+w+A+A+j+] % @ . @ @ $ + a.y+z+w+w+z+y+z+z+w+z+E+G+'+h.%+b+b+|+|+|+9+|+|+|+|+}+%+L @ % % $ + + - / / . - + @ + $ . # n.7+9+|+}+|+|+|+|+|+|+|+|+}+}+|+b+5+%+3.S.u+h+k+k+h+h+h+h+k+h+k+[+X.X.X.X.X.X.c.E.k+e+t+s+h+n+n+b - - . # @ + + ! X.s+k+k+k+k+k+k+k+k+s+q+l+c.n @.+.+.Z ` U +.U Y +.+.+.+.+.@.@.@.@.@.Y +.Z P P n i ' @ . + + . . * } P .+.Z ` Y Z Z Z U Y U Z Z p w.a+<+_+(+<+(+:+:+:+:+:+:+:+:+:+0+{+F + + + + . @ a A.J + + + . . . ~ 0+_+(+:+:+:+:+:+:+:+:+:+:+:+0+u._.Y.W.`.U.U.W.U.U.U.U.U.U.M.8 . . . . . . { q.`.@+k.w.w.w.w.M.M.U.U.U.M.U.U.U.U.U.U.Z.W.U.U.U.R.W.#+k.m q '.=.*.=.=.*.=.=.*.%.O = @ @ + . . + = j #.%.#.#.j O q j q #.#.%.'.*.=.*.*.%.%.=.=.=.'.#.>.%.%.*.>.k o B A A B B B B A B B B B A A I A x y B x x x x f % % % @ . . . & 3 I w A x x x B B B B B B A B B E 2 N b.8.f.0.d.e.b.d.0.f.e.i.1 + . . . . + , s i.j.9.0.5...: + . . # # + , N i.9.9.9.9.9.9.9.9.9.b.j.i.N ", -"D <.<.<._.<.<.<.<./.<._.g > @ . @ # . + @ F _.<././.<.<.[.F + + + . @ + + $ , _.<.<._.<.<.<.<.<.<._.< a.B+D+A+y+y+z+y+z+E+w+y+x.% % . . @ @ @ [ '+z+z+y+y+w+A+v+W & % . @ % % + g m+z+w+w+z+z+z+w+w+y+C+G+'+h.%+b+b+|+|+|+}+|+}+|+|+9+;+L - % % $ + - / 7.L . - $ @ $ $ + - n.}+|+|+}+|+|+|+|+|+|+|+|+}+}+}+b+b+%+3.S.u+s+k+k+l+d+h+h+k+h+q+k+l+e+t+s+q+l+[+n+k+k+k+k+k+s+E.& # . - + + $ + R [+t+k+k+h+s+k+k+l+k+s+s+d+6.c Y +.+.Z ` U +.` Y Y Y X +.Y Y U U Y +.+.+.M e d ( ; % + . . @ @ * ( e Y T T +.` Y Y Z Y U Y Y Z @.i q.<+a+_+:+<+:+(+:+:+:+:+:+:+{+{+)+J + + + . + + = F.++).. + + . . . ~ 0+_+^+<+:+:+:+:+:+:+:+:+_+:+4+u.[.Y.U.W.U.U.U.W.W.U.U.U.Z.w.{ . . . . . + = ;.v a { { { { { { 8 w.M.#+U.U.U.U.U.U.W.U.U.W.@+`.Q.W.#+w.v q =.=.*.*.=.=.=.=.*.%.j , @ @ + + + + $ j #.q 0 < * = = = , , j j %.'.=.=.*.*.%.'.%.=.=.*.#.>.=.*.>.k o B A A B B B B B x B x y x y A y A B x B A x x % $ @ # @ # @ + 2 A x x x B B B B B B B B B B B B E 2 u d.8.f.0.9.9.d.d.0.d.8.j.N $ + + + - - $ : u 5.|.5.N 1 $ @ @ @ @ + $ : Q i.b.9.9.9.9.9.9.9.9.d.j.i.N ", -"F <.<.<.<.<.<.<.<._._._.H + # . # # @ . + 4 <.<././.<.<.[.H . . @ @ . . + - , _.<.<.<.<.<.<.<.<.<.u.4 r.B+D+z+y+z+z+B+B+E+w+y+a.& * . . @ @ # g >+A+G+x+y+A+D+v+a.* . @ . % * + 9 x+z+w+z+z+z+z+z+z+F+A+C+'+h.%+b+9+|+|+|+9+|+}+|+}+9+}+h.@ % % . - ].&+&+7.- - . $ $ $ $ @ n.}+b+|+2+}+9+|+|+9+|+|+9+}+}+}+b+5+%+7.*+u+s+s+h+s+k+h+h+h+q+q+l+t+k+s+q+q+r+t+k+s+u+h+k+r+X.l % $ + . . . $ . c.e+k+h+h+h+s+r+s+n+s+t+t+n+c.c @.+.+.U ` Y +.` M Z U Y Y Y ` +.Y +.Y @.P } ; ; % . - - . + $ % ' d M +.T .@.P X Y Y Y Y Z Y Z @.p k.a+^+_+(+<+3+3+:+(+<+:+:+4+4+6+[.$ + . . @ @ ~ u.)+Z.F . + + . . . ~ 0+^+_+6+3+:+:+:+:+3+:+<+^+3+4+u.}.M.U.W.U.U.U.Z.Z.U.U.U.Z.w.{ . . . . . + @ & $ # + + . . . . + { 8 w.U.U.U.U.U.U.U.U.U.W.`.Z.R.W.#+w.v q '.=.=.=.*.=.=.=.&.>.j $ % . - . . + @ j C | % & & . . . + . $ , j =.&.&.=.=.*.=.'.'.=.*.*.*.&.=.>.k o B A B A B B B B x B x y B y y B A A A B A A B @ + . @ @ @ % * 3 x z B B B B B B B B B B B B B B E 8 N b.8.0.0.e.f.d.f.0.9.8.j.|.f + + + - - . $ , , : : : $ - # % + $ @ = t |.j.8.9.9.9.j.j.f.9.9.e.e.i.N ", -"W <.<.<.<.<.<.<.<.<._._._.~ + + @ @ # . # _ _._._.<.<.[._.9 + + + @ . . + # $ <.<._.<.<.<.<.<.<.<.<.9 r.x+D+z+y+z+C+G+G+z+z+v+W % & @ . . @ % 9 m+F+G+B+y+E+A+v+x.@ . @ . @ # % > y+z+z+z+z+z+z+z+z+F+A+G+'+h.%+9+9+|+|+9+9+9+|+}+|+f+$+h.- - ) L z.$+f+2+7.- @ @ @ @ $ + @ n.2+b+9+}+|+9+9+}+|+9+9+9+|+}+9+b+9+%+p.X.u+s+s+h+h+s+s+s+h+d+s+u+s+k+k+s+t+n+s+o+t+t+s+n+B.b @ @ + + . + $ % b X.l+k+s+s+s+r+q+n+e+s+t+r+l+y.c M .+.Z ` Y +.Z @.Y U Y Y Y Z X +. . .Y e ' @ @ . . # . # % * ( n M @.+.T .Y M X Y Y Y Y Y Y Z Y i k.6+:+_+(+<+4+4+^+^+:+4+4+4+)+s.] + + + + @ ] a.:+0+V.F + + + . . + ~ 4+(+3+3+:+:+:+(+3+3+:+^+3+3+4+u.}.M.W..+W.U.U.U.U.U.U.U.#+}.# . . . . . . . . . . + + . . . . . . # { w.U.W.Z.Z.U.W.Z.U.Z.W.Q.Z.Z.#+w.m q =.=.=.&.=.=.=.=.=.>.m @ % . . . - + $ < { + @ % % + # - . - - + = j #.>.%.=.&.&.&.&.=.*.*.*.=.=.>.k o B A A A B x x A A B B x B x x z d z B z w f ; @ . . @ @ % * 3 x x B B B B B B B B B B B B B B B A < u d.8.0.0.9.f.f.f.0.9.8.b.j.5.1 $ - # @ + $ $ + $ $ + . - . @ + + , N f.j.j.d.9.9.9.j.j.9.9.9.e.e.i.N ", -"^.<.<.<.<.<.<._.<._.<._._.~ + $ @ @ @ + + - a }.[.[.<.[.8 > $ + . + # @ . @ + <.<.D <.<.<.<.<.<.<.[.F r.B+D+E+y+z+z+z+z+z+F+m+W @ & @ . . @ @ 9 >+E+C+G+y+w+E+x+x.+ @ @ . . @ % . x+z+z+z+z+z+z+z+z+F+A+G+'+h.%+b+9+}+|+9+|+|+|+}+|+f+%+h.5 7.N.&+8+}+b+}+m.- @ $ . . % # @ n.7+9+9+9+9+}+|+|+|+|+9+9+|+|+9+b+9+%+3.S.u+s+s+k+k+s+q+h+h+t+h+l+s+k+t+t+s+l+l+o+e+r+s+E.l $ . . . . . + + ' 6.l+u+s+k+k+s+r+q+k+l+s+s+q+d+c.c @.+.X Z ` U Y Y X Y U Y Y U Y @.Y . .+.e ; @ . - . @ @ # @ % ( n n M Y . .Z P X Y Y U Y Y Y Y Y d k.a+6+3+_+1+4+_+!+:+4+_+0+a+w.8 . . . + + + _.<+4+0+{+F + + . . . + ~ 0+4+3+:+3+(+:+3+3+:+(+^+3+:+4+u.[.U.#+.+W.U.Z.W.W.U.U.U.U.J . + . + + . . . . . . . . . . . . . . . . 8 M.Z.U.U.U.Z.W.U.Z.U.U.R.W.,+l.k #.=.=.=.=.=.=.=.=.*.%.j $ @ . . . . + + + + . @ @ % $ @ . . . . . . = j %.%.%.'.&.*.=.=.*.*.*.=.=.*.k o A A A x B B x A A B B B B B B x p x B w w l % @ . . @ % @ ; w A B B B B B B B B B B B B B B B B B 2 N d.8.f.0.9.b.f.f.f.d.d.e.f.j...9 . # % $ + @ + @ @ . . . # . . { /.2.8.8.b.9.9.9.9.j.j.9.9.9.8.9.0.N ", -"F <.<.<._._.<.<._.<.<.<.<.9 @ + $ @ + + + - . $ 8 F 9 = @ + + + . . @ @ . . + <._.D <._.<.<.<.<._.[.H r.x+D+A+w+w+z+z+z+z+E+v+W @ % @ . . . @ 4 j+D+A+y+v+w+D+x+x.+ @ @ . . @ @ . m+z+v+z+z+z+z+w+A+z+A+G+'+h.%+b+9+|+|+|+9+|+|+|+|+9+}+K.K.%+7+2+|+b+|+7+m.- @ $ . . % @ @ n.}+9+|+}+}+}+|+|+|+|+|+|+}+}+|+b+9+$+3.X.q+k+h+k+k+k+k+s+k+t+k+k+s+k+e+s+s+t+k+s+l+~+c.b & $ + + $ . . . . R ]+l+s+s+k+k+l+q+q+k+e+k+s+s+d+6.n P .+.Z ` U +.U U U Y Y Z Z U ` @.+.Y @.e ' @ . . . . . . + + * ( } e ` .+.Z @.Z Y U Z U U Y U U p u.a+<+^+^+<+:+_+^+:+(+(+4+++4 @ # + + . > F V.4+(+{+V.J + + + . . . ~ 0+(+3+:+:+:+:+:+(+:+:+:+:+:+0+u._.U.W.U.R.W.U.W.U.W.W.U.R.J . . . + + . . . . # % @ . . . . . + . . . @ 8 R.W.U.U.U.W.U.Z.U.W.Q.Q.#+k.m q *.=.=.*.*.=.=.*.*.%.j @ @ . . . + + - + + + @ = < $ @ @ + . + . . $ , O %.'.'.=.*.&.=.>.>.=.=.=.>.k o B A x x x B B A B B B B B B A y x B w I h ; % @ . . @ % * 2 I A B A A B B B A A B A A B B B B B E 2 N b.8.0.0.9.d.9.9.9.d.9.f.0.5.D ] . . # @ . - - - . . + + + @ @ + 7 N 0.d.d.9.9.9.9.9.9.9.9.9.d.9.i.N ", -"D <.<.<._.<._.<./.<.<.<.<._.9 + @ # + + . . + + @ { > @ + # @ # @ . . @ @ + + _._._.<.<.<._.<.<.<.<.9 r.x+D+z+y+w+z+z+z+w+F+v+W % % @ . + @ % 9 j+E+A+y+y+w+E+y+x.# . % . . @ @ . x+z+w+w+w+z+z+w+w+y+E+G+'+h.%+b+9+}+|+}+9+|+|+}+|+9+9+9+|+}+}+|+b+5+|+2+h.- % @ . . @ @ - n.}+9+|+}+|+|+|+|+|+|+|+}+|+}+}+b+9+$+3.X.u+h+h+k+k+h+h+k+k+k+k+k+k+k+k+k+s+t+k+s+*+R @ + # + + $ $ % @ # c.[+l+h+k+k+k+k+l+h+s+l+e+e+s+h+d+c.c P +.+.` ` U +.Z Z Z Y Z Y Z U ` @.Z Y P e ( * @ @ & % @ . - . @ % * } n @.+.G X Z U Y Z Y Y Y Y Z } w.a+a+_+:+:+^+^+:+:+(+0+{+F # @ @ @ + + 8 V.0+4+(+{+V.F + . + . . + ~ 0+{+4+(+:+:+:+:+(+:+:+:+^+:+0+u.[.Z.W.`.U.Z.U.U.U.W.R.U.w.8 . . . . . . . . J }.w.w.}.8 . . . + . . . . + q.Z.U.W.W.U.U.W.@+U.Q.R.#+G.m q &.=.*.=.=.=.=.=.*.%.j @ @ . . . . . . . $ | m j j < < $ - . . . . + = j >.'.=.=.*.&.=.>.#.>.=.=.*.k o E A x x B x B B B A B B B B A y x z I f 2 @ % @ . . @ % ; w w A B A B B B B A B B A A B A A B B E 2 u d.8.f.0.9.9.9.9.9.d.9.i.2.1 = + # @ # + - - + + + + $ + + @ # + = : N 0.i.j.9.9.f.9.9.9.9.9.d.9.i.N ", -"F <.<.<._.<.<.<./.<._._.<.[.H 9 > + + + . + $ + . . # + . # # # @ . . . # . $ _._.<.<.<.<.<.<.<.<.<.F r.B+D+A+y+z+z+z+F+z+F+m+W % & # . + $ % 9 >+E+z+y+y+z+E+y+x.+ # % . . % @ . v+z+A+z+z+z+z+z+z+F+A+G+'+o.%+b+b+|+|+9+9+}+}+}+9+f+f+|+}+}+|+b+b+b+b+7+7.- @ @ . . $ + . n.}+9+9+}+f+9+|+f+9+9+|+|+|+}+}+b+9+$+p.S.u+s+k+k+h+h+h+h+h+k+t+k+k+k+d+l+s+t+r+E.R % + + . # + + % % ! c.[+n+d+s+t+h+l+k+l+k+s+l+l+k+h+l+l+c.c P +.+.@.` U .Z Y Y Y Y Y Y Y Y X +.+.@.n e d } ' ' ' * # - . + + @ * } M +. . .Y Y Y Y Y Y Y Z X i q.6+^+_+(+:+4+:+(+(+4+!+[.. @ % @ @ . = q.0+4+{+)+0+{+F . @ @ . . + ~ 0+,+0+p+3+(+:+3+:+(+:+(+4+3+4+u.}.U.#+U.U.U.U.#+U.U.U.U.U.w.}.J 8 8 8 % * }.U.#+U.U.U.w.8 . . . + . . . . ).W.U.U.U.W.U.W.++Y.R.Z.#+G.m #.=.=.=.=.=.=.=.&.*.%.j @ @ . . . . . + + | O %.>.%.#.O < + @ # + . . @ , q =.'.=.=.&.=.*.>.*.=.=.*.k o A A B B B B x B B A B B B B B x w x I f * @ @ # . . @ % 2 z A A B B B B B B B B B B B B A A B B E 2 u d.8.f.0.e.9.e.9.e.j.i.5.u $ + . @ @ # . . , t t s : , $ . . @ @ + = 1 Q i.j.9.9.9.j.j.9.f.9.b.j.i.N ", -"D <.<.<._.<.<.<._.<._._._.<.[.F ~ @ + + + + + @ @ + + + # % # # @ . . # @ . ~ _.<.<.<.<.<.<.<.<.<.<.H r.B+D+A+y+z+A+z+y+z+E+v+a.@ % # . + @ % 9 >+E+C+G+y+z+E+v+x.+ # % . . @ % @ y+z+z+z+z+z+z+z+z+z+A+G+'+o.%+9+b+|+|+|+9+|+|+|+9+}+7+}+}+f+9+9+f+|+b+2+m.- @ $ . . $ + - J.7+|+9+}+f+9+9+9+9+9+9+9+|+}+}+9+9+%+p.X.u+s+s+k+h+q+s+s+k+s+t+s+s+d+d+l+s+e+E.b & @ $ $ @ @ @ # $ & c.n+s+k+k+s+s+h+l+s+l+s+t+l+k+s+h+u+l+c.c ` .+.` ` Y .Y Y Y Y X Z Y Y +.+.+.+.+.@.P P n M n d ' & @ . + . - . ' n ` +. .Z Y Y Y Y Y Z Y X i u.4+:+_+(+<+6+(+4+4+0+(.> + @ @ # . ] }.{+(+O.=+=+!+V.J . . @ @ . + ~ ,+L.!+3+3+(+:+3+3+3+:+:+3+:+0+u.[.U.#+W.W.U.U.#+U.U.U.U.#+#+U.M.M.M.w.k.k.U.#+U.U.U.U.Z.G.@ + . + . . . # % W.U.U.W.W.U.W.@+`.Z.Z.#+G.m q =.=.=.=.=.=.=.=.%.,.j @ @ . . . # @ + , O >.*.=.=.*.#.m , $ # @ . # $ + O =.=.=.*.=.&.=.*.*.&.=.*.k o A A B x B B B B B B B B B B B B A w I 2 % @ @ # . @ % % l w w w B B B B B B A B B B B B B B B B E 2 N d.8.f.0.9.9.e.9.d.i.i.s , . . . @ + . + : N i.i.i.Q 1 ~ . . % % . + + 1 i.e.9.9.9.j.9.9.9.9.e.9.i.N ", -"^.<.<.<._.<.<.<.<.a.D /.<._.[.[.F _ + + . . @ $ $ $ + + 4 J @ + . + . . @ + { <.<.<.<.<.<.<.<.<.<.<.9 r.x+D+z+y+z+A+C+z+z+z+y+a.@ % @ . . @ % 9 -+D+C+y+y+z+E+v+a.+ . @ . . + % ~ v+z+z+w+z+z+z+z+z+F+A+G+'+h.$+b+9+}+|+|+9+|+|+|+9+}+7+}+|+}+9+}+}+|+|+2+m.- % $ . . % $ - J.}+|+9+}+f+9+9+9+9+9+9+9+|+}+f+b+b+%+m.*+u+s+s+k+h+q+q+s+k+s+s+s+k+d+l+s+d+R ! % % + + + - @ @ . b E.d+r+s+h+h+s+t+s+k+l+k+s+q+k+k+s+s+u+d+c.c P +.+.` ` Y +.Z Y Y Y Z Y Z U +. .Y U X X ` @.` @.@.M } ; % @ @ . . # ; d P +.+.Y Y Y Y Y Y Y Y Z d q.4+^+_+{+<+<+6+3+(+0+8 + + @ # . . ] J ].].7 F H F J { # @ # % . . + J 7 F s.3+:+:+:+3+3+:+^+3+(+0+u.[.Z.#+.+W.U.U.W.W.U.U.W.W.U.U.U.U.#+#+W.W.#+U.U.U.U.U.#+U.% . . . . . . @ @ U.U.Z.W.Z.U.W.++M.R.Z.#+G.m #.=.=.=.=.=.=.=.=.=.%.j @ @ @ . . . @ @ | %.=.&.&.=.!.%.O , @ . @ # @ @ + j *.=.=.*.=.'.*.*.*.&.=.%.k o A A B x B B B B B B B B B B B A A I l ; @ @ . . . @ % f w w I A B B B B B B A A B B B A B B B B E 2 N d.8.0.0.9.j.9.j.b.j.5.: $ . @ @ . . # : ..0.b.b.e.i...: . . % @ @ # - , N e.9.9.9.j.j.9.9.9.e.e.i.Q ", -"W <.<.<._.<.<.<._.W D /.<.<._._.[.[.F 8 ! @ @ % + ^ ^ F _.F = + + + # @ . . = <.<.<.<.<.<.<.<.<.<.<.4 r.B+D+z+y+z+A+A+z+y+y+y+a.@ & @ . . @ % 9 -+F+w+y+y+w+D+y+W # . % . . . % g x+z+w+w+z+z+z+w+w+F+A+G+'+h.%+b+|+}+|+|+9+|+|+9+|+}+2+}+b+b+|+|+9+|+|+7+7.- @ @ . . % @ . n.}+9+|+}+}+|+}+|+|+}+|+9+}+}+|+b+9+$+7.X.u+h+k+k+k+h+h+k+k+s+k+k+d+d+s+d+E.$ $ % $ + + . - + # :.X.e+s+s+h+h+k+s+t+k+l+k+k+s+h+k+e+k+s+q+d+c.n P +.X Z ` U +.Z Y Y Y Z Y Y Y +.Y @.@.@.@.` Z Y Y U ` e ; @ # @ @ # . * } P @.X Y Y Y Y Y Y Y Y Y d q.6+^+4+{+<+<+a+:+{+0+4 + + + + . . + . . + + + + . . + @ % % % % @ . + + + 4 3+:+:+:+:+:+:+_+:+4+4+u.}.Z.W.U.W.Z.U.W.U.W.W.W.U.U.U.U.U.U.U.W.R.U.U.U.U.U.U.#+M.J . . + . . . + . M.U.U.U.U.U.U.Q.R.Z.U.#+G.m q '.=.=.=.=.=.=.*.%.%.j @ # @ . . . @ @ j =.&.&.&.=.!.%.#.| $ @ @ # . % $ j #.*.=.*.=.'.#.>.=.=.=.>.0 o A A A A B x B B B B A B B B A w A ).2 % @ @ # . . @ * l w A w B A A B B A B A A B B B B B B B B E 2 u d.8.f.0.9.j.d.b.e.j..., . + $ + @ # + 1 i.0.d.8.b.j.5.t ^ # @ @ % - - ~ u d.9.9.9.9.9.9.f.9.b.9.i.N ", -"F <.<.<._.<.<.<.<.<._._.<.<._._.[.[.[.F J J J 4 F H H <.[.J = + + @ # @ . > 4 _.<.<.<.<.<.<.<.<.<.<.: r.y+D+A+y+z+A+z+y+w+E+F+x.$ % & @ . @ % _ T.F+y+z+z+w+E+x+9 @ @ @ . @ % $ a.w+z+w+w+A+z+C+w+w+z+C+G+'+h.%+9+|+}+}+|+9+|+|+|+|+}+7+f+|+b+9+9+|+|+|+7+7.- @ @ . . @ + . n.7+|+|+}+}+|+|+}+}+|+|+|+|+}+}+b+9+$+3.S.u+k+k+k+h+h+k+k+k+k+k+k+d+l+~+c.a $ = + + + . . + b c.~+n+k+s+q+l+k+k+k+s+s+h+k+s+q+s+k+d+k+s+h+d+c.c Z .X U ` U +.X +.Y Y @.` Z ` Y @.P U P ` Y +.+.X +.` e ' # . # % # . % ( P Y X Y Y Z Y X Z Y Y X d u.a+a+4+_+1+a+<+^+{+0+8 @ + @ @ . . @ @ @ @ @ + $ + . . # @ @ # % @ . . + + f 3+:+:+:+^+(+(+(+^+:+4+u.[.M.Z.U.R.W.U.U.U.W.R.U.U.U.U.U.#+Z.#+`.++W.U.U.U.Z.W.U.U.}.+ . + . . . . . M.U.U.U.U.U.Z.W.V.Y.W.#+G.m q =.=.=.=.=.=.=.*.%.'.O + # @ . . # @ $ j >.=.&.=.=.&.=.%.< $ $ % @ . % @ k >.*.=.>.=.=.>.>.*.=.*.#.0 o A A A A B x B x B B A B B B A A A ).; % % . . . . @ ; w w A x B A A x B B B B B B B B B B B B B A f N b.8.9.0.9.j.d.d.e.i...= - @ @ $ . . + t 5.0.f.8.8.e.i.N : @ + @ % . - + s i.f.9.9.9.9.9.9.9.8.f.0.N ", -"/.<.<.<.<.<.<.<.<.<.<.<.H _.<._._.<.<.<.<.<.<.<.<.<.<.<.<.J + + + @ . . + $ H [.<.<.<.<.<.<.<.<.<.[.H r.x+D+A+y+z+z+y+y+A+A+E+'+9 % * # . . @ - t.x+y+E+D+D+y+j++ $ % . . * ; $ H.D+z+A+y+z+z+C+z+z+z+A+G+'+h.%+9+9+}+}+9+9+9+|+}+|+|+9+|+}+9+9+9+|+|+b+7+7.- % $ . . $ @ - n.}+b+|+}+f+9+|+|+|+|+9+f+|+}+}+b+b+%+p.S.u+s+s+k+h+h+s+h+k+k+k+l+l+~+c.> . + + . . @ . @ b X.r+q+q+k+h+q+r+s+e+s+t+r+h+l+l+q+q+l+d+k+s+r+l+B.c ` .+.` ` U +.+.+.Z ` M n M e n n d e n P Y . .+. .` e ( # - # % @ . @ ( ` .+.Y Y Y X +.Z Y Y X d k.a+^+_+_+<+a+6+_+_+0+8 @ # @ @ . . @ @ @ . . @ @ . + . . . . - + . . . + @ J 3+:+(+:+:+3+(+:+4+3+p+u.}.Z.U.#+U.U.U.W.U.U.U.W.U.U.M.w.w.w.w.}.u.W.#+U.#+Z.R.U.W.J . . . . . . + { W.U.U.U.U.#+Z.`.V.Y.R.#+G.m q =.=.=.=.=.=.=.=.=.&.q , @ @ . . # % $ | #.=.&.=.&.&.'.%.| $ $ @ @ . # @ j >.*.=.*.=.=.=.*.>.=.=.*.k o A B A A B x B B B B B B B B B B w w % @ @ . @ . @ @ 2 A y y x B B B A A B B B B B B B B B B B B A f N d.8.0.0.e.f.0.f.d.0.5.= - @ @ # ) . $ t 5.i.f.d.8.d.f.N : $ + @ % @ - + : 5.f.9.9.9.9.d.9.9.b.9.0.N ", -"<.<.<.<.<.<.<.<.<.<.<.<.<.<._.[.F H _.H F 7 F <.<.<.<.<._.9 + . . . + + + $ F <._.<.<.<.<.<.<.<.<.}.F r.B+A+A+y+z+z+y+y+A+A+E+m+W @ % # + @ % . L x+z+A+D+E+y+-++ $ @ . @ % @ + '+E+z+z+z+z+z+z+z+z+y+A+G+'+h.%+b+b+|+|+|+9+9+|+|+9+9+9+9+|+|+9+9+9+|+b+2+m.- @ @ . . $ . @ n.}+9+|+7+}+9+|+|+9+9+9+9+}+}+9+b+9+$+m.*+u+s+s+h+s+s+s+s+h+k+k+l+l+E.! - - . . . . @ ! 5 `.s+t+r+r+r+s+t+t+s+n+l+r+t+k+l+l+q+r+k+k+k+q+r+l+c.c P +.+.` ` Y +.X @.P n d ( ( ' ; % % % } n ` .+.+.+.` e ' @ . # @ + # & } P Y +.Y Y Y Y Y Y Y Z @.i q.3+3+_+(+<+a+3+(+_+0+8 . . . . . . . . . . . . . . . . . . . . . . - + + $ f 3+:+:+3+(+3+:+:+3+3+p+u.[.U.U.#+U.U.Z.#+W.U.U.R.}.J J 8 8 { % @ { M.#+U.U.U.U.U.W.% . . . . . + . v U.U.U.U.U.#+U.U.U.Z.W.#+G.m q =.=.=.=.=.=.=.=.=.'.>.m + . . . # # @ , >.*.=.&.&.'.,.#., $ $ @ . . @ = j >.=.=.*.=.&.=.>.>.=.=.*.k o A A w A B x x B B B B B B B B B w h $ . @ . @ . @ @ l B y x B B B B A A B B B B B B B B B B B B B 2 u d.8.0.0.e.d.f.f.d.j..., - $ + . - . $ u 5.i.9.d.8.9.i.s = + @ @ @ . - $ 1 i.d.9.9.9.9.9.9.9.e.e.i.N ", -"H <.<.<._.<.<.<._.<.<.<.<.H 4 4 4 4 _ = = = 4 ].[.<.[.[.F ^ + - . . + + $ ^ _.<._.<.<.<.<.<.<.<.<.[.F r.B+D+A+y+z+A+B+B+z+D+E+x+_.+ @ @ @ % % . [ T.G+y+z+F+j+W . @ . . @ @ + = x+F+z+w+z+z+z+z+z+z+z+C+G+'+o.%+b+9+}+|+9+9+9+|+|+9+9+9+9+|+|+9+9+9+|+|+2+m.- @ @ . . @ + . J.7+9+|+7+}+9+9+|+|+|+9+9+|+|+9+b+9+%+7.X.u+s+s+k+h+s+h+h+k+s+k+l+X.b . @ + . - . @ + ! 7.w.B.E.E.E.E.E.E.E.E.E.E.~+s+l+k+q+q+t+k+e+s+q+q+d+E.c ` Y +.@.` U +.@.` M n ( * @ @ . - . @ ( e ` .+.Y @.P d * # . @ @ + . ; d M ` X Y Y Y @.Y Y Y Y Z i u.6+6+_+4+<+<+4+(+(+0+4 + . . . . + + + . . + + + . . . . . + . . . . + + $ 4 3+:+:+3+:+3+:+:+^+:+4+u._.U.U.W.W.U.U.U.Z.W.U.R.8 . . # . . . . @ }.#+#+U.W.U.U.w.. . . . . . + . ~.U.U.U.U.U.U.U.U.Z.Z.U.#+w.v #.=.=.=.=.=.=.=.=.=.'.%.O $ @ @ . . . + $ j #.>.=.&.%.%.k = @ @ @ # # $ = O *.=.=.=.&.=.=.*.=.=.'.>.k o B A A A B x y A B B B B B B B x w h % . @ . @ # . * l x x B x B B B x B B B B B B B B B B B B B B 2 N d.8.f.0.j.b.d.d.d.0.|., . $ + + . . + : ..i.e.d.b.j.5.t $ . # @ @ . - , s 5.d.9.9.f.9.9.d.9.e.9.i.N ", -"W <.<.<._.<.<.<.<._.<.<.<.H > + + + + + + + ~ F [.<.}.F 4 + + . . . . + + H _.<./.<.<.<.<.<.<.<.<.<.9 r.B+D+A+y+z+A+G+B+y+A+E+y+I.^ . # % % % @ @ g '+j+j+'+W ] $ % . . . . + W y+F+z+z+z+z+z+z+z+z+z+A+G+>+n.%+9+|+}+|+9+9+|+|+|+9+9+9+9+|+|+|+9+|+|+b+7+7.- % $ . . # + - J.7+b+|+7+9+9+|+|+}+|+9+9+9+|+|+b+b+%+3.X.u+k+s+k+k+s+k+h+k+t+k+[+R % . + $ + + + + + + @ @ @ + + . . + + + + % + c.r+s+d+h+s+s+l+e+t+s+s+d+6.n P .+.` ` U +.U Z @.M } * + . @ @ @ % ' } M U ` P M e ( % . . @ . . % ( e P ` ` X Y Y Y Y Y Y Y Y d k.a+3+^+(+<+3+^+4+(+3+F 7 ~ 4 8 ~ 4 4 4 8 ~ ^ 4 ~ ] { @ + . . . . . + 4 4 4 _.3+(+3+(+3+3+:+:+^+:+0+u.[.U.U.W.U.U.U.U.U.U.U.#+}.+ . + + . + + . 8 M.U.#+`.U.w.8 . . . . . . . @ M.W.U.U.U.U.W.W.++U.Z.W.#+w.v #.=.=.=.*.=.=.=.=.=.'.%.#.< $ @ . . . . @ < j #.#.'.#.C < @ + . . . @ $ | #.*.*.=.*.=.=.*.>.*.'.=.*.k o A A A A B B B B B B B B B B B w w 2 @ . . . @ # . * w A B x x x B B A B B B B B B B B B B B B B B 2 u d.8.f.0.9.8.e.d.9.9.i.1 + @ $ + + . + $ 1 Q i.j.i.5.u : + . # @ @ - - , N f.9.f.9.9.9.f.d.9.e.d.i.N ", -"F <.<._.<.<.<.<._.<.<._.<.[.= $ + + + + + + @ 8 F F 7 4 ] # . . . . + $ 8 _._.<.S <.<.<.<.<.<.<.<._.7 r.B+D+z+y+y+A+z+y+y+w+w+y+m+a.. . % % @ @ . @ _ a.].W % . @ % . @ . @ + -+y+z+z+w+w+z+z+z+z+w+y+E+G+>+h.$+9+9+|+|+|+9+|+|+|+|+|+9+|+|+}+|+9+}+9+b+7+m.- @ $ . . % + . n.7+f+|+}+|+9+|+|+|+}+|+9+|+}+}+b+b+$+3.X.u+k+k+k+k+k+h+k+k+s+e+X.* . + + + + . $ $ + @ @ @ + + @ @ + + + + @ % @ c.t+t+d+k+t+s+k+e+t+s+s+d+6.c Y .+.U ` U +.Y U +.P e ' @ - & & % % & ; } d e e d ( * @ @ $ @ . @ ' d M Z @.` Y Z Y +.Y Y Y Y Y d q.3+6+_+^+<+^+:+:+:+:+O.O.u.O.u.u.O.P.O.O.u.P.O.u.u.w.8 + . @ # + + { V.O.s.O.:+:+(+:+:+3+:+:+^+(+4+u._.Y.Z.U.U.U.U.U.Z.U.U.W.M.J . + + + + + . @ 8 }.w.w.k.8 . . + + . . . @ J R.Z.U.U.U.U.U.W.@+U.Z.R.#+G.m q =.=.=.=.=.=.=.=.=.*.%.*.q , + . . . . . + < j j q m 4 = . . . . + + = t ,.%.'.=.*.&.=.>.>.*.=.=.>.k o B B A A B B B B B B B B B B A w w ; # . . . . . @ f I B B x B B B B A A A B B B B x B B B B B B B 2 N d.8.f.0.9.b.e.d.f.d.i...= . + + + . . + $ 1 t ..u : = + % # . + + + + : 2.j.9.9.d.9.9.f.d.9.d.e.0.N ", -"D <.<.<.<.<.<.<.<.<.<._.<.<.7 = @ # . . . . . . > ^ = + @ @ # . @ . + $ J _.<.<._.<.<.<.<.<.<.<.<.[.: r.B+D+A+y+y+E+z+B+B+z+E+z+y+T.) @ % % . . @ @ + + . . . # @ % . @ . @ W x+F+z+z+w+w+z+z+z+z+w+F+A+G+'+h.%+b+b+|+|+9+9+9+|+}+|+|+9+}+}+9+}+9+}+|+|+2+7.- @ $ . . @ + @ n.}+b+|+}+|+9+|+}+|+|+|+9+}+}+}+b+9+%+3.S.u+s+s+h+h+h+h+h+k+t+d+R . + $ + . + . $ $ + $ $ % # . . . . . . . $ $ + c.t+e+k+q+r+s+k+k+k+s+q+l+y.n @.+.+.Z ` Z +.X U T +.P d ; . % @ $ - . . % % ; ' ; % # . @ $ @ @ & ( M X +.Z ` Y Y Y Y Y Y Y Y Z d u.6+^+_+_+1+<+:+(+(+:+4+3+3+4+4+4+4+4+4+4+4+4+4+0+0+{+F + @ $ @ + + ~ 0+0+4+3+:+:+:+:+3+(+(+:+_+(+p+u.[.U.U.W.W.U.U.Z.Z.U.U.W.#+k.@ . . + + . . . . . @ % @ . + . . . . . . 8 w.#+U.U.U.U.U.U.W.W.R.Z.R.#+G.m q =.=.=.=.=.=.=.=.=.*.*.%.%.j $ # . + + . . @ @ = < , + $ # - . . + = < #.%.'.&.=.=.&.=.*.*.=.'.=.*.k o B A A A B B B B B B B B B B w A h & . . . . . . @ 2 w x x B x B B B B A B B B B B B B B B B B B E < N d.8.f.0.j.e.j.f.d.d.f.5.1 + + $ $ @ . . @ $ = = = + . # % # . + $ $ , N j.e.f.d.d.9.f.d.f.d.8.j.i.N ", -"F <.<.<._.<.<.<.<.<._.<.<.<.<.4 . . @ @ # # . . # + + + # % % . % + ~ 8 [._.<.<.<.<.<.<.<.<.<.<.<.u.9 r.B+D+A+y+z+D+E+B+B+z+D+E+F+x+x.) @ % . . # @ @ @ @ @ @ . . . . . # [ >+F+E+y+z+z+z+z+z+z+z+z+z+A+G+'+h.%+9+9+|+|+|+9+|+}+}+|+9+9+|+|+9+9+9+|+|+b+7+7.- % @ . . # + - n.}+9+|+2+}+9+9+|+|+|+9+9+|+}+9+b+9+%+3.X.u+s+k+k+s+s+s+s+k+k+~+* @ = = + . . . + + @ @ @ @ + . . + . . . . $ $ + c.o+t+h+q+q+q+k+d+s+r+q+d+B.e @.X +.U ` U +.P Y T T +.M ( @ @ + + . . + . # @ # # . . + $ % % + ; p @. .+.Y U Y Y Y Y Y Y Y Y Y i q.a+a+_+_+1+:+3+4+3+3+3+<+<+:+:+:+4+4+(+(+4+(+<+<+0+{+F + + $ + . + ~ 0+(+4+<+3+:+:+:+:+:+(+:+:+3+4+u._.U.`.W.W.U.U.#+U.U.U.Z.Z.U.}.. . . . . . . . + + . . + + . . . . . { w.U.Z.W.Z.U.W.U.Z.U.W.U.Z.Z.#+G.m >.=.=.=.=.=.=.=.=.=.=.=.'.=.O < & . $ $ . - # . @ @ @ # @ . + . . + , j #.%.&.&.'.=.&.=.*.*.=.=.=.*.k 3 A A B x B B B B B B B B B B B w h % @ . . . . . . 8 A x y x x x B B A A B B B B B B B B B B B B E 8 N b.8.f.0.e.j.9.f.d.8.f.f.N = + $ $ @ - - . + + . . . . % * % . $ $ $ : 5.i.e.f.9.d.9.f.9.f.9.e.j.0.Q ", -"F <.<._._.<.<.<.<.<._._._.<.<._.] @ @ # @ @ + . + + # @ + + @ % % ^ H _.[.<.<.<._.<.<.<.<.<.<.<.<.u.9 r.B+E+z+y+y+D+A+y+y+z+A+E+z+y+m+x.> @ + + @ * % % % % @ # . # + @ g P.x+F+z+y+z+w+z+z+z+z+z+z+F+A+G+'+h.%+b+9+}+|+9+9+9+9+9+9+9+9+|+|+9+f+9+f+|+b+2+m.. @ $ @ @ @ + . n.2+b+9+9+9+9+9+9+9+9+9+9+|+|+9+b+b+%+3.S.q+s+s+h+h+s+s+h+h+e+E.+ $ $ = + + . . + + @ @ . + $ + $ $ + + + + = = + c.t+t+h+q+r+r+k+l+s+r+q+d+B.n P .Z U ` Z +.` +. . . .P e ( & $ @ @ . . @ * # . . . . + $ % * ' d P X . .X U Y Y Y Y Y Y Y Y Y p u.p+a+_+_+<+4+4+3+<+<+:+(+3+<+:+3+4+(+(+:+:+:+:+(+4+O.F + $ + $ + + ~ 4+(+4+<+3+(+:+(+3+3+:+:+4+3+4+u.}.Z.#+W.U.U.U.U.U.#+W.W.R.#+U.:.{ @ . . . . . . . . . . . + . . + { }.U.W.Z.W.Z.U.W.Z.Z.Z.`.`.Z.Z.#+G.m >.=.=.=.=.=.=.=.=.*.*.=.&.&.%.k < = $ $ . . % . @ @ # % . @ @ . @ = j #.>.%.'.&.&.=.'.=.=.*.*.=.%.>.k o A A A B B B y A B B B B B B B A 2 & $ @ @ @ @ @ % l I x x B A A B B A A B A B B B B B B x x B B B 2 u d.8.0.0.e.j.9.f.9.d.9.f.5.C , = $ + - . @ @ - - - - . # & % + $ , 7 s 5.j.d.9.9.9.9.9.9.9.9.e.j.f.Q ", -"D <.<.<._.<.<.<.<.<.<.<.<.<.<.<.J 7 ^ . $ $ + + + + @ @ + + $ % 4 <.<.<._.<.<.<._.<.<.<.<.<.<.<.<.u.9 r.B+A+z+y+z+z+z+z+z+z+z+z+z+z+F+y+I.[ ~ = % * % $ & @ @ @ @ . 4 H m+y+y+v+y+y+z+w+z+z+z+z+y+z+y+C+G+-+o.%+b+9+}+|+9+9+|+|+|+|+|+|+|+|+}+9+|+}+9+}+8+h.. + @ % % + . . n.8+7+|+5+|+|+|+|+|+|+|+|+|+}+}+b+9+$+7.X.q+h+h+k+s+s+s+k+k+[+4.- $ @ $ $ $ $ + + $ $ + + $ $ + $ + + + + $ = $ % c.n+k+k+s+h+s+h+d+s+t+t+l+6.c @. .X @.` U +.U Z Z @.Z Y Y +.} ' ; % @ @ . - - . @ @ @ @ * * } U G Z @.@.Z Z U Y Y Y Y Y Y Y Y @.d u.3+3+_+(+<+:+3+:+^+^+:+(+3+:+:+3+3+:+:+:+:+(+4+(+4+=+F + $ + + $ $ , 0+_+0+(+:+:+:+:+:+:+:+:+_+:+4+u.[.Z.#+U.U.U.U.W.W.U.Z.U.W..+.+U.:.8 @ @ # . . . . . . . . + @ $ 8 F.R.U.W.U.U.U.U.U.U.U.W.@+`.Z.W.#+G.m q =.=.=.=.=.=.=.=.*.*.=.*.*.=.=.'.q # % $ @ @ @ @ @ @ & + $ % = m j *.=.=.&.=.=.=.=.&.'.=.>.>.=.'.>.k o B A A A B y p A B B w B B B B F ; % @ % % % % % ; l I w A A B B B B B B B B B B B B B B B B B B A < N b.8.f.0.9.9.9.9.f.9.9.9.d.5.N : , $ . . @ @ + @ + + . . - > , , s 2.0.f.f.9.9.9.9.9.9.9.9.9.d.9.0.N ", -"_.<.<.<._.<.<.<.<._._.<.<.<.<.<.[.[._.9 ~ { $ + + ~ > . { ~ ~ J _.<.<.<.<.<.<.<._.<.<.<.<.<.<.<.<._., r.B+D+z+y+v+z+z+z+w+w+w+z+z+w+w+y+y+m+x.F 9 _ [ _ [ ] _ _ g a.'+x+y+z+z+z+z+A+z+w+w+w+z+z+w+w+y+A+G+'+h.%+b+9+}+}+|+|+|+|+|+}+|+|+|+|+}+9+|+9+|+}+}+C.L 5 5 5 5 5 5 L C.}+}+|+5+|+}+|+|+}+}+|+|+}+}+}+9+9+%+3.S.q+h+k+k+k+h+k+k+k+[+c.L b b b b b b b b a b b b b b b b b b b b b b b b X.n+k+k+h+q+s+k+d+e+e+k+[+c.n M +.+.` ` U +.U Z @.U Z Z Z Y M e d ( ' ' ' ; ; ; ; ; ' ( } d M +.Y Z Z Z Z U U Z Y U Y Z Z Z U @.d k.<+a+_+(+<+:+:+:+:+:+:+:+:+:+:+:+(+:+:+:+:+:+:+(+(+=+<.4 4 4 4 4 7 F 0+{+_+{+:+:+:+:+:+:+:+:+^+(+4+u._.U..+`.U.W.U.U.U.U.R.R.W.W..+V.++M.}.J * { { { { { { { { { :.O R.Z.U.M.U.U.U.U.U.U.U.U.U.Q.Q.Q.Z.#+G.m q '.=.*.*.*.=.=.&.*.*.*.*.%.%.&.&.q C m | = , % , , % % , : 0 C O #.*.=.=.*.*.=.=.=.&.=.%.>.>.=.=.*.k o A w B B B B A B B B B B B B B l 3 * * * * * * ; ' o w I A A A B B B A A B B A A B B x B B B B B E 8 u d.8.9.0.9.9.9.d.d.d.d.9.d.f.i.2.N 1 : : , , , , , , , , , : u N 2.i.i.9.9.9.9.d.9.f.9.9.d.9.b.j.i.N ", -"F <.<.<.<.<.<.<.<._.<.<.<.<.<.<._._._._._._.H H H g g H _._._._._.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.[.H r.B+D+E+y+y+z+z+z+z+z+z+z+z+E+D+A+z+y+F+y+x+'+T.T.T.T.-+'+x+x+z+y+z+A+A+A+A+z+z+z+w+z+z+z+z+z+F+E+G+'+h.%+b+b+|+|+9+9+|+|+|+}+|+9+|+|+9+f+9+|+|+5+b+f+2+7+8+7+7+8+2+7+2+2+}+|+b+9+9+9+9+9+9+9+9+9+|+|+b+9+$+7.*+u+h+h+k+k+s+h+s+k+o+r+l+s+n+n+s+n+s+s+s+l+s+s+s+s+s+s+s+s+s+s+s+s+n+n+s+t+t+s+s+k+s+r+l+d+k+o+s+~+B.c @.X +.U ` Y +.U Z Z U Z @.Z Z Y Y Z ` M n n n e e e n M P P M ` Y Y U U Z Z Z Z U U Y Z U U U Y Z d k.a+<+_+(+1+:+3+:+:+(+(+:+:+:+:+:+:+(+:+:+:+:+(+{+(+4+0+0+4+0+0+0+0+0+_+(+_+3+:+:+:+:+3+:+:+:+^+_+4+u.[.Z.#+`.U.Z.U.Z.Z.U.U.U.U.W.W.W.W.#+U.`.W.q.w.w.}.}.}.w.q.U.@+R.#+U.U.U.U.U.Z.U.U.U.U.W.U.R.Q.Z.U.#+G.m q *.=.=.*.=.=.=.=.=.=.=.=.*.%.%.&.=.%.#.#.q q j j j j j q #.%.'.%.,.*.&.&.=.*.*.=.=.&.=.*.*.=.=.*.>.k o A A B x B B B B B B B B B B B }.B w w w w w w w w A w B A A A B B B x B B B B B B B B B B B B B B 2 N b.8.9.0.9.j.9.9.f.9.f.9.9.9.e.9.i.i.5.5.Q Q N u N u ..Q 5.5.0.i.i.e.e.e.d.9.9.9.9.f.9.9.9.9.e.j.0.N ", -"H <.<.<._.<.<.<.<.<.<.<._.<.<.<._._.<._.<.<._.<._._._._.<._._.<.<.<.<.<.<.<.<.<.<.<.<.<./.F <.<.<.[.9 r.B+D+A+y+w+z+z+z+z+z+z+z+z+z+w+z+E+z+z+w+E+E+y+x+y+y+F+y+y+w+z+A+z+z+z+A+z+E+z+A+z+z+z+z+z+z+z+C+G+'+h.$+9+9+|+|+9+f+9+9+9+|+9+9+|+|+9+9+9+9+|+b+b+|+}+}+}+b+b+f+7+|+9+9+9+|+|+|+9+f+9+9+9+9+9+|+}+|+b+9+%+7.X.u+s+s+k+h+s+h+s+k+r+k+s+k+k+s+t+o+s+s+s+k+s+s+s+s+r+s+k+h+q+r+s+s+k+l+t+o+t+s+k+l+l+s+s+l+h+t+t+l+6.n M +.+.Z ` U +.Z Z Z Z Z Z Z Z . .+. . .+.Y ` ` ` Y @.Z Y Y +.+.Y U U Z Z @.Z U Y Y Y Y Y Y Y Y +.d q.a+_+_+(+<+:+3+:+:+:+:+3+3+:+:+(+3+:+:+:+:+3+3+4+:+:+4+0+0+{+0+4+4+4+{+{+:+3+:+:+(+:+3+:+:+:+a+4+0+u._.Z.U.W.Z.U.U.W.W.U.Z.U.U.#+U.U.U.Z.U.U.Z.U.U.#+#+U.U.#+U.#+W.#+R.U.Z.U.U.W.U.U.U.U.U.W.Z.U.U.U.W.#+G.m #.=.&.&.=.=.=.=.=.=.=.=.=.=.=.%.=.'.=.%.&.*.>.*.%.,.'.%.,.%.,.&.&.&.=.=.*.&.=.&.=.&.&.'.*.*.=.=.=.%.k l w B A B B B B B B B x B A B B B B A x A B A x w w w w B A B x B B B B B B B B B B B B B B B x B E 2 u d.8.0.0.e.f.9.9.9.d.9.9.0.8.8.e.9.9.d.9.j.j.i.i.j.i.j.j.i.e.e.9.j.b.b.d.d.9.9.9.9.j.j.9.9.9.8.j.i.Q ", -"a.<.<.<.<.<.<.<.<.<.<.<.<.<.<._.<.<.<.<._._.<.<.<._._.<.<.^.W <.<._.<.<.<.<.<.<.<.<.<.<.s <.<.<.<.}.D r.B+D+A+y+z+z+z+z+z+z+z+z+z+y+y+z+F+A+C+A+A+E+z+z+z+z+E+A+A+z+E+z+E+y+y+y+G+E+z+z+z+z+z+z+z+z+F+A+G+'+h.%+9+9+|+9+9+9+|+|+|+}+|+9+|+|+9+9+9+|+}+7+|+9+|+9+9+5+b+b+5+|+b+9+9+9+}+9+9+}+|+9+9+9+9+|+}+|+b+b+%+J.*+u+s+s+h+s+s+s+h+h+u+l+l+q+h+s+s+t+q+q+q+q+q+q+q+q+u+q+q+q+q+q+q+u+k+k+t+t+s+t+l+l+q+t+s+k+s+o+s+d+6.c Y +.+.` ` U +.Z Z Z Z Z Z Z Z +.+.+.+.Z @.@.` @.Y +. .+.U +. .X Z U Z Z Z Z Z Z Y Y Y Y Z Z Z Y @.d w.3+<+_+^+<+:+3+:+_+(+3+3+:+:+<+^+4+3+:+:+3+3+:+4+^+(+4+4+(+{+{+4+4+4+:+<+3+3+3+:+_+:+:+:+:+:+3+3+p+u.}.U.#+U.U.U.U.W.W.U.U.U.Z.W.W.W.Z.#+#+L.v.W.U.U.U.U.U.U.#+U.U.U.W.U.Q.`.U.W.U.U.U.W.W.#+R.U.U.Z.Z.#+G.v #.=.=.=.=.=.=.=.=.=.*.=.=.=.=.=.=.=.*.=.&.=.=.=.*.#.%.>.=.=.=.=.&.&.=.*.=.=.=.=.=.=.'.=.>.>.=.'.=.*.k o B w A B x B B B B B B B w x B B B B B x y A y A w A B B B B B B B A B B B B B B B B B B B B B B E 2 u d.8.f.0.9.9.d.9.9.9.d.f.j.f.f.9.9.0.d.d.f.f.9.9.9.9.e.9.f.d.8.b.e.j.0.f.f.f.9.9.j.j.9.9.j.f.8.j.i.N ", -"F <.<.<.<.<.<.<.<.<._.<.<.<.<.<.<.<._.<.W ^._.D D _._._.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<._.<.<.<.<.[.9 r.B+A+z+y+z+z+z+z+z+z+z+z+z+y+y+y+y+A+C+z+A+A+z+z+z+z+E+F+E+A+z+w+z+y+y+y+z+z+z+y+z+z+z+z+z+z+F+A+G+'+h.%+9+9+}+|+9+9+9+9+|+}+9+9+|+|+9+9+|+|+}+2+7+f+|+9+}+9+b+9+|+|+b+}+}+}+}+f+9+9+}+|+}+|+9+|+}+|+b+9+N.3.X.u+s+s+h+h+s+s+s+h+u+u+u+u+h+s+q+t+h+h+k+s+h+s+h+h+s+s+h+h+h+h+h+q+h+t+t+s+k+l+l+l+k+s+h+d+l+t+o+l+6.n ` +.Y U ` U +.Z Z Z Z Z Z Z U Z Y Y Y Z ` ` @.Y Y Y Y +.X Y +.X Z Z Z Z Z Z Z Z Z Y Z Y Y U Y Y @.d w.a+^+_+(+<+3+:+3+:+:+:+3+3+:+:+:+3+3+(+(+(+6+a+:+:+:+4+4+4+4+4+{+4+(+:+<+<+3+3+:+:+:+3+:+:+:+_+:+4+u.}.U.#+W.W.Z.U.Z.W.W.U.U.U.U.W.W.Z.U.U.#+W.U.U.U.U.U.U.W.U.U.U.U.U.U.#+U.Z.U.U.U.Z.W.R.W.#+`.U.Z.Z.#+G.m q *.=.=.*.=.=.=.=.=.=.%.%.=.=.=.=.=.=.&.*.&.=.*.*.=.*.>.*.*.=.=.=.=.*.&.&.=.=.*.=.=.&.=.*.*.*.=.*.>.k o A A B B x B B x A B B B B B B B B y B A B B B A B A B B x B y B B A A B B B B B B x B B B B B B B 2 u d.8.9.0.9.9.d.9.f.9.d.9.9.0.0.f.f.f.f.f.0.j.9.9.9.9.9.9.e.d.j.j.9.f.0.0.f.d.9.9.f.9.9.9.9.f.e.j.f.N ", -"F <.<.<._.<.<.<.<.<.<./.<.<.<.<.<.<._.<.<.<.<.<.<._._._.<._._._.<.<.<.<.<.<.<.<.<._.<.<.<.<.<.<.<.F D r.v+D+E+y+v+w+w+z+w+w+w+z+z+w+y+y+y+w+w+w+w+y+B+y+w+w+z+w+z+z+w+w+y+y+y+w+w+A+z+w+w+w+w+z+z+w+y+C+G+>+h.%+9+|+}+}+|+|+|+|+|+|+|+|+|+|+|+9+|+|+}+2+7+9+9+9+9+}+f+}+}+}+}+}+7+}+|+|+|+|+|+|+|+|+|+}+}+}+|+9+$+3.X.u+h+k+k+k+h+k+h+k+h+d+d+k+e+k+k+k+h+k+n+e+d+k+d+k+e+l+e+l+d+d+d+k+d+d+l+h+h+h+k+k+e+k+l+d+k+o+k+d+6.e U +.+.Z ` Z +.Z Z Z Z Z Z Z U Z U U U U U Z @.U U Z Y U @.` @.U @.Z U Z Z U Y Z Z U Y Z Y Z U U @.d }.a+<+_+(+1+:+:+:+:+:+:+:+:+:+:+(+(+(+:+:+(+:+<+:+:+:+:+(+(+:+<+<+:+<+<+a+<+a+:+:+:+:+:+:+:+:+:+:+0+u.[.M.U.`.U.W.U.U.U.U.U.U.U.U.Z.Z.U.U.U.U.U.U.U.U.U.U.U.U.U.U.W.U.U.U.U.U.Q.U.U.U.R.Q.W.W.Q.@+`.Q.Q.#+G.m q %.=.*.*.=.=.=.=.=.'.=.=.*.%.*.=.=.=.*.*.*.*.=.*.*.=.=.*.=.*.=.*.*.*.*.*.*.*.=.=.=.&.'.#.>.=.=.=.*.k o B B B x B x y B w B B B B B B z y B x A B B B w B x y x B B p y A B B B B B B B B B x x B B B A E 2 N b.8.0.0.9.d.d.d.d.d.d.d.f.0.0.f.e.d.d.d.f.f.f.9.9.f.f.d.d.9.9.9.0.0.f.d.d.b.9.9.9.9.9.9.d.9.e.j.0.N ", -"D <.<._._._.<.<.<.<._.D /.<.<._.<.<._.D D <.<.<.<.<._._._.<._._.<.<._._.<.<.<.<._.<.<.<._.<.<.<.<.u.9 r.B+D+E+y+z+z+z+z+A+A+z+z+z+z+y+y+y+y+y+z+y+B+B+y+w+w+z+z+z+A+z+y+y+y+y+y+C+D+z+z+z+z+z+y+A+z+z+C+G+'+h.%+b+b+}+|+9+9+9+|+}+9+|+|+|+}+9+9+9+}+|+}+}+9+9+9+9+9+|+}+f+}+}+|+7+9+b+9+9+9+|+|+|+}+|+9+|+9+b+9+%+3.X.u+s+h+k+k+s+h+h+k+d+h+q+s+s+s+o+k+k+k+o+e+k+o+e+k+o+e+k+o+t+k+k+d+l+q+q+q+q+k+k+k+s+k+l+l+k+t+o+d+B.n M .U ` ` Z +.U U U U Z Y U U U Z +.+.Y U Z Z Y U Y Y Z U Y U Y Z Z U U U U U Y Y Y Y Y Y Y Z Z Z d q.a+_+_+(+<+:+3+:+:+:+:+:+:+:+:+:+3+:+:+:+:+:+<+:+:+:+4+4+(+:+4+4+:+<+:+<+<+<+:+:+:+:+:+(+:+:+_+4+0+u._.Z.#+`.U.U.U.U.U.U.U.U.U.U.W.R.Z.U.U.U.U.U.U.U.U.U.U.U.U.U.Q.U.U.Z.U.U.U.U.U.U.U.U.U.R.#+Q.Z.Z.Z.#+w.v q '.&.=.=.&.=.=.=.=.*.%.=.*.%.%.=.=.&.=.=.=.=.=.*.*.&.=.&.=.=.=.=.=.&.&.=.=.=.=.=.=.&.'.=.*.=.&.*.>.k o A A B B B B x B B B B B x B B B A A A A A B B w A B B B x B B B B B B B B B B B B B B B B B A B A 2 u d.8.f.0.d.f.f.9.9.f.d.d.9.9.j.e.e.8.e.9.f.9.d.f.9.d.9.f.f.9.0.i.0.f.d.d.8.d.9.9.9.9.9.9.9.9.e.e.0.N ", -"a.<.<.<.<._._.<.<.<.<._.<.<.<.<.<.<._._.<.<.<.<.<.<.<.<._.<._.<.<.<._._.<.<.<.<._.<._.<.<.<.<.<.<._.9 I.x+E+D+z+z+z+z+z+z+z+z+z+z+z+y+y+y+y+y+z+y+y+z+z+z+z+z+z+F+y+z+z+z+z+y+y+F+z+z+z+z+z+z+z+z+z+y+C+G+-+n.;+5+b+f+9+9+9+9+|+f+9+9+9+9+|+|+9+9+9+9+9+9+9+9+b+9+9+9+}+|+9+9+9+9+9+|+b+9+b+9+9+9+9+9+|+f+f+b+b+%+m.*+q+s+s+h+k+s+s+k+k+h+q+s+h+s+s+s+s+s+h+s+s+s+s+s+s+h+h+s+h+h+s+s+s+s+k+s+s+s+h+h+k+h+s+t+d+s+t+t+d+B.n +.T .+.+. .+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .d k.p+a+3+<+1+:+3+4+(+:+4+4+4+:+:+:+:+:+4+(+:+4+4+:+:+4+4+:+:+<+(+4+4+:+:+4+:+:+:+:+:+:+:+4+<+4+1+0+0+u._.U.W.Z.Z.U.U.Z.Z.U.U.U.Z.Z.Z.U.U.U.Z.Z.W.W.U.U.U.U.U.U.U.U.U.Z.U.Z.W.U.Z.U.U.Z.Z.U.U.U.#+#+R.Z.#+#+G.m O =.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.'.&.'.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.'.=.&.&.&.&.'.%.k w w B B w x B B y A y A y B B x A B B y A y A y y A B A A y x A B y y y y y x x y B B B x z B y A B < u j.e.8.8.8.e.e.j.8.9.e.e.8.b.9.e.e.e.e.8.e.e.8.e.d.b.b.b.e.d.b.e.b.b.e.b.d.j.b.b.e.8.8.j.d.8.e.e.i.Q ", -"F <._._.<.<.<._.<._._.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<._._.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<._._.<.9 I.x+y+z+z+y+z+A+A+D+D+E+E+D+E+A+E+D+A+A+A+A+A+D+D+D+A+D+D+A+A+A+D+D+D+D+D+A+D+D+A+A+D+D+A+D+D+y+z+x+T.o.;+f+|+9+f+f+9+9+9+9+9+f+}+9+9+9+b+9+9+9+7+7+9+9+9+9+9+b+f+}+9+9+9+9+9+f+7+7+f+9+9+9+9+9+9+}+7+|+9+%+p.S.q+t+s+s+t+t+t+t+s+s+q+t+q+s+t+s+t+t+s+t+t+t+s+s+t+s+t+s+t+t+s+s+t+s+s+t+t+t+t+s+t+s+l+u+s+t+s+s+l+B.n ` Y Y @.` Z Y Y Y Y Y +.Y Y +.+.Z Y Y Y +.X +.+.X Y +.+.Y Y +.+.X @.Z X +.+.Y X +.X +.@.Y +.Y Y @.d k.0+a+:+<+1+:+4+3+:+4+:+4+4+:+3+4+4+(+:+:+:+:+4+:+:+(+4+:+4+(+3+4+4+4+:+<+3+:+3+4+:+(+:+4+(+4+4+0+0+u._.U.U.U.U.U.Z.U.U.U.U.U.U.U.U.U.U.U.U.U.Z.U.U.U.U.U.U.U.U.Z.U.U.U.U.U.U.U.U.U.U.Z.U.U.U.U.U.R.Z.Z.#+G.m O *.*.=.=.*.=.=.=.=.=.=.'.'.%.=.=.=.'.'.=.*.,.'.%.'.=.=.'.'.%.'.=.=.*.=.*.=.=.=.%.=.'.%.%.%.%.%.%.>.k 3 x A B w B w B x B A x y A A A B A A A A B B A A B y x x A A B A A x x A A A A A A x z A x y y B B 2 u i.e.j.9.9.e.j.9.e.j.9.j.e.e.9.j.e.9.j.j.j.j.e.e.j.j.j.9.e.j.9.9.9.e.9.j.j.j.9.j.9.j.j.9.e.j.j.j.i.N ", -"_.<._._._._._._.<.<.<._._.<.<.<.<.<._._.<._._._._.<.<.<.<.<._.<._.<.<.<.<._._.<.<._.<.<.<.<._.<._._.9 I.j+x+F+F+x+y+E+G+z+z+E+G+y+G+E+E+E+G+G+E+E+G+z+z+z+F+y+z+F+F+E+z+G+G+E+E+G+G+y+F+z+G+G+y+z+E+y+B+G+'+o.%+9+f+2+7+7+f+f+f+7+7+f+7+2+7+f+f+7+2+7+f+7+7+7+7+7+7+7+7+f+7+f+7+7+f+7+7+7+7+7+7+2+7+7+2+2+2+f+7+&+7.*+u+t+s+l+t+t+t+t+h+s+t+h+s+t+h+t+t+l+t+t+s+t+t+t+s+t+t+l+t+t+l+r+l+s+t+t+t+s+t+s+t+t+l+l+l+s+t+t+l+B.e M M Z P M @.@.` @.@.@.@.@.` @.@.@.` ` @.@.` ` ` @.` ` @.@.@.` ` @.Z @.P ` @.@.@.` @.@.@.@.@.@.` ` d w.1+3+0+p+0+0+p+3+3+3+p+4+0+4+p+p+3+0+4+3+3+p+p+3+3+p+p+p+4+0+0+p+p+3+0+p+p+3+4+3+3+4+p+p+4+4+0+0+0+u.<.Z.#+#+#+#+#+#+Z.Z.#+#+#+#+#+#+#+#+Z.Z.#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+Z.#+#+#+#+#+#+#+#+#+Z.#+#+#+#+w.v #.*.*.>.>.>.>.*.*.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.=.>.>.>.*.>.>.>.>.>.*.*.>.>.>.>.>.>.>.#.0 o A w A I A A A A A A A A A A z A A z A A z A A z w A A A z A z x w x A w A A A x A w x z A A A w E < s i.j.e.5.f.i.f.i.i.f.i.i.0.f.i.i.i.i.0.f.i.0.i.i.i.i.0.0.0.i.i.0.i.i.i.f.0.f.0.i.i.i.f.0.0.0.j.0.i.N ", -"g F F _.F F F _.F F F W ].F _.g H F F F _.H D F _.F F H 9 F F _.F F F F F F F F _.F a.F F _.F F _.]., W I.'+H.T.>+T.I.I.I.T.I.I.I.I.T.I.T.I.T.I.>+T.T.T.I.I.T.T.T.I.T.I.T.I.T.I.H.T.I.T.I.I.T.T.T.I.I.r.I.x.L n.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.N.C.C.n.5 c.X.B.B.E.E.E.B.B.E.E.B.E.B.B.E.B.E.E.B.E.E.E.B.B.E.E.B.E.E.E.B.E.E.E.B.B.E.E.E.E.E.B.E.E.E.E.E.E.E.R p n M e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e M } _.u.<.v.u.u.u.u.u.u.u.u.u.u.<.s.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u./.v.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.v._._.:.}.}.}.}.}.}.}.}.}.:.w.k.}.}.}.w.:.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.:.}.}.}.}.}.}.[.}.}.}.k.I 2 C t q q O O O O O q O k q k q q O k q m #.q O k O q k O q k q q O m q q k O O k O q q q O k q k O j 2 o l o w h l l w w l I I l h I 3 I h I h I l A h I 3 o I I l l l l I l o w I w w 3 o I w 3 l h w I l 8 D N Q Q N N Q N Q N N N Q N N N Q Q N N N N N Q N N Q N N N N N N N N Q N N N Q N Q N N N N N Q N N D "}; diff --git a/src/examples/graphics/demo_Application/CMakeLists.txt b/src/examples/graphics/demo_Application/CMakeLists.txt new file mode 100755 index 00000000..7eca8e61 --- /dev/null +++ b/src/examples/graphics/demo_Application/CMakeLists.txt @@ -0,0 +1,9 @@ +include(${PROJECT_SOURCE_DIR}/cmake/opengl.cmake) +set(APP_NAME geogram_demo_Application) + +aux_source_directories(SOURCES "" .) +add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram_gfx geogram ${GLFW_LIBRARIES}) +install_runtime_targets(${APP_NAME}) + +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/examples/graphics/demo_Application/main.cpp b/src/examples/graphics/demo_Application/main.cpp new file mode 100644 index 00000000..35ebb855 --- /dev/null +++ b/src/examples/graphics/demo_Application/main.cpp @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2012-2014, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#include +#include +#include + +// Demo for the Application class. +// Note: Application is the lowest level access to +// geogram's application framework. It initializes +// a window, OpenGL/GLUP and ImGui contexts. +// You can override draw_gui() and draw_graphics() to +// draw your own stuff. +// Take a look at SimpleApplication / demo_SimpleApplication +// for an easier-to-use baseclass. + +namespace { + using namespace GEO; + + // Point coordinates of the vertices of an icosahedron + static double points[] = { + 0, 0.0, 1.175571, + 1.051462, 0.0, 0.5257311, + 0.3249197, 1.0, 0.5257311, + -0.8506508, 0.618034, 0.5257311, + -0.8506508, -0.618034, 0.5257311, + 0.3249197, -1.0, 0.5257311, + 0.8506508, 0.618034, -0.5257311, + 0.8506508, -0.618034, -0.5257311, + -0.3249197, 1.0, -0.5257311, + -1.051462, 0.0, -0.5257311, + -0.3249197, -1.0, -0.5257311, + 0.0, 0.0, -1.175571 + }; + + // Facets of an icosahedron + static index_t facets[] = { + 0,1,2, + 0,2,3, + 0,3,4, + 0,4,5, + 0,5,1, + 1,5,7, + 1,7,6, + 1,6,2, + 2,6,8, + 2,8,3, + 3,8,9, + 3,9,4, + 4,9,10, + 4,10,5, + 5,10,7, + 6,7,11, + 6,11,8, + 7,10,11, + 8,11,9, + 9,11,10, + }; + + + class DemoApplication : public GEO::Application { + public: + DemoApplication() : GEO::Application( + "Geogram Demo App" + ) { + demo_window_visible_ = false; + frame_ = 0; + // Call 'start_animation()' if you want draw_graphics() to be + // called continuously. Without it, draw_graphics() is only called + // when there is a gui event. + start_animation(); + } + + protected: + void draw_gui() override { + // Draw the GUI of your application here, using ImGui. + if(demo_window_visible_) { + ImGui::ShowDemoWindow(&demo_window_visible_); + } + ImGui::Begin("My window"); + ImGui::Text("%s","Hello, world"); + + // To learn how to program a GUI element in ImGui, find + // it in the demo window, then look it up in the sources + // of ImGui (geogram_gfx/third_party/ImGui/imgui_demo.cpp) + ImGui::Checkbox("ImGui demo window", &demo_window_visible_); + ImGui::Checkbox("Animate", animate_ptr()); // Toggle animation + ImGui::End(); + } + + void draw_graphics() override { + // Draw the OpenGL graphic part of your application here. + Application::draw_graphics(); + GLsizei L = GLsizei(std::min(get_width(), get_height())); + glViewport(0, 0, L, L); + glClearColor(0.1f, 0.1f, 0.1f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glEnable(GL_DEPTH_TEST); + + + // GLUP has a re-implementation of the old fixed functionality + // pipeline (on top of modern OpenGL). It can be used to + // create simple geometry. For larger objects, use glupDrawArrays() + // and glupDrawElements() + glupMatrixMode(GLUP_MODELVIEW_MATRIX); + glupLoadIdentity(); + glupScaled(0.7, 0.7, 0.7); + glupRotatef(float(frame_) * 0.3f, 1.0f, 1.0f, 1.0f); + glupSetColor3d(GLUP_FRONT_AND_BACK_COLOR, 0.0, 0.0, 0.0); + glupSetColor3d(GLUP_MESH_COLOR, 1.0, 1.0, 1.0); + glupEnable(GLUP_DRAW_MESH); + glupSetMeshWidth(3); + glupDisable(GLUP_LIGHTING); + glupBegin(GLUP_TRIANGLES); + for(index_t i=0; i gui:expert=true +// then Windows->Export gui state to C++ +const char gui_state[] = u8"[Window][DockSpace] Pos=0,0 Size=1024,1024 Collapsed=0 [Window][ Object] Pos=60,60 Size=172,458 Collapsed=0 [Docking][Data] DockSpace ID=0x09EF459F Pos=0,24 Size=1024,999 Split=Y DockNode ID=0x00000001 Parent=0x09EF459F SizeRef=1024,825 Split=X DockNode ID=0x00000005 Parent=0x00000001 SizeRef=158,764 Split=Y SelectedTab=0x07957BC8 DockNode ID=0x00000007 Parent=0x00000005 SizeRef=158,470 Split=Y SelectedTab=0x07957BC8 DockNode ID=0x00000009 Parent=0x00000007 SizeRef=158,467 HiddenTabBar=1 SelectedTab=0x07957BC8 DockNode ID=0x0000000A Parent=0x00000007 SizeRef=158,295 HiddenTabBar=1 SelectedTab=0x4177D348 DockNode ID=0x00000008 Parent=0x00000005 SizeRef=158,292 HiddenTabBar=1 SelectedTab=0xBD088ACE DockNode ID=0x00000006 Parent=0x00000001 SizeRef=696,764 CentralNode=1 HiddenTabBar=1 SelectedTab=0x080FC883 DockNode ID=0x00000002 Parent=0x09EF459F SizeRef=1024,172 HiddenTabBar=1 SelectedTab=0xF9BEF62A "; diff --git a/src/examples/graphics/demo_Delaunay2d/main.cpp b/src/examples/graphics/demo_Delaunay2d/main.cpp index 19bbe2c0..95207024 100644 --- a/src/examples/graphics/demo_Delaunay2d/main.cpp +++ b/src/examples/graphics/demo_Delaunay2d/main.cpp @@ -43,561 +43,18 @@ * */ -#include -#include -#include -#include +#include #include -#include -#include -#include #include -#include -#include +#include "gui_state.h" namespace { - using namespace GEO; - vector points; - Delaunay_var delaunay; typedef vector Polygon; - Polygon border; - - void Lloyd_relaxation(); - - void convex_clip_polygon( - const Polygon& P, const Polygon& clip, Polygon& result - ); - - vec2 centroid(const Polygon& P); - - /** - * \brief Updates the Delaunay triangulation with the current - * vector of points. - */ - void update_Delaunay() { - delaunay->set_vertices(points.size(), &points.data()->x); - } - - /** - * \brief Creates random points. - * \details Points are created uniformly in the [0,1]x[0,1] - * square - * \param[in] nb the number of points to create. - */ - void create_random_points(index_t nb) { - for(index_t i=0; i 2.0 * double(glupGetPointSize())) { - nearest = index_t(-1); - } - } - return nearest; - } - - /** - * \brief The size of all the displayed points. - */ - GLint point_size = 20; - - - void set_border_as_polygon(index_t nb_sides) { - border.clear(); - for(index_t i=0; inb_cells(); ++c) { - const signed_index_t* cell = delaunay->cell_to_v() + 3*c; - for(index_t e=0; e<3; ++e) { - signed_index_t v1 = cell[e]; - signed_index_t v2 = cell[(e+1)%3]; - glupVertex2dv(delaunay->vertex_ptr(index_t(v1))); - glupVertex2dv(delaunay->vertex_ptr(index_t(v2))); - } - } - glupEnd(); - } - - /** - * \brief Gets the circumcenter of a triangle. - * \param[in] t the index of the triangle, in 0..delaunay->nb_cells()-1 - * \return the circumcenter of triangle \p t - */ - vec2 circumcenter(index_t t) { - signed_index_t v1 = delaunay->cell_to_v()[3*t]; - signed_index_t v2 = delaunay->cell_to_v()[3*t+1]; - signed_index_t v3 = delaunay->cell_to_v()[3*t+2]; - vec2 p1(delaunay->vertex_ptr(index_t(v1))); - vec2 p2(delaunay->vertex_ptr(index_t(v2))); - vec2 p3(delaunay->vertex_ptr(index_t(v3))); - return Geom::triangle_circumcenter(p1,p2,p3); - } - - /** - * \brief Gets an infinite vertex in the direction normal to an - * edge on the boundary of the convex hull. - * \param[in] t the index of the triangle, in 0..delaunay->nb_cells()-1 - * \param[in] e the local index of the edge, in {0,1,2} - * \return a point located far away along the direction normal to the - * edge \p e of triangle \p t - */ - vec2 infinite_vertex(index_t t, index_t e) { - index_t lv1 = (e+1)%3; - index_t lv2 = (e+2)%3; - index_t v1 = index_t(delaunay->cell_to_v()[3*t+lv1]); - index_t v2 = index_t(delaunay->cell_to_v()[3*t+lv2]); - vec2 p1(delaunay->vertex_ptr(v1)); - vec2 p2(delaunay->vertex_ptr(v2)); - vec2 n = normalize(p2-p1); - n = vec2(n.y, -n.x); - return 0.5*(p1+p2)+100000.0*n; - } - - /** - * \brief Displays the Voronoi edges. - */ - void display_Voronoi_edges() { - glupSetColor3f(GLUP_FRONT_AND_BACK_COLOR, 0.3f, 0.3f, 0.3f); - glupSetMeshWidth(2); - glupBegin(GLUP_LINES); - for(index_t t=0; tnb_cells(); ++t) { - vec2 cc = circumcenter(t); - for(index_t e=0; e<3; ++e) { - signed_index_t t2 = delaunay->cell_to_cell()[3*t+e]; - if(t2 == -1) { - glupVertex(cc); - glupVertex(infinite_vertex(t,e)); - } else if(t2 >signed_index_t(t)) { - glupVertex(cc); - glupVertex(circumcenter(index_t(t2))); - } - } - } - glupEnd(); - } - - /** - * \brief Finds the local index of a vertex in a triangle. - * \details Throws an assertion failure if the triangle \p t is - * not incident to vertex \p v - * \param[in] t the triangle, in 0..delaunay->nb_cells()-1 - * \param[in] v the vertex, in 0..delaunay->nb_vertices()-1 - * \return the local index of v in t, in {0,1,2} - */ - index_t find_vertex(index_t t, index_t v) { - for(index_t lv=0; lv<3; ++lv) { - if(index_t(delaunay->cell_to_v()[3*t+lv]) == v) { - return lv; - } - } - geo_assert_not_reached; - } - - /** - * \brief Gets a Voronoi cell of a vertex - * \details The vertex is specified by a triangle and a local index in - * the triangle - * \param[in] t0 the triangle - * \param[in] lv the local index of the vertex in triangle \p t0 - * \param[out] cell a reference to the Voronoi cell - */ - void get_Voronoi_cell(index_t t0, index_t lv, Polygon& cell) { - cell.resize(0); - index_t v = index_t(delaunay->cell_to_v()[3*t0+lv]); - bool on_border = false; - index_t t = t0; - - // First, we turn around the vertex v. To do that, we compute - // lv, the local index of v in the current triangle. Following - // the standard numerotation of a triangle, edge number lv is - // not incident to vertex v. The two other edges (lv+1)%3 and - // (lv+2)%3 of the triangle are indicent to vertex v. By always - // traversing (lv+1)%3, we turn around vertex v. - do { - index_t e = (lv+1)%3; - signed_index_t neigh_t = delaunay->cell_to_cell()[3*t+e]; - if(neigh_t == -1) { - on_border = true; - break; - } - cell.push_back(circumcenter(t)); - t = index_t(neigh_t); - lv = find_vertex(t,v); - } while(t != t0); - - - // If one traversed edge is on the border of the convex hull, then - // we empty the cell, and start turing around the vertex in the other - // direction, i.e. by traversing this time edge (lv+2)%3 until we - // reach the other edge on the border of the convex hull that is - // incident to v. - if(on_border) { - cell.resize(0); - cell.push_back(infinite_vertex(t,(lv + 1)%3)); - for(;;) { - cell.push_back(circumcenter(t)); - index_t e = (lv+2)%3; - signed_index_t neigh_t = delaunay->cell_to_cell()[3*t+e]; - if(neigh_t == -1) { - cell.push_back(infinite_vertex(t, e)); - break; - } - t = index_t(neigh_t); - lv = find_vertex(t,v); - } - } - - Polygon clipped; - convex_clip_polygon(cell, border, clipped); - cell.swap(clipped); - } - - - /** - * \brief Displays the Voronoi cells as filled polygons with - * random colors. - */ - void display_Voronoi_cells() { - std::vector v_visited(delaunay->nb_vertices()); - Polygon cell; - glupEnable(GLUP_VERTEX_COLORS); - glupBegin(GLUP_TRIANGLES); - for(index_t t=0; tnb_cells(); ++t) { - for(index_t lv=0; lv<3; ++lv) { - index_t v = index_t(delaunay->cell_to_v()[3*t+lv]); - if(!v_visited[v]) { - glup_viewer_random_color_from_index(int(v)); - v_visited[v] = true; - get_Voronoi_cell(t,lv,cell); - for(index_t i=1; i+1 3) { - points.erase(points.begin() + int(picked_point)); - } - } break; - } - update_Delaunay(); - return GL_TRUE; - - } else { - - if(event == GLUP_VIEWER_DOWN) { - picked_point = get_picked_point(p); - switch(button) { - case 0: { - if(picked_point == NO_POINT) { - points.push_back(p); - picked_point = points.size() - 1; - } - } break; - case 1: { - if(points.size() > 3) { - if(picked_point != NO_POINT) { - points.erase(points.begin() + int(picked_point)); - } - } - picked_point = NO_POINT; - } break; - } - update_Delaunay(); - return GL_TRUE; - } - if(event == GLUP_VIEWER_MOVE && picked_point != NO_POINT) { - points[picked_point] = p; - update_Delaunay(); - return GL_TRUE; - } - return GL_FALSE; - } - } - - - void Lloyd_relaxation() { - std::vector v_visited(delaunay->nb_vertices()); - vector new_sites(points.size()); - Polygon cell; - for(index_t t=0; tnb_cells(); ++t) { - for(index_t lv=0; lv<3; ++lv) { - index_t v = index_t(delaunay->cell_to_v()[3*t+lv]); - if(!v_visited[v]) { - v_visited[v] = true; - get_Voronoi_cell(t,lv,cell); - if(cell.size() > 0) { - new_sites[v] = centroid(cell); - } else { - new_sites[v] = points[v]; - } - } - } - } - for(index_t v=0; vset_quiet(false); - GEO::CmdLine::import_arg_group("standard"); - GEO::CmdLine::import_arg_group("algo"); - GEO::CmdLine::import_arg_group("gfx"); - - GEO::CmdLine::set_arg("sys:assert","abort"); + /*******************************************************************/ + +#define c1 0.35 +#define c2 0.5 +#define c3 1.0 + + double color_table[12][3] = { + {c3, c2, c2}, + {c2, c3, c2}, + {c2, c2, c3}, + {c2, c3, c3}, + {c3, c2, c3}, + {c3, c3, c2}, + + {c1, c2, c2}, + {c2, c1, c2}, + {c2, c2, c1}, + {c2, c1, c1}, + {c1, c2, c1}, + {c1, c1, c2} + }; + + int random_color_index_ = 0 ; + + + float white[4] = { + 0.8f, 0.8f, 0.3f, 1.0f + }; - std::vector filenames; - if(!GEO::CmdLine::parse(argc, argv, filenames, "")) { - return 1; + void glup_random_color() { + glupColor3d( + color_table[random_color_index_][0], + color_table[random_color_index_][1], + color_table[random_color_index_][2] + ); + random_color_index_ = (random_color_index_ + 1) % 12 ; } - - glup_viewer_set_region_of_interest( - 0.0f, 0.0f, 0.0f, - 1.0f, 1.0f, 1.0f - ); - - glup_viewer_set_window_title( - "Geogram Delaunay2d test" - ); - - glup_viewer_set_screen_size(1024,800); - glup_viewer_set_init_func(init); - glup_viewer_set_display_func(display); - glup_viewer_set_overlay_func(overlay); - glup_viewer_set_mouse_func(mouse); - glup_viewer_add_key_func( - 'k', Lloyd_relaxation, "One iteration of Lloyd relaxation" - ); - glup_viewer_add_toggle( - 'a', glup_viewer_is_enabled_ptr(GLUP_VIEWER_IDLE_REDRAW), "Animation" - ); - - if(GEO::CmdLine::get_arg_bool("gfx:full_screen")) { - glup_viewer_enable(GLUP_VIEWER_FULL_SCREEN); + void glup_randomize_colors(int index) { + random_color_index_ = (index % 12) ; } - glup_viewer_main_loop(argc, argv); + void glup_random_color_from_index(int index) { + if(index >= 0) { + glup_randomize_colors(index) ; + glup_random_color() ; + } else { + glupColor4fv(white) ; + } + } + + /*******************************************************************/ + + class Delaunay2dApplication : public SimpleApplication { + public: + Delaunay2dApplication() : SimpleApplication("Delaunay2d") { + console_visible_ = false; + viewer_properties_visible_ = false; + delaunay_ = Delaunay::create(2,"BDEL2d"); + border_shape_ = index_t(-1); + set_border_shape(0); + create_random_points(3); + point_size_ = 20; + edit_ = true; + show_Voronoi_cells_ = true; + show_Delaunay_triangles_ = true; + show_Voronoi_edges_ = true; + show_points_ = true; + show_border_ = true; + picked_point_ = index_t(-1); + last_button_ = index_t(-1); + add_key_toggle("F10", &edit_); + set_2d(); + start_animation(); + } + + protected: + /** + * \brief Updates the Delaunay triangulation with the current + * vector of points. + */ + void update_Delaunay() { + delaunay_->set_vertices(points_.size(), &points_.data()->x); + } + + /** + * \brief Creates random points. + * \details Points are created uniformly in the [0,1]x[0,1] + * square + * \param[in] nb the number of points to create. + */ + void create_random_points(index_t nb) { + for(index_t i=0; i 2.0 * double(glupGetPointSize())) { + nearest = index_t(-1); + } + } + return nearest; + } + + void set_border_as_polygon(index_t nb_sides) { + border_.clear(); + for(index_t i=0; inb_cells(); ++c) { + const signed_index_t* cell = delaunay_->cell_to_v() + 3*c; + for(index_t e=0; e<3; ++e) { + signed_index_t v1 = cell[e]; + signed_index_t v2 = cell[(e+1)%3]; + glupVertex2dv(delaunay_->vertex_ptr(index_t(v1))); + glupVertex2dv(delaunay_->vertex_ptr(index_t(v2))); + } + } + glupEnd(); + } + + + + /** + * \brief Gets the circumcenter of a triangle. + * \param[in] t the index of the triangle, in 0..delaunay->nb_cells()-1 + * \return the circumcenter of triangle \p t + */ + vec2 circumcenter(index_t t) { + signed_index_t v1 = delaunay_->cell_to_v()[3*t]; + signed_index_t v2 = delaunay_->cell_to_v()[3*t+1]; + signed_index_t v3 = delaunay_->cell_to_v()[3*t+2]; + vec2 p1(delaunay_->vertex_ptr(index_t(v1))); + vec2 p2(delaunay_->vertex_ptr(index_t(v2))); + vec2 p3(delaunay_->vertex_ptr(index_t(v3))); + return Geom::triangle_circumcenter(p1,p2,p3); + } + + /** + * \brief Gets an infinite vertex in the direction normal to an + * edge on the boundary of the convex hull. + * \param[in] t the index of the triangle, in 0..delaunay->nb_cells()-1 + * \param[in] e the local index of the edge, in {0,1,2} + * \return a point located far away along the direction normal to the + * edge \p e of triangle \p t + */ + vec2 infinite_vertex(index_t t, index_t e) { + index_t lv1 = (e+1)%3; + index_t lv2 = (e+2)%3; + index_t v1 = index_t(delaunay_->cell_to_v()[3*t+lv1]); + index_t v2 = index_t(delaunay_->cell_to_v()[3*t+lv2]); + vec2 p1(delaunay_->vertex_ptr(v1)); + vec2 p2(delaunay_->vertex_ptr(v2)); + vec2 n = normalize(p2-p1); + n = vec2(n.y, -n.x); + return 0.5*(p1+p2)+100000.0*n; + } + + /** + * \brief Draw the Voronoi edges. + */ + void draw_Voronoi_edges() { + glupSetColor3f(GLUP_FRONT_AND_BACK_COLOR, 0.3f, 0.3f, 0.3f); + glupSetMeshWidth(2); + glupBegin(GLUP_LINES); + for(index_t t=0; tnb_cells(); ++t) { + vec2 cc = circumcenter(t); + for(index_t e=0; e<3; ++e) { + signed_index_t t2 = delaunay_->cell_to_cell()[3*t+e]; + if(t2 == -1) { + glupVertex(cc); + glupVertex(infinite_vertex(t,e)); + } else if(t2 >signed_index_t(t)) { + glupVertex(cc); + glupVertex(circumcenter(index_t(t2))); + } + } + } + glupEnd(); + } + + /** + * \brief Finds the local index of a vertex in a triangle. + * \details Throws an assertion failure if the triangle \p t is + * not incident to vertex \p v + * \param[in] t the triangle, in 0..delaunay->nb_cells()-1 + * \param[in] v the vertex, in 0..delaunay->nb_vertices()-1 + * \return the local index of v in t, in {0,1,2} + */ + index_t find_vertex(index_t t, index_t v) { + for(index_t lv=0; lv<3; ++lv) { + if(index_t(delaunay_->cell_to_v()[3*t+lv]) == v) { + return lv; + } + } + geo_assert_not_reached; + } + + + /** + * \brief Gets a Voronoi cell of a vertex + * \details The vertex is specified by a triangle and a local index in + * the triangle + * \param[in] t0 the triangle + * \param[in] lv the local index of the vertex in triangle \p t0 + * \param[out] cell a reference to the Voronoi cell + */ + void get_Voronoi_cell(index_t t0, index_t lv, Polygon& cell) { + cell.resize(0); + index_t v = index_t(delaunay_->cell_to_v()[3*t0+lv]); + bool on_border = false; + index_t t = t0; + + // First, we turn around the vertex v. To do that, we compute + // lv, the local index of v in the current triangle. Following + // the standard numerotation of a triangle, edge number lv is + // not incident to vertex v. The two other edges (lv+1)%3 and + // (lv+2)%3 of the triangle are indicent to vertex v. By always + // traversing (lv+1)%3, we turn around vertex v. + do { + index_t e = (lv+1)%3; + signed_index_t neigh_t = delaunay_->cell_to_cell()[3*t+e]; + if(neigh_t == -1) { + on_border = true; + break; + } + cell.push_back(circumcenter(t)); + t = index_t(neigh_t); + lv = find_vertex(t,v); + } while(t != t0); + + + // If one traversed edge is on the border of the convex hull, then + // we empty the cell, and start turing around the vertex in + // the other direction, i.e. by traversing this time + // edge (lv+2)%3 until we reach the other edge on the border of + // the convex hull that is incident to v. + if(on_border) { + cell.resize(0); + cell.push_back(infinite_vertex(t,(lv + 1)%3)); + for(;;) { + cell.push_back(circumcenter(t)); + index_t e = (lv+2)%3; + signed_index_t neigh_t = delaunay_->cell_to_cell()[3*t+e]; + if(neigh_t == -1) { + cell.push_back(infinite_vertex(t, e)); + break; + } + t = index_t(neigh_t); + lv = find_vertex(t,v); + } + } + + Polygon clipped; + convex_clip_polygon(cell, border_, clipped); + cell.swap(clipped); + } + + /** + * \brief Draws the Voronoi cells as filled polygons with + * random colors. + */ + void draw_Voronoi_cells() { + v_visited_.assign(points_.size(), false); + Polygon cell; + glupEnable(GLUP_VERTEX_COLORS); + glupBegin(GLUP_TRIANGLES); + for(index_t t=0; tnb_cells(); ++t) { + for(index_t lv=0; lv<3; ++lv) { + index_t v = index_t(delaunay_->cell_to_v()[3*t+lv]); + if(!v_visited_[v]) { + glup_random_color_from_index(int(v)); + v_visited_[v] = true; + get_Voronoi_cell(t,lv,cell); + for(index_t i=1; i+1nb_vertices(),false); + new_points_.resize(points_.size()); + Polygon cell; + for(index_t t=0; tnb_cells(); ++t) { + for(index_t lv=0; lv<3; ++lv) { + index_t v = index_t(delaunay_->cell_to_v()[3*t+lv]); + if(!v_visited_[v]) { + v_visited_[v] = true; + get_Voronoi_cell(t,lv,cell); + if(cell.size() > 0) { + new_points_[v] = centroid(cell); + } else { + new_points_[v] = points_[v]; + } + } + } + } + std::swap(points_, new_points_); + update_Delaunay(); + } + + void draw_object_properties() override { + SimpleApplication::draw_object_properties(); + if(ImGui::Button( + (icon_UTF8("home") + " Home [H]").c_str(), ImVec2(-1.0, 0.0)) + ) { + home(); + } + ImGui::Checkbox("Edit [F10]", &edit_); + + ImGui::Separator(); + if(ImGui::Button("Relax.")) { + Lloyd_relaxation(); + } + ImGui::SameLine(); + ImGui::Checkbox("animate",animate_ptr()); + if(ImGui::Button("reset points", ImVec2(-1.0f,0.0f))) { + points_.clear(); + create_random_points(3); + update_Delaunay(); + } + ImGui::Text("Bndry"); + ImGui::SameLine(); + int new_border_shape = int(border_shape_); + ImGui::Combo( + "", &new_border_shape, + "square\0triangle\0pentagon\0circle\0\0" + ); + set_border_shape(index_t(new_border_shape)); + + ImGui::Separator(); + ImGui::Checkbox("cells", &show_Voronoi_cells_); + ImGui::SameLine(); + ImGui::Checkbox("edges", &show_Voronoi_edges_); + + ImGui::Checkbox("trgls", &show_Delaunay_triangles_); + ImGui::SameLine(); + ImGui::Checkbox("points", &show_points_); + } + + void mouse_button_callback( + int button, int action, int mods, int source + ) override { + geo_argused(source); + if(!edit_) { + SimpleApplication::mouse_button_callback( + button, action, mods, source + ); + return; + } + + if(action != EVENT_ACTION_DOWN) { + last_button_ = index_t(-1); + return; + } + + last_button_ = index_t(button); + + if(animate()) { + switch(button) { + case 0: { + points_.push_back(mouse_point_); + picked_point_ = points_.size() - 1; + } break; + case 1: { + picked_point_ = get_picked_point(mouse_point_,true); + if(points_.size() > 3) { + points_.erase(points_.begin() + int(picked_point_)); + } + } break; + } + } else { + picked_point_ = get_picked_point(mouse_point_); + switch(button) { + case 0: { + if(picked_point_ == index_t(-1)) { + points_.push_back(mouse_point_); + picked_point_ = points_.size() - 1; + } + } break; + case 1: { + if(points_.size() > 3) { + if(picked_point_ != index_t(-1)) { + points_.erase( + points_.begin() + int(picked_point_) + ); + } + } + picked_point_ = index_t(-1); + } break; + } + } + update_Delaunay(); + } + + void cursor_pos_callback(double x, double y, int source) override { + geo_argused(source); + if(!edit_) { + SimpleApplication::cursor_pos_callback(x,y,source); + return; + } + mouse_point_ = unproject_2d(vec2(x,double(get_height()-y))); + if(animate()) { + if(last_button_ == 0) { + points_.push_back(mouse_point_); + picked_point_ = points_.size() - 1; + update_Delaunay(); + } else if(last_button_ == 1) { + picked_point_ = get_picked_point(mouse_point_,true); + if(points_.size() > 3) { + points_.erase(points_.begin() + int(picked_point_)); + } + update_Delaunay(); + } + } else { + if(picked_point_ != index_t(-1) && (last_button_ == 0)) { + points_[picked_point_] = mouse_point_; + update_Delaunay(); + } + } + } + + void geogram_initialize(int argc, char** argv) override { + SimpleApplication::geogram_initialize(argc, argv); + set_gui_state(gui_state); + } + + private: + vector points_; + vector new_points_; + vector v_visited_; + Delaunay_var delaunay_; + Polygon border_; + index_t border_shape_; + GLint point_size_; /**< The size of all displayed points. */ + + bool edit_; + bool show_Voronoi_cells_; + bool show_Delaunay_triangles_; + bool show_Voronoi_edges_; + bool show_points_; + bool show_border_; + + index_t picked_point_; + index_t last_button_; + vec2 mouse_point_; + }; + +} +int main(int argc, char** argv) { + Delaunay2dApplication app; + app.start(argc, argv); return 0; } diff --git a/src/examples/graphics/demo_Delaunay2d/main.cpp.old b/src/examples/graphics/demo_Delaunay2d/main.cpp.old new file mode 100644 index 00000000..19bbe2c0 --- /dev/null +++ b/src/examples/graphics/demo_Delaunay2d/main.cpp.old @@ -0,0 +1,798 @@ +/* + * Copyright (c) 2012-2014, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + + using namespace GEO; + + vector points; + Delaunay_var delaunay; + typedef vector Polygon; + Polygon border; + + void Lloyd_relaxation(); + + void convex_clip_polygon( + const Polygon& P, const Polygon& clip, Polygon& result + ); + + vec2 centroid(const Polygon& P); + + /** + * \brief Updates the Delaunay triangulation with the current + * vector of points. + */ + void update_Delaunay() { + delaunay->set_vertices(points.size(), &points.data()->x); + } + + /** + * \brief Creates random points. + * \details Points are created uniformly in the [0,1]x[0,1] + * square + * \param[in] nb the number of points to create. + */ + void create_random_points(index_t nb) { + for(index_t i=0; i 2.0 * double(glupGetPointSize())) { + nearest = index_t(-1); + } + } + return nearest; + } + + /** + * \brief The size of all the displayed points. + */ + GLint point_size = 20; + + + void set_border_as_polygon(index_t nb_sides) { + border.clear(); + for(index_t i=0; inb_cells(); ++c) { + const signed_index_t* cell = delaunay->cell_to_v() + 3*c; + for(index_t e=0; e<3; ++e) { + signed_index_t v1 = cell[e]; + signed_index_t v2 = cell[(e+1)%3]; + glupVertex2dv(delaunay->vertex_ptr(index_t(v1))); + glupVertex2dv(delaunay->vertex_ptr(index_t(v2))); + } + } + glupEnd(); + } + + /** + * \brief Gets the circumcenter of a triangle. + * \param[in] t the index of the triangle, in 0..delaunay->nb_cells()-1 + * \return the circumcenter of triangle \p t + */ + vec2 circumcenter(index_t t) { + signed_index_t v1 = delaunay->cell_to_v()[3*t]; + signed_index_t v2 = delaunay->cell_to_v()[3*t+1]; + signed_index_t v3 = delaunay->cell_to_v()[3*t+2]; + vec2 p1(delaunay->vertex_ptr(index_t(v1))); + vec2 p2(delaunay->vertex_ptr(index_t(v2))); + vec2 p3(delaunay->vertex_ptr(index_t(v3))); + return Geom::triangle_circumcenter(p1,p2,p3); + } + + /** + * \brief Gets an infinite vertex in the direction normal to an + * edge on the boundary of the convex hull. + * \param[in] t the index of the triangle, in 0..delaunay->nb_cells()-1 + * \param[in] e the local index of the edge, in {0,1,2} + * \return a point located far away along the direction normal to the + * edge \p e of triangle \p t + */ + vec2 infinite_vertex(index_t t, index_t e) { + index_t lv1 = (e+1)%3; + index_t lv2 = (e+2)%3; + index_t v1 = index_t(delaunay->cell_to_v()[3*t+lv1]); + index_t v2 = index_t(delaunay->cell_to_v()[3*t+lv2]); + vec2 p1(delaunay->vertex_ptr(v1)); + vec2 p2(delaunay->vertex_ptr(v2)); + vec2 n = normalize(p2-p1); + n = vec2(n.y, -n.x); + return 0.5*(p1+p2)+100000.0*n; + } + + /** + * \brief Displays the Voronoi edges. + */ + void display_Voronoi_edges() { + glupSetColor3f(GLUP_FRONT_AND_BACK_COLOR, 0.3f, 0.3f, 0.3f); + glupSetMeshWidth(2); + glupBegin(GLUP_LINES); + for(index_t t=0; tnb_cells(); ++t) { + vec2 cc = circumcenter(t); + for(index_t e=0; e<3; ++e) { + signed_index_t t2 = delaunay->cell_to_cell()[3*t+e]; + if(t2 == -1) { + glupVertex(cc); + glupVertex(infinite_vertex(t,e)); + } else if(t2 >signed_index_t(t)) { + glupVertex(cc); + glupVertex(circumcenter(index_t(t2))); + } + } + } + glupEnd(); + } + + /** + * \brief Finds the local index of a vertex in a triangle. + * \details Throws an assertion failure if the triangle \p t is + * not incident to vertex \p v + * \param[in] t the triangle, in 0..delaunay->nb_cells()-1 + * \param[in] v the vertex, in 0..delaunay->nb_vertices()-1 + * \return the local index of v in t, in {0,1,2} + */ + index_t find_vertex(index_t t, index_t v) { + for(index_t lv=0; lv<3; ++lv) { + if(index_t(delaunay->cell_to_v()[3*t+lv]) == v) { + return lv; + } + } + geo_assert_not_reached; + } + + /** + * \brief Gets a Voronoi cell of a vertex + * \details The vertex is specified by a triangle and a local index in + * the triangle + * \param[in] t0 the triangle + * \param[in] lv the local index of the vertex in triangle \p t0 + * \param[out] cell a reference to the Voronoi cell + */ + void get_Voronoi_cell(index_t t0, index_t lv, Polygon& cell) { + cell.resize(0); + index_t v = index_t(delaunay->cell_to_v()[3*t0+lv]); + bool on_border = false; + index_t t = t0; + + // First, we turn around the vertex v. To do that, we compute + // lv, the local index of v in the current triangle. Following + // the standard numerotation of a triangle, edge number lv is + // not incident to vertex v. The two other edges (lv+1)%3 and + // (lv+2)%3 of the triangle are indicent to vertex v. By always + // traversing (lv+1)%3, we turn around vertex v. + do { + index_t e = (lv+1)%3; + signed_index_t neigh_t = delaunay->cell_to_cell()[3*t+e]; + if(neigh_t == -1) { + on_border = true; + break; + } + cell.push_back(circumcenter(t)); + t = index_t(neigh_t); + lv = find_vertex(t,v); + } while(t != t0); + + + // If one traversed edge is on the border of the convex hull, then + // we empty the cell, and start turing around the vertex in the other + // direction, i.e. by traversing this time edge (lv+2)%3 until we + // reach the other edge on the border of the convex hull that is + // incident to v. + if(on_border) { + cell.resize(0); + cell.push_back(infinite_vertex(t,(lv + 1)%3)); + for(;;) { + cell.push_back(circumcenter(t)); + index_t e = (lv+2)%3; + signed_index_t neigh_t = delaunay->cell_to_cell()[3*t+e]; + if(neigh_t == -1) { + cell.push_back(infinite_vertex(t, e)); + break; + } + t = index_t(neigh_t); + lv = find_vertex(t,v); + } + } + + Polygon clipped; + convex_clip_polygon(cell, border, clipped); + cell.swap(clipped); + } + + + /** + * \brief Displays the Voronoi cells as filled polygons with + * random colors. + */ + void display_Voronoi_cells() { + std::vector v_visited(delaunay->nb_vertices()); + Polygon cell; + glupEnable(GLUP_VERTEX_COLORS); + glupBegin(GLUP_TRIANGLES); + for(index_t t=0; tnb_cells(); ++t) { + for(index_t lv=0; lv<3; ++lv) { + index_t v = index_t(delaunay->cell_to_v()[3*t+lv]); + if(!v_visited[v]) { + glup_viewer_random_color_from_index(int(v)); + v_visited[v] = true; + get_Voronoi_cell(t,lv,cell); + for(index_t i=1; i+1 3) { + points.erase(points.begin() + int(picked_point)); + } + } break; + } + update_Delaunay(); + return GL_TRUE; + + } else { + + if(event == GLUP_VIEWER_DOWN) { + picked_point = get_picked_point(p); + switch(button) { + case 0: { + if(picked_point == NO_POINT) { + points.push_back(p); + picked_point = points.size() - 1; + } + } break; + case 1: { + if(points.size() > 3) { + if(picked_point != NO_POINT) { + points.erase(points.begin() + int(picked_point)); + } + } + picked_point = NO_POINT; + } break; + } + update_Delaunay(); + return GL_TRUE; + } + if(event == GLUP_VIEWER_MOVE && picked_point != NO_POINT) { + points[picked_point] = p; + update_Delaunay(); + return GL_TRUE; + } + return GL_FALSE; + } + } + + + void Lloyd_relaxation() { + std::vector v_visited(delaunay->nb_vertices()); + vector new_sites(points.size()); + Polygon cell; + for(index_t t=0; tnb_cells(); ++t) { + for(index_t lv=0; lv<3; ++lv) { + index_t v = index_t(delaunay->cell_to_v()[3*t+lv]); + if(!v_visited[v]) { + v_visited[v] = true; + get_Voronoi_cell(t,lv,cell); + if(cell.size() > 0) { + new_sites[v] = centroid(cell); + } else { + new_sites[v] = points[v]; + } + } + } + } + for(index_t v=0; v 0) ; + + double A = signed_area(P) ; + + if(::fabs(A) < 1e-30) { + return P[0] ; + } + + double x = 0.0 ; + double y = 0.0 ; + for(unsigned int i=0; iset_quiet(false); + + GEO::CmdLine::import_arg_group("standard"); + GEO::CmdLine::import_arg_group("algo"); + GEO::CmdLine::import_arg_group("gfx"); + + GEO::CmdLine::set_arg("sys:assert","abort"); + + std::vector filenames; + if(!GEO::CmdLine::parse(argc, argv, filenames, "")) { + return 1; + } + + glup_viewer_set_region_of_interest( + 0.0f, 0.0f, 0.0f, + 1.0f, 1.0f, 1.0f + ); + + glup_viewer_set_window_title( + "Geogram Delaunay2d test" + ); + + glup_viewer_set_screen_size(1024,800); + + glup_viewer_set_init_func(init); + glup_viewer_set_display_func(display); + glup_viewer_set_overlay_func(overlay); + glup_viewer_set_mouse_func(mouse); + glup_viewer_add_key_func( + 'k', Lloyd_relaxation, "One iteration of Lloyd relaxation" + ); + glup_viewer_add_toggle( + 'a', glup_viewer_is_enabled_ptr(GLUP_VIEWER_IDLE_REDRAW), "Animation" + ); + + if(GEO::CmdLine::get_arg_bool("gfx:full_screen")) { + glup_viewer_enable(GLUP_VIEWER_FULL_SCREEN); + } + + glup_viewer_main_loop(argc, argv); + + return 0; +} diff --git a/src/examples/graphics/demo_Delaunay3d/CMakeLists.txt b/src/examples/graphics/demo_Delaunay3d/CMakeLists.txt index 548db860..b4271e74 100755 --- a/src/examples/graphics/demo_Delaunay3d/CMakeLists.txt +++ b/src/examples/graphics/demo_Delaunay3d/CMakeLists.txt @@ -1,10 +1,9 @@ include(${PROJECT_SOURCE_DIR}/cmake/opengl.cmake) +set(APP_NAME geogram_demo_Delaunay3d) aux_source_directories(SOURCES "" .) -add_executable(geogram_demo_Delaunay3d ${SOURCES}) -target_link_libraries( - geogram_demo_Delaunay3d geogram_gfx geogram ${GLFW_LIBRARIES} -) -install_runtime_targets(geogram_demo_Delaunay3d) +add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram_gfx geogram ${GLFW_LIBRARIES}) +install_runtime_targets(${APP_NAME}) -set_target_properties(geogram_demo_Delaunay3d PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/examples/graphics/demo_Delaunay3d/main.cpp b/src/examples/graphics/demo_Delaunay3d/main.cpp index 2fad732e..e28469b2 100644 --- a/src/examples/graphics/demo_Delaunay3d/main.cpp +++ b/src/examples/graphics/demo_Delaunay3d/main.cpp @@ -43,7 +43,7 @@ * */ -#include +#include #include namespace { @@ -55,34 +55,21 @@ namespace { * GLUP primitives and glup_viewer application * framework. */ - class DemoDelaunay3dApplication : public Application { + class DemoDelaunay3dApplication : public SimpleApplication { public: /** * \brief DemoDelaunay3dApplication constructor. */ - DemoDelaunay3dApplication( - int argc, char** argv, - const std::string& usage - ) : Application(argc, argv, usage) { + DemoDelaunay3dApplication() : SimpleApplication("Delaunay3d") { periodic_ = false; - delaunay_ = new PeriodicDelaunay3d(periodic_, 1.0); - // In non-periodic mode, we need to keep the infinite - // tetrahedra to be able to query the combinatorics of - // all cells (including the infinite ones). - if(!periodic_) { - delaunay_->set_keeps_infinite(true); - } // Define the 3d region that we want to display // (xmin, ymin, zmin, xmax, ymax, zmax) - glup_viewer_set_region_of_interest( - 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f - ); + set_region_of_interest(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); - animate_ = true; - draw_points_ = true; + draw_points_ = false; draw_cells_ = true; point_size_ = 10.0f; cells_shrink_ = 0.1f; @@ -90,37 +77,53 @@ namespace { draw_box_ = false; draw_period_ = false; - init_random_points(nb_points_); + start_animation(); } + void geogram_initialize(int argc, char** argv) override { + SimpleApplication::geogram_initialize(argc, argv); + delaunay_ = new PeriodicDelaunay3d(periodic_, 1.0); + // In non-periodic mode, we need to keep the infinite + // tetrahedra to be able to query the combinatorics of + // all cells (including the infinite ones). + if(!periodic_) { + delaunay_->set_keeps_infinite(true); + } + init_random_points(nb_points_); + } + /** * \brief DemoDelaunay3dApplication destructor. */ - virtual ~DemoDelaunay3dApplication() { + ~DemoDelaunay3dApplication() override { } /** * \brief Displays and handles the GUI for object properties. * \details Overloads Application::draw_object_properties(). */ - virtual void draw_object_properties() { - ImGui::Checkbox("Animate", &animate_); + void draw_object_properties() override { + SimpleApplication::draw_object_properties(); + ImGui::Checkbox("Animate", animate_ptr()); if(ImGui::Button("One iteration", ImVec2(-1.0, 0.0))) { Lloyd_iteration(); } if( - ImGui::Button("+", ImVec2(0.4f*ImGui::GetWindowWidth(), 0.0f)) && - nb_points_ < 10000 + ImGui::Button( + "+", + ImVec2(-ImGui::GetContentRegionAvailWidth()/2.0f,0.0f) + ) && nb_points_ < 10000 ) { ++nb_points_; init_random_points(nb_points_); } ImGui::SameLine(); if( - ImGui::Button("-", ImVec2(0.4f*ImGui::GetWindowWidth(), 0.0f)) && - nb_points_ > 4 + ImGui::Button( + "-", ImVec2(-1.0f, 0.0f) + ) && nb_points_ > 4 ) { --nb_points_; init_random_points(nb_points_); @@ -152,10 +155,12 @@ namespace { ImGui::Checkbox("Box", &draw_box_); ImGui::Checkbox("Period 3x3x3", &draw_period_); - ImGui::Checkbox("Points", &draw_points_); - ImGui::SliderFloat("PtSz.", &point_size_, 1.0f, 50.0f, "%.1f"); + ImGui::Checkbox("Points", &draw_points_); + ImGui::SameLine(); + ImGui::SliderFloat("##PtSz.", &point_size_, 1.0f, 50.0f, "%.1f"); ImGui::Checkbox("Cells", &draw_cells_); - ImGui::SliderFloat("Shrk.", &cells_shrink_, 0.0f, 1.0f, "%.2f"); + ImGui::SameLine(); + ImGui::SliderFloat("##Shrk.", &cells_shrink_, 0.0f, 1.0f, "%.2f"); } /** @@ -249,7 +254,7 @@ namespace { * \brief Draws the scene according to currently set primitive and * drawing modes. */ - virtual void draw_scene() { + void draw_scene() override { // Avoid re-entry, for instance when a message is sent to // the logger, this triggers a graphic redisplay. static bool locked = false; @@ -257,7 +262,7 @@ namespace { return; } locked = true; - if(animate_) { + if(animate()) { Lloyd_iteration(); } glupSetColor3f(GLUP_FRONT_AND_BACK_COLOR, 0.5f, 0.5f, 0.5f); @@ -440,7 +445,6 @@ namespace { private: SmartPointer delaunay_; - bool animate_; bool periodic_; bool draw_points_; float point_size_; @@ -456,7 +460,7 @@ namespace { } int main(int argc, char** argv) { - DemoDelaunay3dApplication app(argc, argv, ""); - app.start(); + DemoDelaunay3dApplication app; + app.start(argc, argv); return 0; } diff --git a/src/examples/graphics/demo_Evert/CMakeLists.txt b/src/examples/graphics/demo_Evert/CMakeLists.txt index b62cb058..c65aa100 100644 --- a/src/examples/graphics/demo_Evert/CMakeLists.txt +++ b/src/examples/graphics/demo_Evert/CMakeLists.txt @@ -1,8 +1,9 @@ include(${PROJECT_SOURCE_DIR}/cmake/opengl.cmake) +set(APP_NAME geogram_demo_Evert) aux_source_directories(SOURCES "" .) -add_executable(geogram_demo_Evert ${SOURCES}) -target_link_libraries(geogram_demo_Evert geogram_gfx geogram ${GLFW_LIBRARIES}) -install_runtime_targets(geogram_demo_Evert) +add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram_gfx geogram ${GLFW_LIBRARIES}) +install_runtime_targets(${APP_NAME}) -set_target_properties(geogram_demo_Evert PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/examples/graphics/demo_Evert/main.cpp b/src/examples/graphics/demo_Evert/main.cpp old mode 100755 new mode 100644 index a7376766..477a6cfe --- a/src/examples/graphics/demo_Evert/main.cpp +++ b/src/examples/graphics/demo_Evert/main.cpp @@ -43,7 +43,7 @@ * */ -#include +#include #include #include "generateGeometry.h" #include "uv.xpm" @@ -407,23 +407,18 @@ namespace { * \brief Porting Michael Mc Guffin's implementation * of sphere eversion to GLUP. */ - class DemoEvertApplication : public Application { + class DemoEvertApplication : public SimpleApplication { public: /** * \brief DemoGlupApplication constructor. */ - DemoEvertApplication( - int argc, char** argv, - const std::string& usage - ) : Application(argc, argv, usage) { + DemoEvertApplication() : SimpleApplication("Evert") { // Define the 3d region that we want to display // (xmin, ymin, zmin, xmax, ymax, zmax) - glup_viewer_set_region_of_interest( - -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f - ); + set_region_of_interest(-1.0, -1.0, -1.0, 1.0, 1.0, 1.0); style_ = EvertableSphere::STYLE_POLYGONS; transparent_ = false; @@ -446,9 +441,9 @@ namespace { } /** - * \brief DemoEvertApplication destructor. + * \copydoc SimpleApplication::GL_terminate() */ - virtual ~DemoEvertApplication() { + void GL_terminate() override { if(texture_ != 0) { glDeleteTextures(1,&texture_); } @@ -458,16 +453,11 @@ namespace { * \brief Displays and handles the GUI for object properties. * \details Overloads Application::draw_object_properties(). */ - virtual void draw_object_properties() { - ImGui::Checkbox( - "Animate [a]", - (bool*)glup_viewer_is_enabled_ptr(GLUP_VIEWER_IDLE_REDRAW) - ); - + void draw_object_properties() override { + SimpleApplication::draw_object_properties(); + ImGui::SliderFloat("spd.", &anim_speed_, 0.02f, 2.0f, "%.2f"); - if(ImGui::IsItemHovered()) { - ImGui::SetTooltip("animation speed"); - } + ImGui::Tooltip("animation speed"); ImGui::SliderFloat("time", &time_, 0.0f, 1.0f, "%.2f"); @@ -476,53 +466,36 @@ namespace { ); if(style_ == EvertableSphere::STYLE_POINTS) { ImGui::SliderFloat("ptsz", &point_size_, 1.0f, 20.0f, "%.1f"); - if(ImGui::IsItemHovered()) { - ImGui::SetTooltip("point size"); - } + ImGui::Tooltip("point size"); } else { ImGui::Checkbox("mesh", &mesh_); ImGui::SliderFloat("shrk", &shrink_, 0.0f, 1.0f, "%.2f"); - if(ImGui::IsItemHovered()) { - ImGui::SetTooltip("polygons shrink"); - } + ImGui::Tooltip("polygons shrink"); } ImGui::Checkbox("half sphere", &half_sphere_); - if(ImGui::IsItemHovered()) { - ImGui::SetTooltip("hide one half of the sphere"); - } + ImGui::Tooltip("hide one half of the sphere"); ImGui::Checkbox("half strips", &half_strips_); - if(ImGui::IsItemHovered()) { - ImGui::SetTooltip("hide one half of each corrugation"); - } + ImGui::Tooltip("hide one half of each corrugation"); ImGui::SliderFloat( "prop", &proportion_strips_to_display_, 0.0f, 1.0f, "%.2f" ); - if(ImGui::IsItemHovered()) { - ImGui::SetTooltip( - "cheese-proportion of the corrugations to draw" - ); - } + ImGui::Tooltip("cheese-proportion of the corrugations to draw"); ImGui::SliderInt("strp", &nb_strips_, 1, 50); - if(ImGui::IsItemHovered()) { - ImGui::SetTooltip( + ImGui::Tooltip( "number of corrugations \n" "(if <8, smoothness is not guaranteed)" - ); - } + ); ImGui::SliderInt("lon.", &res_longitude_, 12, 200); - if(ImGui::IsItemHovered()) { - ImGui::SetTooltip("number of longitudinal subdivisions"); - } + ImGui::Tooltip("number of longitudinal subdivisions"); + ImGui::SliderInt("lat.", &res_latitude_, 12, 200); - if(ImGui::IsItemHovered()) { - ImGui::SetTooltip("number of latitudinal subdivisions"); - } + ImGui::Tooltip("number of latitudinal subdivisions"); if(ImGui::Checkbox("textured", &textured_)) { sphere_.set_textured(textured_); @@ -535,13 +508,11 @@ namespace { } */ ImGui::Checkbox("cylinder", &bend_cylinder_); - if(ImGui::IsItemHovered()) { - ImGui::SetTooltip( - "display sphere<->cylinder morph\n" - "instead of sphere eversion\n" - "(not as cool, but cool enough)\n" - ); - } + ImGui::Tooltip( + "display sphere<->cylinder morph\n" + "instead of sphere eversion\n" + "(not as cool, but cool enough)\n" + ); ImGui::Checkbox("smooth", &smooth_); } @@ -551,8 +522,8 @@ namespace { * is called as soon as the OpenGL context is ready for rendering. It * is meant to initialize the graphic objects used by the application. */ - virtual void init_graphics() { - Application::init_graphics(); + void GL_initialize() override { + SimpleApplication::GL_initialize(); // Create the texture and initialize its texturing modes glGenTextures(1, &texture_); @@ -560,23 +531,22 @@ namespace { glBindTexture(GL_TEXTURE_2D, texture_); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexImage2DXPM(uv); - - glup_viewer_enable(GLUP_VIEWER_IDLE_REDRAW); + glTexImage2Dxpm(uv); + start_animation(); } /** * \brief Draws the everting sphere. */ - virtual void draw_scene() { - - if(glup_viewer_is_enabled(GLUP_VIEWER_IDLE_REDRAW)) { + void draw_scene() override { + + if(animate()) { time_ = float( sin(double(anim_speed_) * GEO::SystemStopwatch::now()) ); time_ = 0.5f * (time_ + 1.0f); } - + if(transparent_) { glEnable(GL_BLEND); sphere_.set_alpha(alpha_); @@ -622,7 +592,7 @@ namespace { sphere_.draw(); } - virtual void draw_about() { + void draw_about() override { ImGui::Separator(); if(ImGui::BeginMenu("About...")) { ImGui::Text( @@ -640,9 +610,10 @@ namespace { ); ImGui::Separator(); ImGui::Text("\n"); + float sz = float(280.0 * std::min(scaling(), 2.0)); ImGui::Image( convert_to_ImTextureID(geogram_logo_texture_), - ImVec2(256.0f * scaling(), 256.0f * scaling()) + ImVec2(sz, sz) ); ImGui::Text("\n"); ImGui::Text( @@ -682,7 +653,7 @@ namespace { } int main(int argc, char** argv) { - DemoEvertApplication app(argc, argv, ""); - app.start(); + DemoEvertApplication app; + app.start(argc, argv); return 0; } diff --git a/src/examples/graphics/demo_GLUP/CMakeLists.txt b/src/examples/graphics/demo_GLUP/CMakeLists.txt index 5e54f0db..f41a0c50 100755 --- a/src/examples/graphics/demo_GLUP/CMakeLists.txt +++ b/src/examples/graphics/demo_GLUP/CMakeLists.txt @@ -1,8 +1,9 @@ include(${PROJECT_SOURCE_DIR}/cmake/opengl.cmake) +set(APP_NAME geogram_demo_GLUP) aux_source_directories(SOURCES "" .) -add_executable(geogram_demo_GLUP ${SOURCES}) -target_link_libraries(geogram_demo_GLUP geogram_gfx geogram ${GLFW_LIBRARIES}) -install_runtime_targets(geogram_demo_GLUP) +add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram_gfx geogram ${GLFW_LIBRARIES}) +install_runtime_targets(${APP_NAME}) -set_target_properties(geogram_demo_GLUP PROPERTIES FOLDER "GEOGRAM") +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/examples/graphics/demo_GLUP/main.cpp b/src/examples/graphics/demo_GLUP/main.cpp index 8703e2f5..f6a3bd87 100644 --- a/src/examples/graphics/demo_GLUP/main.cpp +++ b/src/examples/graphics/demo_GLUP/main.cpp @@ -43,7 +43,7 @@ * */ -#include +#include #include "uv.xpm" namespace { @@ -55,16 +55,13 @@ namespace { * GLUP primitives and glup_viewer application * framework. */ - class DemoGlupApplication : public Application { + class DemoGlupApplication : public SimpleApplication { public: /** * \brief DemoGlupApplication constructor. */ - DemoGlupApplication( - int argc, char** argv, - const std::string& usage - ) : Application(argc, argv, usage) { + DemoGlupApplication(): SimpleApplication("Demo GLUP") { mesh_ = true; colors_ = true; texturing_ = false; @@ -74,21 +71,18 @@ namespace { shrink_ = 0.0f; // Key shortcuts. - glup_viewer_add_toggle('c', &colors_, "colors"); - glup_viewer_add_toggle('m', &mesh_, "mesh"); - glup_viewer_add_toggle('t', &texturing_, "texturing"); - glup_viewer_add_toggle('o', &picking_, "picking"); - glup_viewer_add_key_func( - ' ', &DemoGlupApplication::cycle_primitives_callback, - "cycle primitives" + add_key_toggle("c", &colors_); + add_key_toggle("m", &mesh_); + add_key_toggle("t", &texturing_); + add_key_toggle("o", &picking_); + add_key_func( + " ", [this](void) { cycle_primitives(); } ); // Define the 3d region that we want to display // (xmin, ymin, zmin, xmax, ymax, zmax) - glup_viewer_set_region_of_interest( - 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f - ); - + set_region_of_interest(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + texture_ = 0; primitive_ = GLUP_POINTS; @@ -96,9 +90,9 @@ namespace { } /** - * \brief DemoGlupApplication destructor. + * \copydoc SimpleApplication::GL_terminate() */ - virtual ~DemoGlupApplication() { + void GL_terminate() override { if(texture_ != 0) { glDeleteTextures(1,&texture_); } @@ -108,7 +102,8 @@ namespace { * \brief Displays and handles the GUI for object properties. * \details Overloads Application::draw_object_properties(). */ - virtual void draw_object_properties() { + void draw_object_properties() override { + SimpleApplication::draw_object_properties(); ImGui::Combo("prim.", &primitive_, "points\0lines\0triangles\0quads\0tets\0hexes\0prisms\0pyramids\0\0" ); @@ -163,26 +158,15 @@ namespace { return 0; } - /** - * \brief Gets the instance. - * \return a pointer to the current DemoGlupApplication. - */ - static DemoGlupApplication* instance() { - DemoGlupApplication* result = - dynamic_cast(Application::instance()); - geo_assert(result != nullptr); - return result; - } - /** * \brief Cycles the drawn primitives. * \details Triggered when the user pushes the space bar, routes to * DemoGlupApplication::cycles_primitives(). */ - static void cycle_primitives_callback() { - ++(instance()->primitive_); - if(instance()->primitive_ > GLUP_PYRAMIDS) { - instance()->primitive_ = 0; + void cycle_primitives() { + ++primitive_; + if(primitive_ > GLUP_PYRAMIDS) { + primitive_ = 0; } } @@ -190,7 +174,7 @@ namespace { * \brief Draws the scene according to currently set primitive and * drawing modes. */ - virtual void draw_scene() { + void draw_scene() override { // GLUP can have different colors for frontfacing and // backfacing polygons. @@ -398,8 +382,8 @@ namespace { * is called as soon as the OpenGL context is ready for rendering. It * is meant to initialize the graphic objects used by the application. */ - virtual void init_graphics() { - Application::init_graphics(); + void GL_initialize() override { + SimpleApplication::GL_initialize(); // Create the texture and initialize its texturing modes glGenTextures(1, &texture_); @@ -407,89 +391,10 @@ namespace { glBindTexture(GL_TEXTURE_2D, texture_); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexImage2DXPM(uv); + glTexImage2Dxpm(uv); glupTextureType(GLUP_TEXTURE_2D); glupTextureMode(GLUP_TEXTURE_REPLACE); } - - /** - * \brief Draws the application menus. - * \details This function overloads - * Application::draw_application_menus(). It can be used to create - * additional menus in the main menu bar. - */ - virtual void draw_application_menus() { - if(ImGui::BeginMenu("Commands")) { - if(ImGui::MenuItem("say hello")) { - // Command::set_current() creates the dialog box and - // invokes a function when the "apply" button of the - // dialog box is pushed. - // It needs the prototype of the function as a string, - // to have argument names and default values. - // If prototype is not specified, then default values are - // set to zero and argument names are arg0,arg1...argn. - // The two other arguments are a pointer to an object and - // the pointer to the member function to be invoked (it is - // also possible to give a pointer to a global static - // function). - Command::set_current( - "say_hello(index_t nb_times=1)", - this, - &DemoGlupApplication::say_hello - ); - } - - if(ImGui::MenuItem("compute")) { - // Another example of Command::set_current() with more - // information in the function prototype string: each - // argument and the function can have a tooltip text, - // specified between square brackets. - Command::set_current( - "compute(" - " index_t nb_iter=300 [number of iterations]" - ") [pretends to compute something]", - this, - &DemoGlupApplication::compute - ); - } - ImGui::EndMenu(); - } - } - - /** - * \brief An example function invoked from a menu. - * \see draw_application_menus() - */ - void say_hello(index_t nb_times) { - show_console(); - for(index_t i=1; i<=nb_times; ++i) { - Logger::out("MyApp") << i << ": Hello, world" << std::endl; - } - } - - /** - * \brief An example function invoked from a menu. - * \see draw_application_menus() - */ - void compute(index_t nb_iter) { - - // Create a progress bar - ProgressTask progress("Computing", nb_iter); - try { - for(index_t i=0; i +#include #define RAYTRACE_GUI #include "../../geogram/simple_raytrace/raytracing.h" +#include namespace { using namespace GEO; +// Some phones (OpenGL ES) only support GL_RGBA as +// internal format and also *image* format. +#ifdef GEO_OS_ANDROID + const GLenum image_format = GL_RGBA; +#else + const GLenum image_format = GL_RGB; +#endif + /** * \brief An application that demonstrates both * GLUP primitives and glup_viewer application * framework. */ - class DemoRaytraceApplication : public Application { + class DemoRaytraceApplication : public SimpleApplication { public: /** * \brief DemoRaytraceApplication constructor. */ - DemoRaytraceApplication( - int argc, char** argv, - const std::string& usage - ) : - Application(argc, argv, usage), - camera_( - vec3(2.0, 2.0, 1.5), // Position - vec3(0.5, 0.5, 0.5), // Target -#ifdef GEO_OS_EMSCRIPTEN - 512, 512, // OpenGL ES needs power of two textures -#else - 800, 800, // Image size -#endif - 50.0 // zoom angle (in degrees) + DemoRaytraceApplication() : + SimpleApplication("RayTrace"), + camera_( + get_width(), get_height(), + (image_format == GL_RGBA) ? 4 : 3 ) { texture_ = 0; - scene_.add_object(new HorizontalCheckerboardPlane(0.0)) // The tradition ! + total_time_ = 0.0; + frames_ = 0; + + // The tradition ! + scene_.add_object(new HorizontalCheckerboardPlane(0.0)) ->rename("Checkerboard"); - scene_.add_object( // A sphere + scene_.add_object( // A sphere new Sphere(vec3(-0.7, -0.7, 1.0),0.7) )->set_reflection_coefficient(vec3(0.8, 0.8, 0.8)) ->set_diffuse_coefficient(vec3(0.2, 0.2, 0.2)) ->rename("Sphere 1"); - scene_.add_object( // Another sphere + scene_.add_object( // Another sphere new Sphere(vec3( 0.0, 0.0, 0.0),0.25) - )->set_diffuse_coefficient(vec3(0.0, 1.0, 0.5)) - ->rename("Sphere 2"); + )->set_diffuse_coefficient(vec3(0.0, 1.0, 0.5)) + ->rename("Sphere 2"); // Let there be (two) lights ! @@ -116,109 +120,76 @@ namespace { scene_.add_object(new Light( vec3(1.0, 0.2, 1.0), // Position 0.02, // Radius - vec3(1.5, 1.5, 0.5) // Color + vec3(1.0, 1.0, 1.0) // Color ) )->rename("Light 2"); scene_changed_ = true; - zoom_ = 0.0f; - left_pane_visible_ = false; - background_color_1_ = vec4f(0.0f, 0.0f, 0.2f, 1.0f); - background_color_2_ = vec4f(0.0f, 0.0f, 0.2f, 1.0f); - - for(index_t i=0; i<4; ++i) { - quaternion_[i] = 0.0f; - } + set_region_of_interest(-1.0, -1.0, -1.0, 1.0, 1.0, 1.0); - for(index_t i=0; i<3; ++i) { - translation_[i] = 0.0f; - } - + viewer_properties_visible_ = false; } /** * \brief DemoRaytraceApplication destructor. */ ~DemoRaytraceApplication() override { - if(texture_ != 0) { - glDeleteTextures(1,&texture_); - } } - void update() { - float* new_quaternion = glup_viewer_get_scene_quaternion(); - for(index_t i=0; i<4; ++i) { - if(new_quaternion[i] != quaternion_[i]) { - scene_changed_ = true; - quaternion_[i] = new_quaternion[i]; - } - } - - float* new_translation = glup_viewer_get_scene_translation(); - for(index_t i=0; i<3; ++i) { - if(new_translation[i] != translation_[i]) { - scene_changed_ = true; - translation_[i] = new_translation[i]; - } - } + /** + * \copydoc SimpleApplication::GL_terminate() + */ + void GL_terminate() override { + if(texture_ != 0) { + glDeleteTextures(1,&texture_); + } + } - float new_zoom = glup_viewer_get_float(GLUP_VIEWER_ZOOM); - if(new_zoom != zoom_) { - scene_changed_ = true; - zoom_ = new_zoom; + /** + * \brief Ray-traces a new frame. + * \details Only if scene or viewing parameters + * changed. + */ + void raytrace() { + if(!scene_changed_) { + return; } - - if(scene_changed_) { - vec3 pos(2.0, 2.0, 1.5); - mat4 M; - set_mat4_from_translation_and_quaternion( - M, - double(translation_[0]), - double(translation_[1]), - double(translation_[2]), - double(quaternion_[2]), - double(quaternion_[0]), - double(quaternion_[1]), - double(quaternion_[3]) - ); - - //M = M.inverse(); - - pos = transform_point(pos,M); - - vec3 target( - 0.5 + double(translation_[0]), - 0.5 + double(translation_[1]), - 0.5 + double(translation_[2]) - ); - - camera_.update( - pos, target, 50.0 / double(zoom_) - ); -#ifdef GEO_OPENMP -#pragma omp parallel for -#endif - for(index_t Y=0; Y"); - app.start(); + DemoRaytraceApplication app; + app.start(argc, argv); return 0; } diff --git a/src/examples/graphics/demo_SimpleApplication/CMakeLists.txt b/src/examples/graphics/demo_SimpleApplication/CMakeLists.txt new file mode 100755 index 00000000..28dec4de --- /dev/null +++ b/src/examples/graphics/demo_SimpleApplication/CMakeLists.txt @@ -0,0 +1,9 @@ +include(${PROJECT_SOURCE_DIR}/cmake/opengl.cmake) +set(APP_NAME geogram_demo_SimpleApplication) + +aux_source_directories(SOURCES "" .) +add_executable(${APP_NAME} ${SOURCES}) +target_link_libraries(${APP_NAME} geogram_gfx geogram ${GLFW_LIBRARIES}) +install_runtime_targets(${APP_NAME}) + +set_target_properties(${APP_NAME} PROPERTIES FOLDER "GEOGRAM") diff --git a/src/examples/graphics/demo_SimpleApplication/main.cpp b/src/examples/graphics/demo_SimpleApplication/main.cpp new file mode 100644 index 00000000..f529dd11 --- /dev/null +++ b/src/examples/graphics/demo_SimpleApplication/main.cpp @@ -0,0 +1,299 @@ +/* + * Copyright (c) 2012-2014, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#include + +// Demo for the SimpleApplication class. +// SimpleApplication includes camera controls, +// viewer properties, place holder for object +// properties, console window and built-in text +// editor. +// Note: there is also a lower-level Application +// class (see demo_Application). + +namespace { + using namespace GEO; + + // Point coordinates of the vertices of an icosahedron + static double points[] = { + 0, 0.0, 1.175571, + 1.051462, 0.0, 0.5257311, + 0.3249197, 1.0, 0.5257311, + -0.8506508, 0.618034, 0.5257311, + -0.8506508, -0.618034, 0.5257311, + 0.3249197, -1.0, 0.5257311, + 0.8506508, 0.618034, -0.5257311, + 0.8506508, -0.618034, -0.5257311, + -0.3249197, 1.0, -0.5257311, + -1.051462, 0.0, -0.5257311, + -0.3249197, -1.0, -0.5257311, + 0.0, 0.0, -1.175571 + }; + + // Facets of an icosahedron + static index_t facets[] = { + 0,1,2, + 0,2,3, + 0,3,4, + 0,4,5, + 0,5,1, + 1,5,7, + 1,7,6, + 1,6,2, + 2,6,8, + 2,8,3, + 3,8,9, + 3,9,4, + 4,9,10, + 4,10,5, + 5,10,7, + 6,7,11, + 6,11,8, + 7,10,11, + 8,11,9, + 9,11,10, + }; + + class DemoApplication : public GEO::SimpleApplication { + public: + DemoApplication() : GEO::SimpleApplication( + "Geogram Demo App" + ) { + demo_window_visible_ = false; + frame_ = 0; + set_region_of_interest(-1.0, -1.0, -1.0, 1.0, 1.0, 1.0); + surface_color_ = vec4f(0.0f, 0.0f, 0.0f, 1.0f); + show_mesh_ = true; + mesh_color_ = vec4f(1.0f, 1.0f, 1.0f, 1.0f); + mesh_width_ = 0.2f; + add_key_toggle("m", &show_mesh_); + lighting_ = false; + use_text_editor_ = true; // Activate built-in text editor. + } + + protected: + + // You can add elements in the GUI by overriding + // the following functions. + + + void draw_gui() override { + SimpleApplication::draw_gui(); + if(demo_window_visible_) { + ImGui::ShowDemoWindow(&demo_window_visible_); + } + } + + void draw_object_properties() override { + SimpleApplication::draw_object_properties(); + ImGui::ColorEdit3WithPalette( + "Surface", surface_color_.data() + ); + ImGui::Checkbox("##MeshOnOff", &show_mesh_); + ImGui::SameLine(); + ImGui::ColorEdit3WithPalette("mesh [m]", mesh_color_.data()); + if(show_mesh_) { + ImGui::SliderFloat( + "wid.", &mesh_width_, 0.1f, 2.0f, "%.1f" + ); + } + } + + void draw_windows_menu() override { + ImGui::MenuItem( + "ImGui Demo", nullptr, &demo_window_visible_ + ); + SimpleApplication::draw_windows_menu(); + } + + /** + * \brief Draws the application menus. + * \details This function overloads + * Application::draw_application_menus(). It can be used to create + * additional menus in the main menu bar. + */ + void draw_application_menus() override { + if(ImGui::BeginMenu("Commands")) { + if(ImGui::MenuItem("say hello")) { + // Command::set_current() creates the dialog box and + // invokes a function when the "apply" button of the + // dialog box is pushed. + // It needs the prototype of the function as a string, + // to have argument names and default values. + // If prototype is not specified, then default values are + // set to zero and argument names are arg0,arg1...argn. + // The two other arguments are a pointer to an object and + // the pointer to the member function to be invoked (it is + // also possible to give a pointer to a global static + // function). + Command::set_current( + "say_hello(index_t nb_times=1)", + this, + &DemoApplication::say_hello + ); + } + + if(ImGui::MenuItem("compute")) { + // Another example of Command::set_current() with more + // information in the function prototype string: each + // argument and the function can have a tooltip text, + // specified between square brackets. + Command::set_current( + "compute(" + " index_t nb_iter=300 [number of iterations]" + ") [pretends to compute something]", + this, + &DemoApplication::compute + ); + } + ImGui::EndMenu(); + } + } + + /** + * \brief An example function invoked from a menu. + * \see draw_application_menus() + */ + void say_hello(index_t nb_times) { + show_console(); + for(index_t i=1; i<=nb_times; ++i) { + Logger::out("MyApp") << i << ": Hello, world" << std::endl; + } + } + + /** + * \brief An example function invoked from a menu. + * \see draw_application_menus() + */ + void compute(index_t nb_iter) { + // Create a progress bar + ProgressTask progress("Computing", nb_iter); + try { + for(index_t i=0; i) - # Jeremie/Maxence: avoids the need to redeclare geogram include # path for targets that depend on geogram. # See: https://cmake.org/cmake/help/v3.3/command/target_include_directories.html diff --git a/src/lib/geogram/basic/android_wrapper.h b/src/lib/geogram/basic/android_wrapper.h new file mode 100644 index 00000000..8a299fa1 --- /dev/null +++ b/src/lib/geogram/basic/android_wrapper.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2012-2014, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#include + +/** + * \file geogram/basic/android_wrapper.h + * \brief This file should be included first in Android applications + * \details Calls application's main() from android_main() + */ + + +#define main wrapped_main +int wrapped_main(int argc, char** argv); + +extern "C" void android_main(struct android_app* app); + +static int argc = 1; +static const char* cmdline = "geogram"; +static const char* argv[] = { + cmdline, + nullptr +}; + +void android_main(struct android_app* app) { + GEO::initialize(); + GEO::CmdLine::set_android_app(app); + wrapped_main(argc, (char**)argv); +} + + + diff --git a/src/lib/geogram/basic/command_line.cpp b/src/lib/geogram/basic/command_line.cpp index 4a358b51..d0008b7c 100644 --- a/src/lib/geogram/basic/command_line.cpp +++ b/src/lib/geogram/basic/command_line.cpp @@ -1305,3 +1305,21 @@ namespace GEO { } } +#ifdef GEO_OS_ANDROID +namespace { + android_app* android_app_ = nullptr; +} + +namespace GEO { + namespace CmdLine { + void set_android_app(android_app* app) { + android_app_ = app; + } + + android_app* get_android_app() { + return android_app_; + } + } +} +#endif + diff --git a/src/lib/geogram/basic/command_line.h b/src/lib/geogram/basic/command_line.h index f7b56d66..bb81ae72 100644 --- a/src/lib/geogram/basic/command_line.h +++ b/src/lib/geogram/basic/command_line.h @@ -819,5 +819,28 @@ namespace GEO { } } + +#ifdef GEO_OS_ANDROID +struct android_app; + +namespace GEO { + namespace CmdLine { + /** + * \brief Declares the current android app. + * \param[in] app a pointer to the android app. + */ + void GEOGRAM_API set_android_app(android_app* app); + + /** + * \brief Gets the android app. + * \return a pointer to the android app. + */ + android_app* GEOGRAM_API get_android_app(); + } +} + +#endif + + #endif diff --git a/src/lib/geogram/basic/command_line_args.cpp b/src/lib/geogram/basic/command_line_args.cpp index 4b76ac57..fcaaa51b 100644 --- a/src/lib/geogram/basic/command_line_args.cpp +++ b/src/lib/geogram/basic/command_line_args.cpp @@ -697,6 +697,7 @@ namespace { "gfx:GLSL_tesselation", true, "use tesselation shaders if available" ); declare_arg("gfx:geometry", "1024x1024", "resolution"); + declare_arg("gfx:keypress", "", "initial key sequence sent to viewer"); } /** @@ -710,6 +711,21 @@ namespace { "dump all command line arguments in biblio. report" ); } + + /** + * \brief Imports the gui option group. + */ + void import_arg_group_gui() { + declare_arg_group("gui", "gui options", ARG_ADVANCED); + declare_arg("gui:state", "", "gui layout state"); + declare_arg("gui:style", "Dark", "gui style, one of Dark,Light"); +#ifdef GEO_OS_ANDROID + declare_arg("gui:font_size", 56, "font size"); +#else + declare_arg("gui:font_size", 18, "font size"); +#endif + declare_arg("gui:expert", false, "expert mode for developpers"); + } /************************************************************************/ @@ -856,7 +872,9 @@ namespace GEO { import_arg_group_poly(); } else if(name == "gfx") { import_arg_group_gfx(); - } else { + } else if(name == "gui") { + import_arg_group_gui(); + } else { Logger::instance()->set_quiet(false); Logger::err("CmdLine") << "No such option group: " << name diff --git a/src/lib/geogram/delaunay/parallel_delaunay_3d.cpp b/src/lib/geogram/delaunay/parallel_delaunay_3d.cpp index 23d5d6eb..abb5d274 100644 --- a/src/lib/geogram/delaunay/parallel_delaunay_3d.cpp +++ b/src/lib/geogram/delaunay/parallel_delaunay_3d.cpp @@ -598,7 +598,9 @@ namespace GEO { signed_index_t v3 = cavity_.facet_vertex(f,2); new_tet = new_tetrahedron(signed_index_t(v), v1, v2, v3); set_tet_adjacent(new_tet, 0, t_neigh); - set_tet_adjacent(t_neigh, find_tet_adjacent(t_neigh,old_tet), new_tet); + set_tet_adjacent( + t_neigh, find_tet_adjacent(t_neigh,old_tet), new_tet + ); cavity_.set_facet_tet(f, new_tet); } @@ -1505,7 +1507,9 @@ namespace GEO { // convention as in CGAL). const double* pv_bkp = pv[f]; pv[f] = p; - Sign ori = PCK::orient_3d_inexact(pv[0], pv[1], pv[2], pv[3]); + Sign ori = PCK::orient_3d_inexact( + pv[0], pv[1], pv[2], pv[3] + ); // If the orientation is not negative, then we cannot // walk towards t_next, and examine the next candidate diff --git a/src/lib/geogram/mesh/mesh.h b/src/lib/geogram/mesh/mesh.h index bf496a0b..25ee5352 100644 --- a/src/lib/geogram/mesh/mesh.h +++ b/src/lib/geogram/mesh/mesh.h @@ -1776,8 +1776,8 @@ namespace GEO { /** * \brief Gets a const pointer to a cell adjacent to a facet * \param[in] f the facet, in 0..nb()-1 - * \return a const pointer to the cell adjacent to facet \p f, or NO_FACET if \p f - * is on the border + * \return a const pointer to the cell adjacent to facet \p f, + * or NO_FACET if \p f is on the border */ const index_t* adjacent_cell_ptr(index_t f) const { geo_assert(f < nb()); @@ -1787,8 +1787,8 @@ namespace GEO { /** * \brief Gets a pointer to a cell adjacent to a facet * \param[in] f the facet, in 0..nb()-1 - * \return a pointer to the cell adjacent to facet \p f, or NO_FACET if \p f - * is on the border + * \return a pointer to the cell adjacent to facet \p f, + * or NO_FACET if \p f is on the border */ index_t* adjacent_cell_ptr(index_t f) { geo_assert(f < nb()); diff --git a/src/lib/geogram/mesh/mesh_io.cpp b/src/lib/geogram/mesh/mesh_io.cpp index 1fe78df8..70f84fbd 100644 --- a/src/lib/geogram/mesh/mesh_io.cpp +++ b/src/lib/geogram/mesh/mesh_io.cpp @@ -392,12 +392,6 @@ namespace GEO { } } unbind_attributes(); - /* - if(ioflags.has_element(MESH_FACETS) && M.facets.nb() == 0) { - Logger::err("I/O") << "Mesh contains no facet" << std::endl; - return false; - } - */ return true; } diff --git a/src/lib/geogram/third_party/CMakeLists.txt b/src/lib/geogram/third_party/CMakeLists.txt index 4df96b09..25d383f3 100644 --- a/src/lib/geogram/third_party/CMakeLists.txt +++ b/src/lib/geogram/third_party/CMakeLists.txt @@ -56,6 +56,14 @@ endif() add_library(geogram_third_party OBJECT ${SOURCES}) +if(ANDROID) + target_include_directories(geogram_third_party PRIVATE + ${ANDROID_NDK}/sources/android/native_app_glue + ) + message(STATUS "building for Android") +endif() + + set_target_properties( geogram_third_party PROPERTIES FOLDER "GEOGRAM" diff --git a/src/lib/geogram/third_party/PoissonRecon/Allocator.h b/src/lib/geogram/third_party/PoissonRecon/Allocator.h old mode 100755 new mode 100644 diff --git a/src/lib/geogram/third_party/PoissonRecon/Array.h b/src/lib/geogram/third_party/PoissonRecon/Array.h old mode 100755 new mode 100644 index ca26b0af..27d61c09 --- a/src/lib/geogram/third_party/PoissonRecon/Array.h +++ b/src/lib/geogram/third_party/PoissonRecon/Array.h @@ -1,121 +1,121 @@ -/* -Copyright (c) 2011, Michael Kazhdan and Ming Chuang -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - -#ifndef ARRAY_INCLUDED -#define ARRAY_INCLUDED - -#include - -#define ARRAY_DEBUG 0 -#ifdef _WIN64 -#define ASSERT( x ) { if( !( x ) ) __debugbreak(); } -#else // !_WIN64 -#ifdef _WIN32 -#define ASSERT( x ) { if( !( x ) ) _asm{ int 0x03 } } -#else // !_WIN32 -#define ASSERT( x ) { if( !( x ) ) exit(0); } -#endif // _WIN32 -#endif // _WIN64 - -// Code from http://stackoverflow.com -void* aligned_malloc( size_t size , size_t align ) -{ - // Align enough for the data, the alignment padding, and room to store a pointer to the actual start of the memory - void* mem = malloc( size + align + sizeof( void* ) ); - // The position at which we could potentially start addressing - char* amem = ( (char*)mem ) + sizeof( void* ); - // Add align-1 to the start of the address and then zero out at most of the first align-1 bits. - amem = ( char* )( ( (size_t)( ( (char*)amem ) + (align-1) ) ) & ~( align-1 ) ); - // Pre-write the actual address - ( ( void** ) amem )[-1] = mem; - return amem; -} -void aligned_free( void* mem ) { free( ( ( void** )mem )[-1] ); } - -#if ARRAY_DEBUG -#pragma message ( "[WARNING] Array debugging is enabled" ) -#include "Array.inl" -#define Pointer( ... ) Array< __VA_ARGS__ > -#define ConstPointer( ... ) ConstArray< __VA_ARGS__ > -#define NullPointer( ... ) Array< __VA_ARGS__ >() -template< class C > void FreePointer( Array< C >& a ){ a.Free( ); } -template< class C > void AlignedFreePointer( Array< C >& a ){ a.Free( ); } -template< class C > void VFreePointer( Array< C >& a ){ a.Free( ); } -template< class C > void DeletePointer( Array< C >& a ){ a.Delete( ); } - -template< class C > Array< C > NewPointer( size_t size , const char* name=NULL ){ return Array< C >::New ( size , name ); } -template< class C > Array< C > AllocPointer( size_t size , const char* name=NULL ){ return Array< C >::Alloc ( size , false , name ); } -template< class C > Array< C > AlignedAllocPointer( size_t size , size_t alignment , const char* name=NULL ){ return Array< C >::AlignedAlloc( size , alignment , false , name ); } -template< class C > Array< C > ReAllocPointer( Array< C >& a , size_t size , const char* name=NULL ){ return Array< C >::ReAlloc ( a , size , false , name ); } - -template< class C > C* PointerAddress( Array< C >& a ) { return a.pointer(); } -template< class C > const C* PointerAddress( ConstArray< C >& a ) { return a.pointer(); } -template< class C > Array< C > GetPointer( C& c ) { return Array< C >::FromPointer( &c , 1 ); } -template< class C > ConstArray< C > GetPointer( const C& c ) { return ConstArray< C >::FromPointer( &c , 1 ); } -template< class C > Array< C > GetPointer( std::vector< C >& v ){ return Array< C >::FromPointer( &v[0] , v.size() ); } -template< class C > ConstArray< C > GetPointer( const std::vector< C >& v ){ return ConstArray< C >::FromPointer( &v[0] , v.size() ); } - -#else // !ARRAY_DEBUG -#define Pointer( ... ) __VA_ARGS__* -#define ConstPointer( ... ) const __VA_ARGS__* -#define NullPointer( ... ) NULL - -#define FreePointer( ... ) { if( __VA_ARGS__ ) free( __VA_ARGS__ ) , __VA_ARGS__ = NULL; } -#define AlignedFreePointer( ... ) { if( __VA_ARGS__ ) aligned_free( __VA_ARGS__ ) , __VA_ARGS__ = NULL; } -#define DeletePointer( ... ) { if( __VA_ARGS__ ) delete[] __VA_ARGS__ , __VA_ARGS__ = NULL; } - -// [BL] Added memory clear here to avoid uninitialized memory read in SparseMatrix. - -template< class C > C* NewPointer( size_t size , const char* name=NULL ){ return new C[size]; } - -template< class C > C* AllocPointer( size_t size , const char* name=NULL ){ - return (C*) calloc(size, sizeof(C)); -} - -template< class C > C* AlignedAllocPointer( size_t size , size_t alignment , const char* name=NULL ){ - C* result = (C*)aligned_malloc( sizeof(C) * size , alignment ); - memset(result, 0, sizeof(C)*size); - return result; -} - -template< class C > C* ReAllocPointer( C* c , size_t size , const char* name=NULL ){ - C* result = (C*)realloc( c , sizeof(C) * size ); - // [BL] cannot clear memory here, because I do not know what the previous size was... - return result; -} - -//template< class C > C* NullPointer( void ){ return NULL; } - -template< class C > C* PointerAddress( C* c ){ return c; } -template< class C > const C* PointerAddress( const C* c ){ return c; } -template< class C > C* GetPointer( C& c ){ return &c; } -template< class C > const C* GetPointer( const C& c ){ return &c; } -template< class C > C* GetPointer( std::vector< C >& v ){ return &v[0]; } -template< class C > const C* GetPointer( const std::vector< C >& v ){ return &v[0]; } -#endif // ARRAY_DEBUG -#endif // ARRAY_INCLUDED +/* +Copyright (c) 2011, Michael Kazhdan and Ming Chuang +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ + +#ifndef ARRAY_INCLUDED +#define ARRAY_INCLUDED + +#include + +#define ARRAY_DEBUG 0 +#ifdef _WIN64 +#define ASSERT( x ) { if( !( x ) ) __debugbreak(); } +#else // !_WIN64 +#ifdef _WIN32 +#define ASSERT( x ) { if( !( x ) ) _asm{ int 0x03 } } +#else // !_WIN32 +#define ASSERT( x ) { if( !( x ) ) exit(0); } +#endif // _WIN32 +#endif // _WIN64 + +// Code from http://stackoverflow.com +void* aligned_malloc( size_t size , size_t align ) +{ + // Align enough for the data, the alignment padding, and room to store a pointer to the actual start of the memory + void* mem = malloc( size + align + sizeof( void* ) ); + // The position at which we could potentially start addressing + char* amem = ( (char*)mem ) + sizeof( void* ); + // Add align-1 to the start of the address and then zero out at most of the first align-1 bits. + amem = ( char* )( ( (size_t)( ( (char*)amem ) + (align-1) ) ) & ~( align-1 ) ); + // Pre-write the actual address + ( ( void** ) amem )[-1] = mem; + return amem; +} +void aligned_free( void* mem ) { free( ( ( void** )mem )[-1] ); } + +#if ARRAY_DEBUG +#pragma message ( "[WARNING] Array debugging is enabled" ) +#include "Array.inl" +#define Pointer( ... ) Array< __VA_ARGS__ > +#define ConstPointer( ... ) ConstArray< __VA_ARGS__ > +#define NullPointer( ... ) Array< __VA_ARGS__ >() +template< class C > void FreePointer( Array< C >& a ){ a.Free( ); } +template< class C > void AlignedFreePointer( Array< C >& a ){ a.Free( ); } +template< class C > void VFreePointer( Array< C >& a ){ a.Free( ); } +template< class C > void DeletePointer( Array< C >& a ){ a.Delete( ); } + +template< class C > Array< C > NewPointer( size_t size , const char* name=NULL ){ return Array< C >::New ( size , name ); } +template< class C > Array< C > AllocPointer( size_t size , const char* name=NULL ){ return Array< C >::Alloc ( size , false , name ); } +template< class C > Array< C > AlignedAllocPointer( size_t size , size_t alignment , const char* name=NULL ){ return Array< C >::AlignedAlloc( size , alignment , false , name ); } +template< class C > Array< C > ReAllocPointer( Array< C >& a , size_t size , const char* name=NULL ){ return Array< C >::ReAlloc ( a , size , false , name ); } + +template< class C > C* PointerAddress( Array< C >& a ) { return a.pointer(); } +template< class C > const C* PointerAddress( ConstArray< C >& a ) { return a.pointer(); } +template< class C > Array< C > GetPointer( C& c ) { return Array< C >::FromPointer( &c , 1 ); } +template< class C > ConstArray< C > GetPointer( const C& c ) { return ConstArray< C >::FromPointer( &c , 1 ); } +template< class C > Array< C > GetPointer( std::vector< C >& v ){ return Array< C >::FromPointer( &v[0] , v.size() ); } +template< class C > ConstArray< C > GetPointer( const std::vector< C >& v ){ return ConstArray< C >::FromPointer( &v[0] , v.size() ); } + +#else // !ARRAY_DEBUG +#define Pointer( ... ) __VA_ARGS__* +#define ConstPointer( ... ) const __VA_ARGS__* +#define NullPointer( ... ) NULL + +#define FreePointer( ... ) { if( __VA_ARGS__ ) free( __VA_ARGS__ ) , __VA_ARGS__ = NULL; } +#define AlignedFreePointer( ... ) { if( __VA_ARGS__ ) aligned_free( __VA_ARGS__ ) , __VA_ARGS__ = NULL; } +#define DeletePointer( ... ) { if( __VA_ARGS__ ) delete[] __VA_ARGS__ , __VA_ARGS__ = NULL; } + +// [BL] Added memory clear here to avoid uninitialized memory read in SparseMatrix. + +template< class C > C* NewPointer( size_t size , const char* name=NULL ){ return new C[size]; } + +template< class C > C* AllocPointer( size_t size , const char* name=NULL ){ + return (C*) calloc(size, sizeof(C)); +} + +template< class C > C* AlignedAllocPointer( size_t size , size_t alignment , const char* name=NULL ){ + C* result = (C*)aligned_malloc( sizeof(C) * size , alignment ); + memset(result, 0, sizeof(C)*size); + return result; +} + +template< class C > C* ReAllocPointer( C* c , size_t size , const char* name=NULL ){ + C* result = (C*)realloc( c , sizeof(C) * size ); + // [BL] cannot clear memory here, because I do not know what the previous size was... + return result; +} + +//template< class C > C* NullPointer( void ){ return NULL; } + +template< class C > C* PointerAddress( C* c ){ return c; } +template< class C > const C* PointerAddress( const C* c ){ return c; } +template< class C > C* GetPointer( C& c ){ return &c; } +template< class C > const C* GetPointer( const C& c ){ return &c; } +template< class C > C* GetPointer( std::vector< C >& v ){ return &v[0]; } +template< class C > const C* GetPointer( const std::vector< C >& v ){ return &v[0]; } +#endif // ARRAY_DEBUG +#endif // ARRAY_INCLUDED diff --git a/src/lib/geogram/third_party/PoissonRecon/Array.inl b/src/lib/geogram/third_party/PoissonRecon/Array.inl old mode 100755 new mode 100644 index 3d0abeca..6247f528 --- a/src/lib/geogram/third_party/PoissonRecon/Array.inl +++ b/src/lib/geogram/third_party/PoissonRecon/Array.inl @@ -1,662 +1,662 @@ -/* -Copyright (c) 2011, Michael Kazhdan and Ming Chuang -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ -#define FULL_ARRAY_DEBUG 0 // Note that this is not thread-safe - -#include -#include -#include -#ifdef _WIN32 -#include -#endif // _WIN32 -#include - -inline bool isfinitef( float fp ){ float f=fp; return ((*(unsigned *)&f)&0x7f800000)!=0x7f800000; } - - -template< class C > bool IsValid( const C& c ); -#if _DEBUG -template< > inline bool IsValid< float >( const float& f ) { return isfinitef( f ) && ( f==0.f || abs(f)>1e-31f ); } -#else // !_DEBUG -template< > inline bool IsValid< float >( const float& f ) { return isfinitef( f ); } -#endif // _DEBUG -template< > inline bool IsValid< __m128 >( const __m128& m ) -{ - const __m128* addr = &m; - if( size_t(addr) & 15 ) return false; - else return true; -} -template< class C > inline bool IsValid( const C& c ){ return true; } - - -#if FULL_ARRAY_DEBUG -class DebugMemoryInfo -{ -public: - const void* address; - char name[512]; -}; -static std::vector< DebugMemoryInfo > memoryInfo; -#endif // FULL_ARRAY_DEBUG - -template< class C > -class Array -{ - void _assertBounds( long long idx ) const - { - if( idx=max ) - { - fprintf( stderr , "Array index out-of-bounds: %lld <= %lld < %lld\n" , min , idx , max ); - ASSERT( 0 ); - exit( 0 ); - } - } -protected: - C *data , *_data; - long long min , max; -#if FULL_ARRAY_DEBUG - static void _AddMemoryInfo( const void* ptr , const char* name ) - { - size_t sz = memoryInfo.size(); - memoryInfo.resize( sz + 1 ); - memoryInfo[sz].address = ptr; - if( name ) strcpy( memoryInfo[sz].name , name ); - else memoryInfo[sz].name[0] = 0; - } - static void _RemoveMemoryInfo( const void* ptr ) - { - { - size_t idx; - for( idx=0 ; idx - Array( Array< D >& a ) - { - _data = NULL; - if( !a ) - { - data = NULL; - min = max = 0; - } - else - { - // [WARNING] Chaning szC and szD to size_t causes some really strange behavior. - long long szC = sizeof( C ); - long long szD = sizeof( D ); - data = (C*)a.data; - min = ( a.minimum() * szD ) / szC; - max = ( a.maximum() * szD ) / szC; - if( min*szC!=a.minimum()*szD || max*szC!=a.maximum()*szD ) - { - fprintf( stderr , "Could not convert array [ %lld , %lld ] * %lld => [ %lld , %lld ] * %lld\n" , a.minimum() , a.maximum() , szD , min , max , szC ); - ASSERT( 0 ); - exit( 0 ); - } - } - } - static Array FromPointer( C* data , long long max ) - { - Array a; - a._data = NULL; - a.data = data; - a.min = 0; - a.max = max; - return a; - } - static Array FromPointer( C* data , long long min , long long max ) - { - Array a; - a._data = NULL; - a.data = data; - a.min = min; - a.max = max; - return a; - } - inline bool operator == ( const Array< C >& a ) const { return data==a.data; } - inline bool operator != ( const Array< C >& a ) const { return data!=a.data; } - inline bool operator == ( const C* c ) const { return data==c; } - inline bool operator != ( const C* c ) const { return data!=c; } - inline C* operator -> ( void ) - { - _assertBounds( 0 ); - return data; - } - inline const C* operator -> ( ) const - { - _assertBounds( 0 ); - return data; - } - inline C& operator[]( long long idx ) - { - _assertBounds( idx ); - return data[idx]; - } - inline const C& operator[]( long long idx ) const - { - _assertBounds( idx ); - return data[idx]; - } - inline Array operator + ( int idx ) const - { - Array a; - a._data = _data; - a.data = data+idx; - a.min = min-idx; - a.max = max-idx; - return a; - } - inline Array operator + ( long long idx ) const - { - Array a; - a._data = _data; - a.data = data+idx; - a.min = min-idx; - a.max = max-idx; - return a; - } - inline Array operator + ( unsigned int idx ) const - { - Array a; - a._data = _data; - a.data = data+idx; - a.min = min-idx; - a.max = max-idx; - return a; - } - inline Array operator + ( unsigned long long idx ) const - { - Array a; - a._data = _data; - a.data = data+idx; - a.min = min-idx; - a.max = max-idx; - return a; - } - inline Array& operator += ( int idx ) - { - min -= idx; - max -= idx; - data += idx; - return (*this); - } - inline Array& operator += ( long long idx ) - { - min -= idx; - max -= idx; - data += idx; - return (*this); - } - inline Array& operator += ( unsigned int idx ) - { - min -= idx; - max -= idx; - data += idx; - return (*this); - } - inline Array& operator += ( unsigned long long idx ) - { - min -= idx; - max -= idx; - data += idx; - return (*this); - } - inline Array& operator ++ ( void ) { return (*this) += 1; } - inline Array operator++( int ){ Array< C > temp = (*this) ; (*this) +=1 ; return temp; } - Array operator - ( int idx ) const { return (*this) + (-idx); } - Array operator - ( long long idx ) const { return (*this) + (-idx); } - Array operator - ( unsigned int idx ) const { return (*this) + (-idx); } - Array operator - ( unsigned long long idx ) const { return (*this) + (-idx); } - Array& operator -= ( int idx ) { return (*this) += (-idx); } - Array& operator -= ( long long idx ) { return (*this) += (-idx); } - Array& operator -= ( unsigned int idx ) { return (*this) += (-idx); } - Array& operator -= ( unsigned long long idx ) { return (*this) += (-idx); } - Array& operator -- ( void ) { return (*this) -= 1; } - inline Array operator--( int ){ Array< C > temp = (*this) ; (*this) -=1 ; return temp; } - long long operator - ( const Array& a ) const { return ( long long )( data - a.data ); } - - void Free( void ) - { - if( _data ) - { - free( _data ); -#if FULL_ARRAY_DEBUG - _RemoveMemoryInfo( _data ); -#endif // FULL_ARRAY_DEBUG - } - (*this) = Array( ); - } - void Delete( void ) - { - if( _data ) - { - delete[] _data; -#if FULL_ARRAY_DEBUG - _RemoveMemoryInfo( _data ); -#endif // FULL_ARRAY_DEBUG - } - (*this) = Array( ); - } - C* pointer( void ){ return data; } - const C* pointer( void ) const { return data; } - bool operator !( void ) const { return data==NULL; } - operator bool( ) const { return data!=NULL; } -}; - -template< class C > -class ConstArray -{ - void _assertBounds( long long idx ) const - { - if( idx=max ) - { - fprintf( stderr , "ConstArray index out-of-bounds: %lld <= %lld < %lld\n" , min , idx , max ); - ASSERT( 0 ); - exit( 0 ); - } - } -protected: - const C *data; - long long min , max; -public: - long long minimum( void ) const { return min; } - long long maximum( void ) const { return max; } - - inline ConstArray( void ) - { - data = NULL; - min = max = 0; - } - inline ConstArray( const Array< C >& a ) - { - // [WARNING] Changing szC and szD to size_t causes some really strange behavior. - data = ( const C* )a.pointer( ); - min = a.minimum(); - max = a.maximum(); - } - template< class D > - inline ConstArray( const Array< D >& a ) - { - // [WARNING] Changing szC and szD to size_t causes some really strange behavior. - long long szC = ( long long ) sizeof( C ); - long long szD = ( long long ) sizeof( D ); - data = ( const C* )a.pointer( ); - min = ( a.minimum() * szD ) / szC; - max = ( a.maximum() * szD ) / szC; - if( min*szC!=a.minimum()*szD || max*szC!=a.maximum()*szD ) - { -// fprintf( stderr , "Could not convert const array [ %lld , %lld ] * %lld => [ %lld , %lld ] * %lld\n" , a.minimum() , a.maximum() , szD , min , max , szC ); - fprintf( stderr , "Could not convert const array [ %lld , %lld ] * %lld => [ %lld , %lld ] * %lld\n %lld %lld %lld\n" , a.minimum() , a.maximum() , szD , min , max , szC , a.minimum() , a.minimum()*szD , (a.minimum()*szD)/szC ); - ASSERT( 0 ); - exit( 0 ); - } - } - template< class D > - inline ConstArray( const ConstArray< D >& a ) - { - // [WARNING] Chaning szC and szD to size_t causes some really strange behavior. - long long szC = sizeof( C ); - long long szD = sizeof( D ); - data = ( const C*)a.pointer( ); - min = ( a.minimum() * szD ) / szC; - max = ( a.maximum() * szD ) / szC; - if( min*szC!=a.minimum()*szD || max*szC!=a.maximum()*szD ) - { - fprintf( stderr , "Could not convert array [ %lld , %lld ] * %lld => [ %lld , %lld ] * %lld\n" , a.minimum() , a.maximum() , szD , min , max , szC ); - ASSERT( 0 ); - exit( 0 ); - } - } - static ConstArray FromPointer( const C* data , long long max ) - { - ConstArray a; - a.data = data; - a.min = 0; - a.max = max; - return a; - } - static ConstArray FromPointer( const C* data , long long min , long long max ) - { - ConstArray a; - a.data = data; - a.min = min; - a.max = max; - return a; - } - - inline bool operator == ( const ConstArray< C >& a ) const { return data==a.data; } - inline bool operator != ( const ConstArray< C >& a ) const { return data!=a.data; } - inline bool operator == ( const C* c ) const { return data==c; } - inline bool operator != ( const C* c ) const { return data!=c; } - inline const C* operator -> ( void ) - { - _assertBounds( 0 ); - return data; - } - inline const C& operator[]( long long idx ) const - { - _assertBounds( idx ); - return data[idx]; - } - inline ConstArray operator + ( int idx ) const - { - ConstArray a; - a.data = data+idx; - a.min = min-idx; - a.max = max-idx; - return a; - } - inline ConstArray operator + ( long long idx ) const - { - ConstArray a; - a.data = data+idx; - a.min = min-idx; - a.max = max-idx; - return a; - } - inline ConstArray operator + ( unsigned int idx ) const - { - ConstArray a; - a.data = data+idx; - a.min = min-idx; - a.max = max-idx; - return a; - } - inline ConstArray operator + ( unsigned long long idx ) const - { - ConstArray a; - a.data = data+idx; - a.min = min-idx; - a.max = max-idx; - return a; - } - inline ConstArray& operator += ( int idx ) - { - min -= idx; - max -= idx; - data += idx; - return (*this); - } - inline ConstArray& operator += ( long long idx ) - { - min -= idx; - max -= idx; - data += idx; - return (*this); - } - inline ConstArray& operator += ( unsigned int idx ) - { - min -= idx; - max -= idx; - data += idx; - return (*this); - } - inline ConstArray& operator += ( unsigned long long idx ) - { - min -= idx; - max -= idx; - data += idx; - return (*this); - } - inline ConstArray& operator ++ ( void ) { return (*this) += 1; } - inline ConstArray operator++( int ){ ConstArray< C > temp = (*this) ; (*this) +=1 ; return temp; } - ConstArray operator - ( int idx ) const { return (*this) + (-idx); } - ConstArray operator - ( long long idx ) const { return (*this) + (-idx); } - ConstArray operator - ( unsigned int idx ) const { return (*this) + (-idx); } - ConstArray operator - ( unsigned long long idx ) const { return (*this) + (-idx); } - ConstArray& operator -= ( int idx ) { return (*this) += (-idx); } - ConstArray& operator -= ( long long idx ) { return (*this) += (-idx); } - ConstArray& operator -= ( unsigned int idx ) { return (*this) += (-idx); } - ConstArray& operator -= ( unsigned long long idx ) { return (*this) += (-idx); } - ConstArray& operator -- ( void ) { return (*this) -= 1; } - inline ConstArray operator--( int ){ ConstArray< C > temp = (*this) ; (*this) -=1 ; return temp; } - long long operator - ( const ConstArray& a ) const { return ( long long )( data - a.data ); } - long long operator - ( const Array< C >& a ) const { return ( long long )( data - a.pointer() ); } - - const C* pointer( void ) const { return data; } - bool operator !( void ) { return data==NULL; } - operator bool( ) { return data!=NULL; } -}; - -#if FULL_ARRAY_DEBUG -inline void PrintMemoryInfo( void ){ for( size_t i=0 ; i -Array< C > memcpy( Array< C > destination , const void* source , size_t size ) -{ - if( size>destination.maximum()*sizeof(C) ) - { - fprintf( stderr , "Size of copy exceeds destination maximum: %lld > %lld\n" , ( long long )( size ) , ( long long )( destination.maximum()*sizeof( C ) ) ); - ASSERT( 0 ); - exit( 0 ); - } - if( size ) memcpy( &destination[0] , source , size ); - return destination; -} -template< class C , class D > -Array< C > memcpy( Array< C > destination , Array< D > source , size_t size ) -{ - if( size>destination.maximum()*sizeof( C ) ) - { - fprintf( stderr , "Size of copy exceeds destination maximum: %lld > %lld\n" , ( long long )( size ) , ( long long )( destination.maximum()*sizeof( C ) ) ); - ASSERT( 0 ); - exit( 0 ); - } - if( size>source.maximum()*sizeof( D ) ) - { - fprintf( stderr , "Size of copy exceeds source maximum: %lld > %lld\n" , ( long long )( size ) , ( long long )( source.maximum()*sizeof( D ) ) ); - ASSERT( 0 ); - exit( 0 ); - } - if( size ) memcpy( &destination[0] , &source[0] , size ); - return destination; -} -template< class C , class D > -Array< C > memcpy( Array< C > destination , ConstArray< D > source , size_t size ) -{ - if( size>destination.maximum()*sizeof( C ) ) - { - fprintf( stderr , "Size of copy exceeds destination maximum: %lld > %lld\n" , ( long long )( size ) , ( long long )( destination.maximum()*sizeof( C ) ) ); - ASSERT( 0 ); - exit( 0 ); - } - if( size>source.maximum()*sizeof( D ) ) - { - fprintf( stderr , "Size of copy exceeds source maximum: %lld > %lld\n" , ( long long )( size ) , ( long long )( source.maximum()*sizeof( D ) ) ); - ASSERT( 0 ); - exit( 0 ); - } - if( size ) memcpy( &destination[0] , &source[0] , size ); - return destination; -} -template< class D > -void* memcpy( void* destination , Array< D > source , size_t size ) -{ - if( size>source.maximum()*sizeof( D ) ) - { - fprintf( stderr , "Size of copy exceeds source maximum: %lld > %lld\n" , ( long long )( size ) , ( long long )( source.maximum()*sizeof( D ) ) ); - ASSERT( 0 ); - exit( 0 ); - } - if( size ) memcpy( destination , &source[0] , size ); - return destination; -} -template< class D > -void* memcpy( void* destination , ConstArray< D > source , size_t size ) -{ - if( size>source.maximum()*sizeof( D ) ) - { - fprintf( stderr , "Size of copy exceeds source maximum: %lld > %lld\n" , ( long long )( size ) , ( long long )( source.maximum()*sizeof( D ) ) ); - ASSERT( 0 ); - exit( 0 ); - } - if( size ) memcpy( destination , &source[0] , size ); - return destination; -} -template< class C > -Array< C > memset( Array< C > destination , int value , size_t size ) -{ - if( size>destination.maximum()*sizeof( C ) ) - { - fprintf( stderr , "Size of set exceeds destination maximum: %lld > %lld\n" , ( long long )( size ) , ( long long )( destination.maximum()*sizeof( C ) ) ); - ASSERT( 0 ); - exit( 0 ); - } - if( size ) memset( &destination[0] , value , size ); - return destination; -} - -template< class C > -size_t fread( Array< C > destination , size_t eSize , size_t count , FILE* fp ) -{ - if( count*eSize>destination.maximum()*sizeof( C ) ) - { - fprintf( stderr , "Size of read exceeds source maximum: %lld > %lld\n" , ( long long )( count*eSize ) , ( long long )( destination.maximum()*sizeof( C ) ) ); - ASSERT( 0 ); - exit( 0 ); - } - return fread( &destination[0] , eSize , count , fp ); -} -template< class C > -size_t fwrite( Array< C > source , size_t eSize , size_t count , FILE* fp ) -{ - if( count*eSize>source.maximum()*sizeof( C ) ) - { - fprintf( stderr , "Size of write exceeds source maximum: %lld > %lld\n" , ( long long )( count*eSize ) , ( long long )( source.maximum()*sizeof( C ) ) ); - ASSERT( 0 ); - exit( 0 ); - } - return fwrite( &source[0] , eSize , count , fp ); -} -template< class C > -size_t fwrite( ConstArray< C > source , size_t eSize , size_t count , FILE* fp ) -{ - if( count*eSize>source.maximum()*sizeof( C ) ) - { - fprintf( stderr , "Size of write exceeds source maximum: %lld > %lld\n" , ( long long )( count*eSize ) , ( long long )( source.maximum()*sizeof( C ) ) ); - ASSERT( 0 ); - exit( 0 ); - } - return fwrite( &source[0] , eSize , count , fp ); -} -template< class C > -void qsort( Array< C > base , size_t numElements , size_t elementSize , int (*compareFunction)( const void* , const void* ) ) -{ - if( sizeof(C)!=elementSize ) - { - fprintf( stderr , "Element sizes differ: %lld != %lld\n" , ( long long )( sizeof(C) ) , ( long long )( elementSize ) ); - ASSERT( 0 ); - exit( 0 ); - } - if( base.minimum()>0 || base.maximum() +#include +#include +#ifdef _WIN32 +#include +#endif // _WIN32 +#include + +inline bool isfinitef( float fp ){ float f=fp; return ((*(unsigned *)&f)&0x7f800000)!=0x7f800000; } + + +template< class C > bool IsValid( const C& c ); +#if _DEBUG +template< > inline bool IsValid< float >( const float& f ) { return isfinitef( f ) && ( f==0.f || abs(f)>1e-31f ); } +#else // !_DEBUG +template< > inline bool IsValid< float >( const float& f ) { return isfinitef( f ); } +#endif // _DEBUG +template< > inline bool IsValid< __m128 >( const __m128& m ) +{ + const __m128* addr = &m; + if( size_t(addr) & 15 ) return false; + else return true; +} +template< class C > inline bool IsValid( const C& c ){ return true; } + + +#if FULL_ARRAY_DEBUG +class DebugMemoryInfo +{ +public: + const void* address; + char name[512]; +}; +static std::vector< DebugMemoryInfo > memoryInfo; +#endif // FULL_ARRAY_DEBUG + +template< class C > +class Array +{ + void _assertBounds( long long idx ) const + { + if( idx=max ) + { + fprintf( stderr , "Array index out-of-bounds: %lld <= %lld < %lld\n" , min , idx , max ); + ASSERT( 0 ); + exit( 0 ); + } + } +protected: + C *data , *_data; + long long min , max; +#if FULL_ARRAY_DEBUG + static void _AddMemoryInfo( const void* ptr , const char* name ) + { + size_t sz = memoryInfo.size(); + memoryInfo.resize( sz + 1 ); + memoryInfo[sz].address = ptr; + if( name ) strcpy( memoryInfo[sz].name , name ); + else memoryInfo[sz].name[0] = 0; + } + static void _RemoveMemoryInfo( const void* ptr ) + { + { + size_t idx; + for( idx=0 ; idx + Array( Array< D >& a ) + { + _data = NULL; + if( !a ) + { + data = NULL; + min = max = 0; + } + else + { + // [WARNING] Chaning szC and szD to size_t causes some really strange behavior. + long long szC = sizeof( C ); + long long szD = sizeof( D ); + data = (C*)a.data; + min = ( a.minimum() * szD ) / szC; + max = ( a.maximum() * szD ) / szC; + if( min*szC!=a.minimum()*szD || max*szC!=a.maximum()*szD ) + { + fprintf( stderr , "Could not convert array [ %lld , %lld ] * %lld => [ %lld , %lld ] * %lld\n" , a.minimum() , a.maximum() , szD , min , max , szC ); + ASSERT( 0 ); + exit( 0 ); + } + } + } + static Array FromPointer( C* data , long long max ) + { + Array a; + a._data = NULL; + a.data = data; + a.min = 0; + a.max = max; + return a; + } + static Array FromPointer( C* data , long long min , long long max ) + { + Array a; + a._data = NULL; + a.data = data; + a.min = min; + a.max = max; + return a; + } + inline bool operator == ( const Array< C >& a ) const { return data==a.data; } + inline bool operator != ( const Array< C >& a ) const { return data!=a.data; } + inline bool operator == ( const C* c ) const { return data==c; } + inline bool operator != ( const C* c ) const { return data!=c; } + inline C* operator -> ( void ) + { + _assertBounds( 0 ); + return data; + } + inline const C* operator -> ( ) const + { + _assertBounds( 0 ); + return data; + } + inline C& operator[]( long long idx ) + { + _assertBounds( idx ); + return data[idx]; + } + inline const C& operator[]( long long idx ) const + { + _assertBounds( idx ); + return data[idx]; + } + inline Array operator + ( int idx ) const + { + Array a; + a._data = _data; + a.data = data+idx; + a.min = min-idx; + a.max = max-idx; + return a; + } + inline Array operator + ( long long idx ) const + { + Array a; + a._data = _data; + a.data = data+idx; + a.min = min-idx; + a.max = max-idx; + return a; + } + inline Array operator + ( unsigned int idx ) const + { + Array a; + a._data = _data; + a.data = data+idx; + a.min = min-idx; + a.max = max-idx; + return a; + } + inline Array operator + ( unsigned long long idx ) const + { + Array a; + a._data = _data; + a.data = data+idx; + a.min = min-idx; + a.max = max-idx; + return a; + } + inline Array& operator += ( int idx ) + { + min -= idx; + max -= idx; + data += idx; + return (*this); + } + inline Array& operator += ( long long idx ) + { + min -= idx; + max -= idx; + data += idx; + return (*this); + } + inline Array& operator += ( unsigned int idx ) + { + min -= idx; + max -= idx; + data += idx; + return (*this); + } + inline Array& operator += ( unsigned long long idx ) + { + min -= idx; + max -= idx; + data += idx; + return (*this); + } + inline Array& operator ++ ( void ) { return (*this) += 1; } + inline Array operator++( int ){ Array< C > temp = (*this) ; (*this) +=1 ; return temp; } + Array operator - ( int idx ) const { return (*this) + (-idx); } + Array operator - ( long long idx ) const { return (*this) + (-idx); } + Array operator - ( unsigned int idx ) const { return (*this) + (-idx); } + Array operator - ( unsigned long long idx ) const { return (*this) + (-idx); } + Array& operator -= ( int idx ) { return (*this) += (-idx); } + Array& operator -= ( long long idx ) { return (*this) += (-idx); } + Array& operator -= ( unsigned int idx ) { return (*this) += (-idx); } + Array& operator -= ( unsigned long long idx ) { return (*this) += (-idx); } + Array& operator -- ( void ) { return (*this) -= 1; } + inline Array operator--( int ){ Array< C > temp = (*this) ; (*this) -=1 ; return temp; } + long long operator - ( const Array& a ) const { return ( long long )( data - a.data ); } + + void Free( void ) + { + if( _data ) + { + free( _data ); +#if FULL_ARRAY_DEBUG + _RemoveMemoryInfo( _data ); +#endif // FULL_ARRAY_DEBUG + } + (*this) = Array( ); + } + void Delete( void ) + { + if( _data ) + { + delete[] _data; +#if FULL_ARRAY_DEBUG + _RemoveMemoryInfo( _data ); +#endif // FULL_ARRAY_DEBUG + } + (*this) = Array( ); + } + C* pointer( void ){ return data; } + const C* pointer( void ) const { return data; } + bool operator !( void ) const { return data==NULL; } + operator bool( ) const { return data!=NULL; } +}; + +template< class C > +class ConstArray +{ + void _assertBounds( long long idx ) const + { + if( idx=max ) + { + fprintf( stderr , "ConstArray index out-of-bounds: %lld <= %lld < %lld\n" , min , idx , max ); + ASSERT( 0 ); + exit( 0 ); + } + } +protected: + const C *data; + long long min , max; +public: + long long minimum( void ) const { return min; } + long long maximum( void ) const { return max; } + + inline ConstArray( void ) + { + data = NULL; + min = max = 0; + } + inline ConstArray( const Array< C >& a ) + { + // [WARNING] Changing szC and szD to size_t causes some really strange behavior. + data = ( const C* )a.pointer( ); + min = a.minimum(); + max = a.maximum(); + } + template< class D > + inline ConstArray( const Array< D >& a ) + { + // [WARNING] Changing szC and szD to size_t causes some really strange behavior. + long long szC = ( long long ) sizeof( C ); + long long szD = ( long long ) sizeof( D ); + data = ( const C* )a.pointer( ); + min = ( a.minimum() * szD ) / szC; + max = ( a.maximum() * szD ) / szC; + if( min*szC!=a.minimum()*szD || max*szC!=a.maximum()*szD ) + { +// fprintf( stderr , "Could not convert const array [ %lld , %lld ] * %lld => [ %lld , %lld ] * %lld\n" , a.minimum() , a.maximum() , szD , min , max , szC ); + fprintf( stderr , "Could not convert const array [ %lld , %lld ] * %lld => [ %lld , %lld ] * %lld\n %lld %lld %lld\n" , a.minimum() , a.maximum() , szD , min , max , szC , a.minimum() , a.minimum()*szD , (a.minimum()*szD)/szC ); + ASSERT( 0 ); + exit( 0 ); + } + } + template< class D > + inline ConstArray( const ConstArray< D >& a ) + { + // [WARNING] Chaning szC and szD to size_t causes some really strange behavior. + long long szC = sizeof( C ); + long long szD = sizeof( D ); + data = ( const C*)a.pointer( ); + min = ( a.minimum() * szD ) / szC; + max = ( a.maximum() * szD ) / szC; + if( min*szC!=a.minimum()*szD || max*szC!=a.maximum()*szD ) + { + fprintf( stderr , "Could not convert array [ %lld , %lld ] * %lld => [ %lld , %lld ] * %lld\n" , a.minimum() , a.maximum() , szD , min , max , szC ); + ASSERT( 0 ); + exit( 0 ); + } + } + static ConstArray FromPointer( const C* data , long long max ) + { + ConstArray a; + a.data = data; + a.min = 0; + a.max = max; + return a; + } + static ConstArray FromPointer( const C* data , long long min , long long max ) + { + ConstArray a; + a.data = data; + a.min = min; + a.max = max; + return a; + } + + inline bool operator == ( const ConstArray< C >& a ) const { return data==a.data; } + inline bool operator != ( const ConstArray< C >& a ) const { return data!=a.data; } + inline bool operator == ( const C* c ) const { return data==c; } + inline bool operator != ( const C* c ) const { return data!=c; } + inline const C* operator -> ( void ) + { + _assertBounds( 0 ); + return data; + } + inline const C& operator[]( long long idx ) const + { + _assertBounds( idx ); + return data[idx]; + } + inline ConstArray operator + ( int idx ) const + { + ConstArray a; + a.data = data+idx; + a.min = min-idx; + a.max = max-idx; + return a; + } + inline ConstArray operator + ( long long idx ) const + { + ConstArray a; + a.data = data+idx; + a.min = min-idx; + a.max = max-idx; + return a; + } + inline ConstArray operator + ( unsigned int idx ) const + { + ConstArray a; + a.data = data+idx; + a.min = min-idx; + a.max = max-idx; + return a; + } + inline ConstArray operator + ( unsigned long long idx ) const + { + ConstArray a; + a.data = data+idx; + a.min = min-idx; + a.max = max-idx; + return a; + } + inline ConstArray& operator += ( int idx ) + { + min -= idx; + max -= idx; + data += idx; + return (*this); + } + inline ConstArray& operator += ( long long idx ) + { + min -= idx; + max -= idx; + data += idx; + return (*this); + } + inline ConstArray& operator += ( unsigned int idx ) + { + min -= idx; + max -= idx; + data += idx; + return (*this); + } + inline ConstArray& operator += ( unsigned long long idx ) + { + min -= idx; + max -= idx; + data += idx; + return (*this); + } + inline ConstArray& operator ++ ( void ) { return (*this) += 1; } + inline ConstArray operator++( int ){ ConstArray< C > temp = (*this) ; (*this) +=1 ; return temp; } + ConstArray operator - ( int idx ) const { return (*this) + (-idx); } + ConstArray operator - ( long long idx ) const { return (*this) + (-idx); } + ConstArray operator - ( unsigned int idx ) const { return (*this) + (-idx); } + ConstArray operator - ( unsigned long long idx ) const { return (*this) + (-idx); } + ConstArray& operator -= ( int idx ) { return (*this) += (-idx); } + ConstArray& operator -= ( long long idx ) { return (*this) += (-idx); } + ConstArray& operator -= ( unsigned int idx ) { return (*this) += (-idx); } + ConstArray& operator -= ( unsigned long long idx ) { return (*this) += (-idx); } + ConstArray& operator -- ( void ) { return (*this) -= 1; } + inline ConstArray operator--( int ){ ConstArray< C > temp = (*this) ; (*this) -=1 ; return temp; } + long long operator - ( const ConstArray& a ) const { return ( long long )( data - a.data ); } + long long operator - ( const Array< C >& a ) const { return ( long long )( data - a.pointer() ); } + + const C* pointer( void ) const { return data; } + bool operator !( void ) { return data==NULL; } + operator bool( ) { return data!=NULL; } +}; + +#if FULL_ARRAY_DEBUG +inline void PrintMemoryInfo( void ){ for( size_t i=0 ; i +Array< C > memcpy( Array< C > destination , const void* source , size_t size ) +{ + if( size>destination.maximum()*sizeof(C) ) + { + fprintf( stderr , "Size of copy exceeds destination maximum: %lld > %lld\n" , ( long long )( size ) , ( long long )( destination.maximum()*sizeof( C ) ) ); + ASSERT( 0 ); + exit( 0 ); + } + if( size ) memcpy( &destination[0] , source , size ); + return destination; +} +template< class C , class D > +Array< C > memcpy( Array< C > destination , Array< D > source , size_t size ) +{ + if( size>destination.maximum()*sizeof( C ) ) + { + fprintf( stderr , "Size of copy exceeds destination maximum: %lld > %lld\n" , ( long long )( size ) , ( long long )( destination.maximum()*sizeof( C ) ) ); + ASSERT( 0 ); + exit( 0 ); + } + if( size>source.maximum()*sizeof( D ) ) + { + fprintf( stderr , "Size of copy exceeds source maximum: %lld > %lld\n" , ( long long )( size ) , ( long long )( source.maximum()*sizeof( D ) ) ); + ASSERT( 0 ); + exit( 0 ); + } + if( size ) memcpy( &destination[0] , &source[0] , size ); + return destination; +} +template< class C , class D > +Array< C > memcpy( Array< C > destination , ConstArray< D > source , size_t size ) +{ + if( size>destination.maximum()*sizeof( C ) ) + { + fprintf( stderr , "Size of copy exceeds destination maximum: %lld > %lld\n" , ( long long )( size ) , ( long long )( destination.maximum()*sizeof( C ) ) ); + ASSERT( 0 ); + exit( 0 ); + } + if( size>source.maximum()*sizeof( D ) ) + { + fprintf( stderr , "Size of copy exceeds source maximum: %lld > %lld\n" , ( long long )( size ) , ( long long )( source.maximum()*sizeof( D ) ) ); + ASSERT( 0 ); + exit( 0 ); + } + if( size ) memcpy( &destination[0] , &source[0] , size ); + return destination; +} +template< class D > +void* memcpy( void* destination , Array< D > source , size_t size ) +{ + if( size>source.maximum()*sizeof( D ) ) + { + fprintf( stderr , "Size of copy exceeds source maximum: %lld > %lld\n" , ( long long )( size ) , ( long long )( source.maximum()*sizeof( D ) ) ); + ASSERT( 0 ); + exit( 0 ); + } + if( size ) memcpy( destination , &source[0] , size ); + return destination; +} +template< class D > +void* memcpy( void* destination , ConstArray< D > source , size_t size ) +{ + if( size>source.maximum()*sizeof( D ) ) + { + fprintf( stderr , "Size of copy exceeds source maximum: %lld > %lld\n" , ( long long )( size ) , ( long long )( source.maximum()*sizeof( D ) ) ); + ASSERT( 0 ); + exit( 0 ); + } + if( size ) memcpy( destination , &source[0] , size ); + return destination; +} +template< class C > +Array< C > memset( Array< C > destination , int value , size_t size ) +{ + if( size>destination.maximum()*sizeof( C ) ) + { + fprintf( stderr , "Size of set exceeds destination maximum: %lld > %lld\n" , ( long long )( size ) , ( long long )( destination.maximum()*sizeof( C ) ) ); + ASSERT( 0 ); + exit( 0 ); + } + if( size ) memset( &destination[0] , value , size ); + return destination; +} + +template< class C > +size_t fread( Array< C > destination , size_t eSize , size_t count , FILE* fp ) +{ + if( count*eSize>destination.maximum()*sizeof( C ) ) + { + fprintf( stderr , "Size of read exceeds source maximum: %lld > %lld\n" , ( long long )( count*eSize ) , ( long long )( destination.maximum()*sizeof( C ) ) ); + ASSERT( 0 ); + exit( 0 ); + } + return fread( &destination[0] , eSize , count , fp ); +} +template< class C > +size_t fwrite( Array< C > source , size_t eSize , size_t count , FILE* fp ) +{ + if( count*eSize>source.maximum()*sizeof( C ) ) + { + fprintf( stderr , "Size of write exceeds source maximum: %lld > %lld\n" , ( long long )( count*eSize ) , ( long long )( source.maximum()*sizeof( C ) ) ); + ASSERT( 0 ); + exit( 0 ); + } + return fwrite( &source[0] , eSize , count , fp ); +} +template< class C > +size_t fwrite( ConstArray< C > source , size_t eSize , size_t count , FILE* fp ) +{ + if( count*eSize>source.maximum()*sizeof( C ) ) + { + fprintf( stderr , "Size of write exceeds source maximum: %lld > %lld\n" , ( long long )( count*eSize ) , ( long long )( source.maximum()*sizeof( C ) ) ); + ASSERT( 0 ); + exit( 0 ); + } + return fwrite( &source[0] , eSize , count , fp ); +} +template< class C > +void qsort( Array< C > base , size_t numElements , size_t elementSize , int (*compareFunction)( const void* , const void* ) ) +{ + if( sizeof(C)!=elementSize ) + { + fprintf( stderr , "Element sizes differ: %lld != %lld\n" , ( long long )( sizeof(C) ) , ( long long )( elementSize ) ); + ASSERT( 0 ); + exit( 0 ); + } + if( base.minimum()>0 || base.maximum() -struct BSplineElementCoefficients -{ - int coeffs[Degree+1]; - BSplineElementCoefficients( void ){ memset( coeffs , 0 , sizeof( int ) * ( Degree+1 ) ); } - int& operator[]( int idx ){ return coeffs[idx]; } - const int& operator[]( int idx ) const { return coeffs[idx]; } -}; - -// This class represents a function on the the interval, partitioned into "res" blocks. -// On each block, the function is a degree-Degree polynomial, represented by the coefficients -// in the associated BSplineElementCoefficients. -// [NOTE] This representation of a function is agnostic to the type of boundary conditions (though the constructor is not). -template< int Degree > -struct BSplineElements : public std::vector< BSplineElementCoefficients< Degree > > -{ - static const bool _Primal = (Degree&1)==1; - static const int _Off = (Degree+1)/2; - static int _ReflectLeft ( int offset , int res ); - static int _ReflectRight( int offset , int res ); - static int _RotateLeft ( int offset , int res ); - static int _RotateRight ( int offset , int res ); - template< bool Left > void _addPeriodic( int offset , bool negate ); -public: - // Coefficients are ordered as "/" "-" "\" - // [WARNING] This is the opposite of the order in Polynomial::BSplineComponent - int denominator; - - BSplineElements( void ) { denominator = 1; } - BSplineElements( int res , int offset , bool dirichlet ); - - void upSample( BSplineElements& high ) const; - void differentiate( BSplineElements< Degree-1 >& d ) const; - - void print( FILE* fp=stdout ) const - { - for( int i=0 ; i >::size() ; i++ ) - { - printf( "%d]" , i ); - for( int j=0 ; j<=Degree ; j++ ) printf( " %d" , (*this)[i][j] ); - printf( " (%d)\n" , denominator ); - } - } -}; -#define BSPLINE_SET_BOUNDS( name , s , e ) \ - static const int name ## Start = (s); \ - static const int name ## End = (e); \ - static const int name ## Size = (e)-(s)+1 - -// Assumes that x is non-negative -#define _FLOOR_OF_HALF( x ) ( (x) >>1 ) -#define _CEIL_OF_HALF( x ) ( ( (x)+1 )>>1 ) -// Done with the assumption -#define FLOOR_OF_HALF( x ) ( (x)<0 ? - _CEIL_OF_HALF( -(x) ) : _FLOOR_OF_HALF( x ) ) -#define CEIL_OF_HALF( x ) ( (x)<0 ? - _FLOOR_OF_HALF( -(x) ) : _CEIL_OF_HALF( x ) ) -#define SMALLEST_INTEGER_LARGER_THAN_HALF( x ) ( CEIL_OF_HALF( (x)+1 ) ) -#define LARGEST_INTEGER_SMALLER_THAN_HALF( x ) ( FLOOR_OF_HALF( (x)-1 ) ) -#define SMALLEST_INTEGER_LARGER_THAN_OR_EQUAL_TO_HALF( x ) ( CEIL_OF_HALF( x ) ) -#define LARGEST_INTEGER_SMALLER_THAN_OR_EQUAL_TO_HALF( x ) ( FLOOR_OF_HALF( x ) ) - -template< int Degree > -class BSplineEvaluationData -{ -public: - BSplineEvaluationData( void ); - static double Value( int depth , int off , double s , bool dirichlet , bool derivative ); - - static int Dimension( int depth ){ return ( 1< [-(Degree+1-Inset) , (Degree+1+Inset) ] CONTAINS [ J-(Degree+1-Inset)/2 , J+(Degree+1+Inset)/2 ] - // Which is the same as the smallest/largest integers J such that: - // J - (Degree+1-Inset)/2 >= -(Degree+1-Inset) | J + (Degree+1+Inset)/2 <= (Degree+1+Inset) - // <=> J >= -(Degree+1-Inset)/2 | J <= (Degree+1+Inset)/2 - BSPLINE_SET_BOUNDS( UpSample , - ( Degree + 1 - Inset ) / 2 , ( Degree + 1 + Inset ) /2 ); - - // Setting I=0/1, we are looking for the smallest/largest integers J such that: - // Support( J ) CONTAINS Support( 0/1 ) - // <=> [ 2*J - (Degree+1-Inset) , 2*J + (Degree+1+Inset) ] CONTAINS [ 0/1 - (Degree+1-Inset)/2 , 0/1 + (Degree+1+Inset)/2 ] - // Which is the same as the smallest/largest integers J such that: - // 2*J + (Degree+1+Inset) >= 0/1 + (Degree+1+Inset)/2 | 2*J - (Degree+1-Inset) <= 0/1 - (Degree+1-Inset)/2 - // <=> 2*J >= 0/1 - (Degree+1+Inset)/2 | 2*J <= 0/1 + (Degree+1-Inset)/2 - BSPLINE_SET_BOUNDS( DownSample0 , SMALLEST_INTEGER_LARGER_THAN_OR_EQUAL_TO_HALF( 0 - ( Degree + 1 + Inset ) / 2 ) , LARGEST_INTEGER_SMALLER_THAN_OR_EQUAL_TO_HALF( 0 + ( Degree + 1 - Inset ) / 2 ) ); - BSPLINE_SET_BOUNDS( DownSample1 , SMALLEST_INTEGER_LARGER_THAN_OR_EQUAL_TO_HALF( 1 - ( Degree + 1 + Inset ) / 2 ) , LARGEST_INTEGER_SMALLER_THAN_OR_EQUAL_TO_HALF( 1 + ( Degree + 1 - Inset ) / 2 ) ); - static const int DownSampleStart[] , DownSampleEnd[] , DownSampleSize[]; - - // Note that this struct stores the components in left-to-right order - struct BSplineComponents - { - protected: - Polynomial< Degree > _polys[Degree+1]; - public: - BSplineComponents( void ){ ; } - BSplineComponents( int depth , int offset , bool dirichlet ); - const Polynomial< Degree >& operator[] ( int idx ) const { return _polys[idx]; } - void printnl( void ) const { for( int d=0 ; d<=Degree ; d++ ) printf( "[%d] " , d ) , _polys[d].printnl(); } - }; - struct BSplineUpSamplingCoefficients - { - protected: - int _coefficients[ UpSampleSize ]; - public: - BSplineUpSamplingCoefficients( void ){ ; } - BSplineUpSamplingCoefficients( int depth , int offset , bool dirichlet ); - double operator[] ( int idx ){ return (double)_coefficients[idx] / (1<::Dimension( depth ); - if ( offset=dim-Stop ) return Start + 1 + offset - ( dim-Stop ); - else return Start; - } - struct Evaluator - { - protected: - friend class BSplineEvaluationData; - int _depth; - double _ccValues[2][Size][SupportSize]; - public: - Evaluator() { // [Bruno] - _depth = 0; - memset(_ccValues, 0, sizeof(_ccValues)); - } - double value( int fIdx , int cIdx , bool d ) const; - int depth( void ) const { return _depth; } - }; - struct ChildEvaluator - { - protected: - friend class BSplineEvaluationData; - int _parentDepth; - double _pcValues[2][Size][ChildSupportSize]; - public: - ChildEvaluator() { // [Bruno] - _parentDepth = 0; - memset(_pcValues, 0, sizeof(_pcValues)); - } - double value( int fIdx , int cIdx , bool d ) const; - int parentDepth( void ) const { return _parentDepth; } - int childDepth( void ) const { return _parentDepth+1; } - }; - }; - static void SetCenterEvaluator( typename CenterEvaluator::Evaluator& evaluator , int depth , bool dirichlet ); - static void SetChildCenterEvaluator( typename CenterEvaluator::ChildEvaluator& evaluator , int parentDepth , bool dirichlet ); - - struct CornerEvaluator - { - static const int Start = -SupportStart , Stop = SupportEnd , Size = Start + Stop + 1; - - static int Index( int depth , int offset ) - { - int dim = BSplineEvaluationData< Degree >::Dimension( depth ); - if ( offset=dim-Stop ) return Start + 1 + offset - ( dim-Stop ); - else return Start; - } - struct Evaluator - { - protected: - friend class BSplineEvaluationData; - int _depth; - double _ccValues[2][Size][CornerSize]; - public: - Evaluator() { //[Bruno] - _depth = 0; - memset(_ccValues, 0, sizeof(_ccValues)); - } - double value( int fIdx , int cIdx , bool d ) const; - int depth( void ) const { return _depth; } - }; - struct ChildEvaluator - { - protected: - friend class BSplineEvaluationData; - int _parentDepth; - double _pcValues[2][Size][ChildCornerSize]; - public: - ChildEvaluator() { //[Bruno] - _parentDepth = 0; - memset(_pcValues, 0, sizeof(_pcValues)); - } - double value( int fIdx , int cIdx , bool d ) const; - int parentDepth( void ) const { return _parentDepth; } - int childDepth( void ) const { return _parentDepth+1; } - }; - }; - static void SetCornerEvaluator( typename CornerEvaluator::Evaluator& evaluator , int depth , bool dirichlet ); - static void SetChildCornerEvaluator( typename CornerEvaluator::ChildEvaluator& evaluator , int parentDepth , bool dirichlet ); - - struct Evaluator - { - typename CenterEvaluator::Evaluator centerEvaluator; - typename CornerEvaluator::Evaluator cornerEvaluator; - double centerValue( int fIdx , int cIdx , bool d ) const { return centerEvaluator.value( fIdx , cIdx , d ); } - double cornerValue( int fIdx , int cIdx , bool d ) const { return cornerEvaluator.value( fIdx , cIdx , d ); } - }; - static void SetEvaluator( Evaluator& evaluator , int depth , bool dirichlet ){ SetCenterEvaluator( evaluator.centerEvaluator , depth , dirichlet ) , SetCornerEvaluator( evaluator.cornerEvaluator , depth , dirichlet ); } - struct ChildEvaluator - { - typename CenterEvaluator::ChildEvaluator centerEvaluator; - typename CornerEvaluator::ChildEvaluator cornerEvaluator; - double centerValue( int fIdx , int cIdx , bool d ) const { return centerEvaluator.value( fIdx , cIdx , d ); } - double cornerValue( int fIdx , int cIdx , bool d ) const { return cornerEvaluator.value( fIdx , cIdx , d ); } - }; - static void SetChildEvaluator( ChildEvaluator& evaluator , int depth , bool dirichlet ){ SetChildCenterEvaluator( evaluator.centerEvaluator , depth , dirichlet ) , SetChildCornerEvaluator( evaluator.cornerEvaluator , depth , dirichlet ); } - - struct UpSampleEvaluator - { - static const int Start = - SupportStart , Stop = SupportEnd , Size = Start + Stop + 1; - static int Index( int depth , int offset ) - { - int dim = BSplineEvaluationData< Degree >::Dimension( depth ); - if ( offset=dim-Stop ) return Start + 1 + offset - ( dim-Stop ); - else return Start; - } - protected: - friend class BSplineEvaluationData; - int _lowDepth; - double _pcValues[Size][UpSampleSize]; - public: - UpSampleEvaluator() { // [Bruno] - _lowDepth = 0; - memset(_pcValues, 0, sizeof(_pcValues)); - } - double value( int pIdx , int cIdx ) const; - int lowDepth( void ) const { return _lowDepth; } - }; - static void SetUpSampleEvaluator( UpSampleEvaluator& evaluator , int lowDepth , bool dirichlet ); -}; -template< int Degree > const int BSplineEvaluationData< Degree >::DownSampleStart[] = { DownSample0Start , DownSample1Start }; -template< int Degree > const int BSplineEvaluationData< Degree >::DownSampleEnd [] = { DownSample0End , DownSample1End }; -template< int Degree > const int BSplineEvaluationData< Degree >::DownSampleSize [] = { DownSample0Size , DownSample1Size }; - -template< int Degree1 , int Degree2 > -class BSplineIntegrationData -{ -public: - static double Dot( int depth1 , int off1 , bool dirichlet1 , bool d1 , int depth2 , int off2 , bool dirichlet2 , bool d2 ); - // An index is interiorly overlapped if the support of its overlapping neighbors is in the range [0,1<::SupportStart , end = (1<::SupportEnd; } - - typedef BSplineEvaluationData< Degree1 > EData1; - typedef BSplineEvaluationData< Degree2 > EData2; - BSPLINE_SET_BOUNDS( Overlap , EData1:: SupportStart - EData2::SupportEnd , EData1:: SupportEnd - EData2::SupportStart ); - BSPLINE_SET_BOUNDS( ChildOverlap , EData1::ChildSupportStart - EData2::SupportEnd , EData1::ChildSupportEnd - EData2::SupportStart ); - BSPLINE_SET_BOUNDS( OverlapSupport , OverlapStart + EData2::SupportStart , OverlapEnd + EData2::SupportEnd ); - BSPLINE_SET_BOUNDS( ChildOverlapSupport , ChildOverlapStart + EData2::SupportStart , ChildOverlapEnd + EData2::SupportEnd ); - - // Setting I=0/1, we are looking for the smallest/largest integers J such that: - // Support( 2*J ) * 2 INTERSECTION Support( 0/1 ) NON-EMPTY - // <=> [ 2*J - (Degree2+1-Inset2) , 2*J + (Degree2+1+Inset2) ] INTERSECTION [ 0/1 - (Degree1+1-Inset1)/2 , 0/1 + (Degree1+1+Inset1)/2 ] NON-EMPTY - // Which is the same as the smallest/largest integers J such that: - // 0/1 - (Degree1+1-Inset1)/2 < 2*J + (Degree2+1+Inset2) | 0/1 + (Degree1+1+Inset1)/2 > 2*J - (Degree2+1-Inset2) - // <=> 2*J > 0/1 - ( 2*Degree2 + Degree1 + 3 + 2*Inset2 - Inset1 ) / 2 | 2*J < 0/1 + ( 2*Degree2 + Degree1 + 3 - 2*Inset2 + Inset1 ) / 2 - BSPLINE_SET_BOUNDS( ParentOverlap0 , SMALLEST_INTEGER_LARGER_THAN_HALF( 0 - ( 2*Degree2 + Degree1 + 3 + 2*EData2::Inset - EData1::Inset ) / 2 ) , LARGEST_INTEGER_SMALLER_THAN_HALF( 0 + ( 2*Degree2 + Degree1 + 3 - 2*EData2::Inset + EData1::Inset ) / 2 ) ); - BSPLINE_SET_BOUNDS( ParentOverlap1 , SMALLEST_INTEGER_LARGER_THAN_HALF( 1 - ( 2*Degree2 + Degree1 + 3 + 2*EData2::Inset - EData1::Inset ) / 2 ) , LARGEST_INTEGER_SMALLER_THAN_HALF( 1 + ( 2*Degree2 + Degree1 + 3 - 2*EData2::Inset + EData1::Inset ) / 2 ) ); - static const int ParentOverlapStart[] , ParentOverlapEnd[] , ParentOverlapSize[]; - - struct FunctionIntegrator - { - static const int Start = - OverlapSupportStart , Stop = OverlapSupportEnd , Size = Start + Stop + 1; - static int Index( int depth , int offset ) - { - int dim = BSplineEvaluationData< Degree2 >::Dimension( depth ); - if ( offset=dim-Stop ) return Start + 1 + offset - ( dim-Stop ); - else return Start; - } - struct Integrator - { - protected: - friend class BSplineIntegrationData; - int _depth; - double _ccIntegrals[2][2][Size][OverlapSize]; - public: - Integrator() { // [Bruno] - _depth = 0; - memset(_ccIntegrals, 0, sizeof(_ccIntegrals)); - } - double dot( int fIdx1 , int fidx2 , bool d1 , bool d2 ) const; - int depth( void ) const { return _depth; } - }; - struct ChildIntegrator - { - protected: - friend class BSplineIntegrationData; - int _parentDepth; - double _pcIntegrals[2][2][Size][ChildOverlapSize]; - public: - ChildIntegrator() { // [Bruno] - _parentDepth = 0; - memset(_pcIntegrals, 0, sizeof(_pcIntegrals)); - } - double dot( int fIdx1 , int fidx2 , bool d1 , bool d2 ) const; - int parentDepth( void ) const { return _parentDepth; } - int childDepth( void ) const { return _parentDepth+1; } - }; - }; - static void SetIntegrator( typename FunctionIntegrator::Integrator& integrator , int depth , bool dirichlet1 , bool dirichlet2 ); - static void SetChildIntegrator( typename FunctionIntegrator::ChildIntegrator& integrator , int parentDepth , bool dirichlet1 , bool dirichlet2 ); -}; -template< int Degree1 , int Degree2 > const int BSplineIntegrationData< Degree1 , Degree2 >::ParentOverlapStart[] = { ParentOverlap0Start , ParentOverlap1Start }; -template< int Degree1 , int Degree2 > const int BSplineIntegrationData< Degree1 , Degree2 >::ParentOverlapEnd [] = { ParentOverlap0End , ParentOverlap1End }; -template< int Degree1 , int Degree2 > const int BSplineIntegrationData< Degree1 , Degree2 >::ParentOverlapSize [] = { ParentOverlap0Size , ParentOverlap1Size }; -#undef BSPLINE_SET_BOUNDS -#undef _FLOOR_OF_HALF -#undef _CEIL_OF_HALF -#undef FLOOR_OF_HALF -#undef CEIL_OF_HALF -#undef SMALLEST_INTEGER_LARGER_THAN_HALF -#undef LARGEST_INTEGER_SMALLER_THAN_HALF -#undef SMALLEST_INTEGER_LARGER_THAN_OR_EQUAL_TO_HALF -#undef LARGEST_INTEGER_SMALLER_THAN_OR_EQUAL_TO_HALF - -template< int Degree > -class BSplineData -{ - bool _dirichlet; -public: - - inline static int Centers ( int depth ){ return (1<0) ? TotalFunctionCount(depth-1) : 0 , fEnd = TotalFunctionCount(depth); } - inline static void SampleSpan( int depth , int& sStart , int& sEnd ){ sStart = (depth>0) ? TotalSampleCount(depth-1) : 0 , sEnd = TotalSampleCount(depth); } - - inline static int RemapOffset( int depth , int idx , bool& reflect ); - - int depth; - size_t functionCount , sampleCount; - Pointer( typename BSplineEvaluationData< Degree >::BSplineComponents ) baseBSplines; - - BSplineData( void ); - ~BSplineData( void ); - - void set( int maxDepth , bool dirichlet=false ); -}; - -template< int Degree1 , int Degree2 > void SetBSplineElementIntegrals( double integrals[Degree1+1][Degree2+1] ); - - -#include "BSplineData.inl" -#endif // BSPLINE_DATA_INCLUDED +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ + +#ifndef BSPLINE_DATA_INCLUDED +#define BSPLINE_DATA_INCLUDED + +#define NEW_BSPLINE_CODE 1 + +#include "BinaryNode.h" +#include "PPolynomial.h" +#include "Array.h" + +// This class represents a function that is a linear combination of B-spline elements, +// with the coeff member indicating how much of each element is present. +// [WARNING] The ordering of B-spline elements is in the opposite order from that returned by Polynomial::BSplineComponent +template< int Degree > +struct BSplineElementCoefficients +{ + int coeffs[Degree+1]; + BSplineElementCoefficients( void ){ memset( coeffs , 0 , sizeof( int ) * ( Degree+1 ) ); } + int& operator[]( int idx ){ return coeffs[idx]; } + const int& operator[]( int idx ) const { return coeffs[idx]; } +}; + +// This class represents a function on the the interval, partitioned into "res" blocks. +// On each block, the function is a degree-Degree polynomial, represented by the coefficients +// in the associated BSplineElementCoefficients. +// [NOTE] This representation of a function is agnostic to the type of boundary conditions (though the constructor is not). +template< int Degree > +struct BSplineElements : public std::vector< BSplineElementCoefficients< Degree > > +{ + static const bool _Primal = (Degree&1)==1; + static const int _Off = (Degree+1)/2; + static int _ReflectLeft ( int offset , int res ); + static int _ReflectRight( int offset , int res ); + static int _RotateLeft ( int offset , int res ); + static int _RotateRight ( int offset , int res ); + template< bool Left > void _addPeriodic( int offset , bool negate ); +public: + // Coefficients are ordered as "/" "-" "\" + // [WARNING] This is the opposite of the order in Polynomial::BSplineComponent + int denominator; + + BSplineElements( void ) { denominator = 1; } + BSplineElements( int res , int offset , bool dirichlet ); + + void upSample( BSplineElements& high ) const; + void differentiate( BSplineElements< Degree-1 >& d ) const; + + void print( FILE* fp=stdout ) const + { + for( int i=0 ; i >::size() ; i++ ) + { + printf( "%d]" , i ); + for( int j=0 ; j<=Degree ; j++ ) printf( " %d" , (*this)[i][j] ); + printf( " (%d)\n" , denominator ); + } + } +}; +#define BSPLINE_SET_BOUNDS( name , s , e ) \ + static const int name ## Start = (s); \ + static const int name ## End = (e); \ + static const int name ## Size = (e)-(s)+1 + +// Assumes that x is non-negative +#define _FLOOR_OF_HALF( x ) ( (x) >>1 ) +#define _CEIL_OF_HALF( x ) ( ( (x)+1 )>>1 ) +// Done with the assumption +#define FLOOR_OF_HALF( x ) ( (x)<0 ? - _CEIL_OF_HALF( -(x) ) : _FLOOR_OF_HALF( x ) ) +#define CEIL_OF_HALF( x ) ( (x)<0 ? - _FLOOR_OF_HALF( -(x) ) : _CEIL_OF_HALF( x ) ) +#define SMALLEST_INTEGER_LARGER_THAN_HALF( x ) ( CEIL_OF_HALF( (x)+1 ) ) +#define LARGEST_INTEGER_SMALLER_THAN_HALF( x ) ( FLOOR_OF_HALF( (x)-1 ) ) +#define SMALLEST_INTEGER_LARGER_THAN_OR_EQUAL_TO_HALF( x ) ( CEIL_OF_HALF( x ) ) +#define LARGEST_INTEGER_SMALLER_THAN_OR_EQUAL_TO_HALF( x ) ( FLOOR_OF_HALF( x ) ) + +template< int Degree > +class BSplineEvaluationData +{ +public: + BSplineEvaluationData( void ); + static double Value( int depth , int off , double s , bool dirichlet , bool derivative ); + + static int Dimension( int depth ){ return ( 1< [-(Degree+1-Inset) , (Degree+1+Inset) ] CONTAINS [ J-(Degree+1-Inset)/2 , J+(Degree+1+Inset)/2 ] + // Which is the same as the smallest/largest integers J such that: + // J - (Degree+1-Inset)/2 >= -(Degree+1-Inset) | J + (Degree+1+Inset)/2 <= (Degree+1+Inset) + // <=> J >= -(Degree+1-Inset)/2 | J <= (Degree+1+Inset)/2 + BSPLINE_SET_BOUNDS( UpSample , - ( Degree + 1 - Inset ) / 2 , ( Degree + 1 + Inset ) /2 ); + + // Setting I=0/1, we are looking for the smallest/largest integers J such that: + // Support( J ) CONTAINS Support( 0/1 ) + // <=> [ 2*J - (Degree+1-Inset) , 2*J + (Degree+1+Inset) ] CONTAINS [ 0/1 - (Degree+1-Inset)/2 , 0/1 + (Degree+1+Inset)/2 ] + // Which is the same as the smallest/largest integers J such that: + // 2*J + (Degree+1+Inset) >= 0/1 + (Degree+1+Inset)/2 | 2*J - (Degree+1-Inset) <= 0/1 - (Degree+1-Inset)/2 + // <=> 2*J >= 0/1 - (Degree+1+Inset)/2 | 2*J <= 0/1 + (Degree+1-Inset)/2 + BSPLINE_SET_BOUNDS( DownSample0 , SMALLEST_INTEGER_LARGER_THAN_OR_EQUAL_TO_HALF( 0 - ( Degree + 1 + Inset ) / 2 ) , LARGEST_INTEGER_SMALLER_THAN_OR_EQUAL_TO_HALF( 0 + ( Degree + 1 - Inset ) / 2 ) ); + BSPLINE_SET_BOUNDS( DownSample1 , SMALLEST_INTEGER_LARGER_THAN_OR_EQUAL_TO_HALF( 1 - ( Degree + 1 + Inset ) / 2 ) , LARGEST_INTEGER_SMALLER_THAN_OR_EQUAL_TO_HALF( 1 + ( Degree + 1 - Inset ) / 2 ) ); + static const int DownSampleStart[] , DownSampleEnd[] , DownSampleSize[]; + + // Note that this struct stores the components in left-to-right order + struct BSplineComponents + { + protected: + Polynomial< Degree > _polys[Degree+1]; + public: + BSplineComponents( void ){ ; } + BSplineComponents( int depth , int offset , bool dirichlet ); + const Polynomial< Degree >& operator[] ( int idx ) const { return _polys[idx]; } + void printnl( void ) const { for( int d=0 ; d<=Degree ; d++ ) printf( "[%d] " , d ) , _polys[d].printnl(); } + }; + struct BSplineUpSamplingCoefficients + { + protected: + int _coefficients[ UpSampleSize ]; + public: + BSplineUpSamplingCoefficients( void ){ ; } + BSplineUpSamplingCoefficients( int depth , int offset , bool dirichlet ); + double operator[] ( int idx ){ return (double)_coefficients[idx] / (1<::Dimension( depth ); + if ( offset=dim-Stop ) return Start + 1 + offset - ( dim-Stop ); + else return Start; + } + struct Evaluator + { + protected: + friend class BSplineEvaluationData; + int _depth; + double _ccValues[2][Size][SupportSize]; + public: + Evaluator() { // [Bruno] + _depth = 0; + memset(_ccValues, 0, sizeof(_ccValues)); + } + double value( int fIdx , int cIdx , bool d ) const; + int depth( void ) const { return _depth; } + }; + struct ChildEvaluator + { + protected: + friend class BSplineEvaluationData; + int _parentDepth; + double _pcValues[2][Size][ChildSupportSize]; + public: + ChildEvaluator() { // [Bruno] + _parentDepth = 0; + memset(_pcValues, 0, sizeof(_pcValues)); + } + double value( int fIdx , int cIdx , bool d ) const; + int parentDepth( void ) const { return _parentDepth; } + int childDepth( void ) const { return _parentDepth+1; } + }; + }; + static void SetCenterEvaluator( typename CenterEvaluator::Evaluator& evaluator , int depth , bool dirichlet ); + static void SetChildCenterEvaluator( typename CenterEvaluator::ChildEvaluator& evaluator , int parentDepth , bool dirichlet ); + + struct CornerEvaluator + { + static const int Start = -SupportStart , Stop = SupportEnd , Size = Start + Stop + 1; + + static int Index( int depth , int offset ) + { + int dim = BSplineEvaluationData< Degree >::Dimension( depth ); + if ( offset=dim-Stop ) return Start + 1 + offset - ( dim-Stop ); + else return Start; + } + struct Evaluator + { + protected: + friend class BSplineEvaluationData; + int _depth; + double _ccValues[2][Size][CornerSize]; + public: + Evaluator() { //[Bruno] + _depth = 0; + memset(_ccValues, 0, sizeof(_ccValues)); + } + double value( int fIdx , int cIdx , bool d ) const; + int depth( void ) const { return _depth; } + }; + struct ChildEvaluator + { + protected: + friend class BSplineEvaluationData; + int _parentDepth; + double _pcValues[2][Size][ChildCornerSize]; + public: + ChildEvaluator() { //[Bruno] + _parentDepth = 0; + memset(_pcValues, 0, sizeof(_pcValues)); + } + double value( int fIdx , int cIdx , bool d ) const; + int parentDepth( void ) const { return _parentDepth; } + int childDepth( void ) const { return _parentDepth+1; } + }; + }; + static void SetCornerEvaluator( typename CornerEvaluator::Evaluator& evaluator , int depth , bool dirichlet ); + static void SetChildCornerEvaluator( typename CornerEvaluator::ChildEvaluator& evaluator , int parentDepth , bool dirichlet ); + + struct Evaluator + { + typename CenterEvaluator::Evaluator centerEvaluator; + typename CornerEvaluator::Evaluator cornerEvaluator; + double centerValue( int fIdx , int cIdx , bool d ) const { return centerEvaluator.value( fIdx , cIdx , d ); } + double cornerValue( int fIdx , int cIdx , bool d ) const { return cornerEvaluator.value( fIdx , cIdx , d ); } + }; + static void SetEvaluator( Evaluator& evaluator , int depth , bool dirichlet ){ SetCenterEvaluator( evaluator.centerEvaluator , depth , dirichlet ) , SetCornerEvaluator( evaluator.cornerEvaluator , depth , dirichlet ); } + struct ChildEvaluator + { + typename CenterEvaluator::ChildEvaluator centerEvaluator; + typename CornerEvaluator::ChildEvaluator cornerEvaluator; + double centerValue( int fIdx , int cIdx , bool d ) const { return centerEvaluator.value( fIdx , cIdx , d ); } + double cornerValue( int fIdx , int cIdx , bool d ) const { return cornerEvaluator.value( fIdx , cIdx , d ); } + }; + static void SetChildEvaluator( ChildEvaluator& evaluator , int depth , bool dirichlet ){ SetChildCenterEvaluator( evaluator.centerEvaluator , depth , dirichlet ) , SetChildCornerEvaluator( evaluator.cornerEvaluator , depth , dirichlet ); } + + struct UpSampleEvaluator + { + static const int Start = - SupportStart , Stop = SupportEnd , Size = Start + Stop + 1; + static int Index( int depth , int offset ) + { + int dim = BSplineEvaluationData< Degree >::Dimension( depth ); + if ( offset=dim-Stop ) return Start + 1 + offset - ( dim-Stop ); + else return Start; + } + protected: + friend class BSplineEvaluationData; + int _lowDepth; + double _pcValues[Size][UpSampleSize]; + public: + UpSampleEvaluator() { // [Bruno] + _lowDepth = 0; + memset(_pcValues, 0, sizeof(_pcValues)); + } + double value( int pIdx , int cIdx ) const; + int lowDepth( void ) const { return _lowDepth; } + }; + static void SetUpSampleEvaluator( UpSampleEvaluator& evaluator , int lowDepth , bool dirichlet ); +}; +template< int Degree > const int BSplineEvaluationData< Degree >::DownSampleStart[] = { DownSample0Start , DownSample1Start }; +template< int Degree > const int BSplineEvaluationData< Degree >::DownSampleEnd [] = { DownSample0End , DownSample1End }; +template< int Degree > const int BSplineEvaluationData< Degree >::DownSampleSize [] = { DownSample0Size , DownSample1Size }; + +template< int Degree1 , int Degree2 > +class BSplineIntegrationData +{ +public: + static double Dot( int depth1 , int off1 , bool dirichlet1 , bool d1 , int depth2 , int off2 , bool dirichlet2 , bool d2 ); + // An index is interiorly overlapped if the support of its overlapping neighbors is in the range [0,1<::SupportStart , end = (1<::SupportEnd; } + + typedef BSplineEvaluationData< Degree1 > EData1; + typedef BSplineEvaluationData< Degree2 > EData2; + BSPLINE_SET_BOUNDS( Overlap , EData1:: SupportStart - EData2::SupportEnd , EData1:: SupportEnd - EData2::SupportStart ); + BSPLINE_SET_BOUNDS( ChildOverlap , EData1::ChildSupportStart - EData2::SupportEnd , EData1::ChildSupportEnd - EData2::SupportStart ); + BSPLINE_SET_BOUNDS( OverlapSupport , OverlapStart + EData2::SupportStart , OverlapEnd + EData2::SupportEnd ); + BSPLINE_SET_BOUNDS( ChildOverlapSupport , ChildOverlapStart + EData2::SupportStart , ChildOverlapEnd + EData2::SupportEnd ); + + // Setting I=0/1, we are looking for the smallest/largest integers J such that: + // Support( 2*J ) * 2 INTERSECTION Support( 0/1 ) NON-EMPTY + // <=> [ 2*J - (Degree2+1-Inset2) , 2*J + (Degree2+1+Inset2) ] INTERSECTION [ 0/1 - (Degree1+1-Inset1)/2 , 0/1 + (Degree1+1+Inset1)/2 ] NON-EMPTY + // Which is the same as the smallest/largest integers J such that: + // 0/1 - (Degree1+1-Inset1)/2 < 2*J + (Degree2+1+Inset2) | 0/1 + (Degree1+1+Inset1)/2 > 2*J - (Degree2+1-Inset2) + // <=> 2*J > 0/1 - ( 2*Degree2 + Degree1 + 3 + 2*Inset2 - Inset1 ) / 2 | 2*J < 0/1 + ( 2*Degree2 + Degree1 + 3 - 2*Inset2 + Inset1 ) / 2 + BSPLINE_SET_BOUNDS( ParentOverlap0 , SMALLEST_INTEGER_LARGER_THAN_HALF( 0 - ( 2*Degree2 + Degree1 + 3 + 2*EData2::Inset - EData1::Inset ) / 2 ) , LARGEST_INTEGER_SMALLER_THAN_HALF( 0 + ( 2*Degree2 + Degree1 + 3 - 2*EData2::Inset + EData1::Inset ) / 2 ) ); + BSPLINE_SET_BOUNDS( ParentOverlap1 , SMALLEST_INTEGER_LARGER_THAN_HALF( 1 - ( 2*Degree2 + Degree1 + 3 + 2*EData2::Inset - EData1::Inset ) / 2 ) , LARGEST_INTEGER_SMALLER_THAN_HALF( 1 + ( 2*Degree2 + Degree1 + 3 - 2*EData2::Inset + EData1::Inset ) / 2 ) ); + static const int ParentOverlapStart[] , ParentOverlapEnd[] , ParentOverlapSize[]; + + struct FunctionIntegrator + { + static const int Start = - OverlapSupportStart , Stop = OverlapSupportEnd , Size = Start + Stop + 1; + static int Index( int depth , int offset ) + { + int dim = BSplineEvaluationData< Degree2 >::Dimension( depth ); + if ( offset=dim-Stop ) return Start + 1 + offset - ( dim-Stop ); + else return Start; + } + struct Integrator + { + protected: + friend class BSplineIntegrationData; + int _depth; + double _ccIntegrals[2][2][Size][OverlapSize]; + public: + Integrator() { // [Bruno] + _depth = 0; + memset(_ccIntegrals, 0, sizeof(_ccIntegrals)); + } + double dot( int fIdx1 , int fidx2 , bool d1 , bool d2 ) const; + int depth( void ) const { return _depth; } + }; + struct ChildIntegrator + { + protected: + friend class BSplineIntegrationData; + int _parentDepth; + double _pcIntegrals[2][2][Size][ChildOverlapSize]; + public: + ChildIntegrator() { // [Bruno] + _parentDepth = 0; + memset(_pcIntegrals, 0, sizeof(_pcIntegrals)); + } + double dot( int fIdx1 , int fidx2 , bool d1 , bool d2 ) const; + int parentDepth( void ) const { return _parentDepth; } + int childDepth( void ) const { return _parentDepth+1; } + }; + }; + static void SetIntegrator( typename FunctionIntegrator::Integrator& integrator , int depth , bool dirichlet1 , bool dirichlet2 ); + static void SetChildIntegrator( typename FunctionIntegrator::ChildIntegrator& integrator , int parentDepth , bool dirichlet1 , bool dirichlet2 ); +}; +template< int Degree1 , int Degree2 > const int BSplineIntegrationData< Degree1 , Degree2 >::ParentOverlapStart[] = { ParentOverlap0Start , ParentOverlap1Start }; +template< int Degree1 , int Degree2 > const int BSplineIntegrationData< Degree1 , Degree2 >::ParentOverlapEnd [] = { ParentOverlap0End , ParentOverlap1End }; +template< int Degree1 , int Degree2 > const int BSplineIntegrationData< Degree1 , Degree2 >::ParentOverlapSize [] = { ParentOverlap0Size , ParentOverlap1Size }; +#undef BSPLINE_SET_BOUNDS +#undef _FLOOR_OF_HALF +#undef _CEIL_OF_HALF +#undef FLOOR_OF_HALF +#undef CEIL_OF_HALF +#undef SMALLEST_INTEGER_LARGER_THAN_HALF +#undef LARGEST_INTEGER_SMALLER_THAN_HALF +#undef SMALLEST_INTEGER_LARGER_THAN_OR_EQUAL_TO_HALF +#undef LARGEST_INTEGER_SMALLER_THAN_OR_EQUAL_TO_HALF + +template< int Degree > +class BSplineData +{ + bool _dirichlet; +public: + + inline static int Centers ( int depth ){ return (1<0) ? TotalFunctionCount(depth-1) : 0 , fEnd = TotalFunctionCount(depth); } + inline static void SampleSpan( int depth , int& sStart , int& sEnd ){ sStart = (depth>0) ? TotalSampleCount(depth-1) : 0 , sEnd = TotalSampleCount(depth); } + + inline static int RemapOffset( int depth , int idx , bool& reflect ); + + int depth; + size_t functionCount , sampleCount; + Pointer( typename BSplineEvaluationData< Degree >::BSplineComponents ) baseBSplines; + + BSplineData( void ); + ~BSplineData( void ); + + void set( int maxDepth , bool dirichlet=false ); +}; + +template< int Degree1 , int Degree2 > void SetBSplineElementIntegrals( double integrals[Degree1+1][Degree2+1] ); + + +#include "BSplineData.inl" +#endif // BSPLINE_DATA_INCLUDED diff --git a/src/lib/geogram/third_party/PoissonRecon/BSplineData.inl b/src/lib/geogram/third_party/PoissonRecon/BSplineData.inl old mode 100755 new mode 100644 index 4dbaf82f..90675b8c --- a/src/lib/geogram/third_party/PoissonRecon/BSplineData.inl +++ b/src/lib/geogram/third_party/PoissonRecon/BSplineData.inl @@ -1,480 +1,480 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - -/////////////////////////// -// BSplineEvaluationData // -/////////////////////////// -template< int Degree > -double BSplineEvaluationData< Degree >::Value( int depth , int off , double s , bool dirichlet , bool derivative ) -{ - if( s<0 || s>1 ) return 0.; - - int dim = Dimension(depth) , res = 1<=dim ) return 0; - - BSplineComponents components = BSplineComponents( depth , off , dirichlet ); - - // [NOTE] This is an ugly way to ensure that when s=1 we evaluate using a B-Spline component within the valid range. - int ii = std::max< int >( 0 , std::min< int >( res-1 , (int)floor( s * res ) ) ) - off; - - if( iiSupportEnd ) return 0; - if( derivative ) return components[ii-SupportStart].derivative()(s); - else return components[ii-SupportStart](s); -} -template< int Degree > -void BSplineEvaluationData< Degree >::SetCenterEvaluator( typename CenterEvaluator::Evaluator& evaluator , int depth , bool dirichlet ) -{ - evaluator._depth = depth; - int dim = BSplineEvaluationData< Degree >::Dimension( depth ) , res = 1< -void BSplineEvaluationData< Degree >::SetChildCenterEvaluator( typename CenterEvaluator::ChildEvaluator& evaluator , int parentDepth , bool dirichlet ) -{ - evaluator._parentDepth = parentDepth; - int dim = BSplineEvaluationData< Degree >::Dimension( parentDepth ) , res = 1<<(parentDepth+1); - for( int i=0 ; i -double BSplineEvaluationData< Degree >::CenterEvaluator::Evaluator::value( int fIdx , int cIdx , bool d ) const -{ - int dd = cIdx-fIdx , res = 1<<(_depth) , dim = Dimension(_depth); - if( cIdx<0 || fIdx<0 || cIdx>=res || fIdx>=dim || ddSupportEnd ) return 0; - return _ccValues[d?1:0][ CenterEvaluator::Index( _depth , fIdx ) ][dd-SupportStart]; -} -template< int Degree > -double BSplineEvaluationData< Degree >::CenterEvaluator::ChildEvaluator::value( int fIdx , int cIdx , bool d ) const -{ - int dd = cIdx-2*fIdx , res = 1<<(_parentDepth+1) , dim = Dimension(_parentDepth); - if( cIdx<0 || fIdx<0 || cIdx>=res || fIdx>=dim || ddChildSupportEnd ) return 0; - return _pcValues[d?1:0][ CenterEvaluator::Index( _parentDepth , fIdx ) ][dd-ChildSupportStart]; -} -template< int Degree > -void BSplineEvaluationData< Degree >::SetCornerEvaluator( typename CornerEvaluator::Evaluator& evaluator , int depth , bool dirichlet ) -{ - evaluator._depth = depth; - int dim = BSplineEvaluationData< Degree >::Dimension( depth ) , res = 1< -void BSplineEvaluationData< Degree >::SetChildCornerEvaluator( typename CornerEvaluator::ChildEvaluator& evaluator , int parentDepth , bool dirichlet ) -{ - evaluator._parentDepth = parentDepth; - int dim = BSplineEvaluationData< Degree >::Dimension( parentDepth ) , res = 1<<(parentDepth+1); - for( int i=0 ; i -void BSplineEvaluationData< Degree >::SetUpSampleEvaluator( UpSampleEvaluator& evaluator , int lowDepth , bool dirichlet ) -{ - evaluator._lowDepth = lowDepth; - int lowDim = Dimension(lowDepth); - for( int i=0 ; i -double BSplineEvaluationData< Degree >::CornerEvaluator::Evaluator::value( int fIdx , int cIdx , bool d ) const -{ - int dd = cIdx-fIdx , res = ( 1<<_depth ) + 1 , dim = Dimension(_depth); - if( cIdx<0 || fIdx<0 || cIdx>=res || fIdx>=dim || ddCornerEnd ) return 0; - return _ccValues[d?1:0][ CornerEvaluator::Index( _depth , fIdx ) ][dd-CornerStart]; -} -template< int Degree > -double BSplineEvaluationData< Degree >::CornerEvaluator::ChildEvaluator::value( int fIdx , int cIdx , bool d ) const -{ - int dd = cIdx-2*fIdx , res = ( 1<<(_parentDepth+1) ) + 1 , dim = Dimension(_parentDepth); - if( cIdx<0 || fIdx<0 || cIdx>=res || fIdx>=dim || ddChildCornerEnd ) return 0; - return _pcValues[d?1:0][ CornerEvaluator::Index( _parentDepth , fIdx ) ][dd-ChildCornerStart]; -} -template< int Degree > -double BSplineEvaluationData< Degree >::UpSampleEvaluator::value( int pIdx , int cIdx ) const -{ - int dd = cIdx-2*pIdx , pDim = Dimension( _lowDepth ) , cDim = Dimension( _lowDepth+1 ); - if( cIdx<0 || pIdx<0 || cIdx>=cDim || pIdx>=pDim || ddUpSampleEnd ) return 0; - return _pcValues[ UpSampleEvaluator::Index( _lowDepth , pIdx ) ][dd-UpSampleStart]; -} - -////////////////////////////////////////////// -// BSplineEvaluationData::BSplineComponents // -////////////////////////////////////////////// -template< int Degree > -BSplineEvaluationData< Degree >::BSplineComponents::BSplineComponents( int depth , int offset , bool dirichlet ) -{ - int res = 1< elements( res , offset , dirichlet ); - - // The first index is the position, the second is the element type - Polynomial< Degree > components[Degree+1][Degree+1]; - // Generate the elements that can appear in the base function corresponding to the base function at (depth,offset) = (0,0) - for( int d=0 ; d<=Degree ; d++ ) for( int dd=0 ; dd<=Degree ; dd++ ) components[d][dd] = Polynomial< Degree >::BSplineComponent( Degree-dd ).shift( -( (Degree+1)/2 ) + d ); - - // Now adjust to the desired depth and offset - double width = 1. / res; - for( int d=0 ; d<=Degree ; d++ ) for( int dd=0 ; dd<=Degree ; dd++ ) components[d][dd] = components[d][dd].scale( width ).shift( width*offset ); - - // Now write in the polynomials - for( int d=0 ; d<=Degree ; d++ ) - { - int idx = offset + SupportStart + d; - _polys[d] = Polynomial< Degree >(); - - if( idx>=0 && idx -BSplineEvaluationData< Degree >::BSplineUpSamplingCoefficients::BSplineUpSamplingCoefficients( int depth , int offset , bool dirichlet ) -{ - // [ 1/8 1/2 3/4 1/2 1/8] - // [ 1 , 1 ] -> [ 3/4 , 1/2 , 1/8 ] + [ 1/8 , 1/2 , 3/4 ] = [ 7/8 , 1 , 7/8 ] - int dim = Dimension(depth) , _dim = Dimension(depth+1); - bool reflect; - offset = BSplineData< Degree >::RemapOffset( depth , offset , reflect ); - int multiplier = ( dirichlet && reflect ) ? -1 : 1; - bool useReflected = Inset || ( offset % ( dim-1 ) ); - int b[ UpSampleSize ]; - Polynomial< Degree+1 >::BinomialCoefficients( b ); - - // Clear the values - memset( _coefficients , 0 , sizeof(int) * UpSampleSize ); - - // Get the array of coefficients, relative to the origin - int* coefficients = _coefficients - ( 2*offset + UpSampleStart ); - for( int i=UpSampleStart ; i<=UpSampleEnd ; i++ ) - { - int _offset = 2*offset+i; - _offset = BSplineData< Degree >::RemapOffset( depth+1 , _offset , reflect ); - if( useReflected || !reflect ) - { - int _multiplier = multiplier * ( ( dirichlet && reflect ) ? -1 : 1 ); - coefficients[ _offset ] += b[ i-UpSampleStart ] * _multiplier; - } - // If we are not inset and we are at the boundary, use the reflection as well - if( !Inset && ( offset % (dim-1) ) && !( _offset % (_dim-1) ) ) - { - _offset = BSplineData< Degree >::RemapOffset( depth+1 , _offset , reflect ); - int _multiplier = multiplier * ( ( dirichlet && reflect ) ? -1 : 1 ); - if( dirichlet ) _multiplier *= -1; - coefficients[ _offset ] += b[ i-UpSampleStart ] * _multiplier; - } - } -} - -//////////////////////////// -// BSplineIntegrationData // -//////////////////////////// -template< int Degree1 , int Degree2 > -double BSplineIntegrationData< Degree1 , Degree2 >::Dot( int depth1 , int off1 , bool dirichlet1 , bool d1 , int depth2 , int off2 , bool dirichlet2 , bool d2 ) -{ - const int _Degree1 = (d1 ? (Degree1-1) : Degree1) , _Degree2 = (d2 ? (Degree2-1) : Degree2); - int sums[ Degree1+1 ][ Degree2+1 ]; - - int depth = std::max< int >( depth1 , depth2 ); - - BSplineElements< Degree1 > b1( 1< b2( 1< b; - while( depth1 b; - while( depth2 db1; - BSplineElements< Degree2-1 > db2; - b1.differentiate( db1 ) , b2.differentiate( db2 ); - - int start1=-1 , end1=-1 , start2=-1 , end2=-1; - for( int i=0 ; i=end2 || start2>=end1 ) return 0.; - int start = std::max< int >( start1 , start2 ) , end = std::min< int >( end1 , end2 ); - memset( sums , 0 , sizeof( sums ) ); - - // Iterate over the support - for( int i=start ; i( integrals ); - for( int j=0 ; j<=_Degree1 ; j++ ) for( int k=0 ; k<=_Degree2 ; k++ ) _dot += integrals[j][k] * sums[j][k]; - } - else if( d1 ) - { - double integrals[ Degree1 ][ Degree2+1 ]; - SetBSplineElementIntegrals< Degree1-1 , Degree2 >( integrals ); - for( int j=0 ; j<=_Degree1 ; j++ ) for( int k=0 ; k<=_Degree2 ; k++ ) _dot += integrals[j][k] * sums[j][k]; - } - else if( d2 ) - { - double integrals[ Degree1+1 ][ Degree2 ]; - SetBSplineElementIntegrals< Degree1 , Degree2-1 >( integrals ); - for( int j=0 ; j<=_Degree1 ; j++ ) for( int k=0 ; k<=_Degree2 ; k++ ) _dot += integrals[j][k] * sums[j][k]; - } - else - { - double integrals[ Degree1+1 ][ Degree2+1 ]; - SetBSplineElementIntegrals< Degree1 , Degree2 >( integrals ); - for( int j=0 ; j<=_Degree1 ; j++ ) for( int k=0 ; k<=_Degree2 ; k++ ) _dot += integrals[j][k] * sums[j][k]; - } - - _dot /= b1.denominator; - _dot /= b2.denominator; - if ( d1 && d2 ) return _dot * (1< -void BSplineIntegrationData< Degree1, Degree2 >::SetIntegrator( typename FunctionIntegrator::Integrator& integrator , int depth , bool dirichlet1 , bool dirichlet2 ) -{ - integrator._depth = depth; - int dim = BSplineEvaluationData< Degree2 >::Dimension( depth ); - for( int i=0 ; i -void BSplineIntegrationData< Degree1, Degree2 >::SetChildIntegrator( typename FunctionIntegrator::ChildIntegrator& integrator , int parentDepth , bool dirichlet1 , bool dirichlet2 ) -{ - integrator._parentDepth = parentDepth; - int dim = BSplineEvaluationData< Degree2 >::Dimension( parentDepth ); - for( int i=0 ; i -double BSplineIntegrationData< Degree1 , Degree2 >::FunctionIntegrator::Integrator::dot( int off1 , int off2 , bool d1 , bool d2 ) const -{ - int d = off2-off1 , dim1 = BSplineEvaluationData< Degree1 >::Dimension( _depth ) , dim2 = BSplineEvaluationData< Degree2 >::Dimension( _depth ); - if( off1<0 || off2<0 || off1>=dim1 || off2>=dim2 || dOverlapEnd ) return 0; - return _ccIntegrals[d1?1:0][d2?1:0][ FunctionIntegrator::Index( _depth , off1 ) ][d-OverlapStart]; -} -template< int Degree1 , int Degree2 > -double BSplineIntegrationData< Degree1 , Degree2 >::FunctionIntegrator::ChildIntegrator::dot( int off1 , int off2 , bool d1 , bool d2 ) const -{ - int d = off2-2*off1 , dim1 = BSplineEvaluationData< Degree1 >::Dimension( _parentDepth ) , dim2 = BSplineEvaluationData< Degree2 >::Dimension( _parentDepth+1 ); - if( off1<0 || off2<0 || off1>=dim1 || off2>=dim2 || dChildOverlapEnd ) return 0; - return _pcIntegrals[d1?1:0][d2?1:0][ FunctionIntegrator::Index( _parentDepth , off1 ) ][d-ChildOverlapStart]; -} -///////////////// -// BSplineData // -///////////////// -#define MODULO( A , B ) ( (A)<0 ? ( (B)-((-(A))%(B)) ) % (B) : (A) % (B) ) -template< int Degree > -int BSplineData< Degree >::RemapOffset( int depth , int offset , bool& reflect ) -{ - const int I = ( Degree&1 ) ? 0 : 1; - int dim = Dimension( depth ); - offset = MODULO( offset , 2*(dim-1+I) ); - reflect = offset>=dim; - if( reflect ) return 2*(dim-1+I) - (offset+I); - else return offset; -} -#undef MODULO - -template< int Degree > BSplineData< Degree >::BSplineData( void ){ - functionCount = sampleCount = 0; - baseBSplines = NullPointer(typename BSplineEvaluationData< Degree >::BSplineComponents); // [Bruno] -} - -template< int Degree > BSplineData< Degree >::~BSplineData( void ){ - DeletePointer(baseBSplines); // [Bruno] -} - -template< int Degree > -void BSplineData< Degree >::set( int maxDepth , bool dirichlet ) -{ - _dirichlet = dirichlet; - - depth = maxDepth; - functionCount = TotalFunctionCount( depth ); - sampleCount = TotalSampleCount( depth ); - baseBSplines = NewPointer< typename BSplineEvaluationData< Degree >::BSplineComponents >( functionCount ); - - for( size_t i=0 ; i::BSplineComponents( d , off , _dirichlet ); - } -} - -///////////////////// -// BSplineElements // -///////////////////// -template< int Degree > -BSplineElements< Degree >::BSplineElements( int res , int offset , bool dirichlet ) -{ - denominator = 1; - std::vector< BSplineElementCoefficients< Degree > >::resize( res , BSplineElementCoefficients< Degree >() ); - - // If we have primal dirichlet constraints, the boundary functions are necessarily zero - if( _Primal && dirichlet && !(offset%res) ) return; - - // Construct the B-Spline - for( int i=0 ; i<=Degree ; i++ ) - { - int idx = -_Off + offset + i; - if( idx>=0 && idx( _RotateLeft ( offset , res ) , false ) , _addPeriodic< false >( _RotateRight( offset , res ) , false ); - - // Recursively fold in the boundaries - if( _Primal && !(offset%res) ) return; - - // Fold in the reflected instance (which may require negation) - _addPeriodic< true >( _ReflectLeft( offset , res ) , dirichlet ) , _addPeriodic< false >( _ReflectRight( offset , res ) , dirichlet ); -} -template< int Degree > int BSplineElements< Degree >::_ReflectLeft ( int offset , int res ){ return (Degree&1) ? -offset : -1-offset; } -template< int Degree > int BSplineElements< Degree >::_ReflectRight( int offset , int res ){ return (Degree&1) ? 2*res-offset : 2*res-1-offset; } -template< int Degree > int BSplineElements< Degree >::_RotateLeft ( int offset , int res ){ return offset-2*res; } -template< int Degree > int BSplineElements< Degree >::_RotateRight ( int offset , int res ){ return offset+2*res; } - -template< int Degree > -template< bool Left > -void BSplineElements< Degree >::_addPeriodic( int offset , bool negate ) -{ - int res = int( std::vector< BSplineElementCoefficients< Degree > >::size() ); - bool set = false; - // Add in the corresponding B-spline elements (possibly negated) - for( int i=0 ; i<=Degree ; i++ ) - { - int idx = -_Off + offset + i; - if( idx>=0 && idx( Left ? _RotateLeft( offset , res ) : _RotateRight( offset , res ) , negate ); -} -template< int Degree > -void BSplineElements< Degree >::upSample( BSplineElements< Degree >& high ) const -{ - int bCoefficients[ BSplineEvaluationData< Degree >::UpSampleSize ]; - Polynomial< Degree+1 >::BinomialCoefficients( bCoefficients ); - - high.resize( std::vector< BSplineElementCoefficients< Degree > >::size()*2 ); - high.assign( high.size() , BSplineElementCoefficients< Degree >() ); - // [NOTE] We have flipped the order of the B-spline elements - for( int i=0 ; i >::size()) ; i++ ) for( int j=0 ; j<=Degree ; j++ ) - { - // At index I , B-spline element J corresponds to a B-spline centered at: - // I - SupportStart - J - int idx = i - BSplineEvaluationData< Degree >::SupportStart - j; - for( int k=BSplineEvaluationData< Degree >::UpSampleStart ; k<=BSplineEvaluationData< Degree >::UpSampleEnd ; k++ ) - { - // Index idx at the coarser resolution gets up-sampled into indices: - // 2*idx + [UpSampleStart,UpSampleEnd] - // at the finer resolution - int _idx = 2*idx + k; - // Compute the index of the B-spline element relative to 2*i and 2*i+1 - int _j1 = -_idx + 2*i - BSplineEvaluationData< Degree >::SupportStart , _j2 = -_idx + 2*i + 1 - BSplineEvaluationData< Degree >::SupportStart; - if( _j1>=0 && _j1<=Degree ) high[2*i+0][_j1] += (*this)[i][j] * bCoefficients[k-BSplineEvaluationData< Degree >::UpSampleStart]; - if( _j2>=0 && _j2<=Degree ) high[2*i+1][_j2] += (*this)[i][j] * bCoefficients[k-BSplineEvaluationData< Degree >::UpSampleStart]; - } - } - high.denominator = denominator< -void BSplineElements< Degree >::differentiate( BSplineElements< Degree-1 >& d ) const -{ - d.resize( std::vector< BSplineElementCoefficients< Degree > >::size() ); - d.assign( d.size() , BSplineElementCoefficients< Degree-1 >() ); - for( int i=0 ; i >::size()) ; i++ ) for( int j=0 ; j<=Degree ; j++ ) - { - if( j-1>=0 ) d[i][j-1] -= (*this)[i][j]; - if( j -void SetBSplineElementIntegrals( double integrals[Degree1+1][Degree2+1] ) -{ - for( int i=0 ; i<=Degree1 ; i++ ) - { - Polynomial< Degree1 > p1 = Polynomial< Degree1 >::BSplineComponent( Degree1-i ); - for( int j=0 ; j<=Degree2 ; j++ ) - { - Polynomial< Degree2 > p2 = Polynomial< Degree2 >::BSplineComponent( Degree2-j ); - integrals[i][j] = ( p1 * p2 ).integral( 0 , 1 ); - } - } -} +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ + +/////////////////////////// +// BSplineEvaluationData // +/////////////////////////// +template< int Degree > +double BSplineEvaluationData< Degree >::Value( int depth , int off , double s , bool dirichlet , bool derivative ) +{ + if( s<0 || s>1 ) return 0.; + + int dim = Dimension(depth) , res = 1<=dim ) return 0; + + BSplineComponents components = BSplineComponents( depth , off , dirichlet ); + + // [NOTE] This is an ugly way to ensure that when s=1 we evaluate using a B-Spline component within the valid range. + int ii = std::max< int >( 0 , std::min< int >( res-1 , (int)floor( s * res ) ) ) - off; + + if( iiSupportEnd ) return 0; + if( derivative ) return components[ii-SupportStart].derivative()(s); + else return components[ii-SupportStart](s); +} +template< int Degree > +void BSplineEvaluationData< Degree >::SetCenterEvaluator( typename CenterEvaluator::Evaluator& evaluator , int depth , bool dirichlet ) +{ + evaluator._depth = depth; + int dim = BSplineEvaluationData< Degree >::Dimension( depth ) , res = 1< +void BSplineEvaluationData< Degree >::SetChildCenterEvaluator( typename CenterEvaluator::ChildEvaluator& evaluator , int parentDepth , bool dirichlet ) +{ + evaluator._parentDepth = parentDepth; + int dim = BSplineEvaluationData< Degree >::Dimension( parentDepth ) , res = 1<<(parentDepth+1); + for( int i=0 ; i +double BSplineEvaluationData< Degree >::CenterEvaluator::Evaluator::value( int fIdx , int cIdx , bool d ) const +{ + int dd = cIdx-fIdx , res = 1<<(_depth) , dim = Dimension(_depth); + if( cIdx<0 || fIdx<0 || cIdx>=res || fIdx>=dim || ddSupportEnd ) return 0; + return _ccValues[d?1:0][ CenterEvaluator::Index( _depth , fIdx ) ][dd-SupportStart]; +} +template< int Degree > +double BSplineEvaluationData< Degree >::CenterEvaluator::ChildEvaluator::value( int fIdx , int cIdx , bool d ) const +{ + int dd = cIdx-2*fIdx , res = 1<<(_parentDepth+1) , dim = Dimension(_parentDepth); + if( cIdx<0 || fIdx<0 || cIdx>=res || fIdx>=dim || ddChildSupportEnd ) return 0; + return _pcValues[d?1:0][ CenterEvaluator::Index( _parentDepth , fIdx ) ][dd-ChildSupportStart]; +} +template< int Degree > +void BSplineEvaluationData< Degree >::SetCornerEvaluator( typename CornerEvaluator::Evaluator& evaluator , int depth , bool dirichlet ) +{ + evaluator._depth = depth; + int dim = BSplineEvaluationData< Degree >::Dimension( depth ) , res = 1< +void BSplineEvaluationData< Degree >::SetChildCornerEvaluator( typename CornerEvaluator::ChildEvaluator& evaluator , int parentDepth , bool dirichlet ) +{ + evaluator._parentDepth = parentDepth; + int dim = BSplineEvaluationData< Degree >::Dimension( parentDepth ) , res = 1<<(parentDepth+1); + for( int i=0 ; i +void BSplineEvaluationData< Degree >::SetUpSampleEvaluator( UpSampleEvaluator& evaluator , int lowDepth , bool dirichlet ) +{ + evaluator._lowDepth = lowDepth; + int lowDim = Dimension(lowDepth); + for( int i=0 ; i +double BSplineEvaluationData< Degree >::CornerEvaluator::Evaluator::value( int fIdx , int cIdx , bool d ) const +{ + int dd = cIdx-fIdx , res = ( 1<<_depth ) + 1 , dim = Dimension(_depth); + if( cIdx<0 || fIdx<0 || cIdx>=res || fIdx>=dim || ddCornerEnd ) return 0; + return _ccValues[d?1:0][ CornerEvaluator::Index( _depth , fIdx ) ][dd-CornerStart]; +} +template< int Degree > +double BSplineEvaluationData< Degree >::CornerEvaluator::ChildEvaluator::value( int fIdx , int cIdx , bool d ) const +{ + int dd = cIdx-2*fIdx , res = ( 1<<(_parentDepth+1) ) + 1 , dim = Dimension(_parentDepth); + if( cIdx<0 || fIdx<0 || cIdx>=res || fIdx>=dim || ddChildCornerEnd ) return 0; + return _pcValues[d?1:0][ CornerEvaluator::Index( _parentDepth , fIdx ) ][dd-ChildCornerStart]; +} +template< int Degree > +double BSplineEvaluationData< Degree >::UpSampleEvaluator::value( int pIdx , int cIdx ) const +{ + int dd = cIdx-2*pIdx , pDim = Dimension( _lowDepth ) , cDim = Dimension( _lowDepth+1 ); + if( cIdx<0 || pIdx<0 || cIdx>=cDim || pIdx>=pDim || ddUpSampleEnd ) return 0; + return _pcValues[ UpSampleEvaluator::Index( _lowDepth , pIdx ) ][dd-UpSampleStart]; +} + +////////////////////////////////////////////// +// BSplineEvaluationData::BSplineComponents // +////////////////////////////////////////////// +template< int Degree > +BSplineEvaluationData< Degree >::BSplineComponents::BSplineComponents( int depth , int offset , bool dirichlet ) +{ + int res = 1< elements( res , offset , dirichlet ); + + // The first index is the position, the second is the element type + Polynomial< Degree > components[Degree+1][Degree+1]; + // Generate the elements that can appear in the base function corresponding to the base function at (depth,offset) = (0,0) + for( int d=0 ; d<=Degree ; d++ ) for( int dd=0 ; dd<=Degree ; dd++ ) components[d][dd] = Polynomial< Degree >::BSplineComponent( Degree-dd ).shift( -( (Degree+1)/2 ) + d ); + + // Now adjust to the desired depth and offset + double width = 1. / res; + for( int d=0 ; d<=Degree ; d++ ) for( int dd=0 ; dd<=Degree ; dd++ ) components[d][dd] = components[d][dd].scale( width ).shift( width*offset ); + + // Now write in the polynomials + for( int d=0 ; d<=Degree ; d++ ) + { + int idx = offset + SupportStart + d; + _polys[d] = Polynomial< Degree >(); + + if( idx>=0 && idx +BSplineEvaluationData< Degree >::BSplineUpSamplingCoefficients::BSplineUpSamplingCoefficients( int depth , int offset , bool dirichlet ) +{ + // [ 1/8 1/2 3/4 1/2 1/8] + // [ 1 , 1 ] -> [ 3/4 , 1/2 , 1/8 ] + [ 1/8 , 1/2 , 3/4 ] = [ 7/8 , 1 , 7/8 ] + int dim = Dimension(depth) , _dim = Dimension(depth+1); + bool reflect; + offset = BSplineData< Degree >::RemapOffset( depth , offset , reflect ); + int multiplier = ( dirichlet && reflect ) ? -1 : 1; + bool useReflected = Inset || ( offset % ( dim-1 ) ); + int b[ UpSampleSize ]; + Polynomial< Degree+1 >::BinomialCoefficients( b ); + + // Clear the values + memset( _coefficients , 0 , sizeof(int) * UpSampleSize ); + + // Get the array of coefficients, relative to the origin + int* coefficients = _coefficients - ( 2*offset + UpSampleStart ); + for( int i=UpSampleStart ; i<=UpSampleEnd ; i++ ) + { + int _offset = 2*offset+i; + _offset = BSplineData< Degree >::RemapOffset( depth+1 , _offset , reflect ); + if( useReflected || !reflect ) + { + int _multiplier = multiplier * ( ( dirichlet && reflect ) ? -1 : 1 ); + coefficients[ _offset ] += b[ i-UpSampleStart ] * _multiplier; + } + // If we are not inset and we are at the boundary, use the reflection as well + if( !Inset && ( offset % (dim-1) ) && !( _offset % (_dim-1) ) ) + { + _offset = BSplineData< Degree >::RemapOffset( depth+1 , _offset , reflect ); + int _multiplier = multiplier * ( ( dirichlet && reflect ) ? -1 : 1 ); + if( dirichlet ) _multiplier *= -1; + coefficients[ _offset ] += b[ i-UpSampleStart ] * _multiplier; + } + } +} + +//////////////////////////// +// BSplineIntegrationData // +//////////////////////////// +template< int Degree1 , int Degree2 > +double BSplineIntegrationData< Degree1 , Degree2 >::Dot( int depth1 , int off1 , bool dirichlet1 , bool d1 , int depth2 , int off2 , bool dirichlet2 , bool d2 ) +{ + const int _Degree1 = (d1 ? (Degree1-1) : Degree1) , _Degree2 = (d2 ? (Degree2-1) : Degree2); + int sums[ Degree1+1 ][ Degree2+1 ]; + + int depth = std::max< int >( depth1 , depth2 ); + + BSplineElements< Degree1 > b1( 1< b2( 1< b; + while( depth1 b; + while( depth2 db1; + BSplineElements< Degree2-1 > db2; + b1.differentiate( db1 ) , b2.differentiate( db2 ); + + int start1=-1 , end1=-1 , start2=-1 , end2=-1; + for( int i=0 ; i=end2 || start2>=end1 ) return 0.; + int start = std::max< int >( start1 , start2 ) , end = std::min< int >( end1 , end2 ); + memset( sums , 0 , sizeof( sums ) ); + + // Iterate over the support + for( int i=start ; i( integrals ); + for( int j=0 ; j<=_Degree1 ; j++ ) for( int k=0 ; k<=_Degree2 ; k++ ) _dot += integrals[j][k] * sums[j][k]; + } + else if( d1 ) + { + double integrals[ Degree1 ][ Degree2+1 ]; + SetBSplineElementIntegrals< Degree1-1 , Degree2 >( integrals ); + for( int j=0 ; j<=_Degree1 ; j++ ) for( int k=0 ; k<=_Degree2 ; k++ ) _dot += integrals[j][k] * sums[j][k]; + } + else if( d2 ) + { + double integrals[ Degree1+1 ][ Degree2 ]; + SetBSplineElementIntegrals< Degree1 , Degree2-1 >( integrals ); + for( int j=0 ; j<=_Degree1 ; j++ ) for( int k=0 ; k<=_Degree2 ; k++ ) _dot += integrals[j][k] * sums[j][k]; + } + else + { + double integrals[ Degree1+1 ][ Degree2+1 ]; + SetBSplineElementIntegrals< Degree1 , Degree2 >( integrals ); + for( int j=0 ; j<=_Degree1 ; j++ ) for( int k=0 ; k<=_Degree2 ; k++ ) _dot += integrals[j][k] * sums[j][k]; + } + + _dot /= b1.denominator; + _dot /= b2.denominator; + if ( d1 && d2 ) return _dot * (1< +void BSplineIntegrationData< Degree1, Degree2 >::SetIntegrator( typename FunctionIntegrator::Integrator& integrator , int depth , bool dirichlet1 , bool dirichlet2 ) +{ + integrator._depth = depth; + int dim = BSplineEvaluationData< Degree2 >::Dimension( depth ); + for( int i=0 ; i +void BSplineIntegrationData< Degree1, Degree2 >::SetChildIntegrator( typename FunctionIntegrator::ChildIntegrator& integrator , int parentDepth , bool dirichlet1 , bool dirichlet2 ) +{ + integrator._parentDepth = parentDepth; + int dim = BSplineEvaluationData< Degree2 >::Dimension( parentDepth ); + for( int i=0 ; i +double BSplineIntegrationData< Degree1 , Degree2 >::FunctionIntegrator::Integrator::dot( int off1 , int off2 , bool d1 , bool d2 ) const +{ + int d = off2-off1 , dim1 = BSplineEvaluationData< Degree1 >::Dimension( _depth ) , dim2 = BSplineEvaluationData< Degree2 >::Dimension( _depth ); + if( off1<0 || off2<0 || off1>=dim1 || off2>=dim2 || dOverlapEnd ) return 0; + return _ccIntegrals[d1?1:0][d2?1:0][ FunctionIntegrator::Index( _depth , off1 ) ][d-OverlapStart]; +} +template< int Degree1 , int Degree2 > +double BSplineIntegrationData< Degree1 , Degree2 >::FunctionIntegrator::ChildIntegrator::dot( int off1 , int off2 , bool d1 , bool d2 ) const +{ + int d = off2-2*off1 , dim1 = BSplineEvaluationData< Degree1 >::Dimension( _parentDepth ) , dim2 = BSplineEvaluationData< Degree2 >::Dimension( _parentDepth+1 ); + if( off1<0 || off2<0 || off1>=dim1 || off2>=dim2 || dChildOverlapEnd ) return 0; + return _pcIntegrals[d1?1:0][d2?1:0][ FunctionIntegrator::Index( _parentDepth , off1 ) ][d-ChildOverlapStart]; +} +///////////////// +// BSplineData // +///////////////// +#define MODULO( A , B ) ( (A)<0 ? ( (B)-((-(A))%(B)) ) % (B) : (A) % (B) ) +template< int Degree > +int BSplineData< Degree >::RemapOffset( int depth , int offset , bool& reflect ) +{ + const int I = ( Degree&1 ) ? 0 : 1; + int dim = Dimension( depth ); + offset = MODULO( offset , 2*(dim-1+I) ); + reflect = offset>=dim; + if( reflect ) return 2*(dim-1+I) - (offset+I); + else return offset; +} +#undef MODULO + +template< int Degree > BSplineData< Degree >::BSplineData( void ){ + functionCount = sampleCount = 0; + baseBSplines = NullPointer(typename BSplineEvaluationData< Degree >::BSplineComponents); // [Bruno] +} + +template< int Degree > BSplineData< Degree >::~BSplineData( void ){ + DeletePointer(baseBSplines); // [Bruno] +} + +template< int Degree > +void BSplineData< Degree >::set( int maxDepth , bool dirichlet ) +{ + _dirichlet = dirichlet; + + depth = maxDepth; + functionCount = TotalFunctionCount( depth ); + sampleCount = TotalSampleCount( depth ); + baseBSplines = NewPointer< typename BSplineEvaluationData< Degree >::BSplineComponents >( functionCount ); + + for( size_t i=0 ; i::BSplineComponents( d , off , _dirichlet ); + } +} + +///////////////////// +// BSplineElements // +///////////////////// +template< int Degree > +BSplineElements< Degree >::BSplineElements( int res , int offset , bool dirichlet ) +{ + denominator = 1; + std::vector< BSplineElementCoefficients< Degree > >::resize( res , BSplineElementCoefficients< Degree >() ); + + // If we have primal dirichlet constraints, the boundary functions are necessarily zero + if( _Primal && dirichlet && !(offset%res) ) return; + + // Construct the B-Spline + for( int i=0 ; i<=Degree ; i++ ) + { + int idx = -_Off + offset + i; + if( idx>=0 && idx( _RotateLeft ( offset , res ) , false ) , _addPeriodic< false >( _RotateRight( offset , res ) , false ); + + // Recursively fold in the boundaries + if( _Primal && !(offset%res) ) return; + + // Fold in the reflected instance (which may require negation) + _addPeriodic< true >( _ReflectLeft( offset , res ) , dirichlet ) , _addPeriodic< false >( _ReflectRight( offset , res ) , dirichlet ); +} +template< int Degree > int BSplineElements< Degree >::_ReflectLeft ( int offset , int res ){ return (Degree&1) ? -offset : -1-offset; } +template< int Degree > int BSplineElements< Degree >::_ReflectRight( int offset , int res ){ return (Degree&1) ? 2*res-offset : 2*res-1-offset; } +template< int Degree > int BSplineElements< Degree >::_RotateLeft ( int offset , int res ){ return offset-2*res; } +template< int Degree > int BSplineElements< Degree >::_RotateRight ( int offset , int res ){ return offset+2*res; } + +template< int Degree > +template< bool Left > +void BSplineElements< Degree >::_addPeriodic( int offset , bool negate ) +{ + int res = int( std::vector< BSplineElementCoefficients< Degree > >::size() ); + bool set = false; + // Add in the corresponding B-spline elements (possibly negated) + for( int i=0 ; i<=Degree ; i++ ) + { + int idx = -_Off + offset + i; + if( idx>=0 && idx( Left ? _RotateLeft( offset , res ) : _RotateRight( offset , res ) , negate ); +} +template< int Degree > +void BSplineElements< Degree >::upSample( BSplineElements< Degree >& high ) const +{ + int bCoefficients[ BSplineEvaluationData< Degree >::UpSampleSize ]; + Polynomial< Degree+1 >::BinomialCoefficients( bCoefficients ); + + high.resize( std::vector< BSplineElementCoefficients< Degree > >::size()*2 ); + high.assign( high.size() , BSplineElementCoefficients< Degree >() ); + // [NOTE] We have flipped the order of the B-spline elements + for( int i=0 ; i >::size()) ; i++ ) for( int j=0 ; j<=Degree ; j++ ) + { + // At index I , B-spline element J corresponds to a B-spline centered at: + // I - SupportStart - J + int idx = i - BSplineEvaluationData< Degree >::SupportStart - j; + for( int k=BSplineEvaluationData< Degree >::UpSampleStart ; k<=BSplineEvaluationData< Degree >::UpSampleEnd ; k++ ) + { + // Index idx at the coarser resolution gets up-sampled into indices: + // 2*idx + [UpSampleStart,UpSampleEnd] + // at the finer resolution + int _idx = 2*idx + k; + // Compute the index of the B-spline element relative to 2*i and 2*i+1 + int _j1 = -_idx + 2*i - BSplineEvaluationData< Degree >::SupportStart , _j2 = -_idx + 2*i + 1 - BSplineEvaluationData< Degree >::SupportStart; + if( _j1>=0 && _j1<=Degree ) high[2*i+0][_j1] += (*this)[i][j] * bCoefficients[k-BSplineEvaluationData< Degree >::UpSampleStart]; + if( _j2>=0 && _j2<=Degree ) high[2*i+1][_j2] += (*this)[i][j] * bCoefficients[k-BSplineEvaluationData< Degree >::UpSampleStart]; + } + } + high.denominator = denominator< +void BSplineElements< Degree >::differentiate( BSplineElements< Degree-1 >& d ) const +{ + d.resize( std::vector< BSplineElementCoefficients< Degree > >::size() ); + d.assign( d.size() , BSplineElementCoefficients< Degree-1 >() ); + for( int i=0 ; i >::size()) ; i++ ) for( int j=0 ; j<=Degree ; j++ ) + { + if( j-1>=0 ) d[i][j-1] -= (*this)[i][j]; + if( j +void SetBSplineElementIntegrals( double integrals[Degree1+1][Degree2+1] ) +{ + for( int i=0 ; i<=Degree1 ; i++ ) + { + Polynomial< Degree1 > p1 = Polynomial< Degree1 >::BSplineComponent( Degree1-i ); + for( int j=0 ; j<=Degree2 ; j++ ) + { + Polynomial< Degree2 > p2 = Polynomial< Degree2 >::BSplineComponent( Degree2-j ); + integrals[i][j] = ( p1 * p2 ).integral( 0 , 1 ); + } + } +} diff --git a/src/lib/geogram/third_party/PoissonRecon/BinaryNode.h b/src/lib/geogram/third_party/PoissonRecon/BinaryNode.h old mode 100755 new mode 100644 index b9b3432f..7c5a1715 --- a/src/lib/geogram/third_party/PoissonRecon/BinaryNode.h +++ b/src/lib/geogram/third_party/PoissonRecon/BinaryNode.h @@ -1,70 +1,70 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - -#ifndef BINARY_NODE_INCLUDED -#define BINARY_NODE_INCLUDED - -class BinaryNode -{ -public: - static inline int CenterCount( int depth ) { return 1< static inline Real Width( int depth ){ return Real(1.0/(1< static inline void CenterAndWidth( int depth , int offset , Real& center , Real& width ){ width = Real (1.0/(1< static inline void CornerAndWidth( int depth , int offset , Real& corner , Real& width ){ width = Real(1.0/(1< static inline void CenterAndWidth( int idx , Real& center , Real& width ) - { - int depth , offset; - CenterDepthAndOffset( idx , depth , offset ); - CenterAndWidth( depth , offset , center , width ); - } - template< class Real > static inline void CornerAndWidth( int idx , Real& corner , Real& width ) - { - int depth , offset; - CornerDepthAndOffset( idx , depth , offset ); - CornerAndWidth( depth , offset , corner , width ); - } - static inline void CenterDepthAndOffset( int idx , int& depth , int& offset ) - { - offset = idx , depth = 0; - while( offset>=(1<=( (1< static inline Real Width( int depth ){ return Real(1.0/(1< static inline void CenterAndWidth( int depth , int offset , Real& center , Real& width ){ width = Real (1.0/(1< static inline void CornerAndWidth( int depth , int offset , Real& corner , Real& width ){ width = Real(1.0/(1< static inline void CenterAndWidth( int idx , Real& center , Real& width ) + { + int depth , offset; + CenterDepthAndOffset( idx , depth , offset ); + CenterAndWidth( depth , offset , center , width ); + } + template< class Real > static inline void CornerAndWidth( int idx , Real& corner , Real& width ) + { + int depth , offset; + CornerDepthAndOffset( idx , depth , offset ); + CornerAndWidth( depth , offset , corner , width ); + } + static inline void CenterDepthAndOffset( int idx , int& depth , int& offset ) + { + offset = idx , depth = 0; + while( offset>=(1<=( (1< -#include "Factor.h" -int Factor(double a1,double a0,double roots[1][2],double EPS){ - if(fabs(a1)<=EPS){return 0;} - roots[0][0]=-a0/a1; - roots[0][1]=0; - return 1; -} -int Factor(double a2,double a1,double a0,double roots[2][2],double EPS){ - double d; - if(fabs(a2)<=EPS){return Factor(a1,a0,roots,EPS);} - - d=a1*a1-4*a0*a2; - a1/=(2*a2); - if(d<0){ - d=sqrt(-d)/(2*a2); - roots[0][0]=roots[1][0]=-a1; - roots[0][1]=-d; - roots[1][1]= d; - } - else{ - d=sqrt(d)/(2*a2); - roots[0][1]=roots[1][1]=0; - roots[0][0]=-a1-d; - roots[1][0]=-a1+d; - } - return 2; -} -// Solution taken from: http://mathworld.wolfram.com/CubicFormula.html -// and http://www.csit.fsu.edu/~burkardt/f_src/subpak/subpak.f90 -int Factor(double a3,double a2,double a1,double a0,double roots[3][2],double EPS){ - double q,r,r2,q3; - - if(fabs(a3)<=EPS){return Factor(a2,a1,a0,roots,EPS);} - a2/=a3; - a1/=a3; - a0/=a3; - - q=-(3*a1-a2*a2)/9; - r=-(9*a2*a1-27*a0-2*a2*a2*a2)/54; - r2=r*r; - q3=q*q*q; - - if(r20){return PI/2.0;} - else{return -PI/2.0;} - } - if(x>=0){return atan(y/x);} - else{ - if(y>=0){return atan(y/x)+PI;} - else{return atan(y/x)-PI;} - } -} -double Angle(const double in[2]){ - if((in[0]*in[0]+in[1]*in[1])==0.0){return 0;} - else{return ArcTan2(in[1],in[0]);} -} -void Sqrt(const double in[2],double out[2]){ - double r=sqrt(sqrt(in[0]*in[0]+in[1]*in[1])); - double a=Angle(in)*0.5; - out[0]=r*cos(a); - out[1]=r*sin(a); -} -void Add(const double in1[2],const double in2[2],double out[2]){ - out[0]=in1[0]+in2[0]; - out[1]=in1[1]+in2[1]; -} -void Subtract(const double in1[2],const double in2[2],double out[2]){ - out[0]=in1[0]-in2[0]; - out[1]=in1[1]-in2[1]; -} -void Multiply(const double in1[2],const double in2[2],double out[2]){ - out[0]=in1[0]*in2[0]-in1[1]*in2[1]; - out[1]=in1[0]*in2[1]+in1[1]*in2[0]; -} -void Divide(const double in1[2],const double in2[2],double out[2]){ - double temp[2]; - double l=in2[0]*in2[0]+in2[1]*in2[1]; - temp[0]= in2[0]/l; - temp[1]=-in2[1]/l; - Multiply(in1,temp,out); -} -// Solution taken from: http://mathworld.wolfram.com/QuarticEquation.html -// and http://www.csit.fsu.edu/~burkardt/f_src/subpak/subpak.f90 -int Factor(double a4,double a3,double a2,double a1,double a0,double roots[4][2],double EPS){ - double R[2],D[2],E[2],R2[2]; - - if(fabs(a4)10e-8){ - double temp1[2],temp2[2]; - double p1[2],p2[2]; - - p1[0]=a3*a3*0.75-2.0*a2-R2[0]; - p1[1]=0; - - temp2[0]=((4.0*a3*a2-8.0*a1-a3*a3*a3)/4.0); - temp2[1]=0; - Divide(temp2,R,p2); - - Add (p1,p2,temp1); - Subtract(p1,p2,temp2); - - Sqrt(temp1,D); - Sqrt(temp2,E); - } - else{ - R[0]=R[1]=0; - double temp1[2],temp2[2]; - temp1[0]=roots[0][0]*roots[0][0]-4.0*a0; - temp1[1]=0; - Sqrt(temp1,temp2); - temp1[0]=a3*a3*0.75-2.0*a2+2.0*temp2[0]; - temp1[1]= 2.0*temp2[1]; - Sqrt(temp1,D); - temp1[0]=a3*a3*0.75-2.0*a2-2.0*temp2[0]; - temp1[1]= -2.0*temp2[1]; - Sqrt(temp1,E); - } - - roots[0][0]=-a3/4.0+R[0]/2.0+D[0]/2.0; - roots[0][1]= R[1]/2.0+D[1]/2.0; - - roots[1][0]=-a3/4.0+R[0]/2.0-D[0]/2.0; - roots[1][1]= R[1]/2.0-D[1]/2.0; - - roots[2][0]=-a3/4.0-R[0]/2.0+E[0]/2.0; - roots[2][1]= -R[1]/2.0+E[1]/2.0; - - roots[3][0]=-a3/4.0-R[0]/2.0-E[0]/2.0; - roots[3][1]= -R[1]/2.0-E[1]/2.0; - return 4; -} - -int Solve(const double* eqns,const double* values,double* solutions,int dim){ - int i,j,eIndex; - double v,m; - int *index=new int[dim]; - int *set=new int[dim]; - double* myEqns=new double[dim*dim]; - double* myValues=new double[dim]; - - for(i=0;im){ - m=fabs(myEqns[j*dim+i]); - eIndex=j; - } - } - if(eIndex==-1){ - delete[] index; - delete[] myValues; - delete[] myEqns; - delete[] set; - return 0; - } - // The position in which the solution for the i-th variable can be found - index[i]=eIndex; - set[eIndex]=1; - - // Normalize the equation - v=myEqns[eIndex*dim+i]; - for(j=0;j +#include "Factor.h" +int Factor(double a1,double a0,double roots[1][2],double EPS){ + if(fabs(a1)<=EPS){return 0;} + roots[0][0]=-a0/a1; + roots[0][1]=0; + return 1; +} +int Factor(double a2,double a1,double a0,double roots[2][2],double EPS){ + double d; + if(fabs(a2)<=EPS){return Factor(a1,a0,roots,EPS);} + + d=a1*a1-4*a0*a2; + a1/=(2*a2); + if(d<0){ + d=sqrt(-d)/(2*a2); + roots[0][0]=roots[1][0]=-a1; + roots[0][1]=-d; + roots[1][1]= d; + } + else{ + d=sqrt(d)/(2*a2); + roots[0][1]=roots[1][1]=0; + roots[0][0]=-a1-d; + roots[1][0]=-a1+d; + } + return 2; +} +// Solution taken from: http://mathworld.wolfram.com/CubicFormula.html +// and http://www.csit.fsu.edu/~burkardt/f_src/subpak/subpak.f90 +int Factor(double a3,double a2,double a1,double a0,double roots[3][2],double EPS){ + double q,r,r2,q3; + + if(fabs(a3)<=EPS){return Factor(a2,a1,a0,roots,EPS);} + a2/=a3; + a1/=a3; + a0/=a3; + + q=-(3*a1-a2*a2)/9; + r=-(9*a2*a1-27*a0-2*a2*a2*a2)/54; + r2=r*r; + q3=q*q*q; + + if(r20){return PI/2.0;} + else{return -PI/2.0;} + } + if(x>=0){return atan(y/x);} + else{ + if(y>=0){return atan(y/x)+PI;} + else{return atan(y/x)-PI;} + } +} +double Angle(const double in[2]){ + if((in[0]*in[0]+in[1]*in[1])==0.0){return 0;} + else{return ArcTan2(in[1],in[0]);} +} +void Sqrt(const double in[2],double out[2]){ + double r=sqrt(sqrt(in[0]*in[0]+in[1]*in[1])); + double a=Angle(in)*0.5; + out[0]=r*cos(a); + out[1]=r*sin(a); +} +void Add(const double in1[2],const double in2[2],double out[2]){ + out[0]=in1[0]+in2[0]; + out[1]=in1[1]+in2[1]; +} +void Subtract(const double in1[2],const double in2[2],double out[2]){ + out[0]=in1[0]-in2[0]; + out[1]=in1[1]-in2[1]; +} +void Multiply(const double in1[2],const double in2[2],double out[2]){ + out[0]=in1[0]*in2[0]-in1[1]*in2[1]; + out[1]=in1[0]*in2[1]+in1[1]*in2[0]; +} +void Divide(const double in1[2],const double in2[2],double out[2]){ + double temp[2]; + double l=in2[0]*in2[0]+in2[1]*in2[1]; + temp[0]= in2[0]/l; + temp[1]=-in2[1]/l; + Multiply(in1,temp,out); +} +// Solution taken from: http://mathworld.wolfram.com/QuarticEquation.html +// and http://www.csit.fsu.edu/~burkardt/f_src/subpak/subpak.f90 +int Factor(double a4,double a3,double a2,double a1,double a0,double roots[4][2],double EPS){ + double R[2],D[2],E[2],R2[2]; + + if(fabs(a4)10e-8){ + double temp1[2],temp2[2]; + double p1[2],p2[2]; + + p1[0]=a3*a3*0.75-2.0*a2-R2[0]; + p1[1]=0; + + temp2[0]=((4.0*a3*a2-8.0*a1-a3*a3*a3)/4.0); + temp2[1]=0; + Divide(temp2,R,p2); + + Add (p1,p2,temp1); + Subtract(p1,p2,temp2); + + Sqrt(temp1,D); + Sqrt(temp2,E); + } + else{ + R[0]=R[1]=0; + double temp1[2],temp2[2]; + temp1[0]=roots[0][0]*roots[0][0]-4.0*a0; + temp1[1]=0; + Sqrt(temp1,temp2); + temp1[0]=a3*a3*0.75-2.0*a2+2.0*temp2[0]; + temp1[1]= 2.0*temp2[1]; + Sqrt(temp1,D); + temp1[0]=a3*a3*0.75-2.0*a2-2.0*temp2[0]; + temp1[1]= -2.0*temp2[1]; + Sqrt(temp1,E); + } + + roots[0][0]=-a3/4.0+R[0]/2.0+D[0]/2.0; + roots[0][1]= R[1]/2.0+D[1]/2.0; + + roots[1][0]=-a3/4.0+R[0]/2.0-D[0]/2.0; + roots[1][1]= R[1]/2.0-D[1]/2.0; + + roots[2][0]=-a3/4.0-R[0]/2.0+E[0]/2.0; + roots[2][1]= -R[1]/2.0+E[1]/2.0; + + roots[3][0]=-a3/4.0-R[0]/2.0-E[0]/2.0; + roots[3][1]= -R[1]/2.0-E[1]/2.0; + return 4; +} + +int Solve(const double* eqns,const double* values,double* solutions,int dim){ + int i,j,eIndex; + double v,m; + int *index=new int[dim]; + int *set=new int[dim]; + double* myEqns=new double[dim*dim]; + double* myValues=new double[dim]; + + for(i=0;im){ + m=fabs(myEqns[j*dim+i]); + eIndex=j; + } + } + if(eIndex==-1){ + delete[] index; + delete[] myValues; + delete[] myEqns; + delete[] set; + return 0; + } + // The position in which the solution for the i-th variable can be found + index[i]=eIndex; + set[eIndex]=1; + + // Normalize the equation + v=myEqns[eIndex*dim+i]; + for(j=0;j class FunctionData{ bool useDotRatios; @@ -102,8 +102,8 @@ class FunctionData{ static inline int SymmetricIndex( const int& i1 , const int& i2 ); static inline int SymmetricIndex( const int& i1 , const int& i2 , int& index ); -}; - - -#include "FunctionData.inl" -#endif // FUNCTION_DATA_INCLUDED \ No newline at end of file +}; + + +#include "FunctionData.inl" +#endif // FUNCTION_DATA_INCLUDED diff --git a/src/lib/geogram/third_party/PoissonRecon/FunctionData.inl b/src/lib/geogram/third_party/PoissonRecon/FunctionData.inl old mode 100755 new mode 100644 index c8d5293a..4e61b961 --- a/src/lib/geogram/third_party/PoissonRecon/FunctionData.inl +++ b/src/lib/geogram/third_party/PoissonRecon/FunctionData.inl @@ -1,33 +1,33 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - -////////////////// -// FunctionData // +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ + +////////////////// +// FunctionData // ////////////////// template FunctionData::FunctionData(void) diff --git a/src/lib/geogram/third_party/PoissonRecon/Geometry.cpp b/src/lib/geogram/third_party/PoissonRecon/Geometry.cpp old mode 100755 new mode 100644 index 9afc1fe6..8c5ceebc --- a/src/lib/geogram/third_party/PoissonRecon/Geometry.cpp +++ b/src/lib/geogram/third_party/PoissonRecon/Geometry.cpp @@ -1,122 +1,125 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ -#include "Geometry.h" -#include -#include -#ifdef _WIN32 -#include -#endif // _WIN32 - -/////////////////// -// CoredMeshData // -/////////////////// - -TriangulationEdge::TriangulationEdge(void){pIndex[0]=pIndex[1]=tIndex[0]=tIndex[1]=-1;} -TriangulationTriangle::TriangulationTriangle(void){eIndex[0]=eIndex[1]=eIndex[2]=-1;} - -/////////////////////////// -// BufferedReadWriteFile // -/////////////////////////// -BufferedReadWriteFile::BufferedReadWriteFile( char* fileName , int bufferSize ) -{ - _bufferIndex = 0; - _bufferSize = bufferSize; - if( fileName ) strcpy( _fileName , fileName ) , tempFile = false , _fp = fopen( _fileName , "w+b" ); - else - { - strcpy( _fileName , "PR_XXXXXX" ); -#ifdef _WIN32 - _mktemp( _fileName ); - _fp = fopen( _fileName , "w+b" ); -#else // !_WIN32 - _fp = fdopen( mkstemp( _fileName ) , "w+b" ); -#endif // _WIN32 - tempFile = true; - } - if( !_fp ) fprintf( stderr , "[ERROR] Failed to open file: %s\n" , _fileName ) , exit( 0 ); - _buffer = (char*) malloc( _bufferSize ); -} -BufferedReadWriteFile::~BufferedReadWriteFile( void ) -{ - free( _buffer ); - fclose( _fp ); - if( tempFile ) remove( _fileName ); -} -void BufferedReadWriteFile::reset( void ) -{ - if( _bufferIndex ) fwrite( _buffer , 1 , _bufferIndex , _fp ); - _bufferIndex = 0; - fseek( _fp , 0 , SEEK_SET ); - _bufferIndex = 0; - _bufferSize = fread( _buffer , 1 , _bufferSize , _fp ); -} -bool BufferedReadWriteFile::write( const void* data , size_t size ) -{ - if( !size ) return true; - char* _data = (char*) data; - size_t sz = _bufferSize - _bufferIndex; - while( sz<=size ) - { - memcpy( _buffer+_bufferIndex , _data , sz ); - fwrite( _buffer , 1 , _bufferSize , _fp ); - _data += sz; - size -= sz; - _bufferIndex = 0; - sz = _bufferSize; - } - if( size ) - { - memcpy( _buffer+_bufferIndex , _data , size ); - _bufferIndex += size; - } - return true; -} -bool BufferedReadWriteFile::read( void* data , size_t size ) -{ - if( !size ) return true; - char *_data = (char*) data; - size_t sz = _bufferSize - _bufferIndex; - while( sz<=size ) - { - if( size && !_bufferSize ) return false; - memcpy( _data , _buffer+_bufferIndex , sz ); - _bufferSize = fread( _buffer , 1 , _bufferSize , _fp ); - _data += sz; - size -= sz; - _bufferIndex = 0; - if( !size ) return true; - sz = _bufferSize; - } - if( size ) - { - if( !_bufferSize ) return false; - memcpy( _data , _buffer+_bufferIndex , size ); - _bufferIndex += size; - } - return true; -} \ No newline at end of file +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ +#include "Geometry.h" +#include +#include +#ifdef _WIN32 +#include +#endif // _WIN32 + + +/////////////////// +// CoredMeshData // +/////////////////// + +TriangulationEdge::TriangulationEdge(void){pIndex[0]=pIndex[1]=tIndex[0]=tIndex[1]=-1;} +TriangulationTriangle::TriangulationTriangle(void){eIndex[0]=eIndex[1]=eIndex[2]=-1;} + +/////////////////////////// +// BufferedReadWriteFile // +/////////////////////////// +BufferedReadWriteFile::BufferedReadWriteFile( char* fileName , int bufferSize ) +{ + _bufferIndex = 0; + _bufferSize = bufferSize; + if( fileName ) strcpy( _fileName , fileName ) , tempFile = false , _fp = fopen( _fileName , "w+b" ); + else + { + strcpy( _fileName , "PR_XXXXXX" ); +#if defined(_WIN32) + _mktemp( _fileName ); + _fp = fopen( _fileName , "w+b" ); +#else + _fp = fdopen( mkstemp( _fileName ) , "w+b" ); +#endif // _WIN32 + tempFile = true; + } + if( !_fp ) { + fprintf( stderr , "[ERROR] Failed to open file: %s\n" , _fileName ) , exit( 0 ); + } + _buffer = (char*) malloc( _bufferSize ); +} +BufferedReadWriteFile::~BufferedReadWriteFile( void ) +{ + free( _buffer ); + fclose( _fp ); + if( tempFile ) remove( _fileName ); +} +void BufferedReadWriteFile::reset( void ) +{ + if( _bufferIndex ) fwrite( _buffer , 1 , _bufferIndex , _fp ); + _bufferIndex = 0; + fseek( _fp , 0 , SEEK_SET ); + _bufferIndex = 0; + _bufferSize = fread( _buffer , 1 , _bufferSize , _fp ); +} +bool BufferedReadWriteFile::write( const void* data , size_t size ) +{ + if( !size ) return true; + char* _data = (char*) data; + size_t sz = _bufferSize - _bufferIndex; + while( sz<=size ) + { + memcpy( _buffer+_bufferIndex , _data , sz ); + fwrite( _buffer , 1 , _bufferSize , _fp ); + _data += sz; + size -= sz; + _bufferIndex = 0; + sz = _bufferSize; + } + if( size ) + { + memcpy( _buffer+_bufferIndex , _data , size ); + _bufferIndex += size; + } + return true; +} +bool BufferedReadWriteFile::read( void* data , size_t size ) +{ + if( !size ) return true; + char *_data = (char*) data; + size_t sz = _bufferSize - _bufferIndex; + while( sz<=size ) + { + if( size && !_bufferSize ) return false; + memcpy( _data , _buffer+_bufferIndex , sz ); + _bufferSize = fread( _buffer , 1 , _bufferSize , _fp ); + _data += sz; + size -= sz; + _bufferIndex = 0; + if( !size ) return true; + sz = _bufferSize; + } + if( size ) + { + if( !_bufferSize ) return false; + memcpy( _data , _buffer+_bufferIndex , size ); + _bufferIndex += size; + } + return true; +} diff --git a/src/lib/geogram/third_party/PoissonRecon/Geometry.h b/src/lib/geogram/third_party/PoissonRecon/Geometry.h old mode 100755 new mode 100644 index f79329f7..746d480e --- a/src/lib/geogram/third_party/PoissonRecon/Geometry.h +++ b/src/lib/geogram/third_party/PoissonRecon/Geometry.h @@ -1,380 +1,380 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - -#ifndef GEOMETRY_INCLUDED -#define GEOMETRY_INCLUDED - -#include -#include -#include -#include "Hash.h" - -template -Real Random(void); - -template< class Real > -struct Point3D -{ - Real coords[3]; - Point3D( void ) { coords[0] = coords[1] = coords[2] = Real(0); } - Point3D( Real v ) { coords[0] = coords[1] = coords[2] = v; } - template< class _Real > Point3D( _Real v0 , _Real v1 , _Real v2 ){ coords[0] = Real(v0) , coords[1] = Real(v1) , coords[2] = Real(v2); } - template< class _Real > Point3D( const Point3D< _Real >& p ){ coords[0] = Real( p[0] ) , coords[1] = Real( p[1] ) , coords[2] = Real( p[2] ); } - inline Real& operator[] ( int i ) { return coords[i]; } - inline const Real& operator[] ( int i ) const { return coords[i]; } - inline Point3D operator - ( void ) const { Point3D q ; q.coords[0] = -coords[0] , q.coords[1] = -coords[1] , q.coords[2] = -coords[2] ; return q; } - - template< class _Real > inline Point3D& operator += ( Point3D< _Real > p ){ coords[0] += Real(p.coords[0]) , coords[1] += Real(p.coords[1]) , coords[2] += Real(p.coords[2]) ; return *this; } - template< class _Real > inline Point3D operator + ( Point3D< _Real > p ) const { Point3D q ; q.coords[0] = coords[0] + Real(p.coords[0]) , q.coords[1] = coords[1] + Real(p.coords[1]) , q.coords[2] = coords[2] + Real(p.coords[2]) ; return q; } - template< class _Real > inline Point3D& operator *= ( _Real r ) { coords[0] *= Real(r) , coords[1] *= Real(r) , coords[2] *= Real(r) ; return *this; } - template< class _Real > inline Point3D operator * ( _Real r ) const { Point3D q ; q.coords[0] = coords[0] * Real(r) , q.coords[1] = coords[1] * Real(r) , q.coords[2] = coords[2] * Real(r) ; return q; } - - template< class _Real > inline Point3D& operator -= ( Point3D< _Real > p ){ return ( (*this)+=(-p) ); } - template< class _Real > inline Point3D operator - ( Point3D< _Real > p ) const { return (*this)+(-p); } - template< class _Real > inline Point3D& operator /= ( _Real r ){ return ( (*this)*=Real(1./r) ); } - template< class _Real > inline Point3D operator / ( _Real r ) const { return (*this) * ( Real(1.)/r ); } - - static Real Dot( const Point3D< Real >& p1 , const Point3D< Real >& p2 ){ return p1.coords[0]*p2.coords[0] + p1.coords[1]*p2.coords[1] + p1.coords[2]*p2.coords[2]; } - template< class Real1 , class Real2 > - static Real Dot( const Point3D< Real1 >& p1 , const Point3D< Real2 >& p2 ){ return Real( p1.coords[0]*p2.coords[0] + p1.coords[1]*p2.coords[1] + p1.coords[2]*p2.coords[2] ); } -}; - -template< class Real > -struct XForm3x3 -{ - Real coords[3][3]; - XForm3x3( void ) { for( int i=0 ; i<3 ; i++ ) for( int j=0 ; j<3 ; j++ ) coords[i][j] = Real(0.); } - static XForm3x3 Identity( void ) - { - XForm3x3 xForm; - xForm(0,0) = xForm(1,1) = xForm(2,2) = Real(1.); - return xForm; - } - Real& operator() ( int i , int j ){ return coords[i][j]; } - const Real& operator() ( int i , int j ) const { return coords[i][j]; } - template< class _Real > Point3D< _Real > operator * ( const Point3D< _Real >& p ) const - { - Point3D< _Real > q; - for( int i=0 ; i<3 ; i++ ) for( int j=0 ; j<3 ; j++ ) q[i] += _Real( coords[j][i] * p[j] ); - return q; - } - XForm3x3 operator * ( const XForm3x3& m ) const - { - XForm3x3 n; - for( int i=0 ; i<3 ; i++ ) for( int j=0 ; j<3 ; j++ ) for( int k=0 ; k<3 ; k++ ) n.coords[i][j] += m.coords[i][k]*coords[k][j]; - return n; - } - XForm3x3 transpose( void ) const - { - XForm3x3 xForm; - for( int i=0 ; i<3 ; i++ ) for( int j=0 ; j<3 ; j++ ) xForm( i , j ) = coords[j][i]; - return xForm; - } - Real subDeterminant( int i , int j ) const - { - int i1 = (i+1)%3 , i2 = (i+2)%3; - int j1 = (j+1)%3 , j2 = (j+2)%3; - return coords[i1][j1] * coords[i2][j2] - coords[i1][j2] * coords[i2][j1]; - } - Real determinant( void ) const { return coords[0][0] * subDeterminant( 0 , 0 ) + coords[1][0] * subDeterminant( 1 , 0 ) + coords[2][0] * subDeterminant( 2 , 0 ); } - XForm3x3 inverse( void ) const - { - XForm3x3 xForm; - Real d = determinant(); - for( int i=0 ; i<3 ; i++ ) for( int j=0 ; j<3 ;j++ ) xForm.coords[j][i] = subDeterminant( i , j ) / d; - return xForm; - } -}; - -template< class Real > -struct XForm4x4 -{ - Real coords[4][4]; - XForm4x4( void ) { for( int i=0 ; i<4 ; i++ ) for( int j=0 ; j<4 ; j++ ) coords[i][j] = Real(0.); } - static XForm4x4 Identity( void ) - { - XForm4x4 xForm; - xForm(0,0) = xForm(1,1) = xForm(2,2) = xForm(3,3) = Real(1.); - return xForm; - } - Real& operator() ( int i , int j ){ return coords[i][j]; } - const Real& operator() ( int i , int j ) const { return coords[i][j]; } - template< class _Real > Point3D< _Real > operator * ( const Point3D< _Real >& p ) const - { - Point3D< _Real > q; - for( int i=0 ; i<3 ; i++ ) - { - for( int j=0 ; j<3 ; j++ ) q[i] += (_Real)( coords[j][i] * p[j] ); - q[i] += (_Real)coords[3][i]; - } - return q; - } - XForm4x4 operator * ( const XForm4x4& m ) const - { - XForm4x4 n; - for( int i=0 ; i<4 ; i++ ) for( int j=0 ; j<4 ; j++ ) for( int k=0 ; k<4 ; k++ ) n.coords[i][j] += m.coords[i][k]*coords[k][j]; - return n; - } - XForm4x4 transpose( void ) const - { - XForm4x4 xForm; - for( int i=0 ; i<4 ; i++ ) for( int j=0 ; j<4 ; j++ ) xForm( i , j ) = coords[j][i]; - return xForm; - } - Real subDeterminant( int i , int j ) const - { - XForm3x3< Real > xForm; - int ii[] = { (i+1)%4 , (i+2)%4 , (i+3)%4 } , jj[] = { (j+1)%4 , (j+2)%4 , (j+3)%4 }; - for( int _i=0 ; _i<3 ; _i++ ) for( int _j=0 ; _j<3 ; _j++ ) xForm( _i , _j ) = coords[ ii[_i] ][ jj[_j] ]; - return xForm.determinant(); - } - Real determinant( void ) const { return coords[0][0] * subDeterminant( 0 , 0 ) - coords[1][0] * subDeterminant( 1 , 0 ) + coords[2][0] * subDeterminant( 2 , 0 ) - coords[3][0] * subDeterminant( 3 , 0 ); } - XForm4x4 inverse( void ) const - { - XForm4x4 xForm; - Real d = determinant(); - for( int i=0 ; i<4 ; i++ ) for( int j=0 ; j<4 ;j++ ) - if( (i+j)%2==0 ) xForm.coords[j][i] = subDeterminant( i , j ) / d; - else xForm.coords[j][i] = -subDeterminant( i , j ) / d; - return xForm; - } -}; - - -template -Point3D RandomBallPoint(void); - -template -Point3D RandomSpherePoint(void); - -template -double Length(const Point3D& p); - -template -double SquareLength(const Point3D& p); - -template -double Distance(const Point3D& p1,const Point3D& p2); - -template -double SquareDistance(const Point3D& p1,const Point3D& p2); - -template -void CrossProduct(const Point3D& p1,const Point3D& p2,Point3D& p); - - -class Edge{ -public: - double p[2][2]; - double Length(void) const{ - double d[2]; - d[0]=p[0][0]-p[1][0]; - d[1]=p[0][1]-p[1][1]; - - return sqrt(d[0]*d[0]+d[1]*d[1]); - } -}; -class Triangle{ -public: - double p[3][3]; - double Area(void) const{ - double v1[3] , v2[3] , v[3]; - for( int d=0 ; d<3 ; d++ ) - { - v1[d] = p[1][d] - p[0][d]; - v2[d] = p[2][d] - p[0][d]; - } - v[0] = v1[1]*v2[2] - v1[2]*v2[1]; - v[1] = -v1[0]*v2[2] + v1[2]*v2[0]; - v[2] = v1[0]*v2[1] - v1[1]*v2[0]; - return sqrt( v[0]*v[0] + v[1]*v[1] + v[2]*v[2] ) / 2; - } - double AspectRatio(void) const{ - double d=0; - int i,j; - for(i=0;i<3;i++){ - for(i=0;i<3;i++) - for(j=0;j<3;j++){d+=(p[(i+1)%3][j]-p[i][j])*(p[(i+1)%3][j]-p[i][j]);} - } - return Area()/d; - } - -}; -class CoredPointIndex -{ -public: - int index; - char inCore; - - int operator == (const CoredPointIndex& cpi) const {return (index==cpi.index) && (inCore==cpi.inCore);}; - int operator != (const CoredPointIndex& cpi) const {return (index!=cpi.index) || (inCore!=cpi.inCore);}; -}; -class EdgeIndex{ -public: - int idx[2]; -}; -class CoredEdgeIndex -{ -public: - CoredPointIndex idx[2]; -}; -class TriangleIndex{ -public: - int idx[3]; -}; - -class TriangulationEdge -{ -public: - TriangulationEdge(void); - int pIndex[2]; - int tIndex[2]; -}; - -class TriangulationTriangle -{ -public: - TriangulationTriangle(void); - int eIndex[3]; -}; - -template -class Triangulation -{ -public: - - std::vector > points; - std::vector edges; - std::vector triangles; - - int factor( int tIndex,int& p1,int& p2,int& p3); - double area(void); - double area( int tIndex ); - double area( int p1 , int p2 , int p3 ); - int flipMinimize( int eIndex); - int addTriangle( int p1 , int p2 , int p3 ); - -protected: - hash_map edgeMap; - static long long EdgeIndex( int p1 , int p2 ); - double area(const Triangle& t); -}; - - -template -void EdgeCollapse(const Real& edgeRatio,std::vector& triangles,std::vector< Point3D >& positions,std::vector >* normals); -template -void TriangleCollapse(const Real& edgeRatio,std::vector& triangles,std::vector >& positions,std::vector >* normals); - -struct CoredVertexIndex -{ - int idx; - bool inCore; -}; -template< class Vertex > -class CoredMeshData -{ -public: - std::vector< Vertex > inCorePoints; - virtual ~CoredMeshData(); - virtual void resetIterator( void ) = 0; - - virtual int addOutOfCorePoint( const Vertex& p ) = 0; - virtual int addOutOfCorePoint_s( const Vertex& p ) = 0; - virtual int addPolygon_s( const std::vector< CoredVertexIndex >& vertices ) = 0; - virtual int addPolygon_s( const std::vector< int >& vertices ) = 0; - - virtual int nextOutOfCorePoint( Vertex& p )=0; - virtual int nextPolygon( std::vector< CoredVertexIndex >& vertices ) = 0; - - virtual int outOfCorePointCount(void)=0; - virtual int polygonCount( void ) = 0; -}; - -template< class Vertex > -class CoredVectorMeshData : public CoredMeshData< Vertex > -{ - std::vector< Vertex > oocPoints; - std::vector< std::vector< int > > polygons; - int polygonIndex; - int oocPointIndex; -public: - CoredVectorMeshData(void); - - void resetIterator(void); - - int addOutOfCorePoint( const Vertex& p ); - int addOutOfCorePoint_s( const Vertex& p ); - int addPolygon_s( const std::vector< CoredVertexIndex >& vertices ); - int addPolygon_s( const std::vector< int >& vertices ); - - int nextOutOfCorePoint( Vertex& p ); - int nextPolygon( std::vector< CoredVertexIndex >& vertices ); - - int outOfCorePointCount(void); - int polygonCount( void ); -}; -class BufferedReadWriteFile -{ - bool tempFile; - FILE* _fp; - char *_buffer , _fileName[1024]; - size_t _bufferIndex , _bufferSize; -public: - BufferedReadWriteFile( char* fileName=NULL , int bufferSize=(1<<20) ); - ~BufferedReadWriteFile( void ); - bool write( const void* data , size_t size ); - bool read ( void* data , size_t size ); - void reset( void ); -}; -template< class Vertex > -class CoredFileMeshData : public CoredMeshData< Vertex > -{ - char pointFileName[1024] , polygonFileName[1024]; - BufferedReadWriteFile *oocPointFile , *polygonFile; - int oocPoints , polygons; -public: - CoredFileMeshData( void ); - ~CoredFileMeshData( void ); - - void resetIterator( void ); - - int addOutOfCorePoint( const Vertex& p ); - int addOutOfCorePoint_s( const Vertex& p ); - int addPolygon_s( const std::vector< CoredVertexIndex >& vertices ); - int addPolygon_s( const std::vector< int >& vertices ); - - int nextOutOfCorePoint( Vertex& p ); - int nextPolygon( std::vector< CoredVertexIndex >& vertices ); - - int outOfCorePointCount( void ); - int polygonCount( void ); -}; -#include "Geometry.inl" - -#endif // GEOMETRY_INCLUDED +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ + +#ifndef GEOMETRY_INCLUDED +#define GEOMETRY_INCLUDED + +#include +#include +#include +#include "Hash.h" + +template +Real Random(void); + +template< class Real > +struct Point3D +{ + Real coords[3]; + Point3D( void ) { coords[0] = coords[1] = coords[2] = Real(0); } + Point3D( Real v ) { coords[0] = coords[1] = coords[2] = v; } + template< class _Real > Point3D( _Real v0 , _Real v1 , _Real v2 ){ coords[0] = Real(v0) , coords[1] = Real(v1) , coords[2] = Real(v2); } + template< class _Real > Point3D( const Point3D< _Real >& p ){ coords[0] = Real( p[0] ) , coords[1] = Real( p[1] ) , coords[2] = Real( p[2] ); } + inline Real& operator[] ( int i ) { return coords[i]; } + inline const Real& operator[] ( int i ) const { return coords[i]; } + inline Point3D operator - ( void ) const { Point3D q ; q.coords[0] = -coords[0] , q.coords[1] = -coords[1] , q.coords[2] = -coords[2] ; return q; } + + template< class _Real > inline Point3D& operator += ( Point3D< _Real > p ){ coords[0] += Real(p.coords[0]) , coords[1] += Real(p.coords[1]) , coords[2] += Real(p.coords[2]) ; return *this; } + template< class _Real > inline Point3D operator + ( Point3D< _Real > p ) const { Point3D q ; q.coords[0] = coords[0] + Real(p.coords[0]) , q.coords[1] = coords[1] + Real(p.coords[1]) , q.coords[2] = coords[2] + Real(p.coords[2]) ; return q; } + template< class _Real > inline Point3D& operator *= ( _Real r ) { coords[0] *= Real(r) , coords[1] *= Real(r) , coords[2] *= Real(r) ; return *this; } + template< class _Real > inline Point3D operator * ( _Real r ) const { Point3D q ; q.coords[0] = coords[0] * Real(r) , q.coords[1] = coords[1] * Real(r) , q.coords[2] = coords[2] * Real(r) ; return q; } + + template< class _Real > inline Point3D& operator -= ( Point3D< _Real > p ){ return ( (*this)+=(-p) ); } + template< class _Real > inline Point3D operator - ( Point3D< _Real > p ) const { return (*this)+(-p); } + template< class _Real > inline Point3D& operator /= ( _Real r ){ return ( (*this)*=Real(1./r) ); } + template< class _Real > inline Point3D operator / ( _Real r ) const { return (*this) * ( Real(1.)/r ); } + + static Real Dot( const Point3D< Real >& p1 , const Point3D< Real >& p2 ){ return p1.coords[0]*p2.coords[0] + p1.coords[1]*p2.coords[1] + p1.coords[2]*p2.coords[2]; } + template< class Real1 , class Real2 > + static Real Dot( const Point3D< Real1 >& p1 , const Point3D< Real2 >& p2 ){ return Real( p1.coords[0]*p2.coords[0] + p1.coords[1]*p2.coords[1] + p1.coords[2]*p2.coords[2] ); } +}; + +template< class Real > +struct XForm3x3 +{ + Real coords[3][3]; + XForm3x3( void ) { for( int i=0 ; i<3 ; i++ ) for( int j=0 ; j<3 ; j++ ) coords[i][j] = Real(0.); } + static XForm3x3 Identity( void ) + { + XForm3x3 xForm; + xForm(0,0) = xForm(1,1) = xForm(2,2) = Real(1.); + return xForm; + } + Real& operator() ( int i , int j ){ return coords[i][j]; } + const Real& operator() ( int i , int j ) const { return coords[i][j]; } + template< class _Real > Point3D< _Real > operator * ( const Point3D< _Real >& p ) const + { + Point3D< _Real > q; + for( int i=0 ; i<3 ; i++ ) for( int j=0 ; j<3 ; j++ ) q[i] += _Real( coords[j][i] * p[j] ); + return q; + } + XForm3x3 operator * ( const XForm3x3& m ) const + { + XForm3x3 n; + for( int i=0 ; i<3 ; i++ ) for( int j=0 ; j<3 ; j++ ) for( int k=0 ; k<3 ; k++ ) n.coords[i][j] += m.coords[i][k]*coords[k][j]; + return n; + } + XForm3x3 transpose( void ) const + { + XForm3x3 xForm; + for( int i=0 ; i<3 ; i++ ) for( int j=0 ; j<3 ; j++ ) xForm( i , j ) = coords[j][i]; + return xForm; + } + Real subDeterminant( int i , int j ) const + { + int i1 = (i+1)%3 , i2 = (i+2)%3; + int j1 = (j+1)%3 , j2 = (j+2)%3; + return coords[i1][j1] * coords[i2][j2] - coords[i1][j2] * coords[i2][j1]; + } + Real determinant( void ) const { return coords[0][0] * subDeterminant( 0 , 0 ) + coords[1][0] * subDeterminant( 1 , 0 ) + coords[2][0] * subDeterminant( 2 , 0 ); } + XForm3x3 inverse( void ) const + { + XForm3x3 xForm; + Real d = determinant(); + for( int i=0 ; i<3 ; i++ ) for( int j=0 ; j<3 ;j++ ) xForm.coords[j][i] = subDeterminant( i , j ) / d; + return xForm; + } +}; + +template< class Real > +struct XForm4x4 +{ + Real coords[4][4]; + XForm4x4( void ) { for( int i=0 ; i<4 ; i++ ) for( int j=0 ; j<4 ; j++ ) coords[i][j] = Real(0.); } + static XForm4x4 Identity( void ) + { + XForm4x4 xForm; + xForm(0,0) = xForm(1,1) = xForm(2,2) = xForm(3,3) = Real(1.); + return xForm; + } + Real& operator() ( int i , int j ){ return coords[i][j]; } + const Real& operator() ( int i , int j ) const { return coords[i][j]; } + template< class _Real > Point3D< _Real > operator * ( const Point3D< _Real >& p ) const + { + Point3D< _Real > q; + for( int i=0 ; i<3 ; i++ ) + { + for( int j=0 ; j<3 ; j++ ) q[i] += (_Real)( coords[j][i] * p[j] ); + q[i] += (_Real)coords[3][i]; + } + return q; + } + XForm4x4 operator * ( const XForm4x4& m ) const + { + XForm4x4 n; + for( int i=0 ; i<4 ; i++ ) for( int j=0 ; j<4 ; j++ ) for( int k=0 ; k<4 ; k++ ) n.coords[i][j] += m.coords[i][k]*coords[k][j]; + return n; + } + XForm4x4 transpose( void ) const + { + XForm4x4 xForm; + for( int i=0 ; i<4 ; i++ ) for( int j=0 ; j<4 ; j++ ) xForm( i , j ) = coords[j][i]; + return xForm; + } + Real subDeterminant( int i , int j ) const + { + XForm3x3< Real > xForm; + int ii[] = { (i+1)%4 , (i+2)%4 , (i+3)%4 } , jj[] = { (j+1)%4 , (j+2)%4 , (j+3)%4 }; + for( int _i=0 ; _i<3 ; _i++ ) for( int _j=0 ; _j<3 ; _j++ ) xForm( _i , _j ) = coords[ ii[_i] ][ jj[_j] ]; + return xForm.determinant(); + } + Real determinant( void ) const { return coords[0][0] * subDeterminant( 0 , 0 ) - coords[1][0] * subDeterminant( 1 , 0 ) + coords[2][0] * subDeterminant( 2 , 0 ) - coords[3][0] * subDeterminant( 3 , 0 ); } + XForm4x4 inverse( void ) const + { + XForm4x4 xForm; + Real d = determinant(); + for( int i=0 ; i<4 ; i++ ) for( int j=0 ; j<4 ;j++ ) + if( (i+j)%2==0 ) xForm.coords[j][i] = subDeterminant( i , j ) / d; + else xForm.coords[j][i] = -subDeterminant( i , j ) / d; + return xForm; + } +}; + + +template +Point3D RandomBallPoint(void); + +template +Point3D RandomSpherePoint(void); + +template +double Length(const Point3D& p); + +template +double SquareLength(const Point3D& p); + +template +double Distance(const Point3D& p1,const Point3D& p2); + +template +double SquareDistance(const Point3D& p1,const Point3D& p2); + +template +void CrossProduct(const Point3D& p1,const Point3D& p2,Point3D& p); + + +class Edge{ +public: + double p[2][2]; + double Length(void) const{ + double d[2]; + d[0]=p[0][0]-p[1][0]; + d[1]=p[0][1]-p[1][1]; + + return sqrt(d[0]*d[0]+d[1]*d[1]); + } +}; +class Triangle{ +public: + double p[3][3]; + double Area(void) const{ + double v1[3] , v2[3] , v[3]; + for( int d=0 ; d<3 ; d++ ) + { + v1[d] = p[1][d] - p[0][d]; + v2[d] = p[2][d] - p[0][d]; + } + v[0] = v1[1]*v2[2] - v1[2]*v2[1]; + v[1] = -v1[0]*v2[2] + v1[2]*v2[0]; + v[2] = v1[0]*v2[1] - v1[1]*v2[0]; + return sqrt( v[0]*v[0] + v[1]*v[1] + v[2]*v[2] ) / 2; + } + double AspectRatio(void) const{ + double d=0; + int i,j; + for(i=0;i<3;i++){ + for(i=0;i<3;i++) + for(j=0;j<3;j++){d+=(p[(i+1)%3][j]-p[i][j])*(p[(i+1)%3][j]-p[i][j]);} + } + return Area()/d; + } + +}; +class CoredPointIndex +{ +public: + int index; + char inCore; + + int operator == (const CoredPointIndex& cpi) const {return (index==cpi.index) && (inCore==cpi.inCore);}; + int operator != (const CoredPointIndex& cpi) const {return (index!=cpi.index) || (inCore!=cpi.inCore);}; +}; +class EdgeIndex{ +public: + int idx[2]; +}; +class CoredEdgeIndex +{ +public: + CoredPointIndex idx[2]; +}; +class TriangleIndex{ +public: + int idx[3]; +}; + +class TriangulationEdge +{ +public: + TriangulationEdge(void); + int pIndex[2]; + int tIndex[2]; +}; + +class TriangulationTriangle +{ +public: + TriangulationTriangle(void); + int eIndex[3]; +}; + +template +class Triangulation +{ +public: + + std::vector > points; + std::vector edges; + std::vector triangles; + + int factor( int tIndex,int& p1,int& p2,int& p3); + double area(void); + double area( int tIndex ); + double area( int p1 , int p2 , int p3 ); + int flipMinimize( int eIndex); + int addTriangle( int p1 , int p2 , int p3 ); + +protected: + hash_map edgeMap; + static long long EdgeIndex( int p1 , int p2 ); + double area(const Triangle& t); +}; + + +template +void EdgeCollapse(const Real& edgeRatio,std::vector& triangles,std::vector< Point3D >& positions,std::vector >* normals); +template +void TriangleCollapse(const Real& edgeRatio,std::vector& triangles,std::vector >& positions,std::vector >* normals); + +struct CoredVertexIndex +{ + int idx; + bool inCore; +}; +template< class Vertex > +class CoredMeshData +{ +public: + std::vector< Vertex > inCorePoints; + virtual ~CoredMeshData(); + virtual void resetIterator( void ) = 0; + + virtual int addOutOfCorePoint( const Vertex& p ) = 0; + virtual int addOutOfCorePoint_s( const Vertex& p ) = 0; + virtual int addPolygon_s( const std::vector< CoredVertexIndex >& vertices ) = 0; + virtual int addPolygon_s( const std::vector< int >& vertices ) = 0; + + virtual int nextOutOfCorePoint( Vertex& p )=0; + virtual int nextPolygon( std::vector< CoredVertexIndex >& vertices ) = 0; + + virtual int outOfCorePointCount(void)=0; + virtual int polygonCount( void ) = 0; +}; + +template< class Vertex > +class CoredVectorMeshData : public CoredMeshData< Vertex > +{ + std::vector< Vertex > oocPoints; + std::vector< std::vector< int > > polygons; + int polygonIndex; + int oocPointIndex; +public: + CoredVectorMeshData(void); + + void resetIterator(void); + + int addOutOfCorePoint( const Vertex& p ); + int addOutOfCorePoint_s( const Vertex& p ); + int addPolygon_s( const std::vector< CoredVertexIndex >& vertices ); + int addPolygon_s( const std::vector< int >& vertices ); + + int nextOutOfCorePoint( Vertex& p ); + int nextPolygon( std::vector< CoredVertexIndex >& vertices ); + + int outOfCorePointCount(void); + int polygonCount( void ); +}; +class BufferedReadWriteFile +{ + bool tempFile; + FILE* _fp; + char *_buffer , _fileName[1024]; + size_t _bufferIndex , _bufferSize; +public: + BufferedReadWriteFile( char* fileName=NULL , int bufferSize=(1<<20) ); + ~BufferedReadWriteFile( void ); + bool write( const void* data , size_t size ); + bool read ( void* data , size_t size ); + void reset( void ); +}; +template< class Vertex > +class CoredFileMeshData : public CoredMeshData< Vertex > +{ + char pointFileName[1024] , polygonFileName[1024]; + BufferedReadWriteFile *oocPointFile , *polygonFile; + int oocPoints , polygons; +public: + CoredFileMeshData( void ); + ~CoredFileMeshData( void ); + + void resetIterator( void ); + + int addOutOfCorePoint( const Vertex& p ); + int addOutOfCorePoint_s( const Vertex& p ); + int addPolygon_s( const std::vector< CoredVertexIndex >& vertices ); + int addPolygon_s( const std::vector< int >& vertices ); + + int nextOutOfCorePoint( Vertex& p ); + int nextPolygon( std::vector< CoredVertexIndex >& vertices ); + + int outOfCorePointCount( void ); + int polygonCount( void ); +}; +#include "Geometry.inl" + +#endif // GEOMETRY_INCLUDED diff --git a/src/lib/geogram/third_party/PoissonRecon/Geometry.inl b/src/lib/geogram/third_party/PoissonRecon/Geometry.inl old mode 100755 new mode 100644 index 2b7194a9..f3cd5082 --- a/src/lib/geogram/third_party/PoissonRecon/Geometry.inl +++ b/src/lib/geogram/third_party/PoissonRecon/Geometry.inl @@ -1,606 +1,606 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - -#include - -template -Real Random(void){return Real(rand())/RAND_MAX;} - -template -Point3D RandomBallPoint(void){ - Point3D p; - while(1){ - p.coords[0]=Real(1.0-2.0*Random()); - p.coords[1]=Real(1.0-2.0*Random()); - p.coords[2]=Real(1.0-2.0*Random()); - double l=SquareLength(p); - if(l<=1){return p;} - } -} -template -Point3D RandomSpherePoint(void){ - Point3D p=RandomBallPoint(); - Real l=Real(Length(p)); - p.coords[0]/=l; - p.coords[1]/=l; - p.coords[2]/=l; - return p; -} - -template -double SquareLength(const Point3D& p){return p.coords[0]*p.coords[0]+p.coords[1]*p.coords[1]+p.coords[2]*p.coords[2];} - -template -double Length(const Point3D& p){return sqrt(SquareLength(p));} - -template -double SquareDistance(const Point3D& p1,const Point3D& p2){ - return (p1.coords[0]-p2.coords[0])*(p1.coords[0]-p2.coords[0])+(p1.coords[1]-p2.coords[1])*(p1.coords[1]-p2.coords[1])+(p1.coords[2]-p2.coords[2])*(p1.coords[2]-p2.coords[2]); -} - -template -double Distance(const Point3D& p1,const Point3D& p2){return sqrt(SquareDistance(p1,p2));} - -template -void CrossProduct(const Point3D& p1,const Point3D& p2,Point3D& p){ - p.coords[0]= p1.coords[1]*p2.coords[2]-p1.coords[2]*p2.coords[1]; - p.coords[1]=-p1.coords[0]*p2.coords[2]+p1.coords[2]*p2.coords[0]; - p.coords[2]= p1.coords[0]*p2.coords[1]-p1.coords[1]*p2.coords[0]; -} -template -void EdgeCollapse(const Real& edgeRatio,std::vector& triangles,std::vector< Point3D >& positions,std::vector< Point3D >* normals){ - int i,j,*remapTable,*pointCount,idx[3]; - Point3D p[3],q[2],c; - double d[3],a; - double Ratio=12.0/sqrt(3.0); // (Sum of Squares Length / Area) for and equilateral triangle - - remapTable=new int[positions.size()]; - pointCount=new int[positions.size()]; - for(i=0;i=0;i--){ - for(j=0;j<3;j++){ - idx[j]=triangles[i].idx[j]; - while(remapTable[idx[j]] a*Ratio){ - // Find the smallest edge - j=0; - if(d[1]=0;i--){ - for(j=0;j<3;j++){ - idx[j]=triangles[i].idx[j]; - while(remapTable[idx[j]] -void TriangleCollapse(const Real& edgeRatio,std::vector& triangles,std::vector< Point3D >& positions,std::vector< Point3D >* normals){ - int i,j,*remapTable,*pointCount,idx[3]; - Point3D p[3],q[2],c; - double d[3],a; - double Ratio=12.0/sqrt(3.0); // (Sum of Squares Length / Area) for and equilateral triangle - - remapTable=new int[positions.size()]; - pointCount=new int[positions.size()]; - for(i=0;i=0;i--){ - for(j=0;j<3;j++){ - idx[j]=triangles[i].idx[j]; - while(remapTable[idx[j]] a*Ratio){ - // Find the smallest edge - j=0; - if(d[1]=0;i--){ - for(j=0;j<3;j++){ - idx[j]=triangles[i].idx[j]; - while(remapTable[idx[j]] -long long Triangulation::EdgeIndex( int p1 , int p2 ) -{ - if(p1>p2) {return ((long long)(p1)<<32) | ((long long)(p2));} - else {return ((long long)(p2)<<32) | ((long long)(p1));} -} - -template -int Triangulation::factor(int tIndex,int& p1,int& p2,int & p3){ - if(triangles[tIndex].eIndex[0]<0 || triangles[tIndex].eIndex[1]<0 || triangles[tIndex].eIndex[2]<0){return 0;} - if(edges[triangles[tIndex].eIndex[0]].tIndex[0]==tIndex){p1=edges[triangles[tIndex].eIndex[0]].pIndex[0];} - else {p1=edges[triangles[tIndex].eIndex[0]].pIndex[1];} - if(edges[triangles[tIndex].eIndex[1]].tIndex[0]==tIndex){p2=edges[triangles[tIndex].eIndex[1]].pIndex[0];} - else {p2=edges[triangles[tIndex].eIndex[1]].pIndex[1];} - if(edges[triangles[tIndex].eIndex[2]].tIndex[0]==tIndex){p3=edges[triangles[tIndex].eIndex[2]].pIndex[0];} - else {p3=edges[triangles[tIndex].eIndex[2]].pIndex[1];} - return 1; -} -template -double Triangulation::area(int p1,int p2,int p3){ - Point3D q1,q2,q; - for(int i=0;i<3;i++){ - q1.coords[i]=points[p2].coords[i]-points[p1].coords[i]; - q2.coords[i]=points[p3].coords[i]-points[p1].coords[i]; - } - CrossProduct(q1,q2,q); - return Length(q); -} -template -double Triangulation::area(int tIndex){ - int p1,p2,p3; - factor(tIndex,p1,p2,p3); - return area(p1,p2,p3); -} -template -double Triangulation::area(void){ - double a=0; - for(int i=0;i -int Triangulation::addTriangle(int p1,int p2,int p3){ - hash_map::iterator iter; - int tIdx,eIdx,p[3]; - p[0]=p1; - p[1]=p2; - p[2]=p3; - triangles.push_back(TriangulationTriangle()); - tIdx=int(triangles.size())-1; - - for(int i=0;i<3;i++) - { - long long e = EdgeIndex(p[i],p[(i+1)%3]); - iter=edgeMap.find(e); - if(iter==edgeMap.end()) - { - TriangulationEdge edge; - edge.pIndex[0]=p[i]; - edge.pIndex[1]=p[(i+1)%3]; - edges.push_back(edge); - eIdx=int(edges.size())-1; - edgeMap[e]=eIdx; - edges[eIdx].tIndex[0]=tIdx; - } - else{ - eIdx=edgeMap[e]; - if(edges[eIdx].pIndex[0]==p[i]){ - if(edges[eIdx].tIndex[0]<0){edges[eIdx].tIndex[0]=tIdx;} - else{printf("Edge Triangle in use 1\n");return 0;} - } - else{ - if(edges[eIdx].tIndex[1]<0){edges[eIdx].tIndex[1]=tIdx;} - else{printf("Edge Triangle in use 2\n");return 0;} - } - - } - triangles[tIdx].eIndex[i]=eIdx; - } - return tIdx; -} -template -int Triangulation::flipMinimize(int eIndex){ - double oldArea,newArea; - int oldP[3],oldQ[3],newP[3],newQ[3]; - TriangulationEdge newEdge; - - if(edges[eIndex].tIndex[0]<0 || edges[eIndex].tIndex[1]<0){return 0;} - - if(!factor(edges[eIndex].tIndex[0],oldP[0],oldP[1],oldP[2])){return 0;} - if(!factor(edges[eIndex].tIndex[1],oldQ[0],oldQ[1],oldQ[2])){return 0;} - - oldArea=area(oldP[0],oldP[1],oldP[2])+area(oldQ[0],oldQ[1],oldQ[2]); - int idxP,idxQ; - for(idxP=0;idxP<3;idxP++){ - int i; - for(i=0;i<3;i++){if(oldP[idxP]==oldQ[i]){break;}} - if(i==3){break;} - } - for(idxQ=0;idxQ<3;idxQ++){ - int i; - for(i=0;i<3;i++){if(oldP[i]==oldQ[idxQ]){break;}} - if(i==3){break;} - } - if(idxP==3 || idxQ==3){return 0;} - newP[0]=oldP[idxP]; - newP[1]=oldP[(idxP+1)%3]; - newP[2]=oldQ[idxQ]; - newQ[0]=oldQ[idxQ]; - newQ[1]=oldP[(idxP+2)%3]; - newQ[2]=oldP[idxP]; - - newArea=area(newP[0],newP[1],newP[2])+area(newQ[0],newQ[1],newQ[2]); - if(oldArea<=newArea){return 0;} - - // Remove the entry in the hash_table for the old edge - edgeMap.erase(EdgeIndex(edges[eIndex].pIndex[0],edges[eIndex].pIndex[1])); - // Set the new edge so that the zero-side is newQ - edges[eIndex].pIndex[0]=newP[0]; - edges[eIndex].pIndex[1]=newQ[0]; - // Insert the entry into the hash_table for the new edge - edgeMap[EdgeIndex(newP[0],newQ[0])]=eIndex; - // Update the triangle information - for(int i=0;i<3;i++){ - int idx; - idx=edgeMap[EdgeIndex(newQ[i],newQ[(i+1)%3])]; - triangles[edges[eIndex].tIndex[0]].eIndex[i]=idx; - if(idx!=eIndex){ - if(edges[idx].tIndex[0]==edges[eIndex].tIndex[1]){edges[idx].tIndex[0]=edges[eIndex].tIndex[0];} - if(edges[idx].tIndex[1]==edges[eIndex].tIndex[1]){edges[idx].tIndex[1]=edges[eIndex].tIndex[0];} - } - - idx=edgeMap[EdgeIndex(newP[i],newP[(i+1)%3])]; - triangles[edges[eIndex].tIndex[1]].eIndex[i]=idx; - if(idx!=eIndex){ - if(edges[idx].tIndex[0]==edges[eIndex].tIndex[0]){edges[idx].tIndex[0]=edges[eIndex].tIndex[1];} - if(edges[idx].tIndex[1]==edges[eIndex].tIndex[0]){edges[idx].tIndex[1]=edges[eIndex].tIndex[1];} - } - } - return 1; -} - -///////////////////////// -// CoredMeshData // -///////////////////////// -template< class Vertex > -CoredMeshData< Vertex >::~CoredMeshData() { -} - -///////////////////////// -// CoredVectorMeshData // -///////////////////////// -template< class Vertex > -CoredVectorMeshData< Vertex >::CoredVectorMeshData( void ) { oocPointIndex = polygonIndex = 0; } -template< class Vertex > -void CoredVectorMeshData< Vertex >::resetIterator ( void ) { oocPointIndex = polygonIndex = 0; } -template< class Vertex > -int CoredVectorMeshData< Vertex >::addOutOfCorePoint( const Vertex& p ) -{ - oocPoints.push_back(p); - return int(oocPoints.size())-1; -} -template< class Vertex > -int CoredVectorMeshData< Vertex >::addOutOfCorePoint_s( const Vertex& p ) -{ - size_t sz; -#ifdef _OPENMP -#pragma omp critical (CoredVectorMeshData_addOutOfCorePoint_s ) -#endif - { - sz = oocPoints.size(); - oocPoints.push_back(p); - } - return (int)sz; -} -template< class Vertex > -int CoredVectorMeshData< Vertex >::addPolygon_s( const std::vector< int >& polygon ) -{ - size_t sz; -#ifdef _OPENMP -#pragma omp critical (CoredVectorMeshData_addPolygon_s) -#endif - { - sz = polygon.size(); - polygons.push_back( polygon ); - } - return (int)sz; -} -template< class Vertex > -int CoredVectorMeshData< Vertex >::addPolygon_s( const std::vector< CoredVertexIndex >& vertices ) -{ - std::vector< int > polygon( vertices.size() ); - for( int i=0 ; i<(int)vertices.size() ; i++ ) - if( vertices[i].inCore ) polygon[i] = vertices[i].idx; - else polygon[i] = -vertices[i].idx-1; - return addPolygon_s( polygon ); -} -template< class Vertex > -int CoredVectorMeshData< Vertex >::nextOutOfCorePoint( Vertex& p ) -{ - if( oocPointIndex -int CoredVectorMeshData< Vertex >::nextPolygon( std::vector< CoredVertexIndex >& vertices ) -{ - if( polygonIndex& polygon = polygons[ polygonIndex++ ]; - vertices.resize( polygon.size() ); - for( int i=0 ; i -int CoredVectorMeshData< Vertex >::outOfCorePointCount(void){return int(oocPoints.size());} -template< class Vertex > -int CoredVectorMeshData< Vertex >::polygonCount( void ) { return int( polygons.size() ); } - -/////////////////////// -// CoredFileMeshData // -/////////////////////// -template< class Vertex > -CoredFileMeshData< Vertex >::CoredFileMeshData( void ) -{ - oocPoints = polygons = 0; - - oocPointFile = new BufferedReadWriteFile(); - polygonFile = new BufferedReadWriteFile(); -} -template< class Vertex > -CoredFileMeshData< Vertex >::~CoredFileMeshData( void ) -{ - delete oocPointFile; - delete polygonFile; -} -template< class Vertex > -void CoredFileMeshData< Vertex >::resetIterator ( void ) -{ - oocPointFile->reset(); - polygonFile->reset(); -} -template< class Vertex > -int CoredFileMeshData< Vertex >::addOutOfCorePoint( const Vertex& p ) -{ - oocPointFile->write( &p , sizeof( Vertex ) ); - oocPoints++; - return oocPoints-1; -} -template< class Vertex > -int CoredFileMeshData< Vertex >::addOutOfCorePoint_s( const Vertex& p ) -{ - int sz; -#ifdef _OPENMP -#pragma omp critical (CoredFileMeshData_addOutOfCorePoint_s) -#endif - { - sz = oocPoints; - oocPointFile->write( &p , sizeof( Vertex ) ); - oocPoints++; - } - return sz; -} -template< class Vertex > -int CoredFileMeshData< Vertex >::addPolygon_s( const std::vector< int >& vertices ) -{ - int sz , vSize = (int)vertices.size(); -#ifdef _OPENMP -#pragma omp critical (CoredFileMeshData_addPolygon_s ) -#endif - { - sz = polygons; - polygonFile->write( &vSize , sizeof(int) ); - polygonFile->write( &vertices[0] , sizeof(int) * vSize ); - polygons++; - } - return sz; -} -template< class Vertex > -int CoredFileMeshData< Vertex >::addPolygon_s( const std::vector< CoredVertexIndex >& vertices ) -{ - std::vector< int > polygon( vertices.size() ); - for( int i=0 ; i<(int)vertices.size() ; i++ ) - if( vertices[i].inCore ) polygon[i] = vertices[i].idx; - else polygon[i] = -vertices[i].idx-1; - return addPolygon_s( polygon ); -} -template< class Vertex > -int CoredFileMeshData< Vertex >::nextOutOfCorePoint( Vertex& p ) -{ - if( oocPointFile->read( &p , sizeof( Vertex ) ) ) return 1; - else return 0; -} -template< class Vertex > -int CoredFileMeshData< Vertex >::nextPolygon( std::vector< CoredVertexIndex >& vertices ) -{ - int pSize; - if( polygonFile->read( &pSize , sizeof(int) ) ) - { - std::vector< int > polygon( pSize ); - if( polygonFile->read( &polygon[0] , sizeof(int)*pSize ) ) - { - vertices.resize( pSize ); - for( int i=0 ; i -int CoredFileMeshData< Vertex >::outOfCorePointCount( void ){ return oocPoints; } -template< class Vertex > -int CoredFileMeshData< Vertex >::polygonCount( void ) { return polygons; } +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ + +#include + +template +Real Random(void){return Real(rand())/RAND_MAX;} + +template +Point3D RandomBallPoint(void){ + Point3D p; + while(1){ + p.coords[0]=Real(1.0-2.0*Random()); + p.coords[1]=Real(1.0-2.0*Random()); + p.coords[2]=Real(1.0-2.0*Random()); + double l=SquareLength(p); + if(l<=1){return p;} + } +} +template +Point3D RandomSpherePoint(void){ + Point3D p=RandomBallPoint(); + Real l=Real(Length(p)); + p.coords[0]/=l; + p.coords[1]/=l; + p.coords[2]/=l; + return p; +} + +template +double SquareLength(const Point3D& p){return p.coords[0]*p.coords[0]+p.coords[1]*p.coords[1]+p.coords[2]*p.coords[2];} + +template +double Length(const Point3D& p){return sqrt(SquareLength(p));} + +template +double SquareDistance(const Point3D& p1,const Point3D& p2){ + return (p1.coords[0]-p2.coords[0])*(p1.coords[0]-p2.coords[0])+(p1.coords[1]-p2.coords[1])*(p1.coords[1]-p2.coords[1])+(p1.coords[2]-p2.coords[2])*(p1.coords[2]-p2.coords[2]); +} + +template +double Distance(const Point3D& p1,const Point3D& p2){return sqrt(SquareDistance(p1,p2));} + +template +void CrossProduct(const Point3D& p1,const Point3D& p2,Point3D& p){ + p.coords[0]= p1.coords[1]*p2.coords[2]-p1.coords[2]*p2.coords[1]; + p.coords[1]=-p1.coords[0]*p2.coords[2]+p1.coords[2]*p2.coords[0]; + p.coords[2]= p1.coords[0]*p2.coords[1]-p1.coords[1]*p2.coords[0]; +} +template +void EdgeCollapse(const Real& edgeRatio,std::vector& triangles,std::vector< Point3D >& positions,std::vector< Point3D >* normals){ + int i,j,*remapTable,*pointCount,idx[3]; + Point3D p[3],q[2],c; + double d[3],a; + double Ratio=12.0/sqrt(3.0); // (Sum of Squares Length / Area) for and equilateral triangle + + remapTable=new int[positions.size()]; + pointCount=new int[positions.size()]; + for(i=0;i=0;i--){ + for(j=0;j<3;j++){ + idx[j]=triangles[i].idx[j]; + while(remapTable[idx[j]] a*Ratio){ + // Find the smallest edge + j=0; + if(d[1]=0;i--){ + for(j=0;j<3;j++){ + idx[j]=triangles[i].idx[j]; + while(remapTable[idx[j]] +void TriangleCollapse(const Real& edgeRatio,std::vector& triangles,std::vector< Point3D >& positions,std::vector< Point3D >* normals){ + int i,j,*remapTable,*pointCount,idx[3]; + Point3D p[3],q[2],c; + double d[3],a; + double Ratio=12.0/sqrt(3.0); // (Sum of Squares Length / Area) for and equilateral triangle + + remapTable=new int[positions.size()]; + pointCount=new int[positions.size()]; + for(i=0;i=0;i--){ + for(j=0;j<3;j++){ + idx[j]=triangles[i].idx[j]; + while(remapTable[idx[j]] a*Ratio){ + // Find the smallest edge + j=0; + if(d[1]=0;i--){ + for(j=0;j<3;j++){ + idx[j]=triangles[i].idx[j]; + while(remapTable[idx[j]] +long long Triangulation::EdgeIndex( int p1 , int p2 ) +{ + if(p1>p2) {return ((long long)(p1)<<32) | ((long long)(p2));} + else {return ((long long)(p2)<<32) | ((long long)(p1));} +} + +template +int Triangulation::factor(int tIndex,int& p1,int& p2,int & p3){ + if(triangles[tIndex].eIndex[0]<0 || triangles[tIndex].eIndex[1]<0 || triangles[tIndex].eIndex[2]<0){return 0;} + if(edges[triangles[tIndex].eIndex[0]].tIndex[0]==tIndex){p1=edges[triangles[tIndex].eIndex[0]].pIndex[0];} + else {p1=edges[triangles[tIndex].eIndex[0]].pIndex[1];} + if(edges[triangles[tIndex].eIndex[1]].tIndex[0]==tIndex){p2=edges[triangles[tIndex].eIndex[1]].pIndex[0];} + else {p2=edges[triangles[tIndex].eIndex[1]].pIndex[1];} + if(edges[triangles[tIndex].eIndex[2]].tIndex[0]==tIndex){p3=edges[triangles[tIndex].eIndex[2]].pIndex[0];} + else {p3=edges[triangles[tIndex].eIndex[2]].pIndex[1];} + return 1; +} +template +double Triangulation::area(int p1,int p2,int p3){ + Point3D q1,q2,q; + for(int i=0;i<3;i++){ + q1.coords[i]=points[p2].coords[i]-points[p1].coords[i]; + q2.coords[i]=points[p3].coords[i]-points[p1].coords[i]; + } + CrossProduct(q1,q2,q); + return Length(q); +} +template +double Triangulation::area(int tIndex){ + int p1,p2,p3; + factor(tIndex,p1,p2,p3); + return area(p1,p2,p3); +} +template +double Triangulation::area(void){ + double a=0; + for(int i=0;i +int Triangulation::addTriangle(int p1,int p2,int p3){ + hash_map::iterator iter; + int tIdx,eIdx,p[3]; + p[0]=p1; + p[1]=p2; + p[2]=p3; + triangles.push_back(TriangulationTriangle()); + tIdx=int(triangles.size())-1; + + for(int i=0;i<3;i++) + { + long long e = EdgeIndex(p[i],p[(i+1)%3]); + iter=edgeMap.find(e); + if(iter==edgeMap.end()) + { + TriangulationEdge edge; + edge.pIndex[0]=p[i]; + edge.pIndex[1]=p[(i+1)%3]; + edges.push_back(edge); + eIdx=int(edges.size())-1; + edgeMap[e]=eIdx; + edges[eIdx].tIndex[0]=tIdx; + } + else{ + eIdx=edgeMap[e]; + if(edges[eIdx].pIndex[0]==p[i]){ + if(edges[eIdx].tIndex[0]<0){edges[eIdx].tIndex[0]=tIdx;} + else{printf("Edge Triangle in use 1\n");return 0;} + } + else{ + if(edges[eIdx].tIndex[1]<0){edges[eIdx].tIndex[1]=tIdx;} + else{printf("Edge Triangle in use 2\n");return 0;} + } + + } + triangles[tIdx].eIndex[i]=eIdx; + } + return tIdx; +} +template +int Triangulation::flipMinimize(int eIndex){ + double oldArea,newArea; + int oldP[3],oldQ[3],newP[3],newQ[3]; + TriangulationEdge newEdge; + + if(edges[eIndex].tIndex[0]<0 || edges[eIndex].tIndex[1]<0){return 0;} + + if(!factor(edges[eIndex].tIndex[0],oldP[0],oldP[1],oldP[2])){return 0;} + if(!factor(edges[eIndex].tIndex[1],oldQ[0],oldQ[1],oldQ[2])){return 0;} + + oldArea=area(oldP[0],oldP[1],oldP[2])+area(oldQ[0],oldQ[1],oldQ[2]); + int idxP,idxQ; + for(idxP=0;idxP<3;idxP++){ + int i; + for(i=0;i<3;i++){if(oldP[idxP]==oldQ[i]){break;}} + if(i==3){break;} + } + for(idxQ=0;idxQ<3;idxQ++){ + int i; + for(i=0;i<3;i++){if(oldP[i]==oldQ[idxQ]){break;}} + if(i==3){break;} + } + if(idxP==3 || idxQ==3){return 0;} + newP[0]=oldP[idxP]; + newP[1]=oldP[(idxP+1)%3]; + newP[2]=oldQ[idxQ]; + newQ[0]=oldQ[idxQ]; + newQ[1]=oldP[(idxP+2)%3]; + newQ[2]=oldP[idxP]; + + newArea=area(newP[0],newP[1],newP[2])+area(newQ[0],newQ[1],newQ[2]); + if(oldArea<=newArea){return 0;} + + // Remove the entry in the hash_table for the old edge + edgeMap.erase(EdgeIndex(edges[eIndex].pIndex[0],edges[eIndex].pIndex[1])); + // Set the new edge so that the zero-side is newQ + edges[eIndex].pIndex[0]=newP[0]; + edges[eIndex].pIndex[1]=newQ[0]; + // Insert the entry into the hash_table for the new edge + edgeMap[EdgeIndex(newP[0],newQ[0])]=eIndex; + // Update the triangle information + for(int i=0;i<3;i++){ + int idx; + idx=edgeMap[EdgeIndex(newQ[i],newQ[(i+1)%3])]; + triangles[edges[eIndex].tIndex[0]].eIndex[i]=idx; + if(idx!=eIndex){ + if(edges[idx].tIndex[0]==edges[eIndex].tIndex[1]){edges[idx].tIndex[0]=edges[eIndex].tIndex[0];} + if(edges[idx].tIndex[1]==edges[eIndex].tIndex[1]){edges[idx].tIndex[1]=edges[eIndex].tIndex[0];} + } + + idx=edgeMap[EdgeIndex(newP[i],newP[(i+1)%3])]; + triangles[edges[eIndex].tIndex[1]].eIndex[i]=idx; + if(idx!=eIndex){ + if(edges[idx].tIndex[0]==edges[eIndex].tIndex[0]){edges[idx].tIndex[0]=edges[eIndex].tIndex[1];} + if(edges[idx].tIndex[1]==edges[eIndex].tIndex[0]){edges[idx].tIndex[1]=edges[eIndex].tIndex[1];} + } + } + return 1; +} + +///////////////////////// +// CoredMeshData // +///////////////////////// +template< class Vertex > +CoredMeshData< Vertex >::~CoredMeshData() { +} + +///////////////////////// +// CoredVectorMeshData // +///////////////////////// +template< class Vertex > +CoredVectorMeshData< Vertex >::CoredVectorMeshData( void ) { oocPointIndex = polygonIndex = 0; } +template< class Vertex > +void CoredVectorMeshData< Vertex >::resetIterator ( void ) { oocPointIndex = polygonIndex = 0; } +template< class Vertex > +int CoredVectorMeshData< Vertex >::addOutOfCorePoint( const Vertex& p ) +{ + oocPoints.push_back(p); + return int(oocPoints.size())-1; +} +template< class Vertex > +int CoredVectorMeshData< Vertex >::addOutOfCorePoint_s( const Vertex& p ) +{ + size_t sz; +#ifdef _OPENMP +#pragma omp critical (CoredVectorMeshData_addOutOfCorePoint_s ) +#endif + { + sz = oocPoints.size(); + oocPoints.push_back(p); + } + return (int)sz; +} +template< class Vertex > +int CoredVectorMeshData< Vertex >::addPolygon_s( const std::vector< int >& polygon ) +{ + size_t sz; +#ifdef _OPENMP +#pragma omp critical (CoredVectorMeshData_addPolygon_s) +#endif + { + sz = polygon.size(); + polygons.push_back( polygon ); + } + return (int)sz; +} +template< class Vertex > +int CoredVectorMeshData< Vertex >::addPolygon_s( const std::vector< CoredVertexIndex >& vertices ) +{ + std::vector< int > polygon( vertices.size() ); + for( int i=0 ; i<(int)vertices.size() ; i++ ) + if( vertices[i].inCore ) polygon[i] = vertices[i].idx; + else polygon[i] = -vertices[i].idx-1; + return addPolygon_s( polygon ); +} +template< class Vertex > +int CoredVectorMeshData< Vertex >::nextOutOfCorePoint( Vertex& p ) +{ + if( oocPointIndex +int CoredVectorMeshData< Vertex >::nextPolygon( std::vector< CoredVertexIndex >& vertices ) +{ + if( polygonIndex& polygon = polygons[ polygonIndex++ ]; + vertices.resize( polygon.size() ); + for( int i=0 ; i +int CoredVectorMeshData< Vertex >::outOfCorePointCount(void){return int(oocPoints.size());} +template< class Vertex > +int CoredVectorMeshData< Vertex >::polygonCount( void ) { return int( polygons.size() ); } + +/////////////////////// +// CoredFileMeshData // +/////////////////////// +template< class Vertex > +CoredFileMeshData< Vertex >::CoredFileMeshData( void ) +{ + oocPoints = polygons = 0; + + oocPointFile = new BufferedReadWriteFile(); + polygonFile = new BufferedReadWriteFile(); +} +template< class Vertex > +CoredFileMeshData< Vertex >::~CoredFileMeshData( void ) +{ + delete oocPointFile; + delete polygonFile; +} +template< class Vertex > +void CoredFileMeshData< Vertex >::resetIterator ( void ) +{ + oocPointFile->reset(); + polygonFile->reset(); +} +template< class Vertex > +int CoredFileMeshData< Vertex >::addOutOfCorePoint( const Vertex& p ) +{ + oocPointFile->write( &p , sizeof( Vertex ) ); + oocPoints++; + return oocPoints-1; +} +template< class Vertex > +int CoredFileMeshData< Vertex >::addOutOfCorePoint_s( const Vertex& p ) +{ + int sz; +#ifdef _OPENMP +#pragma omp critical (CoredFileMeshData_addOutOfCorePoint_s) +#endif + { + sz = oocPoints; + oocPointFile->write( &p , sizeof( Vertex ) ); + oocPoints++; + } + return sz; +} +template< class Vertex > +int CoredFileMeshData< Vertex >::addPolygon_s( const std::vector< int >& vertices ) +{ + int sz , vSize = (int)vertices.size(); +#ifdef _OPENMP +#pragma omp critical (CoredFileMeshData_addPolygon_s ) +#endif + { + sz = polygons; + polygonFile->write( &vSize , sizeof(int) ); + polygonFile->write( &vertices[0] , sizeof(int) * vSize ); + polygons++; + } + return sz; +} +template< class Vertex > +int CoredFileMeshData< Vertex >::addPolygon_s( const std::vector< CoredVertexIndex >& vertices ) +{ + std::vector< int > polygon( vertices.size() ); + for( int i=0 ; i<(int)vertices.size() ; i++ ) + if( vertices[i].inCore ) polygon[i] = vertices[i].idx; + else polygon[i] = -vertices[i].idx-1; + return addPolygon_s( polygon ); +} +template< class Vertex > +int CoredFileMeshData< Vertex >::nextOutOfCorePoint( Vertex& p ) +{ + if( oocPointFile->read( &p , sizeof( Vertex ) ) ) return 1; + else return 0; +} +template< class Vertex > +int CoredFileMeshData< Vertex >::nextPolygon( std::vector< CoredVertexIndex >& vertices ) +{ + int pSize; + if( polygonFile->read( &pSize , sizeof(int) ) ) + { + std::vector< int > polygon( pSize ); + if( polygonFile->read( &polygon[0] , sizeof(int)*pSize ) ) + { + vertices.resize( pSize ); + for( int i=0 ; i +int CoredFileMeshData< Vertex >::outOfCorePointCount( void ){ return oocPoints; } +template< class Vertex > +int CoredFileMeshData< Vertex >::polygonCount( void ) { return polygons; } diff --git a/src/lib/geogram/third_party/PoissonRecon/Hash.h b/src/lib/geogram/third_party/PoissonRecon/Hash.h index d3f56d82..93ee1a59 100644 --- a/src/lib/geogram/third_party/PoissonRecon/Hash.h +++ b/src/lib/geogram/third_party/PoissonRecon/Hash.h @@ -1,30 +1,30 @@ -#ifndef HASH_INCLUDED -#define HASH_INCLUDED - -#ifdef _MSC_VER -#include -using stdext::hash_map; -#else // !WIN32 -#include -using namespace __gnu_cxx; - -namespace __gnu_cxx -{ - template<> struct hash { - size_t operator()(long long __x) const { return __x; } - }; - template<> struct hash { - size_t operator()(const long long __x) const { return __x; } - }; - - - template<> struct hash { - size_t operator()(unsigned long long __x) const { return __x; } - }; - template<> struct hash { - size_t operator()(const unsigned long long __x) const { return __x; } - }; -} -#endif // WIN32 -#endif // HASH_INCLUDED - +#ifndef HASH_INCLUDED +#define HASH_INCLUDED + +#ifdef _MSC_VER +#include +using stdext::hash_map; +#else // !WIN32 +#include +using namespace __gnu_cxx; + +namespace __gnu_cxx +{ + template<> struct hash { + size_t operator()(long long __x) const { return __x; } + }; + template<> struct hash { + size_t operator()(const long long __x) const { return __x; } + }; + + + template<> struct hash { + size_t operator()(unsigned long long __x) const { return __x; } + }; + template<> struct hash { + size_t operator()(const unsigned long long __x) const { return __x; } + }; +} +#endif // WIN32 +#endif // HASH_INCLUDED + diff --git a/src/lib/geogram/third_party/PoissonRecon/LICENSE.txt b/src/lib/geogram/third_party/PoissonRecon/LICENSE.txt old mode 100755 new mode 100644 diff --git a/src/lib/geogram/third_party/PoissonRecon/MAT.h b/src/lib/geogram/third_party/PoissonRecon/MAT.h old mode 100755 new mode 100644 index 1201251c..c090450d --- a/src/lib/geogram/third_party/PoissonRecon/MAT.h +++ b/src/lib/geogram/third_party/PoissonRecon/MAT.h @@ -1,48 +1,48 @@ -/* -Copyright (c) 2007, Michael Kazhdan -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ -#ifndef MAT_INCLUDED -#define MAT_INCLUDED -#include "Geometry.h" - -template -class MinimalAreaTriangulation -{ - Real* bestTriangulation; - int* midPoint; - Real GetArea(const size_t& i,const size_t& j,const std::vector >& vertices); - void GetTriangulation(const size_t& i,const size_t& j,const std::vector >& vertices,std::vector& triangles); -public: - MinimalAreaTriangulation(void); - ~MinimalAreaTriangulation(void); - Real GetArea(const std::vector >& vertices); - void GetTriangulation(const std::vector >& vertices,std::vector& triangles); -}; - -#include "MAT.inl" - -#endif // MAT_INCLUDED +/* +Copyright (c) 2007, Michael Kazhdan +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ +#ifndef MAT_INCLUDED +#define MAT_INCLUDED +#include "Geometry.h" + +template +class MinimalAreaTriangulation +{ + Real* bestTriangulation; + int* midPoint; + Real GetArea(const size_t& i,const size_t& j,const std::vector >& vertices); + void GetTriangulation(const size_t& i,const size_t& j,const std::vector >& vertices,std::vector& triangles); +public: + MinimalAreaTriangulation(void); + ~MinimalAreaTriangulation(void); + Real GetArea(const std::vector >& vertices); + void GetTriangulation(const std::vector >& vertices,std::vector& triangles); +}; + +#include "MAT.inl" + +#endif // MAT_INCLUDED diff --git a/src/lib/geogram/third_party/PoissonRecon/MAT.inl b/src/lib/geogram/third_party/PoissonRecon/MAT.inl old mode 100755 new mode 100644 diff --git a/src/lib/geogram/third_party/PoissonRecon/MarchingCubes.cpp b/src/lib/geogram/third_party/PoissonRecon/MarchingCubes.cpp index 4c50083a..2add9a9d 100644 --- a/src/lib/geogram/third_party/PoissonRecon/MarchingCubes.cpp +++ b/src/lib/geogram/third_party/PoissonRecon/MarchingCubes.cpp @@ -1,1026 +1,1026 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ -#include -#include "MarchingCubes.h" - -//////////// -// Square // -//////////// -int Square::AntipodalCornerIndex(int idx){ - int x,y; - FactorCornerIndex(idx,x,y); - return CornerIndex( (x+1)%2 , (y+1)%2 ); -} -int Square::CornerIndex( int x , int y ){ return (y<<1)|x; } -void Square::FactorCornerIndex( int idx , int& x , int& y ){ x=(idx>>0)&1 , y=(idx>>1)&1; } -int Square::EdgeIndex( int orientation , int i ) -{ - switch( orientation ) - { - case 0: // x - if( !i ) return 0; // (0,0) -> (1,0) - else return 2; // (0,1) -> (1,1) - case 1: // y - if( !i ) return 3; // (0,0) -> (0,1) - else return 1; // (1,0) -> (1,1) - }; - return -1; -} -void Square::FactorEdgeIndex(int idx,int& orientation,int& i){ - switch(idx){ - case 0: case 2: - orientation=0; - i=idx/2; - return; - case 1: case 3: - orientation=1; - i=((idx/2)+1)%2; - return; - }; -} -void Square::EdgeCorners(int idx,int& c1,int& c2){ - int orientation,i; - FactorEdgeIndex(idx,orientation,i); - switch(orientation){ - case 0: - c1 = CornerIndex(0,i); - c2 = CornerIndex(1,i); - break; - case 1: - c1 = CornerIndex(i,0); - c2 = CornerIndex(i,1); - break; - }; -} -int Square::ReflectEdgeIndex(int idx,int edgeIndex){ - int orientation=edgeIndex%2; - int o,i; - FactorEdgeIndex(idx,o,i); - if(o!=orientation){return idx;} - else{return EdgeIndex(o,(i+1)%2);} -} -int Square::ReflectCornerIndex(int idx,int edgeIndex){ - int orientation=edgeIndex%2; - int x,y; - FactorCornerIndex(idx,x,y); - switch(orientation){ - case 0: return CornerIndex((x+1)%2,y); - case 1: return CornerIndex(x,(y+1)%2); - }; - return -1; -} - - - -////////// -// Cube // -////////// -int Cube::CornerIndex( int x , int y , int z ){ return (z<<2)|(y<<1)|x; } -void Cube::FactorCornerIndex( int idx , int& x , int& y , int& z ){ x = (idx>>0)&1 , y = (idx>>1)&1 , z = (idx>>2)&1; } -int Cube::EdgeIndex(int orientation,int i,int j){return (i | (j<<1))|(orientation<<2);} -void Cube::FactorEdgeIndex( int idx , int& orientation , int& i , int &j ) -{ - orientation=idx>>2; - i = (idx&1); - j = (idx&2)>>1; -} -int Cube::FaceIndex( int x , int y , int z ) -{ - if ( x<0 ) return 0; - else if( x>0 ) return 1; - else if( y<0 ) return 2; - else if( y>0 ) return 3; - else if( z<0 ) return 4; - else if( z>0 ) return 5; - else return -1; -} -int Cube::FaceIndex( int dir , int offSet ){ return (dir<<1)|offSet; } - -void Cube::FactorFaceIndex( int idx , int& x , int& y , int& z ) -{ - x=y=z=0; - switch( idx ) - { - case 0: x=-1; break; - case 1: x= 1; break; - case 2: y=-1; break; - case 3: y= 1; break; - case 4: z=-1; break; - case 5: z= 1; break; - }; -} -void Cube::FactorFaceIndex( int idx , int& dir , int& offSet ) -{ - dir = idx>>1; - offSet=idx &1; -} -bool Cube::IsEdgeCorner( int cIndex , int e ) -{ - int o , i , j; - FactorEdgeIndex( e , o , i , j ); - switch( o ) - { - case 0: return (cIndex & 2)==(i<<1) && (cIndex & 4)==(j<<2); - case 1: return (cIndex & 1)==(i<<0) && (cIndex & 4)==(j<<2); - case 2: return (cIndex & 4)==(i<<2) && (cIndex & 2)==(j<<1); - default: return false; - } -} -bool Cube::IsFaceCorner( int cIndex , int f ) -{ - int dir , off; - FactorFaceIndex( f , dir , off ); - return ( cIndex & (1< (1,0) -1} // (1,0) -> (1,1) -2} // (0,1) -> (1,1) -3} // (0,0) -> (0,1) -*/ -const int MarchingSquares::edgeMask[1< -> -> - 9, // 1 -> 0 -> (0,0) -> 0,3 -> 9 - 3, // 2 -> 1 -> (1,0) -> 0,1 -> 3 - 10, // 3 -> 0,1 -> (0,0) (1,0) -> 1,3 -> 10 - 12, // 4 -> 2 -> (0,1) -> 2,3 -> 12 - 5, // 5 -> 0,2 -> (0,0) (0,1) -> 0,2 -> 5 - 15, // 6 -> 1,2 -> (1,0) (0,1) -> 0,1,2,3 -> 15 - 6, // 7 -> 0,1,2 -> (0,0) (1,0) (0,1) -> 1,2 -> 6 - 6, // 8 -> 3 -> (1,1) -> 1,2 -> 6 - 15, // 9 -> 0,3 -> (0,0) (1,1) -> 0,1,2,3 -> 15 - 5, // 10 -> 1,3 -> (1,0) (1,1) -> 0,2 -> 5 - 12, // 11 -> 0,1,3 -> (0,0) (1,0) (1,1) -> 2,3 -> 12 - 10, // 12 -> 2,3 -> (0,1) (1,1) -> 1,3 -> 10 - 3, // 13 -> 0,2,3 -> (0,0) (0,1) (1,1) -> 0,1 -> 3 - 9, // 14 -> 1,2,3 -> (1,0) (0,1) (1,1) -> 0,3 -> 9 - 0, // 15 -> 0,1,2,3 -> (0,0) (1,0) (0,1) (1,1) -> -}; -#if NEW_ORDERING -/* -0} // (0,0) -> (1,0) -1} // (1,0) -> (1,1) -2} // (0,1) -> (1,1) -3} // (0,0) -> (0,1) -*/ -const int MarchingSquares::edges[1<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(1,i,j)];}}} - else if (y<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(i,0,j)];}}} - else if (y>0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(i,1,j)];}}} - else if (z<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(i,j,0)];}}} - else if (z>0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(i,j,1)];}}} - if (v[0][0] < iso) idx |= 1; - if (v[1][0] < iso) idx |= 2; - if (v[1][1] < iso) idx |= 4; - if (v[0][1] < iso) idx |= 8; - return idx; -} -bool MarchingCubes::IsAmbiguous( const double v[Cube::CORNERS] , double isoValue , int faceIndex ){ return MarchingSquares::IsAmbiguous( GetFaceIndex( v , isoValue , faceIndex ) ); } -bool MarchingCubes::HasRoots( const double v[Cube::CORNERS] , double isoValue , int faceIndex ){ return MarchingSquares::HasRoots( GetFaceIndex( v , isoValue , faceIndex ) ); } -bool MarchingCubes::HasRoots( const double v[Cube::CORNERS] , double isoValue ){ return HasRoots( GetIndex( v , isoValue ) ); } -bool MarchingCubes::HasRoots( unsigned char mcIndex ){ return !(mcIndex==0 || mcIndex==255); } -int MarchingCubes::AddTriangles( const double v[Cube::CORNERS] , double iso , Triangle* isoTriangles ) -{ - unsigned char idx; - int ntriang=0; - Triangle tri; - - idx=GetIndex(v,iso); - - /* Cube is entirely in/out of the surface */ - if (!edgeMask[idx]) return 0; - - /* Find the vertices where the surface intersects the cube */ - int i,j,ii=1; - for(i=0;i<12;i++){ - if(edgeMask[idx] & ii){SetVertex(i,v,iso);} - ii<<=1; - } - /* Create the triangle */ - for( i=0 ; triangles[idx][i]!=-1 ; i+=3 ) - { - for(j=0;j<3;j++){ - tri.p[0][j]=vertexList[triangles[idx][i+0]][j]; - tri.p[1][j]=vertexList[triangles[idx][i+1]][j]; - tri.p[2][j]=vertexList[triangles[idx][i+2]][j]; - } - isoTriangles[ntriang++]=tri; - } - return ntriang; -} - -int MarchingCubes::AddTriangleIndices(const double v[Cube::CORNERS],double iso,int* isoIndices){ - unsigned char idx; - int ntriang=0; - - idx=GetIndex(v,iso); - - /* Cube is entirely in/out of the surface */ - if (!edgeMask[idx]) return 0; - - /* Create the triangle */ - for(int i=0;triangles[idx][i]!=-1;i+=3){ - for(int j=0;j<3;j++){isoIndices[i+j]=triangles[idx][i+j];} - ntriang++; - } - return ntriang; -} - -void MarchingCubes::SetVertex( int e , const double values[Cube::CORNERS] , double iso ) -{ - double t; - int o , i1 , i2; - Cube::FactorEdgeIndex( e , o , i1 , i2 ); - switch( o ) - { - case 0: - t = Interpolate( values[ Cube::CornerIndex( 0 , i1 , i2 ) ] - iso , values[ Cube::CornerIndex( 1 , i1 , i2 ) ] - iso ); - vertexList[e][0] = t , vertexList[e][1] = i1 , vertexList[e][2] = i2; - break; - case 1: - t = Interpolate( values[ Cube::CornerIndex( i1 , 0 , i2 ) ] - iso , values[ Cube::CornerIndex( i1 , 1 , i2 ) ] - iso ); - vertexList[e][0] = i1 , vertexList[e][1] = t , vertexList[e][2] = i2; - break; - case 2: - t = Interpolate( values[ Cube::CornerIndex( i1 , i2 , 0 ) ] - iso , values[ Cube::CornerIndex( i1 , i2 , 1 ) ] - iso ); - vertexList[e][0] = i1 , vertexList[e][1] = i2 , vertexList[e][2] = t; - break; - } -} -double MarchingCubes::Interpolate( double v1 , double v2 ) { return v1/(v1-v2); } - - -/////////////////////////////////// -unsigned char MarchingCubes::GetIndex(const float v[Cube::CORNERS],float iso){ - unsigned char idx=0; - if (v[Cube::CornerIndex(0,0,0)] < iso) idx |= 1; - if (v[Cube::CornerIndex(1,0,0)] < iso) idx |= 2; - if (v[Cube::CornerIndex(1,1,0)] < iso) idx |= 4; - if (v[Cube::CornerIndex(0,1,0)] < iso) idx |= 8; - if (v[Cube::CornerIndex(0,0,1)] < iso) idx |= 16; - if (v[Cube::CornerIndex(1,0,1)] < iso) idx |= 32; - if (v[Cube::CornerIndex(1,1,1)] < iso) idx |= 64; - if (v[Cube::CornerIndex(0,1,1)] < iso) idx |= 128; - return idx; -} -unsigned char MarchingCubes::GetFaceIndex( const float values[Cube::CORNERS] , float iso , int faceIndex ) -{ - int i,j,x,y,z; - unsigned char idx=0; - double v[2][2]; - Cube::FactorFaceIndex(faceIndex,x,y,z); - if (x<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(0,i,j)];}}} - else if (x>0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(1,i,j)];}}} - else if (y<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(i,0,j)];}}} - else if (y>0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(i,1,j)];}}} - else if (z<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(i,j,0)];}}} - else if (z>0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(i,j,1)];}}} - if (v[0][0] < iso) idx |= 1; - if (v[1][0] < iso) idx |= 2; - if (v[1][1] < iso) idx |= 4; - if (v[0][1] < iso) idx |= 8; - return idx; -} -unsigned char MarchingCubes::GetFaceIndex( unsigned char mcIndex , int faceIndex ) -{ - int i,j,x,y,z; - unsigned char idx=0; - int v[2][2]; - Cube::FactorFaceIndex(faceIndex,x,y,z); - if (x<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=mcIndex&(1<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=mcIndex&(1<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=mcIndex&(1<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=mcIndex&(1< +#include "MarchingCubes.h" + +//////////// +// Square // +//////////// +int Square::AntipodalCornerIndex(int idx){ + int x,y; + FactorCornerIndex(idx,x,y); + return CornerIndex( (x+1)%2 , (y+1)%2 ); +} +int Square::CornerIndex( int x , int y ){ return (y<<1)|x; } +void Square::FactorCornerIndex( int idx , int& x , int& y ){ x=(idx>>0)&1 , y=(idx>>1)&1; } +int Square::EdgeIndex( int orientation , int i ) +{ + switch( orientation ) + { + case 0: // x + if( !i ) return 0; // (0,0) -> (1,0) + else return 2; // (0,1) -> (1,1) + case 1: // y + if( !i ) return 3; // (0,0) -> (0,1) + else return 1; // (1,0) -> (1,1) + }; + return -1; +} +void Square::FactorEdgeIndex(int idx,int& orientation,int& i){ + switch(idx){ + case 0: case 2: + orientation=0; + i=idx/2; + return; + case 1: case 3: + orientation=1; + i=((idx/2)+1)%2; + return; + }; +} +void Square::EdgeCorners(int idx,int& c1,int& c2){ + int orientation,i; + FactorEdgeIndex(idx,orientation,i); + switch(orientation){ + case 0: + c1 = CornerIndex(0,i); + c2 = CornerIndex(1,i); + break; + case 1: + c1 = CornerIndex(i,0); + c2 = CornerIndex(i,1); + break; + }; +} +int Square::ReflectEdgeIndex(int idx,int edgeIndex){ + int orientation=edgeIndex%2; + int o,i; + FactorEdgeIndex(idx,o,i); + if(o!=orientation){return idx;} + else{return EdgeIndex(o,(i+1)%2);} +} +int Square::ReflectCornerIndex(int idx,int edgeIndex){ + int orientation=edgeIndex%2; + int x,y; + FactorCornerIndex(idx,x,y); + switch(orientation){ + case 0: return CornerIndex((x+1)%2,y); + case 1: return CornerIndex(x,(y+1)%2); + }; + return -1; +} + + + +////////// +// Cube // +////////// +int Cube::CornerIndex( int x , int y , int z ){ return (z<<2)|(y<<1)|x; } +void Cube::FactorCornerIndex( int idx , int& x , int& y , int& z ){ x = (idx>>0)&1 , y = (idx>>1)&1 , z = (idx>>2)&1; } +int Cube::EdgeIndex(int orientation,int i,int j){return (i | (j<<1))|(orientation<<2);} +void Cube::FactorEdgeIndex( int idx , int& orientation , int& i , int &j ) +{ + orientation=idx>>2; + i = (idx&1); + j = (idx&2)>>1; +} +int Cube::FaceIndex( int x , int y , int z ) +{ + if ( x<0 ) return 0; + else if( x>0 ) return 1; + else if( y<0 ) return 2; + else if( y>0 ) return 3; + else if( z<0 ) return 4; + else if( z>0 ) return 5; + else return -1; +} +int Cube::FaceIndex( int dir , int offSet ){ return (dir<<1)|offSet; } + +void Cube::FactorFaceIndex( int idx , int& x , int& y , int& z ) +{ + x=y=z=0; + switch( idx ) + { + case 0: x=-1; break; + case 1: x= 1; break; + case 2: y=-1; break; + case 3: y= 1; break; + case 4: z=-1; break; + case 5: z= 1; break; + }; +} +void Cube::FactorFaceIndex( int idx , int& dir , int& offSet ) +{ + dir = idx>>1; + offSet=idx &1; +} +bool Cube::IsEdgeCorner( int cIndex , int e ) +{ + int o , i , j; + FactorEdgeIndex( e , o , i , j ); + switch( o ) + { + case 0: return (cIndex & 2)==(i<<1) && (cIndex & 4)==(j<<2); + case 1: return (cIndex & 1)==(i<<0) && (cIndex & 4)==(j<<2); + case 2: return (cIndex & 4)==(i<<2) && (cIndex & 2)==(j<<1); + default: return false; + } +} +bool Cube::IsFaceCorner( int cIndex , int f ) +{ + int dir , off; + FactorFaceIndex( f , dir , off ); + return ( cIndex & (1< (1,0) +1} // (1,0) -> (1,1) +2} // (0,1) -> (1,1) +3} // (0,0) -> (0,1) +*/ +const int MarchingSquares::edgeMask[1< -> -> + 9, // 1 -> 0 -> (0,0) -> 0,3 -> 9 + 3, // 2 -> 1 -> (1,0) -> 0,1 -> 3 + 10, // 3 -> 0,1 -> (0,0) (1,0) -> 1,3 -> 10 + 12, // 4 -> 2 -> (0,1) -> 2,3 -> 12 + 5, // 5 -> 0,2 -> (0,0) (0,1) -> 0,2 -> 5 + 15, // 6 -> 1,2 -> (1,0) (0,1) -> 0,1,2,3 -> 15 + 6, // 7 -> 0,1,2 -> (0,0) (1,0) (0,1) -> 1,2 -> 6 + 6, // 8 -> 3 -> (1,1) -> 1,2 -> 6 + 15, // 9 -> 0,3 -> (0,0) (1,1) -> 0,1,2,3 -> 15 + 5, // 10 -> 1,3 -> (1,0) (1,1) -> 0,2 -> 5 + 12, // 11 -> 0,1,3 -> (0,0) (1,0) (1,1) -> 2,3 -> 12 + 10, // 12 -> 2,3 -> (0,1) (1,1) -> 1,3 -> 10 + 3, // 13 -> 0,2,3 -> (0,0) (0,1) (1,1) -> 0,1 -> 3 + 9, // 14 -> 1,2,3 -> (1,0) (0,1) (1,1) -> 0,3 -> 9 + 0, // 15 -> 0,1,2,3 -> (0,0) (1,0) (0,1) (1,1) -> +}; +#if NEW_ORDERING +/* +0} // (0,0) -> (1,0) +1} // (1,0) -> (1,1) +2} // (0,1) -> (1,1) +3} // (0,0) -> (0,1) +*/ +const int MarchingSquares::edges[1<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(1,i,j)];}}} + else if (y<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(i,0,j)];}}} + else if (y>0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(i,1,j)];}}} + else if (z<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(i,j,0)];}}} + else if (z>0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(i,j,1)];}}} + if (v[0][0] < iso) idx |= 1; + if (v[1][0] < iso) idx |= 2; + if (v[1][1] < iso) idx |= 4; + if (v[0][1] < iso) idx |= 8; + return idx; +} +bool MarchingCubes::IsAmbiguous( const double v[Cube::CORNERS] , double isoValue , int faceIndex ){ return MarchingSquares::IsAmbiguous( GetFaceIndex( v , isoValue , faceIndex ) ); } +bool MarchingCubes::HasRoots( const double v[Cube::CORNERS] , double isoValue , int faceIndex ){ return MarchingSquares::HasRoots( GetFaceIndex( v , isoValue , faceIndex ) ); } +bool MarchingCubes::HasRoots( const double v[Cube::CORNERS] , double isoValue ){ return HasRoots( GetIndex( v , isoValue ) ); } +bool MarchingCubes::HasRoots( unsigned char mcIndex ){ return !(mcIndex==0 || mcIndex==255); } +int MarchingCubes::AddTriangles( const double v[Cube::CORNERS] , double iso , Triangle* isoTriangles ) +{ + unsigned char idx; + int ntriang=0; + Triangle tri; + + idx=GetIndex(v,iso); + + /* Cube is entirely in/out of the surface */ + if (!edgeMask[idx]) return 0; + + /* Find the vertices where the surface intersects the cube */ + int i,j,ii=1; + for(i=0;i<12;i++){ + if(edgeMask[idx] & ii){SetVertex(i,v,iso);} + ii<<=1; + } + /* Create the triangle */ + for( i=0 ; triangles[idx][i]!=-1 ; i+=3 ) + { + for(j=0;j<3;j++){ + tri.p[0][j]=vertexList[triangles[idx][i+0]][j]; + tri.p[1][j]=vertexList[triangles[idx][i+1]][j]; + tri.p[2][j]=vertexList[triangles[idx][i+2]][j]; + } + isoTriangles[ntriang++]=tri; + } + return ntriang; +} + +int MarchingCubes::AddTriangleIndices(const double v[Cube::CORNERS],double iso,int* isoIndices){ + unsigned char idx; + int ntriang=0; + + idx=GetIndex(v,iso); + + /* Cube is entirely in/out of the surface */ + if (!edgeMask[idx]) return 0; + + /* Create the triangle */ + for(int i=0;triangles[idx][i]!=-1;i+=3){ + for(int j=0;j<3;j++){isoIndices[i+j]=triangles[idx][i+j];} + ntriang++; + } + return ntriang; +} + +void MarchingCubes::SetVertex( int e , const double values[Cube::CORNERS] , double iso ) +{ + double t; + int o , i1 , i2; + Cube::FactorEdgeIndex( e , o , i1 , i2 ); + switch( o ) + { + case 0: + t = Interpolate( values[ Cube::CornerIndex( 0 , i1 , i2 ) ] - iso , values[ Cube::CornerIndex( 1 , i1 , i2 ) ] - iso ); + vertexList[e][0] = t , vertexList[e][1] = i1 , vertexList[e][2] = i2; + break; + case 1: + t = Interpolate( values[ Cube::CornerIndex( i1 , 0 , i2 ) ] - iso , values[ Cube::CornerIndex( i1 , 1 , i2 ) ] - iso ); + vertexList[e][0] = i1 , vertexList[e][1] = t , vertexList[e][2] = i2; + break; + case 2: + t = Interpolate( values[ Cube::CornerIndex( i1 , i2 , 0 ) ] - iso , values[ Cube::CornerIndex( i1 , i2 , 1 ) ] - iso ); + vertexList[e][0] = i1 , vertexList[e][1] = i2 , vertexList[e][2] = t; + break; + } +} +double MarchingCubes::Interpolate( double v1 , double v2 ) { return v1/(v1-v2); } + + +/////////////////////////////////// +unsigned char MarchingCubes::GetIndex(const float v[Cube::CORNERS],float iso){ + unsigned char idx=0; + if (v[Cube::CornerIndex(0,0,0)] < iso) idx |= 1; + if (v[Cube::CornerIndex(1,0,0)] < iso) idx |= 2; + if (v[Cube::CornerIndex(1,1,0)] < iso) idx |= 4; + if (v[Cube::CornerIndex(0,1,0)] < iso) idx |= 8; + if (v[Cube::CornerIndex(0,0,1)] < iso) idx |= 16; + if (v[Cube::CornerIndex(1,0,1)] < iso) idx |= 32; + if (v[Cube::CornerIndex(1,1,1)] < iso) idx |= 64; + if (v[Cube::CornerIndex(0,1,1)] < iso) idx |= 128; + return idx; +} +unsigned char MarchingCubes::GetFaceIndex( const float values[Cube::CORNERS] , float iso , int faceIndex ) +{ + int i,j,x,y,z; + unsigned char idx=0; + double v[2][2]; + Cube::FactorFaceIndex(faceIndex,x,y,z); + if (x<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(0,i,j)];}}} + else if (x>0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(1,i,j)];}}} + else if (y<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(i,0,j)];}}} + else if (y>0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(i,1,j)];}}} + else if (z<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(i,j,0)];}}} + else if (z>0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=values[Cube::CornerIndex(i,j,1)];}}} + if (v[0][0] < iso) idx |= 1; + if (v[1][0] < iso) idx |= 2; + if (v[1][1] < iso) idx |= 4; + if (v[0][1] < iso) idx |= 8; + return idx; +} +unsigned char MarchingCubes::GetFaceIndex( unsigned char mcIndex , int faceIndex ) +{ + int i,j,x,y,z; + unsigned char idx=0; + int v[2][2]; + Cube::FactorFaceIndex(faceIndex,x,y,z); + if (x<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=mcIndex&(1<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=mcIndex&(1<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=mcIndex&(1<0){for(i=0;i<2;i++){for(j=0;j<2;j++){v[i][j]=mcIndex&(1< -#include "Geometry.h" - -#define NEW_ORDERING 1 - -class Square -{ -public: - const static unsigned int CORNERS=4 , EDGES=4 , FACES=1; - static int CornerIndex (int x,int y); - static int AntipodalCornerIndex(int idx); - static void FactorCornerIndex (int idx,int& x,int& y); - static int EdgeIndex (int orientation,int i); - static void FactorEdgeIndex (int idx,int& orientation,int& i); - - static int ReflectCornerIndex (int idx,int edgeIndex); - static int ReflectEdgeIndex (int idx,int edgeIndex); - - static void EdgeCorners(int idx,int& c1,int &c2); -}; - -class Cube{ -public: - const static unsigned int CORNERS=8 , EDGES=12 , FACES=6; - - static int CornerIndex ( int x , int y , int z ); - static void FactorCornerIndex ( int idx , int& x , int& y , int& z ); - static int EdgeIndex ( int orientation , int i , int j ); - static void FactorEdgeIndex ( int idx , int& orientation , int& i , int &j); - static int FaceIndex ( int dir , int offSet ); - static int FaceIndex ( int x , int y , int z ); - static void FactorFaceIndex ( int idx , int& x , int &y , int& z ); - static void FactorFaceIndex ( int idx , int& dir , int& offSet ); - - static int AntipodalCornerIndex ( int idx ); - static int FaceReflectCornerIndex ( int idx , int faceIndex ); - static int FaceReflectEdgeIndex ( int idx , int faceIndex ); - static int FaceReflectFaceIndex ( int idx , int faceIndex ); - static int EdgeReflectCornerIndex ( int idx , int edgeIndex ); - static int EdgeReflectEdgeIndex ( int edgeIndex ); - - static int FaceAdjacentToEdges ( int eIndex1 , int eIndex2 ); - static void FacesAdjacentToEdge ( int eIndex , int& f1Index , int& f2Index ); - - static void EdgeCorners( int idx , int& c1 , int &c2 ); - static void FaceCorners( int idx , int& c1 , int &c2 , int& c3 , int& c4 ); - - static bool IsEdgeCorner( int cIndex , int e ); - static bool IsFaceCorner( int cIndex , int f ); -}; - -class MarchingSquares -{ - static double Interpolate(double v1,double v2); - static void SetVertex(int e,const double values[Square::CORNERS],double iso); -public: - const static unsigned int MAX_EDGES=2; - static const int edgeMask[1< +#include "Geometry.h" + +#define NEW_ORDERING 1 + +class Square +{ +public: + const static unsigned int CORNERS=4 , EDGES=4 , FACES=1; + static int CornerIndex (int x,int y); + static int AntipodalCornerIndex(int idx); + static void FactorCornerIndex (int idx,int& x,int& y); + static int EdgeIndex (int orientation,int i); + static void FactorEdgeIndex (int idx,int& orientation,int& i); + + static int ReflectCornerIndex (int idx,int edgeIndex); + static int ReflectEdgeIndex (int idx,int edgeIndex); + + static void EdgeCorners(int idx,int& c1,int &c2); +}; + +class Cube{ +public: + const static unsigned int CORNERS=8 , EDGES=12 , FACES=6; + + static int CornerIndex ( int x , int y , int z ); + static void FactorCornerIndex ( int idx , int& x , int& y , int& z ); + static int EdgeIndex ( int orientation , int i , int j ); + static void FactorEdgeIndex ( int idx , int& orientation , int& i , int &j); + static int FaceIndex ( int dir , int offSet ); + static int FaceIndex ( int x , int y , int z ); + static void FactorFaceIndex ( int idx , int& x , int &y , int& z ); + static void FactorFaceIndex ( int idx , int& dir , int& offSet ); + + static int AntipodalCornerIndex ( int idx ); + static int FaceReflectCornerIndex ( int idx , int faceIndex ); + static int FaceReflectEdgeIndex ( int idx , int faceIndex ); + static int FaceReflectFaceIndex ( int idx , int faceIndex ); + static int EdgeReflectCornerIndex ( int idx , int edgeIndex ); + static int EdgeReflectEdgeIndex ( int edgeIndex ); + + static int FaceAdjacentToEdges ( int eIndex1 , int eIndex2 ); + static void FacesAdjacentToEdge ( int eIndex , int& f1Index , int& f2Index ); + + static void EdgeCorners( int idx , int& c1 , int &c2 ); + static void FaceCorners( int idx , int& c1 , int &c2 , int& c3 , int& c4 ); + + static bool IsEdgeCorner( int cIndex , int e ); + static bool IsFaceCorner( int cIndex , int f ); +}; + +class MarchingSquares +{ + static double Interpolate(double v1,double v2); + static void SetVertex(int e,const double values[Square::CORNERS],double iso); +public: + const static unsigned int MAX_EDGES=2; + static const int edgeMask[1< -class MemoryInfo -{ -public: - size_t TotalPhysicalMemory; - size_t FreePhysicalMemory; - size_t TotalSwapSpace; - size_t FreeSwapSpace; - size_t TotalVirtualAddressSpace; - size_t FreeVirtualAddressSpace; - size_t PageSize; - - void set(void){ - MEMORYSTATUSEX Mem; - SYSTEM_INFO Info; - ZeroMemory( &Mem, sizeof(Mem)); - ZeroMemory( &Info, sizeof(Info)); - Mem.dwLength = sizeof(Mem); - ::GlobalMemoryStatusEx( &Mem ); - ::GetSystemInfo( &Info ); - - TotalPhysicalMemory = (size_t)Mem.ullTotalPhys; - FreePhysicalMemory = (size_t)Mem.ullAvailPhys; - TotalSwapSpace = (size_t)Mem.ullTotalPageFile; - FreeSwapSpace = (size_t)Mem.ullAvailPageFile; - TotalVirtualAddressSpace = (size_t)Mem.ullTotalVirtual; - FreeVirtualAddressSpace = (size_t)Mem.ullAvailVirtual; - PageSize = (size_t)Info.dwPageSize; - } - size_t usage(void) const {return TotalVirtualAddressSpace-FreeVirtualAddressSpace;} - - static size_t Usage(void){ - MEMORY_BASIC_INFORMATION mbi; - size_t dwMemUsed = 0; - PVOID pvAddress = 0; - - - memset(&mbi, 0, sizeof(MEMORY_BASIC_INFORMATION)); - while(VirtualQuery(pvAddress, &mbi, sizeof(MEMORY_BASIC_INFORMATION)) == sizeof(MEMORY_BASIC_INFORMATION)){ - if(mbi.State == MEM_COMMIT && mbi.Type == MEM_PRIVATE){dwMemUsed += mbi.RegionSize;} - pvAddress = ((BYTE*)mbi.BaseAddress) + mbi.RegionSize; - } - return dwMemUsed; - } -}; - -#else // !WIN32 - -#ifndef __APPLE__ // Linux variants - -#include -#include - -class MemoryInfo -{ - public: - static size_t Usage(void) - { - FILE* f = fopen("/proc/self/stat","rb"); - - int d; - long ld; - unsigned long lu; - unsigned long long llu; - char s[1024]; - char c; - - int pid; - unsigned long vm; - - int n = fscanf(f, "%d %s %c %d %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %ld %ld %ld %ld %d %ld %llu %lu %ld %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %lu" - ,&pid ,s ,&c ,&d ,&d ,&d ,&d ,&d ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&ld ,&ld ,&ld ,&ld ,&d ,&ld ,&llu ,&vm ,&ld ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&d ,&d ,&lu ,&lu ); - - fclose(f); -/* -pid %d -comm %s -state %c -ppid %d -pgrp %d -session %d -tty_nr %d -tpgid %d -flags %lu -minflt %lu -cminflt %lu -majflt %lu -cmajflt %lu -utime %lu -stime %lu -cutime %ld -cstime %ld -priority %ld -nice %ld -0 %ld -itrealvalue %ld -starttime %lu -vsize %lu -rss %ld -rlim %lu -startcode %lu -endcode %lu -startstack %lu -kstkesp %lu -kstkeip %lu -signal %lu -blocked %lu -sigignore %lu -sigcatch %lu -wchan %lu -nswap %lu -cnswap %lu -exit_signal %d -processor %d -rt_priority %lu (since kernel 2.5.19) -policy %lu (since kernel 2.5.19) -*/ - return vm; - } - -}; -#else // __APPLE__: has no "/proc" pseudo-file system - -// Thanks to David O'Gwynn for providing this fix. -// This comes from a post by Michael Knight: -// -// http://miknight.blogspot.com/2005/11/resident-set-size-in-mac-os-x.html - -#include -#include -#include -#include -#include -#include -#include - -void getres(task_t task, unsigned long *rss, unsigned long *vs) -{ - struct task_basic_info t_info; - mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT; - - task_info(task, TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count); - *rss = t_info.resident_size; - *vs = t_info.virtual_size; -} - -class MemoryInfo -{ - public: - static size_t Usage(void) - { - unsigned long rss, vs, psize; - task_t task = MACH_PORT_NULL; - - if (task_for_pid(current_task(), getpid(), &task) != KERN_SUCCESS) - abort(); - getres(task, &rss, &vs); - return rss; - } - -}; - -#endif // !__APPLE__ - -#endif // WIN32 - -#endif // MEMORY_USAGE_INCLUDE +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ + +#ifndef MEMORY_USAGE_INCLUDED +#define MEMORY_USAGE_INCLUDED + +#ifdef WIN32 + +#include +class MemoryInfo +{ +public: + size_t TotalPhysicalMemory; + size_t FreePhysicalMemory; + size_t TotalSwapSpace; + size_t FreeSwapSpace; + size_t TotalVirtualAddressSpace; + size_t FreeVirtualAddressSpace; + size_t PageSize; + + void set(void){ + MEMORYSTATUSEX Mem; + SYSTEM_INFO Info; + ZeroMemory( &Mem, sizeof(Mem)); + ZeroMemory( &Info, sizeof(Info)); + Mem.dwLength = sizeof(Mem); + ::GlobalMemoryStatusEx( &Mem ); + ::GetSystemInfo( &Info ); + + TotalPhysicalMemory = (size_t)Mem.ullTotalPhys; + FreePhysicalMemory = (size_t)Mem.ullAvailPhys; + TotalSwapSpace = (size_t)Mem.ullTotalPageFile; + FreeSwapSpace = (size_t)Mem.ullAvailPageFile; + TotalVirtualAddressSpace = (size_t)Mem.ullTotalVirtual; + FreeVirtualAddressSpace = (size_t)Mem.ullAvailVirtual; + PageSize = (size_t)Info.dwPageSize; + } + size_t usage(void) const {return TotalVirtualAddressSpace-FreeVirtualAddressSpace;} + + static size_t Usage(void){ + MEMORY_BASIC_INFORMATION mbi; + size_t dwMemUsed = 0; + PVOID pvAddress = 0; + + + memset(&mbi, 0, sizeof(MEMORY_BASIC_INFORMATION)); + while(VirtualQuery(pvAddress, &mbi, sizeof(MEMORY_BASIC_INFORMATION)) == sizeof(MEMORY_BASIC_INFORMATION)){ + if(mbi.State == MEM_COMMIT && mbi.Type == MEM_PRIVATE){dwMemUsed += mbi.RegionSize;} + pvAddress = ((BYTE*)mbi.BaseAddress) + mbi.RegionSize; + } + return dwMemUsed; + } +}; + +#else // !WIN32 + +#ifndef __APPLE__ // Linux variants + +#include +#include + +class MemoryInfo +{ + public: + static size_t Usage(void) + { + FILE* f = fopen("/proc/self/stat","rb"); + + int d; + long ld; + unsigned long lu; + unsigned long long llu; + char s[1024]; + char c; + + int pid; + unsigned long vm; + + int n = fscanf(f, "%d %s %c %d %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %ld %ld %ld %ld %d %ld %llu %lu %ld %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %lu" + ,&pid ,s ,&c ,&d ,&d ,&d ,&d ,&d ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&ld ,&ld ,&ld ,&ld ,&d ,&ld ,&llu ,&vm ,&ld ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&lu ,&d ,&d ,&lu ,&lu ); + + fclose(f); +/* +pid %d +comm %s +state %c +ppid %d +pgrp %d +session %d +tty_nr %d +tpgid %d +flags %lu +minflt %lu +cminflt %lu +majflt %lu +cmajflt %lu +utime %lu +stime %lu +cutime %ld +cstime %ld +priority %ld +nice %ld +0 %ld +itrealvalue %ld +starttime %lu +vsize %lu +rss %ld +rlim %lu +startcode %lu +endcode %lu +startstack %lu +kstkesp %lu +kstkeip %lu +signal %lu +blocked %lu +sigignore %lu +sigcatch %lu +wchan %lu +nswap %lu +cnswap %lu +exit_signal %d +processor %d +rt_priority %lu (since kernel 2.5.19) +policy %lu (since kernel 2.5.19) +*/ + return vm; + } + +}; +#else // __APPLE__: has no "/proc" pseudo-file system + +// Thanks to David O'Gwynn for providing this fix. +// This comes from a post by Michael Knight: +// +// http://miknight.blogspot.com/2005/11/resident-set-size-in-mac-os-x.html + +#include +#include +#include +#include +#include +#include +#include + +void getres(task_t task, unsigned long *rss, unsigned long *vs) +{ + struct task_basic_info t_info; + mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT; + + task_info(task, TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count); + *rss = t_info.resident_size; + *vs = t_info.virtual_size; +} + +class MemoryInfo +{ + public: + static size_t Usage(void) + { + unsigned long rss, vs, psize; + task_t task = MACH_PORT_NULL; + + if (task_for_pid(current_task(), getpid(), &task) != KERN_SUCCESS) + abort(); + getres(task, &rss, &vs); + return rss; + } + +}; + +#endif // !__APPLE__ + +#endif // WIN32 + +#endif // MEMORY_USAGE_INCLUDE diff --git a/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.Evaluation.inl b/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.Evaluation.inl old mode 100755 new mode 100644 index c21eed3b..7f4ec81c --- a/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.Evaluation.inl +++ b/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.Evaluation.inl @@ -1,806 +1,806 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - -template< class Real > -template< int FEMDegree > -void Octree< Real >::_Evaluator< FEMDegree >::set( int depth , bool dirichlet ) -{ - static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; - static const int RightPointSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; - - BSplineEvaluationData< FEMDegree >::SetEvaluator( evaluator , depth , dirichlet ); - if( depth>0 ) BSplineEvaluationData< FEMDegree >::SetChildEvaluator( childEvaluator , depth-1 , dirichlet ); - int center = BSplineData< FEMDegree >::Dimension( depth )>>1; - - // First set the stencils for the current depth - for( int x=-LeftPointSupportRadius ; x<=RightPointSupportRadius ; x++ ) for( int y=-LeftPointSupportRadius ; y<=RightPointSupportRadius ; y++ ) for( int z=-LeftPointSupportRadius ; z<=RightPointSupportRadius ; z++ ) - { - int fIdx[] = { center+x , center+y , center+z }; - - //// The cell stencil - { - double vv[3] , dv[3]; - for( int dd=0 ; dd( dv[0] * vv[1] * vv[2] , vv[0] * dv[1] * vv[2] , vv[0] * vv[1] * dv[2] ); - } - - //// The face stencil - for( int f=0 ; f( dv[0] * vv[1] * vv[2] , vv[0] * dv[1] * vv[2] , vv[0] * vv[1] * dv[2] ); - } - - //// The edge stencil - for( int e=0 ; e( dv[0] * vv[1] * vv[2] , vv[0] * dv[1] * vv[2] , vv[0] * vv[1] * dv[2] ); - } - - //// The corner stencil - for( int c=0 ; c( dv[0] * vv[1] * vv[2] , vv[0] * dv[1] * vv[2] , vv[0] * vv[1] * dv[2] ); - } - } - - // Now set the stencils for the parents - for( int child=0 ; child( dv[0] * vv[1] * vv[2] , vv[0] * dv[1] * vv[2] , vv[0] * vv[1] * dv[2] ); - } - - //// The face stencil - for( int f=0 ; f( dv[0] * vv[1] * vv[2] , vv[0] * dv[1] * vv[2] , vv[0] * vv[1] * dv[2] ); - } - - //// The edge stencil - for( int e=0 ; e( dv[0] * vv[1] * vv[2] , vv[0] * dv[1] * vv[2] , vv[0] * vv[1] * dv[2] ); - } - - //// The corner stencil - for( int c=0 ; c( dv[0] * vv[1] * vv[2] , vv[0] * dv[1] * vv[2] , vv[0] * vv[1] * dv[2] ); - } - } - } -} -template< class Real > -template< class V , int FEMDegree > -V Octree< Real >::_getCenterValue( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , const DenseNodeData< V , FEMDegree >& solution , const DenseNodeData< V , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const -{ - static const int SupportSize = BSplineEvaluationData< FEMDegree >::SupportSize; - static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; - static const int RightPointSupportRadius = - BSplineEvaluationData< FEMDegree >::SupportStart; - - if( node->children ) fprintf( stderr , "[WARNING] getCenterValue assumes leaf node\n" ); - V value(0); - int d = _Depth( node ); - - if( isInterior ) - { - const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d ); - for( int i=0 ; inodeData.nodeIndex ] * Real( evaluator.cellStencil.values[i][j][k] ); - } - if( d>_minDepth-1 ) - { - int _corner = int( node - node->parent->children ); - const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d-1 ); - for( int i=0 ; inodeData.nodeIndex] * Real( evaluator.cellStencils[_corner].values[i][j][k] ); - } - } - } - else - { - int cIdx[3]; - _DepthAndOffset( node , d , cIdx ); - const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d ); - - for( int i=0 ; i( n ) ) - { - int _d , fIdx[3]; - _DepthAndOffset( n , _d , fIdx ); - value += - solution[ n->nodeData.nodeIndex ] * - Real( - evaluator.evaluator.centerValue( fIdx[0] , cIdx[0] , false ) * - evaluator.evaluator.centerValue( fIdx[1] , cIdx[1] , false ) * - evaluator.evaluator.centerValue( fIdx[2] , cIdx[2] , false ) - ); - } - } - if( d>_minDepth-1 ) - { - const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d-1 ); - for( int i=0 ; i( n ) ) - { - int _d , fIdx[3]; - _DepthAndOffset( n , _d , fIdx ); - value += - metSolution[ n->nodeData.nodeIndex ] * - Real( - evaluator.childEvaluator.centerValue( fIdx[0] , cIdx[0] , false ) * - evaluator.childEvaluator.centerValue( fIdx[1] , cIdx[1] , false ) * - evaluator.childEvaluator.centerValue( fIdx[2] , cIdx[2] , false ) - ); - } - } - } - } - return value; -} -template< class Real > -template< class V , int FEMDegree > -V Octree< Real >::_getEdgeValue( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , int edge , const DenseNodeData< V , FEMDegree >& solution , const DenseNodeData< V , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const -{ - static const int SupportSize = BSplineEvaluationData< FEMDegree >::SupportSize; - static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; - static const int RightPointSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; - V value(0); - int d , cIdx[3]; - _DepthAndOffset( node , d , cIdx ); - int startX = 0 , endX = SupportSize , startY = 0 , endY = SupportSize , startZ = 0 , endZ = SupportSize; - int orientation , i1 , i2; - Cube::FactorEdgeIndex( edge , orientation , i1 , i2 ); - switch( orientation ) - { - case 0: - cIdx[1] += i1 , cIdx[2] += i2; - if( i1 ) startY++ ; else endY--; - if( i2 ) startZ++ ; else endZ--; - break; - case 1: - cIdx[0] += i1 , cIdx[2] += i2; - if( i1 ) startX++ ; else endX--; - if( i2 ) startZ++ ; else endZ--; - break; - case 2: - cIdx[0] += i1 , cIdx[1] += i2; - if( i1 ) startX++ ; else endX--; - if( i2 ) startY++ ; else endY--; - break; - } - - { - const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d ); - for( int x=startX ; x( _node ) ) - { - if( isInterior ) value += solution[ _node->nodeData.nodeIndex ] * evaluator.edgeStencil[edge].values[x][y][z]; - else - { - int _d , fIdx[3]; - _DepthAndOffset( _node , _d , fIdx ); - switch( orientation ) - { - case 0: - value += - solution[ _node->nodeData.nodeIndex ] * - Real( - evaluator.evaluator.centerValue( fIdx[0] , cIdx[0] , false ) * - evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , false ) * - evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , false ) - ); - break; - case 1: - value += - solution[ _node->nodeData.nodeIndex ] * - Real( - evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , false ) * - evaluator.evaluator.centerValue( fIdx[1] , cIdx[1] , false ) * - evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , false ) - ); - break; - case 2: - value += - solution[ _node->nodeData.nodeIndex ] * - Real( - evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , false ) * - evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , false ) * - evaluator.evaluator.centerValue( fIdx[2] , cIdx[2] , false ) - ); - break; - } - } - } - } - } - if( d>_minDepth-1 ) - { - int _corner = int( node - node->parent->children ); - int _cx , _cy , _cz; - Cube::FactorCornerIndex( _corner , _cx , _cy , _cz ); - // If the corner/child indices don't match, then the sample position is in the interior of the - // coarser cell and so the full support resolution should be used. - switch( orientation ) - { - case 0: - if( _cy!=i1 ) startY = 0 , endY = SupportSize; - if( _cz!=i2 ) startZ = 0 , endZ = SupportSize; - break; - case 1: - if( _cx!=i1 ) startX = 0 , endX = SupportSize; - if( _cz!=i2 ) startZ = 0 , endZ = SupportSize; - break; - case 2: - if( _cx!=i1 ) startX = 0 , endX = SupportSize; - if( _cy!=i2 ) startY = 0 , endY = SupportSize; - break; - } - const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d-1 ); - for( int x=startX ; x( _node ) ) - { - if( isInterior ) value += metSolution[ _node->nodeData.nodeIndex ] * evaluator.edgeStencils[_corner][edge].values[x][y][z]; - else - { - int _d , fIdx[3]; - _DepthAndOffset( _node , _d , fIdx ); - switch( orientation ) - { - case 0: - value += - metSolution[ _node->nodeData.nodeIndex ] * - Real( - evaluator.childEvaluator.centerValue( fIdx[0] , cIdx[0] , false ) * - evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , false ) * - evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , false ) - ); - break; - case 1: - value += - metSolution[ _node->nodeData.nodeIndex ] * - Real( - evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , false ) * - evaluator.childEvaluator.centerValue( fIdx[1] , cIdx[1] , false ) * - evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , false ) - ); - break; - case 2: - value += - metSolution[ _node->nodeData.nodeIndex ] * - Real( - evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , false ) * - evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , false ) * - evaluator.childEvaluator.centerValue( fIdx[2] , cIdx[2] , false ) - ); - break; - } - } - } - } - } - return Real( value ); -} -template< class Real > -template< int FEMDegree > -std::pair< Real , Point3D< Real > > Octree< Real >::_getEdgeValueAndGradient( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , int edge , const DenseNodeData< Real , FEMDegree >& solution , const DenseNodeData< Real , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const -{ - static const int SupportSize = BSplineEvaluationData< FEMDegree >::SupportSize; - static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; - static const int RightPointSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; - double value = 0; - Point3D< double > gradient; - int d , cIdx[3]; - _DepthAndOffset( node , d , cIdx ); - - int startX = 0 , endX = SupportSize , startY = 0 , endY = SupportSize , startZ = 0 , endZ = SupportSize; - int orientation , i1 , i2; - Cube::FactorEdgeIndex( edge , orientation , i1 , i2 ); - switch( orientation ) - { - case 0: - cIdx[1] += i1 , cIdx[2] += i2; - if( i1 ) startY++ ; else endY--; - if( i2 ) startZ++ ; else endZ--; - break; - case 1: - cIdx[0] += i1 , cIdx[2] += i2; - if( i1 ) startX++ ; else endX--; - if( i2 ) startZ++ ; else endZ--; - break; - case 2: - cIdx[0] += i1 , cIdx[1] += i2; - if( i1 ) startX++ ; else endX--; - if( i2 ) startY++ ; else endY--; - break; - } - { - const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d ); - for( int x=startX ; x( _node ) ) - { - if( isInterior ) - { - value += evaluator. edgeStencil[edge].values[x][y][z] * solution[ _node->nodeData.nodeIndex ]; - gradient += evaluator.dEdgeStencil[edge].values[x][y][z] * solution[ _node->nodeData.nodeIndex ]; - } - else - { - int _d , fIdx[3]; - _DepthAndOffset( _node , _d , fIdx ); - - double vv[3] , dv[3]; - switch( orientation ) - { - case 0: - vv[0] = evaluator.evaluator.centerValue( fIdx[0] , cIdx[0] , false ); - vv[1] = evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , false ); - vv[2] = evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , false ); - dv[0] = evaluator.evaluator.centerValue( fIdx[0] , cIdx[0] , true ); - dv[1] = evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , true ); - dv[2] = evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , true ); - break; - case 1: - vv[0] = evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , false ); - vv[1] = evaluator.evaluator.centerValue( fIdx[1] , cIdx[1] , false ); - vv[2] = evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , false ); - dv[0] = evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , true ); - dv[1] = evaluator.evaluator.centerValue( fIdx[1] , cIdx[1] , true ); - dv[2] = evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , true ); - break; - case 2: - vv[0] = evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , false ); - vv[1] = evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , false ); - vv[2] = evaluator.evaluator.centerValue( fIdx[2] , cIdx[2] , false ); - dv[0] = evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , true ); - dv[1] = evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , true ); - dv[2] = evaluator.evaluator.centerValue( fIdx[2] , cIdx[2] , true ); - break; - } - value += solution[ _node->nodeData.nodeIndex ] * vv[0] * vv[1] * vv[2]; - gradient += Point3D< double >( dv[0]*vv[1]*vv[2] , vv[0]*dv[1]*vv[2] , vv[0]*vv[1]*dv[2] ) * solution[ _node->nodeData.nodeIndex ]; - } - } - } - } - if( d>_minDepth-1 ) - { - int _corner = int( node - node->parent->children ); - int _cx , _cy , _cz; - Cube::FactorCornerIndex( _corner , _cx , _cy , _cz ); - // If the corner/child indices don't match, then the sample position is in the interior of the - // coarser cell and so the full support resolution should be used. - switch( orientation ) - { - case 0: - if( _cy!=i1 ) startY = 0 , endY = SupportSize; - if( _cz!=i2 ) startZ = 0 , endZ = SupportSize; - break; - case 1: - if( _cx!=i1 ) startX = 0 , endX = SupportSize; - if( _cz!=i2 ) startZ = 0 , endZ = SupportSize; - break; - case 2: - if( _cx!=i1 ) startX = 0 , endX = SupportSize; - if( _cy!=i2 ) startY = 0 , endY = SupportSize; - break; - } - const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d-1 ); - for( int x=startX ; x( _node ) ) - { - if( isInterior ) - { - value += evaluator. edgeStencils[_corner][edge].values[x][y][z] * metSolution[ _node->nodeData.nodeIndex ]; - gradient += evaluator.dEdgeStencils[_corner][edge].values[x][y][z] * metSolution[ _node->nodeData.nodeIndex ]; - } - else - { - int _d , fIdx[3]; - _DepthAndOffset( _node , _d , fIdx ); - double vv[3] , dv[3]; - switch( orientation ) - { - case 0: - vv[0] = evaluator.childEvaluator.centerValue( fIdx[0] , cIdx[0] , false ); - vv[1] = evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , false ); - vv[2] = evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , false ); - dv[0] = evaluator.childEvaluator.centerValue( fIdx[0] , cIdx[0] , true ); - dv[1] = evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , true ); - dv[2] = evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , true ); - break; - case 1: - vv[0] = evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , false ); - vv[1] = evaluator.childEvaluator.centerValue( fIdx[1] , cIdx[1] , false ); - vv[2] = evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , false ); - dv[0] = evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , true ); - dv[1] = evaluator.childEvaluator.centerValue( fIdx[1] , cIdx[1] , true ); - dv[2] = evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , true ); - break; - case 2: - vv[0] = evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , false ); - vv[1] = evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , false ); - vv[2] = evaluator.childEvaluator.centerValue( fIdx[2] , cIdx[2] , false ); - dv[0] = evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , true ); - dv[1] = evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , true ); - dv[2] = evaluator.childEvaluator.centerValue( fIdx[2] , cIdx[2] , true ); - break; - } - value += metSolution[ _node->nodeData.nodeIndex ] * vv[0] * vv[1] * vv[2]; - gradient += Point3D< double >( dv[0]*vv[1]*vv[2] , vv[0]*dv[1]*vv[2] , vv[0]*vv[1]*dv[2] ) * metSolution[ _node->nodeData.nodeIndex ]; - } - } - } - } - return std::pair< Real , Point3D< Real > >( Real( value ) , Point3D< Real >( gradient ) ); -} - -template< class Real > -template< class V , int FEMDegree > -V Octree< Real >::_getCornerValue( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , int corner , const DenseNodeData< V , FEMDegree >& solution , const DenseNodeData< V , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const -{ - static const int SupportSize = BSplineEvaluationData< FEMDegree >::SupportSize; - static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; - static const int RightPointSupportRadius = - BSplineEvaluationData< FEMDegree >::SupportStart; - - V value(0); - int d , cIdx[3]; - _DepthAndOffset( node , d , cIdx ); - - int cx , cy , cz; - int startX = 0 , endX = SupportSize , startY = 0 , endY = SupportSize , startZ = 0 , endZ = SupportSize; - Cube::FactorCornerIndex( corner , cx , cy , cz ); - cIdx[0] += cx , cIdx[1] += cy , cIdx[2] += cz; - { - const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d ); - if( cx==0 ) endX--; - else startX++; - if( cy==0 ) endY--; - else startY++; - if( cz==0 ) endZ--; - else startZ++; - if( isInterior ) - for( int x=startX ; xnodeData.nodeIndex ] * Real( evaluator.cornerStencil[corner].values[x][y][z] ); - } - else - for( int x=startX ; x( _node ) ) - { - int _d , fIdx[3]; - _DepthAndOffset( _node , _d , fIdx ); - value += - solution[ _node->nodeData.nodeIndex ] * - Real( - evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , false ) * - evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , false ) * - evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , false ) - ); - } - } - } - if( d>_minDepth-1 ) - { - int _corner = int( node - node->parent->children ); - int _cx , _cy , _cz; - Cube::FactorCornerIndex( _corner , _cx , _cy , _cz ); - // If the corner/child indices don't match, then the sample position is in the interior of the - // coarser cell and so the full support resolution should be used. - if( cx!=_cx ) startX = 0 , endX = SupportSize; - if( cy!=_cy ) startY = 0 , endY = SupportSize; - if( cz!=_cz ) startZ = 0 , endZ = SupportSize; - const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d-1 ); - if( isInterior ) - for( int x=startX ; xnodeData.nodeIndex ] * Real( evaluator.cornerStencils[_corner][corner].values[x][y][z] ); - } - else - for( int x=startX ; x( _node ) ) - { - int _d , fIdx[3]; - _DepthAndOffset( _node , _d , fIdx ); - value += - metSolution[ _node->nodeData.nodeIndex ] * - Real( - evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , false ) * - evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , false ) * - evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , false ) - ); - } - } - } - return Real( value ); -} -template< class Real > -template< int FEMDegree > -std::pair< Real , Point3D< Real > > Octree< Real >::_getCornerValueAndGradient( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , int corner , const DenseNodeData< Real , FEMDegree >& solution , const DenseNodeData< Real , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const -{ - static const int SupportSize = BSplineEvaluationData< FEMDegree >::SupportSize; - static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; - static const int RightPointSupportRadius = - BSplineEvaluationData< FEMDegree >::SupportStart; - - double value = 0; - Point3D< double > gradient; - int d , cIdx[3]; - _DepthAndOffset( node , d , cIdx ); - - int cx , cy , cz; - int startX = 0 , endX = SupportSize , startY = 0 , endY = SupportSize , startZ = 0 , endZ = SupportSize; - Cube::FactorCornerIndex( corner , cx , cy , cz ); - cIdx[0] += cx , cIdx[1] += cy , cIdx[2] += cz; - { - if( cx==0 ) endX--; - else startX++; - if( cy==0 ) endY--; - else startY++; - if( cz==0 ) endZ--; - else startZ++; - const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d ); - if( isInterior ) - for( int x=startX ; xnodeData.nodeIndex ] * evaluator.cornerStencil[corner].values[x][y][z] , gradient += evaluator.dCornerStencil[corner].values[x][y][z] * solution[ _node->nodeData.nodeIndex ]; - } - else - for( int x=startX ; x( _node ) ) - { - int _d , fIdx[3]; - _DepthAndOffset( _node , _d , fIdx ); - double v [] = { evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , false ) , evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , false ) , evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , false ) }; - double dv[] = { evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , true ) , evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , true ) , evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , true ) }; - value += solution[ _node->nodeData.nodeIndex ] * v[0] * v[1] * v[2]; - gradient += Point3D< double >( dv[0]*v[1]*v[2] , v[0]*dv[1]*v[2] , v[0]*v[1]*dv[2] ) * solution[ _node->nodeData.nodeIndex ]; - } - } - } - if( d>_minDepth-1 ) - { - int _corner = int( node - node->parent->children ); - int _cx , _cy , _cz; - Cube::FactorCornerIndex( _corner , _cx , _cy , _cz ); - if( cx!=_cx ) startX = 0 , endX = SupportSize; - if( cy!=_cy ) startY = 0 , endY = SupportSize; - if( cz!=_cz ) startZ = 0 , endZ = SupportSize; - const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d-1 ); - if( isInterior ) - for( int x=startX ; xnodeData.nodeIndex ] * evaluator.cornerStencils[_corner][corner].values[x][y][z] , gradient += evaluator.dCornerStencils[_corner][corner].values[x][y][z] * metSolution[ _node->nodeData.nodeIndex ]; - } - else - for( int x=startX ; x( _node ) ) - { - int _d , fIdx[3]; - _DepthAndOffset( _node , _d , fIdx ); - double v [] = { evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , false ) , evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , false ) , evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , false ) }; - double dv[] = { evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , true ) , evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , true ) , evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , true ) }; - value += metSolution[ _node->nodeData.nodeIndex ] * v[0] * v[1] * v[2]; - gradient += Point3D< double >( dv[0]*v[1]*v[2] , v[0]*dv[1]*v[2] , v[0]*v[1]*dv[2] ) * metSolution[ _node->nodeData.nodeIndex ]; - } - } - } - return std::pair< Real , Point3D< Real > >( Real( value ) , Point3D< Real >( gradient ) ); -} +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ + +template< class Real > +template< int FEMDegree > +void Octree< Real >::_Evaluator< FEMDegree >::set( int depth , bool dirichlet ) +{ + static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; + static const int RightPointSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; + + BSplineEvaluationData< FEMDegree >::SetEvaluator( evaluator , depth , dirichlet ); + if( depth>0 ) BSplineEvaluationData< FEMDegree >::SetChildEvaluator( childEvaluator , depth-1 , dirichlet ); + int center = BSplineData< FEMDegree >::Dimension( depth )>>1; + + // First set the stencils for the current depth + for( int x=-LeftPointSupportRadius ; x<=RightPointSupportRadius ; x++ ) for( int y=-LeftPointSupportRadius ; y<=RightPointSupportRadius ; y++ ) for( int z=-LeftPointSupportRadius ; z<=RightPointSupportRadius ; z++ ) + { + int fIdx[] = { center+x , center+y , center+z }; + + //// The cell stencil + { + double vv[3] , dv[3]; + for( int dd=0 ; dd( dv[0] * vv[1] * vv[2] , vv[0] * dv[1] * vv[2] , vv[0] * vv[1] * dv[2] ); + } + + //// The face stencil + for( int f=0 ; f( dv[0] * vv[1] * vv[2] , vv[0] * dv[1] * vv[2] , vv[0] * vv[1] * dv[2] ); + } + + //// The edge stencil + for( int e=0 ; e( dv[0] * vv[1] * vv[2] , vv[0] * dv[1] * vv[2] , vv[0] * vv[1] * dv[2] ); + } + + //// The corner stencil + for( int c=0 ; c( dv[0] * vv[1] * vv[2] , vv[0] * dv[1] * vv[2] , vv[0] * vv[1] * dv[2] ); + } + } + + // Now set the stencils for the parents + for( int child=0 ; child( dv[0] * vv[1] * vv[2] , vv[0] * dv[1] * vv[2] , vv[0] * vv[1] * dv[2] ); + } + + //// The face stencil + for( int f=0 ; f( dv[0] * vv[1] * vv[2] , vv[0] * dv[1] * vv[2] , vv[0] * vv[1] * dv[2] ); + } + + //// The edge stencil + for( int e=0 ; e( dv[0] * vv[1] * vv[2] , vv[0] * dv[1] * vv[2] , vv[0] * vv[1] * dv[2] ); + } + + //// The corner stencil + for( int c=0 ; c( dv[0] * vv[1] * vv[2] , vv[0] * dv[1] * vv[2] , vv[0] * vv[1] * dv[2] ); + } + } + } +} +template< class Real > +template< class V , int FEMDegree > +V Octree< Real >::_getCenterValue( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , const DenseNodeData< V , FEMDegree >& solution , const DenseNodeData< V , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const +{ + static const int SupportSize = BSplineEvaluationData< FEMDegree >::SupportSize; + static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; + static const int RightPointSupportRadius = - BSplineEvaluationData< FEMDegree >::SupportStart; + + if( node->children ) fprintf( stderr , "[WARNING] getCenterValue assumes leaf node\n" ); + V value(0); + int d = _Depth( node ); + + if( isInterior ) + { + const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d ); + for( int i=0 ; inodeData.nodeIndex ] * Real( evaluator.cellStencil.values[i][j][k] ); + } + if( d>_minDepth-1 ) + { + int _corner = int( node - node->parent->children ); + const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d-1 ); + for( int i=0 ; inodeData.nodeIndex] * Real( evaluator.cellStencils[_corner].values[i][j][k] ); + } + } + } + else + { + int cIdx[3]; + _DepthAndOffset( node , d , cIdx ); + const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d ); + + for( int i=0 ; i( n ) ) + { + int _d , fIdx[3]; + _DepthAndOffset( n , _d , fIdx ); + value += + solution[ n->nodeData.nodeIndex ] * + Real( + evaluator.evaluator.centerValue( fIdx[0] , cIdx[0] , false ) * + evaluator.evaluator.centerValue( fIdx[1] , cIdx[1] , false ) * + evaluator.evaluator.centerValue( fIdx[2] , cIdx[2] , false ) + ); + } + } + if( d>_minDepth-1 ) + { + const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d-1 ); + for( int i=0 ; i( n ) ) + { + int _d , fIdx[3]; + _DepthAndOffset( n , _d , fIdx ); + value += + metSolution[ n->nodeData.nodeIndex ] * + Real( + evaluator.childEvaluator.centerValue( fIdx[0] , cIdx[0] , false ) * + evaluator.childEvaluator.centerValue( fIdx[1] , cIdx[1] , false ) * + evaluator.childEvaluator.centerValue( fIdx[2] , cIdx[2] , false ) + ); + } + } + } + } + return value; +} +template< class Real > +template< class V , int FEMDegree > +V Octree< Real >::_getEdgeValue( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , int edge , const DenseNodeData< V , FEMDegree >& solution , const DenseNodeData< V , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const +{ + static const int SupportSize = BSplineEvaluationData< FEMDegree >::SupportSize; + static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; + static const int RightPointSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; + V value(0); + int d , cIdx[3]; + _DepthAndOffset( node , d , cIdx ); + int startX = 0 , endX = SupportSize , startY = 0 , endY = SupportSize , startZ = 0 , endZ = SupportSize; + int orientation , i1 , i2; + Cube::FactorEdgeIndex( edge , orientation , i1 , i2 ); + switch( orientation ) + { + case 0: + cIdx[1] += i1 , cIdx[2] += i2; + if( i1 ) startY++ ; else endY--; + if( i2 ) startZ++ ; else endZ--; + break; + case 1: + cIdx[0] += i1 , cIdx[2] += i2; + if( i1 ) startX++ ; else endX--; + if( i2 ) startZ++ ; else endZ--; + break; + case 2: + cIdx[0] += i1 , cIdx[1] += i2; + if( i1 ) startX++ ; else endX--; + if( i2 ) startY++ ; else endY--; + break; + } + + { + const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d ); + for( int x=startX ; x( _node ) ) + { + if( isInterior ) value += solution[ _node->nodeData.nodeIndex ] * evaluator.edgeStencil[edge].values[x][y][z]; + else + { + int _d , fIdx[3]; + _DepthAndOffset( _node , _d , fIdx ); + switch( orientation ) + { + case 0: + value += + solution[ _node->nodeData.nodeIndex ] * + Real( + evaluator.evaluator.centerValue( fIdx[0] , cIdx[0] , false ) * + evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , false ) * + evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , false ) + ); + break; + case 1: + value += + solution[ _node->nodeData.nodeIndex ] * + Real( + evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , false ) * + evaluator.evaluator.centerValue( fIdx[1] , cIdx[1] , false ) * + evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , false ) + ); + break; + case 2: + value += + solution[ _node->nodeData.nodeIndex ] * + Real( + evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , false ) * + evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , false ) * + evaluator.evaluator.centerValue( fIdx[2] , cIdx[2] , false ) + ); + break; + } + } + } + } + } + if( d>_minDepth-1 ) + { + int _corner = int( node - node->parent->children ); + int _cx , _cy , _cz; + Cube::FactorCornerIndex( _corner , _cx , _cy , _cz ); + // If the corner/child indices don't match, then the sample position is in the interior of the + // coarser cell and so the full support resolution should be used. + switch( orientation ) + { + case 0: + if( _cy!=i1 ) startY = 0 , endY = SupportSize; + if( _cz!=i2 ) startZ = 0 , endZ = SupportSize; + break; + case 1: + if( _cx!=i1 ) startX = 0 , endX = SupportSize; + if( _cz!=i2 ) startZ = 0 , endZ = SupportSize; + break; + case 2: + if( _cx!=i1 ) startX = 0 , endX = SupportSize; + if( _cy!=i2 ) startY = 0 , endY = SupportSize; + break; + } + const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d-1 ); + for( int x=startX ; x( _node ) ) + { + if( isInterior ) value += metSolution[ _node->nodeData.nodeIndex ] * evaluator.edgeStencils[_corner][edge].values[x][y][z]; + else + { + int _d , fIdx[3]; + _DepthAndOffset( _node , _d , fIdx ); + switch( orientation ) + { + case 0: + value += + metSolution[ _node->nodeData.nodeIndex ] * + Real( + evaluator.childEvaluator.centerValue( fIdx[0] , cIdx[0] , false ) * + evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , false ) * + evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , false ) + ); + break; + case 1: + value += + metSolution[ _node->nodeData.nodeIndex ] * + Real( + evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , false ) * + evaluator.childEvaluator.centerValue( fIdx[1] , cIdx[1] , false ) * + evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , false ) + ); + break; + case 2: + value += + metSolution[ _node->nodeData.nodeIndex ] * + Real( + evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , false ) * + evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , false ) * + evaluator.childEvaluator.centerValue( fIdx[2] , cIdx[2] , false ) + ); + break; + } + } + } + } + } + return Real( value ); +} +template< class Real > +template< int FEMDegree > +std::pair< Real , Point3D< Real > > Octree< Real >::_getEdgeValueAndGradient( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , int edge , const DenseNodeData< Real , FEMDegree >& solution , const DenseNodeData< Real , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const +{ + static const int SupportSize = BSplineEvaluationData< FEMDegree >::SupportSize; + static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; + static const int RightPointSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; + double value = 0; + Point3D< double > gradient; + int d , cIdx[3]; + _DepthAndOffset( node , d , cIdx ); + + int startX = 0 , endX = SupportSize , startY = 0 , endY = SupportSize , startZ = 0 , endZ = SupportSize; + int orientation , i1 , i2; + Cube::FactorEdgeIndex( edge , orientation , i1 , i2 ); + switch( orientation ) + { + case 0: + cIdx[1] += i1 , cIdx[2] += i2; + if( i1 ) startY++ ; else endY--; + if( i2 ) startZ++ ; else endZ--; + break; + case 1: + cIdx[0] += i1 , cIdx[2] += i2; + if( i1 ) startX++ ; else endX--; + if( i2 ) startZ++ ; else endZ--; + break; + case 2: + cIdx[0] += i1 , cIdx[1] += i2; + if( i1 ) startX++ ; else endX--; + if( i2 ) startY++ ; else endY--; + break; + } + { + const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d ); + for( int x=startX ; x( _node ) ) + { + if( isInterior ) + { + value += evaluator. edgeStencil[edge].values[x][y][z] * solution[ _node->nodeData.nodeIndex ]; + gradient += evaluator.dEdgeStencil[edge].values[x][y][z] * solution[ _node->nodeData.nodeIndex ]; + } + else + { + int _d , fIdx[3]; + _DepthAndOffset( _node , _d , fIdx ); + + double vv[3] , dv[3]; + switch( orientation ) + { + case 0: + vv[0] = evaluator.evaluator.centerValue( fIdx[0] , cIdx[0] , false ); + vv[1] = evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , false ); + vv[2] = evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , false ); + dv[0] = evaluator.evaluator.centerValue( fIdx[0] , cIdx[0] , true ); + dv[1] = evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , true ); + dv[2] = evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , true ); + break; + case 1: + vv[0] = evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , false ); + vv[1] = evaluator.evaluator.centerValue( fIdx[1] , cIdx[1] , false ); + vv[2] = evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , false ); + dv[0] = evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , true ); + dv[1] = evaluator.evaluator.centerValue( fIdx[1] , cIdx[1] , true ); + dv[2] = evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , true ); + break; + case 2: + vv[0] = evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , false ); + vv[1] = evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , false ); + vv[2] = evaluator.evaluator.centerValue( fIdx[2] , cIdx[2] , false ); + dv[0] = evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , true ); + dv[1] = evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , true ); + dv[2] = evaluator.evaluator.centerValue( fIdx[2] , cIdx[2] , true ); + break; + } + value += solution[ _node->nodeData.nodeIndex ] * vv[0] * vv[1] * vv[2]; + gradient += Point3D< double >( dv[0]*vv[1]*vv[2] , vv[0]*dv[1]*vv[2] , vv[0]*vv[1]*dv[2] ) * solution[ _node->nodeData.nodeIndex ]; + } + } + } + } + if( d>_minDepth-1 ) + { + int _corner = int( node - node->parent->children ); + int _cx , _cy , _cz; + Cube::FactorCornerIndex( _corner , _cx , _cy , _cz ); + // If the corner/child indices don't match, then the sample position is in the interior of the + // coarser cell and so the full support resolution should be used. + switch( orientation ) + { + case 0: + if( _cy!=i1 ) startY = 0 , endY = SupportSize; + if( _cz!=i2 ) startZ = 0 , endZ = SupportSize; + break; + case 1: + if( _cx!=i1 ) startX = 0 , endX = SupportSize; + if( _cz!=i2 ) startZ = 0 , endZ = SupportSize; + break; + case 2: + if( _cx!=i1 ) startX = 0 , endX = SupportSize; + if( _cy!=i2 ) startY = 0 , endY = SupportSize; + break; + } + const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d-1 ); + for( int x=startX ; x( _node ) ) + { + if( isInterior ) + { + value += evaluator. edgeStencils[_corner][edge].values[x][y][z] * metSolution[ _node->nodeData.nodeIndex ]; + gradient += evaluator.dEdgeStencils[_corner][edge].values[x][y][z] * metSolution[ _node->nodeData.nodeIndex ]; + } + else + { + int _d , fIdx[3]; + _DepthAndOffset( _node , _d , fIdx ); + double vv[3] , dv[3]; + switch( orientation ) + { + case 0: + vv[0] = evaluator.childEvaluator.centerValue( fIdx[0] , cIdx[0] , false ); + vv[1] = evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , false ); + vv[2] = evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , false ); + dv[0] = evaluator.childEvaluator.centerValue( fIdx[0] , cIdx[0] , true ); + dv[1] = evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , true ); + dv[2] = evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , true ); + break; + case 1: + vv[0] = evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , false ); + vv[1] = evaluator.childEvaluator.centerValue( fIdx[1] , cIdx[1] , false ); + vv[2] = evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , false ); + dv[0] = evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , true ); + dv[1] = evaluator.childEvaluator.centerValue( fIdx[1] , cIdx[1] , true ); + dv[2] = evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , true ); + break; + case 2: + vv[0] = evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , false ); + vv[1] = evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , false ); + vv[2] = evaluator.childEvaluator.centerValue( fIdx[2] , cIdx[2] , false ); + dv[0] = evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , true ); + dv[1] = evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , true ); + dv[2] = evaluator.childEvaluator.centerValue( fIdx[2] , cIdx[2] , true ); + break; + } + value += metSolution[ _node->nodeData.nodeIndex ] * vv[0] * vv[1] * vv[2]; + gradient += Point3D< double >( dv[0]*vv[1]*vv[2] , vv[0]*dv[1]*vv[2] , vv[0]*vv[1]*dv[2] ) * metSolution[ _node->nodeData.nodeIndex ]; + } + } + } + } + return std::pair< Real , Point3D< Real > >( Real( value ) , Point3D< Real >( gradient ) ); +} + +template< class Real > +template< class V , int FEMDegree > +V Octree< Real >::_getCornerValue( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , int corner , const DenseNodeData< V , FEMDegree >& solution , const DenseNodeData< V , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const +{ + static const int SupportSize = BSplineEvaluationData< FEMDegree >::SupportSize; + static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; + static const int RightPointSupportRadius = - BSplineEvaluationData< FEMDegree >::SupportStart; + + V value(0); + int d , cIdx[3]; + _DepthAndOffset( node , d , cIdx ); + + int cx , cy , cz; + int startX = 0 , endX = SupportSize , startY = 0 , endY = SupportSize , startZ = 0 , endZ = SupportSize; + Cube::FactorCornerIndex( corner , cx , cy , cz ); + cIdx[0] += cx , cIdx[1] += cy , cIdx[2] += cz; + { + const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d ); + if( cx==0 ) endX--; + else startX++; + if( cy==0 ) endY--; + else startY++; + if( cz==0 ) endZ--; + else startZ++; + if( isInterior ) + for( int x=startX ; xnodeData.nodeIndex ] * Real( evaluator.cornerStencil[corner].values[x][y][z] ); + } + else + for( int x=startX ; x( _node ) ) + { + int _d , fIdx[3]; + _DepthAndOffset( _node , _d , fIdx ); + value += + solution[ _node->nodeData.nodeIndex ] * + Real( + evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , false ) * + evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , false ) * + evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , false ) + ); + } + } + } + if( d>_minDepth-1 ) + { + int _corner = int( node - node->parent->children ); + int _cx , _cy , _cz; + Cube::FactorCornerIndex( _corner , _cx , _cy , _cz ); + // If the corner/child indices don't match, then the sample position is in the interior of the + // coarser cell and so the full support resolution should be used. + if( cx!=_cx ) startX = 0 , endX = SupportSize; + if( cy!=_cy ) startY = 0 , endY = SupportSize; + if( cz!=_cz ) startZ = 0 , endZ = SupportSize; + const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d-1 ); + if( isInterior ) + for( int x=startX ; xnodeData.nodeIndex ] * Real( evaluator.cornerStencils[_corner][corner].values[x][y][z] ); + } + else + for( int x=startX ; x( _node ) ) + { + int _d , fIdx[3]; + _DepthAndOffset( _node , _d , fIdx ); + value += + metSolution[ _node->nodeData.nodeIndex ] * + Real( + evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , false ) * + evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , false ) * + evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , false ) + ); + } + } + } + return Real( value ); +} +template< class Real > +template< int FEMDegree > +std::pair< Real , Point3D< Real > > Octree< Real >::_getCornerValueAndGradient( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , int corner , const DenseNodeData< Real , FEMDegree >& solution , const DenseNodeData< Real , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const +{ + static const int SupportSize = BSplineEvaluationData< FEMDegree >::SupportSize; + static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; + static const int RightPointSupportRadius = - BSplineEvaluationData< FEMDegree >::SupportStart; + + double value = 0; + Point3D< double > gradient; + int d , cIdx[3]; + _DepthAndOffset( node , d , cIdx ); + + int cx , cy , cz; + int startX = 0 , endX = SupportSize , startY = 0 , endY = SupportSize , startZ = 0 , endZ = SupportSize; + Cube::FactorCornerIndex( corner , cx , cy , cz ); + cIdx[0] += cx , cIdx[1] += cy , cIdx[2] += cz; + { + if( cx==0 ) endX--; + else startX++; + if( cy==0 ) endY--; + else startY++; + if( cz==0 ) endZ--; + else startZ++; + const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d ); + if( isInterior ) + for( int x=startX ; xnodeData.nodeIndex ] * evaluator.cornerStencil[corner].values[x][y][z] , gradient += evaluator.dCornerStencil[corner].values[x][y][z] * solution[ _node->nodeData.nodeIndex ]; + } + else + for( int x=startX ; x( _node ) ) + { + int _d , fIdx[3]; + _DepthAndOffset( _node , _d , fIdx ); + double v [] = { evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , false ) , evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , false ) , evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , false ) }; + double dv[] = { evaluator.evaluator.cornerValue( fIdx[0] , cIdx[0] , true ) , evaluator.evaluator.cornerValue( fIdx[1] , cIdx[1] , true ) , evaluator.evaluator.cornerValue( fIdx[2] , cIdx[2] , true ) }; + value += solution[ _node->nodeData.nodeIndex ] * v[0] * v[1] * v[2]; + gradient += Point3D< double >( dv[0]*v[1]*v[2] , v[0]*dv[1]*v[2] , v[0]*v[1]*dv[2] ) * solution[ _node->nodeData.nodeIndex ]; + } + } + } + if( d>_minDepth-1 ) + { + int _corner = int( node - node->parent->children ); + int _cx , _cy , _cz; + Cube::FactorCornerIndex( _corner , _cx , _cy , _cz ); + if( cx!=_cx ) startX = 0 , endX = SupportSize; + if( cy!=_cy ) startY = 0 , endY = SupportSize; + if( cz!=_cz ) startZ = 0 , endZ = SupportSize; + const typename TreeOctNode::ConstNeighbors< SupportSize >& neighbors = _Neighbors< LeftPointSupportRadius , RightPointSupportRadius >( neighborKey , d-1 ); + if( isInterior ) + for( int x=startX ; xnodeData.nodeIndex ] * evaluator.cornerStencils[_corner][corner].values[x][y][z] , gradient += evaluator.dCornerStencils[_corner][corner].values[x][y][z] * metSolution[ _node->nodeData.nodeIndex ]; + } + else + for( int x=startX ; x( _node ) ) + { + int _d , fIdx[3]; + _DepthAndOffset( _node , _d , fIdx ); + double v [] = { evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , false ) , evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , false ) , evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , false ) }; + double dv[] = { evaluator.childEvaluator.cornerValue( fIdx[0] , cIdx[0] , true ) , evaluator.childEvaluator.cornerValue( fIdx[1] , cIdx[1] , true ) , evaluator.childEvaluator.cornerValue( fIdx[2] , cIdx[2] , true ) }; + value += metSolution[ _node->nodeData.nodeIndex ] * v[0] * v[1] * v[2]; + gradient += Point3D< double >( dv[0]*v[1]*v[2] , v[0]*dv[1]*v[2] , v[0]*v[1]*dv[2] ) * metSolution[ _node->nodeData.nodeIndex ]; + } + } + } + return std::pair< Real , Point3D< Real > >( Real( value ) , Point3D< Real >( gradient ) ); +} diff --git a/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.IsoSurface.inl b/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.IsoSurface.inl old mode 100755 new mode 100644 index 7b758071..bdd9fdb5 --- a/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.IsoSurface.inl +++ b/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.IsoSurface.inl @@ -1,1183 +1,1188 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - -#include "Octree.h" -#include "MyTime.h" -#include "MemoryUsage.h" -#include "MAT.h" - -template< class Real > -template< class Vertex > -Octree< Real >::SliceValues< Vertex >::SliceValues( void ) -{ - _oldCCount = _oldECount = _oldFCount = _oldNCount = 0; - cornerValues = NullPointer( Real ) ; cornerGradients = NullPointer( Point3D< Real > ) ; cornerSet = NullPointer( char ); - edgeKeys = NullPointer( long long ) ; edgeSet = NullPointer( char ); - faceEdges = NullPointer( FaceEdges ) ; faceSet = NullPointer( char ); - mcIndices = NullPointer( char ); -} -template< class Real > -template< class Vertex > -Octree< Real >::SliceValues< Vertex >::~SliceValues( void ) -{ - _oldCCount = _oldECount = _oldFCount = _oldNCount = 0; - FreePointer( cornerValues ) ; FreePointer( cornerGradients ) ; FreePointer( cornerSet ); - FreePointer( edgeKeys ) ; FreePointer( edgeSet ); - FreePointer( faceEdges ) ; FreePointer( faceSet ); - FreePointer( mcIndices ); -} -template< class Real > -template< class Vertex > -void Octree< Real >::SliceValues< Vertex >::reset( bool nonLinearFit ) -{ - faceEdgeMap.clear() , edgeVertexMap.clear() , vertexPairMap.clear(); - - if( _oldNCount0 ) mcIndices = AllocPointer< char >( _oldNCount ); - } - if( _oldCCount0 ) - { - cornerValues = AllocPointer< Real >( _oldCCount ); - if( nonLinearFit ) cornerGradients = AllocPointer< Point3D< Real > >( _oldCCount ); - cornerSet = AllocPointer< char >( _oldCCount ); - } - } - if( _oldECount( _oldECount ); - edgeSet = AllocPointer< char >( _oldECount ); - } - if( _oldFCount( _oldFCount ); - faceSet = AllocPointer< char >( _oldFCount ); - } - - if( sliceData.cCount>0 ) memset( cornerSet , 0 , sizeof( char ) * sliceData.cCount ); - if( sliceData.eCount>0 ) memset( edgeSet , 0 , sizeof( char ) * sliceData.eCount ); - if( sliceData.fCount>0 ) memset( faceSet , 0 , sizeof( char ) * sliceData.fCount ); -} -template< class Real > -template< class Vertex > -Octree< Real >::XSliceValues< Vertex >::XSliceValues( void ) -{ - _oldECount = _oldFCount = 0; - edgeKeys = NullPointer( long long ) ; edgeSet = NullPointer( char ); - faceEdges = NullPointer( FaceEdges ) ; faceSet = NullPointer( char ); -} -template< class Real > -template< class Vertex > -Octree< Real >::XSliceValues< Vertex >::~XSliceValues( void ) -{ - _oldECount = _oldFCount = 0; - FreePointer( edgeKeys ) ; FreePointer( edgeSet ); - FreePointer( faceEdges ) ; FreePointer( faceSet ); -} -template< class Real > -template< class Vertex > -void Octree< Real >::XSliceValues< Vertex >::reset( void ) -{ - faceEdgeMap.clear() , edgeVertexMap.clear() , vertexPairMap.clear(); - - if( _oldECount( _oldECount ); - edgeSet = AllocPointer< char >( _oldECount ); - } - if( _oldFCount( _oldFCount ); - faceSet = AllocPointer< char >( _oldFCount ); - } - if( xSliceData.eCount>0 ) memset( edgeSet , 0 , sizeof( char ) * xSliceData.eCount ); - if( xSliceData.fCount>0 ) memset( faceSet , 0 , sizeof( char ) * xSliceData.fCount ); -} - -template< class Real > -template< int FEMDegree , int WeightDegree , int ColorDegree , class Vertex > -void Octree< Real >::GetMCIsoSurface( const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , const DenseNodeData< Real , FEMDegree >& solution , Real isoValue , CoredMeshData< Vertex >& mesh , bool nonLinearFit , bool addBarycenter , bool polygonMesh ) -{ - int maxDepth = _tree.maxDepth(); - if( FEMDegree==1 && nonLinearFit ) fprintf( stderr , "[WARNING] First order B-Splines do not support non-linear interpolation\n" ) , nonLinearFit = false; - - BSplineData< ColorDegree >* colorBSData = NULL; - if( colorData ) - { - colorBSData = new BSplineData< ColorDegree >(); - colorBSData->set( maxDepth , _dirichlet ); - } - - DenseNodeData< Real , FEMDegree > coarseSolution( _sNodes.end( maxDepth-1 ) ); - memset( coarseSolution.data , 0 , sizeof(Real)*_sNodes.end( maxDepth-1 ) ); -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=_sNodes.begin(_minDepth) ; i<_sNodes.end(maxDepth-1) ; i++ ) coarseSolution[i] = solution[i]; - for( int d=_minDepth+1 ; d > evaluators( maxDepth+1 ); - for( int d=_minDepth ; d<=maxDepth ; d++ ) evaluators[d].set( d-1 , _dirichlet ); - int vertexOffset = 0; - std::vector< SlabValues< Vertex > > slabValues( maxDepth+1 ); - - // Initialize the back slice - for( int d=maxDepth ; d>=_minDepth ; d-- ) - { - _sNodes.setSliceTableData ( slabValues[d]. sliceValues(0). sliceData , d , 0 , threads ); - _sNodes.setSliceTableData ( slabValues[d]. sliceValues(1). sliceData , d , 1 , threads ); - _sNodes.setXSliceTableData( slabValues[d].xSliceValues(0).xSliceData , d , 0 , threads ); - slabValues[d].sliceValues (0).reset( nonLinearFit ); - slabValues[d].sliceValues (1).reset( nonLinearFit ); - slabValues[d].xSliceValues(0).reset( ); - } - for( int d=maxDepth ; d>=_minDepth ; d-- ) - { - // Copy edges from finer - if( d( colorBSData , densityWeights , colorData , isoValue , d , 0 , vertexOffset , mesh , slabValues , threads ); - SetSliceIsoEdges( d , 0 , slabValues , threads ); - } - // Iterate over the slices at the finest level - for( int slice=0 ; slice<( 1<<(maxDepth-1) ) ; slice++ ) - { - // Process at all depths that that contain this slice - for( int d=maxDepth , o=slice+1 ; d>=_minDepth ; d-- , o>>=1 ) - { - // Copy edges from finer (required to ensure we correctly track edge cancellations) - if( d( colorBSData , densityWeights , colorData , isoValue , d , o , vertexOffset , mesh , slabValues , threads ); - SetSliceIsoEdges( d , o , slabValues , threads ); - - // Set the cross-slice edges - SetXSliceIsoVertices< WeightDegree , ColorDegree, Vertex >( colorBSData , densityWeights , colorData , isoValue , d , o-1 , vertexOffset , mesh , slabValues , threads ); - SetXSliceIsoEdges( d , o-1 , slabValues , threads ); - - // Add the triangles - SetIsoSurface( d , o-1 , slabValues[d].sliceValues(o-1) , slabValues[d].sliceValues(o) , slabValues[d].xSliceValues(o-1) , mesh , polygonMesh , addBarycenter , vertexOffset , threads ); - - if( o&1 ) break; - } - for( int d=maxDepth , o=slice+1 ; d>=_minDepth ; d-- , o>>=1 ) - { - // Initialize for the next pass - if( o<(1< -template< int FEMDegree , int NormalDegree > -Real Octree< Real >::GetIsoValue( const DenseNodeData< Real , FEMDegree >& solution , const SparseNodeData< Real , NormalDegree >& nodeWeights ) -{ - Real isoValue=0 , weightSum=0; - int maxDepth = _tree.maxDepth(); - - Pointer( Real ) nodeValues = AllocPointer< Real >( _sNodes.end(maxDepth) ); - memset( nodeValues , 0 , sizeof(Real) * _sNodes.end(maxDepth) ); - DenseNodeData< Real , FEMDegree > metSolution( _sNodes.end( maxDepth-1 ) ); - memset( metSolution.data , 0 , sizeof(Real)*_sNodes.end( maxDepth-1 ) ); -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=_sNodes.begin(_minDepth) ; i<_sNodes.end(maxDepth-1) ; i++ ) metSolution[i] = solution[i]; - for( int d=_minDepth+1 ; d=_minDepth ; d-- ) - { - _Evaluator< FEMDegree > evaluator; - evaluator.set( d-1 , _dirichlet ); - std::vector< ConstPointSupportKey< FEMDegree > > neighborKeys( std::max< int >( 1 , threads ) ); - for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) - { - ConstPointSupportKey< FEMDegree >& neighborKey = neighborKeys[ omp_get_thread_num() ]; - TreeOctNode* node = _sNodes.treeNodes[i]; - Real value = Real(0); - if( node->children ) - { - if( NormalDegree&1 ) value = nodeValues[ node->children->nodeData.nodeIndex ]; - else for( int c=0 ; cchildren[c].nodeData.nodeIndex ] / Cube::CORNERS; - } - else if( nodeWeights.index( _sNodes.treeNodes[i] )>=0 ) - { - neighborKey.getNeighbors( node ); - int c=0 , x , y , z; - if( node->parent ) c = int( node - node->parent->children ); - Cube::FactorCornerIndex( c , x , y , z ); - - // Since evaluation requires parent indices, we need to check that the node's parent is interiorly supported - bool isInterior = _IsInteriorlySupported< FEMDegree >( node->parent ); - - if( NormalDegree&1 ) value = _getCornerValue( neighborKey , node , 0 , solution , metSolution , evaluator , isInterior ); - else value = _getCenterValue( neighborKey , node , solution , metSolution , evaluator , isInterior ); - } - nodeValues[i] = value; - int idx = nodeWeights.index( _sNodes.treeNodes[i] ); - if( idx!=-1 ) - { - Real w = nodeWeights.data[ idx ]; - if( w!=0 ) isoValue += value * w , weightSum += w; - } - } - } - metSolution.resize( 0 ); - FreePointer( nodeValues ); - - return isoValue / weightSum; -} - -template< class Real > -template< class Vertex , int FEMDegree > -void Octree< Real >::SetSliceIsoCorners( const DenseNodeData< Real , FEMDegree >& solution , const DenseNodeData< Real , FEMDegree >& coarseSolution , Real isoValue , int depth , int slice , std::vector< SlabValues< Vertex > >& slabValues , const _Evaluator< FEMDegree >& evaluator , int threads ) -{ - if( slice>0 ) SetSliceIsoCorners( solution , coarseSolution , isoValue , depth , slice , 1 , slabValues , evaluator , threads ); - if( slice<(1< -template< class Vertex , int FEMDegree > -void Octree< Real >::SetSliceIsoCorners( const DenseNodeData< Real , FEMDegree >& solution , const DenseNodeData< Real , FEMDegree >& coarseSolution , Real isoValue , int depth , int slice , int z , std::vector< SlabValues< Vertex > >& slabValues , const struct _Evaluator< FEMDegree >& evaluator , int threads ) -{ - typename Octree::template SliceValues< Vertex >& sValues = slabValues[depth].sliceValues( slice ); - std::vector< ConstPointSupportKey< FEMDegree > > neighborKeys( std::max< int >( 1 , threads ) ); - for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) - { - Real squareValues[ Square::CORNERS ]; - ConstPointSupportKey< FEMDegree >& neighborKey = neighborKeys[ omp_get_thread_num() ]; - TreeOctNode* leaf = _sNodes.treeNodes[i]; - if( !leaf->children ) - { - const typename SortedTreeNodes::SquareCornerIndices& cIndices = sValues.sliceData.cornerIndices( leaf ); - - bool isInterior = _IsInteriorlySupported< FEMDegree >( leaf->parent ); - neighborKey.getNeighbors( leaf ); - - for( int x=0 ; x<2 ; x++ ) for( int y=0 ; y<2 ; y++ ) - { - int cc = Cube::CornerIndex( x , y , z ); - int fc = Square::CornerIndex( x , y ); - int vIndex = cIndices[fc]; - if( !sValues.cornerSet[vIndex] ) - { - if( sValues.cornerGradients ) - { - std::pair< Real , Point3D< Real > > p = _getCornerValueAndGradient( neighborKey , leaf , cc , solution , coarseSolution , evaluator , isInterior ); - sValues.cornerValues[vIndex] = p.first , sValues.cornerGradients[vIndex] = p.second; - } - else sValues.cornerValues[vIndex] = _getCornerValue( neighborKey , leaf , cc , solution , coarseSolution , evaluator , isInterior ); - sValues.cornerSet[vIndex] = 1; - } - squareValues[fc] = sValues.cornerValues[ vIndex ]; - TreeOctNode* node = leaf; - int _depth = depth , _slice = slice; - while( _IsValidNode< 0 >( node->parent ) && (node-node->parent->children)==cc ) - { - node = node->parent , _depth-- , _slice >>= 1; - typename Octree::template SliceValues< Vertex >& _sValues = slabValues[_depth].sliceValues( _slice ); - const typename SortedTreeNodes::SquareCornerIndices& _cIndices = _sValues.sliceData.cornerIndices( node ); - int _vIndex = _cIndices[fc]; - _sValues.cornerValues[_vIndex] = sValues.cornerValues[vIndex]; - if( _sValues.cornerGradients ) _sValues.cornerGradients[_vIndex] = sValues.cornerGradients[vIndex]; - _sValues.cornerSet[_vIndex] = 1; - } - } - sValues.mcIndices[ i - sValues.sliceData.nodeOffset ] = MarchingSquares::GetIndex( squareValues , isoValue ); - } - } -} - -template< class Real > -template< int WeightDegree , int ColorDegree , class Vertex > -void Octree< Real >::SetSliceIsoVertices( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , int depth , int slice , int& vOffset , CoredMeshData< Vertex >& mesh , std::vector< SlabValues< Vertex > >& slabValues , int threads ) -{ - if( slice>0 ) SetSliceIsoVertices< WeightDegree , ColorDegree, Vertex >( colorBSData , densityWeights , colorData , isoValue , depth , slice , 1 , vOffset , mesh , slabValues , threads ); - if( slice<(1<( colorBSData , densityWeights , colorData , isoValue , depth , slice , 0 , vOffset , mesh , slabValues , threads ); -} -template< class Real > -template< int WeightDegree , int ColorDegree , class Vertex > -void Octree< Real >::SetSliceIsoVertices( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , int depth , int slice , int z , int& vOffset , CoredMeshData< Vertex >& mesh , std::vector< SlabValues< Vertex > >& slabValues , int threads ) -{ - typename Octree::template SliceValues< Vertex >& sValues = slabValues[depth].sliceValues( slice ); - // [WARNING] In the case Degree=2, these two keys are the same, so we don't have to maintain them separately. - std::vector< ConstAdjacenctNodeKey > neighborKeys( std::max< int >( 1 , threads ) ); - std::vector< ConstPointSupportKey< WeightDegree > > weightKeys( std::max< int >( 1 , threads ) ); - std::vector< ConstPointSupportKey< ColorDegree > > colorKeys( std::max< int >( 1 , threads ) ); - for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) - { - ConstAdjacenctNodeKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; - ConstPointSupportKey< WeightDegree >& weightKey = weightKeys[ omp_get_thread_num() ]; - ConstPointSupportKey< ColorDegree >& colorKey = colorKeys[ omp_get_thread_num() ]; - TreeOctNode* leaf = _sNodes.treeNodes[i]; - if( !leaf->children ) - { - int idx = i - sValues.sliceData.nodeOffset; - const typename SortedTreeNodes::SquareEdgeIndices& eIndices = sValues.sliceData.edgeIndices( leaf ); - if( MarchingSquares::HasRoots( sValues.mcIndices[idx] ) ) - { - neighborKey.getNeighbors( leaf ); - if( densityWeights ) weightKey.getNeighbors( leaf ); - if( colorData ) colorKey.getNeighbors( leaf ); - for( int e=0 ; e hashed_vertex; -#pragma omp critical (add_point_access) - { - if( !sValues.edgeSet[vIndex] ) - { - mesh.addOutOfCorePoint( vertex ); - sValues.edgeSet[ vIndex ] = 1; - sValues.edgeKeys[ vIndex ] = key; - sValues.edgeVertexMap[key] = hashed_vertex = std::pair< int , Vertex >( vOffset , vertex ); - vOffset++; - stillOwner = true; - } - } - if( stillOwner ) - { - // We only need to pass the iso-vertex down if the edge it lies on is adjacent to a coarser leaf - bool isNeeded; - switch( o ) - { - case 0: isNeeded = ( !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[1][2*y][1] ) || !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[1][2*y][2*z] ) || !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[1][1][2*z] ) ) ; break; - case 1: isNeeded = ( !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[2*y][1][1] ) || !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[2*y][1][2*z] ) || !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[1][1][2*z] ) ) ; break; - } - if( isNeeded ) - { - int f[2]; - Cube::FacesAdjacentToEdge( Cube::EdgeIndex( o , y , z ) , f[0] , f[1] ); - for( int k=0 ; k<2 ; k++ ) - { - TreeOctNode* node = leaf; - int _depth = depth , _slice = slice; - bool _isNeeded = isNeeded; - while( _isNeeded && node->parent && Cube::IsFaceCorner( (int)(node-node->parent->children) , f[k] ) ) - { - node = node->parent , _depth-- , _slice >>= 1; - typename Octree::template SliceValues< Vertex >& _sValues = slabValues[_depth].sliceValues( _slice ); -#pragma omp critical (add_coarser_point_access) - _sValues.edgeVertexMap[key] = hashed_vertex; - switch( o ) - { - case 0: _isNeeded = ( !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[1][2*y][1] ) || !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[1][2*y][2*z] ) || !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[1][1][2*z] ) ) ; break; - case 1: _isNeeded = ( !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[2*y][1][1] ) || !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[2*y][1][2*z] ) || !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[1][1][2*z] ) ) ; break; - } - } - } - } - } - } - } - } - } - } -} -template< class Real > -template< int WeightDegree , int ColorDegree , class Vertex > -void Octree< Real >::SetXSliceIsoVertices( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , int depth , int slab , int& vOffset , CoredMeshData< Vertex >& mesh , std::vector< SlabValues< Vertex > >& slabValues , int threads ) -{ - typename Octree::template SliceValues< Vertex >& bValues = slabValues[depth].sliceValues ( slab ); - typename Octree::template SliceValues< Vertex >& fValues = slabValues[depth].sliceValues ( slab+1 ); - typename Octree::template XSliceValues< Vertex >& xValues = slabValues[depth].xSliceValues( slab ); - - // [WARNING] In the case Degree=2, these two keys are the same, so we don't have to maintain them separately. - std::vector< ConstAdjacenctNodeKey > neighborKeys( std::max< int >( 1 , threads ) ); - std::vector< ConstPointSupportKey< WeightDegree > > weightKeys( std::max< int >( 1 , threads ) ); - std::vector< ConstPointSupportKey< ColorDegree > > colorKeys( std::max< int >( 1 , threads ) ); - for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) - { - ConstAdjacenctNodeKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; - ConstPointSupportKey< WeightDegree >& weightKey = weightKeys[ omp_get_thread_num() ]; - ConstPointSupportKey< ColorDegree >& colorKey = colorKeys[ omp_get_thread_num() ]; - TreeOctNode* leaf = _sNodes.treeNodes[i]; - if( !leaf->children ) - { - unsigned char mcIndex = ( bValues.mcIndices[ i - bValues.sliceData.nodeOffset ] ) | ( fValues.mcIndices[ i - fValues.sliceData.nodeOffset ] )<<4; - const typename SortedTreeNodes::SquareCornerIndices& eIndices = xValues.xSliceData.edgeIndices( leaf ); - if( MarchingCubes::HasRoots( mcIndex ) ) - { - neighborKey.getNeighbors( leaf ); - if( densityWeights ) weightKey.getNeighbors( leaf ); - if( colorData ) colorKey.getNeighbors( leaf ); - for( int x=0 ; x<2 ; x++ ) for( int y=0 ; y<2 ; y++ ) - { - int c = Square::CornerIndex( x , y ); - int e = Cube::EdgeIndex( 2 , x , y ); - if( MarchingCubes::HasEdgeRoots( mcIndex , e ) ) - { - int vIndex = eIndices[c]; - if( !xValues.edgeSet[vIndex] ) - { - Vertex vertex; - long long key = VertexData::EdgeIndex( leaf , e , _sNodes.levels() ); - GetIsoVertex( colorBSData , densityWeights , colorData , isoValue , weightKey , colorKey , leaf , c , bValues , fValues , vertex ); - vertex.point = vertex.point * _scale + _center; - bool stillOwner = false; - std::pair< int , Vertex > hashed_vertex; -#pragma omp critical (add_x_point_access) - { - if( !xValues.edgeSet[vIndex] ) - { - mesh.addOutOfCorePoint( vertex ); - xValues.edgeSet[ vIndex ] = 1; - xValues.edgeKeys[ vIndex ] = key; - xValues.edgeVertexMap[key] = hashed_vertex = std::pair< int , Vertex >( vOffset , vertex ); - stillOwner = true; - vOffset++; - } - } - if( stillOwner ) - { - // We only need to pass the iso-vertex down if the edge it lies on is adjacent to a coarser leaf - bool isNeeded = ( !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[2*x][1][1] ) || !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[2*x][2*y][1] ) || !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[1][2*y][1] ) ); - if( isNeeded ) - { - int f[2]; - Cube::FacesAdjacentToEdge( e , f[0] , f[1] ); - for( int k=0 ; k<2 ; k++ ) - { - TreeOctNode* node = leaf; - int _depth = depth , _slab = slab; - bool _isNeeded = isNeeded; - while( _isNeeded && node->parent && Cube::IsFaceCorner( (int)(node-node->parent->children) , f[k] ) ) - { - node = node->parent , _depth-- , _slab >>= 1; - typename Octree::template XSliceValues< Vertex >& _xValues = slabValues[_depth].xSliceValues( _slab ); -#pragma omp critical (add_x_coarser_point_access) - _xValues.edgeVertexMap[key] = hashed_vertex; - _isNeeded = ( !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[2*x][1][1] ) || !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[2*x][2*y][1] ) || !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[1][2*y][1] ) ); - } - } - } - } - } - } - } - } - } - } -} -template< class Real > -template< class Vertex > -void Octree< Real >::CopyFinerSliceIsoEdgeKeys( int depth , int slice , std::vector< SlabValues< Vertex > >& slabValues , int threads ) -{ - if( slice>0 ) CopyFinerSliceIsoEdgeKeys( depth , slice , 1 , slabValues , threads ); - if( slice<(1< -template< class Vertex > -void Octree< Real >::CopyFinerSliceIsoEdgeKeys( int depth , int slice , int z , std::vector< SlabValues< Vertex > >& slabValues , int threads ) -{ - SliceValues< Vertex >& pSliceValues = slabValues[depth ].sliceValues(slice ); - SliceValues< Vertex >& cSliceValues = slabValues[depth+1].sliceValues(slice<<1); - typename SortedTreeNodes::SliceTableData& pSliceData = pSliceValues.sliceData; - typename SortedTreeNodes::SliceTableData& cSliceData = cSliceValues.sliceData; -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=_sNodes.begin(depth,slice-z) ; i<_sNodes.end(depth,slice-z) ; i++ ) if( _IsValidNode< 0 >( _sNodes.treeNodes[i] ) ) - if( _sNodes.treeNodes[i]->children ) - { - typename SortedTreeNodes::SquareEdgeIndices& pIndices = pSliceData.edgeIndices( i ); - // Copy the edges that overlap the coarser edges - for( int orientation=0 ; orientation<2 ; orientation++ ) for( int y=0 ; y<2 ; y++ ) - { - int fe = Square::EdgeIndex( orientation , y ); - int pIndex = pIndices[fe]; - if( !pSliceValues.edgeSet[ pIndex ] ) - { - int ce = Cube::EdgeIndex( orientation , y , z ); - int c1 , c2; - switch( orientation ) - { - case 0: c1 = Cube::CornerIndex( 0 , y , z ) , c2 = Cube::CornerIndex( 1 , y , z ) ; break; - case 1: c1 = Cube::CornerIndex( y , 0 , z ) , c2 = Cube::CornerIndex( y , 1 , z ) ; break; - } - // [SANITY CHECK] -// if( _IsValidNode< 0 >( _sNodes.treeNodes[i]->children + c1 )!=_IsValidNode< 0 >( _sNodes.treeNodes[i]->children + c2 ) ) fprintf( stderr , "[WARNING] Finer edges should both be valid or invalid\n" ) , exit( 0 ); - if( !_IsValidNode< 0 >( _sNodes.treeNodes[i]->children + c1 ) || !_IsValidNode< 0 >( _sNodes.treeNodes[i]->children + c2 ) ) continue; - - int cIndex1 = cSliceData.edgeIndices( _sNodes.treeNodes[i]->children + c1 )[fe]; - int cIndex2 = cSliceData.edgeIndices( _sNodes.treeNodes[i]->children + c2 )[fe]; - if( cSliceValues.edgeSet[cIndex1] != cSliceValues.edgeSet[cIndex2] ) - { - long long key; - if( cSliceValues.edgeSet[cIndex1] ) key = cSliceValues.edgeKeys[cIndex1]; - else key = cSliceValues.edgeKeys[cIndex2]; - std::pair< int , Vertex > vPair = cSliceValues.edgeVertexMap.find( key )->second; -#pragma omp critical ( copy_finer_edge_keys ) - pSliceValues.edgeVertexMap[key] = vPair; - pSliceValues.edgeKeys[pIndex] = key; - pSliceValues.edgeSet[pIndex] = 1; - } - else if( cSliceValues.edgeSet[cIndex1] && cSliceValues.edgeSet[cIndex2] ) - { - long long key1 = cSliceValues.edgeKeys[cIndex1] , key2 = cSliceValues.edgeKeys[cIndex2]; -#pragma omp critical ( set_edge_pairs ) - pSliceValues.vertexPairMap[ key1 ] = key2 , pSliceValues.vertexPairMap[ key2 ] = key1; - - const TreeOctNode* node = _sNodes.treeNodes[i]; - int _depth = depth , _slice = slice; - while( node->parent && Cube::IsEdgeCorner( (int)( node - node->parent->children ) , ce ) ) - { - node = node->parent , _depth-- , _slice >>= 1; - SliceValues< Vertex >& _pSliceValues = slabValues[_depth].sliceValues(_slice); -#pragma omp critical ( set_edge_pairs ) - _pSliceValues.vertexPairMap[ key1 ] = key2 , _pSliceValues.vertexPairMap[ key2 ] = key1; - } - } - } - } - } -} -template< class Real > -template< class Vertex > -void Octree< Real >::CopyFinerXSliceIsoEdgeKeys( int depth , int slab , std::vector< SlabValues< Vertex > >& slabValues , int threads ) -{ - XSliceValues< Vertex >& pSliceValues = slabValues[depth ].xSliceValues(slab); - XSliceValues< Vertex >& cSliceValues0 = slabValues[depth+1].xSliceValues( (slab<<1)|0 ); - XSliceValues< Vertex >& cSliceValues1 = slabValues[depth+1].xSliceValues( (slab<<1)|1 ); - typename SortedTreeNodes::XSliceTableData& pSliceData = pSliceValues.xSliceData; - typename SortedTreeNodes::XSliceTableData& cSliceData0 = cSliceValues0.xSliceData; - typename SortedTreeNodes::XSliceTableData& cSliceData1 = cSliceValues1.xSliceData; -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=_sNodes.begin(depth,slab) ; i<_sNodes.end(depth,slab) ; i++ ) if( _IsValidNode< 0 >( _sNodes.treeNodes[i] ) ) - if( _sNodes.treeNodes[i]->children ) - { - typename SortedTreeNodes::SquareCornerIndices& pIndices = pSliceData.edgeIndices( i ); - for( int x=0 ; x<2 ; x++ ) for( int y=0 ; y<2 ; y++ ) - { - int fc = Square::CornerIndex( x , y ); - int pIndex = pIndices[fc]; - if( !pSliceValues.edgeSet[pIndex] ) - { - int c0 = Cube::CornerIndex( x , y , 0 ) , c1 = Cube::CornerIndex( x , y , 1 ); - - // [SANITY CHECK] -// if( _IsValidNode< 0 >( _sNodes.treeNodes[i]->children + c0 )!=_IsValidNode< 0 >( _sNodes.treeNodes[i]->children + c1 ) ) fprintf( stderr , "[ERROR] Finer edges should both be valid or invalid\n" ) , exit( 0 ); - if( !_IsValidNode< 0 >( _sNodes.treeNodes[i]->children + c0 ) || !_IsValidNode< 0 >( _sNodes.treeNodes[i]->children + c1 ) ) continue; - - int cIndex0 = cSliceData0.edgeIndices( _sNodes.treeNodes[i]->children + c0 )[fc]; - int cIndex1 = cSliceData1.edgeIndices( _sNodes.treeNodes[i]->children + c1 )[fc]; - if( cSliceValues0.edgeSet[cIndex0] != cSliceValues1.edgeSet[cIndex1] ) - { - long long key; - std::pair< int , Vertex > vPair; - if( cSliceValues0.edgeSet[cIndex0] ) key = cSliceValues0.edgeKeys[cIndex0] , vPair = cSliceValues0.edgeVertexMap.find( key )->second; - else key = cSliceValues1.edgeKeys[cIndex1] , vPair = cSliceValues1.edgeVertexMap.find( key )->second; -#pragma omp critical ( copy_finer_x_edge_keys ) - pSliceValues.edgeVertexMap[key] = vPair; - pSliceValues.edgeKeys[ pIndex ] = key; - pSliceValues.edgeSet[ pIndex ] = 1; - } - else if( cSliceValues0.edgeSet[cIndex0] && cSliceValues1.edgeSet[cIndex1] ) - { - long long key0 = cSliceValues0.edgeKeys[cIndex0] , key1 = cSliceValues1.edgeKeys[cIndex1]; -#pragma omp critical ( set_x_edge_pairs ) - pSliceValues.vertexPairMap[ key0 ] = key1 , pSliceValues.vertexPairMap[ key1 ] = key0; - const TreeOctNode* node = _sNodes.treeNodes[i]; - int _depth = depth , _slab = slab , ce = Cube::CornerIndex( 2 , x , y ); - while( node->parent && Cube::IsEdgeCorner( (int)( node - node->parent->children ) , ce ) ) - { - node = node->parent , _depth-- , _slab>>= 1; - SliceValues< Vertex >& _pSliceValues = slabValues[_depth].sliceValues(_slab); -#pragma omp critical ( set_x_edge_pairs ) - _pSliceValues.vertexPairMap[ key0 ] = key1 , _pSliceValues.vertexPairMap[ key1 ] = key0; - } - } - } - } - } -} -template< class Real > -template< class Vertex > -void Octree< Real >::SetSliceIsoEdges( int depth , int slice , std::vector< SlabValues< Vertex > >& slabValues , int threads ) -{ - if( slice>0 ) SetSliceIsoEdges( depth , slice , 1 , slabValues , threads ); - if( slice<(1< -template< class Vertex > -void Octree< Real >::SetSliceIsoEdges( int depth , int slice , int z , std::vector< SlabValues< Vertex > >& slabValues , int threads ) -{ - typename Octree::template SliceValues< Vertex >& sValues = slabValues[depth].sliceValues( slice ); - std::vector< ConstAdjacenctNodeKey > neighborKeys( std::max< int >( 1 , threads ) ); - for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) - { - int isoEdges[ 2 * MarchingSquares::MAX_EDGES ]; - ConstAdjacenctNodeKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; - TreeOctNode* leaf = _sNodes.treeNodes[i]; - if( !leaf->children ) - { - int idx = i - sValues.sliceData.nodeOffset; - const typename SortedTreeNodes::SquareEdgeIndices& eIndices = sValues.sliceData.edgeIndices( leaf ); - const typename SortedTreeNodes::SquareFaceIndices& fIndices = sValues.sliceData.faceIndices( leaf ); - unsigned char mcIndex = sValues.mcIndices[idx]; - if( !sValues.faceSet[ fIndices[0] ] ) - { - neighborKey.getNeighbors( leaf ); - if( !neighborKey.neighbors[depth].neighbors[1][1][2*z] || !neighborKey.neighbors[depth].neighbors[1][1][2*z]->children ) - { - FaceEdges fe; - fe.count = MarchingSquares::AddEdgeIndices( mcIndex , isoEdges ); - for( int j=0 ; j edges; - edges.resize( fe.count ); - for( int j=0 ; jparent && Cube::IsFaceCorner( (int)(node-node->parent->children) , f ) ) - { - node = node->parent , _depth-- , _slice >>= 1; - if( neighborKey.neighbors[_depth].neighbors[1][1][2*z] && neighborKey.neighbors[_depth].neighbors[1][1][2*z]->children ) break; - long long key = VertexData::FaceIndex( node , f , _sNodes.levels() ); -#pragma omp critical( add_iso_edge_access ) - { - typename Octree::template SliceValues< Vertex >& _sValues = slabValues[_depth].sliceValues( _slice ); - typename hash_map< long long , std::vector< IsoEdge > >::iterator iter = _sValues.faceEdgeMap.find(key); - if( iter==_sValues.faceEdgeMap.end() ) _sValues.faceEdgeMap[key] = edges; - else for( int j=0 ; jsecond.push_back( fe.edges[j] ); - } - } - } - } - } - } -} -template< class Real > -template< class Vertex > -void Octree< Real >::SetXSliceIsoEdges( int depth , int slab , std::vector< SlabValues< Vertex > >& slabValues , int threads ) -{ - typename Octree::template SliceValues< Vertex >& bValues = slabValues[depth].sliceValues ( slab ); - typename Octree::template SliceValues< Vertex >& fValues = slabValues[depth].sliceValues ( slab+1 ); - typename Octree::template XSliceValues< Vertex >& xValues = slabValues[depth].xSliceValues( slab ); - - std::vector< ConstAdjacenctNodeKey > neighborKeys( std::max< int >( 1 , threads ) ); - for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) - { - int isoEdges[ 2 * MarchingSquares::MAX_EDGES ]; - ConstAdjacenctNodeKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; - TreeOctNode* leaf = _sNodes.treeNodes[i]; - if( !leaf->children ) - { - const typename SortedTreeNodes::SquareCornerIndices& cIndices = xValues.xSliceData.edgeIndices( leaf ); - const typename SortedTreeNodes::SquareEdgeIndices& eIndices = xValues.xSliceData.faceIndices( leaf ); - unsigned char mcIndex = ( bValues.mcIndices[ i - bValues.sliceData.nodeOffset ] ) | ( fValues.mcIndices[ i - fValues.sliceData.nodeOffset ]<<4 ); - { - neighborKey.getNeighbors( leaf ); - for( int o=0 ; o<2 ; o++ ) for( int x=0 ; x<2 ; x++ ) - { - int e = Square::EdgeIndex( o , x ); - int f = Cube::FaceIndex( 1-o , x ); - unsigned char _mcIndex = MarchingCubes::GetFaceIndex( mcIndex , f ); - int xx = o==1 ? 2*x : 1 , yy = o==0 ? 2*x : 1 , zz = 1; - if( !xValues.faceSet[ eIndices[e] ] && ( !neighborKey.neighbors[depth].neighbors[xx][yy][zz] || !neighborKey.neighbors[depth].neighbors[xx][yy][zz]->children ) ) - { - FaceEdges fe; - fe.count = MarchingSquares::AddEdgeIndices( _mcIndex , isoEdges ); - for( int j=0 ; j& sValues = (_x==0) ? bValues : fValues; - int idx = sValues.sliceData.edgeIndices(i)[ Square::EdgeIndex(o,x) ]; - if( !sValues.edgeSet[ idx ] ) fprintf( stderr , "[ERROR] Edge not set 5: %d / %d\n" , slab , 1< edges; - edges.resize( fe.count ); - for( int j=0 ; jparent && Cube::IsFaceCorner( (int)(node-node->parent->children) , f ) ) - { - node = node->parent , _depth-- , _slab >>= 1; - if( neighborKey.neighbors[_depth].neighbors[xx][yy][zz] && neighborKey.neighbors[_depth].neighbors[xx][yy][zz]->children ) break; - long long key = VertexData::FaceIndex( node , f , _sNodes.levels() ); -#pragma omp critical( add_x_iso_edge_access ) - { - typename Octree::template XSliceValues< Vertex >& _xValues = slabValues[_depth].xSliceValues( _slab ); - typename hash_map< long long , std::vector< IsoEdge > >::iterator iter = _xValues.faceEdgeMap.find(key); - if( iter==_xValues.faceEdgeMap.end() ) _xValues.faceEdgeMap[key] = edges; - else for( int j=0 ; jsecond.push_back( fe.edges[j] ); - } - } - } - } - } - } - } -} -template< class Real > -template< class Vertex > -void Octree< Real >::SetIsoSurface( int depth , int offset , const SliceValues< Vertex >& bValues , const SliceValues< Vertex >& fValues , const XSliceValues< Vertex >& xValues , CoredMeshData< Vertex >& mesh , bool polygonMesh , bool addBarycenter , int& vOffset , int threads ) -{ - std::vector< std::pair< int , Vertex > > polygon; - std::vector< std::vector< IsoEdge > > edgess( std::max< int >( 1 , threads ) ); -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=_sNodes.begin(depth,offset) ; i<_sNodes.end(depth,offset) ; i++ ) if( _IsValidNode< 0 >( _sNodes.treeNodes[i] ) ) - { - std::vector< IsoEdge >& edges = edgess[ omp_get_thread_num() ]; - TreeOctNode* leaf = _sNodes.treeNodes[i]; - int d , off[3]; - leaf->depthAndOffset( d , off ); - int res = _Resolution( depth ); - bool inBounds = off[0]children ) - { - edges.clear(); - unsigned char mcIndex = ( bValues.mcIndices[ i - bValues.sliceData.nodeOffset ] ) | ( fValues.mcIndices[ i - fValues.sliceData.nodeOffset ]<<4 ); - // [WARNING] Just because the node looks empty doesn't mean it doesn't get eges from finer neighbors - { - // Gather the edges from the faces (with the correct orientation) - for( int f=0 ; f& sValues = (o==0) ? bValues : fValues; - int fIdx = sValues.sliceData.faceIndices(i)[0]; - if( sValues.faceSet[fIdx] ) - { - const FaceEdges& fe = sValues.faceEdges[ fIdx ]; - for( int j=0 ; j >::const_iterator iter = sValues.faceEdgeMap.find( key ); - if( iter!=sValues.faceEdgeMap.end() ) - { - const std::vector< IsoEdge >& _edges = iter->second; - for( size_t j=0 ; j<_edges.size() ; j++ ) edges.push_back( IsoEdge( _edges[j][flip] , _edges[j][1-flip] ) ); - } - else fprintf( stderr , "[ERROR] Invalid faces: %d %d %d\n" , i , d , o ) , exit( 0 ); - } - } - else - { - int fIdx = xValues.xSliceData.faceIndices(i)[ Square::EdgeIndex( 1-d , o ) ]; - if( xValues.faceSet[fIdx] ) - { - const FaceEdges& fe = xValues.faceEdges[ fIdx ]; - for( int j=0 ; j >::const_iterator iter = xValues.faceEdgeMap.find( key ); - if( iter!=xValues.faceEdgeMap.end() ) - { - const std::vector< IsoEdge >& _edges = iter->second; - for( size_t j=0 ; j<_edges.size() ; j++ ) edges.push_back( IsoEdge( _edges[j][flip] , _edges[j][1-flip] ) ); - } - else fprintf( stderr , "[ERROR] Invalid faces: %d %d %d\n" , i , d , o ) , exit( 0 ); - } - } - } - // Get the edge loops - std::vector< std::vector< long long > > loops; - while( edges.size() ) - { - loops.resize( loops.size()+1 ); - IsoEdge edge = edges.back(); - edges.pop_back(); - long long start = edge[0] , current = edge[1]; - while( current!=start ) - { - int idx; - for( idx=0 ; idx<(int)edges.size() ; idx++ ) if( edges[idx][0]==current ) break; - if( idx==edges.size() ) - { - typename hash_map< long long , long long >::const_iterator iter; - if ( (iter=bValues.vertexPairMap.find(current))!=bValues.vertexPairMap.end() ) loops.back().push_back( current ) , current = iter->second; - else if( (iter=fValues.vertexPairMap.find(current))!=fValues.vertexPairMap.end() ) loops.back().push_back( current ) , current = iter->second; - else if( (iter=xValues.vertexPairMap.find(current))!=xValues.vertexPairMap.end() ) loops.back().push_back( current ) , current = iter->second; - else - { - int d , off[3]; - leaf->depthAndOffset( d , off ); - fprintf( stderr , "[ERROR] Failed to close loop [%d: %d %d %d] | (%d): %lld\n" , d-1 , off[0] , off[1] , off[2] , i , current ); - exit( 0 ); - } - } - else - { - loops.back().push_back( current ); - current = edges[idx][1]; - edges[idx] = edges.back() , edges.pop_back(); - } - } - loops.back().push_back( start ); - } - // Add the loops to the mesh - for( size_t j=0 ; j > polygon( loops[j].size() ); - for( size_t k=0 ; k >::const_iterator iter; - if ( ( iter=bValues.edgeVertexMap.find( key ) )!=bValues.edgeVertexMap.end() ) polygon[k] = iter->second; - else if( ( iter=fValues.edgeVertexMap.find( key ) )!=fValues.edgeVertexMap.end() ) polygon[k] = iter->second; - else if( ( iter=xValues.edgeVertexMap.find( key ) )!=xValues.edgeVertexMap.end() ) polygon[k] = iter->second; - else fprintf( stderr , "[ERROR] Couldn't find vertex in edge map\n" ) , exit( 0 ); - } - AddIsoPolygons( mesh , polygon , polygonMesh , addBarycenter , vOffset ); - } - } - } - } -} -template< class Real > void SetColor( Point3D< Real >& color , unsigned char c[3] ){ for( int i=0 ; i<3 ; i++ ) c[i] = (unsigned char)std::max< int >( 0 , std::min< int >( 255 , (int)( color[i]+0.5 ) ) ); } - -template< class Real > void SetIsoVertex( PlyVertex< float >& vertex , Point3D< Real > color , Real value ){ ; } -template< class Real > void SetIsoVertex( PlyColorVertex< float >& vertex , Point3D< Real > color , Real value ){ SetColor( color , vertex.color ); } -template< class Real > void SetIsoVertex( PlyValueVertex< float >& vertex , Point3D< Real > color , Real value ){ vertex.value = float(value); } -template< class Real > void SetIsoVertex( PlyColorAndValueVertex< float >& vertex , Point3D< Real > color , Real value ){ SetColor( color , vertex.color ) , vertex.value = float(value); } -template< class Real > void SetIsoVertex( PlyVertex< double >& vertex , Point3D< Real > color , Real value ){ ; } -template< class Real > void SetIsoVertex( PlyColorVertex< double >& vertex , Point3D< Real > color , Real value ){ SetColor( color , vertex.color ); } -template< class Real > void SetIsoVertex( PlyValueVertex< double >& vertex , Point3D< Real > color , Real value ){ vertex.value = double(value); } -template< class Real > void SetIsoVertex( PlyColorAndValueVertex< double >& vertex , Point3D< Real > color , Real value ){ SetColor( color , vertex.color ) , vertex.value = double(value); } - -template< class Real > -template< int WeightDegree , int ColorDegree , class Vertex > -bool Octree< Real >::GetIsoVertex( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , ConstPointSupportKey< WeightDegree >& weightKey , ConstPointSupportKey< ColorDegree >& colorKey , const TreeOctNode* node , int edgeIndex , int z , const SliceValues< Vertex >& sValues , Vertex& vertex ) -{ - Point3D< Real > position; - int c0 , c1; - Square::EdgeCorners( edgeIndex , c0 , c1 ); - - bool nonLinearFit = sValues.cornerGradients!=NullPointer( Point3D< Real > ); - const typename SortedTreeNodes::SquareCornerIndices& idx = sValues.sliceData.cornerIndices( node ); - Real x0 = sValues.cornerValues[idx[c0]] , x1 = sValues.cornerValues[idx[c1]]; - Point3D< Real > s; - Real start , width; - _StartAndWidth( node , s , width ); - int o , y; - Square::FactorEdgeIndex( edgeIndex , o , y ); - start = s[o]; - switch( o ) - { - case 0: - position[1] = s[1] + width*y; - position[2] = s[2] + width*z; - break; - case 1: - position[0] = s[0] + width*y; - position[2] = s[2] + width*z; - break; - } - - double averageRoot; - if( nonLinearFit ) - { - double dx0 = sValues.cornerGradients[idx[c0]][o] * width , dx1 = sValues.cornerGradients[idx[c1]][o] * width; - - // The scaling will turn the Hermite Spline into a quadratic - double scl = (x1-x0) / ( (dx1+dx0 ) / 2 ); - dx0 *= scl , dx1 *= scl; - - // Hermite Spline - Polynomial< 2 > P; - P.coefficients[0] = x0; - P.coefficients[1] = dx0; - P.coefficients[2] = 3*(x1-x0)-dx1-2*dx0; - - double roots[2]; - int rCount = 0 , rootCount = P.getSolutions( isoValue , roots , EPSILON ); - averageRoot = 0; - for( int i=0 ; i=0 && roots[i]<=1 ) averageRoot += roots[i] , rCount++; - averageRoot /= rCount; - } - else - { - // We have a linear function L, with L(0) = x0 and L(1) = x1 - // => L(t) = x0 + t * (x1-x0) - // => L(t) = isoValue <=> t = ( isoValue - x0 ) / ( x1 - x0 ) - if( x0==x1 ) fprintf( stderr , "[ERROR] Not a zero-crossing root: %g %g\n" , x0 , x1 ) , exit( 0 ); - averageRoot = ( isoValue - x0 ) / ( x1 - x0 ); - } - if( averageRoot<0 || averageRoot>1 ) - { - fprintf( stderr , "[WARNING] Bad average root: %f\n" , averageRoot ); - fprintf( stderr , "\t(%f %f) (%f)\n" , x0 , x1 , isoValue ); - if( averageRoot<0 ) averageRoot = 0; - if( averageRoot>1 ) averageRoot = 1; - } - position[o] = Real( start + width*averageRoot ); - vertex.point = position; - Point3D< Real > color; - Real depth(0); - if( densityWeights ) - { - Real weight; - const TreeOctNode* temp = node; - while( _Depth( temp )>_splatDepth ) temp=temp->parent; - _GetSampleDepthAndWeight( *densityWeights , temp , position , weightKey , depth , weight ); - } - if( colorData ) color = Point3D< Real >( _Evaluate( *colorData , position , *colorBSData , colorKey ) ); - SetIsoVertex( vertex , color , depth ); - return true; -} -template< class Real > -template< int WeightDegree , int ColorDegree , class Vertex > -bool Octree< Real >::GetIsoVertex( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , ConstPointSupportKey< WeightDegree >& weightKey , ConstPointSupportKey< ColorDegree >& colorKey , const TreeOctNode* node , int cornerIndex , const SliceValues< Vertex >& bValues , const SliceValues< Vertex >& fValues , Vertex& vertex ) -{ - Point3D< Real > position; - - bool nonLinearFit = bValues.cornerGradients!=NullPointer( Point3D< Real > ) && fValues.cornerGradients!=NullPointer( Point3D< Real > ); - const typename SortedTreeNodes::SquareCornerIndices& idx0 = bValues.sliceData.cornerIndices( node ); - const typename SortedTreeNodes::SquareCornerIndices& idx1 = fValues.sliceData.cornerIndices( node ); - Real x0 = bValues.cornerValues[ idx0[cornerIndex] ] , x1 = fValues.cornerValues[ idx1[cornerIndex] ]; - Point3D< Real > s; - Real start , width; - _StartAndWidth( node , s , width ); - start = s[2]; - int x , y; - Square::FactorCornerIndex( cornerIndex , x , y ); - - - position[0] = s[0] + width*x; - position[1] = s[1] + width*y; - - double averageRoot; - - if( nonLinearFit ) - { - double dx0 = bValues.cornerGradients[ idx0[cornerIndex] ][2] * width , dx1 = fValues.cornerGradients[ idx1[cornerIndex] ][2] * width; - // The scaling will turn the Hermite Spline into a quadratic - double scl = (x1-x0) / ( (dx1+dx0 ) / 2 ); - dx0 *= scl , dx1 *= scl; - - // Hermite Spline - Polynomial< 2 > P; - P.coefficients[0] = x0; - P.coefficients[1] = dx0; - P.coefficients[2] = 3*(x1-x0)-dx1-2*dx0; - - double roots[2]; - int rCount = 0 , rootCount = P.getSolutions( isoValue , roots , EPSILON ); - averageRoot = 0; - for( int i=0 ; i=0 && roots[i]<=1 ) averageRoot += roots[i] , rCount++; - averageRoot /= rCount; - } - else - { - // We have a linear function L, with L(0) = x0 and L(1) = x1 - // => L(t) = x0 + t * (x1-x0) - // => L(t) = isoValue <=> t = ( isoValue - x0 ) / ( x1 - x0 ) - if( x0==x1 ) fprintf( stderr , "[ERROR] Not a zero-crossing root: %g %g\n" , x0 , x1 ) , exit( 0 ); - averageRoot = ( isoValue - x0 ) / ( x1 - x0 ); - } - if( averageRoot<0 || averageRoot>1 ) - { - fprintf( stderr , "[WARNING] Bad average root: %f\n" , averageRoot ); - fprintf( stderr , "\t(%f %f) (%f)\n" , x0 , x1 , isoValue ); - if( averageRoot<0 ) averageRoot = 0; - if( averageRoot>1 ) averageRoot = 1; - } - position[2] = Real( start + width*averageRoot ); - vertex.point = position; - Point3D< Real > color; - Real depth(0); - if( densityWeights ) - { - Real weight; - const TreeOctNode* temp = node; - while( _Depth( temp )>_splatDepth ) temp=temp->parent; - _GetSampleDepthAndWeight( *densityWeights , temp , position , weightKey , depth , weight ); - } - if( colorData ) color = Point3D< Real >( _Evaluate( *colorData , position , *colorBSData , colorKey ) ); - SetIsoVertex( vertex , color , depth ); - return true; -} - -template< class Real > -template< class Vertex > -int Octree< Real >::AddIsoPolygons( CoredMeshData< Vertex >& mesh , std::vector< std::pair< int , Vertex > >& polygon , bool polygonMesh , bool addBarycenter , int& vOffset ) -{ - if( polygonMesh ) - { - std::vector< int > vertices( polygon.size() ); - for( int i=0 ; i<(int)polygon.size() ; i++ ) vertices[i] = polygon[polygon.size()-1-i].first; - mesh.addPolygon_s( vertices ); - return 1; - } - if( polygon.size()>3 ) - { - bool isCoplanar = false; - std::vector< int > triangle( 3 ); - - if( addBarycenter ) - for( int i=0 ; i<(int)polygon.size() ; i++ ) - for( int j=0 ; j MAT; - std::vector< Point3D< Real > > vertices; - std::vector< TriangleIndex > triangles; - vertices.resize( polygon.size() ); - // Add the points - for( int i=0 ; i<(int)polygon.size() ; i++ ) vertices[i] = polygon[i].second.point; - MAT.GetTriangulation( vertices , triangles ); - for( int i=0 ; i<(int)triangles.size() ; i++ ) - { - for( int j=0 ; j<3 ; j++ ) triangle[2-j] = polygon[ triangles[i].idx[j] ].first; - mesh.addPolygon_s( triangle ); - } - } - } - else if( polygon.size()==3 ) - { - std::vector< int > vertices( 3 ); - for( int i=0 ; i<3 ; i++ ) vertices[2-i] = polygon[i].first; - mesh.addPolygon_s( vertices ); - } - return (int)polygon.size()-2; -} +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ + +#include "Octree.h" +#include "MyTime.h" +#include "MemoryUsage.h" +#include "MAT.h" + +#include +#include + +template< class Real > +template< class Vertex > +Octree< Real >::SliceValues< Vertex >::SliceValues( void ) +{ + _oldCCount = _oldECount = _oldFCount = _oldNCount = 0; + cornerValues = NullPointer( Real ) ; cornerGradients = NullPointer( Point3D< Real > ) ; cornerSet = NullPointer( char ); + edgeKeys = NullPointer( long long ) ; edgeSet = NullPointer( char ); + faceEdges = NullPointer( FaceEdges ) ; faceSet = NullPointer( char ); + mcIndices = NullPointer( char ); +} +template< class Real > +template< class Vertex > +Octree< Real >::SliceValues< Vertex >::~SliceValues( void ) +{ + _oldCCount = _oldECount = _oldFCount = _oldNCount = 0; + FreePointer( cornerValues ) ; FreePointer( cornerGradients ) ; FreePointer( cornerSet ); + FreePointer( edgeKeys ) ; FreePointer( edgeSet ); + FreePointer( faceEdges ) ; FreePointer( faceSet ); + FreePointer( mcIndices ); +} +template< class Real > +template< class Vertex > +void Octree< Real >::SliceValues< Vertex >::reset( bool nonLinearFit ) +{ + faceEdgeMap.clear() , edgeVertexMap.clear() , vertexPairMap.clear(); + + if( _oldNCount0 ) mcIndices = AllocPointer< char >( _oldNCount ); + } + if( _oldCCount0 ) + { + cornerValues = AllocPointer< Real >( _oldCCount ); + if( nonLinearFit ) cornerGradients = AllocPointer< Point3D< Real > >( _oldCCount ); + cornerSet = AllocPointer< char >( _oldCCount ); + } + } + if( _oldECount( _oldECount ); + edgeSet = AllocPointer< char >( _oldECount ); + } + if( _oldFCount( _oldFCount ); + faceSet = AllocPointer< char >( _oldFCount ); + } + + if( sliceData.cCount>0 ) memset( cornerSet , 0 , sizeof( char ) * sliceData.cCount ); + if( sliceData.eCount>0 ) memset( edgeSet , 0 , sizeof( char ) * sliceData.eCount ); + if( sliceData.fCount>0 ) memset( faceSet , 0 , sizeof( char ) * sliceData.fCount ); +} +template< class Real > +template< class Vertex > +Octree< Real >::XSliceValues< Vertex >::XSliceValues( void ) +{ + _oldECount = _oldFCount = 0; + edgeKeys = NullPointer( long long ) ; edgeSet = NullPointer( char ); + faceEdges = NullPointer( FaceEdges ) ; faceSet = NullPointer( char ); +} +template< class Real > +template< class Vertex > +Octree< Real >::XSliceValues< Vertex >::~XSliceValues( void ) +{ + _oldECount = _oldFCount = 0; + FreePointer( edgeKeys ) ; FreePointer( edgeSet ); + FreePointer( faceEdges ) ; FreePointer( faceSet ); +} +template< class Real > +template< class Vertex > +void Octree< Real >::XSliceValues< Vertex >::reset( void ) +{ + faceEdgeMap.clear() , edgeVertexMap.clear() , vertexPairMap.clear(); + + if( _oldECount( _oldECount ); + edgeSet = AllocPointer< char >( _oldECount ); + } + if( _oldFCount( _oldFCount ); + faceSet = AllocPointer< char >( _oldFCount ); + } + if( xSliceData.eCount>0 ) memset( edgeSet , 0 , sizeof( char ) * xSliceData.eCount ); + if( xSliceData.fCount>0 ) memset( faceSet , 0 , sizeof( char ) * xSliceData.fCount ); +} + +template< class Real > +template< int FEMDegree , int WeightDegree , int ColorDegree , class Vertex > +void Octree< Real >::GetMCIsoSurface( const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , const DenseNodeData< Real , FEMDegree >& solution , Real isoValue , CoredMeshData< Vertex >& mesh , bool nonLinearFit , bool addBarycenter , bool polygonMesh ) +{ + int maxDepth = _tree.maxDepth(); + if( FEMDegree==1 && nonLinearFit ) fprintf( stderr , "[WARNING] First order B-Splines do not support non-linear interpolation\n" ) , nonLinearFit = false; + + BSplineData< ColorDegree >* colorBSData = NULL; + if( colorData ) + { + colorBSData = new BSplineData< ColorDegree >(); + colorBSData->set( maxDepth , _dirichlet ); + } + + DenseNodeData< Real , FEMDegree > coarseSolution( _sNodes.end( maxDepth-1 ) ); + memset( coarseSolution.data , 0 , sizeof(Real)*_sNodes.end( maxDepth-1 ) ); +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=_sNodes.begin(_minDepth) ; i<_sNodes.end(maxDepth-1) ; i++ ) coarseSolution[i] = solution[i]; + for( int d=_minDepth+1 ; d > evaluators( maxDepth+1 ); + for( int d=_minDepth ; d<=maxDepth ; d++ ) evaluators[d].set( d-1 , _dirichlet ); + int vertexOffset = 0; + std::vector< SlabValues< Vertex > > slabValues( maxDepth+1 ); + + // Initialize the back slice + for( int d=maxDepth ; d>=_minDepth ; d-- ) + { + _sNodes.setSliceTableData ( slabValues[d]. sliceValues(0). sliceData , d , 0 , threads ); + _sNodes.setSliceTableData ( slabValues[d]. sliceValues(1). sliceData , d , 1 , threads ); + _sNodes.setXSliceTableData( slabValues[d].xSliceValues(0).xSliceData , d , 0 , threads ); + slabValues[d].sliceValues (0).reset( nonLinearFit ); + slabValues[d].sliceValues (1).reset( nonLinearFit ); + slabValues[d].xSliceValues(0).reset( ); + } + for( int d=maxDepth ; d>=_minDepth ; d-- ) + { + // Copy edges from finer + if( d( colorBSData , densityWeights , colorData , isoValue , d , 0 , vertexOffset , mesh , slabValues , threads ); + SetSliceIsoEdges( d , 0 , slabValues , threads ); + } + + // Iterate over the slices at the finest level + for( int slice=0 ; slice<( 1<<(maxDepth-1) ) ; slice++ ) + { + // Process at all depths that that contain this slice + for( int d=maxDepth , o=slice+1 ; d>=_minDepth ; d-- , o>>=1 ) + { + // Copy edges from finer (required to ensure we correctly track edge cancellations) + if( d( colorBSData , densityWeights , colorData , isoValue , d , o , vertexOffset , mesh , slabValues , threads ); + SetSliceIsoEdges( d , o , slabValues , threads ); + + // Set the cross-slice edges + SetXSliceIsoVertices< WeightDegree , ColorDegree, Vertex >( colorBSData , densityWeights , colorData , isoValue , d , o-1 , vertexOffset , mesh , slabValues , threads ); + SetXSliceIsoEdges( d , o-1 , slabValues , threads ); + + // Add the triangles + SetIsoSurface( d , o-1 , slabValues[d].sliceValues(o-1) , slabValues[d].sliceValues(o) , slabValues[d].xSliceValues(o-1) , mesh , polygonMesh , addBarycenter , vertexOffset , threads ); + + if( o&1 ) break; + } + + for( int d=maxDepth , o=slice+1 ; d>=_minDepth ; d-- , o>>=1 ) + { + // Initialize for the next pass + if( o<(1< +template< int FEMDegree , int NormalDegree > +Real Octree< Real >::GetIsoValue( const DenseNodeData< Real , FEMDegree >& solution , const SparseNodeData< Real , NormalDegree >& nodeWeights ) +{ + Real isoValue=0 , weightSum=0; + int maxDepth = _tree.maxDepth(); + + Pointer( Real ) nodeValues = AllocPointer< Real >( _sNodes.end(maxDepth) ); + memset( nodeValues , 0 , sizeof(Real) * _sNodes.end(maxDepth) ); + DenseNodeData< Real , FEMDegree > metSolution( _sNodes.end( maxDepth-1 ) ); + memset( metSolution.data , 0 , sizeof(Real)*_sNodes.end( maxDepth-1 ) ); +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=_sNodes.begin(_minDepth) ; i<_sNodes.end(maxDepth-1) ; i++ ) metSolution[i] = solution[i]; + for( int d=_minDepth+1 ; d=_minDepth ; d-- ) + { + _Evaluator< FEMDegree > evaluator; + evaluator.set( d-1 , _dirichlet ); + std::vector< ConstPointSupportKey< FEMDegree > > neighborKeys( std::max< int >( 1 , threads ) ); + for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) + { + ConstPointSupportKey< FEMDegree >& neighborKey = neighborKeys[ omp_get_thread_num() ]; + TreeOctNode* node = _sNodes.treeNodes[i]; + Real value = Real(0); + if( node->children ) + { + if( NormalDegree&1 ) value = nodeValues[ node->children->nodeData.nodeIndex ]; + else for( int c=0 ; cchildren[c].nodeData.nodeIndex ] / Cube::CORNERS; + } + else if( nodeWeights.index( _sNodes.treeNodes[i] )>=0 ) + { + neighborKey.getNeighbors( node ); + int c=0 , x , y , z; + if( node->parent ) c = int( node - node->parent->children ); + Cube::FactorCornerIndex( c , x , y , z ); + + // Since evaluation requires parent indices, we need to check that the node's parent is interiorly supported + bool isInterior = _IsInteriorlySupported< FEMDegree >( node->parent ); + + if( NormalDegree&1 ) value = _getCornerValue( neighborKey , node , 0 , solution , metSolution , evaluator , isInterior ); + else value = _getCenterValue( neighborKey , node , solution , metSolution , evaluator , isInterior ); + } + nodeValues[i] = value; + int idx = nodeWeights.index( _sNodes.treeNodes[i] ); + if( idx!=-1 ) + { + Real w = nodeWeights.data[ idx ]; + if( w!=0 ) isoValue += value * w , weightSum += w; + } + } + } + metSolution.resize( 0 ); + FreePointer( nodeValues ); + + return isoValue / weightSum; +} + +template< class Real > +template< class Vertex , int FEMDegree > +void Octree< Real >::SetSliceIsoCorners( const DenseNodeData< Real , FEMDegree >& solution , const DenseNodeData< Real , FEMDegree >& coarseSolution , Real isoValue , int depth , int slice , std::vector< SlabValues< Vertex > >& slabValues , const _Evaluator< FEMDegree >& evaluator , int threads ) +{ + if( slice>0 ) SetSliceIsoCorners( solution , coarseSolution , isoValue , depth , slice , 1 , slabValues , evaluator , threads ); + if( slice<(1< +template< class Vertex , int FEMDegree > +void Octree< Real >::SetSliceIsoCorners( const DenseNodeData< Real , FEMDegree >& solution , const DenseNodeData< Real , FEMDegree >& coarseSolution , Real isoValue , int depth , int slice , int z , std::vector< SlabValues< Vertex > >& slabValues , const struct _Evaluator< FEMDegree >& evaluator , int threads ) +{ + typename Octree::template SliceValues< Vertex >& sValues = slabValues[depth].sliceValues( slice ); + std::vector< ConstPointSupportKey< FEMDegree > > neighborKeys( std::max< int >( 1 , threads ) ); + for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) + { + Real squareValues[ Square::CORNERS ]; + ConstPointSupportKey< FEMDegree >& neighborKey = neighborKeys[ omp_get_thread_num() ]; + TreeOctNode* leaf = _sNodes.treeNodes[i]; + if( !leaf->children ) + { + const typename SortedTreeNodes::SquareCornerIndices& cIndices = sValues.sliceData.cornerIndices( leaf ); + + bool isInterior = _IsInteriorlySupported< FEMDegree >( leaf->parent ); + neighborKey.getNeighbors( leaf ); + + for( int x=0 ; x<2 ; x++ ) for( int y=0 ; y<2 ; y++ ) + { + int cc = Cube::CornerIndex( x , y , z ); + int fc = Square::CornerIndex( x , y ); + int vIndex = cIndices[fc]; + if( !sValues.cornerSet[vIndex] ) + { + if( sValues.cornerGradients ) + { + std::pair< Real , Point3D< Real > > p = _getCornerValueAndGradient( neighborKey , leaf , cc , solution , coarseSolution , evaluator , isInterior ); + sValues.cornerValues[vIndex] = p.first , sValues.cornerGradients[vIndex] = p.second; + } + else sValues.cornerValues[vIndex] = _getCornerValue( neighborKey , leaf , cc , solution , coarseSolution , evaluator , isInterior ); + sValues.cornerSet[vIndex] = 1; + } + squareValues[fc] = sValues.cornerValues[ vIndex ]; + TreeOctNode* node = leaf; + int _depth = depth , _slice = slice; + while( _IsValidNode< 0 >( node->parent ) && (node-node->parent->children)==cc ) + { + node = node->parent , _depth-- , _slice >>= 1; + typename Octree::template SliceValues< Vertex >& _sValues = slabValues[_depth].sliceValues( _slice ); + const typename SortedTreeNodes::SquareCornerIndices& _cIndices = _sValues.sliceData.cornerIndices( node ); + int _vIndex = _cIndices[fc]; + _sValues.cornerValues[_vIndex] = sValues.cornerValues[vIndex]; + if( _sValues.cornerGradients ) _sValues.cornerGradients[_vIndex] = sValues.cornerGradients[vIndex]; + _sValues.cornerSet[_vIndex] = 1; + } + } + sValues.mcIndices[ i - sValues.sliceData.nodeOffset ] = MarchingSquares::GetIndex( squareValues , isoValue ); + } + } +} + +template< class Real > +template< int WeightDegree , int ColorDegree , class Vertex > +void Octree< Real >::SetSliceIsoVertices( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , int depth , int slice , int& vOffset , CoredMeshData< Vertex >& mesh , std::vector< SlabValues< Vertex > >& slabValues , int threads ) +{ + if( slice>0 ) SetSliceIsoVertices< WeightDegree , ColorDegree, Vertex >( colorBSData , densityWeights , colorData , isoValue , depth , slice , 1 , vOffset , mesh , slabValues , threads ); + if( slice<(1<( colorBSData , densityWeights , colorData , isoValue , depth , slice , 0 , vOffset , mesh , slabValues , threads ); +} +template< class Real > +template< int WeightDegree , int ColorDegree , class Vertex > +void Octree< Real >::SetSliceIsoVertices( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , int depth , int slice , int z , int& vOffset , CoredMeshData< Vertex >& mesh , std::vector< SlabValues< Vertex > >& slabValues , int threads ) +{ + typename Octree::template SliceValues< Vertex >& sValues = slabValues[depth].sliceValues( slice ); + // [WARNING] In the case Degree=2, these two keys are the same, so we don't have to maintain them separately. + std::vector< ConstAdjacenctNodeKey > neighborKeys( std::max< int >( 1 , threads ) ); + std::vector< ConstPointSupportKey< WeightDegree > > weightKeys( std::max< int >( 1 , threads ) ); + std::vector< ConstPointSupportKey< ColorDegree > > colorKeys( std::max< int >( 1 , threads ) ); + for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) + { + ConstAdjacenctNodeKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; + ConstPointSupportKey< WeightDegree >& weightKey = weightKeys[ omp_get_thread_num() ]; + ConstPointSupportKey< ColorDegree >& colorKey = colorKeys[ omp_get_thread_num() ]; + TreeOctNode* leaf = _sNodes.treeNodes[i]; + if( !leaf->children ) + { + int idx = i - sValues.sliceData.nodeOffset; + const typename SortedTreeNodes::SquareEdgeIndices& eIndices = sValues.sliceData.edgeIndices( leaf ); + if( MarchingSquares::HasRoots( sValues.mcIndices[idx] ) ) + { + neighborKey.getNeighbors( leaf ); + if( densityWeights ) weightKey.getNeighbors( leaf ); + if( colorData ) colorKey.getNeighbors( leaf ); + for( int e=0 ; e hashed_vertex; +#pragma omp critical (add_point_access) + { + if( !sValues.edgeSet[vIndex] ) + { + mesh.addOutOfCorePoint( vertex ); + sValues.edgeSet[ vIndex ] = 1; + sValues.edgeKeys[ vIndex ] = key; + sValues.edgeVertexMap[key] = hashed_vertex = std::pair< int , Vertex >( vOffset , vertex ); + vOffset++; + stillOwner = true; + } + } + if( stillOwner ) + { + // We only need to pass the iso-vertex down if the edge it lies on is adjacent to a coarser leaf + bool isNeeded; + switch( o ) + { + case 0: isNeeded = ( !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[1][2*y][1] ) || !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[1][2*y][2*z] ) || !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[1][1][2*z] ) ) ; break; + case 1: isNeeded = ( !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[2*y][1][1] ) || !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[2*y][1][2*z] ) || !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[1][1][2*z] ) ) ; break; + } + if( isNeeded ) + { + int f[2]; + Cube::FacesAdjacentToEdge( Cube::EdgeIndex( o , y , z ) , f[0] , f[1] ); + for( int k=0 ; k<2 ; k++ ) + { + TreeOctNode* node = leaf; + int _depth = depth , _slice = slice; + bool _isNeeded = isNeeded; + while( _isNeeded && node->parent && Cube::IsFaceCorner( (int)(node-node->parent->children) , f[k] ) ) + { + node = node->parent , _depth-- , _slice >>= 1; + typename Octree::template SliceValues< Vertex >& _sValues = slabValues[_depth].sliceValues( _slice ); +#pragma omp critical (add_coarser_point_access) + _sValues.edgeVertexMap[key] = hashed_vertex; + switch( o ) + { + case 0: _isNeeded = ( !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[1][2*y][1] ) || !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[1][2*y][2*z] ) || !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[1][1][2*z] ) ) ; break; + case 1: _isNeeded = ( !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[2*y][1][1] ) || !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[2*y][1][2*z] ) || !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[1][1][2*z] ) ) ; break; + } + } + } + } + } + } + } + } + } + } +} +template< class Real > +template< int WeightDegree , int ColorDegree , class Vertex > +void Octree< Real >::SetXSliceIsoVertices( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , int depth , int slab , int& vOffset , CoredMeshData< Vertex >& mesh , std::vector< SlabValues< Vertex > >& slabValues , int threads ) +{ + typename Octree::template SliceValues< Vertex >& bValues = slabValues[depth].sliceValues ( slab ); + typename Octree::template SliceValues< Vertex >& fValues = slabValues[depth].sliceValues ( slab+1 ); + typename Octree::template XSliceValues< Vertex >& xValues = slabValues[depth].xSliceValues( slab ); + + // [WARNING] In the case Degree=2, these two keys are the same, so we don't have to maintain them separately. + std::vector< ConstAdjacenctNodeKey > neighborKeys( std::max< int >( 1 , threads ) ); + std::vector< ConstPointSupportKey< WeightDegree > > weightKeys( std::max< int >( 1 , threads ) ); + std::vector< ConstPointSupportKey< ColorDegree > > colorKeys( std::max< int >( 1 , threads ) ); + for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) + { + ConstAdjacenctNodeKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; + ConstPointSupportKey< WeightDegree >& weightKey = weightKeys[ omp_get_thread_num() ]; + ConstPointSupportKey< ColorDegree >& colorKey = colorKeys[ omp_get_thread_num() ]; + TreeOctNode* leaf = _sNodes.treeNodes[i]; + if( !leaf->children ) + { + unsigned char mcIndex = ( bValues.mcIndices[ i - bValues.sliceData.nodeOffset ] ) | ( fValues.mcIndices[ i - fValues.sliceData.nodeOffset ] )<<4; + const typename SortedTreeNodes::SquareCornerIndices& eIndices = xValues.xSliceData.edgeIndices( leaf ); + if( MarchingCubes::HasRoots( mcIndex ) ) + { + neighborKey.getNeighbors( leaf ); + if( densityWeights ) weightKey.getNeighbors( leaf ); + if( colorData ) colorKey.getNeighbors( leaf ); + for( int x=0 ; x<2 ; x++ ) for( int y=0 ; y<2 ; y++ ) + { + int c = Square::CornerIndex( x , y ); + int e = Cube::EdgeIndex( 2 , x , y ); + if( MarchingCubes::HasEdgeRoots( mcIndex , e ) ) + { + int vIndex = eIndices[c]; + if( !xValues.edgeSet[vIndex] ) + { + Vertex vertex; + long long key = VertexData::EdgeIndex( leaf , e , _sNodes.levels() ); + GetIsoVertex( colorBSData , densityWeights , colorData , isoValue , weightKey , colorKey , leaf , c , bValues , fValues , vertex ); + vertex.point = vertex.point * _scale + _center; + bool stillOwner = false; + std::pair< int , Vertex > hashed_vertex; +#pragma omp critical (add_x_point_access) + { + if( !xValues.edgeSet[vIndex] ) + { + mesh.addOutOfCorePoint( vertex ); + xValues.edgeSet[ vIndex ] = 1; + xValues.edgeKeys[ vIndex ] = key; + xValues.edgeVertexMap[key] = hashed_vertex = std::pair< int , Vertex >( vOffset , vertex ); + stillOwner = true; + vOffset++; + } + } + if( stillOwner ) + { + // We only need to pass the iso-vertex down if the edge it lies on is adjacent to a coarser leaf + bool isNeeded = ( !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[2*x][1][1] ) || !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[2*x][2*y][1] ) || !_IsValidNode< 0 >( neighborKey.neighbors[depth].neighbors[1][2*y][1] ) ); + if( isNeeded ) + { + int f[2]; + Cube::FacesAdjacentToEdge( e , f[0] , f[1] ); + for( int k=0 ; k<2 ; k++ ) + { + TreeOctNode* node = leaf; + int _depth = depth , _slab = slab; + bool _isNeeded = isNeeded; + while( _isNeeded && node->parent && Cube::IsFaceCorner( (int)(node-node->parent->children) , f[k] ) ) + { + node = node->parent , _depth-- , _slab >>= 1; + typename Octree::template XSliceValues< Vertex >& _xValues = slabValues[_depth].xSliceValues( _slab ); +#pragma omp critical (add_x_coarser_point_access) + _xValues.edgeVertexMap[key] = hashed_vertex; + _isNeeded = ( !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[2*x][1][1] ) || !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[2*x][2*y][1] ) || !_IsValidNode< 0 >( neighborKey.neighbors[_depth].neighbors[1][2*y][1] ) ); + } + } + } + } + } + } + } + } + } + } +} +template< class Real > +template< class Vertex > +void Octree< Real >::CopyFinerSliceIsoEdgeKeys( int depth , int slice , std::vector< SlabValues< Vertex > >& slabValues , int threads ) +{ + if( slice>0 ) CopyFinerSliceIsoEdgeKeys( depth , slice , 1 , slabValues , threads ); + if( slice<(1< +template< class Vertex > +void Octree< Real >::CopyFinerSliceIsoEdgeKeys( int depth , int slice , int z , std::vector< SlabValues< Vertex > >& slabValues , int threads ) +{ + SliceValues< Vertex >& pSliceValues = slabValues[depth ].sliceValues(slice ); + SliceValues< Vertex >& cSliceValues = slabValues[depth+1].sliceValues(slice<<1); + typename SortedTreeNodes::SliceTableData& pSliceData = pSliceValues.sliceData; + typename SortedTreeNodes::SliceTableData& cSliceData = cSliceValues.sliceData; +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=_sNodes.begin(depth,slice-z) ; i<_sNodes.end(depth,slice-z) ; i++ ) if( _IsValidNode< 0 >( _sNodes.treeNodes[i] ) ) + if( _sNodes.treeNodes[i]->children ) + { + typename SortedTreeNodes::SquareEdgeIndices& pIndices = pSliceData.edgeIndices( i ); + // Copy the edges that overlap the coarser edges + for( int orientation=0 ; orientation<2 ; orientation++ ) for( int y=0 ; y<2 ; y++ ) + { + int fe = Square::EdgeIndex( orientation , y ); + int pIndex = pIndices[fe]; + if( !pSliceValues.edgeSet[ pIndex ] ) + { + int ce = Cube::EdgeIndex( orientation , y , z ); + int c1 , c2; + switch( orientation ) + { + case 0: c1 = Cube::CornerIndex( 0 , y , z ) , c2 = Cube::CornerIndex( 1 , y , z ) ; break; + case 1: c1 = Cube::CornerIndex( y , 0 , z ) , c2 = Cube::CornerIndex( y , 1 , z ) ; break; + } + // [SANITY CHECK] +// if( _IsValidNode< 0 >( _sNodes.treeNodes[i]->children + c1 )!=_IsValidNode< 0 >( _sNodes.treeNodes[i]->children + c2 ) ) fprintf( stderr , "[WARNING] Finer edges should both be valid or invalid\n" ) , exit( 0 ); + if( !_IsValidNode< 0 >( _sNodes.treeNodes[i]->children + c1 ) || !_IsValidNode< 0 >( _sNodes.treeNodes[i]->children + c2 ) ) continue; + + int cIndex1 = cSliceData.edgeIndices( _sNodes.treeNodes[i]->children + c1 )[fe]; + int cIndex2 = cSliceData.edgeIndices( _sNodes.treeNodes[i]->children + c2 )[fe]; + if( cSliceValues.edgeSet[cIndex1] != cSliceValues.edgeSet[cIndex2] ) + { + long long key; + if( cSliceValues.edgeSet[cIndex1] ) key = cSliceValues.edgeKeys[cIndex1]; + else key = cSliceValues.edgeKeys[cIndex2]; + std::pair< int , Vertex > vPair = cSliceValues.edgeVertexMap.find( key )->second; +#pragma omp critical ( copy_finer_edge_keys ) + pSliceValues.edgeVertexMap[key] = vPair; + pSliceValues.edgeKeys[pIndex] = key; + pSliceValues.edgeSet[pIndex] = 1; + } + else if( cSliceValues.edgeSet[cIndex1] && cSliceValues.edgeSet[cIndex2] ) + { + long long key1 = cSliceValues.edgeKeys[cIndex1] , key2 = cSliceValues.edgeKeys[cIndex2]; +#pragma omp critical ( set_edge_pairs ) + pSliceValues.vertexPairMap[ key1 ] = key2 , pSliceValues.vertexPairMap[ key2 ] = key1; + + const TreeOctNode* node = _sNodes.treeNodes[i]; + int _depth = depth , _slice = slice; + while( node->parent && Cube::IsEdgeCorner( (int)( node - node->parent->children ) , ce ) ) + { + node = node->parent , _depth-- , _slice >>= 1; + SliceValues< Vertex >& _pSliceValues = slabValues[_depth].sliceValues(_slice); +#pragma omp critical ( set_edge_pairs ) + _pSliceValues.vertexPairMap[ key1 ] = key2 , _pSliceValues.vertexPairMap[ key2 ] = key1; + } + } + } + } + } +} +template< class Real > +template< class Vertex > +void Octree< Real >::CopyFinerXSliceIsoEdgeKeys( int depth , int slab , std::vector< SlabValues< Vertex > >& slabValues , int threads ) +{ + XSliceValues< Vertex >& pSliceValues = slabValues[depth ].xSliceValues(slab); + XSliceValues< Vertex >& cSliceValues0 = slabValues[depth+1].xSliceValues( (slab<<1)|0 ); + XSliceValues< Vertex >& cSliceValues1 = slabValues[depth+1].xSliceValues( (slab<<1)|1 ); + typename SortedTreeNodes::XSliceTableData& pSliceData = pSliceValues.xSliceData; + typename SortedTreeNodes::XSliceTableData& cSliceData0 = cSliceValues0.xSliceData; + typename SortedTreeNodes::XSliceTableData& cSliceData1 = cSliceValues1.xSliceData; +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=_sNodes.begin(depth,slab) ; i<_sNodes.end(depth,slab) ; i++ ) if( _IsValidNode< 0 >( _sNodes.treeNodes[i] ) ) + if( _sNodes.treeNodes[i]->children ) + { + typename SortedTreeNodes::SquareCornerIndices& pIndices = pSliceData.edgeIndices( i ); + for( int x=0 ; x<2 ; x++ ) for( int y=0 ; y<2 ; y++ ) + { + int fc = Square::CornerIndex( x , y ); + int pIndex = pIndices[fc]; + if( !pSliceValues.edgeSet[pIndex] ) + { + int c0 = Cube::CornerIndex( x , y , 0 ) , c1 = Cube::CornerIndex( x , y , 1 ); + + // [SANITY CHECK] +// if( _IsValidNode< 0 >( _sNodes.treeNodes[i]->children + c0 )!=_IsValidNode< 0 >( _sNodes.treeNodes[i]->children + c1 ) ) fprintf( stderr , "[ERROR] Finer edges should both be valid or invalid\n" ) , exit( 0 ); + if( !_IsValidNode< 0 >( _sNodes.treeNodes[i]->children + c0 ) || !_IsValidNode< 0 >( _sNodes.treeNodes[i]->children + c1 ) ) continue; + + int cIndex0 = cSliceData0.edgeIndices( _sNodes.treeNodes[i]->children + c0 )[fc]; + int cIndex1 = cSliceData1.edgeIndices( _sNodes.treeNodes[i]->children + c1 )[fc]; + if( cSliceValues0.edgeSet[cIndex0] != cSliceValues1.edgeSet[cIndex1] ) + { + long long key; + std::pair< int , Vertex > vPair; + if( cSliceValues0.edgeSet[cIndex0] ) key = cSliceValues0.edgeKeys[cIndex0] , vPair = cSliceValues0.edgeVertexMap.find( key )->second; + else key = cSliceValues1.edgeKeys[cIndex1] , vPair = cSliceValues1.edgeVertexMap.find( key )->second; +#pragma omp critical ( copy_finer_x_edge_keys ) + pSliceValues.edgeVertexMap[key] = vPair; + pSliceValues.edgeKeys[ pIndex ] = key; + pSliceValues.edgeSet[ pIndex ] = 1; + } + else if( cSliceValues0.edgeSet[cIndex0] && cSliceValues1.edgeSet[cIndex1] ) + { + long long key0 = cSliceValues0.edgeKeys[cIndex0] , key1 = cSliceValues1.edgeKeys[cIndex1]; +#pragma omp critical ( set_x_edge_pairs ) + pSliceValues.vertexPairMap[ key0 ] = key1 , pSliceValues.vertexPairMap[ key1 ] = key0; + const TreeOctNode* node = _sNodes.treeNodes[i]; + int _depth = depth , _slab = slab , ce = Cube::CornerIndex( 2 , x , y ); + while( node->parent && Cube::IsEdgeCorner( (int)( node - node->parent->children ) , ce ) ) + { + node = node->parent , _depth-- , _slab>>= 1; + SliceValues< Vertex >& _pSliceValues = slabValues[_depth].sliceValues(_slab); +#pragma omp critical ( set_x_edge_pairs ) + _pSliceValues.vertexPairMap[ key0 ] = key1 , _pSliceValues.vertexPairMap[ key1 ] = key0; + } + } + } + } + } +} +template< class Real > +template< class Vertex > +void Octree< Real >::SetSliceIsoEdges( int depth , int slice , std::vector< SlabValues< Vertex > >& slabValues , int threads ) +{ + if( slice>0 ) SetSliceIsoEdges( depth , slice , 1 , slabValues , threads ); + if( slice<(1< +template< class Vertex > +void Octree< Real >::SetSliceIsoEdges( int depth , int slice , int z , std::vector< SlabValues< Vertex > >& slabValues , int threads ) +{ + typename Octree::template SliceValues< Vertex >& sValues = slabValues[depth].sliceValues( slice ); + std::vector< ConstAdjacenctNodeKey > neighborKeys( std::max< int >( 1 , threads ) ); + for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) + { + int isoEdges[ 2 * MarchingSquares::MAX_EDGES ]; + ConstAdjacenctNodeKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; + TreeOctNode* leaf = _sNodes.treeNodes[i]; + if( !leaf->children ) + { + int idx = i - sValues.sliceData.nodeOffset; + const typename SortedTreeNodes::SquareEdgeIndices& eIndices = sValues.sliceData.edgeIndices( leaf ); + const typename SortedTreeNodes::SquareFaceIndices& fIndices = sValues.sliceData.faceIndices( leaf ); + unsigned char mcIndex = sValues.mcIndices[idx]; + if( !sValues.faceSet[ fIndices[0] ] ) + { + neighborKey.getNeighbors( leaf ); + if( !neighborKey.neighbors[depth].neighbors[1][1][2*z] || !neighborKey.neighbors[depth].neighbors[1][1][2*z]->children ) + { + FaceEdges fe; + fe.count = MarchingSquares::AddEdgeIndices( mcIndex , isoEdges ); + for( int j=0 ; j edges; + edges.resize( fe.count ); + for( int j=0 ; jparent && Cube::IsFaceCorner( (int)(node-node->parent->children) , f ) ) + { + node = node->parent , _depth-- , _slice >>= 1; + if( neighborKey.neighbors[_depth].neighbors[1][1][2*z] && neighborKey.neighbors[_depth].neighbors[1][1][2*z]->children ) break; + long long key = VertexData::FaceIndex( node , f , _sNodes.levels() ); +#pragma omp critical( add_iso_edge_access ) + { + typename Octree::template SliceValues< Vertex >& _sValues = slabValues[_depth].sliceValues( _slice ); + typename hash_map< long long , std::vector< IsoEdge > >::iterator iter = _sValues.faceEdgeMap.find(key); + if( iter==_sValues.faceEdgeMap.end() ) _sValues.faceEdgeMap[key] = edges; + else for( int j=0 ; jsecond.push_back( fe.edges[j] ); + } + } + } + } + } + } +} +template< class Real > +template< class Vertex > +void Octree< Real >::SetXSliceIsoEdges( int depth , int slab , std::vector< SlabValues< Vertex > >& slabValues , int threads ) +{ + typename Octree::template SliceValues< Vertex >& bValues = slabValues[depth].sliceValues ( slab ); + typename Octree::template SliceValues< Vertex >& fValues = slabValues[depth].sliceValues ( slab+1 ); + typename Octree::template XSliceValues< Vertex >& xValues = slabValues[depth].xSliceValues( slab ); + + std::vector< ConstAdjacenctNodeKey > neighborKeys( std::max< int >( 1 , threads ) ); + for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) + { + int isoEdges[ 2 * MarchingSquares::MAX_EDGES ]; + ConstAdjacenctNodeKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; + TreeOctNode* leaf = _sNodes.treeNodes[i]; + if( !leaf->children ) + { + const typename SortedTreeNodes::SquareCornerIndices& cIndices = xValues.xSliceData.edgeIndices( leaf ); + const typename SortedTreeNodes::SquareEdgeIndices& eIndices = xValues.xSliceData.faceIndices( leaf ); + unsigned char mcIndex = ( bValues.mcIndices[ i - bValues.sliceData.nodeOffset ] ) | ( fValues.mcIndices[ i - fValues.sliceData.nodeOffset ]<<4 ); + { + neighborKey.getNeighbors( leaf ); + for( int o=0 ; o<2 ; o++ ) for( int x=0 ; x<2 ; x++ ) + { + int e = Square::EdgeIndex( o , x ); + int f = Cube::FaceIndex( 1-o , x ); + unsigned char _mcIndex = MarchingCubes::GetFaceIndex( mcIndex , f ); + int xx = o==1 ? 2*x : 1 , yy = o==0 ? 2*x : 1 , zz = 1; + if( !xValues.faceSet[ eIndices[e] ] && ( !neighborKey.neighbors[depth].neighbors[xx][yy][zz] || !neighborKey.neighbors[depth].neighbors[xx][yy][zz]->children ) ) + { + FaceEdges fe; + fe.count = MarchingSquares::AddEdgeIndices( _mcIndex , isoEdges ); + for( int j=0 ; j& sValues = (_x==0) ? bValues : fValues; + int idx = sValues.sliceData.edgeIndices(i)[ Square::EdgeIndex(o,x) ]; + if( !sValues.edgeSet[ idx ] ) fprintf( stderr , "[ERROR] Edge not set 5: %d / %d\n" , slab , 1< edges; + edges.resize( fe.count ); + for( int j=0 ; jparent && Cube::IsFaceCorner( (int)(node-node->parent->children) , f ) ) + { + node = node->parent , _depth-- , _slab >>= 1; + if( neighborKey.neighbors[_depth].neighbors[xx][yy][zz] && neighborKey.neighbors[_depth].neighbors[xx][yy][zz]->children ) break; + long long key = VertexData::FaceIndex( node , f , _sNodes.levels() ); +#pragma omp critical( add_x_iso_edge_access ) + { + typename Octree::template XSliceValues< Vertex >& _xValues = slabValues[_depth].xSliceValues( _slab ); + typename hash_map< long long , std::vector< IsoEdge > >::iterator iter = _xValues.faceEdgeMap.find(key); + if( iter==_xValues.faceEdgeMap.end() ) _xValues.faceEdgeMap[key] = edges; + else for( int j=0 ; jsecond.push_back( fe.edges[j] ); + } + } + } + } + } + } + } +} +template< class Real > +template< class Vertex > +void Octree< Real >::SetIsoSurface( int depth , int offset , const SliceValues< Vertex >& bValues , const SliceValues< Vertex >& fValues , const XSliceValues< Vertex >& xValues , CoredMeshData< Vertex >& mesh , bool polygonMesh , bool addBarycenter , int& vOffset , int threads ) +{ + std::vector< std::pair< int , Vertex > > polygon; + std::vector< std::vector< IsoEdge > > edgess( std::max< int >( 1 , threads ) ); +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=_sNodes.begin(depth,offset) ; i<_sNodes.end(depth,offset) ; i++ ) if( _IsValidNode< 0 >( _sNodes.treeNodes[i] ) ) + { + std::vector< IsoEdge >& edges = edgess[ omp_get_thread_num() ]; + TreeOctNode* leaf = _sNodes.treeNodes[i]; + int d , off[3]; + leaf->depthAndOffset( d , off ); + int res = _Resolution( depth ); + bool inBounds = off[0]children ) + { + edges.clear(); + unsigned char mcIndex = ( bValues.mcIndices[ i - bValues.sliceData.nodeOffset ] ) | ( fValues.mcIndices[ i - fValues.sliceData.nodeOffset ]<<4 ); + // [WARNING] Just because the node looks empty doesn't mean it doesn't get eges from finer neighbors + { + // Gather the edges from the faces (with the correct orientation) + for( int f=0 ; f& sValues = (o==0) ? bValues : fValues; + int fIdx = sValues.sliceData.faceIndices(i)[0]; + if( sValues.faceSet[fIdx] ) + { + const FaceEdges& fe = sValues.faceEdges[ fIdx ]; + for( int j=0 ; j >::const_iterator iter = sValues.faceEdgeMap.find( key ); + if( iter!=sValues.faceEdgeMap.end() ) + { + const std::vector< IsoEdge >& _edges = iter->second; + for( size_t j=0 ; j<_edges.size() ; j++ ) edges.push_back( IsoEdge( _edges[j][flip] , _edges[j][1-flip] ) ); + } + else fprintf( stderr , "[ERROR] Invalid faces: %d %d %d\n" , i , d , o ) , exit( 0 ); + } + } + else + { + int fIdx = xValues.xSliceData.faceIndices(i)[ Square::EdgeIndex( 1-d , o ) ]; + if( xValues.faceSet[fIdx] ) + { + const FaceEdges& fe = xValues.faceEdges[ fIdx ]; + for( int j=0 ; j >::const_iterator iter = xValues.faceEdgeMap.find( key ); + if( iter!=xValues.faceEdgeMap.end() ) + { + const std::vector< IsoEdge >& _edges = iter->second; + for( size_t j=0 ; j<_edges.size() ; j++ ) edges.push_back( IsoEdge( _edges[j][flip] , _edges[j][1-flip] ) ); + } + else fprintf( stderr , "[ERROR] Invalid faces: %d %d %d\n" , i , d , o ) , exit( 0 ); + } + } + } + // Get the edge loops + std::vector< std::vector< long long > > loops; + while( edges.size() ) + { + loops.resize( loops.size()+1 ); + IsoEdge edge = edges.back(); + edges.pop_back(); + long long start = edge[0] , current = edge[1]; + while( current!=start ) + { + int idx; + for( idx=0 ; idx<(int)edges.size() ; idx++ ) if( edges[idx][0]==current ) break; + if( idx==edges.size() ) + { + typename hash_map< long long , long long >::const_iterator iter; + if ( (iter=bValues.vertexPairMap.find(current))!=bValues.vertexPairMap.end() ) loops.back().push_back( current ) , current = iter->second; + else if( (iter=fValues.vertexPairMap.find(current))!=fValues.vertexPairMap.end() ) loops.back().push_back( current ) , current = iter->second; + else if( (iter=xValues.vertexPairMap.find(current))!=xValues.vertexPairMap.end() ) loops.back().push_back( current ) , current = iter->second; + else + { + int d , off[3]; + leaf->depthAndOffset( d , off ); + fprintf( stderr , "[ERROR] Failed to close loop [%d: %d %d %d] | (%d): %lld\n" , d-1 , off[0] , off[1] , off[2] , i , current ); + exit( 0 ); + } + } + else + { + loops.back().push_back( current ); + current = edges[idx][1]; + edges[idx] = edges.back() , edges.pop_back(); + } + } + loops.back().push_back( start ); + } + // Add the loops to the mesh + for( size_t j=0 ; j > polygon( loops[j].size() ); + for( size_t k=0 ; k >::const_iterator iter; + if ( ( iter=bValues.edgeVertexMap.find( key ) )!=bValues.edgeVertexMap.end() ) polygon[k] = iter->second; + else if( ( iter=fValues.edgeVertexMap.find( key ) )!=fValues.edgeVertexMap.end() ) polygon[k] = iter->second; + else if( ( iter=xValues.edgeVertexMap.find( key ) )!=xValues.edgeVertexMap.end() ) polygon[k] = iter->second; + else fprintf( stderr , "[ERROR] Couldn't find vertex in edge map\n" ) , exit( 0 ); + } + AddIsoPolygons( mesh , polygon , polygonMesh , addBarycenter , vOffset ); + } + } + } + } +} +template< class Real > void SetColor( Point3D< Real >& color , unsigned char c[3] ){ for( int i=0 ; i<3 ; i++ ) c[i] = (unsigned char)std::max< int >( 0 , std::min< int >( 255 , (int)( color[i]+0.5 ) ) ); } + +template< class Real > void SetIsoVertex( PlyVertex< float >& vertex , Point3D< Real > color , Real value ){ ; } +template< class Real > void SetIsoVertex( PlyColorVertex< float >& vertex , Point3D< Real > color , Real value ){ SetColor( color , vertex.color ); } +template< class Real > void SetIsoVertex( PlyValueVertex< float >& vertex , Point3D< Real > color , Real value ){ vertex.value = float(value); } +template< class Real > void SetIsoVertex( PlyColorAndValueVertex< float >& vertex , Point3D< Real > color , Real value ){ SetColor( color , vertex.color ) , vertex.value = float(value); } +template< class Real > void SetIsoVertex( PlyVertex< double >& vertex , Point3D< Real > color , Real value ){ ; } +template< class Real > void SetIsoVertex( PlyColorVertex< double >& vertex , Point3D< Real > color , Real value ){ SetColor( color , vertex.color ); } +template< class Real > void SetIsoVertex( PlyValueVertex< double >& vertex , Point3D< Real > color , Real value ){ vertex.value = double(value); } +template< class Real > void SetIsoVertex( PlyColorAndValueVertex< double >& vertex , Point3D< Real > color , Real value ){ SetColor( color , vertex.color ) , vertex.value = double(value); } + +template< class Real > +template< int WeightDegree , int ColorDegree , class Vertex > +bool Octree< Real >::GetIsoVertex( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , ConstPointSupportKey< WeightDegree >& weightKey , ConstPointSupportKey< ColorDegree >& colorKey , const TreeOctNode* node , int edgeIndex , int z , const SliceValues< Vertex >& sValues , Vertex& vertex ) +{ + Point3D< Real > position; + int c0 , c1; + Square::EdgeCorners( edgeIndex , c0 , c1 ); + + bool nonLinearFit = sValues.cornerGradients!=NullPointer( Point3D< Real > ); + const typename SortedTreeNodes::SquareCornerIndices& idx = sValues.sliceData.cornerIndices( node ); + Real x0 = sValues.cornerValues[idx[c0]] , x1 = sValues.cornerValues[idx[c1]]; + Point3D< Real > s; + Real start , width; + _StartAndWidth( node , s , width ); + int o , y; + Square::FactorEdgeIndex( edgeIndex , o , y ); + start = s[o]; + switch( o ) + { + case 0: + position[1] = s[1] + width*y; + position[2] = s[2] + width*z; + break; + case 1: + position[0] = s[0] + width*y; + position[2] = s[2] + width*z; + break; + } + + double averageRoot; + if( nonLinearFit ) + { + double dx0 = sValues.cornerGradients[idx[c0]][o] * width , dx1 = sValues.cornerGradients[idx[c1]][o] * width; + + // The scaling will turn the Hermite Spline into a quadratic + double scl = (x1-x0) / ( (dx1+dx0 ) / 2 ); + dx0 *= scl , dx1 *= scl; + + // Hermite Spline + Polynomial< 2 > P; + P.coefficients[0] = x0; + P.coefficients[1] = dx0; + P.coefficients[2] = 3*(x1-x0)-dx1-2*dx0; + + double roots[2]; + int rCount = 0 , rootCount = P.getSolutions( isoValue , roots , EPSILON ); + averageRoot = 0; + for( int i=0 ; i=0 && roots[i]<=1 ) averageRoot += roots[i] , rCount++; + averageRoot /= rCount; + } + else + { + // We have a linear function L, with L(0) = x0 and L(1) = x1 + // => L(t) = x0 + t * (x1-x0) + // => L(t) = isoValue <=> t = ( isoValue - x0 ) / ( x1 - x0 ) + if( x0==x1 ) fprintf( stderr , "[ERROR] Not a zero-crossing root: %g %g\n" , x0 , x1 ) , exit( 0 ); + averageRoot = ( isoValue - x0 ) / ( x1 - x0 ); + } + if( averageRoot<0 || averageRoot>1 ) + { + fprintf( stderr , "[WARNING] Bad average root: %f\n" , averageRoot ); + fprintf( stderr , "\t(%f %f) (%f)\n" , x0 , x1 , isoValue ); + if( averageRoot<0 ) averageRoot = 0; + if( averageRoot>1 ) averageRoot = 1; + } + position[o] = Real( start + width*averageRoot ); + vertex.point = position; + Point3D< Real > color; + Real depth(0); + if( densityWeights ) + { + Real weight; + const TreeOctNode* temp = node; + while( _Depth( temp )>_splatDepth ) temp=temp->parent; + _GetSampleDepthAndWeight( *densityWeights , temp , position , weightKey , depth , weight ); + } + if( colorData ) color = Point3D< Real >( _Evaluate( *colorData , position , *colorBSData , colorKey ) ); + SetIsoVertex( vertex , color , depth ); + return true; +} +template< class Real > +template< int WeightDegree , int ColorDegree , class Vertex > +bool Octree< Real >::GetIsoVertex( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , ConstPointSupportKey< WeightDegree >& weightKey , ConstPointSupportKey< ColorDegree >& colorKey , const TreeOctNode* node , int cornerIndex , const SliceValues< Vertex >& bValues , const SliceValues< Vertex >& fValues , Vertex& vertex ) +{ + Point3D< Real > position; + + bool nonLinearFit = bValues.cornerGradients!=NullPointer( Point3D< Real > ) && fValues.cornerGradients!=NullPointer( Point3D< Real > ); + const typename SortedTreeNodes::SquareCornerIndices& idx0 = bValues.sliceData.cornerIndices( node ); + const typename SortedTreeNodes::SquareCornerIndices& idx1 = fValues.sliceData.cornerIndices( node ); + Real x0 = bValues.cornerValues[ idx0[cornerIndex] ] , x1 = fValues.cornerValues[ idx1[cornerIndex] ]; + Point3D< Real > s; + Real start , width; + _StartAndWidth( node , s , width ); + start = s[2]; + int x , y; + Square::FactorCornerIndex( cornerIndex , x , y ); + + + position[0] = s[0] + width*x; + position[1] = s[1] + width*y; + + double averageRoot; + + if( nonLinearFit ) + { + double dx0 = bValues.cornerGradients[ idx0[cornerIndex] ][2] * width , dx1 = fValues.cornerGradients[ idx1[cornerIndex] ][2] * width; + // The scaling will turn the Hermite Spline into a quadratic + double scl = (x1-x0) / ( (dx1+dx0 ) / 2 ); + dx0 *= scl , dx1 *= scl; + + // Hermite Spline + Polynomial< 2 > P; + P.coefficients[0] = x0; + P.coefficients[1] = dx0; + P.coefficients[2] = 3*(x1-x0)-dx1-2*dx0; + + double roots[2]; + int rCount = 0 , rootCount = P.getSolutions( isoValue , roots , EPSILON ); + averageRoot = 0; + for( int i=0 ; i=0 && roots[i]<=1 ) averageRoot += roots[i] , rCount++; + averageRoot /= rCount; + } + else + { + // We have a linear function L, with L(0) = x0 and L(1) = x1 + // => L(t) = x0 + t * (x1-x0) + // => L(t) = isoValue <=> t = ( isoValue - x0 ) / ( x1 - x0 ) + if( x0==x1 ) fprintf( stderr , "[ERROR] Not a zero-crossing root: %g %g\n" , x0 , x1 ) , exit( 0 ); + averageRoot = ( isoValue - x0 ) / ( x1 - x0 ); + } + if( averageRoot<0 || averageRoot>1 ) + { + fprintf( stderr , "[WARNING] Bad average root: %f\n" , averageRoot ); + fprintf( stderr , "\t(%f %f) (%f)\n" , x0 , x1 , isoValue ); + if( averageRoot<0 ) averageRoot = 0; + if( averageRoot>1 ) averageRoot = 1; + } + position[2] = Real( start + width*averageRoot ); + vertex.point = position; + Point3D< Real > color; + Real depth(0); + if( densityWeights ) + { + Real weight; + const TreeOctNode* temp = node; + while( _Depth( temp )>_splatDepth ) temp=temp->parent; + _GetSampleDepthAndWeight( *densityWeights , temp , position , weightKey , depth , weight ); + } + if( colorData ) color = Point3D< Real >( _Evaluate( *colorData , position , *colorBSData , colorKey ) ); + SetIsoVertex( vertex , color , depth ); + return true; +} + +template< class Real > +template< class Vertex > +int Octree< Real >::AddIsoPolygons( CoredMeshData< Vertex >& mesh , std::vector< std::pair< int , Vertex > >& polygon , bool polygonMesh , bool addBarycenter , int& vOffset ) +{ + if( polygonMesh ) + { + std::vector< int > vertices( polygon.size() ); + for( int i=0 ; i<(int)polygon.size() ; i++ ) vertices[i] = polygon[polygon.size()-1-i].first; + mesh.addPolygon_s( vertices ); + return 1; + } + if( polygon.size()>3 ) + { + bool isCoplanar = false; + std::vector< int > triangle( 3 ); + + if( addBarycenter ) + for( int i=0 ; i<(int)polygon.size() ; i++ ) + for( int j=0 ; j MAT; + std::vector< Point3D< Real > > vertices; + std::vector< TriangleIndex > triangles; + vertices.resize( polygon.size() ); + // Add the points + for( int i=0 ; i<(int)polygon.size() ; i++ ) vertices[i] = polygon[i].second.point; + MAT.GetTriangulation( vertices , triangles ); + for( int i=0 ; i<(int)triangles.size() ; i++ ) + { + for( int j=0 ; j<3 ; j++ ) triangle[2-j] = polygon[ triangles[i].idx[j] ].first; + mesh.addPolygon_s( triangle ); + } + } + } + else if( polygon.size()==3 ) + { + std::vector< int > vertices( 3 ); + for( int i=0 ; i<3 ; i++ ) vertices[2-i] = polygon[i].first; + mesh.addPolygon_s( vertices ); + } + return (int)polygon.size()-2; +} diff --git a/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.SortedTreeNodes.inl b/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.SortedTreeNodes.inl old mode 100755 new mode 100644 index f0f24947..80593cf0 --- a/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.SortedTreeNodes.inl +++ b/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.SortedTreeNodes.inl @@ -1,365 +1,365 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - -///////////////////// -// SortedTreeNodes // -///////////////////// -SortedTreeNodes::SortedTreeNodes( void ) -{ - _sliceStart = NullPointer( Pointer( int ) ); - treeNodes = NullPointer( TreeOctNode* ); - _levels = 0; -} -SortedTreeNodes::~SortedTreeNodes( void ) -{ - if( _sliceStart ) for( int d=0 ; d<_levels ; d++ ) FreePointer( _sliceStart[d] ); - FreePointer( _sliceStart ); - DeletePointer( treeNodes ); -} -void SortedTreeNodes::set( TreeOctNode& root , std::vector< int >* map ) -{ - set( root ); - - if( map ) - { - map->resize( _sliceStart[_levels-1][(size_t)1<<(_levels-1)] ); - for( int i=0 ; i<_sliceStart[_levels-1][(size_t)1<<(_levels-1)] ; i++ ) (*map)[i] = treeNodes[i]->nodeData.nodeIndex; - } - for( int i=0 ; i<_sliceStart[_levels-1][(size_t)1<<(_levels-1)] ; i++ ) treeNodes[i]->nodeData.nodeIndex = i; -} -void SortedTreeNodes::set( TreeOctNode& root ) -{ - _levels = root.maxDepth()+1; - - if( _sliceStart ) for( int d=0 ; d<_levels ; d++ ) FreePointer( _sliceStart[d] ); - FreePointer( _sliceStart ); - DeletePointer( treeNodes ); - - _sliceStart = AllocPointer< Pointer( int ) >( _levels ); - for( int l=0 ; l<_levels ; l++ ) - { - _sliceStart[l] = AllocPointer< int >( ((size_t)1<depthAndOffset( d , off ); - _sliceStart[d][ off[2]+1 ]++; - } - - // Get the start index for each slice - { - int levelOffset = 0; - for( int l=0 ; l<_levels ; l++ ) - { - _sliceStart[l][0] = levelOffset; - for( int s=0 ; s<((size_t)1<( _sliceStart[_levels-1][(size_t)1<<(_levels-1)] ); - - // Add the tree nodes - for( TreeOctNode* node=root.nextNode() ; node ; node=root.nextNode( node ) ) - { - int d , off[3]; - node->depthAndOffset( d , off ); - treeNodes[ _sliceStart[d][ off[2] ]++ ] = node; - } - - // Shift the slice offsets up since we incremented as we added - for( int l=0 ; l<_levels ; l++ ) - { - for( int s=(1<0 ; s-- ) _sliceStart[l][s] = _sliceStart[l][s-1]; - _sliceStart[l][0] = l>0 ? _sliceStart[l-1][(size_t)1<<(l-1)] : 0; - } -} -SortedTreeNodes::SquareCornerIndices& SortedTreeNodes::SliceTableData::cornerIndices( const TreeOctNode* node ) { return cTable[ node->nodeData.nodeIndex - nodeOffset ]; } -SortedTreeNodes::SquareCornerIndices& SortedTreeNodes::SliceTableData::cornerIndices( int idx ) { return cTable[ idx - nodeOffset ]; } -const SortedTreeNodes::SquareCornerIndices& SortedTreeNodes::SliceTableData::cornerIndices( const TreeOctNode* node ) const { return cTable[ node->nodeData.nodeIndex - nodeOffset ]; } -const SortedTreeNodes::SquareCornerIndices& SortedTreeNodes::SliceTableData::cornerIndices( int idx ) const { return cTable[ idx - nodeOffset ]; } -SortedTreeNodes::SquareEdgeIndices& SortedTreeNodes::SliceTableData::edgeIndices( const TreeOctNode* node ) { return eTable[ node->nodeData.nodeIndex - nodeOffset ]; } -SortedTreeNodes::SquareEdgeIndices& SortedTreeNodes::SliceTableData::edgeIndices( int idx ) { return eTable[ idx - nodeOffset ]; } -const SortedTreeNodes::SquareEdgeIndices& SortedTreeNodes::SliceTableData::edgeIndices( const TreeOctNode* node ) const { return eTable[ node->nodeData.nodeIndex - nodeOffset ]; } -const SortedTreeNodes::SquareEdgeIndices& SortedTreeNodes::SliceTableData::edgeIndices( int idx ) const { return eTable[ idx - nodeOffset ]; } -SortedTreeNodes::SquareFaceIndices& SortedTreeNodes::SliceTableData::faceIndices( const TreeOctNode* node ) { return fTable[ node->nodeData.nodeIndex - nodeOffset ]; } -SortedTreeNodes::SquareFaceIndices& SortedTreeNodes::SliceTableData::faceIndices( int idx ) { return fTable[ idx - nodeOffset ]; } -const SortedTreeNodes::SquareFaceIndices& SortedTreeNodes::SliceTableData::faceIndices( const TreeOctNode* node ) const { return fTable[ node->nodeData.nodeIndex - nodeOffset ]; } -const SortedTreeNodes::SquareFaceIndices& SortedTreeNodes::SliceTableData::faceIndices( int idx ) const { return fTable[ idx - nodeOffset ]; } -SortedTreeNodes::SquareCornerIndices& SortedTreeNodes::XSliceTableData::edgeIndices( const TreeOctNode* node ) { return eTable[ node->nodeData.nodeIndex - nodeOffset ]; } -SortedTreeNodes::SquareCornerIndices& SortedTreeNodes::XSliceTableData::edgeIndices( int idx ) { return eTable[ idx - nodeOffset ]; } -const SortedTreeNodes::SquareCornerIndices& SortedTreeNodes::XSliceTableData::edgeIndices( const TreeOctNode* node ) const { return eTable[ node->nodeData.nodeIndex - nodeOffset ]; } -const SortedTreeNodes::SquareCornerIndices& SortedTreeNodes::XSliceTableData::edgeIndices( int idx ) const { return eTable[ idx - nodeOffset ]; } -SortedTreeNodes::SquareEdgeIndices& SortedTreeNodes::XSliceTableData::faceIndices( const TreeOctNode* node ) { return fTable[ node->nodeData.nodeIndex - nodeOffset ]; } -SortedTreeNodes::SquareEdgeIndices& SortedTreeNodes::XSliceTableData::faceIndices( int idx ) { return fTable[ idx - nodeOffset ]; } -const SortedTreeNodes::SquareEdgeIndices& SortedTreeNodes::XSliceTableData::faceIndices( const TreeOctNode* node ) const { return fTable[ node->nodeData.nodeIndex - nodeOffset ]; } -const SortedTreeNodes::SquareEdgeIndices& SortedTreeNodes::XSliceTableData::faceIndices( int idx ) const { return fTable[ idx - nodeOffset ]; } - -void SortedTreeNodes::setSliceTableData( SliceTableData& sData , int depth , int offset , int threads ) const -{ - // [NOTE] This is structure is purely for determining adjacency and is independent of the FEM degree - typedef OctNode< TreeNodeData >::ConstNeighborKey< 1 , 1 > ConstAdjacenctNodeKey; - if( offset<0 || offset>((size_t)1< span( _sliceStart[depth][ std::max< int >( 0 , offset-1 ) ] , _sliceStart[depth][ std::min< int >( (size_t)1<( sData.nodeCount * Square::CORNERS ); - sData._eMap = NewPointer< int >( sData.nodeCount * Square::EDGES ); - sData._fMap = NewPointer< int >( sData.nodeCount * Square::FACES ); - sData.cTable = NewPointer< SortedTreeNodes::SquareCornerIndices >( sData.nodeCount ); - sData.eTable = NewPointer< SortedTreeNodes::SquareCornerIndices >( sData.nodeCount ); - sData.fTable = NewPointer< SortedTreeNodes::SquareFaceIndices >( sData.nodeCount ); - memset( sData._cMap , 0 , sizeof(int) * sData.nodeCount * Square::CORNERS ); - memset( sData._eMap , 0 , sizeof(int) * sData.nodeCount * Square::EDGES ); - memset( sData._fMap , 0 , sizeof(int) * sData.nodeCount * Square::FACES ); - } - std::vector< ConstAdjacenctNodeKey > neighborKeys( std::max< int >( 1 , threads ) ); - for( size_t i=0 ; i& neighbors = neighborKey.getNeighbors( node ); - int d , off[3]; - node->depthAndOffset( d , off ); - int z; - if ( off[2]==offset-1 ) z = 1; - else if( off[2]==offset ) z = 0; - else fprintf( stderr , "[ERROR] Node out of bounds: %d %d\n" , offset , off[2] ) , exit( 0 ); - // Process the corners - for( int x=0 ; x<2 ; x++ ) for( int y=0 ; y<2 ; y++ ) - { - int c = Cube::CornerIndex( x , y , z ); - int fc = Square::CornerIndex( x , y ); - bool cornerOwner = true; - int ac = Cube::AntipodalCornerIndex(c); // The index of the node relative to the corner - for( int cc=0 ; cc::ConstNeighborKey< 1 , 1 > ConstAdjacenctNodeKey; - if( offset<0 || offset>=((size_t)1< span( _sliceStart[depth][offset] , _sliceStart[depth][offset+1] ); - sData.nodeOffset = span.first; - sData.nodeCount = span.second - span.first; - - DeletePointer( sData._eMap ) ; DeletePointer( sData._fMap ); - DeletePointer( sData.eTable ) ; DeletePointer( sData.fTable ); - if( sData.nodeCount ) - { - sData._eMap = NewPointer< int >( sData.nodeCount * Square::CORNERS ); - sData._fMap = NewPointer< int >( sData.nodeCount * Square::EDGES ); - sData.eTable = NewPointer< SortedTreeNodes::SquareCornerIndices >( sData.nodeCount ); - sData.fTable = NewPointer< SortedTreeNodes::SquareEdgeIndices >( sData.nodeCount ); - memset( sData._eMap , 0 , sizeof(int) * sData.nodeCount * Square::CORNERS ); - memset( sData._fMap , 0 , sizeof(int) * sData.nodeCount * Square::EDGES ); - } - - std::vector< ConstAdjacenctNodeKey > neighborKeys( std::max< int >( 1 , threads ) ); - for( size_t i=0 ; i& neighbors = neighborKey.getNeighbors( node ); - int d , off[3]; - node->depthAndOffset( d , off ); - // Process the edges - int o=2; - for( int x=0 ; x<2 ; x++ ) for( int y=0 ; y<2 ; y++ ) - { - int fc = Square::CornerIndex( x , y ); - bool edgeOwner = true; - - int ac = Square::AntipodalCornerIndex( Square::CornerIndex( x , y ) ); - for( int cc=0 ; cc* map ) +{ + set( root ); + + if( map ) + { + map->resize( _sliceStart[_levels-1][(size_t)1<<(_levels-1)] ); + for( int i=0 ; i<_sliceStart[_levels-1][(size_t)1<<(_levels-1)] ; i++ ) (*map)[i] = treeNodes[i]->nodeData.nodeIndex; + } + for( int i=0 ; i<_sliceStart[_levels-1][(size_t)1<<(_levels-1)] ; i++ ) treeNodes[i]->nodeData.nodeIndex = i; +} +void SortedTreeNodes::set( TreeOctNode& root ) +{ + _levels = root.maxDepth()+1; + + if( _sliceStart ) for( int d=0 ; d<_levels ; d++ ) FreePointer( _sliceStart[d] ); + FreePointer( _sliceStart ); + DeletePointer( treeNodes ); + + _sliceStart = AllocPointer< Pointer( int ) >( _levels ); + for( int l=0 ; l<_levels ; l++ ) + { + _sliceStart[l] = AllocPointer< int >( ((size_t)1<depthAndOffset( d , off ); + _sliceStart[d][ off[2]+1 ]++; + } + + // Get the start index for each slice + { + int levelOffset = 0; + for( int l=0 ; l<_levels ; l++ ) + { + _sliceStart[l][0] = levelOffset; + for( int s=0 ; s<((size_t)1<( _sliceStart[_levels-1][(size_t)1<<(_levels-1)] ); + + // Add the tree nodes + for( TreeOctNode* node=root.nextNode() ; node ; node=root.nextNode( node ) ) + { + int d , off[3]; + node->depthAndOffset( d , off ); + treeNodes[ _sliceStart[d][ off[2] ]++ ] = node; + } + + // Shift the slice offsets up since we incremented as we added + for( int l=0 ; l<_levels ; l++ ) + { + for( int s=(1<0 ; s-- ) _sliceStart[l][s] = _sliceStart[l][s-1]; + _sliceStart[l][0] = l>0 ? _sliceStart[l-1][(size_t)1<<(l-1)] : 0; + } +} +SortedTreeNodes::SquareCornerIndices& SortedTreeNodes::SliceTableData::cornerIndices( const TreeOctNode* node ) { return cTable[ node->nodeData.nodeIndex - nodeOffset ]; } +SortedTreeNodes::SquareCornerIndices& SortedTreeNodes::SliceTableData::cornerIndices( int idx ) { return cTable[ idx - nodeOffset ]; } +const SortedTreeNodes::SquareCornerIndices& SortedTreeNodes::SliceTableData::cornerIndices( const TreeOctNode* node ) const { return cTable[ node->nodeData.nodeIndex - nodeOffset ]; } +const SortedTreeNodes::SquareCornerIndices& SortedTreeNodes::SliceTableData::cornerIndices( int idx ) const { return cTable[ idx - nodeOffset ]; } +SortedTreeNodes::SquareEdgeIndices& SortedTreeNodes::SliceTableData::edgeIndices( const TreeOctNode* node ) { return eTable[ node->nodeData.nodeIndex - nodeOffset ]; } +SortedTreeNodes::SquareEdgeIndices& SortedTreeNodes::SliceTableData::edgeIndices( int idx ) { return eTable[ idx - nodeOffset ]; } +const SortedTreeNodes::SquareEdgeIndices& SortedTreeNodes::SliceTableData::edgeIndices( const TreeOctNode* node ) const { return eTable[ node->nodeData.nodeIndex - nodeOffset ]; } +const SortedTreeNodes::SquareEdgeIndices& SortedTreeNodes::SliceTableData::edgeIndices( int idx ) const { return eTable[ idx - nodeOffset ]; } +SortedTreeNodes::SquareFaceIndices& SortedTreeNodes::SliceTableData::faceIndices( const TreeOctNode* node ) { return fTable[ node->nodeData.nodeIndex - nodeOffset ]; } +SortedTreeNodes::SquareFaceIndices& SortedTreeNodes::SliceTableData::faceIndices( int idx ) { return fTable[ idx - nodeOffset ]; } +const SortedTreeNodes::SquareFaceIndices& SortedTreeNodes::SliceTableData::faceIndices( const TreeOctNode* node ) const { return fTable[ node->nodeData.nodeIndex - nodeOffset ]; } +const SortedTreeNodes::SquareFaceIndices& SortedTreeNodes::SliceTableData::faceIndices( int idx ) const { return fTable[ idx - nodeOffset ]; } +SortedTreeNodes::SquareCornerIndices& SortedTreeNodes::XSliceTableData::edgeIndices( const TreeOctNode* node ) { return eTable[ node->nodeData.nodeIndex - nodeOffset ]; } +SortedTreeNodes::SquareCornerIndices& SortedTreeNodes::XSliceTableData::edgeIndices( int idx ) { return eTable[ idx - nodeOffset ]; } +const SortedTreeNodes::SquareCornerIndices& SortedTreeNodes::XSliceTableData::edgeIndices( const TreeOctNode* node ) const { return eTable[ node->nodeData.nodeIndex - nodeOffset ]; } +const SortedTreeNodes::SquareCornerIndices& SortedTreeNodes::XSliceTableData::edgeIndices( int idx ) const { return eTable[ idx - nodeOffset ]; } +SortedTreeNodes::SquareEdgeIndices& SortedTreeNodes::XSliceTableData::faceIndices( const TreeOctNode* node ) { return fTable[ node->nodeData.nodeIndex - nodeOffset ]; } +SortedTreeNodes::SquareEdgeIndices& SortedTreeNodes::XSliceTableData::faceIndices( int idx ) { return fTable[ idx - nodeOffset ]; } +const SortedTreeNodes::SquareEdgeIndices& SortedTreeNodes::XSliceTableData::faceIndices( const TreeOctNode* node ) const { return fTable[ node->nodeData.nodeIndex - nodeOffset ]; } +const SortedTreeNodes::SquareEdgeIndices& SortedTreeNodes::XSliceTableData::faceIndices( int idx ) const { return fTable[ idx - nodeOffset ]; } + +void SortedTreeNodes::setSliceTableData( SliceTableData& sData , int depth , int offset , int threads ) const +{ + // [NOTE] This is structure is purely for determining adjacency and is independent of the FEM degree + typedef OctNode< TreeNodeData >::ConstNeighborKey< 1 , 1 > ConstAdjacenctNodeKey; + if( offset<0 || offset>((size_t)1< span( _sliceStart[depth][ std::max< int >( 0 , offset-1 ) ] , _sliceStart[depth][ std::min< int >( (size_t)1<( sData.nodeCount * Square::CORNERS ); + sData._eMap = NewPointer< int >( sData.nodeCount * Square::EDGES ); + sData._fMap = NewPointer< int >( sData.nodeCount * Square::FACES ); + sData.cTable = NewPointer< SortedTreeNodes::SquareCornerIndices >( sData.nodeCount ); + sData.eTable = NewPointer< SortedTreeNodes::SquareCornerIndices >( sData.nodeCount ); + sData.fTable = NewPointer< SortedTreeNodes::SquareFaceIndices >( sData.nodeCount ); + memset( sData._cMap , 0 , sizeof(int) * sData.nodeCount * Square::CORNERS ); + memset( sData._eMap , 0 , sizeof(int) * sData.nodeCount * Square::EDGES ); + memset( sData._fMap , 0 , sizeof(int) * sData.nodeCount * Square::FACES ); + } + std::vector< ConstAdjacenctNodeKey > neighborKeys( std::max< int >( 1 , threads ) ); + for( size_t i=0 ; i& neighbors = neighborKey.getNeighbors( node ); + int d , off[3]; + node->depthAndOffset( d , off ); + int z; + if ( off[2]==offset-1 ) z = 1; + else if( off[2]==offset ) z = 0; + else fprintf( stderr , "[ERROR] Node out of bounds: %d %d\n" , offset , off[2] ) , exit( 0 ); + // Process the corners + for( int x=0 ; x<2 ; x++ ) for( int y=0 ; y<2 ; y++ ) + { + int c = Cube::CornerIndex( x , y , z ); + int fc = Square::CornerIndex( x , y ); + bool cornerOwner = true; + int ac = Cube::AntipodalCornerIndex(c); // The index of the node relative to the corner + for( int cc=0 ; cc::ConstNeighborKey< 1 , 1 > ConstAdjacenctNodeKey; + if( offset<0 || offset>=((size_t)1< span( _sliceStart[depth][offset] , _sliceStart[depth][offset+1] ); + sData.nodeOffset = span.first; + sData.nodeCount = span.second - span.first; + + DeletePointer( sData._eMap ) ; DeletePointer( sData._fMap ); + DeletePointer( sData.eTable ) ; DeletePointer( sData.fTable ); + if( sData.nodeCount ) + { + sData._eMap = NewPointer< int >( sData.nodeCount * Square::CORNERS ); + sData._fMap = NewPointer< int >( sData.nodeCount * Square::EDGES ); + sData.eTable = NewPointer< SortedTreeNodes::SquareCornerIndices >( sData.nodeCount ); + sData.fTable = NewPointer< SortedTreeNodes::SquareEdgeIndices >( sData.nodeCount ); + memset( sData._eMap , 0 , sizeof(int) * sData.nodeCount * Square::CORNERS ); + memset( sData._fMap , 0 , sizeof(int) * sData.nodeCount * Square::EDGES ); + } + + std::vector< ConstAdjacenctNodeKey > neighborKeys( std::max< int >( 1 , threads ) ); + for( size_t i=0 ; i& neighbors = neighborKey.getNeighbors( node ); + int d , off[3]; + node->depthAndOffset( d , off ); + // Process the edges + int o=2; + for( int x=0 ; x<2 ; x++ ) for( int y=0 ; y<2 ; y++ ) + { + int fc = Square::CornerIndex( x , y ); + bool edgeOwner = true; + + int ac = Square::AntipodalCornerIndex( Square::CornerIndex( x , y ) ); + for( int cc=0 ; cc -double SystemCoefficients< Degree1 , Degree2 >::GetLaplacian( const typename FunctionIntegrator::Integrator& integrator , const int off1[] , const int off2[] ) -{ - double vv[] = { integrator.dot( off1[0] , off2[0] , false , false ) , integrator.dot( off1[1] , off2[1] , false , false ) , integrator.dot( off1[2] , off2[2] , false , false ) }; - double dd[] = { integrator.dot( off1[0] , off2[0] , true , true ) , integrator.dot( off1[1] , off2[1] , true , true ) , integrator.dot( off1[2] , off2[2] , true , true ) }; - return dd[0]*vv[1]*vv[2] + vv[0]*dd[1]*vv[2] + vv[0]*vv[1]*dd[2]; -} -template< int Degree1 , int Degree2 > -double SystemCoefficients< Degree1 , Degree2 >::GetLaplacian( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[] , const int off2[] ) -{ - double vv[] = { integrator.dot( off1[0] , off2[0] , false , false ) , integrator.dot( off1[1] , off2[1] , false , false ) , integrator.dot( off1[2] , off2[2] , false , false ) }; - double dd[] = { integrator.dot( off1[0] , off2[0] , true , true ) , integrator.dot( off1[1] , off2[1] , true , true ) , integrator.dot( off1[2] , off2[2] , true , true ) }; - return dd[0]*vv[1]*vv[2] + vv[0]*dd[1]*vv[2] + vv[0]*vv[1]*dd[2]; -} -template< int Degree1 , int Degree2 > -double SystemCoefficients< Degree1 , Degree2 >::GetDivergence1( const typename FunctionIntegrator::Integrator& integrator , const int off1[] , const int off2[] , Point3D< double > normal1 ) -{ - return Point3D< double >::Dot( GetDivergence1( integrator , off1 , off2 ) , normal1 ); -} -template< int Degree1 , int Degree2 > -double SystemCoefficients< Degree1 , Degree2 >::GetDivergence1( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[] , const int off2[] , Point3D< double > normal1 ) -{ - return Point3D< double >::Dot( GetDivergence1( integrator , off1 , off2 ) , normal1 ); -} -template< int Degree1 , int Degree2 > -double SystemCoefficients< Degree1 , Degree2 >::GetDivergence2( const typename FunctionIntegrator::Integrator& integrator , const int off1[] , const int off2[] , Point3D< double > normal2 ) -{ - return Point3D< double >::Dot( GetDivergence2( integrator , off1 , off2 ) , normal2 ); -} -template< int Degree1 , int Degree2 > -double SystemCoefficients< Degree1 , Degree2 >::GetDivergence2( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[] , const int off2[] , Point3D< double > normal2 ) -{ - return Point3D< double >::Dot( GetDivergence2( integrator , off1 , off2 ) , normal2 ); -} -template< int Degree1 , int Degree2 > -Point3D< double > SystemCoefficients< Degree1 , Degree2 >::GetDivergence1( const typename FunctionIntegrator::Integrator& integrator , const int off1[] , const int off2[] ) -{ - double vv[] = { integrator.dot( off1[0] , off2[0] , false , false ) , integrator.dot( off1[1] , off2[1] , false , false ) , integrator.dot( off1[2] , off2[2] , false , false ) }; -#if GRADIENT_DOMAIN_SOLUTION - // Take the dot-product of the vector-field with the gradient of the basis function - double vd[] = { integrator.dot( off1[0] , off2[0] , true , false ) , integrator.dot( off1[1] , off2[1] , true , false ) , integrator.dot( off1[2] , off2[2] , true , false ) }; - return Point3D< double >( vd[0]*vv[1]*vv[2] , vv[0]*vd[1]*vv[2] , vv[0]*vv[1]*vd[2] ); -#else // !GRADIENT_DOMAIN_SOLUTION - // Take the dot-product of the divergence of the vector-field with the basis function - double dv[] = { integrator.dot( off1[0] , off2[0] , false , true ) , integrator.dot( off1[1] , off2[1] , false , true ) , integrator.dot( off1[2] , off2[2] , false , true ) }; - return -Point3D< double >( dv[0]*vv[1]*vv[2] , vv[0]*dv[1]*vv[2] , vv[0]*vv[1]*dv[2] ); -#endif // GRADIENT_DOMAIN_SOLUTION -} -template< int Degree1 , int Degree2 > -Point3D< double > SystemCoefficients< Degree1 , Degree2 >::GetDivergence1( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[] , const int off2[] ) -{ - double vv[] = { integrator.dot( off1[0] , off2[0] , false , false ) , integrator.dot( off1[1] , off2[1] , false , false ) , integrator.dot( off1[2] , off2[2] , false , false ) }; -#if GRADIENT_DOMAIN_SOLUTION - // Take the dot-product of the vector-field with the gradient of the basis function - double vd[] = { integrator.dot( off1[0] , off2[0] , true , false ) , integrator.dot( off1[1] , off2[1] , true , false ) , integrator.dot( off1[2] , off2[2] , true , false ) }; - return Point3D< double >( vd[0]*vv[1]*vv[2] , vv[0]*vd[1]*vv[2] , vv[0]*vv[1]*vd[2] ); -#else // !GRADIENT_DOMAIN_SOLUTION - // Take the dot-product of the divergence of the vector-field with the basis function - double dv[] = { integrator.dot( off1[0] , off2[0] , false , true ) , integrator.dot( off1[1] , off2[1] , false , true ) , integrator.dot( off1[2] , off2[2] , false , true ) }; - return -Point3D< double >( dv[0]*vv[1]*vv[2] , vv[0]*dv[1]*vv[2] , vv[0]*vv[1]*dv[2] ); -#endif // GRADIENT_DOMAIN_SOLUTION -} -template< int Degree1 , int Degree2 > -Point3D< double > SystemCoefficients< Degree1 , Degree2 >::GetDivergence2( const typename FunctionIntegrator::Integrator& integrator , const int off1[] , const int off2[] ) -{ - double vv[] = { integrator.dot( off1[0] , off2[0] , false , false ) , integrator.dot( off1[1] , off2[1] , false , false ) , integrator.dot( off1[2] , off2[2] , false , false ) }; -#if GRADIENT_DOMAIN_SOLUTION - // Take the dot-product of the vector-field with the gradient of the basis function - double dv[] = { integrator.dot( off1[0] , off2[0] , false , true ) , integrator.dot( off1[1] , off2[1] , false , true ) , integrator.dot( off1[2] , off2[2] , false , true ) }; - return Point3D< double >( dv[0]*vv[1]*vv[2] , vv[0]*dv[1]*vv[2] , vv[0]*vv[1]*dv[2] ); -#else // !GRADIENT_DOMAIN_SOLUTION - // Take the dot-product of the divergence of the vector-field with the basis function - double vd[] = { integrator.dot( off1[0] , off2[0] , true , false ) , integrator.dot( off1[1] , off2[1] , true , false ) , integrator.dot( off1[2] , off2[2] , true , false ) }; - return -Point3D< double >( vd[0]*vv[1]*vv[2] , vv[0]*vd[1]*vv[2] , vv[0]*vv[1]*vd[2] ); -#endif // GRADIENT_DOMAIN_SOLUTION -} -template< int Degree1 , int Degree2 > -Point3D< double > SystemCoefficients< Degree1 , Degree2 >::GetDivergence2( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[] , const int off2[] ) -{ - double vv[] = { integrator.dot( off1[0] , off2[0] , false , false ) , integrator.dot( off1[1] , off2[1] , false , false ) , integrator.dot( off1[2] , off2[2] , false , false ) }; -#if GRADIENT_DOMAIN_SOLUTION - // Take the dot-product of the vector-field with the gradient of the basis function - double dv[] = { integrator.dot( off1[0] , off2[0] , false , true ) , integrator.dot( off1[1] , off2[1] , false , true ) , integrator.dot( off1[2] , off2[2] , false , true ) }; - return Point3D< double >( dv[0]*vv[1]*vv[2] , vv[0]*dv[1]*vv[2] , vv[0]*vv[1]*dv[2] ); -#else // !GRADIENT_DOMAIN_SOLUTION - // Take the dot-product of the divergence of the vector-field with the basis function - double vd[] = { integrator.dot( off1[0] , off2[0] , true , false ) , integrator.dot( off1[1] , off2[1] , true , false ) , integrator.dot( off1[2] , off2[2] , true , false ) }; - return -Point3D< double >( vd[0]*vv[1]*vv[2] , vv[0]*vd[1]*vv[2] , vv[0]*vv[1]*vd[2] ); -#endif // GRADIENT_DOMAIN_SOLUTION -} -// if( scatter ) normals come from the center node -// else normals come from the neighbors -template< int Degree1 , int Degree2 > -void SystemCoefficients< Degree1 , Degree2 >::SetCentralDivergenceStencil( const typename FunctionIntegrator::Integrator& integrator , Stencil< Point3D< double > , OverlapSize >& stencil , bool scatter ) -{ - int center = ( 1<>1; - int offset[] = { center , center , center }; - for( int x=0 ; x -void SystemCoefficients< Degree1 , Degree2 >::SetCentralDivergenceStencils( const typename FunctionIntegrator::ChildIntegrator& integrator , Stencil< Point3D< double > , OverlapSize > stencils[2][2][2] , bool scatter ) -{ - int center = ( 1<>1; - for( int i=0 ; i<2 ; i++ ) for( int j=0 ; j<2 ; j++ ) for( int k=0 ; k<2 ; k++ ) - { - int offset[] = { center+i , center+j , center+k }; - for( int x=0 ; x -void SystemCoefficients< Degree1 , Degree2 >::SetCentralLaplacianStencil( const typename FunctionIntegrator::Integrator& integrator , Stencil< double , OverlapSize >& stencil ) -{ - int center = ( 1<>1; - int offset[] = { center , center , center }; - for( int x=0 ; x -void SystemCoefficients< Degree1 , Degree2 >::SetCentralLaplacianStencils( const typename FunctionIntegrator::ChildIntegrator& integrator , Stencil< double , OverlapSize > stencils[2][2][2] ) -{ - int center = ( 1<>1; - for( int i=0 ; i<2 ; i++ ) for( int j=0 ; j<2 ; j++ ) for( int k=0 ; k<2 ; k++ ) - { - int offset[] = { center+i , center+j , center+k }; - for( int x=0 ; x -template< int FEMDegree > -void Octree< Real >::_setMultiColorIndices( int start , int end , std::vector< std::vector< int > >& indices ) const -{ - static const int OverlapRadius = - BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; - - const int modulus = OverlapRadius+1; - indices.resize( modulus*modulus*modulus ); - int count[modulus*modulus*modulus]; - memset( count , 0 , sizeof(int)*modulus*modulus*modulus ); -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=start ; i( _sNodes.treeNodes[i] ) ) - { - int d , off[3]; - _sNodes.treeNodes[i]->depthAndOffset( d , off ); - int idx = (modulus*modulus) * ( off[2]%modulus ) + modulus * ( off[1]%modulus ) + ( off[0]%modulus ); -#ifdef _OPENMP -#pragma omp atomic -#endif - count[idx]++; - } - - for( int i=0 ; i( _sNodes.treeNodes[i] ) ) - { - int d , off[3]; - _sNodes.treeNodes[i]->depthAndOffset( d , off ); - int idx = (modulus*modulus) * ( off[2]%modulus ) + modulus * ( off[1]%modulus ) + ( off[0]%modulus ); - indices[idx].push_back( i - start ); - } -} - -template< class Real > -template< class C , int FEMDegree > -void Octree< Real >::_DownSample( int highDepth , DenseNodeData< C , FEMDegree >& constraints ) const -{ - typedef typename TreeOctNode::NeighborKey< -BSplineEvaluationData< FEMDegree >::UpSampleStart , BSplineEvaluationData< FEMDegree >::UpSampleEnd > UpSampleKey; - - int lowDepth = highDepth-1; - if( lowDepth<_minDepth ) return; - - typename BSplineEvaluationData< FEMDegree >::UpSampleEvaluator upSampleEvaluator; - BSplineEvaluationData< FEMDegree >::SetUpSampleEvaluator( upSampleEvaluator , lowDepth-1 , _dirichlet ); - std::vector< UpSampleKey > neighborKeys( std::max< int >( 1 , threads ) ); - for( size_t i=0 ; i::UpSampleSize > upSampleStencil; - int lowCenter = _Dimension< FEMDegree >(lowDepth)>>1; - for( int i=0 ; i::UpSampleSize ; i++ ) for( int j=0 ; j::UpSampleSize ; j++ ) for( int k=0 ; k::UpSampleSize ; k++ ) - upSampleStencil.values[i][j][k] = - upSampleEvaluator.value( lowCenter , 2*lowCenter + i + BSplineEvaluationData< FEMDegree >::UpSampleStart ) * - upSampleEvaluator.value( lowCenter , 2*lowCenter + j + BSplineEvaluationData< FEMDegree >::UpSampleStart ) * - upSampleEvaluator.value( lowCenter , 2*lowCenter + k + BSplineEvaluationData< FEMDegree >::UpSampleStart ); - int dim = _Dimension< FEMDegree >(lowDepth); - - // Iterate over all (valid) parent nodes -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=_sNodes.begin(lowDepth) ; i<_sNodes.end(lowDepth) ; i++ ) if( _IsValidNode< FEMDegree >( _sNodes.treeNodes[i] ) ) - { - TreeOctNode* pNode = _sNodes.treeNodes[i]; - - UpSampleKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; - int d , off[3]; - pNode->depthAndOffset( d , off ); - - neighborKey.template getNeighbors< false >( pNode ); - - // Get the child neighbors - typename TreeOctNode::Neighbors< BSplineEvaluationData< FEMDegree >::UpSampleSize > neighbors; - neighborKey.template getChildNeighbors< false >( 0 , d , neighbors ); - - C& coarseConstraint = constraints[i]; - - // Want to make sure test if contained children are interior. - // This is more conservative because we are test that overlapping children are interior - bool isInterior = _IsInteriorlyOverlapped< FEMDegree , FEMDegree >( pNode ); - if( isInterior ) - { - for( int ii=0 ; ii::UpSampleSize ; ii++ ) for( int jj=0 ; jj::UpSampleSize ; jj++ ) for( int kk=0 ; kk::UpSampleSize ; kk++ ) - { - const TreeOctNode* cNode = neighbors.neighbors[ii][jj][kk]; - if( cNode ) coarseConstraint += (C)( constraints[ cNode->nodeData.nodeIndex ] * upSampleStencil.values[ii][jj][kk] ); - } - } - else - { - double upSampleValues[3][ BSplineEvaluationData< FEMDegree >::UpSampleSize ]; - for( int ii=0 ; ii::UpSampleSize ; ii++ ) - { - upSampleValues[0][ii] = upSampleEvaluator.value( off[0] , 2*off[0] + ii + BSplineEvaluationData< FEMDegree >::UpSampleStart ); - upSampleValues[1][ii] = upSampleEvaluator.value( off[1] , 2*off[1] + ii + BSplineEvaluationData< FEMDegree >::UpSampleStart ); - upSampleValues[2][ii] = upSampleEvaluator.value( off[2] , 2*off[2] + ii + BSplineEvaluationData< FEMDegree >::UpSampleStart ); - } - - for( int ii=0 ; ii::UpSampleSize ; ii++ ) for( int jj=0 ; jj::UpSampleSize ; jj++ ) - { - double dxy = upSampleValues[0][ii] * upSampleValues[1][jj]; - for( int kk=0 ; kk::UpSampleSize ; kk++ ) - { - const TreeOctNode* cNode = neighbors.neighbors[ii][jj][kk]; - if( _IsValidNode< FEMDegree >( cNode ) ) coarseConstraint += (C)( constraints[ cNode->nodeData.nodeIndex ] * dxy * upSampleValues[2][kk] ); - } - } - } - } -} -template< class Real > -template< class C , int FEMDegree> -void Octree< Real >::_UpSample( int highDepth , DenseNodeData< C , FEMDegree >& coefficients ) const -{ - static const int LeftDownSampleRadius = -( ( BSplineEvaluationData< FEMDegree >::DownSample0Start < BSplineEvaluationData< FEMDegree >::DownSample1Start ) ? BSplineEvaluationData< FEMDegree >::DownSample0Start : BSplineEvaluationData< FEMDegree >::DownSample1Start ); - static const int RightDownSampleRadius = ( ( BSplineEvaluationData< FEMDegree >::DownSample0End > BSplineEvaluationData< FEMDegree >::DownSample1End ) ? BSplineEvaluationData< FEMDegree >::DownSample0End : BSplineEvaluationData< FEMDegree >::DownSample1End ); - typedef TreeOctNode::NeighborKey< LeftDownSampleRadius , RightDownSampleRadius > DownSampleKey; - - int lowDepth = highDepth-1; - if( lowDepth<_minDepth ) return; - - typename BSplineEvaluationData< FEMDegree >::UpSampleEvaluator upSampleEvaluator; - BSplineEvaluationData< FEMDegree >::SetUpSampleEvaluator( upSampleEvaluator , lowDepth-1 , _dirichlet ); - std::vector< DownSampleKey > neighborKeys( std::max< int >( 1 , threads ) ); - for( size_t i=0 ; i::DownSample0Size > BSplineEvaluationData< FEMDegree >::DownSample1Size ? BSplineEvaluationData< FEMDegree >::DownSample0Size : BSplineEvaluationData< FEMDegree >::DownSample1Size; - Stencil< double , DownSampleSize > downSampleStencils[ Cube::CORNERS ]; - int lowCenter = _Dimension< FEMDegree >( lowDepth )>>1; - for( int c=0 ; c::DownSampleSize[cx] ; ii++ ) - for( int jj=0 ; jj::DownSampleSize[cy] ; jj++ ) - for( int kk=0 ; kk::DownSampleSize[cz] ; kk++ ) - downSampleStencils[c].values[ii][jj][kk] = - upSampleEvaluator.value( lowCenter + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cx] , 2*lowCenter + cx ) * - upSampleEvaluator.value( lowCenter + jj + BSplineEvaluationData< FEMDegree >::DownSampleStart[cy] , 2*lowCenter + cy ) * - upSampleEvaluator.value( lowCenter + kk + BSplineEvaluationData< FEMDegree >::DownSampleStart[cz] , 2*lowCenter + cz ) ; - } - int dim = _Dimension< FEMDegree >( lowDepth ); - - // For Dirichlet constraints, can't get to all children from parents because boundary nodes are invalid -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=_sNodes.begin(highDepth) ; i<_sNodes.end(highDepth) ; i++ ) if( _IsValidNode< FEMDegree >( _sNodes.treeNodes[i] ) ) - { - TreeOctNode *cNode = _sNodes.treeNodes[i] , *pNode = cNode->parent; - int c = (int)( cNode-pNode->children ); - - DownSampleKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; - int d , off[3]; - pNode->depthAndOffset( d , off ); - typename TreeOctNode::Neighbors< LeftDownSampleRadius + RightDownSampleRadius + 1 >& neighbors = neighborKey.template getNeighbors< false >( pNode ); - - // Want to make sure test if contained children are interior. - // This is more conservative because we are test that overlapping children are interior - bool isInterior = _IsInteriorlyOverlapped< FEMDegree , FEMDegree >( pNode ); - - C& fineCoefficient = coefficients[ cNode->nodeData.nodeIndex ]; - - int cx , cy , cz; - Cube::FactorCornerIndex( c , cx , cy , cz ); - - if( isInterior ) - { - for( int ii=0 ; ii::DownSampleSize[cx] ; ii++ ) for( int jj=0 ; jj::DownSampleSize[cy] ; jj++ ) - { - int _ii = ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cx] + LeftDownSampleRadius; - int _jj = jj + BSplineEvaluationData< FEMDegree >::DownSampleStart[cy] + LeftDownSampleRadius; - for( int kk=0 ; kk::DownSampleSize[cz] ; kk++ ) - { - int _kk = kk + BSplineEvaluationData< FEMDegree >::DownSampleStart[cz] + LeftDownSampleRadius; - const TreeOctNode* _pNode = neighbors.neighbors[_ii][_jj][_kk]; - if( _pNode ) fineCoefficient += (C)( coefficients[ _pNode->nodeData.nodeIndex ] * downSampleStencils[c].values[ii][jj][kk] ); - } - } - } - else - { - double downSampleValues[3][ BSplineEvaluationData< FEMDegree >::DownSample0Size > BSplineEvaluationData< FEMDegree >::DownSample1Size ? BSplineEvaluationData< FEMDegree >::DownSample0Size : BSplineEvaluationData< FEMDegree >::DownSample1Size ]; - - for( int ii=0 ; ii::DownSampleSize[cx] ; ii++ ) downSampleValues[0][ii] = upSampleEvaluator.value( off[0] + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cx] , 2*off[0] + cx ); - for( int ii=0 ; ii::DownSampleSize[cy] ; ii++ ) downSampleValues[1][ii] = upSampleEvaluator.value( off[1] + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cy] , 2*off[1] + cy ); - for( int ii=0 ; ii::DownSampleSize[cz] ; ii++ ) downSampleValues[2][ii] = upSampleEvaluator.value( off[2] + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cz] , 2*off[2] + cz ); - - for( int ii=0 ; ii::DownSampleSize[cx] ; ii++ ) for( int jj=0 ; jj::DownSampleSize[cy] ; jj++ ) - { - double dxy = downSampleValues[0][ii] * downSampleValues[1][jj]; - int _ii = ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cx] + LeftDownSampleRadius; - int _jj = jj + BSplineEvaluationData< FEMDegree >::DownSampleStart[cy] + LeftDownSampleRadius; - for( int kk=0 ; kk::DownSampleSize[cz] ; kk++ ) - { - int _kk = kk + BSplineEvaluationData< FEMDegree >::DownSampleStart[cz] + LeftDownSampleRadius; - const TreeOctNode* _pNode = neighbors.neighbors[_ii][_jj][_kk]; - if( _IsValidNode< FEMDegree >( _pNode ) ) fineCoefficient += (C)( coefficients[ _pNode->nodeData.nodeIndex ] * dxy * downSampleValues[2][kk] ); - } - } - } - } -} - -template< class Real > -template< class C , int FEMDegree > -void Octree< Real >::_UpSample( int highDepth , ConstPointer( C ) lowCoefficients , Pointer( C ) highCoefficients , bool dirichlet , int threads ) -{ - static const int LeftDownSampleRadius = -( ( BSplineEvaluationData< FEMDegree >::DownSample0Start < BSplineEvaluationData< FEMDegree >::DownSample1Start ) ? BSplineEvaluationData< FEMDegree >::DownSample0Start : BSplineEvaluationData< FEMDegree >::DownSample1Start ); - static const int RightDownSampleRadius = ( ( BSplineEvaluationData< FEMDegree >::DownSample0End > BSplineEvaluationData< FEMDegree >::DownSample1End ) ? BSplineEvaluationData< FEMDegree >::DownSample0End : BSplineEvaluationData< FEMDegree >::DownSample1End ); - typedef TreeOctNode::NeighborKey< LeftDownSampleRadius , RightDownSampleRadius > DownSampleKey; - - int lowDepth = highDepth-1; - if( lowDepth<1 ) return; - - typename BSplineEvaluationData< FEMDegree >::UpSampleEvaluator upSampleEvaluator; - BSplineEvaluationData< FEMDegree >::SetUpSampleEvaluator( upSampleEvaluator , lowDepth-1 , dirichlet ); - std::vector< DownSampleKey > neighborKeys( std::max< int >( 1 , threads ) ); - - static const int DownSampleSize = BSplineEvaluationData< FEMDegree >::DownSample0Size > BSplineEvaluationData< FEMDegree >::DownSample1Size ? BSplineEvaluationData< FEMDegree >::DownSample0Size : BSplineEvaluationData< FEMDegree >::DownSample1Size; - Stencil< double , DownSampleSize > downSampleStencils[ Cube::CORNERS ]; - int lowCenter = _Dimension< FEMDegree >( lowDepth )>>1; - for( int c=0 ; c::DownSampleSize[cx] ; ii++ ) - for( int jj=0 ; jj::DownSampleSize[cy] ; jj++ ) - for( int kk=0 ; kk::DownSampleSize[cz] ; kk++ ) - downSampleStencils[c].values[ii][jj][kk] = - upSampleEvaluator.value( lowCenter + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cx] , 2*lowCenter + cx ) * - upSampleEvaluator.value( lowCenter + jj + BSplineEvaluationData< FEMDegree >::DownSampleStart[cy] , 2*lowCenter + cy ) * - upSampleEvaluator.value( lowCenter + kk + BSplineEvaluationData< FEMDegree >::DownSampleStart[cz] , 2*lowCenter + cz ) ; - } - int lowDim = _Dimension< FEMDegree >( lowDepth ) , highDim = _Dimension< FEMDegree >( highDepth ); - - // Iterate over all parent nodes -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int k=0 ; k( lowDepth , i , j , k ); - - // Iterate over all the children of the parent - for( int c=0 ; c=highDim || jj<0 || jj>=highDim || kk<0 || kk>=highDim ) continue; - - C& highCoefficient = highCoefficients[ ii + jj*highDim + kk*highDim*highDim ]; - - if( isInterior ) - { - for( int ii=0 ; ii::DownSampleSize[cx] ; ii++ ) for( int jj=0 ; jj::DownSampleSize[cy] ; jj++ ) - { - int _i = i + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cx]; - int _j = j + jj + BSplineEvaluationData< FEMDegree >::DownSampleStart[cy]; - for( int kk=0 ; kk::DownSampleSize[cz] ; kk++ ) - { - int _k = k + kk + BSplineEvaluationData< FEMDegree >::DownSampleStart[cz]; - highCoefficient += (C)( lowCoefficients[ _i + _j*lowDim + _k*lowDim*lowDim ] * downSampleStencils[c].values[ii][jj][kk] ); - } - } - } - else - { - double downSampleValues[3][ BSplineEvaluationData< FEMDegree >::DownSample0Size > BSplineEvaluationData< FEMDegree >::DownSample1Size ? BSplineEvaluationData< FEMDegree >::DownSample0Size : BSplineEvaluationData< FEMDegree >::DownSample1Size ]; - - for( int ii=0 ; ii::DownSampleSize[cx] ; ii++ ) downSampleValues[0][ii] = upSampleEvaluator.value( off[0] + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cx] , 2*off[0] + cx ); - for( int ii=0 ; ii::DownSampleSize[cy] ; ii++ ) downSampleValues[1][ii] = upSampleEvaluator.value( off[1] + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cy] , 2*off[1] + cy ); - for( int ii=0 ; ii::DownSampleSize[cz] ; ii++ ) downSampleValues[2][ii] = upSampleEvaluator.value( off[2] + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cz] , 2*off[2] + cz ); - - for( int ii=0 ; ii::DownSampleSize[cx] ; ii++ ) for( int jj=0 ; jj::DownSampleSize[cy] ; jj++ ) - { - double dxy = downSampleValues[0][ii] * downSampleValues[1][jj]; - int _i = i + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cx]; - int _j = j + jj + BSplineEvaluationData< FEMDegree >::DownSampleStart[cy]; - if( _i>=0 && _i=0 && _j::DownSampleSize[cz] ; kk++ ) - { - int _k = k + kk + BSplineEvaluationData< FEMDegree >::DownSampleStart[cz]; - if( _k>=0 && _k -template< int FEMDegree > -Real Octree< Real >::_CoarserFunctionValue( Point3D< Real > p , const PointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* pointNode , const BSplineData< FEMDegree >& bsData , const DenseNodeData< Real , FEMDegree >& upSampledCoefficients ) const -{ - static const int SupportSize = BSplineEvaluationData< FEMDegree >::SupportSize; - static const int LeftSupportRadius = - BSplineEvaluationData< FEMDegree >::SupportStart; - static const int RightSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; - static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; - static const int RightPointSupportRadius = - BSplineEvaluationData< FEMDegree >::SupportStart; - - double pointValue = 0; - int depth = pointNode->depth(); - if( depth<=_minDepth ) return Real(0.); - - // Iterate over all basis functions that overlap the point at the coarser resolution - { - const typename TreeOctNode::Neighbors< SupportSize >& neighbors = neighborKey.neighbors[depth-1]; - int _d , _off[3]; - pointNode->parent->depthAndOffset( _d , _off ); - int fStart , fEnd; - BSplineData< FEMDegree >::FunctionSpan( _d-1 , fStart , fEnd ); - - double pointValues[ DIMENSION ][SupportSize]; - memset( pointValues , 0 , sizeof(double) * DIMENSION * SupportSize ); - - for( int dd=0 ; dd::FunctionIndex( _d-1 , _off[dd]+i ); - if( fIdx>=fStart && fIdx( _node ) ) _pointValue += pointValues[2][l] * double( upSampledCoefficients[_node->nodeData.nodeIndex] ); - } - pointValue += _pointValue * xyValue; - } - } - return Real( pointValue ); -} - -template< class Real > -template< int FEMDegree > -Real Octree< Real >::_FinerFunctionValue( Point3D< Real > p , const PointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* pointNode , const BSplineData< FEMDegree >& bsData , const DenseNodeData< Real , FEMDegree >& finerCoefficients ) const -{ - typename TreeOctNode::Neighbors< BSplineEvaluationData< FEMDegree >::SupportSize > childNeighbors; - static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; - static const int RightPointSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; - static const int LeftSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; - static const int RightSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; - - double pointValue = 0; - int depth = pointNode->depth(); - neighborKey.template getChildNeighbors< false >( p , depth , childNeighbors ); - for( int j=-LeftPointSupportRadius ; j<=RightPointSupportRadius ; j++ ) - for( int k=-LeftPointSupportRadius ; k<=RightPointSupportRadius ; k++ ) - for( int l=-LeftPointSupportRadius ; l<=RightPointSupportRadius ; l++ ) - { - const TreeOctNode* _node = childNeighbors.neighbors[j+LeftPointSupportRadius][k+LeftPointSupportRadius][l+LeftPointSupportRadius]; - if( _IsValidNode< FEMDegree >( _node ) ) - { - int fIdx[3]; - FunctionIndex< FEMDegree >( _node , fIdx ); - pointValue += - bsData.baseBSplines[ fIdx[0] ][LeftSupportRadius-j]( p[0] ) * - bsData.baseBSplines[ fIdx[1] ][LeftSupportRadius-k]( p[1] ) * - bsData.baseBSplines[ fIdx[2] ][LeftSupportRadius-l]( p[2] ) * - double( finerCoefficients[ _node->nodeData.nodeIndex ] ); - } - } - return Real( pointValue ); -} - -template< class Real > -template< int FEMDegree > -void Octree< Real >::_SetPointValuesFromCoarser( SparseNodeData< PointData< Real > , 0 >& pointInfo , int highDepth , const BSplineData< FEMDegree >& bsData , const DenseNodeData< Real , FEMDegree >& upSampledCoefficients ) -{ - int lowDepth = highDepth-1; - if( lowDepth<_minDepth ) return; - std::vector< PointData< Real > >& points = pointInfo.data; - std::vector< PointSupportKey< FEMDegree > > neighborKeys( std::max< int >( 1 , threads ) ); - for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) - { - PointSupportKey< FEMDegree >& neighborKey = neighborKeys[ omp_get_thread_num() ]; - int pIdx = pointInfo.index( _sNodes.treeNodes[i] ); - if( pIdx!=-1 ) - { - neighborKey.template getNeighbors< false >( _sNodes.treeNodes[i]->parent ); - points[ pIdx ].weightedCoarserDValue = (Real)( _CoarserFunctionValue( points[pIdx].position , neighborKey , _sNodes.treeNodes[i] , bsData , upSampledCoefficients ) - 0.5 ) * points[pIdx].weight; - } - } -} - -template< class Real > -template< int FEMDegree > -void Octree< Real >::_SetPointConstraintsFromFiner( const SparseNodeData< PointData< Real > , 0 >& pointInfo , int highDepth , const BSplineData< FEMDegree >& bsData , const DenseNodeData< Real , FEMDegree >& finerCoefficients , DenseNodeData< Real , FEMDegree >& coarserConstraints ) const -{ - static const int SupportSize = BSplineEvaluationData< FEMDegree >::SupportSize; - static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; - static const int RightPointSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; - static const int LeftSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; - static const int RightSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; - - const std::vector< PointData< Real > >& points = pointInfo.data; - // Note: We can't iterate over the finer point nodes as the point weights might be - // scaled incorrectly, due to the adaptive exponent. So instead, we will iterate - // over the coarser nodes and evaluate the finer solution at the associated points. - int lowDepth = highDepth-1; - if( lowDepth<_minDepth ) return; - size_t start = _sNodes.begin(lowDepth) , end = _sNodes.end(lowDepth) , range = end-start; - memset( coarserConstraints.data+start , 0 , sizeof( Real ) * range ); - std::vector< PointSupportKey< FEMDegree > > neighborKeys( std::max< int >( 1 , threads ) ); - for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) - { - PointSupportKey< FEMDegree >& neighborKey = neighborKeys[ omp_get_thread_num() ]; - int pIdx = pointInfo.index( _sNodes.treeNodes[i] ); - if( pIdx!=-1 ) - { - typename TreeOctNode::Neighbors< SupportSize >& neighbors = neighborKey.template getNeighbors< false >( _sNodes.treeNodes[i] ); - // Evaluate the solution @( depth ) at the current point @( depth-1 ) - { - Real finerPointDValue = (Real)( _FinerFunctionValue( points[pIdx].position , neighborKey , _sNodes.treeNodes[i] , bsData , finerCoefficients ) - 0.5 ) * points[pIdx].weight; - Point3D< Real > p = points[ pIdx ].position; - // Update constraints for all nodes @( depth-1 ) that overlap the point - int d , idx[3]; - neighbors.neighbors[LeftPointSupportRadius][LeftPointSupportRadius][LeftPointSupportRadius]->depthAndOffset( d, idx ); - // Set the (offset) index to the top-left-front corner of the 3x3x3 block of b-splines - // overlapping the point. - idx[0] = BinaryNode::CenterIndex( d , idx[0] ); - idx[1] = BinaryNode::CenterIndex( d , idx[1] ); - idx[2] = BinaryNode::CenterIndex( d , idx[2] ); - for( int x=-LeftPointSupportRadius ; x<=RightPointSupportRadius ; x++ ) - for( int y=-LeftPointSupportRadius ; y<=RightPointSupportRadius ; y++ ) - for( int z=-LeftPointSupportRadius ; z<=RightPointSupportRadius ; z++ ) - if( _IsValidNode< FEMDegree >( neighbors.neighbors[x+LeftPointSupportRadius][y+LeftPointSupportRadius][z+LeftPointSupportRadius] ) ) - { -#ifdef _OPENMP -#pragma omp atomic -#endif - coarserConstraints[ neighbors.neighbors[x+LeftPointSupportRadius][y+LeftPointSupportRadius][z+LeftPointSupportRadius]->nodeData.nodeIndex - _sNodes.begin(lowDepth) ] += - Real( - bsData.baseBSplines[idx[0]+x][LeftSupportRadius-x]( p[0] ) * - bsData.baseBSplines[idx[1]+y][LeftSupportRadius-y]( p[1] ) * - bsData.baseBSplines[idx[2]+z][LeftSupportRadius-z]( p[2] ) * - finerPointDValue - ); - } - } - } - } -} - -template< class Real > -template< int FEMDegree > -int Octree< Real >::_SetMatrixRow( const SparseNodeData< PointData< Real > , 0 >& pointInfo , const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& neighbors , Pointer( MatrixEntry< Real > ) row , int offset , const typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator& integrator , const Stencil< double , BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& stencil , const BSplineData< FEMDegree >& bsData ) const -{ - static const int SupportSize = BSplineEvaluationData< FEMDegree >::SupportSize; - static const int OverlapRadius = - BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; - static const int OverlapSize = BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize; - static const int LeftSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; - static const int RightSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; - static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; - static const int RightPointSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; - - const std::vector< PointData< Real > >& points = pointInfo.data; - bool hasYZPoints[SupportSize] , hasZPoints[SupportSize][SupportSize]; - Real diagonal = 0; - // Given a node: - // -- for each node in its support: - // ---- if the supporting node contains a point: - // ------ evaluate the x, y, and z B-splines of the nodes supporting the point - // splineValues \in [-LeftSupportRadius,RightSupportRadius] x [-LeftSupportRadius,RightSupportRadius] x [-LeftSupportRadius,RightSupportRadius] x [0,Dimension) x [-LeftPointSupportRadius,RightPointSupportRadius] - Real splineValues[SupportSize][SupportSize][SupportSize][DIMENSION][SupportSize]; - memset( splineValues , 0 , sizeof( Real ) * SupportSize * SupportSize * SupportSize * DIMENSION *SupportSize ); - - int count = 0; - const TreeOctNode* node = neighbors.neighbors[OverlapRadius][OverlapRadius][OverlapRadius]; - int d , off[3]; - node->depthAndOffset( d , off ); - int fStart , fEnd; - BSplineData< FEMDegree >::FunctionSpan( d-1 , fStart , fEnd ); - bool isInterior = _IsInteriorlyOverlapped< FEMDegree , FEMDegree >( node ); - - if( _constrainValues ) - { - // Iterate over all neighboring nodes that may have a constraining point - // -- For each one, compute the values of the spline functions supported on the point - for( int j=0 ; j( _node ) && pointInfo.index( _node )!=-1 ) - { - int pOff[] = { off[0]+j , off[1]+k , off[2]+l }; - hasYZPoints[jj] = hasZPoints[jj][kk] = true; - const PointData< Real >& pData = points[ pointInfo.index( _node ) ]; - Real (*_splineValues)[SupportSize] = splineValues[jj][kk][ll]; - Real weight = pData.weight; - Point3D< Real > p = pData.position; - // Evaluate the point p at all the nodes whose functions have it in their support - for( int s=-LeftPointSupportRadius ; s<=RightPointSupportRadius ; s++ ) for( int dd=0 ; dd::FunctionIndex( d-1 , pOff[dd]+s ); - if( fIdx>=fStart && fIdx( _node ) && pointInfo.index( _node )!=-1 ) - // Iterate over all neighbors whose support contains the point and accumulate the mutual integral - for( int ii=-LeftPointSupportRadius ; ii<=RightPointSupportRadius ; ii++ ) - for( int jj=-LeftPointSupportRadius ; jj<=RightPointSupportRadius ; jj++ ) - for( int kk=-LeftPointSupportRadius ; kk<=RightPointSupportRadius ; kk++ ) - { - TreeOctNode* _node = neighbors.neighbors[i+ii+OverlapRadius][j+jj+OverlapRadius][k+kk+OverlapRadius]; - if( _IsValidNode< FEMDegree >( _node ) ) - pointValues[i+ii+OverlapRadius][j+jj+OverlapRadius][k+kk+OverlapRadius] += - _splineValues[0][ii+LeftPointSupportRadius ] * _splineValues[1][jj+LeftPointSupportRadius ] * _splineValues[2][kk+LeftPointSupportRadius ]; - } - } - } - pointValues[OverlapRadius][OverlapRadius][OverlapRadius] = diagonal; - int nodeIndex = neighbors.neighbors[OverlapRadius][OverlapRadius][OverlapRadius]->nodeData.nodeIndex; - if( isInterior ) // General case, so try to make fast - { - const TreeOctNode* const * _nodes = &neighbors.neighbors[0][0][0]; - const double* _stencil = &stencil.values[0][0][0]; - Real* _values = &pointValues[0][0][0]; - const static int CenterIndex = OverlapSize*OverlapSize*OverlapRadius + OverlapSize*OverlapRadius + OverlapRadius; - if( _constrainValues ) for( int i=0 ; i( nodeIndex-offset , _values[CenterIndex] ); - for( int i=0 ; i( _nodes[i]->nodeData.nodeIndex-offset , _values[i] ); - } - else - { - int d , off[3]; - node->depthAndOffset( d , off ); - Real temp = Real( SystemCoefficients< FEMDegree , FEMDegree >::GetLaplacian( integrator , off , off ) ); - if( _constrainValues ) temp += pointValues[OverlapRadius][OverlapRadius][OverlapRadius]; - row[count++] = MatrixEntry< Real >( nodeIndex-offset , temp ); - for( int x=0 ; x( neighbors.neighbors[x][y][z] ) ) - { - const TreeOctNode* _node = neighbors.neighbors[x][y][z]; - int _d , _off[3]; - _node->depthAndOffset( _d , _off ); - Real temp = Real( SystemCoefficients< FEMDegree , FEMDegree >::GetLaplacian( integrator , _off , off ) ); - if( _constrainValues ) temp += pointValues[x][y][z]; - row[count++] = MatrixEntry< Real >( _node->nodeData.nodeIndex-offset , temp ); - } - } - return count; -} - -template< class Real > -template< int FEMDegree > -int Octree< Real >::_GetMatrixAndUpdateConstraints( const SparseNodeData< PointData< Real > , 0 >& pointInfo , SparseMatrix< Real >& matrix , DenseNodeData< Real , FEMDegree >& constraints , typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator& integrator , typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator , const BSplineData< FEMDegree >& bsData , int depth , const DenseNodeData< Real , FEMDegree >* metSolution , bool coarseToFine ) -{ - static const int OverlapRadius = - BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; - static const int OverlapSize = BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize; - - size_t start = _sNodes.begin(depth) , end = _sNodes.end(depth) , range = end-start; - Stencil< double , OverlapSize > stencil , stencils[2][2][2]; - SystemCoefficients< FEMDegree , FEMDegree >::SetCentralLaplacianStencil ( integrator , stencil ); - SystemCoefficients< FEMDegree , FEMDegree >::SetCentralLaplacianStencils( childIntegrator , stencils ); - matrix.Resize( (int)range ); - std::vector< AdjacenctNodeKey > neighborKeys( std::max< int >( 1 , threads ) ); - for( size_t i=0 ; i( _sNodes.treeNodes[i+start] ) ) - { - AdjacenctNodeKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; - TreeOctNode* node = _sNodes.treeNodes[i+start]; - // Get the matrix row size - typename TreeOctNode::Neighbors< OverlapSize > neighbors; - neighborKey.template getNeighbors< false , OverlapRadius , OverlapRadius >( node , neighbors ); - int count = _GetMatrixRowSize< FEMDegree >( neighbors ); - - // Allocate memory for the row -#ifdef _OPENMP -#pragma omp critical (matrix_set_row_size) -#endif - matrix.SetRowSize( i , count ); - - // Set the row entries - matrix.rowSizes[i] = _SetMatrixRow( pointInfo , neighbors , matrix[i] , (int)start , integrator , stencil , bsData ); - if( depth>_minDepth ) - { - // Offset the constraints using the solution from lower resolutions. - int x , y , z , c; - if( node->parent ) - { - c = int( node - node->parent->children ); - Cube::FactorCornerIndex( c , x , y , z ); - } - else x = y = z = 0; - if( coarseToFine ) - { - typename TreeOctNode::Neighbors< OverlapSize > pNeighbors; - neighborKey.template getNeighbors< false , OverlapRadius , OverlapRadius >( node->parent , pNeighbors ); - _UpdateConstraintsFromCoarser( pointInfo , neighbors , pNeighbors , node , constraints , *metSolution , childIntegrator , stencils[x][y][z] , bsData ); - } - } - } - return 1; -} - -template< class Real > -template< int FEMDegree > -int Octree< Real >::_GetSliceMatrixAndUpdateConstraints( const SparseNodeData< PointData< Real > , 0 >& pointInfo , SparseMatrix< Real >& matrix , DenseNodeData< Real , FEMDegree >& constraints , typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator& integrator , typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator , const BSplineData< FEMDegree >& bsData , int depth , int slice , const DenseNodeData< Real , FEMDegree >& metSolution , bool coarseToFine ) -{ - static const int OverlapSize = BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize; - static const int OverlapRadius = -BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; - - int nStart = _sNodes.begin( depth , slice ) , nEnd = _sNodes.end( depth , slice ); - size_t range = nEnd-nStart; - Stencil< double , OverlapSize > stencil , stencils[2][2][2]; - SystemCoefficients< FEMDegree , FEMDegree >::SetCentralLaplacianStencil ( integrator , stencil ); - SystemCoefficients< FEMDegree , FEMDegree >::SetCentralLaplacianStencils( childIntegrator , stencils ); - - matrix.Resize( (int)range ); - std::vector< AdjacenctNodeKey > neighborKeys( std::max< int >( 1 , threads ) ); - for( size_t i=0 ; i( _sNodes.treeNodes[i+nStart] ) ) - { - AdjacenctNodeKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; - TreeOctNode* node = _sNodes.treeNodes[i+nStart]; - // Get the matrix row size - typename TreeOctNode::Neighbors< OverlapSize > neighbors; - neighborKey.template getNeighbors< false , OverlapRadius , OverlapRadius >( node , neighbors ); - int count = _GetMatrixRowSize< FEMDegree >( neighbors ); - - // Allocate memory for the row -#ifdef _OPENMP -#pragma omp critical (matrix_set_row_size) -#endif - { - matrix.SetRowSize( i , count ); - } - - // Set the row entries - matrix.rowSizes[i] = _SetMatrixRow( pointInfo , neighbors , matrix[i] , _sNodes.begin(depth,slice) , integrator , stencil , bsData ); - - - if( depth>_minDepth ) - { - // Offset the constraints using the solution from lower resolutions. - int x , y , z , c; - if( node->parent ) - { - c = int( node - node->parent->children ); - Cube::FactorCornerIndex( c , x , y , z ); - } - else x = y = z = 0; - if( coarseToFine ) - { - typename TreeOctNode::Neighbors< OverlapSize > pNeighbors; - neighborKey.template getNeighbors< false, OverlapRadius , OverlapRadius >( node->parent , pNeighbors ); - _UpdateConstraintsFromCoarser( pointInfo , neighbors , pNeighbors , node , constraints , metSolution , childIntegrator , stencils[x][y][z] , bsData ); - } - } - } - return 1; -} - -template< class Real > -template< int FEMDegree > -int Octree< Real >::_SolveSystemGS( const BSplineData< FEMDegree >& bsData , SparseNodeData< PointData< Real > , 0 >& pointInfo , int depth , DenseNodeData< Real , FEMDegree >& solution , DenseNodeData< Real , FEMDegree >& constraints , DenseNodeData< Real , FEMDegree >& metSolutionConstraints , int iters , bool coarseToFine , bool showResidual , double* bNorm2 , double* inRNorm2 , double* outRNorm2 , bool forceSilent ) -{ - const int OverlapRadius = -BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; - typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator integrator; - typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator childIntegrator; - BSplineIntegrationData< FEMDegree , FEMDegree >::SetIntegrator( integrator , depth-1 , _dirichlet , _dirichlet ); - if( depth>_minDepth ) BSplineIntegrationData< FEMDegree , FEMDegree >::SetChildIntegrator( childIntegrator , depth-2 , _dirichlet , _dirichlet ); - - DenseNodeData< Real , FEMDegree > metSolution , metConstraints; - if( coarseToFine ) metSolution = metSolutionConstraints; // This stores the up-sampled solution up to depth-2 - else metConstraints = metSolutionConstraints; // This stores the down-sampled constraints up to depth - - double _maxMemoryUsage = maxMemoryUsage; - maxMemoryUsage = 0; - int slices = _Dimension< FEMDegree >(depth); - double systemTime=0. , solveTime=0. , updateTime=0. , evaluateTime = 0.; - - if( coarseToFine ) - { - if( depth>_minDepth ) - { - // Up-sample the cumulative change in solution @(depth-2) into the cumulative change in solution @(depth-1) - if( depth-2>=_minDepth ) _UpSample( depth-1 , metSolution ); - // Add in the change in solution @(depth-1) -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=_sNodes.begin(depth-1) ; i<_sNodes.end(depth-1) ; i++ ) metSolution[i] += solution[i]; - // Evaluate the points @(depth) using the cumulative change in solution @(depth-1) - if( _constrainValues ) - { - evaluateTime = Time(); - _SetPointValuesFromCoarser( pointInfo , depth , bsData , metSolution ); - evaluateTime = Time() - evaluateTime; - } - } - } - else if( depth<_sNodes.levels()-1 ) - for( int i=_sNodes.begin(depth) ; i<_sNodes.end(depth) ; i++ ) constraints[i] -= metConstraints[i]; - double bNorm=0 , inRNorm=0 , outRNorm=0; - if( depth>=_minDepth ) - { - // Add padding space if we are computing residuals - int frontOffset = ( showResidual || inRNorm2 ) ? OverlapRadius : 0; - int backOffset = ( showResidual || outRNorm2 ) ? OverlapRadius : 0; - // Set the number of in-memory slices required for a temporally blocked solver - int solveSlices = std::min< int >( OverlapRadius*iters - (OverlapRadius-1) , slices ) , matrixSlices = std::max< int >( 1 , std::min< int >( solveSlices+frontOffset+backOffset , slices ) ); - // The list of matrices for each in-memory slices - std::vector< SparseMatrix< Real > > _M( matrixSlices ); - // The list of multi-colored indices for each in-memory slice - std::vector< std::vector< std::vector< int > > > __mcIndices( std::max< int >( 0 , solveSlices ) ); - - int dir = coarseToFine ? -1 : 1 , start = coarseToFine ? slices-1 : 0 , end = coarseToFine ? -1 : slices; - for( int frontSlice=start-frontOffset*dir , backSlice = frontSlice-OverlapRadius*(iters-1)*dir ; backSlice!=end+backOffset*dir ; frontSlice+=dir , backSlice+=dir ) - { - double t; - if( frontSlice+frontOffset*dir>=0 && frontSlice+frontOffset*dir ) start = _M[_s][j]; - ConstPointer( MatrixEntry< Real > ) end = start + _M[_s].rowSizes[j]; - ConstPointer( MatrixEntry< Real > ) e; - for( e=start ; e!=end ; e++ ) temp += X[ e->N ] * e->Value; - bNorm += B[j]*B[j]; - inRNorm += (temp-B[j]) * (temp-B[j]); - } - else if( bNorm2 ) -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) reduction( + : bNorm ) -#endif - for( int j=0 ; j<_M[_s].rows ; j++ ) bNorm += B[j]*B[j]; - } - t = Time(); - // Compute the multicolor indices - if( iters && frontSlice>=0 && frontSlice( _sNodes.begin(depth,s) , _sNodes.end(depth,s) , __mcIndices[__s] ); - } - // Advance through the in-memory slices, taking an appropriately sized stride - for( int slice=frontSlice ; slice*dir>=backSlice*dir ; slice-=OverlapRadius*dir ) - if( slice>=0 && slice::SolveGS( __mcIndices[__s] , _M[_s] , B , X , !coarseToFine , threads ); - } - solveTime += Time() - t; - // Compute residuals - if( (showResidual || outRNorm2) && backSlice-backOffset*dir>=0 && backSlice-backOffset*dir ) start = _M[_s][j]; - ConstPointer( MatrixEntry< Real > ) end = start + _M[_s].rowSizes[j]; - ConstPointer( MatrixEntry< Real > ) e; - for( e=start ; e!=end ; e++ ) temp += X[ e->N ] * e->Value; - outRNorm += (temp-B[j]) * (temp-B[j]); - } - } - } - } - - if( bNorm2 ) bNorm2[depth] = bNorm; - if( inRNorm2 ) inRNorm2[depth] = inRNorm; - if( outRNorm2 ) outRNorm2[depth] = outRNorm; - if( showResidual && iters ) - { - for( int i=0 ; i %.4e -> %.4e (%.2e) [%d]\n" , sqrt( bNorm ) , sqrt( inRNorm ) , sqrt( outRNorm ) , sqrt( outRNorm/bNorm ) , iters ); - } - - if( !coarseToFine && depth>_minDepth ) - { - // Explicitly compute the restriction of the met solution onto the coarser nodes - // and down-sample the previous accumulation - { - _UpdateConstraintsFromFiner( childIntegrator , bsData , depth , solution , metConstraints ); - if( _constrainValues ) _SetPointConstraintsFromFiner( pointInfo , depth , bsData , solution , metConstraints ); - if( depth<_sNodes.levels()-1 ) _DownSample( depth , metConstraints ); - } - } - MemoryUsage(); - if( !forceSilent ) DumpOutput( "\tEvaluated / Got / Solved in: %6.3f / %6.3f / %6.3f\t(%.3f MB)\n" , evaluateTime , systemTime , solveTime , float( maxMemoryUsage ) ); - maxMemoryUsage = std::max< double >( maxMemoryUsage , _maxMemoryUsage ); - - return iters; -} - -template< class Real > -template< int FEMDegree > -int Octree< Real >::_SolveSystemCG( const BSplineData< FEMDegree >& bsData , SparseNodeData< PointData< Real > , 0 >& pointInfo , int depth , DenseNodeData< Real , FEMDegree >& solution , DenseNodeData< Real , FEMDegree >& constraints , DenseNodeData< Real , FEMDegree >& metSolutionConstraints , int iters , bool coarseToFine , bool showResidual , double* bNorm2 , double* inRNorm2 , double* outRNorm2 , double accuracy ) -{ - typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator integrator; - typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator childIntegrator; - BSplineIntegrationData< FEMDegree , FEMDegree >::SetIntegrator( integrator , depth-1 , _dirichlet , _dirichlet ); - if( depth>_minDepth ) BSplineIntegrationData< FEMDegree , FEMDegree >::SetChildIntegrator( childIntegrator , depth-2 , _dirichlet , _dirichlet ); - - DenseNodeData< Real , FEMDegree > metSolution , metConstraints; - if( coarseToFine ) metSolution = metSolutionConstraints; // This stores the up-sampled solution up to depth-2 - else metConstraints = metSolutionConstraints; // This stores the down-sampled constraints up to depth - double _maxMemoryUsage = maxMemoryUsage; - maxMemoryUsage = 0; - int iter = 0; - Pointer( Real ) X = solution.data + _sNodes.begin( depth ); - Pointer( Real ) B = constraints.data + _sNodes.begin( depth ); - SparseMatrix< Real > M; - double systemTime=0. , solveTime=0. , updateTime=0. , evaluateTime = 0.; - - if( coarseToFine ) - { - if( depth>_minDepth ) - { - // Up-sample the cumulative change in solution @(depth-2) into the cumulative change in solution @(depth-1) - if( depth-2>=_minDepth ) _UpSample( depth-1 , metSolution ); - // Add in the change in solution @(depth-1) -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=_sNodes.begin(depth-1) ; i<_sNodes.end(depth-1) ; i++ ) metSolution[i] += solution[i]; - // Evaluate the points @(depth) using the cumulative change in solution @(depth-1) - if( _constrainValues ) - { - evaluateTime = Time(); - _SetPointValuesFromCoarser( pointInfo , depth , bsData , metSolution ); - evaluateTime = Time() - evaluateTime; - } - } - } - else if( depth<_sNodes.levels()-1 ) - for( int i=_sNodes.begin(depth) ; i<_sNodes.end(depth) ; i++ ) constraints[i] -= metConstraints[i]; - - // Get the system matrix (and adjust the right-hand-side based on the coarser solution if prolonging) - systemTime = Time(); - _GetMatrixAndUpdateConstraints( pointInfo , M , constraints , integrator , childIntegrator , bsData , depth , coarseToFine ? &metSolution : NULL , coarseToFine ); - systemTime = Time()-systemTime; - - solveTime = Time(); - // Solve the linear system - accuracy = Real( accuracy / 100000 ) * M.rows; - int dim = _Dimension< FEMDegree >( depth ); - int nonZeroRows = 0; - for( int i=0 ; i( _sNodes.size(depth) ); - if( addDCTerm ) M.MultiplyAndAddAverage( ( ConstPointer( Real ) )X , temp , threads ); - else M.Multiply( ( ConstPointer( Real ) )X , temp , threads ); -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=0 ; i<_sNodes.size(depth) ; i++ ) temp[i] -= B[i]; -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) reduction( + : inRNorm ) -#endif - for( int i=0 ; i<_sNodes.size(depth) ; i++ ) inRNorm += temp[i] * temp[i]; - FreePointer( temp ); - } - - iters = std::min< int >( nonZeroRows , iters ); - if( iters ) iter += SparseMatrix< Real >::SolveCG( M , ( ConstPointer( Real ) )B , iters , X , Real( accuracy ) , 0 , addDCTerm , false , threads ); - solveTime = Time()-solveTime; - if( showResidual || outRNorm2 ) - { - outRNorm = 0; - Pointer( Real ) temp = AllocPointer< Real >( _sNodes.size(depth) ); - if( addDCTerm ) M.MultiplyAndAddAverage( ( ConstPointer( Real ) )X , temp , threads ); - else M.Multiply( ( ConstPointer( Real ) )X , temp , threads ); -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=0 ; i<_sNodes.size(depth) ; i++ ) temp[i] -= B[i]; -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) reduction( + : outRNorm ) -#endif - for( int i=0 ; i<_sNodes.size(depth) ; i++ ) outRNorm += temp[i] * temp[i]; - FreePointer( temp ); - } - if( bNorm2 ) bNorm2[depth] = bNorm * bNorm; - if( inRNorm2 ) inRNorm2[depth] = inRNorm * inRNorm; - if( outRNorm2 ) outRNorm2[depth] = outRNorm * outRNorm; - if( showResidual && iters ) - { - for( int i=0 ; i %.4e -> %.4e (%.2e) [%d]\n" , bNorm , inRNorm , outRNorm , outRNorm/bNorm , iter ); - } - - if( !coarseToFine && depth>_minDepth ) - { - // Explicitly compute the restriction of the met solution onto the coarser nodes - // and down-sample the previous accumulation - { - _UpdateConstraintsFromFiner( childIntegrator , bsData , depth , solution , metConstraints ); - if( _constrainValues ) _SetPointConstraintsFromFiner( pointInfo , depth , bsData , solution , metConstraints ); - if( depth<_sNodes.levels()-1 ) _DownSample( depth , metConstraints ); - } - } - - MemoryUsage(); - DumpOutput( "\tEvaluated / Got / Solved in: %6.3f / %6.3f / %6.3f\t(%.3f MB)\n" , evaluateTime , systemTime , solveTime , float( maxMemoryUsage ) ); - maxMemoryUsage = std::max< double >( maxMemoryUsage , _maxMemoryUsage ); - return iter; -} - -template< class Real > -template< int FEMDegree > -int Octree< Real >::_GetMatrixRowSize( const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& neighbors ) const -{ - static const int OverlapSize = BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize; - static const int OverlapRadius = - BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; - - int count = 0; - int nodeIndex = neighbors.neighbors[OverlapRadius][OverlapRadius][OverlapRadius]->nodeData.nodeIndex; - const TreeOctNode* const * _nodes = &neighbors.neighbors[0][0][0]; - for( int i=0 ; i( _nodes[i] ) ) count++; - return count; -} - - -template< class Real > -template< int FEMDegree1 , int FEMDegree2 > -void Octree< Real >::_SetParentOverlapBounds( const TreeOctNode* node , int& startX , int& endX , int& startY , int& endY , int& startZ , int& endZ ) -{ - const int OverlapStart = BSplineIntegrationData< FEMDegree1 , FEMDegree2 >::OverlapStart; - - if( node->parent ) - { - int x , y , z , c = int( node - node->parent->children ); - Cube::FactorCornerIndex( c , x , y , z ); - startX = BSplineIntegrationData< FEMDegree1 , FEMDegree2 >::ParentOverlapStart[x]-OverlapStart , endX = BSplineIntegrationData< FEMDegree1 , FEMDegree2 >::ParentOverlapEnd[x]-OverlapStart+1; - startY = BSplineIntegrationData< FEMDegree1 , FEMDegree2 >::ParentOverlapStart[y]-OverlapStart , endY = BSplineIntegrationData< FEMDegree1 , FEMDegree2 >::ParentOverlapEnd[y]-OverlapStart+1; - startZ = BSplineIntegrationData< FEMDegree1 , FEMDegree2 >::ParentOverlapStart[z]-OverlapStart , endZ = BSplineIntegrationData< FEMDegree1 , FEMDegree2 >::ParentOverlapEnd[z]-OverlapStart+1; - } -} - -// It is assumed that at this point, the evaluationg of the current depth's points, using the coarser resolution solution -// has already happened -template< class Real > -template< int FEMDegree > -void Octree< Real >::_UpdateConstraintsFromCoarser( const SparseNodeData< PointData< Real > , 0 >& pointInfo , const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& neighbors , const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& pNeighbors , TreeOctNode* node , DenseNodeData< Real , FEMDegree >& constraints , const DenseNodeData< Real , FEMDegree >& metSolution , const typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator , const Stencil< double , BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& lapStencil , const BSplineData< FEMDegree >& bsData ) const -{ - static const int OverlapSize = BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; - static const int LeftSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; - static const int RightSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; - static const int OverlapRadius = - BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; - - const std::vector< PointData< Real > >& points = pointInfo.data; - if( node->depth()<=_minDepth ) return; - // This is a conservative estimate as we only need to make sure that the parent nodes don't overlap the child (not the parent itself) - bool isInterior = _IsInteriorlyOverlapped< FEMDegree , FEMDegree >( node->parent ); - int d , off[3]; - node->depthAndOffset( d , off ); - Real constraint = Real( 0 ); - // Offset the constraints using the solution from lower resolutions. - int startX , endX , startY , endY , startZ , endZ; - _SetParentOverlapBounds< FEMDegree , FEMDegree >( node , startX , endX , startY , endY , startZ , endZ ); - - for( int x=startX ; x( pNeighbors.neighbors[x][y][z] ) ) - { - const TreeOctNode* _node = pNeighbors.neighbors[x][y][z]; - Real _solution = metSolution[ _node->nodeData.nodeIndex ]; - { - if( isInterior ) constraints[ node->nodeData.nodeIndex ] -= Real( lapStencil.values[x][y][z] * _solution ); - else - { - int _d , _off[3]; - _node->depthAndOffset( _d , _off ); - constraints[ node->nodeData.nodeIndex ] -= Real( SystemCoefficients< FEMDegree , FEMDegree >::GetLaplacian( childIntegrator , _off , off ) * _solution ); - } - } - } - if( _constrainValues ) - { - double constraint = 0; - int fIdx[3]; - FunctionIndex< FEMDegree >( node , fIdx ); - // Evaluate the current node's basis function at adjacent points - for( int x=-LeftSupportRadius ; x<=RightSupportRadius ; x++ ) for( int y=-LeftSupportRadius ; y<=RightSupportRadius ; y++ ) for( int z=-LeftSupportRadius ; z<=RightSupportRadius ; z++ ) - { - const TreeOctNode* _node = neighbors.neighbors[x+OverlapRadius][y+OverlapRadius][z+OverlapRadius]; - if( _IsValidNode< 0 >( _node ) && pointInfo.index( _node )!=-1 ) - { - const PointData< Real >& pData = points[ pointInfo.index( _node ) ]; - Point3D< Real > p = pData.position; - constraint += - bsData.baseBSplines[ fIdx[0] ][x+LeftSupportRadius]( p[0] ) * - bsData.baseBSplines[ fIdx[1] ][y+LeftSupportRadius]( p[1] ) * - bsData.baseBSplines[ fIdx[2] ][z+LeftSupportRadius]( p[2] ) * - pData.weightedCoarserDValue; - } - } - constraints[ node->nodeData.nodeIndex ] -= Real( constraint ); - } -} - -// Given the solution @( depth ) add to the met constraints @( depth-1 ) -template< class Real > -template< int FEMDegree > -void Octree< Real >::_UpdateConstraintsFromFiner( const typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator , const BSplineData< FEMDegree >& bsData , int depth , const DenseNodeData< Real , FEMDegree >& fineSolution , DenseNodeData< Real , FEMDegree >& coarseConstraints ) const -{ - static const int OverlapSize = BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize; - static const int OverlapRadius = - BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; - typedef typename TreeOctNode::NeighborKey< -BSplineEvaluationData< FEMDegree >::SupportStart , BSplineEvaluationData< FEMDegree >::SupportEnd >SupportKey; - - if( depth<=_minDepth ) return; - // Get the stencil describing the Laplacian relating coefficients @(depth) with coefficients @(depth-1) - Stencil< double , OverlapSize > stencils[2][2][2]; - SystemCoefficients< FEMDegree , FEMDegree >::SetCentralLaplacianStencils( childIntegrator , stencils ); - size_t start = _sNodes.begin(depth) , end = _sNodes.end(depth) , range = end-start; - int lStart = _sNodes.begin(depth-1); - memset( coarseConstraints.data + _sNodes.begin(depth-1) , 0 , sizeof(Real)*_sNodes.size(depth-1) ); - - // Iterate over the nodes @( depth ) - std::vector< SupportKey > neighborKeys( std::max< int >( 1 , threads ) ); - for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) - { - SupportKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; - TreeOctNode* node = _sNodes.treeNodes[i]; - - // Offset the coarser constraints using the solution from the current resolutions. - int x , y , z , c; - c = int( node - node->parent->children ); - Cube::FactorCornerIndex( c , x , y , z ); - { - typename TreeOctNode::Neighbors< OverlapSize > pNeighbors; - neighborKey.template getNeighbors< false , OverlapRadius , OverlapRadius >( node->parent , pNeighbors ); - const Stencil< double , OverlapSize >& lapStencil = stencils[x][y][z]; - - bool isInterior = _IsInteriorlyOverlapped< FEMDegree , FEMDegree >( node->parent ); - int d , off[3]; - node->depthAndOffset( d , off ); - - // Offset the constraints using the solution from finer resolutions. - int startX , endX , startY , endY , startZ , endZ; - _SetParentOverlapBounds< FEMDegree , FEMDegree >( node , startX , endX , startY , endY , startZ , endZ ); - - Real solution = fineSolution[ node->nodeData.nodeIndex ]; - for( int x=startX ; x( pNeighbors.neighbors[x][y][z] ) ) - { - const TreeOctNode* _node = pNeighbors.neighbors[x][y][z]; - if( isInterior ) -#ifdef _OPENMP -#pragma omp atomic -#endif - coarseConstraints[ _node->nodeData.nodeIndex ] += Real( lapStencil.values[x][y][z] * solution ); - else - { - int _d , _off[3]; - _node->depthAndOffset( _d , _off ); -#ifdef _OPENMP -#pragma omp atomic -#endif - coarseConstraints[ _node->nodeData.nodeIndex ] += Real( SystemCoefficients< FEMDegree , FEMDegree >::GetLaplacian( childIntegrator , _off , off ) * solution ); - } - } - } - } -} - - -template< class Real > -template< int FEMDegree > -DenseNodeData< Real , FEMDegree > Octree< Real >::SolveSystem( SparseNodeData< PointData< Real > , 0 >& pointInfo , DenseNodeData< Real , FEMDegree >& constraints , bool showResidual , int iters , int maxSolveDepth , int cgDepth , double accuracy ) -{ - BSplineData< FEMDegree > bsData; - bsData.set( maxSolveDepth , _dirichlet ); - - maxSolveDepth++; - int iter=0; - iters = std::max< int >( 0 , iters ); - - DenseNodeData< Real , FEMDegree > solution( _sNodes.size() ); - memset( solution.data , 0 , sizeof(Real)*_sNodes.size() ); - - solution[0] = 0; - - DenseNodeData< Real , FEMDegree > metSolution( _sNodes.end( _sNodes.levels()-2 ) ); - memset( metSolution.data , 0 , sizeof(Real)*_sNodes.end( _sNodes.levels()-2 ) ); - for( int d=_minDepth ; d<_sNodes.levels() ; d++ ) - { - DumpOutput( "Depth[%d/%d]: %d\n" , d-1 , _sNodes.levels()-2 , _sNodes.size( d ) ); - if( d==_minDepth ) _SolveSystemCG( bsData , pointInfo , d , solution , constraints , metSolution , _sNodes.size(_minDepth) , true , showResidual , NULL , NULL , NULL ); - else - { - if( d>cgDepth ) iter += _SolveSystemGS( bsData , pointInfo , d , solution , constraints , metSolution , d>maxSolveDepth ? 0 : iters , true , showResidual , NULL , NULL , NULL ); - else iter += _SolveSystemCG( bsData , pointInfo , d , solution , constraints , metSolution , d>maxSolveDepth ? 0 : iters , true , showResidual , NULL , NULL , NULL , accuracy ); - } - } - metSolution.resize( 0 ); - return solution; -} - -template< class Real > -template< int FEMDegree , int NormalDegree > -DenseNodeData< Real , FEMDegree > Octree< Real >::SetLaplacianConstraints( const SparseNodeData< Point3D< Real > , NormalDegree >& normalInfo ) -{ - typedef typename TreeOctNode::NeighborKey< -BSplineEvaluationData< FEMDegree >::SupportStart , BSplineEvaluationData< FEMDegree >::SupportEnd > SupportKey; - const int OverlapSize = BSplineIntegrationData< NormalDegree , FEMDegree >::OverlapSize; - const int LeftNormalFEMOverlapRadius = -BSplineIntegrationData< NormalDegree , FEMDegree >::OverlapStart; - const int RightNormalFEMOverlapRadius = BSplineIntegrationData< NormalDegree , FEMDegree >::OverlapEnd; - const int LeftFEMNormalOverlapRadius = -BSplineIntegrationData< FEMDegree , NormalDegree >::OverlapStart; - const int RightFEMNormalOverlapRadius = BSplineIntegrationData< FEMDegree , NormalDegree >::OverlapEnd; - - // To set the Laplacian constraints, we iterate over the - // splatted normals and compute the dot-product of the - // divergence of the normal field with all the basis functions. - // Within the same depth: set directly as a gather - // Coarser depths - int maxDepth = _sNodes.levels()-1; - DenseNodeData< Real , FEMDegree > constraints( _sNodes.size() ) , _constraints( _sNodes.end( maxDepth-1 ) ); - memset( constraints.data , 0 , sizeof(Real)*_sNodes.size() ); - memset( _constraints.data , 0 , sizeof(Real)*( _sNodes.end(maxDepth-1) ) ); - MemoryUsage(); - - for( int d=maxDepth ; d>=_minDepth ; d-- ) - { - int offset = d>0 ? _sNodes.begin(d-1) : 0; - Stencil< Point3D< double > , OverlapSize > stencil , stencils[2][2][2]; - typename BSplineIntegrationData< NormalDegree , FEMDegree >::FunctionIntegrator::Integrator integrator; - typename BSplineIntegrationData< FEMDegree , NormalDegree >::FunctionIntegrator::ChildIntegrator childIntegrator; - BSplineIntegrationData< NormalDegree , FEMDegree >::SetIntegrator( integrator , d-1 , _dirichlet , _dirichlet ); - if( d>_minDepth ) BSplineIntegrationData< FEMDegree , NormalDegree >::SetChildIntegrator( childIntegrator , d-2 , _dirichlet , _dirichlet ); - SystemCoefficients< NormalDegree , FEMDegree >::SetCentralDivergenceStencil ( integrator , stencil , false ); - SystemCoefficients< FEMDegree , NormalDegree >::SetCentralDivergenceStencils( childIntegrator , stencils , true ); - - std::vector< SupportKey > neighborKeys( std::max< int >( 1 , threads ) ); - for( size_t i=0 ; idepth(); - typename TreeOctNode::Neighbors< OverlapSize > neighbors; - neighborKey.template getNeighbors< false , LeftFEMNormalOverlapRadius , RightFEMNormalOverlapRadius >( node , neighbors ); - bool isInterior = _IsInteriorlyOverlapped< FEMDegree , NormalDegree >( node ) , isInterior2 = _IsInteriorlyOverlapped< NormalDegree , FEMDegree >( node->parent ); - - int cx , cy , cz; - if( d>_minDepth ) Cube::FactorCornerIndex( (int)( node-node->parent->children) , cx , cy ,cz ); - else cx = cy = cz = 0; - Stencil< Point3D< double > , OverlapSize >& _stencil = stencils[cx][cy][cz]; - int d , off[3]; - node->depthAndOffset( d , off ); - // Set constraints from current depth - // Gather the constraints from the vector-field at _node into the constraint stored with node - if( _IsValidNode< FEMDegree >( node ) ) - { - for( int x=startX ; x( _node ) ) - { - int _idx = normalInfo.index( _node ); - if( _idx>=0 ) - { - if( isInterior ) - { - constraints[i] += Point3D< Real >::Dot( stencil.values[x][y][z] , normalInfo.data[ _idx ] ); - } - else - { - int _d , _off[3]; - _node->depthAndOffset( _d , _off ); - constraints[i] += Real( SystemCoefficients< NormalDegree , FEMDegree >::GetDivergence2( integrator , _off , off , normalInfo.data[ _idx ] ) ); - } - } - } - } - _SetParentOverlapBounds< NormalDegree , FEMDegree >( node , startX , endX , startY , endY , startZ , endZ ); - } - if( !_IsValidNode< NormalDegree >( node ) ) continue; - int idx = normalInfo.index( node ); - if( idx<0 ) continue; - const Point3D< Real >& normal = normalInfo.data[ idx ]; - if( normal[0]==0 && normal[1]==0 && normal[2]==0 ) continue; - - // Set the _constraints for the parents - if( depth>_minDepth ) - { - neighborKey.template getNeighbors< false , LeftNormalFEMOverlapRadius , RightNormalFEMOverlapRadius >( node->parent , neighbors ); - - for( int x=startX ; x( _node ) ) ) - { - TreeOctNode* _node = neighbors.neighbors[x][y][z]; - Real c; - if( isInterior2 ) c = Point3D< Real >::Dot( _stencil.values[x][y][z] , normal ); - else - { - int _d , _off[3]; - _node->depthAndOffset( _d , _off ); - c = Real( SystemCoefficients< FEMDegree , NormalDegree >::GetDivergence1( childIntegrator , _off , off , normal ) ); - } -#ifdef _OPENMP -#pragma omp atomic -#endif - _constraints[ _node->nodeData.nodeIndex ] += c; - } - } - } - } - MemoryUsage(); - } - - // Fine-to-coarse down-sampling of constraints - for( int d=maxDepth-1 ; d>_minDepth ; d-- ) _DownSample( d , _constraints ); - - // Add the accumulated constraints from all finer depths -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=0 ; i<_sNodes.end(maxDepth-1) ; i++ ) constraints[i] += _constraints[i]; - - _constraints.resize( 0 ); - - DenseNodeData< Point3D< Real > , NormalDegree > coefficients( _sNodes.end( maxDepth-1 ) ); - for( int d=maxDepth-1 ; d>=_minDepth ; d-- ) - { -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=_sNodes.begin(d) ; i<_sNodes.end(d) ; i++ ) if( _IsValidNode< NormalDegree >( _sNodes.treeNodes[i] ) ) - { - int idx = normalInfo.index( _sNodes.treeNodes[i] ); - if( idx<0 ) continue; - coefficients[i] = normalInfo.data[ idx ]; - } - } - - // Coarse-to-fine up-sampling of coefficients - for( int d=_minDepth+1 ; d , OverlapSize > stencils[2][2][2]; - typename BSplineIntegrationData< NormalDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator childIntegrator; - if( d>_minDepth ) BSplineIntegrationData< NormalDegree , FEMDegree >::SetChildIntegrator( childIntegrator , d-2 , _dirichlet , _dirichlet ); - SystemCoefficients< NormalDegree , FEMDegree >::SetCentralDivergenceStencils( childIntegrator , stencils , false ); - std::vector< SupportKey > neighborKeys( std::max< int >( 1 , threads ) ); - for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) - { - SupportKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; - TreeOctNode* node = _sNodes.treeNodes[i]; - int depth = node->depth(); - if( !depth ) continue; - int startX , endX , startY , endY , startZ , endZ; - _SetParentOverlapBounds< FEMDegree , NormalDegree >( node , startX , endX , startY , endY , startZ , endZ ); - typename TreeOctNode::Neighbors< OverlapSize > neighbors; - neighborKey.template getNeighbors< false , LeftFEMNormalOverlapRadius , RightFEMNormalOverlapRadius >( node->parent , neighbors ); - - bool isInterior = _IsInteriorlyOverlapped< FEMDegree , NormalDegree >( node->parent ); - int cx , cy , cz; - if( d ) - { - int c = int( node - node->parent->children ); - Cube::FactorCornerIndex( c , cx , cy , cz ); - } - else cx = cy = cz = 0; - Stencil< Point3D< double > , OverlapSize >& _stencil = stencils[cx][cy][cz]; - - Real constraint = Real(0); - int d , off[3]; - node->depthAndOffset( d , off ); - for( int x=startX ; x( _node ) ) - { - int _i = _node->nodeData.nodeIndex; - if( isInterior ) constraint += Point3D< Real >::Dot( coefficients[_i] , _stencil.values[x][y][z] ); - else - { - int _d , _off[3]; - _node->depthAndOffset( _d , _off ); - constraint += Real( SystemCoefficients< NormalDegree , FEMDegree >::GetDivergence2( childIntegrator , _off , off , coefficients[_i] ) ); - } - } - } - constraints[ node->nodeData.nodeIndex ] += constraint; - } - } - MemoryUsage(); - coefficients.resize( 0 ); - - return constraints; -} +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ + +template< int Degree1 , int Degree2 > +double SystemCoefficients< Degree1 , Degree2 >::GetLaplacian( const typename FunctionIntegrator::Integrator& integrator , const int off1[] , const int off2[] ) +{ + double vv[] = { integrator.dot( off1[0] , off2[0] , false , false ) , integrator.dot( off1[1] , off2[1] , false , false ) , integrator.dot( off1[2] , off2[2] , false , false ) }; + double dd[] = { integrator.dot( off1[0] , off2[0] , true , true ) , integrator.dot( off1[1] , off2[1] , true , true ) , integrator.dot( off1[2] , off2[2] , true , true ) }; + return dd[0]*vv[1]*vv[2] + vv[0]*dd[1]*vv[2] + vv[0]*vv[1]*dd[2]; +} +template< int Degree1 , int Degree2 > +double SystemCoefficients< Degree1 , Degree2 >::GetLaplacian( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[] , const int off2[] ) +{ + double vv[] = { integrator.dot( off1[0] , off2[0] , false , false ) , integrator.dot( off1[1] , off2[1] , false , false ) , integrator.dot( off1[2] , off2[2] , false , false ) }; + double dd[] = { integrator.dot( off1[0] , off2[0] , true , true ) , integrator.dot( off1[1] , off2[1] , true , true ) , integrator.dot( off1[2] , off2[2] , true , true ) }; + return dd[0]*vv[1]*vv[2] + vv[0]*dd[1]*vv[2] + vv[0]*vv[1]*dd[2]; +} +template< int Degree1 , int Degree2 > +double SystemCoefficients< Degree1 , Degree2 >::GetDivergence1( const typename FunctionIntegrator::Integrator& integrator , const int off1[] , const int off2[] , Point3D< double > normal1 ) +{ + return Point3D< double >::Dot( GetDivergence1( integrator , off1 , off2 ) , normal1 ); +} +template< int Degree1 , int Degree2 > +double SystemCoefficients< Degree1 , Degree2 >::GetDivergence1( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[] , const int off2[] , Point3D< double > normal1 ) +{ + return Point3D< double >::Dot( GetDivergence1( integrator , off1 , off2 ) , normal1 ); +} +template< int Degree1 , int Degree2 > +double SystemCoefficients< Degree1 , Degree2 >::GetDivergence2( const typename FunctionIntegrator::Integrator& integrator , const int off1[] , const int off2[] , Point3D< double > normal2 ) +{ + return Point3D< double >::Dot( GetDivergence2( integrator , off1 , off2 ) , normal2 ); +} +template< int Degree1 , int Degree2 > +double SystemCoefficients< Degree1 , Degree2 >::GetDivergence2( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[] , const int off2[] , Point3D< double > normal2 ) +{ + return Point3D< double >::Dot( GetDivergence2( integrator , off1 , off2 ) , normal2 ); +} +template< int Degree1 , int Degree2 > +Point3D< double > SystemCoefficients< Degree1 , Degree2 >::GetDivergence1( const typename FunctionIntegrator::Integrator& integrator , const int off1[] , const int off2[] ) +{ + double vv[] = { integrator.dot( off1[0] , off2[0] , false , false ) , integrator.dot( off1[1] , off2[1] , false , false ) , integrator.dot( off1[2] , off2[2] , false , false ) }; +#if GRADIENT_DOMAIN_SOLUTION + // Take the dot-product of the vector-field with the gradient of the basis function + double vd[] = { integrator.dot( off1[0] , off2[0] , true , false ) , integrator.dot( off1[1] , off2[1] , true , false ) , integrator.dot( off1[2] , off2[2] , true , false ) }; + return Point3D< double >( vd[0]*vv[1]*vv[2] , vv[0]*vd[1]*vv[2] , vv[0]*vv[1]*vd[2] ); +#else // !GRADIENT_DOMAIN_SOLUTION + // Take the dot-product of the divergence of the vector-field with the basis function + double dv[] = { integrator.dot( off1[0] , off2[0] , false , true ) , integrator.dot( off1[1] , off2[1] , false , true ) , integrator.dot( off1[2] , off2[2] , false , true ) }; + return -Point3D< double >( dv[0]*vv[1]*vv[2] , vv[0]*dv[1]*vv[2] , vv[0]*vv[1]*dv[2] ); +#endif // GRADIENT_DOMAIN_SOLUTION +} +template< int Degree1 , int Degree2 > +Point3D< double > SystemCoefficients< Degree1 , Degree2 >::GetDivergence1( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[] , const int off2[] ) +{ + double vv[] = { integrator.dot( off1[0] , off2[0] , false , false ) , integrator.dot( off1[1] , off2[1] , false , false ) , integrator.dot( off1[2] , off2[2] , false , false ) }; +#if GRADIENT_DOMAIN_SOLUTION + // Take the dot-product of the vector-field with the gradient of the basis function + double vd[] = { integrator.dot( off1[0] , off2[0] , true , false ) , integrator.dot( off1[1] , off2[1] , true , false ) , integrator.dot( off1[2] , off2[2] , true , false ) }; + return Point3D< double >( vd[0]*vv[1]*vv[2] , vv[0]*vd[1]*vv[2] , vv[0]*vv[1]*vd[2] ); +#else // !GRADIENT_DOMAIN_SOLUTION + // Take the dot-product of the divergence of the vector-field with the basis function + double dv[] = { integrator.dot( off1[0] , off2[0] , false , true ) , integrator.dot( off1[1] , off2[1] , false , true ) , integrator.dot( off1[2] , off2[2] , false , true ) }; + return -Point3D< double >( dv[0]*vv[1]*vv[2] , vv[0]*dv[1]*vv[2] , vv[0]*vv[1]*dv[2] ); +#endif // GRADIENT_DOMAIN_SOLUTION +} +template< int Degree1 , int Degree2 > +Point3D< double > SystemCoefficients< Degree1 , Degree2 >::GetDivergence2( const typename FunctionIntegrator::Integrator& integrator , const int off1[] , const int off2[] ) +{ + double vv[] = { integrator.dot( off1[0] , off2[0] , false , false ) , integrator.dot( off1[1] , off2[1] , false , false ) , integrator.dot( off1[2] , off2[2] , false , false ) }; +#if GRADIENT_DOMAIN_SOLUTION + // Take the dot-product of the vector-field with the gradient of the basis function + double dv[] = { integrator.dot( off1[0] , off2[0] , false , true ) , integrator.dot( off1[1] , off2[1] , false , true ) , integrator.dot( off1[2] , off2[2] , false , true ) }; + return Point3D< double >( dv[0]*vv[1]*vv[2] , vv[0]*dv[1]*vv[2] , vv[0]*vv[1]*dv[2] ); +#else // !GRADIENT_DOMAIN_SOLUTION + // Take the dot-product of the divergence of the vector-field with the basis function + double vd[] = { integrator.dot( off1[0] , off2[0] , true , false ) , integrator.dot( off1[1] , off2[1] , true , false ) , integrator.dot( off1[2] , off2[2] , true , false ) }; + return -Point3D< double >( vd[0]*vv[1]*vv[2] , vv[0]*vd[1]*vv[2] , vv[0]*vv[1]*vd[2] ); +#endif // GRADIENT_DOMAIN_SOLUTION +} +template< int Degree1 , int Degree2 > +Point3D< double > SystemCoefficients< Degree1 , Degree2 >::GetDivergence2( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[] , const int off2[] ) +{ + double vv[] = { integrator.dot( off1[0] , off2[0] , false , false ) , integrator.dot( off1[1] , off2[1] , false , false ) , integrator.dot( off1[2] , off2[2] , false , false ) }; +#if GRADIENT_DOMAIN_SOLUTION + // Take the dot-product of the vector-field with the gradient of the basis function + double dv[] = { integrator.dot( off1[0] , off2[0] , false , true ) , integrator.dot( off1[1] , off2[1] , false , true ) , integrator.dot( off1[2] , off2[2] , false , true ) }; + return Point3D< double >( dv[0]*vv[1]*vv[2] , vv[0]*dv[1]*vv[2] , vv[0]*vv[1]*dv[2] ); +#else // !GRADIENT_DOMAIN_SOLUTION + // Take the dot-product of the divergence of the vector-field with the basis function + double vd[] = { integrator.dot( off1[0] , off2[0] , true , false ) , integrator.dot( off1[1] , off2[1] , true , false ) , integrator.dot( off1[2] , off2[2] , true , false ) }; + return -Point3D< double >( vd[0]*vv[1]*vv[2] , vv[0]*vd[1]*vv[2] , vv[0]*vv[1]*vd[2] ); +#endif // GRADIENT_DOMAIN_SOLUTION +} +// if( scatter ) normals come from the center node +// else normals come from the neighbors +template< int Degree1 , int Degree2 > +void SystemCoefficients< Degree1 , Degree2 >::SetCentralDivergenceStencil( const typename FunctionIntegrator::Integrator& integrator , Stencil< Point3D< double > , OverlapSize >& stencil , bool scatter ) +{ + int center = ( 1<>1; + int offset[] = { center , center , center }; + for( int x=0 ; x +void SystemCoefficients< Degree1 , Degree2 >::SetCentralDivergenceStencils( const typename FunctionIntegrator::ChildIntegrator& integrator , Stencil< Point3D< double > , OverlapSize > stencils[2][2][2] , bool scatter ) +{ + int center = ( 1<>1; + for( int i=0 ; i<2 ; i++ ) for( int j=0 ; j<2 ; j++ ) for( int k=0 ; k<2 ; k++ ) + { + int offset[] = { center+i , center+j , center+k }; + for( int x=0 ; x +void SystemCoefficients< Degree1 , Degree2 >::SetCentralLaplacianStencil( const typename FunctionIntegrator::Integrator& integrator , Stencil< double , OverlapSize >& stencil ) +{ + int center = ( 1<>1; + int offset[] = { center , center , center }; + for( int x=0 ; x +void SystemCoefficients< Degree1 , Degree2 >::SetCentralLaplacianStencils( const typename FunctionIntegrator::ChildIntegrator& integrator , Stencil< double , OverlapSize > stencils[2][2][2] ) +{ + int center = ( 1<>1; + for( int i=0 ; i<2 ; i++ ) for( int j=0 ; j<2 ; j++ ) for( int k=0 ; k<2 ; k++ ) + { + int offset[] = { center+i , center+j , center+k }; + for( int x=0 ; x +template< int FEMDegree > +void Octree< Real >::_setMultiColorIndices( int start , int end , std::vector< std::vector< int > >& indices ) const +{ + static const int OverlapRadius = - BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; + + const int modulus = OverlapRadius+1; + indices.resize( modulus*modulus*modulus ); + int count[modulus*modulus*modulus]; + memset( count , 0 , sizeof(int)*modulus*modulus*modulus ); +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=start ; i( _sNodes.treeNodes[i] ) ) + { + int d , off[3]; + _sNodes.treeNodes[i]->depthAndOffset( d , off ); + int idx = (modulus*modulus) * ( off[2]%modulus ) + modulus * ( off[1]%modulus ) + ( off[0]%modulus ); +#ifdef _OPENMP +#pragma omp atomic +#endif + count[idx]++; + } + + for( int i=0 ; i( _sNodes.treeNodes[i] ) ) + { + int d , off[3]; + _sNodes.treeNodes[i]->depthAndOffset( d , off ); + int idx = (modulus*modulus) * ( off[2]%modulus ) + modulus * ( off[1]%modulus ) + ( off[0]%modulus ); + indices[idx].push_back( i - start ); + } +} + +template< class Real > +template< class C , int FEMDegree > +void Octree< Real >::_DownSample( int highDepth , DenseNodeData< C , FEMDegree >& constraints ) const +{ + typedef typename TreeOctNode::NeighborKey< -BSplineEvaluationData< FEMDegree >::UpSampleStart , BSplineEvaluationData< FEMDegree >::UpSampleEnd > UpSampleKey; + + int lowDepth = highDepth-1; + if( lowDepth<_minDepth ) return; + + typename BSplineEvaluationData< FEMDegree >::UpSampleEvaluator upSampleEvaluator; + BSplineEvaluationData< FEMDegree >::SetUpSampleEvaluator( upSampleEvaluator , lowDepth-1 , _dirichlet ); + std::vector< UpSampleKey > neighborKeys( std::max< int >( 1 , threads ) ); + for( size_t i=0 ; i::UpSampleSize > upSampleStencil; + int lowCenter = _Dimension< FEMDegree >(lowDepth)>>1; + for( int i=0 ; i::UpSampleSize ; i++ ) for( int j=0 ; j::UpSampleSize ; j++ ) for( int k=0 ; k::UpSampleSize ; k++ ) + upSampleStencil.values[i][j][k] = + upSampleEvaluator.value( lowCenter , 2*lowCenter + i + BSplineEvaluationData< FEMDegree >::UpSampleStart ) * + upSampleEvaluator.value( lowCenter , 2*lowCenter + j + BSplineEvaluationData< FEMDegree >::UpSampleStart ) * + upSampleEvaluator.value( lowCenter , 2*lowCenter + k + BSplineEvaluationData< FEMDegree >::UpSampleStart ); + int dim = _Dimension< FEMDegree >(lowDepth); + + // Iterate over all (valid) parent nodes +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=_sNodes.begin(lowDepth) ; i<_sNodes.end(lowDepth) ; i++ ) if( _IsValidNode< FEMDegree >( _sNodes.treeNodes[i] ) ) + { + TreeOctNode* pNode = _sNodes.treeNodes[i]; + + UpSampleKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; + int d , off[3]; + pNode->depthAndOffset( d , off ); + + neighborKey.template getNeighbors< false >( pNode ); + + // Get the child neighbors + typename TreeOctNode::Neighbors< BSplineEvaluationData< FEMDegree >::UpSampleSize > neighbors; + neighborKey.template getChildNeighbors< false >( 0 , d , neighbors ); + + C& coarseConstraint = constraints[i]; + + // Want to make sure test if contained children are interior. + // This is more conservative because we are test that overlapping children are interior + bool isInterior = _IsInteriorlyOverlapped< FEMDegree , FEMDegree >( pNode ); + if( isInterior ) + { + for( int ii=0 ; ii::UpSampleSize ; ii++ ) for( int jj=0 ; jj::UpSampleSize ; jj++ ) for( int kk=0 ; kk::UpSampleSize ; kk++ ) + { + const TreeOctNode* cNode = neighbors.neighbors[ii][jj][kk]; + if( cNode ) coarseConstraint += (C)( constraints[ cNode->nodeData.nodeIndex ] * upSampleStencil.values[ii][jj][kk] ); + } + } + else + { + double upSampleValues[3][ BSplineEvaluationData< FEMDegree >::UpSampleSize ]; + for( int ii=0 ; ii::UpSampleSize ; ii++ ) + { + upSampleValues[0][ii] = upSampleEvaluator.value( off[0] , 2*off[0] + ii + BSplineEvaluationData< FEMDegree >::UpSampleStart ); + upSampleValues[1][ii] = upSampleEvaluator.value( off[1] , 2*off[1] + ii + BSplineEvaluationData< FEMDegree >::UpSampleStart ); + upSampleValues[2][ii] = upSampleEvaluator.value( off[2] , 2*off[2] + ii + BSplineEvaluationData< FEMDegree >::UpSampleStart ); + } + + for( int ii=0 ; ii::UpSampleSize ; ii++ ) for( int jj=0 ; jj::UpSampleSize ; jj++ ) + { + double dxy = upSampleValues[0][ii] * upSampleValues[1][jj]; + for( int kk=0 ; kk::UpSampleSize ; kk++ ) + { + const TreeOctNode* cNode = neighbors.neighbors[ii][jj][kk]; + if( _IsValidNode< FEMDegree >( cNode ) ) coarseConstraint += (C)( constraints[ cNode->nodeData.nodeIndex ] * dxy * upSampleValues[2][kk] ); + } + } + } + } +} +template< class Real > +template< class C , int FEMDegree> +void Octree< Real >::_UpSample( int highDepth , DenseNodeData< C , FEMDegree >& coefficients ) const +{ + static const int LeftDownSampleRadius = -( ( BSplineEvaluationData< FEMDegree >::DownSample0Start < BSplineEvaluationData< FEMDegree >::DownSample1Start ) ? BSplineEvaluationData< FEMDegree >::DownSample0Start : BSplineEvaluationData< FEMDegree >::DownSample1Start ); + static const int RightDownSampleRadius = ( ( BSplineEvaluationData< FEMDegree >::DownSample0End > BSplineEvaluationData< FEMDegree >::DownSample1End ) ? BSplineEvaluationData< FEMDegree >::DownSample0End : BSplineEvaluationData< FEMDegree >::DownSample1End ); + typedef TreeOctNode::NeighborKey< LeftDownSampleRadius , RightDownSampleRadius > DownSampleKey; + + int lowDepth = highDepth-1; + if( lowDepth<_minDepth ) return; + + typename BSplineEvaluationData< FEMDegree >::UpSampleEvaluator upSampleEvaluator; + BSplineEvaluationData< FEMDegree >::SetUpSampleEvaluator( upSampleEvaluator , lowDepth-1 , _dirichlet ); + std::vector< DownSampleKey > neighborKeys( std::max< int >( 1 , threads ) ); + for( size_t i=0 ; i::DownSample0Size > BSplineEvaluationData< FEMDegree >::DownSample1Size ? BSplineEvaluationData< FEMDegree >::DownSample0Size : BSplineEvaluationData< FEMDegree >::DownSample1Size; + Stencil< double , DownSampleSize > downSampleStencils[ Cube::CORNERS ]; + int lowCenter = _Dimension< FEMDegree >( lowDepth )>>1; + for( int c=0 ; c::DownSampleSize[cx] ; ii++ ) + for( int jj=0 ; jj::DownSampleSize[cy] ; jj++ ) + for( int kk=0 ; kk::DownSampleSize[cz] ; kk++ ) + downSampleStencils[c].values[ii][jj][kk] = + upSampleEvaluator.value( lowCenter + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cx] , 2*lowCenter + cx ) * + upSampleEvaluator.value( lowCenter + jj + BSplineEvaluationData< FEMDegree >::DownSampleStart[cy] , 2*lowCenter + cy ) * + upSampleEvaluator.value( lowCenter + kk + BSplineEvaluationData< FEMDegree >::DownSampleStart[cz] , 2*lowCenter + cz ) ; + } + int dim = _Dimension< FEMDegree >( lowDepth ); + + // For Dirichlet constraints, can't get to all children from parents because boundary nodes are invalid +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=_sNodes.begin(highDepth) ; i<_sNodes.end(highDepth) ; i++ ) if( _IsValidNode< FEMDegree >( _sNodes.treeNodes[i] ) ) + { + TreeOctNode *cNode = _sNodes.treeNodes[i] , *pNode = cNode->parent; + int c = (int)( cNode-pNode->children ); + + DownSampleKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; + int d , off[3]; + pNode->depthAndOffset( d , off ); + typename TreeOctNode::Neighbors< LeftDownSampleRadius + RightDownSampleRadius + 1 >& neighbors = neighborKey.template getNeighbors< false >( pNode ); + + // Want to make sure test if contained children are interior. + // This is more conservative because we are test that overlapping children are interior + bool isInterior = _IsInteriorlyOverlapped< FEMDegree , FEMDegree >( pNode ); + + C& fineCoefficient = coefficients[ cNode->nodeData.nodeIndex ]; + + int cx , cy , cz; + Cube::FactorCornerIndex( c , cx , cy , cz ); + + if( isInterior ) + { + for( int ii=0 ; ii::DownSampleSize[cx] ; ii++ ) for( int jj=0 ; jj::DownSampleSize[cy] ; jj++ ) + { + int _ii = ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cx] + LeftDownSampleRadius; + int _jj = jj + BSplineEvaluationData< FEMDegree >::DownSampleStart[cy] + LeftDownSampleRadius; + for( int kk=0 ; kk::DownSampleSize[cz] ; kk++ ) + { + int _kk = kk + BSplineEvaluationData< FEMDegree >::DownSampleStart[cz] + LeftDownSampleRadius; + const TreeOctNode* _pNode = neighbors.neighbors[_ii][_jj][_kk]; + if( _pNode ) fineCoefficient += (C)( coefficients[ _pNode->nodeData.nodeIndex ] * downSampleStencils[c].values[ii][jj][kk] ); + } + } + } + else + { + double downSampleValues[3][ BSplineEvaluationData< FEMDegree >::DownSample0Size > BSplineEvaluationData< FEMDegree >::DownSample1Size ? BSplineEvaluationData< FEMDegree >::DownSample0Size : BSplineEvaluationData< FEMDegree >::DownSample1Size ]; + + for( int ii=0 ; ii::DownSampleSize[cx] ; ii++ ) downSampleValues[0][ii] = upSampleEvaluator.value( off[0] + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cx] , 2*off[0] + cx ); + for( int ii=0 ; ii::DownSampleSize[cy] ; ii++ ) downSampleValues[1][ii] = upSampleEvaluator.value( off[1] + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cy] , 2*off[1] + cy ); + for( int ii=0 ; ii::DownSampleSize[cz] ; ii++ ) downSampleValues[2][ii] = upSampleEvaluator.value( off[2] + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cz] , 2*off[2] + cz ); + + for( int ii=0 ; ii::DownSampleSize[cx] ; ii++ ) for( int jj=0 ; jj::DownSampleSize[cy] ; jj++ ) + { + double dxy = downSampleValues[0][ii] * downSampleValues[1][jj]; + int _ii = ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cx] + LeftDownSampleRadius; + int _jj = jj + BSplineEvaluationData< FEMDegree >::DownSampleStart[cy] + LeftDownSampleRadius; + for( int kk=0 ; kk::DownSampleSize[cz] ; kk++ ) + { + int _kk = kk + BSplineEvaluationData< FEMDegree >::DownSampleStart[cz] + LeftDownSampleRadius; + const TreeOctNode* _pNode = neighbors.neighbors[_ii][_jj][_kk]; + if( _IsValidNode< FEMDegree >( _pNode ) ) fineCoefficient += (C)( coefficients[ _pNode->nodeData.nodeIndex ] * dxy * downSampleValues[2][kk] ); + } + } + } + } +} + +template< class Real > +template< class C , int FEMDegree > +void Octree< Real >::_UpSample( int highDepth , ConstPointer( C ) lowCoefficients , Pointer( C ) highCoefficients , bool dirichlet , int threads ) +{ + static const int LeftDownSampleRadius = -( ( BSplineEvaluationData< FEMDegree >::DownSample0Start < BSplineEvaluationData< FEMDegree >::DownSample1Start ) ? BSplineEvaluationData< FEMDegree >::DownSample0Start : BSplineEvaluationData< FEMDegree >::DownSample1Start ); + static const int RightDownSampleRadius = ( ( BSplineEvaluationData< FEMDegree >::DownSample0End > BSplineEvaluationData< FEMDegree >::DownSample1End ) ? BSplineEvaluationData< FEMDegree >::DownSample0End : BSplineEvaluationData< FEMDegree >::DownSample1End ); + typedef TreeOctNode::NeighborKey< LeftDownSampleRadius , RightDownSampleRadius > DownSampleKey; + + int lowDepth = highDepth-1; + if( lowDepth<1 ) return; + + typename BSplineEvaluationData< FEMDegree >::UpSampleEvaluator upSampleEvaluator; + BSplineEvaluationData< FEMDegree >::SetUpSampleEvaluator( upSampleEvaluator , lowDepth-1 , dirichlet ); + std::vector< DownSampleKey > neighborKeys( std::max< int >( 1 , threads ) ); + + static const int DownSampleSize = BSplineEvaluationData< FEMDegree >::DownSample0Size > BSplineEvaluationData< FEMDegree >::DownSample1Size ? BSplineEvaluationData< FEMDegree >::DownSample0Size : BSplineEvaluationData< FEMDegree >::DownSample1Size; + Stencil< double , DownSampleSize > downSampleStencils[ Cube::CORNERS ]; + int lowCenter = _Dimension< FEMDegree >( lowDepth )>>1; + for( int c=0 ; c::DownSampleSize[cx] ; ii++ ) + for( int jj=0 ; jj::DownSampleSize[cy] ; jj++ ) + for( int kk=0 ; kk::DownSampleSize[cz] ; kk++ ) + downSampleStencils[c].values[ii][jj][kk] = + upSampleEvaluator.value( lowCenter + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cx] , 2*lowCenter + cx ) * + upSampleEvaluator.value( lowCenter + jj + BSplineEvaluationData< FEMDegree >::DownSampleStart[cy] , 2*lowCenter + cy ) * + upSampleEvaluator.value( lowCenter + kk + BSplineEvaluationData< FEMDegree >::DownSampleStart[cz] , 2*lowCenter + cz ) ; + } + int lowDim = _Dimension< FEMDegree >( lowDepth ) , highDim = _Dimension< FEMDegree >( highDepth ); + + // Iterate over all parent nodes +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int k=0 ; k( lowDepth , i , j , k ); + + // Iterate over all the children of the parent + for( int c=0 ; c=highDim || jj<0 || jj>=highDim || kk<0 || kk>=highDim ) continue; + + C& highCoefficient = highCoefficients[ ii + jj*highDim + kk*highDim*highDim ]; + + if( isInterior ) + { + for( int ii=0 ; ii::DownSampleSize[cx] ; ii++ ) for( int jj=0 ; jj::DownSampleSize[cy] ; jj++ ) + { + int _i = i + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cx]; + int _j = j + jj + BSplineEvaluationData< FEMDegree >::DownSampleStart[cy]; + for( int kk=0 ; kk::DownSampleSize[cz] ; kk++ ) + { + int _k = k + kk + BSplineEvaluationData< FEMDegree >::DownSampleStart[cz]; + highCoefficient += (C)( lowCoefficients[ _i + _j*lowDim + _k*lowDim*lowDim ] * downSampleStencils[c].values[ii][jj][kk] ); + } + } + } + else + { + double downSampleValues[3][ BSplineEvaluationData< FEMDegree >::DownSample0Size > BSplineEvaluationData< FEMDegree >::DownSample1Size ? BSplineEvaluationData< FEMDegree >::DownSample0Size : BSplineEvaluationData< FEMDegree >::DownSample1Size ]; + + for( int ii=0 ; ii::DownSampleSize[cx] ; ii++ ) downSampleValues[0][ii] = upSampleEvaluator.value( off[0] + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cx] , 2*off[0] + cx ); + for( int ii=0 ; ii::DownSampleSize[cy] ; ii++ ) downSampleValues[1][ii] = upSampleEvaluator.value( off[1] + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cy] , 2*off[1] + cy ); + for( int ii=0 ; ii::DownSampleSize[cz] ; ii++ ) downSampleValues[2][ii] = upSampleEvaluator.value( off[2] + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cz] , 2*off[2] + cz ); + + for( int ii=0 ; ii::DownSampleSize[cx] ; ii++ ) for( int jj=0 ; jj::DownSampleSize[cy] ; jj++ ) + { + double dxy = downSampleValues[0][ii] * downSampleValues[1][jj]; + int _i = i + ii + BSplineEvaluationData< FEMDegree >::DownSampleStart[cx]; + int _j = j + jj + BSplineEvaluationData< FEMDegree >::DownSampleStart[cy]; + if( _i>=0 && _i=0 && _j::DownSampleSize[cz] ; kk++ ) + { + int _k = k + kk + BSplineEvaluationData< FEMDegree >::DownSampleStart[cz]; + if( _k>=0 && _k +template< int FEMDegree > +Real Octree< Real >::_CoarserFunctionValue( Point3D< Real > p , const PointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* pointNode , const BSplineData< FEMDegree >& bsData , const DenseNodeData< Real , FEMDegree >& upSampledCoefficients ) const +{ + static const int SupportSize = BSplineEvaluationData< FEMDegree >::SupportSize; + static const int LeftSupportRadius = - BSplineEvaluationData< FEMDegree >::SupportStart; + static const int RightSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; + static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; + static const int RightPointSupportRadius = - BSplineEvaluationData< FEMDegree >::SupportStart; + + double pointValue = 0; + int depth = pointNode->depth(); + if( depth<=_minDepth ) return Real(0.); + + // Iterate over all basis functions that overlap the point at the coarser resolution + { + const typename TreeOctNode::Neighbors< SupportSize >& neighbors = neighborKey.neighbors[depth-1]; + int _d , _off[3]; + pointNode->parent->depthAndOffset( _d , _off ); + int fStart , fEnd; + BSplineData< FEMDegree >::FunctionSpan( _d-1 , fStart , fEnd ); + + double pointValues[ DIMENSION ][SupportSize]; + memset( pointValues , 0 , sizeof(double) * DIMENSION * SupportSize ); + + for( int dd=0 ; dd::FunctionIndex( _d-1 , _off[dd]+i ); + if( fIdx>=fStart && fIdx( _node ) ) _pointValue += pointValues[2][l] * double( upSampledCoefficients[_node->nodeData.nodeIndex] ); + } + pointValue += _pointValue * xyValue; + } + } + return Real( pointValue ); +} + +template< class Real > +template< int FEMDegree > +Real Octree< Real >::_FinerFunctionValue( Point3D< Real > p , const PointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* pointNode , const BSplineData< FEMDegree >& bsData , const DenseNodeData< Real , FEMDegree >& finerCoefficients ) const +{ + typename TreeOctNode::Neighbors< BSplineEvaluationData< FEMDegree >::SupportSize > childNeighbors; + static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; + static const int RightPointSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; + static const int LeftSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; + static const int RightSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; + + double pointValue = 0; + int depth = pointNode->depth(); + neighborKey.template getChildNeighbors< false >( p , depth , childNeighbors ); + for( int j=-LeftPointSupportRadius ; j<=RightPointSupportRadius ; j++ ) + for( int k=-LeftPointSupportRadius ; k<=RightPointSupportRadius ; k++ ) + for( int l=-LeftPointSupportRadius ; l<=RightPointSupportRadius ; l++ ) + { + const TreeOctNode* _node = childNeighbors.neighbors[j+LeftPointSupportRadius][k+LeftPointSupportRadius][l+LeftPointSupportRadius]; + if( _IsValidNode< FEMDegree >( _node ) ) + { + int fIdx[3]; + FunctionIndex< FEMDegree >( _node , fIdx ); + pointValue += + bsData.baseBSplines[ fIdx[0] ][LeftSupportRadius-j]( p[0] ) * + bsData.baseBSplines[ fIdx[1] ][LeftSupportRadius-k]( p[1] ) * + bsData.baseBSplines[ fIdx[2] ][LeftSupportRadius-l]( p[2] ) * + double( finerCoefficients[ _node->nodeData.nodeIndex ] ); + } + } + return Real( pointValue ); +} + +template< class Real > +template< int FEMDegree > +void Octree< Real >::_SetPointValuesFromCoarser( SparseNodeData< PointData< Real > , 0 >& pointInfo , int highDepth , const BSplineData< FEMDegree >& bsData , const DenseNodeData< Real , FEMDegree >& upSampledCoefficients ) +{ + int lowDepth = highDepth-1; + if( lowDepth<_minDepth ) return; + std::vector< PointData< Real > >& points = pointInfo.data; + std::vector< PointSupportKey< FEMDegree > > neighborKeys( std::max< int >( 1 , threads ) ); + for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) + { + PointSupportKey< FEMDegree >& neighborKey = neighborKeys[ omp_get_thread_num() ]; + int pIdx = pointInfo.index( _sNodes.treeNodes[i] ); + if( pIdx!=-1 ) + { + neighborKey.template getNeighbors< false >( _sNodes.treeNodes[i]->parent ); + points[ pIdx ].weightedCoarserDValue = (Real)( _CoarserFunctionValue( points[pIdx].position , neighborKey , _sNodes.treeNodes[i] , bsData , upSampledCoefficients ) - 0.5 ) * points[pIdx].weight; + } + } +} + +template< class Real > +template< int FEMDegree > +void Octree< Real >::_SetPointConstraintsFromFiner( const SparseNodeData< PointData< Real > , 0 >& pointInfo , int highDepth , const BSplineData< FEMDegree >& bsData , const DenseNodeData< Real , FEMDegree >& finerCoefficients , DenseNodeData< Real , FEMDegree >& coarserConstraints ) const +{ + static const int SupportSize = BSplineEvaluationData< FEMDegree >::SupportSize; + static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; + static const int RightPointSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; + static const int LeftSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; + static const int RightSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; + + const std::vector< PointData< Real > >& points = pointInfo.data; + // Note: We can't iterate over the finer point nodes as the point weights might be + // scaled incorrectly, due to the adaptive exponent. So instead, we will iterate + // over the coarser nodes and evaluate the finer solution at the associated points. + int lowDepth = highDepth-1; + if( lowDepth<_minDepth ) return; + size_t start = _sNodes.begin(lowDepth) , end = _sNodes.end(lowDepth) , range = end-start; + memset( coarserConstraints.data+start , 0 , sizeof( Real ) * range ); + std::vector< PointSupportKey< FEMDegree > > neighborKeys( std::max< int >( 1 , threads ) ); + for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) + { + PointSupportKey< FEMDegree >& neighborKey = neighborKeys[ omp_get_thread_num() ]; + int pIdx = pointInfo.index( _sNodes.treeNodes[i] ); + if( pIdx!=-1 ) + { + typename TreeOctNode::Neighbors< SupportSize >& neighbors = neighborKey.template getNeighbors< false >( _sNodes.treeNodes[i] ); + // Evaluate the solution @( depth ) at the current point @( depth-1 ) + { + Real finerPointDValue = (Real)( _FinerFunctionValue( points[pIdx].position , neighborKey , _sNodes.treeNodes[i] , bsData , finerCoefficients ) - 0.5 ) * points[pIdx].weight; + Point3D< Real > p = points[ pIdx ].position; + // Update constraints for all nodes @( depth-1 ) that overlap the point + int d , idx[3]; + neighbors.neighbors[LeftPointSupportRadius][LeftPointSupportRadius][LeftPointSupportRadius]->depthAndOffset( d, idx ); + // Set the (offset) index to the top-left-front corner of the 3x3x3 block of b-splines + // overlapping the point. + idx[0] = BinaryNode::CenterIndex( d , idx[0] ); + idx[1] = BinaryNode::CenterIndex( d , idx[1] ); + idx[2] = BinaryNode::CenterIndex( d , idx[2] ); + for( int x=-LeftPointSupportRadius ; x<=RightPointSupportRadius ; x++ ) + for( int y=-LeftPointSupportRadius ; y<=RightPointSupportRadius ; y++ ) + for( int z=-LeftPointSupportRadius ; z<=RightPointSupportRadius ; z++ ) + if( _IsValidNode< FEMDegree >( neighbors.neighbors[x+LeftPointSupportRadius][y+LeftPointSupportRadius][z+LeftPointSupportRadius] ) ) + { +#ifdef _OPENMP +#pragma omp atomic +#endif + coarserConstraints[ neighbors.neighbors[x+LeftPointSupportRadius][y+LeftPointSupportRadius][z+LeftPointSupportRadius]->nodeData.nodeIndex - _sNodes.begin(lowDepth) ] += + Real( + bsData.baseBSplines[idx[0]+x][LeftSupportRadius-x]( p[0] ) * + bsData.baseBSplines[idx[1]+y][LeftSupportRadius-y]( p[1] ) * + bsData.baseBSplines[idx[2]+z][LeftSupportRadius-z]( p[2] ) * + finerPointDValue + ); + } + } + } + } +} + +template< class Real > +template< int FEMDegree > +int Octree< Real >::_SetMatrixRow( const SparseNodeData< PointData< Real > , 0 >& pointInfo , const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& neighbors , Pointer( MatrixEntry< Real > ) row , int offset , const typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator& integrator , const Stencil< double , BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& stencil , const BSplineData< FEMDegree >& bsData ) const +{ + static const int SupportSize = BSplineEvaluationData< FEMDegree >::SupportSize; + static const int OverlapRadius = - BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; + static const int OverlapSize = BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize; + static const int LeftSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; + static const int RightSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; + static const int LeftPointSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; + static const int RightPointSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; + + const std::vector< PointData< Real > >& points = pointInfo.data; + bool hasYZPoints[SupportSize] , hasZPoints[SupportSize][SupportSize]; + Real diagonal = 0; + // Given a node: + // -- for each node in its support: + // ---- if the supporting node contains a point: + // ------ evaluate the x, y, and z B-splines of the nodes supporting the point + // splineValues \in [-LeftSupportRadius,RightSupportRadius] x [-LeftSupportRadius,RightSupportRadius] x [-LeftSupportRadius,RightSupportRadius] x [0,Dimension) x [-LeftPointSupportRadius,RightPointSupportRadius] + Real splineValues[SupportSize][SupportSize][SupportSize][DIMENSION][SupportSize]; + memset( splineValues , 0 , sizeof( Real ) * SupportSize * SupportSize * SupportSize * DIMENSION *SupportSize ); + + int count = 0; + const TreeOctNode* node = neighbors.neighbors[OverlapRadius][OverlapRadius][OverlapRadius]; + int d , off[3]; + node->depthAndOffset( d , off ); + int fStart , fEnd; + BSplineData< FEMDegree >::FunctionSpan( d-1 , fStart , fEnd ); + bool isInterior = _IsInteriorlyOverlapped< FEMDegree , FEMDegree >( node ); + + if( _constrainValues ) + { + // Iterate over all neighboring nodes that may have a constraining point + // -- For each one, compute the values of the spline functions supported on the point + for( int j=0 ; j( _node ) && pointInfo.index( _node )!=-1 ) + { + int pOff[] = { off[0]+j , off[1]+k , off[2]+l }; + hasYZPoints[jj] = hasZPoints[jj][kk] = true; + const PointData< Real >& pData = points[ pointInfo.index( _node ) ]; + Real (*_splineValues)[SupportSize] = splineValues[jj][kk][ll]; + Real weight = pData.weight; + Point3D< Real > p = pData.position; + // Evaluate the point p at all the nodes whose functions have it in their support + for( int s=-LeftPointSupportRadius ; s<=RightPointSupportRadius ; s++ ) for( int dd=0 ; dd::FunctionIndex( d-1 , pOff[dd]+s ); + if( fIdx>=fStart && fIdx( _node ) && pointInfo.index( _node )!=-1 ) + // Iterate over all neighbors whose support contains the point and accumulate the mutual integral + for( int ii=-LeftPointSupportRadius ; ii<=RightPointSupportRadius ; ii++ ) + for( int jj=-LeftPointSupportRadius ; jj<=RightPointSupportRadius ; jj++ ) + for( int kk=-LeftPointSupportRadius ; kk<=RightPointSupportRadius ; kk++ ) + { + TreeOctNode* _node = neighbors.neighbors[i+ii+OverlapRadius][j+jj+OverlapRadius][k+kk+OverlapRadius]; + if( _IsValidNode< FEMDegree >( _node ) ) + pointValues[i+ii+OverlapRadius][j+jj+OverlapRadius][k+kk+OverlapRadius] += + _splineValues[0][ii+LeftPointSupportRadius ] * _splineValues[1][jj+LeftPointSupportRadius ] * _splineValues[2][kk+LeftPointSupportRadius ]; + } + } + } + pointValues[OverlapRadius][OverlapRadius][OverlapRadius] = diagonal; + int nodeIndex = neighbors.neighbors[OverlapRadius][OverlapRadius][OverlapRadius]->nodeData.nodeIndex; + if( isInterior ) // General case, so try to make fast + { + const TreeOctNode* const * _nodes = &neighbors.neighbors[0][0][0]; + const double* _stencil = &stencil.values[0][0][0]; + Real* _values = &pointValues[0][0][0]; + const static int CenterIndex = OverlapSize*OverlapSize*OverlapRadius + OverlapSize*OverlapRadius + OverlapRadius; + if( _constrainValues ) for( int i=0 ; i( nodeIndex-offset , _values[CenterIndex] ); + for( int i=0 ; i( _nodes[i]->nodeData.nodeIndex-offset , _values[i] ); + } + else + { + int d , off[3]; + node->depthAndOffset( d , off ); + Real temp = Real( SystemCoefficients< FEMDegree , FEMDegree >::GetLaplacian( integrator , off , off ) ); + if( _constrainValues ) temp += pointValues[OverlapRadius][OverlapRadius][OverlapRadius]; + row[count++] = MatrixEntry< Real >( nodeIndex-offset , temp ); + for( int x=0 ; x( neighbors.neighbors[x][y][z] ) ) + { + const TreeOctNode* _node = neighbors.neighbors[x][y][z]; + int _d , _off[3]; + _node->depthAndOffset( _d , _off ); + Real temp = Real( SystemCoefficients< FEMDegree , FEMDegree >::GetLaplacian( integrator , _off , off ) ); + if( _constrainValues ) temp += pointValues[x][y][z]; + row[count++] = MatrixEntry< Real >( _node->nodeData.nodeIndex-offset , temp ); + } + } + return count; +} + +template< class Real > +template< int FEMDegree > +int Octree< Real >::_GetMatrixAndUpdateConstraints( const SparseNodeData< PointData< Real > , 0 >& pointInfo , SparseMatrix< Real >& matrix , DenseNodeData< Real , FEMDegree >& constraints , typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator& integrator , typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator , const BSplineData< FEMDegree >& bsData , int depth , const DenseNodeData< Real , FEMDegree >* metSolution , bool coarseToFine ) +{ + static const int OverlapRadius = - BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; + static const int OverlapSize = BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize; + + size_t start = _sNodes.begin(depth) , end = _sNodes.end(depth) , range = end-start; + Stencil< double , OverlapSize > stencil , stencils[2][2][2]; + SystemCoefficients< FEMDegree , FEMDegree >::SetCentralLaplacianStencil ( integrator , stencil ); + SystemCoefficients< FEMDegree , FEMDegree >::SetCentralLaplacianStencils( childIntegrator , stencils ); + matrix.Resize( (int)range ); + std::vector< AdjacenctNodeKey > neighborKeys( std::max< int >( 1 , threads ) ); + for( size_t i=0 ; i( _sNodes.treeNodes[i+start] ) ) + { + AdjacenctNodeKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; + TreeOctNode* node = _sNodes.treeNodes[i+start]; + // Get the matrix row size + typename TreeOctNode::Neighbors< OverlapSize > neighbors; + neighborKey.template getNeighbors< false , OverlapRadius , OverlapRadius >( node , neighbors ); + int count = _GetMatrixRowSize< FEMDegree >( neighbors ); + + // Allocate memory for the row +#ifdef _OPENMP +#pragma omp critical (matrix_set_row_size) +#endif + matrix.SetRowSize( i , count ); + + // Set the row entries + matrix.rowSizes[i] = _SetMatrixRow( pointInfo , neighbors , matrix[i] , (int)start , integrator , stencil , bsData ); + if( depth>_minDepth ) + { + // Offset the constraints using the solution from lower resolutions. + int x , y , z , c; + if( node->parent ) + { + c = int( node - node->parent->children ); + Cube::FactorCornerIndex( c , x , y , z ); + } + else x = y = z = 0; + if( coarseToFine ) + { + typename TreeOctNode::Neighbors< OverlapSize > pNeighbors; + neighborKey.template getNeighbors< false , OverlapRadius , OverlapRadius >( node->parent , pNeighbors ); + _UpdateConstraintsFromCoarser( pointInfo , neighbors , pNeighbors , node , constraints , *metSolution , childIntegrator , stencils[x][y][z] , bsData ); + } + } + } + return 1; +} + +template< class Real > +template< int FEMDegree > +int Octree< Real >::_GetSliceMatrixAndUpdateConstraints( const SparseNodeData< PointData< Real > , 0 >& pointInfo , SparseMatrix< Real >& matrix , DenseNodeData< Real , FEMDegree >& constraints , typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator& integrator , typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator , const BSplineData< FEMDegree >& bsData , int depth , int slice , const DenseNodeData< Real , FEMDegree >& metSolution , bool coarseToFine ) +{ + static const int OverlapSize = BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize; + static const int OverlapRadius = -BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; + + int nStart = _sNodes.begin( depth , slice ) , nEnd = _sNodes.end( depth , slice ); + size_t range = nEnd-nStart; + Stencil< double , OverlapSize > stencil , stencils[2][2][2]; + SystemCoefficients< FEMDegree , FEMDegree >::SetCentralLaplacianStencil ( integrator , stencil ); + SystemCoefficients< FEMDegree , FEMDegree >::SetCentralLaplacianStencils( childIntegrator , stencils ); + + matrix.Resize( (int)range ); + std::vector< AdjacenctNodeKey > neighborKeys( std::max< int >( 1 , threads ) ); + for( size_t i=0 ; i( _sNodes.treeNodes[i+nStart] ) ) + { + AdjacenctNodeKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; + TreeOctNode* node = _sNodes.treeNodes[i+nStart]; + // Get the matrix row size + typename TreeOctNode::Neighbors< OverlapSize > neighbors; + neighborKey.template getNeighbors< false , OverlapRadius , OverlapRadius >( node , neighbors ); + int count = _GetMatrixRowSize< FEMDegree >( neighbors ); + + // Allocate memory for the row +#ifdef _OPENMP +#pragma omp critical (matrix_set_row_size) +#endif + { + matrix.SetRowSize( i , count ); + } + + // Set the row entries + matrix.rowSizes[i] = _SetMatrixRow( pointInfo , neighbors , matrix[i] , _sNodes.begin(depth,slice) , integrator , stencil , bsData ); + + + if( depth>_minDepth ) + { + // Offset the constraints using the solution from lower resolutions. + int x , y , z , c; + if( node->parent ) + { + c = int( node - node->parent->children ); + Cube::FactorCornerIndex( c , x , y , z ); + } + else x = y = z = 0; + if( coarseToFine ) + { + typename TreeOctNode::Neighbors< OverlapSize > pNeighbors; + neighborKey.template getNeighbors< false, OverlapRadius , OverlapRadius >( node->parent , pNeighbors ); + _UpdateConstraintsFromCoarser( pointInfo , neighbors , pNeighbors , node , constraints , metSolution , childIntegrator , stencils[x][y][z] , bsData ); + } + } + } + return 1; +} + +template< class Real > +template< int FEMDegree > +int Octree< Real >::_SolveSystemGS( const BSplineData< FEMDegree >& bsData , SparseNodeData< PointData< Real > , 0 >& pointInfo , int depth , DenseNodeData< Real , FEMDegree >& solution , DenseNodeData< Real , FEMDegree >& constraints , DenseNodeData< Real , FEMDegree >& metSolutionConstraints , int iters , bool coarseToFine , bool showResidual , double* bNorm2 , double* inRNorm2 , double* outRNorm2 , bool forceSilent ) +{ + const int OverlapRadius = -BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; + typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator integrator; + typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator childIntegrator; + BSplineIntegrationData< FEMDegree , FEMDegree >::SetIntegrator( integrator , depth-1 , _dirichlet , _dirichlet ); + if( depth>_minDepth ) BSplineIntegrationData< FEMDegree , FEMDegree >::SetChildIntegrator( childIntegrator , depth-2 , _dirichlet , _dirichlet ); + + DenseNodeData< Real , FEMDegree > metSolution , metConstraints; + if( coarseToFine ) metSolution = metSolutionConstraints; // This stores the up-sampled solution up to depth-2 + else metConstraints = metSolutionConstraints; // This stores the down-sampled constraints up to depth + + double _maxMemoryUsage = maxMemoryUsage; + maxMemoryUsage = 0; + int slices = _Dimension< FEMDegree >(depth); + double systemTime=0. , solveTime=0. , updateTime=0. , evaluateTime = 0.; + + if( coarseToFine ) + { + if( depth>_minDepth ) + { + // Up-sample the cumulative change in solution @(depth-2) into the cumulative change in solution @(depth-1) + if( depth-2>=_minDepth ) _UpSample( depth-1 , metSolution ); + // Add in the change in solution @(depth-1) +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=_sNodes.begin(depth-1) ; i<_sNodes.end(depth-1) ; i++ ) metSolution[i] += solution[i]; + // Evaluate the points @(depth) using the cumulative change in solution @(depth-1) + if( _constrainValues ) + { + evaluateTime = Time(); + _SetPointValuesFromCoarser( pointInfo , depth , bsData , metSolution ); + evaluateTime = Time() - evaluateTime; + } + } + } + else if( depth<_sNodes.levels()-1 ) + for( int i=_sNodes.begin(depth) ; i<_sNodes.end(depth) ; i++ ) constraints[i] -= metConstraints[i]; + double bNorm=0 , inRNorm=0 , outRNorm=0; + if( depth>=_minDepth ) + { + // Add padding space if we are computing residuals + int frontOffset = ( showResidual || inRNorm2 ) ? OverlapRadius : 0; + int backOffset = ( showResidual || outRNorm2 ) ? OverlapRadius : 0; + // Set the number of in-memory slices required for a temporally blocked solver + int solveSlices = std::min< int >( OverlapRadius*iters - (OverlapRadius-1) , slices ) , matrixSlices = std::max< int >( 1 , std::min< int >( solveSlices+frontOffset+backOffset , slices ) ); + // The list of matrices for each in-memory slices + std::vector< SparseMatrix< Real > > _M( matrixSlices ); + // The list of multi-colored indices for each in-memory slice + std::vector< std::vector< std::vector< int > > > __mcIndices( std::max< int >( 0 , solveSlices ) ); + + int dir = coarseToFine ? -1 : 1 , start = coarseToFine ? slices-1 : 0 , end = coarseToFine ? -1 : slices; + for( int frontSlice=start-frontOffset*dir , backSlice = frontSlice-OverlapRadius*(iters-1)*dir ; backSlice!=end+backOffset*dir ; frontSlice+=dir , backSlice+=dir ) + { + double t; + if( frontSlice+frontOffset*dir>=0 && frontSlice+frontOffset*dir ) start = _M[_s][j]; + ConstPointer( MatrixEntry< Real > ) end = start + _M[_s].rowSizes[j]; + ConstPointer( MatrixEntry< Real > ) e; + for( e=start ; e!=end ; e++ ) temp += X[ e->N ] * e->Value; + bNorm += B[j]*B[j]; + inRNorm += (temp-B[j]) * (temp-B[j]); + } + else if( bNorm2 ) +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) reduction( + : bNorm ) +#endif + for( int j=0 ; j<_M[_s].rows ; j++ ) bNorm += B[j]*B[j]; + } + t = Time(); + // Compute the multicolor indices + if( iters && frontSlice>=0 && frontSlice( _sNodes.begin(depth,s) , _sNodes.end(depth,s) , __mcIndices[__s] ); + } + // Advance through the in-memory slices, taking an appropriately sized stride + for( int slice=frontSlice ; slice*dir>=backSlice*dir ; slice-=OverlapRadius*dir ) + if( slice>=0 && slice::SolveGS( __mcIndices[__s] , _M[_s] , B , X , !coarseToFine , threads ); + } + solveTime += Time() - t; + // Compute residuals + if( (showResidual || outRNorm2) && backSlice-backOffset*dir>=0 && backSlice-backOffset*dir ) start = _M[_s][j]; + ConstPointer( MatrixEntry< Real > ) end = start + _M[_s].rowSizes[j]; + ConstPointer( MatrixEntry< Real > ) e; + for( e=start ; e!=end ; e++ ) temp += X[ e->N ] * e->Value; + outRNorm += (temp-B[j]) * (temp-B[j]); + } + } + } + } + + if( bNorm2 ) bNorm2[depth] = bNorm; + if( inRNorm2 ) inRNorm2[depth] = inRNorm; + if( outRNorm2 ) outRNorm2[depth] = outRNorm; + if( showResidual && iters ) + { + for( int i=0 ; i %.4e -> %.4e (%.2e) [%d]\n" , sqrt( bNorm ) , sqrt( inRNorm ) , sqrt( outRNorm ) , sqrt( outRNorm/bNorm ) , iters ); + } + + if( !coarseToFine && depth>_minDepth ) + { + // Explicitly compute the restriction of the met solution onto the coarser nodes + // and down-sample the previous accumulation + { + _UpdateConstraintsFromFiner( childIntegrator , bsData , depth , solution , metConstraints ); + if( _constrainValues ) _SetPointConstraintsFromFiner( pointInfo , depth , bsData , solution , metConstraints ); + if( depth<_sNodes.levels()-1 ) _DownSample( depth , metConstraints ); + } + } + MemoryUsage(); + if( !forceSilent ) DumpOutput( "\tEvaluated / Got / Solved in: %6.3f / %6.3f / %6.3f\t(%.3f MB)\n" , evaluateTime , systemTime , solveTime , float( maxMemoryUsage ) ); + maxMemoryUsage = std::max< double >( maxMemoryUsage , _maxMemoryUsage ); + + return iters; +} + +template< class Real > +template< int FEMDegree > +int Octree< Real >::_SolveSystemCG( const BSplineData< FEMDegree >& bsData , SparseNodeData< PointData< Real > , 0 >& pointInfo , int depth , DenseNodeData< Real , FEMDegree >& solution , DenseNodeData< Real , FEMDegree >& constraints , DenseNodeData< Real , FEMDegree >& metSolutionConstraints , int iters , bool coarseToFine , bool showResidual , double* bNorm2 , double* inRNorm2 , double* outRNorm2 , double accuracy ) +{ + typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator integrator; + typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator childIntegrator; + BSplineIntegrationData< FEMDegree , FEMDegree >::SetIntegrator( integrator , depth-1 , _dirichlet , _dirichlet ); + if( depth>_minDepth ) BSplineIntegrationData< FEMDegree , FEMDegree >::SetChildIntegrator( childIntegrator , depth-2 , _dirichlet , _dirichlet ); + + DenseNodeData< Real , FEMDegree > metSolution , metConstraints; + if( coarseToFine ) metSolution = metSolutionConstraints; // This stores the up-sampled solution up to depth-2 + else metConstraints = metSolutionConstraints; // This stores the down-sampled constraints up to depth + double _maxMemoryUsage = maxMemoryUsage; + maxMemoryUsage = 0; + int iter = 0; + Pointer( Real ) X = solution.data + _sNodes.begin( depth ); + Pointer( Real ) B = constraints.data + _sNodes.begin( depth ); + SparseMatrix< Real > M; + double systemTime=0. , solveTime=0. , updateTime=0. , evaluateTime = 0.; + + if( coarseToFine ) + { + if( depth>_minDepth ) + { + // Up-sample the cumulative change in solution @(depth-2) into the cumulative change in solution @(depth-1) + if( depth-2>=_minDepth ) _UpSample( depth-1 , metSolution ); + // Add in the change in solution @(depth-1) +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=_sNodes.begin(depth-1) ; i<_sNodes.end(depth-1) ; i++ ) metSolution[i] += solution[i]; + // Evaluate the points @(depth) using the cumulative change in solution @(depth-1) + if( _constrainValues ) + { + evaluateTime = Time(); + _SetPointValuesFromCoarser( pointInfo , depth , bsData , metSolution ); + evaluateTime = Time() - evaluateTime; + } + } + } + else if( depth<_sNodes.levels()-1 ) + for( int i=_sNodes.begin(depth) ; i<_sNodes.end(depth) ; i++ ) constraints[i] -= metConstraints[i]; + + // Get the system matrix (and adjust the right-hand-side based on the coarser solution if prolonging) + systemTime = Time(); + _GetMatrixAndUpdateConstraints( pointInfo , M , constraints , integrator , childIntegrator , bsData , depth , coarseToFine ? &metSolution : NULL , coarseToFine ); + systemTime = Time()-systemTime; + + solveTime = Time(); + // Solve the linear system + accuracy = Real( accuracy / 100000 ) * M.rows; + int dim = _Dimension< FEMDegree >( depth ); + int nonZeroRows = 0; + for( int i=0 ; i( _sNodes.size(depth) ); + if( addDCTerm ) M.MultiplyAndAddAverage( ( ConstPointer( Real ) )X , temp , threads ); + else M.Multiply( ( ConstPointer( Real ) )X , temp , threads ); +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=0 ; i<_sNodes.size(depth) ; i++ ) temp[i] -= B[i]; +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) reduction( + : inRNorm ) +#endif + for( int i=0 ; i<_sNodes.size(depth) ; i++ ) inRNorm += temp[i] * temp[i]; + FreePointer( temp ); + } + + iters = std::min< int >( nonZeroRows , iters ); + if( iters ) iter += SparseMatrix< Real >::SolveCG( M , ( ConstPointer( Real ) )B , iters , X , Real( accuracy ) , 0 , addDCTerm , false , threads ); + solveTime = Time()-solveTime; + if( showResidual || outRNorm2 ) + { + outRNorm = 0; + Pointer( Real ) temp = AllocPointer< Real >( _sNodes.size(depth) ); + if( addDCTerm ) M.MultiplyAndAddAverage( ( ConstPointer( Real ) )X , temp , threads ); + else M.Multiply( ( ConstPointer( Real ) )X , temp , threads ); +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=0 ; i<_sNodes.size(depth) ; i++ ) temp[i] -= B[i]; +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) reduction( + : outRNorm ) +#endif + for( int i=0 ; i<_sNodes.size(depth) ; i++ ) outRNorm += temp[i] * temp[i]; + FreePointer( temp ); + } + if( bNorm2 ) bNorm2[depth] = bNorm * bNorm; + if( inRNorm2 ) inRNorm2[depth] = inRNorm * inRNorm; + if( outRNorm2 ) outRNorm2[depth] = outRNorm * outRNorm; + if( showResidual && iters ) + { + for( int i=0 ; i %.4e -> %.4e (%.2e) [%d]\n" , bNorm , inRNorm , outRNorm , outRNorm/bNorm , iter ); + } + + if( !coarseToFine && depth>_minDepth ) + { + // Explicitly compute the restriction of the met solution onto the coarser nodes + // and down-sample the previous accumulation + { + _UpdateConstraintsFromFiner( childIntegrator , bsData , depth , solution , metConstraints ); + if( _constrainValues ) _SetPointConstraintsFromFiner( pointInfo , depth , bsData , solution , metConstraints ); + if( depth<_sNodes.levels()-1 ) _DownSample( depth , metConstraints ); + } + } + + MemoryUsage(); + DumpOutput( "\tEvaluated / Got / Solved in: %6.3f / %6.3f / %6.3f\t(%.3f MB)\n" , evaluateTime , systemTime , solveTime , float( maxMemoryUsage ) ); + maxMemoryUsage = std::max< double >( maxMemoryUsage , _maxMemoryUsage ); + return iter; +} + +template< class Real > +template< int FEMDegree > +int Octree< Real >::_GetMatrixRowSize( const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& neighbors ) const +{ + static const int OverlapSize = BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize; + static const int OverlapRadius = - BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; + + int count = 0; + int nodeIndex = neighbors.neighbors[OverlapRadius][OverlapRadius][OverlapRadius]->nodeData.nodeIndex; + const TreeOctNode* const * _nodes = &neighbors.neighbors[0][0][0]; + for( int i=0 ; i( _nodes[i] ) ) count++; + return count; +} + + +template< class Real > +template< int FEMDegree1 , int FEMDegree2 > +void Octree< Real >::_SetParentOverlapBounds( const TreeOctNode* node , int& startX , int& endX , int& startY , int& endY , int& startZ , int& endZ ) +{ + const int OverlapStart = BSplineIntegrationData< FEMDegree1 , FEMDegree2 >::OverlapStart; + + if( node->parent ) + { + int x , y , z , c = int( node - node->parent->children ); + Cube::FactorCornerIndex( c , x , y , z ); + startX = BSplineIntegrationData< FEMDegree1 , FEMDegree2 >::ParentOverlapStart[x]-OverlapStart , endX = BSplineIntegrationData< FEMDegree1 , FEMDegree2 >::ParentOverlapEnd[x]-OverlapStart+1; + startY = BSplineIntegrationData< FEMDegree1 , FEMDegree2 >::ParentOverlapStart[y]-OverlapStart , endY = BSplineIntegrationData< FEMDegree1 , FEMDegree2 >::ParentOverlapEnd[y]-OverlapStart+1; + startZ = BSplineIntegrationData< FEMDegree1 , FEMDegree2 >::ParentOverlapStart[z]-OverlapStart , endZ = BSplineIntegrationData< FEMDegree1 , FEMDegree2 >::ParentOverlapEnd[z]-OverlapStart+1; + } +} + +// It is assumed that at this point, the evaluationg of the current depth's points, using the coarser resolution solution +// has already happened +template< class Real > +template< int FEMDegree > +void Octree< Real >::_UpdateConstraintsFromCoarser( const SparseNodeData< PointData< Real > , 0 >& pointInfo , const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& neighbors , const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& pNeighbors , TreeOctNode* node , DenseNodeData< Real , FEMDegree >& constraints , const DenseNodeData< Real , FEMDegree >& metSolution , const typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator , const Stencil< double , BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& lapStencil , const BSplineData< FEMDegree >& bsData ) const +{ + static const int OverlapSize = BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; + static const int LeftSupportRadius = -BSplineEvaluationData< FEMDegree >::SupportStart; + static const int RightSupportRadius = BSplineEvaluationData< FEMDegree >::SupportEnd; + static const int OverlapRadius = - BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; + + const std::vector< PointData< Real > >& points = pointInfo.data; + if( node->depth()<=_minDepth ) return; + // This is a conservative estimate as we only need to make sure that the parent nodes don't overlap the child (not the parent itself) + bool isInterior = _IsInteriorlyOverlapped< FEMDegree , FEMDegree >( node->parent ); + int d , off[3]; + node->depthAndOffset( d , off ); + Real constraint = Real( 0 ); + // Offset the constraints using the solution from lower resolutions. + int startX , endX , startY , endY , startZ , endZ; + _SetParentOverlapBounds< FEMDegree , FEMDegree >( node , startX , endX , startY , endY , startZ , endZ ); + + for( int x=startX ; x( pNeighbors.neighbors[x][y][z] ) ) + { + const TreeOctNode* _node = pNeighbors.neighbors[x][y][z]; + Real _solution = metSolution[ _node->nodeData.nodeIndex ]; + { + if( isInterior ) constraints[ node->nodeData.nodeIndex ] -= Real( lapStencil.values[x][y][z] * _solution ); + else + { + int _d , _off[3]; + _node->depthAndOffset( _d , _off ); + constraints[ node->nodeData.nodeIndex ] -= Real( SystemCoefficients< FEMDegree , FEMDegree >::GetLaplacian( childIntegrator , _off , off ) * _solution ); + } + } + } + if( _constrainValues ) + { + double constraint = 0; + int fIdx[3]; + FunctionIndex< FEMDegree >( node , fIdx ); + // Evaluate the current node's basis function at adjacent points + for( int x=-LeftSupportRadius ; x<=RightSupportRadius ; x++ ) for( int y=-LeftSupportRadius ; y<=RightSupportRadius ; y++ ) for( int z=-LeftSupportRadius ; z<=RightSupportRadius ; z++ ) + { + const TreeOctNode* _node = neighbors.neighbors[x+OverlapRadius][y+OverlapRadius][z+OverlapRadius]; + if( _IsValidNode< 0 >( _node ) && pointInfo.index( _node )!=-1 ) + { + const PointData< Real >& pData = points[ pointInfo.index( _node ) ]; + Point3D< Real > p = pData.position; + constraint += + bsData.baseBSplines[ fIdx[0] ][x+LeftSupportRadius]( p[0] ) * + bsData.baseBSplines[ fIdx[1] ][y+LeftSupportRadius]( p[1] ) * + bsData.baseBSplines[ fIdx[2] ][z+LeftSupportRadius]( p[2] ) * + pData.weightedCoarserDValue; + } + } + constraints[ node->nodeData.nodeIndex ] -= Real( constraint ); + } +} + +// Given the solution @( depth ) add to the met constraints @( depth-1 ) +template< class Real > +template< int FEMDegree > +void Octree< Real >::_UpdateConstraintsFromFiner( const typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator , const BSplineData< FEMDegree >& bsData , int depth , const DenseNodeData< Real , FEMDegree >& fineSolution , DenseNodeData< Real , FEMDegree >& coarseConstraints ) const +{ + static const int OverlapSize = BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize; + static const int OverlapRadius = - BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; + typedef typename TreeOctNode::NeighborKey< -BSplineEvaluationData< FEMDegree >::SupportStart , BSplineEvaluationData< FEMDegree >::SupportEnd >SupportKey; + + if( depth<=_minDepth ) return; + // Get the stencil describing the Laplacian relating coefficients @(depth) with coefficients @(depth-1) + Stencil< double , OverlapSize > stencils[2][2][2]; + SystemCoefficients< FEMDegree , FEMDegree >::SetCentralLaplacianStencils( childIntegrator , stencils ); + size_t start = _sNodes.begin(depth) , end = _sNodes.end(depth) , range = end-start; + int lStart = _sNodes.begin(depth-1); + memset( coarseConstraints.data + _sNodes.begin(depth-1) , 0 , sizeof(Real)*_sNodes.size(depth-1) ); + + // Iterate over the nodes @( depth ) + std::vector< SupportKey > neighborKeys( std::max< int >( 1 , threads ) ); + for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) + { + SupportKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; + TreeOctNode* node = _sNodes.treeNodes[i]; + + // Offset the coarser constraints using the solution from the current resolutions. + int x , y , z , c; + c = int( node - node->parent->children ); + Cube::FactorCornerIndex( c , x , y , z ); + { + typename TreeOctNode::Neighbors< OverlapSize > pNeighbors; + neighborKey.template getNeighbors< false , OverlapRadius , OverlapRadius >( node->parent , pNeighbors ); + const Stencil< double , OverlapSize >& lapStencil = stencils[x][y][z]; + + bool isInterior = _IsInteriorlyOverlapped< FEMDegree , FEMDegree >( node->parent ); + int d , off[3]; + node->depthAndOffset( d , off ); + + // Offset the constraints using the solution from finer resolutions. + int startX , endX , startY , endY , startZ , endZ; + _SetParentOverlapBounds< FEMDegree , FEMDegree >( node , startX , endX , startY , endY , startZ , endZ ); + + Real solution = fineSolution[ node->nodeData.nodeIndex ]; + for( int x=startX ; x( pNeighbors.neighbors[x][y][z] ) ) + { + const TreeOctNode* _node = pNeighbors.neighbors[x][y][z]; + if( isInterior ) +#ifdef _OPENMP +#pragma omp atomic +#endif + coarseConstraints[ _node->nodeData.nodeIndex ] += Real( lapStencil.values[x][y][z] * solution ); + else + { + int _d , _off[3]; + _node->depthAndOffset( _d , _off ); +#ifdef _OPENMP +#pragma omp atomic +#endif + coarseConstraints[ _node->nodeData.nodeIndex ] += Real( SystemCoefficients< FEMDegree , FEMDegree >::GetLaplacian( childIntegrator , _off , off ) * solution ); + } + } + } + } +} + + +template< class Real > +template< int FEMDegree > +DenseNodeData< Real , FEMDegree > Octree< Real >::SolveSystem( SparseNodeData< PointData< Real > , 0 >& pointInfo , DenseNodeData< Real , FEMDegree >& constraints , bool showResidual , int iters , int maxSolveDepth , int cgDepth , double accuracy ) +{ + BSplineData< FEMDegree > bsData; + bsData.set( maxSolveDepth , _dirichlet ); + + maxSolveDepth++; + int iter=0; + iters = std::max< int >( 0 , iters ); + + DenseNodeData< Real , FEMDegree > solution( _sNodes.size() ); + memset( solution.data , 0 , sizeof(Real)*_sNodes.size() ); + + solution[0] = 0; + + DenseNodeData< Real , FEMDegree > metSolution( _sNodes.end( _sNodes.levels()-2 ) ); + memset( metSolution.data , 0 , sizeof(Real)*_sNodes.end( _sNodes.levels()-2 ) ); + for( int d=_minDepth ; d<_sNodes.levels() ; d++ ) + { + DumpOutput( "Depth[%d/%d]: %d\n" , d-1 , _sNodes.levels()-2 , _sNodes.size( d ) ); + if( d==_minDepth ) _SolveSystemCG( bsData , pointInfo , d , solution , constraints , metSolution , _sNodes.size(_minDepth) , true , showResidual , NULL , NULL , NULL ); + else + { + if( d>cgDepth ) iter += _SolveSystemGS( bsData , pointInfo , d , solution , constraints , metSolution , d>maxSolveDepth ? 0 : iters , true , showResidual , NULL , NULL , NULL ); + else iter += _SolveSystemCG( bsData , pointInfo , d , solution , constraints , metSolution , d>maxSolveDepth ? 0 : iters , true , showResidual , NULL , NULL , NULL , accuracy ); + } + } + metSolution.resize( 0 ); + return solution; +} + +template< class Real > +template< int FEMDegree , int NormalDegree > +DenseNodeData< Real , FEMDegree > Octree< Real >::SetLaplacianConstraints( const SparseNodeData< Point3D< Real > , NormalDegree >& normalInfo ) +{ + typedef typename TreeOctNode::NeighborKey< -BSplineEvaluationData< FEMDegree >::SupportStart , BSplineEvaluationData< FEMDegree >::SupportEnd > SupportKey; + const int OverlapSize = BSplineIntegrationData< NormalDegree , FEMDegree >::OverlapSize; + const int LeftNormalFEMOverlapRadius = -BSplineIntegrationData< NormalDegree , FEMDegree >::OverlapStart; + const int RightNormalFEMOverlapRadius = BSplineIntegrationData< NormalDegree , FEMDegree >::OverlapEnd; + const int LeftFEMNormalOverlapRadius = -BSplineIntegrationData< FEMDegree , NormalDegree >::OverlapStart; + const int RightFEMNormalOverlapRadius = BSplineIntegrationData< FEMDegree , NormalDegree >::OverlapEnd; + + // To set the Laplacian constraints, we iterate over the + // splatted normals and compute the dot-product of the + // divergence of the normal field with all the basis functions. + // Within the same depth: set directly as a gather + // Coarser depths + int maxDepth = _sNodes.levels()-1; + DenseNodeData< Real , FEMDegree > constraints( _sNodes.size() ) , _constraints( _sNodes.end( maxDepth-1 ) ); + memset( constraints.data , 0 , sizeof(Real)*_sNodes.size() ); + memset( _constraints.data , 0 , sizeof(Real)*( _sNodes.end(maxDepth-1) ) ); + MemoryUsage(); + + for( int d=maxDepth ; d>=_minDepth ; d-- ) + { + int offset = d>0 ? _sNodes.begin(d-1) : 0; + Stencil< Point3D< double > , OverlapSize > stencil , stencils[2][2][2]; + typename BSplineIntegrationData< NormalDegree , FEMDegree >::FunctionIntegrator::Integrator integrator; + typename BSplineIntegrationData< FEMDegree , NormalDegree >::FunctionIntegrator::ChildIntegrator childIntegrator; + BSplineIntegrationData< NormalDegree , FEMDegree >::SetIntegrator( integrator , d-1 , _dirichlet , _dirichlet ); + if( d>_minDepth ) BSplineIntegrationData< FEMDegree , NormalDegree >::SetChildIntegrator( childIntegrator , d-2 , _dirichlet , _dirichlet ); + SystemCoefficients< NormalDegree , FEMDegree >::SetCentralDivergenceStencil ( integrator , stencil , false ); + SystemCoefficients< FEMDegree , NormalDegree >::SetCentralDivergenceStencils( childIntegrator , stencils , true ); + + std::vector< SupportKey > neighborKeys( std::max< int >( 1 , threads ) ); + for( size_t i=0 ; idepth(); + typename TreeOctNode::Neighbors< OverlapSize > neighbors; + neighborKey.template getNeighbors< false , LeftFEMNormalOverlapRadius , RightFEMNormalOverlapRadius >( node , neighbors ); + bool isInterior = _IsInteriorlyOverlapped< FEMDegree , NormalDegree >( node ) , isInterior2 = _IsInteriorlyOverlapped< NormalDegree , FEMDegree >( node->parent ); + + int cx , cy , cz; + if( d>_minDepth ) Cube::FactorCornerIndex( (int)( node-node->parent->children) , cx , cy ,cz ); + else cx = cy = cz = 0; + Stencil< Point3D< double > , OverlapSize >& _stencil = stencils[cx][cy][cz]; + int d , off[3]; + node->depthAndOffset( d , off ); + // Set constraints from current depth + // Gather the constraints from the vector-field at _node into the constraint stored with node + if( _IsValidNode< FEMDegree >( node ) ) + { + for( int x=startX ; x( _node ) ) + { + int _idx = normalInfo.index( _node ); + if( _idx>=0 ) + { + if( isInterior ) + { + constraints[i] += Point3D< Real >::Dot( stencil.values[x][y][z] , normalInfo.data[ _idx ] ); + } + else + { + int _d , _off[3]; + _node->depthAndOffset( _d , _off ); + constraints[i] += Real( SystemCoefficients< NormalDegree , FEMDegree >::GetDivergence2( integrator , _off , off , normalInfo.data[ _idx ] ) ); + } + } + } + } + _SetParentOverlapBounds< NormalDegree , FEMDegree >( node , startX , endX , startY , endY , startZ , endZ ); + } + if( !_IsValidNode< NormalDegree >( node ) ) continue; + int idx = normalInfo.index( node ); + if( idx<0 ) continue; + const Point3D< Real >& normal = normalInfo.data[ idx ]; + if( normal[0]==0 && normal[1]==0 && normal[2]==0 ) continue; + + // Set the _constraints for the parents + if( depth>_minDepth ) + { + neighborKey.template getNeighbors< false , LeftNormalFEMOverlapRadius , RightNormalFEMOverlapRadius >( node->parent , neighbors ); + + for( int x=startX ; x( _node ) ) ) + { + TreeOctNode* _node = neighbors.neighbors[x][y][z]; + Real c; + if( isInterior2 ) c = Point3D< Real >::Dot( _stencil.values[x][y][z] , normal ); + else + { + int _d , _off[3]; + _node->depthAndOffset( _d , _off ); + c = Real( SystemCoefficients< FEMDegree , NormalDegree >::GetDivergence1( childIntegrator , _off , off , normal ) ); + } +#ifdef _OPENMP +#pragma omp atomic +#endif + _constraints[ _node->nodeData.nodeIndex ] += c; + } + } + } + } + MemoryUsage(); + } + + // Fine-to-coarse down-sampling of constraints + for( int d=maxDepth-1 ; d>_minDepth ; d-- ) _DownSample( d , _constraints ); + + // Add the accumulated constraints from all finer depths +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=0 ; i<_sNodes.end(maxDepth-1) ; i++ ) constraints[i] += _constraints[i]; + + _constraints.resize( 0 ); + + DenseNodeData< Point3D< Real > , NormalDegree > coefficients( _sNodes.end( maxDepth-1 ) ); + for( int d=maxDepth-1 ; d>=_minDepth ; d-- ) + { +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=_sNodes.begin(d) ; i<_sNodes.end(d) ; i++ ) if( _IsValidNode< NormalDegree >( _sNodes.treeNodes[i] ) ) + { + int idx = normalInfo.index( _sNodes.treeNodes[i] ); + if( idx<0 ) continue; + coefficients[i] = normalInfo.data[ idx ]; + } + } + + // Coarse-to-fine up-sampling of coefficients + for( int d=_minDepth+1 ; d , OverlapSize > stencils[2][2][2]; + typename BSplineIntegrationData< NormalDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator childIntegrator; + if( d>_minDepth ) BSplineIntegrationData< NormalDegree , FEMDegree >::SetChildIntegrator( childIntegrator , d-2 , _dirichlet , _dirichlet ); + SystemCoefficients< NormalDegree , FEMDegree >::SetCentralDivergenceStencils( childIntegrator , stencils , false ); + std::vector< SupportKey > neighborKeys( std::max< int >( 1 , threads ) ); + for( size_t i=0 ; i( _sNodes.treeNodes[i] ) ) + { + SupportKey& neighborKey = neighborKeys[ omp_get_thread_num() ]; + TreeOctNode* node = _sNodes.treeNodes[i]; + int depth = node->depth(); + if( !depth ) continue; + int startX , endX , startY , endY , startZ , endZ; + _SetParentOverlapBounds< FEMDegree , NormalDegree >( node , startX , endX , startY , endY , startZ , endZ ); + typename TreeOctNode::Neighbors< OverlapSize > neighbors; + neighborKey.template getNeighbors< false , LeftFEMNormalOverlapRadius , RightFEMNormalOverlapRadius >( node->parent , neighbors ); + + bool isInterior = _IsInteriorlyOverlapped< FEMDegree , NormalDegree >( node->parent ); + int cx , cy , cz; + if( d ) + { + int c = int( node - node->parent->children ); + Cube::FactorCornerIndex( c , cx , cy , cz ); + } + else cx = cy = cz = 0; + Stencil< Point3D< double > , OverlapSize >& _stencil = stencils[cx][cy][cz]; + + Real constraint = Real(0); + int d , off[3]; + node->depthAndOffset( d , off ); + for( int x=startX ; x( _node ) ) + { + int _i = _node->nodeData.nodeIndex; + if( isInterior ) constraint += Point3D< Real >::Dot( coefficients[_i] , _stencil.values[x][y][z] ); + else + { + int _d , _off[3]; + _node->depthAndOffset( _d , _off ); + constraint += Real( SystemCoefficients< NormalDegree , FEMDegree >::GetDivergence2( childIntegrator , _off , off , coefficients[_i] ) ); + } + } + } + constraints[ node->nodeData.nodeIndex ] += constraint; + } + } + MemoryUsage(); + coefficients.resize( 0 ); + + return constraints; +} diff --git a/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.WeightedSamples.inl b/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.WeightedSamples.inl old mode 100755 new mode 100644 index 3c199167..695a0d70 --- a/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.WeightedSamples.inl +++ b/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.WeightedSamples.inl @@ -1,598 +1,598 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - -// Evaluate the result of splatting along a plane and then evaluating at a point on the plane. -template< int Degree > double GetScaleValue( void ) -{ - double centerValues[Degree+1]; - Polynomial< Degree >::BSplineComponentValues( 0.5 , centerValues ); - double scaleValue = 0; - for( int i=0 ; i<=Degree ; i++ ) scaleValue += centerValues[i] * centerValues[i]; - return 1./ scaleValue; -} -template< class Real > -template< int WeightDegree > -void Octree< Real >::_AddWeightContribution( SparseNodeData< Real , WeightDegree >& densityWeights , TreeOctNode* node , Point3D< Real > position , PointSupportKey< WeightDegree >& weightKey , Real weight ) -{ - static const double ScaleValue = GetScaleValue< WeightDegree >(); - double dx[ DIMENSION ][ PointSupportKey< WeightDegree >::Size ]; - typename TreeOctNode::Neighbors< PointSupportKey< WeightDegree >::Size >& neighbors = weightKey.template getNeighbors< true >( node ); - - if( densityWeights.indices.size() start; - Real w; - _StartAndWidth( node , start , w ); - - for( int dim=0 ; dim::BSplineComponentValues( ( position[dim]-start[dim] ) / w , dx[dim] ); - - weight *= (Real)ScaleValue; - - for( int i=0 ; i::Size ; i++ ) for( int j=0 ; j::Size ; j++ ) - { - double dxdy = dx[0][i] * dx[1][j] * weight; - TreeOctNode** _neighbors = neighbors.neighbors[i][j]; - for( int k=0 ; k::Size ; k++ ) if( _neighbors[k] ) - { - int idx = densityWeights.index( _neighbors[k] ); - if( idx<0 ) - { - densityWeights.indices[ _neighbors[k]->nodeData.nodeIndex ] = (int)densityWeights.data.size(); - densityWeights.data.push_back( (Real)( dxdy * dx[2][k] ) ); - } - else densityWeights.data[idx] += Real( dxdy * dx[2][k] ); - } - } -} - -template< class Real > -template< int WeightDegree > -Real Octree< Real >::_GetSamplesPerNode( const SparseNodeData< Real , WeightDegree >& densityWeights , TreeOctNode* node , Point3D< Real > position , PointSupportKey< WeightDegree >& weightKey ) -{ - Real weight = 0; - double dx[ DIMENSION ][ PointSupportKey< WeightDegree >::Size ]; - typename TreeOctNode::Neighbors< PointSupportKey< WeightDegree >::Size >& neighbors = weightKey.template getNeighbors< true >( node ); - - Point3D< Real > start; - Real w; - _StartAndWidth( node , start , w ); - - for( int dim=0 ; dim::BSplineComponentValues( ( position[dim]-start[dim] ) / w , dx[dim] ); - - for( int i=0 ; i::Size ; i++ ) for( int j=0 ; j::Size ; j++ ) - { - double dxdy = dx[0][i] * dx[1][j]; - for( int k=0 ; k::Size ; k++ ) if( neighbors.neighbors[i][j][k] ) - { - int idx = densityWeights.index( neighbors.neighbors[i][j][k] ); - if( idx>=0 ) weight += Real( dxdy * dx[2][k] * densityWeights.data[idx] ); - } - } - return weight; -} -template< class Real > -template< int WeightDegree > -Real Octree< Real >::_GetSamplesPerNode( const SparseNodeData< Real , WeightDegree >& densityWeights , const TreeOctNode* node , Point3D< Real > position , ConstPointSupportKey< WeightDegree >& weightKey ) const -{ - Real weight = 0; - double dx[ DIMENSION ][ PointSupportKey< WeightDegree >::Size ]; - typename TreeOctNode::ConstNeighbors< PointSupportKey< WeightDegree >::Size >& neighbors = weightKey.getNeighbors( node ); - - Point3D< Real > start; - Real w; - _StartAndWidth( node , start , w ); - - for( int dim=0 ; dim::BSplineComponentValues( ( position[dim]-start[dim] ) / w , dx[dim] ); - - for( int i=0 ; i::Size ; i++ ) for( int j=0 ; j::Size ; j++ ) - { - double dxdy = dx[0][i] * dx[1][j]; - for( int k=0 ; k::Size ; k++ ) if( neighbors.neighbors[i][j][k] ) - { - int idx = densityWeights.index( neighbors.neighbors[i][j][k] ); - if( idx>=0 ) weight += Real( dxdy * dx[2][k] * densityWeights.data[idx] ); - } - } - return weight; -} -template< class Real > -template< int WeightDegree > -void Octree< Real >::_GetSampleDepthAndWeight( const SparseNodeData< Real , WeightDegree >& densityWeights , const TreeOctNode* node , Point3D< Real > position , ConstPointSupportKey< WeightDegree >& weightKey , Real& depth , Real& weight ) const -{ - const TreeOctNode* temp = node; - weight = _GetSamplesPerNode( densityWeights , temp , position , weightKey ); - if( weight>=(Real)1. ) depth = Real( _Depth( temp ) + log( weight ) / log(double(1<<(DIMENSION-1))) ); - else - { - Real oldWeight , newWeight; - oldWeight = newWeight = weight; - while( newWeight<(Real)1. && temp->parent ) - { - temp=temp->parent; - oldWeight = newWeight; - newWeight = _GetSamplesPerNode( densityWeights , temp , position , weightKey ); - } - depth = Real( _Depth( temp ) + log( newWeight ) / log( newWeight / oldWeight ) ); - } - weight = Real( pow( double(1<<(DIMENSION-1)) , -double(depth) ) ); -} -template< class Real > -template< int WeightDegree > -void Octree< Real >::_GetSampleDepthAndWeight( const SparseNodeData< Real , WeightDegree >& densityWeights , TreeOctNode* node , Point3D< Real > position , PointSupportKey< WeightDegree >& weightKey , Real& depth , Real& weight ) -{ - TreeOctNode* temp = node; - weight = _GetSamplesPerNode( densityWeights , temp , position , weightKey ); - if( weight>=(Real)1. ) depth = Real( _Depth( temp ) + log( weight ) / log(double(1<<(DIMENSION-1))) ); - else - { - Real oldWeight , newWeight; - oldWeight = newWeight = weight; - while( newWeight<(Real)1. && temp->parent ) - { - temp=temp->parent; - oldWeight = newWeight; - newWeight = _GetSamplesPerNode( densityWeights , temp , position, weightKey ); - } - depth = Real( _Depth( temp ) + log( newWeight ) / log( newWeight / oldWeight ) ); - } - weight = Real( pow( double(1<<(DIMENSION-1)) , -double(depth) ) ); -} -template< class Real > -template< int WeightDegree > -void Octree< Real >::_GetSampleDepthAndWeight( const SparseNodeData< Real , WeightDegree >& densityWeights , Point3D< Real > position , ConstPointSupportKey< WeightDegree >& weightKey , Real& depth , Real& weight ) -{ - TreeOctNode* temp; - Point3D< Real > myCenter( (Real)0.5 , (Real)0.5 , (Real)0.5 ); - Real myWidth = Real( 1. ); - - // Get the finest node with depth less than or equal to the splat depth that contains the point - temp = _spaceRoot; - while( _Depth( temp )<_splatDepth ) - { - if( !temp->children ) break;// fprintf( stderr , "[ERROR] Octree::GetSampleDepthAndWeight\n" ) , exit( 0 ); - int cIndex = TreeOctNode::CornerIndex( myCenter , position ); - temp = &temp->children[cIndex]; - myWidth /= 2; - if( cIndex&1 ) myCenter[0] += myWidth/2; - else myCenter[0] -= myWidth/2; - if( cIndex&2 ) myCenter[1] += myWidth/2; - else myCenter[1] -= myWidth/2; - if( cIndex&4 ) myCenter[2] += myWidth/2; - else myCenter[2] -= myWidth/2; - } - return _GetSampleDepthAndWeight( densityWeights , temp , position , weightKey , depth , weight ); -} -template< class Real > -template< int WeightDegree > -void Octree< Real >::_GetSampleDepthAndWeight( const SparseNodeData< Real , WeightDegree >& densityWeights , Point3D< Real > position , PointSupportKey< WeightDegree >& weightKey , Real& depth , Real& weight ) -{ - TreeOctNode* temp; - Point3D< Real > myCenter( (Real)0.5 , (Real)0.5 , (Real)0.5 ); - Real myWidth = Real( 1. ); - - // Get the finest node with depth less than or equal to the splat depth that contains the point - temp = _spaceRoot; - while( _Depth( temp )<_splatDepth ) - { - if( !temp->children ) break;// fprintf( stderr , "[ERROR] Octree::GetSampleDepthAndWeight\n" ) , exit( 0 ); - int cIndex = TreeOctNode::CornerIndex( myCenter , position ); - temp = &temp->children[cIndex]; - myWidth /= 2; - if( cIndex&1 ) myCenter[0] += myWidth/2; - else myCenter[0] -= myWidth/2; - if( cIndex&2 ) myCenter[1] += myWidth/2; - else myCenter[1] -= myWidth/2; - if( cIndex&4 ) myCenter[2] += myWidth/2; - else myCenter[2] -= myWidth/2; - } - return _GetSampleDepthAndWeight( densityWeights , temp , position , weightKey , depth , weight ); -} - - -template< class Real > -template< int DataDegree , class V > -void Octree< Real >::_SplatPointData( TreeOctNode* node , Point3D< Real > position , V v , SparseNodeData< V , DataDegree >& dataInfo , PointSupportKey< DataDegree >& dataKey ) -{ - double dx[ DIMENSION ][ PointSupportKey< DataDegree >::Size ]; - typename TreeOctNode::Neighbors< PointSupportKey< DataDegree >::Size >& neighbors = dataKey.template getNeighbors< true >( node ); - - Point3D< Real > start; - Real w; - _StartAndWidth( node , start , w ); - - for( int dd=0 ; dd::BSplineComponentValues( ( position[dd]-start[dd] ) / w , dx[dd] ); - - for( int i=0 ; i::Size ; i++ ) for( int j=0 ; j::Size ; j++ ) - { - double dxdy = dx[0][i] * dx[1][j]; - for( int k=0 ; k::Size ; k++ ) - if( neighbors.neighbors[i][j][k] ) - { - TreeOctNode* _node = neighbors.neighbors[i][j][k]; - - double dxdydz = dxdy * dx[2][k]; - if( (int)dataInfo.indices.size()nodeData.nodeIndex ] = (int)dataInfo.data.size(); - dataInfo.data.push_back( v * Real(dxdydz) ); - } - else dataInfo.data[idx] += v * Real( dxdydz ); - } - } -} -template< class Real > -template< int WeightDegree , int DataDegree , class V > -Real Octree< Real >::_SplatPointData( const SparseNodeData< Real , WeightDegree >& densityWeights , Point3D< Real > position , V v , SparseNodeData< V , DataDegree >& dataInfo , PointSupportKey< WeightDegree >& weightKey , PointSupportKey< DataDegree >& dataKey , int minDepth , int maxDepth , int dim ) -{ - double dx; - V _v; - TreeOctNode* temp; - int cnt=0; - double width; - Point3D< Real > myCenter( (Real)0.5 , (Real)0.5 , (Real)0.5 ); - Real myWidth = (Real)1.; - - temp = _spaceRoot; - while( _Depth( temp )<_splatDepth ) - { - if( !temp->children ) fprintf( stderr , "[ERROR] Octree::SplatPointData\n" ) , exit( 0 ); - int cIndex = TreeOctNode::CornerIndex( myCenter , position ); - temp = &temp->children[cIndex]; - myWidth /= 2; - if( cIndex&1 ) myCenter[0] += myWidth/2; - else myCenter[0] -= myWidth/2; - if( cIndex&2 ) myCenter[1] += myWidth/2; - else myCenter[1] -= myWidth/2; - if( cIndex&4 ) myCenter[2] += myWidth/2; - else myCenter[2] -= myWidth/2; - } - Real weight , depth; - _GetSampleDepthAndWeight( densityWeights , temp , position , weightKey , depth , weight ); - - if( depthmaxDepth ) depth = Real(maxDepth); - int topDepth = int(ceil(depth)); - - dx = 1.0-(topDepth-depth); - if ( topDepth<=minDepth ) topDepth = minDepth , dx = 1; - else if( topDepth> maxDepth ) topDepth = maxDepth , dx = 1; - - while( _Depth( temp )>topDepth ) temp=temp->parent; - while( _Depth( temp )children ) temp->initChildren(); - int cIndex = TreeOctNode::CornerIndex( myCenter , position ); - temp = &temp->children[cIndex]; - myWidth/=2; - if( cIndex&1 ) myCenter[0] += myWidth/2; - else myCenter[0] -= myWidth/2; - if( cIndex&2 ) myCenter[1] += myWidth/2; - else myCenter[1] -= myWidth/2; - if( cIndex&4 ) myCenter[2] += myWidth/2; - else myCenter[2] -= myWidth/2; - } - width = 1.0 / ( ( 1<<( _Depth( temp ) ) ) ); - _v = v * weight / Real( pow( width , dim ) ) * Real( dx ); - _SplatPointData( temp , position , _v , dataInfo , dataKey ); - if( fabs(1.0-dx) > EPSILON ) - { - dx = Real(1.0-dx); - temp = temp->parent; - width = 1.0 / ( ( 1<<( _Depth( temp ) ) ) ); - - _v = v * weight / Real( pow( width , dim ) ) * Real( dx ); - _SplatPointData( temp , position , _v , dataInfo , dataKey ); - } - return weight; -} -template< class Real > -template< int WeightDegree , int DataDegree , class V > -void Octree< Real >::_MultiSplatPointData( const SparseNodeData< Real , WeightDegree >* densityWeights , Point3D< Real > position , V v , SparseNodeData< V , DataDegree >& dataInfo , PointSupportKey< WeightDegree >& weightKey , PointSupportKey< DataDegree >& dataKey , int maxDepth , int dim ) -{ - Real _depth , weight; - if( densityWeights ) _GetSampleDepthAndWeight( *densityWeights , position , weightKey , _depth , weight ); - else weight = (Real)1. , _depth = (Real)maxDepth; - int depth = std::min< int >( maxDepth , (int)ceil( _depth ) ); - V _v = v * weight; - - Point3D< Real > myCenter( (Real)0.5 , (Real)0.5 , (Real)0.5 ); - Real myWidth = (Real)1.; - - TreeOctNode* temp = _spaceRoot; - while( _Depth( temp )<=depth ) - { - _SplatPointData( temp , position , _v * Real( pow( double(1<<_Depth( temp )) , double(dim) ) ) , dataInfo , dataKey ); - if( _Depth( temp )children ) temp->initChildren(); - int cIndex = TreeOctNode::CornerIndex( myCenter , position ); - temp = &temp->children[cIndex]; - myWidth /= 2; - if( cIndex&1 ) myCenter[0] += myWidth/2; - else myCenter[0] -= myWidth/2; - if( cIndex&2 ) myCenter[1] += myWidth/2; - else myCenter[1] -= myWidth/2; - if( cIndex&4 ) myCenter[2] += myWidth/2; - else myCenter[2] -= myWidth/2; - } - else break; - } -} -template< class Real > -template< class V , int DataDegree > -V Octree< Real >::_Evaluate( const DenseNodeData< V , DataDegree >& coefficients , Point3D< Real > p , const BSplineData< DataDegree >& bsData , const ConstPointSupportKey< DataDegree >& neighborKey ) const -{ - V value = V(0); - - for( int d=0 ; d<=neighborKey.depth() ; d++ ) for( int i=0 ; i::Size ; i++ ) for( int j=0 ; j::Size ; j++ ) for( int k=0 ; k::Size ; k++ ) - { - const TreeOctNode* n = neighborKey.neighbors[d].neighbors[i][j][k]; - if( _IsValidNode< DataDegree >( n ) ) - { - int fIdx[3]; - FunctionIndex< DataDegree >( n , fIdx ); - value += - ( - coefficients[ n->nodeData.nodeIndex ] * - (Real) - ( - bsData.baseBSplines[ fIdx[0] ][PointSupportKey< DataDegree >::Size-1-i]( p[0] ) * - bsData.baseBSplines[ fIdx[1] ][PointSupportKey< DataDegree >::Size-1-j]( p[1] ) * - bsData.baseBSplines[ fIdx[2] ][PointSupportKey< DataDegree >::Size-1-k]( p[2] ) - ) - ); - } - } - - return value; -} -template< class Real > -template< class V , int DataDegree > -V Octree< Real >::_Evaluate( const SparseNodeData< V , DataDegree >& coefficients , Point3D< Real > p , const BSplineData< DataDegree >& bsData , const ConstPointSupportKey< DataDegree >& dataKey ) const -{ - V value = V(0); - - for( int d=0 ; d<=dataKey.depth() ; d++ ) - { - double dx[ DIMENSION ][ PointSupportKey< DataDegree >::Size ]; - memset( dx , 0 , sizeof( double ) * DIMENSION * PointSupportKey< DataDegree >::Size ); - { - const TreeOctNode* n = dataKey.neighbors[d].neighbors[ PointSupportKey< DataDegree >::LeftRadius ][ PointSupportKey< DataDegree >::LeftRadius ][ PointSupportKey< DataDegree >::LeftRadius ]; - if( !n ) fprintf( stderr , "[ERROR] Point is not centered on a node\n" ) , exit( 0 ); - int fIdx[3]; - FunctionIndex< DataDegree >( n , fIdx ); - int fStart , fEnd; - BSplineData< DataDegree >::FunctionSpan( d-1 , fStart , fEnd ); - for( int dd=0 ; dd::LeftRadius ; i<=PointSupportKey< DataDegree >::RightRadius ; i++ ) - if( fIdx[dd]+i>=fStart && fIdx[dd]+i::RightRadius ]( p[dd] ); - } - for( int i=0 ; i::Size ; i++ ) for( int j=0 ; j::Size ; j++ ) for( int k=0 ; k::Size ; k++ ) - { - const TreeOctNode* n = dataKey.neighbors[d].neighbors[i][j][k]; - if( _IsValidNode< DataDegree >( n ) ) - { - int idx = coefficients.index( n ); - if( idx>=0 ) value += coefficients.data[ idx ] * (Real) ( dx[0][i] * dx[1][j] * dx[2][k] ); - } - } - } - - return value; -} - -template< class Real > -template< class V , int DataDegree > -V Octree< Real >::Evaluate( const DenseNodeData< V , DataDegree >& coefficients , Point3D< Real > p , const BSplineData< DataDegree >& bsData ) const -{ - static const int SupportSize = BSplineEvaluationData< DataDegree >::SupportSize; - static const int LeftSupportRadius = -BSplineEvaluationData< DataDegree >::SupportStart; - static const int RightSupportRadius = BSplineEvaluationData< DataDegree >::SupportEnd; - V value = V(0); - - // [WARNING] This is required because the B-Spline components are not continuous at the domain boundaries - // so we need to nudge things inward a tiny bit. - for( int dd=0 ; dd<3 ; dd++ ) - if ( p[dd]==0 ) p[dd] = 0.+1e-6; - else if( p[dd]==1 ) p[dd] = 1.-1e-6; - - const TreeOctNode* n = _tree.nextNode(); - while( n ) - { - Point3D< Real > s; - Real w; - _StartAndWidth( n , s , w ); - double left = (LeftSupportRadius+0.)*w , right = (RightSupportRadius+1.)*w; - if( p[0]<=s[0]-left || p[0]>=s[0]+right || p[1]<=s[1]-left || p[1]>=s[1]+right || p[2]<=s[2]-left || p[2]>=s[2]+right ) - { - n = _tree.nextBranch( n ); - continue; - } - if( _IsValidNode< DataDegree >( n ) ) - { - int d , fIdx[3] , pIdx[3]; - _DepthAndOffset( n , d , fIdx ); - for( int dd=0 ; dd<3 ; dd++ ) pIdx[dd] = std::max< int >( 0 , std::min< int >( SupportSize-1 , LeftSupportRadius + (int)floor( ( p[dd]-s[dd] ) / w ) ) ); - value += - coefficients[ n->nodeData.nodeIndex ] * - (Real) - ( - bsData.baseBSplines[ BSplineData< DataDegree >::FunctionIndex( d , fIdx[0] ) ][ pIdx[0] ]( p[0] ) * - bsData.baseBSplines[ BSplineData< DataDegree >::FunctionIndex( d , fIdx[1] ) ][ pIdx[1] ]( p[1] ) * - bsData.baseBSplines[ BSplineData< DataDegree >::FunctionIndex( d , fIdx[2] ) ][ pIdx[2] ]( p[2] ) - ); - } - n = _tree.nextNode( n ); - } - return value; -} -template< class Real > -template< class V , int DataDegree > -V Octree< Real >::Evaluate( const SparseNodeData< V , DataDegree >& coefficients , Point3D< Real > p , const BSplineData< DataDegree >& bsData ) const -{ - V value = V(0); - - const TreeOctNode* n = _tree.nextNode(); - while( n ) - { - Point3D< Real > s; - Real w; - _StartAndWidth( n , s , w ); - if( !_IsValidNode< DataDegree >( n ) || - p[0]::SupportStart*w || p[0]>s[0]+(BSplineData< DataDegree >::SupportEnd+1.0)*w || - p[1]::SupportStart*w || p[1]>s[1]+(BSplineData< DataDegree >::SupportEnd+1.0)*w || - p[2]::SupportStart*w || p[2]>s[2]+(BSplineData< DataDegree >::SupportEnd+1.0)*w ) - { - n = _tree.nextBranch( n ); - continue; - } - - int idx = coefficients.index( n ); - if( idx>=0 ) - { - int d , off[3] , pIdx[3]; - _DepthAndOffset( n, d , off ); - for( int dd=0 ; dd<3 ; dd++ ) pIdx[dd] = std::max< int >( 0 , std::min< int >( BSplineData< DataDegree >::SupportSize-1 , -BSplineData< DataDegree >::SupportStart + (int)floor( ( p[dd]-s[dd] ) / w ) ) ); - value += - coefficients.data[idx] * - (Real) - ( - bsData.baseBSplines[ BSplineData< DataDegree >::FunctionIndex( d , off[0] ) ][ pIdx[0] ]( p[0] ) * - bsData.baseBSplines[ BSplineData< DataDegree >::FunctionIndex( d , off[1] ) ][ pIdx[1] ]( p[1] ) * - bsData.baseBSplines[ BSplineData< DataDegree >::FunctionIndex( d , off[2] ) ][ pIdx[2] ]( p[2] ) - ); - } - n = _tree.nextNode( n ); - } - return value; -} -template< class Real > -template< class V , int DataDegree > -Pointer( V ) Octree< Real >::Evaluate( const DenseNodeData< V , DataDegree >& coefficients , int& res , Real isoValue , int depth , bool primal ) -{ - int dim; - if( depth>=0 ) depth++; - int maxDepth = _tree.maxDepth(); - if( depth<=0 || depth>maxDepth ) depth = maxDepth; - - BSplineData< DataDegree > fData; - fData.set( depth , _dirichlet ); - - // Initialize the coefficients at the coarsest level - Pointer( V ) _coefficients = NullPointer( V ); - { - int d = _minDepth; - dim = _Dimension< DataDegree >( d ); - _coefficients = NewPointer< V >( dim * dim * dim ); - memset( _coefficients , 0 , sizeof( V ) * dim * dim * dim ); -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=_sNodes.begin(d) ; i<_sNodes.end(d) ; i++ ) if( _IsValidNode< DataDegree >( _sNodes.treeNodes[i] ) ) - { - int _d , _off[3]; - _sNodes.treeNodes[i]->depthAndOffset( _d , _off ); - _coefficients[ _off[0] + _off[1]*dim + _off[2]*dim*dim ] = coefficients[i]; - } - } - - // Up-sample and add in the existing coefficients - for( int d=_minDepth+1 ; d<=depth ; d++ ) - { - dim = _Dimension< DataDegree >( d ); - Pointer( V ) __coefficients = NewPointer< V >( dim * dim *dim ); - memset( __coefficients , 0 , sizeof( V ) * dim * dim * dim ); -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=_sNodes.begin(d) ; i<_sNodes.end(d) ; i++ ) if( _IsValidNode< DataDegree >( _sNodes.treeNodes[i] ) ) - { - int _d , _off[3]; - _sNodes.treeNodes[i]->depthAndOffset( _d , _off ); - __coefficients[ _off[0] + _off[1]*dim + _off[2]*dim*dim ] = coefficients[i]; - } - _UpSample< V , DataDegree >( d , ( ConstPointer(V) )_coefficients , __coefficients , _dirichlet , threads ); - DeletePointer( _coefficients ); - _coefficients = __coefficients; - } - - res = 1<<(depth-1); - if( primal ) res++; - Pointer( V ) values = NewPointer< V >( res*res*res ); - memset( values , 0 , sizeof(V)*res*res*res ); - - if( primal ) - { - // Evaluate at the cell corners - typename BSplineEvaluationData< DataDegree >::CornerEvaluator::Evaluator evaluator; - BSplineEvaluationData< DataDegree >::SetCornerEvaluator( evaluator , depth-1 , _dirichlet ); -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int k=0 ; k::CornerEnd ; kk<=-BSplineEvaluationData< DataDegree >::CornerStart ; kk++ ) if( k+kk>=0 && k+kk::CornerEnd ; jj<=-BSplineEvaluationData< DataDegree >::CornerStart ; jj++ ) if( j+jj>=0 && j+jj::CornerEnd ; ii<=-BSplineEvaluationData< DataDegree >::CornerStart ; ii++ ) if( i+ii>=0 && i+ii::CenterEvaluator::Evaluator evaluator; - BSplineEvaluationData< DataDegree >::SetCenterEvaluator( evaluator , depth-1 , _dirichlet ); -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int k=0 ; k::SupportEnd ; kk<=-BSplineEvaluationData< DataDegree >::SupportStart ; kk++ ) if( k+kk>=0 && k+kk::SupportEnd ; jj<=-BSplineEvaluationData< DataDegree >::SupportStart ; jj++ ) if( j+jj>=0 && j+jj::SupportEnd ; ii<=-BSplineEvaluationData< DataDegree >::SupportStart ; ii++ ) if( i+ii>=0 && i+ii double GetScaleValue( void ) +{ + double centerValues[Degree+1]; + Polynomial< Degree >::BSplineComponentValues( 0.5 , centerValues ); + double scaleValue = 0; + for( int i=0 ; i<=Degree ; i++ ) scaleValue += centerValues[i] * centerValues[i]; + return 1./ scaleValue; +} +template< class Real > +template< int WeightDegree > +void Octree< Real >::_AddWeightContribution( SparseNodeData< Real , WeightDegree >& densityWeights , TreeOctNode* node , Point3D< Real > position , PointSupportKey< WeightDegree >& weightKey , Real weight ) +{ + static const double ScaleValue = GetScaleValue< WeightDegree >(); + double dx[ DIMENSION ][ PointSupportKey< WeightDegree >::Size ]; + typename TreeOctNode::Neighbors< PointSupportKey< WeightDegree >::Size >& neighbors = weightKey.template getNeighbors< true >( node ); + + if( densityWeights.indices.size() start; + Real w; + _StartAndWidth( node , start , w ); + + for( int dim=0 ; dim::BSplineComponentValues( ( position[dim]-start[dim] ) / w , dx[dim] ); + + weight *= (Real)ScaleValue; + + for( int i=0 ; i::Size ; i++ ) for( int j=0 ; j::Size ; j++ ) + { + double dxdy = dx[0][i] * dx[1][j] * weight; + TreeOctNode** _neighbors = neighbors.neighbors[i][j]; + for( int k=0 ; k::Size ; k++ ) if( _neighbors[k] ) + { + int idx = densityWeights.index( _neighbors[k] ); + if( idx<0 ) + { + densityWeights.indices[ _neighbors[k]->nodeData.nodeIndex ] = (int)densityWeights.data.size(); + densityWeights.data.push_back( (Real)( dxdy * dx[2][k] ) ); + } + else densityWeights.data[idx] += Real( dxdy * dx[2][k] ); + } + } +} + +template< class Real > +template< int WeightDegree > +Real Octree< Real >::_GetSamplesPerNode( const SparseNodeData< Real , WeightDegree >& densityWeights , TreeOctNode* node , Point3D< Real > position , PointSupportKey< WeightDegree >& weightKey ) +{ + Real weight = 0; + double dx[ DIMENSION ][ PointSupportKey< WeightDegree >::Size ]; + typename TreeOctNode::Neighbors< PointSupportKey< WeightDegree >::Size >& neighbors = weightKey.template getNeighbors< true >( node ); + + Point3D< Real > start; + Real w; + _StartAndWidth( node , start , w ); + + for( int dim=0 ; dim::BSplineComponentValues( ( position[dim]-start[dim] ) / w , dx[dim] ); + + for( int i=0 ; i::Size ; i++ ) for( int j=0 ; j::Size ; j++ ) + { + double dxdy = dx[0][i] * dx[1][j]; + for( int k=0 ; k::Size ; k++ ) if( neighbors.neighbors[i][j][k] ) + { + int idx = densityWeights.index( neighbors.neighbors[i][j][k] ); + if( idx>=0 ) weight += Real( dxdy * dx[2][k] * densityWeights.data[idx] ); + } + } + return weight; +} +template< class Real > +template< int WeightDegree > +Real Octree< Real >::_GetSamplesPerNode( const SparseNodeData< Real , WeightDegree >& densityWeights , const TreeOctNode* node , Point3D< Real > position , ConstPointSupportKey< WeightDegree >& weightKey ) const +{ + Real weight = 0; + double dx[ DIMENSION ][ PointSupportKey< WeightDegree >::Size ]; + typename TreeOctNode::ConstNeighbors< PointSupportKey< WeightDegree >::Size >& neighbors = weightKey.getNeighbors( node ); + + Point3D< Real > start; + Real w; + _StartAndWidth( node , start , w ); + + for( int dim=0 ; dim::BSplineComponentValues( ( position[dim]-start[dim] ) / w , dx[dim] ); + + for( int i=0 ; i::Size ; i++ ) for( int j=0 ; j::Size ; j++ ) + { + double dxdy = dx[0][i] * dx[1][j]; + for( int k=0 ; k::Size ; k++ ) if( neighbors.neighbors[i][j][k] ) + { + int idx = densityWeights.index( neighbors.neighbors[i][j][k] ); + if( idx>=0 ) weight += Real( dxdy * dx[2][k] * densityWeights.data[idx] ); + } + } + return weight; +} +template< class Real > +template< int WeightDegree > +void Octree< Real >::_GetSampleDepthAndWeight( const SparseNodeData< Real , WeightDegree >& densityWeights , const TreeOctNode* node , Point3D< Real > position , ConstPointSupportKey< WeightDegree >& weightKey , Real& depth , Real& weight ) const +{ + const TreeOctNode* temp = node; + weight = _GetSamplesPerNode( densityWeights , temp , position , weightKey ); + if( weight>=(Real)1. ) depth = Real( _Depth( temp ) + log( weight ) / log(double(1<<(DIMENSION-1))) ); + else + { + Real oldWeight , newWeight; + oldWeight = newWeight = weight; + while( newWeight<(Real)1. && temp->parent ) + { + temp=temp->parent; + oldWeight = newWeight; + newWeight = _GetSamplesPerNode( densityWeights , temp , position , weightKey ); + } + depth = Real( _Depth( temp ) + log( newWeight ) / log( newWeight / oldWeight ) ); + } + weight = Real( pow( double(1<<(DIMENSION-1)) , -double(depth) ) ); +} +template< class Real > +template< int WeightDegree > +void Octree< Real >::_GetSampleDepthAndWeight( const SparseNodeData< Real , WeightDegree >& densityWeights , TreeOctNode* node , Point3D< Real > position , PointSupportKey< WeightDegree >& weightKey , Real& depth , Real& weight ) +{ + TreeOctNode* temp = node; + weight = _GetSamplesPerNode( densityWeights , temp , position , weightKey ); + if( weight>=(Real)1. ) depth = Real( _Depth( temp ) + log( weight ) / log(double(1<<(DIMENSION-1))) ); + else + { + Real oldWeight , newWeight; + oldWeight = newWeight = weight; + while( newWeight<(Real)1. && temp->parent ) + { + temp=temp->parent; + oldWeight = newWeight; + newWeight = _GetSamplesPerNode( densityWeights , temp , position, weightKey ); + } + depth = Real( _Depth( temp ) + log( newWeight ) / log( newWeight / oldWeight ) ); + } + weight = Real( pow( double(1<<(DIMENSION-1)) , -double(depth) ) ); +} +template< class Real > +template< int WeightDegree > +void Octree< Real >::_GetSampleDepthAndWeight( const SparseNodeData< Real , WeightDegree >& densityWeights , Point3D< Real > position , ConstPointSupportKey< WeightDegree >& weightKey , Real& depth , Real& weight ) +{ + TreeOctNode* temp; + Point3D< Real > myCenter( (Real)0.5 , (Real)0.5 , (Real)0.5 ); + Real myWidth = Real( 1. ); + + // Get the finest node with depth less than or equal to the splat depth that contains the point + temp = _spaceRoot; + while( _Depth( temp )<_splatDepth ) + { + if( !temp->children ) break;// fprintf( stderr , "[ERROR] Octree::GetSampleDepthAndWeight\n" ) , exit( 0 ); + int cIndex = TreeOctNode::CornerIndex( myCenter , position ); + temp = &temp->children[cIndex]; + myWidth /= 2; + if( cIndex&1 ) myCenter[0] += myWidth/2; + else myCenter[0] -= myWidth/2; + if( cIndex&2 ) myCenter[1] += myWidth/2; + else myCenter[1] -= myWidth/2; + if( cIndex&4 ) myCenter[2] += myWidth/2; + else myCenter[2] -= myWidth/2; + } + return _GetSampleDepthAndWeight( densityWeights , temp , position , weightKey , depth , weight ); +} +template< class Real > +template< int WeightDegree > +void Octree< Real >::_GetSampleDepthAndWeight( const SparseNodeData< Real , WeightDegree >& densityWeights , Point3D< Real > position , PointSupportKey< WeightDegree >& weightKey , Real& depth , Real& weight ) +{ + TreeOctNode* temp; + Point3D< Real > myCenter( (Real)0.5 , (Real)0.5 , (Real)0.5 ); + Real myWidth = Real( 1. ); + + // Get the finest node with depth less than or equal to the splat depth that contains the point + temp = _spaceRoot; + while( _Depth( temp )<_splatDepth ) + { + if( !temp->children ) break;// fprintf( stderr , "[ERROR] Octree::GetSampleDepthAndWeight\n" ) , exit( 0 ); + int cIndex = TreeOctNode::CornerIndex( myCenter , position ); + temp = &temp->children[cIndex]; + myWidth /= 2; + if( cIndex&1 ) myCenter[0] += myWidth/2; + else myCenter[0] -= myWidth/2; + if( cIndex&2 ) myCenter[1] += myWidth/2; + else myCenter[1] -= myWidth/2; + if( cIndex&4 ) myCenter[2] += myWidth/2; + else myCenter[2] -= myWidth/2; + } + return _GetSampleDepthAndWeight( densityWeights , temp , position , weightKey , depth , weight ); +} + + +template< class Real > +template< int DataDegree , class V > +void Octree< Real >::_SplatPointData( TreeOctNode* node , Point3D< Real > position , V v , SparseNodeData< V , DataDegree >& dataInfo , PointSupportKey< DataDegree >& dataKey ) +{ + double dx[ DIMENSION ][ PointSupportKey< DataDegree >::Size ]; + typename TreeOctNode::Neighbors< PointSupportKey< DataDegree >::Size >& neighbors = dataKey.template getNeighbors< true >( node ); + + Point3D< Real > start; + Real w; + _StartAndWidth( node , start , w ); + + for( int dd=0 ; dd::BSplineComponentValues( ( position[dd]-start[dd] ) / w , dx[dd] ); + + for( int i=0 ; i::Size ; i++ ) for( int j=0 ; j::Size ; j++ ) + { + double dxdy = dx[0][i] * dx[1][j]; + for( int k=0 ; k::Size ; k++ ) + if( neighbors.neighbors[i][j][k] ) + { + TreeOctNode* _node = neighbors.neighbors[i][j][k]; + + double dxdydz = dxdy * dx[2][k]; + if( (int)dataInfo.indices.size()nodeData.nodeIndex ] = (int)dataInfo.data.size(); + dataInfo.data.push_back( v * Real(dxdydz) ); + } + else dataInfo.data[idx] += v * Real( dxdydz ); + } + } +} +template< class Real > +template< int WeightDegree , int DataDegree , class V > +Real Octree< Real >::_SplatPointData( const SparseNodeData< Real , WeightDegree >& densityWeights , Point3D< Real > position , V v , SparseNodeData< V , DataDegree >& dataInfo , PointSupportKey< WeightDegree >& weightKey , PointSupportKey< DataDegree >& dataKey , int minDepth , int maxDepth , int dim ) +{ + double dx; + V _v; + TreeOctNode* temp; + int cnt=0; + double width; + Point3D< Real > myCenter( (Real)0.5 , (Real)0.5 , (Real)0.5 ); + Real myWidth = (Real)1.; + + temp = _spaceRoot; + while( _Depth( temp )<_splatDepth ) + { + if( !temp->children ) fprintf( stderr , "[ERROR] Octree::SplatPointData\n" ) , exit( 0 ); + int cIndex = TreeOctNode::CornerIndex( myCenter , position ); + temp = &temp->children[cIndex]; + myWidth /= 2; + if( cIndex&1 ) myCenter[0] += myWidth/2; + else myCenter[0] -= myWidth/2; + if( cIndex&2 ) myCenter[1] += myWidth/2; + else myCenter[1] -= myWidth/2; + if( cIndex&4 ) myCenter[2] += myWidth/2; + else myCenter[2] -= myWidth/2; + } + Real weight , depth; + _GetSampleDepthAndWeight( densityWeights , temp , position , weightKey , depth , weight ); + + if( depthmaxDepth ) depth = Real(maxDepth); + int topDepth = int(ceil(depth)); + + dx = 1.0-(topDepth-depth); + if ( topDepth<=minDepth ) topDepth = minDepth , dx = 1; + else if( topDepth> maxDepth ) topDepth = maxDepth , dx = 1; + + while( _Depth( temp )>topDepth ) temp=temp->parent; + while( _Depth( temp )children ) temp->initChildren(); + int cIndex = TreeOctNode::CornerIndex( myCenter , position ); + temp = &temp->children[cIndex]; + myWidth/=2; + if( cIndex&1 ) myCenter[0] += myWidth/2; + else myCenter[0] -= myWidth/2; + if( cIndex&2 ) myCenter[1] += myWidth/2; + else myCenter[1] -= myWidth/2; + if( cIndex&4 ) myCenter[2] += myWidth/2; + else myCenter[2] -= myWidth/2; + } + width = 1.0 / ( ( 1<<( _Depth( temp ) ) ) ); + _v = v * weight / Real( pow( width , dim ) ) * Real( dx ); + _SplatPointData( temp , position , _v , dataInfo , dataKey ); + if( fabs(1.0-dx) > EPSILON ) + { + dx = Real(1.0-dx); + temp = temp->parent; + width = 1.0 / ( ( 1<<( _Depth( temp ) ) ) ); + + _v = v * weight / Real( pow( width , dim ) ) * Real( dx ); + _SplatPointData( temp , position , _v , dataInfo , dataKey ); + } + return weight; +} +template< class Real > +template< int WeightDegree , int DataDegree , class V > +void Octree< Real >::_MultiSplatPointData( const SparseNodeData< Real , WeightDegree >* densityWeights , Point3D< Real > position , V v , SparseNodeData< V , DataDegree >& dataInfo , PointSupportKey< WeightDegree >& weightKey , PointSupportKey< DataDegree >& dataKey , int maxDepth , int dim ) +{ + Real _depth , weight; + if( densityWeights ) _GetSampleDepthAndWeight( *densityWeights , position , weightKey , _depth , weight ); + else weight = (Real)1. , _depth = (Real)maxDepth; + int depth = std::min< int >( maxDepth , (int)ceil( _depth ) ); + V _v = v * weight; + + Point3D< Real > myCenter( (Real)0.5 , (Real)0.5 , (Real)0.5 ); + Real myWidth = (Real)1.; + + TreeOctNode* temp = _spaceRoot; + while( _Depth( temp )<=depth ) + { + _SplatPointData( temp , position , _v * Real( pow( double(1<<_Depth( temp )) , double(dim) ) ) , dataInfo , dataKey ); + if( _Depth( temp )children ) temp->initChildren(); + int cIndex = TreeOctNode::CornerIndex( myCenter , position ); + temp = &temp->children[cIndex]; + myWidth /= 2; + if( cIndex&1 ) myCenter[0] += myWidth/2; + else myCenter[0] -= myWidth/2; + if( cIndex&2 ) myCenter[1] += myWidth/2; + else myCenter[1] -= myWidth/2; + if( cIndex&4 ) myCenter[2] += myWidth/2; + else myCenter[2] -= myWidth/2; + } + else break; + } +} +template< class Real > +template< class V , int DataDegree > +V Octree< Real >::_Evaluate( const DenseNodeData< V , DataDegree >& coefficients , Point3D< Real > p , const BSplineData< DataDegree >& bsData , const ConstPointSupportKey< DataDegree >& neighborKey ) const +{ + V value = V(0); + + for( int d=0 ; d<=neighborKey.depth() ; d++ ) for( int i=0 ; i::Size ; i++ ) for( int j=0 ; j::Size ; j++ ) for( int k=0 ; k::Size ; k++ ) + { + const TreeOctNode* n = neighborKey.neighbors[d].neighbors[i][j][k]; + if( _IsValidNode< DataDegree >( n ) ) + { + int fIdx[3]; + FunctionIndex< DataDegree >( n , fIdx ); + value += + ( + coefficients[ n->nodeData.nodeIndex ] * + (Real) + ( + bsData.baseBSplines[ fIdx[0] ][PointSupportKey< DataDegree >::Size-1-i]( p[0] ) * + bsData.baseBSplines[ fIdx[1] ][PointSupportKey< DataDegree >::Size-1-j]( p[1] ) * + bsData.baseBSplines[ fIdx[2] ][PointSupportKey< DataDegree >::Size-1-k]( p[2] ) + ) + ); + } + } + + return value; +} +template< class Real > +template< class V , int DataDegree > +V Octree< Real >::_Evaluate( const SparseNodeData< V , DataDegree >& coefficients , Point3D< Real > p , const BSplineData< DataDegree >& bsData , const ConstPointSupportKey< DataDegree >& dataKey ) const +{ + V value = V(0); + + for( int d=0 ; d<=dataKey.depth() ; d++ ) + { + double dx[ DIMENSION ][ PointSupportKey< DataDegree >::Size ]; + memset( dx , 0 , sizeof( double ) * DIMENSION * PointSupportKey< DataDegree >::Size ); + { + const TreeOctNode* n = dataKey.neighbors[d].neighbors[ PointSupportKey< DataDegree >::LeftRadius ][ PointSupportKey< DataDegree >::LeftRadius ][ PointSupportKey< DataDegree >::LeftRadius ]; + if( !n ) fprintf( stderr , "[ERROR] Point is not centered on a node\n" ) , exit( 0 ); + int fIdx[3]; + FunctionIndex< DataDegree >( n , fIdx ); + int fStart , fEnd; + BSplineData< DataDegree >::FunctionSpan( d-1 , fStart , fEnd ); + for( int dd=0 ; dd::LeftRadius ; i<=PointSupportKey< DataDegree >::RightRadius ; i++ ) + if( fIdx[dd]+i>=fStart && fIdx[dd]+i::RightRadius ]( p[dd] ); + } + for( int i=0 ; i::Size ; i++ ) for( int j=0 ; j::Size ; j++ ) for( int k=0 ; k::Size ; k++ ) + { + const TreeOctNode* n = dataKey.neighbors[d].neighbors[i][j][k]; + if( _IsValidNode< DataDegree >( n ) ) + { + int idx = coefficients.index( n ); + if( idx>=0 ) value += coefficients.data[ idx ] * (Real) ( dx[0][i] * dx[1][j] * dx[2][k] ); + } + } + } + + return value; +} + +template< class Real > +template< class V , int DataDegree > +V Octree< Real >::Evaluate( const DenseNodeData< V , DataDegree >& coefficients , Point3D< Real > p , const BSplineData< DataDegree >& bsData ) const +{ + static const int SupportSize = BSplineEvaluationData< DataDegree >::SupportSize; + static const int LeftSupportRadius = -BSplineEvaluationData< DataDegree >::SupportStart; + static const int RightSupportRadius = BSplineEvaluationData< DataDegree >::SupportEnd; + V value = V(0); + + // [WARNING] This is required because the B-Spline components are not continuous at the domain boundaries + // so we need to nudge things inward a tiny bit. + for( int dd=0 ; dd<3 ; dd++ ) + if ( p[dd]==0 ) p[dd] = 0.+1e-6; + else if( p[dd]==1 ) p[dd] = 1.-1e-6; + + const TreeOctNode* n = _tree.nextNode(); + while( n ) + { + Point3D< Real > s; + Real w; + _StartAndWidth( n , s , w ); + double left = (LeftSupportRadius+0.)*w , right = (RightSupportRadius+1.)*w; + if( p[0]<=s[0]-left || p[0]>=s[0]+right || p[1]<=s[1]-left || p[1]>=s[1]+right || p[2]<=s[2]-left || p[2]>=s[2]+right ) + { + n = _tree.nextBranch( n ); + continue; + } + if( _IsValidNode< DataDegree >( n ) ) + { + int d , fIdx[3] , pIdx[3]; + _DepthAndOffset( n , d , fIdx ); + for( int dd=0 ; dd<3 ; dd++ ) pIdx[dd] = std::max< int >( 0 , std::min< int >( SupportSize-1 , LeftSupportRadius + (int)floor( ( p[dd]-s[dd] ) / w ) ) ); + value += + coefficients[ n->nodeData.nodeIndex ] * + (Real) + ( + bsData.baseBSplines[ BSplineData< DataDegree >::FunctionIndex( d , fIdx[0] ) ][ pIdx[0] ]( p[0] ) * + bsData.baseBSplines[ BSplineData< DataDegree >::FunctionIndex( d , fIdx[1] ) ][ pIdx[1] ]( p[1] ) * + bsData.baseBSplines[ BSplineData< DataDegree >::FunctionIndex( d , fIdx[2] ) ][ pIdx[2] ]( p[2] ) + ); + } + n = _tree.nextNode( n ); + } + return value; +} +template< class Real > +template< class V , int DataDegree > +V Octree< Real >::Evaluate( const SparseNodeData< V , DataDegree >& coefficients , Point3D< Real > p , const BSplineData< DataDegree >& bsData ) const +{ + V value = V(0); + + const TreeOctNode* n = _tree.nextNode(); + while( n ) + { + Point3D< Real > s; + Real w; + _StartAndWidth( n , s , w ); + if( !_IsValidNode< DataDegree >( n ) || + p[0]::SupportStart*w || p[0]>s[0]+(BSplineData< DataDegree >::SupportEnd+1.0)*w || + p[1]::SupportStart*w || p[1]>s[1]+(BSplineData< DataDegree >::SupportEnd+1.0)*w || + p[2]::SupportStart*w || p[2]>s[2]+(BSplineData< DataDegree >::SupportEnd+1.0)*w ) + { + n = _tree.nextBranch( n ); + continue; + } + + int idx = coefficients.index( n ); + if( idx>=0 ) + { + int d , off[3] , pIdx[3]; + _DepthAndOffset( n, d , off ); + for( int dd=0 ; dd<3 ; dd++ ) pIdx[dd] = std::max< int >( 0 , std::min< int >( BSplineData< DataDegree >::SupportSize-1 , -BSplineData< DataDegree >::SupportStart + (int)floor( ( p[dd]-s[dd] ) / w ) ) ); + value += + coefficients.data[idx] * + (Real) + ( + bsData.baseBSplines[ BSplineData< DataDegree >::FunctionIndex( d , off[0] ) ][ pIdx[0] ]( p[0] ) * + bsData.baseBSplines[ BSplineData< DataDegree >::FunctionIndex( d , off[1] ) ][ pIdx[1] ]( p[1] ) * + bsData.baseBSplines[ BSplineData< DataDegree >::FunctionIndex( d , off[2] ) ][ pIdx[2] ]( p[2] ) + ); + } + n = _tree.nextNode( n ); + } + return value; +} +template< class Real > +template< class V , int DataDegree > +Pointer( V ) Octree< Real >::Evaluate( const DenseNodeData< V , DataDegree >& coefficients , int& res , Real isoValue , int depth , bool primal ) +{ + int dim; + if( depth>=0 ) depth++; + int maxDepth = _tree.maxDepth(); + if( depth<=0 || depth>maxDepth ) depth = maxDepth; + + BSplineData< DataDegree > fData; + fData.set( depth , _dirichlet ); + + // Initialize the coefficients at the coarsest level + Pointer( V ) _coefficients = NullPointer( V ); + { + int d = _minDepth; + dim = _Dimension< DataDegree >( d ); + _coefficients = NewPointer< V >( dim * dim * dim ); + memset( _coefficients , 0 , sizeof( V ) * dim * dim * dim ); +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=_sNodes.begin(d) ; i<_sNodes.end(d) ; i++ ) if( _IsValidNode< DataDegree >( _sNodes.treeNodes[i] ) ) + { + int _d , _off[3]; + _sNodes.treeNodes[i]->depthAndOffset( _d , _off ); + _coefficients[ _off[0] + _off[1]*dim + _off[2]*dim*dim ] = coefficients[i]; + } + } + + // Up-sample and add in the existing coefficients + for( int d=_minDepth+1 ; d<=depth ; d++ ) + { + dim = _Dimension< DataDegree >( d ); + Pointer( V ) __coefficients = NewPointer< V >( dim * dim *dim ); + memset( __coefficients , 0 , sizeof( V ) * dim * dim * dim ); +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=_sNodes.begin(d) ; i<_sNodes.end(d) ; i++ ) if( _IsValidNode< DataDegree >( _sNodes.treeNodes[i] ) ) + { + int _d , _off[3]; + _sNodes.treeNodes[i]->depthAndOffset( _d , _off ); + __coefficients[ _off[0] + _off[1]*dim + _off[2]*dim*dim ] = coefficients[i]; + } + _UpSample< V , DataDegree >( d , ( ConstPointer(V) )_coefficients , __coefficients , _dirichlet , threads ); + DeletePointer( _coefficients ); + _coefficients = __coefficients; + } + + res = 1<<(depth-1); + if( primal ) res++; + Pointer( V ) values = NewPointer< V >( res*res*res ); + memset( values , 0 , sizeof(V)*res*res*res ); + + if( primal ) + { + // Evaluate at the cell corners + typename BSplineEvaluationData< DataDegree >::CornerEvaluator::Evaluator evaluator; + BSplineEvaluationData< DataDegree >::SetCornerEvaluator( evaluator , depth-1 , _dirichlet ); +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int k=0 ; k::CornerEnd ; kk<=-BSplineEvaluationData< DataDegree >::CornerStart ; kk++ ) if( k+kk>=0 && k+kk::CornerEnd ; jj<=-BSplineEvaluationData< DataDegree >::CornerStart ; jj++ ) if( j+jj>=0 && j+jj::CornerEnd ; ii<=-BSplineEvaluationData< DataDegree >::CornerStart ; ii++ ) if( i+ii>=0 && i+ii::CenterEvaluator::Evaluator evaluator; + BSplineEvaluationData< DataDegree >::SetCenterEvaluator( evaluator , depth-1 , _dirichlet ); +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int k=0 ; k::SupportEnd ; kk<=-BSplineEvaluationData< DataDegree >::SupportStart ; kk++ ) if( k+kk>=0 && k+kk::SupportEnd ; jj<=-BSplineEvaluationData< DataDegree >::SupportStart ; jj++ ) if( j+jj>=0 && j+jj::SupportEnd ; ii<=-BSplineEvaluationData< DataDegree >::SupportStart ; ii++ ) if( i+ii>=0 && i+ii - // b_1[i] = < \nabla B_i(p) , V(p) > - // 2] Formulate this as a Poisson equation: - // \sum_i x_i \Delta B_i(p) = \nabla \cdot V(p) - // which is solved by the system A_2x = b_2 where: - // A_2[i,j] = - < \Delta B_i(p) , B_j(p) > - // b_2[i] = - < B_i(p) , \nabla \cdot V(p) > - // Although the two system matrices should be the same (assuming that the B_i satisfy dirichlet/neumann boundary conditions) - // the constraint vectors can differ when V does not satisfy the Neumann boundary conditions: - // A_1[i,j] = \int_R < \nabla B_i(p) , \nabla B_j(p) > - // = \int_R [ \nabla \cdot ( B_i(p) \nabla B_j(p) ) - B_i(p) \Delta B_j(p) ] - // = \int_dR < N(p) , B_i(p) \nabla B_j(p) > + A_2[i,j] - // and the first integral is zero if either f_i is zero on the boundary dR or the derivative of B_i across the boundary is zero. - // However, for the constraints we have: - // b_1(i) = \int_R < \nabla B_i(p) , V(p) > - // = \int_R [ \nabla \cdot ( B_i(p) V(p) ) - B_i(p) \nabla \cdot V(p) ] - // = \int_dR < N(p) , B_i(p) V(p) > + b_2[i] - // In particular, this implies that if the B_i satisfy the Neumann boundary conditions (rather than Dirichlet), - // and V is not zero across the boundary, then the two constraints are different. - // Forcing the < V(p) , N(p) > = 0 on the boundary, by killing off the component of the vector-field in the normal direction - // (FORCE_NEUMANN_FIELD), makes the two systems equal, and the value of this flag should be immaterial. - // Note that under interpretation 1, we have: - // \sum_i b_1(i) = < \nabla \sum_ i B_i(p) , V(p) > = 0 - // because the B_i's sum to one. However, in general, we could have - // \sum_i b_2(i) \neq 0. - // This could cause trouble because the constant functions are in the kernel of the matrix A, so CG will misbehave if the constraint - // has a non-zero DC term. (Again, forcing < V(p) , N(p) > = 0 along the boundary resolves this problem.) - -#define FORCE_NEUMANN_FIELD 1 // This flag forces the normal component across the boundary of the integration domain to be zero. - // This should be enabled if GRADIENT_DOMAIN_SOLUTION is not, so that CG doesn't run into trouble. - -#if !FORCE_NEUMANN_FIELD -#pragma message( "[WARNING] Not zeroing out normal component on boundary" ) -#endif // !FORCE_NEUMANN_FIELD - -#include "Hash.h" -#include "BSplineData.h" -#include "PointStream.h" - -#ifndef _OPENMP -int omp_get_num_procs( void ){ return 1; } -int omp_get_thread_num( void ){ return 0; } -#endif // _OPENMP - -class TreeNodeData -{ -public: - static size_t NodeCount; - int nodeIndex; - char flags; - - TreeNodeData( void ); - ~TreeNodeData( void ); -}; - -class VertexData -{ - typedef OctNode< TreeNodeData > TreeOctNode; -public: - static const int VERTEX_COORDINATE_SHIFT = ( sizeof( long long ) * 8 ) / 3; - static long long EdgeIndex( const TreeOctNode* node , int eIndex , int maxDepth , int index[DIMENSION] ); - static long long EdgeIndex( const TreeOctNode* node , int eIndex , int maxDepth ); - static long long FaceIndex( const TreeOctNode* node , int fIndex , int maxDepth,int index[DIMENSION] ); - static long long FaceIndex( const TreeOctNode* node , int fIndex , int maxDepth ); - static long long CornerIndex( const TreeOctNode* node , int cIndex , int maxDepth , int index[DIMENSION] ); - static long long CornerIndex( const TreeOctNode* node , int cIndex , int maxDepth ); - static long long CenterIndex( const TreeOctNode* node , int maxDepth , int index[DIMENSION] ); - static long long CenterIndex( const TreeOctNode* node , int maxDepth ); - static long long CornerIndex( int depth , const int offSet[DIMENSION] , int cIndex , int maxDepth , int index[DIMENSION] ); - static long long CenterIndex( int depth , const int offSet[DIMENSION] , int maxDepth , int index[DIMENSION] ); - static long long CornerIndexKey( const int index[DIMENSION] ); -}; - -// This class stores the octree nodes, sorted by depth and then by z-slice. -// To support primal representations, the initializer takes a function that -// determines if a node should be included/indexed in the sorted list. -class SortedTreeNodes -{ - typedef OctNode< TreeNodeData > TreeOctNode; -protected: - Pointer( Pointer( int ) ) _sliceStart; - int _levels; -public: - Pointer( TreeOctNode* ) treeNodes; - int begin( int depth ) const{ return _sliceStart[depth][0]; } - int end( int depth ) const{ return _sliceStart[depth][(size_t)1<=_levels||slice<0||slice>=(1<=_levels) printf( "uhoh\n" ); return _sliceStart[depth][(size_t)1<* map ); - void set( TreeOctNode& root ); - - template< int Indices > - struct _Indices - { - int idx[Indices]; - _Indices( void ){ memset( idx , -1 , sizeof( int ) * Indices ); } - int& operator[] ( int i ) { return idx[i]; } - const int& operator[] ( int i ) const { return idx[i]; } - }; - typedef _Indices< Square::CORNERS > SquareCornerIndices; - typedef _Indices< Square::EDGES > SquareEdgeIndices; - typedef _Indices< Square::FACES > SquareFaceIndices; - - struct SliceTableData - { - Pointer( SquareCornerIndices ) cTable; - Pointer( SquareEdgeIndices ) eTable; - Pointer( SquareFaceIndices ) fTable; - int cCount , eCount , fCount , nodeOffset , nodeCount; - SliceTableData( void ) { - fCount = eCount = cCount = 0; - cTable = NullPointer( SquareCornerIndices ); - eTable = NullPointer( SquareEdgeIndices ); - fTable = NullPointer( SquareFaceIndices ); - _cMap = _eMap = _fMap = NullPointer( int ); - } - ~SliceTableData( void ){ clear(); } - void clear( void ){ - DeletePointer( cTable ) ; - DeletePointer( eTable ) ; - DeletePointer( fTable ) ; - fCount = eCount = cCount = 0; - DeletePointer(_cMap); // [Bruno] - DeletePointer(_eMap); // [Bruno] - DeletePointer(_fMap); // [Bruno] - } - SquareCornerIndices& cornerIndices( const TreeOctNode* node ); - SquareCornerIndices& cornerIndices( int idx ); - const SquareCornerIndices& cornerIndices( const TreeOctNode* node ) const; - const SquareCornerIndices& cornerIndices( int idx ) const; - SquareEdgeIndices& edgeIndices( const TreeOctNode* node ); - SquareEdgeIndices& edgeIndices( int idx ); - const SquareEdgeIndices& edgeIndices( const TreeOctNode* node ) const; - const SquareEdgeIndices& edgeIndices( int idx ) const; - SquareFaceIndices& faceIndices( const TreeOctNode* node ); - SquareFaceIndices& faceIndices( int idx ); - const SquareFaceIndices& faceIndices( const TreeOctNode* node ) const; - const SquareFaceIndices& faceIndices( int idx ) const; - protected: - Pointer( int ) _cMap; - Pointer( int ) _eMap; - Pointer( int ) _fMap; - friend class SortedTreeNodes; - }; - struct XSliceTableData - { - Pointer( SquareCornerIndices ) eTable; - Pointer( SquareEdgeIndices ) fTable; - int fCount , eCount , nodeOffset , nodeCount; - XSliceTableData( void ){ - fCount = eCount = 0; - eTable = NullPointer( SquareCornerIndices ); - fTable = NullPointer( SquareEdgeIndices ); - _eMap = _fMap = NullPointer( int ); - } - ~XSliceTableData( void ){ clear(); } - void clear( void ) { - DeletePointer( fTable ) ; - DeletePointer( eTable ) ; - DeletePointer( _eMap ); // [Bruno] - DeletePointer( _fMap ); // [Bruno] - fCount = eCount = 0; - } - SquareCornerIndices& edgeIndices( const TreeOctNode* node ); - SquareCornerIndices& edgeIndices( int idx ); - const SquareCornerIndices& edgeIndices( const TreeOctNode* node ) const; - const SquareCornerIndices& edgeIndices( int idx ) const; - SquareEdgeIndices& faceIndices( const TreeOctNode* node ); - SquareEdgeIndices& faceIndices( int idx ); - const SquareEdgeIndices& faceIndices( const TreeOctNode* node ) const; - const SquareEdgeIndices& faceIndices( int idx ) const; - protected: - Pointer( int ) _eMap; - Pointer( int ) _fMap; - friend class SortedTreeNodes; - }; - void setSliceTableData ( SliceTableData& sData , int depth , int offset , int threads ) const; - void setXSliceTableData( XSliceTableData& sData , int depth , int offset , int threads ) const; -}; - -template< int Degree > -struct PointSupportKey : public OctNode< TreeNodeData >::NeighborKey< BSplineEvaluationData< Degree >::SupportEnd , -BSplineEvaluationData< Degree >::SupportStart > -{ - static const int LeftRadius = BSplineEvaluationData< Degree >::SupportEnd; - static const int RightRadius = -BSplineEvaluationData< Degree >::SupportStart; - static const int Size = LeftRadius + RightRadius + 1; -}; -template< int Degree > -struct ConstPointSupportKey : public OctNode< TreeNodeData >::ConstNeighborKey< BSplineEvaluationData< Degree >::SupportEnd , -BSplineEvaluationData< Degree >::SupportStart > -{ - static const int LeftRadius = BSplineEvaluationData< Degree >::SupportEnd; - static const int RightRadius = -BSplineEvaluationData< Degree >::SupportStart; - static const int Size = LeftRadius + RightRadius + 1; -}; - -template< class Real > -struct PointData -{ - Point3D< Real > position; - Real weightedCoarserDValue; - Real weight; - PointData( Point3D< Real > p=Point3D< Real >() , Real w=0 ) { position = p , weight = w , weightedCoarserDValue = Real(0); } -}; -template< class Data , int Degree > -struct SparseNodeData -{ - std::vector< int > indices; - std::vector< Data > data; - template< class TreeNodeData > - int index( const OctNode< TreeNodeData >* node ) const { return ( !node || node->nodeData.nodeIndex<0 || node->nodeData.nodeIndex>=(int)indices.size() ) ? -1 : indices[ node->nodeData.nodeIndex ]; } -#if NEW_NEW_CODE - int index( int nodeIndex ) const { return ( nodeIndex<0 || nodeIndex>=(int)indices.size() ) ? -1 : indices[ nodeIndex ]; } -#endif // NEW_NEW_CODE - void resize( size_t sz ){ indices.resize( sz , -1 ); } - void remapIndices( const std::vector< int >& map ) - { - std::vector< int > temp = indices; - indices.resize( map.size() ); - for( size_t i=0 ; i -struct DenseNodeData -{ - Pointer( Data ) data; - DenseNodeData( void ) { data = NullPointer( Data ); } - DenseNodeData( size_t sz ){ if( sz ) data = NewPointer< Data >( sz ) ; else data = NullPointer( Data ); } - void resize( size_t sz ){ DeletePointer( data ) ; if( sz ) data = NewPointer< Data >( sz ) ; else data = NullPointer( Data ); } - Data& operator[] ( int idx ) { return data[idx]; } - const Data& operator[] ( int idx ) const { return data[idx]; } -}; - -template< class C , int N > struct Stencil{ C values[N][N][N]; }; - -template< int Degree1 , int Degree2 > -class SystemCoefficients -{ - typedef typename BSplineIntegrationData< Degree1 , Degree2 >::FunctionIntegrator FunctionIntegrator; - static const int OverlapSize = BSplineIntegrationData< Degree1 , Degree2 >::OverlapSize; - static const int OverlapStart = BSplineIntegrationData< Degree1 , Degree2 >::OverlapStart; - static const int OverlapEnd = BSplineIntegrationData< Degree1 , Degree2 >::OverlapEnd; -public: - static double GetLaplacian ( const typename FunctionIntegrator:: Integrator& integrator , const int off1[3] , const int off2[3] ); - static double GetLaplacian ( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[3] , const int off2[3] ); - static double GetDivergence1( const typename FunctionIntegrator:: Integrator& integrator , const int off1[3] , const int off2[3] , Point3D< double > normal1 ); - static double GetDivergence1( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[3] , const int off2[3] , Point3D< double > normal1 ); - static double GetDivergence2( const typename FunctionIntegrator:: Integrator& integrator , const int off1[3] , const int off2[3] , Point3D< double > normal2 ); - static double GetDivergence2( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[3] , const int off2[3] , Point3D< double > normal2 ); - static Point3D< double > GetDivergence1 ( const typename FunctionIntegrator:: Integrator& integrator , const int off1[3] , const int off2[3] ); - static Point3D< double > GetDivergence1 ( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[3] , const int off2[3] ); - static Point3D< double > GetDivergence2 ( const typename FunctionIntegrator:: Integrator& integrator , const int off1[3] , const int off2[3] ); - static Point3D< double > GetDivergence2 ( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[3] , const int off2[3] ); - static void SetCentralDivergenceStencil ( const typename FunctionIntegrator:: Integrator& integrator , Stencil< Point3D< double > , OverlapSize >& stencil , bool scatter ); - static void SetCentralDivergenceStencils( const typename FunctionIntegrator::ChildIntegrator& integrator , Stencil< Point3D< double > , OverlapSize > stencil[2][2][2] , bool scatter ); - static void SetCentralLaplacianStencil ( const typename FunctionIntegrator:: Integrator& integrator , Stencil< double , OverlapSize >& stencil ); - static void SetCentralLaplacianStencils ( const typename FunctionIntegrator::ChildIntegrator& integrator , Stencil< double , OverlapSize > stencil[2][2][2] ); -}; - -// Note that throughout this code, the "depth" parameter refers to the depth in the octree, not the corresponding depth -// of the B-Spline element -template< class Real > -class Octree -{ - typedef OctNode< TreeNodeData > TreeOctNode; -public: - template< int FEMDegree > static void FunctionIndex( const TreeOctNode* node , int idx[3] ); - - typedef typename TreeOctNode:: NeighborKey< 1 , 1 > AdjacenctNodeKey; - typedef typename TreeOctNode::ConstNeighborKey< 1 , 1 > ConstAdjacenctNodeKey; - - template< class V > - struct ProjectiveData - { - V v; - Real w; - ProjectiveData( V vv=V(0) , Real ww=Real(0) ) : v(vv) , w(ww) { } - operator V (){ return w!=0 ? v/w : v*w; } - ProjectiveData& operator += ( const ProjectiveData& p ){ v += p.v , w += p.w ; return *this; } - ProjectiveData& operator -= ( const ProjectiveData& p ){ v -= p.v , w -= p.w ; return *this; } - ProjectiveData& operator *= ( Real s ){ v *= s , w *= s ; return *this; } - ProjectiveData& operator /= ( Real s ){ v /= s , w /= s ; return *this; } - ProjectiveData operator + ( const ProjectiveData& p ) const { return ProjectiveData( v+p.v , w+p.w ); } - ProjectiveData operator - ( const ProjectiveData& p ) const { return ProjectiveData( v-p.v , w-p.w ); } - ProjectiveData operator * ( Real s ) const { return ProjectiveData( v*s , w*s ); } - ProjectiveData operator / ( Real s ) const { return ProjectiveData( v/s , w/s ); } - }; - template< int FEMDegree > static bool IsValidNode( const TreeOctNode* node , bool dirichlet ); - - // [Bruno] need these two ones to be able to get bbox. - const Point3D& center() const { return _center; } - Real scale() const { return _scale; } - -protected: - template< int FEMDegree > bool _IsValidNode( const TreeOctNode* node ) const { return node && ( node->nodeData.flags & ( 1<<( FEMDegree&1 ) ) ) ; } - - TreeOctNode _tree; - TreeOctNode* _spaceRoot; - SortedTreeNodes _sNodes; - int _splatDepth; - int _maxDepth; - int _minDepth; - int _fullDepth; - bool _constrainValues; - bool _dirichlet; - Real _scale; - Point3D< Real > _center; - int _multigridDegree; - - bool _InBounds( Point3D< Real > ) const; - template< int FEMDegree > static int _Dimension( int depth ){ return BSplineData< FEMDegree >::Dimension( depth-1 ); } - static int _Resolution( int depth ){ return 1<<(depth-1); } - template< int FEMDegree > static bool _IsInteriorlySupported( int d , int x , int y , int z ) - { - if( d-1>=0 ) - { - int begin , end; - BSplineEvaluationData< FEMDegree >::InteriorSupportedSpan( d-1 , begin , end ); - return ( x>=begin && x=begin && y=begin && z static bool _IsInteriorlySupported( const TreeOctNode* node ) - { - if( !node ) return false; - int d , off[3]; - node->depthAndOffset( d , off ); - return _IsInteriorlySupported< FEMDegree >( d , off[0] , off[1] , off[2] ); - } - template< int FEMDegree1 , int FEMDegree2 > static bool _IsInteriorlyOverlapped( int d , int x , int y , int z ) - { - if( d-1>=0 ) - { - int begin , end; - BSplineIntegrationData< FEMDegree1 , FEMDegree2 >::InteriorOverlappedSpan( d-1 , begin , end ); - return ( x>=begin && x=begin && y=begin && z static bool _IsInteriorlyOverlapped( const TreeOctNode* node ) - { - if( !node ) return false; - int d , off[3]; - node->depthAndOffset( d , off ); - return _IsInteriorlyOverlapped< FEMDegree1 , FEMDegree2 >( d , off[0] , off[1] , off[2] ); - } - static void _DepthAndOffset( const TreeOctNode* node , int& d , int off[3] ){ node->depthAndOffset( d , off ) ; d -= 1; } - static int _Depth( const TreeOctNode* node ){ return node->depth()-1; } - static void _StartAndWidth( const TreeOctNode* node , Point3D< Real >& start , Real& width ) - { - int d , off[3]; - _DepthAndOffset( node , d , off ); - if( d>=0 ) width = Real( 1.0 / (1<< d ) ); - else width = Real( 1.0 * (1<<(-d)) ); - for( int dd=0 ; dd& center , Real& width ) - { - int d , off[3]; - _DepthAndOffset( node , d , off ); - width = Real( 1.0 / (1< - static typename TreeOctNode::ConstNeighbors< LeftRadius + RightRadius + 1 >& _Neighbors( TreeOctNode::ConstNeighborKey< LeftRadius , RightRadius >& key , int depth ){ return key.neighbors[ depth + 1 ]; } - template< int LeftRadius , int RightRadius > - static typename TreeOctNode::Neighbors< LeftRadius + RightRadius + 1 >& _Neighbors( TreeOctNode::NeighborKey< LeftRadius , RightRadius >& key , int depth ){ return key.neighbors[ depth + 1 ]; } - template< int LeftRadius , int RightRadius > - static const typename TreeOctNode::template Neighbors< LeftRadius + RightRadius + 1 >& _Neighbors( const typename TreeOctNode::template NeighborKey< LeftRadius , RightRadius >& key , int depth ){ return key.neighbors[ depth + 1 ]; } - template< int LeftRadius , int RightRadius > - static const typename TreeOctNode::template ConstNeighbors< LeftRadius + RightRadius + 1 >& _Neighbors( const typename TreeOctNode::template ConstNeighborKey< LeftRadius , RightRadius >& key , int depth ){ return key.neighbors[ depth + 1 ]; } - - static void _SetFullDepth( TreeOctNode* node , int depth ); - void _setFullDepth( int depth ); - - //////////////////////////////////// - // System construction code // - // MultiGridOctreeData.System.inl // - //////////////////////////////////// - template< int FEMDegree > - void _setMultiColorIndices( int start , int end , std::vector< std::vector< int > >& indices ) const; - template< int FEMDegree > - int _SolveSystemGS( const BSplineData< FEMDegree >& bsData , SparseNodeData< PointData< Real > , 0 >& pointInfo , int depth , DenseNodeData< Real , FEMDegree >& solution , DenseNodeData< Real , FEMDegree >& constraints , DenseNodeData< Real , FEMDegree >& metSolutionConstraints , int iters , bool coarseToFine , bool showResidual=false , double* bNorm2=NULL , double* inRNorm2=NULL , double* outRNorm2=NULL , bool forceSilent=false ); - template< int FEMDegree > - int _SolveSystemCG( const BSplineData< FEMDegree >& bsData , SparseNodeData< PointData< Real > , 0 >& pointInfo , int depth , DenseNodeData< Real , FEMDegree >& solution , DenseNodeData< Real , FEMDegree >& constraints , DenseNodeData< Real , FEMDegree >& metSolutionConstraints , int iters , bool coarseToFine , bool showResidual=false , double* bNorm2=NULL , double* inRNorm2=NULL , double* outRNorm2=NULL , double accuracy=0 ); - template< int FEMDegree > - int _SetMatrixRow( const SparseNodeData< PointData< Real > , 0 >& pointInfo , const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& neighbors , Pointer( MatrixEntry< Real > ) row , int offset , const typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator& integrator , const Stencil< double , BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& stencil , const BSplineData< FEMDegree >& bsData ) const; - template< int FEMDegree > - int _GetMatrixRowSize( const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& neighbors ) const; - - template< int FEMDegree1 , int FEMDegree2 > static void _SetParentOverlapBounds( const TreeOctNode* node , int& startX , int& endX , int& startY , int& endY , int& startZ , int& endZ ); - template< int FEMDegree > - void _UpdateConstraintsFromCoarser( const SparseNodeData< PointData< Real > , 0 >& pointInfo , const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& neighbors , const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& pNeighbors , TreeOctNode* node , DenseNodeData< Real , FEMDegree >& constraints , const DenseNodeData< Real , FEMDegree >& metSolution , const typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator , const Stencil< double , BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& stencil , const BSplineData< FEMDegree >& bsData ) const; - // Updates the constraints @(depth-1) based on the solution coefficients @(depth) - template< int FEMDegree > - void _UpdateConstraintsFromFiner( const typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator , const BSplineData< FEMDegree >& bsData , int highDepth , const DenseNodeData< Real , FEMDegree >& fineSolution , DenseNodeData< Real , FEMDegree >& coarseConstraints ) const; - // Evaluate the points @(depth) using coefficients @(depth-1) - template< int FEMDegree > - void _SetPointValuesFromCoarser( SparseNodeData< PointData< Real > , 0 >& pointInfo , int highDepth , const BSplineData< FEMDegree >& bsData , const DenseNodeData< Real , FEMDegree >& upSampledCoefficients ); - // Evalutes the solution @(depth) at the points @(depth-1) and updates the met constraints @(depth-1) - template< int FEMDegree > - void _SetPointConstraintsFromFiner( const SparseNodeData< PointData< Real > , 0 >& pointInfo , int highDepth , const BSplineData< FEMDegree >& bsData , const DenseNodeData< Real , FEMDegree >& finerCoefficients , DenseNodeData< Real , FEMDegree >& metConstraints ) const; - template< int FEMDegree > - Real _CoarserFunctionValue( Point3D< Real > p , const PointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , const BSplineData< FEMDegree >& bsData , const DenseNodeData< Real , FEMDegree >& upSampledCoefficients ) const; - template< int FEMDegree > - Real _FinerFunctionValue ( Point3D< Real > p , const PointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , const BSplineData< FEMDegree >& bsData , const DenseNodeData< Real , FEMDegree >& coefficients ) const; - template< int FEMDegree > - int _GetSliceMatrixAndUpdateConstraints( const SparseNodeData< PointData< Real > , 0 >& pointInfo , SparseMatrix< Real >& matrix , DenseNodeData< Real , FEMDegree >& constraints , typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator& integrator , typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator , const BSplineData< FEMDegree >& bsData , int depth , int slice , const DenseNodeData< Real , FEMDegree >& metSolution , bool coarseToFine ); - template< int FEMDegree > - int _GetMatrixAndUpdateConstraints( const SparseNodeData< PointData< Real > , 0 >& pointInfo , SparseMatrix< Real >& matrix , DenseNodeData< Real , FEMDegree >& constraints , typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator& integrator , typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator , const BSplineData< FEMDegree >& bsData , int depth , const DenseNodeData< Real , FEMDegree >* metSolution , bool coarseToFine ); - - // Down samples constraints @(depth) to constraints @(depth-1) - template< class C , int FEMDegree > void _DownSample( int highDepth , DenseNodeData< C , FEMDegree >& constraints ) const; - // Up samples coefficients @(depth-1) to coefficients @(depth) - template< class C , int FEMDegree > void _UpSample( int highDepth , DenseNodeData< C , FEMDegree >& coefficients ) const; - template< class C , int FEMDegree > static void _UpSample( int highDepth , ConstPointer( C ) lowCoefficients , Pointer( C ) highCoefficients , bool dirichlet , int threads ); - - ///////////////////////////////////////////// - // Code for splatting point-sample data // - // MultiGridOctreeData.WeightedSamples.inl // - ///////////////////////////////////////////// - template< int WeightDegree > - void _AddWeightContribution( SparseNodeData< Real , WeightDegree >& densityWeights , TreeOctNode* node , Point3D< Real > position , PointSupportKey< WeightDegree >& weightKey , Real weight=Real(1.0) ); - template< int WeightDegree > - Real _GetSamplesPerNode( const SparseNodeData< Real , WeightDegree >& densityWeights , const TreeOctNode* node , Point3D< Real > position , ConstPointSupportKey< WeightDegree >& weightKey ) const; - template< int WeightDegree > - Real _GetSamplesPerNode( const SparseNodeData< Real , WeightDegree >& densityWeights , TreeOctNode* node , Point3D< Real > position , PointSupportKey< WeightDegree >& weightKey ); - template< int WeightDegree > - void _GetSampleDepthAndWeight( const SparseNodeData< Real , WeightDegree >& densityWeights , const TreeOctNode* node , Point3D< Real > position , ConstPointSupportKey< WeightDegree >& weightKey , Real& depth , Real& weight ) const; - template< int WeightDegree > - void _GetSampleDepthAndWeight( const SparseNodeData< Real , WeightDegree >& densityWeights , TreeOctNode* node , Point3D< Real > position , PointSupportKey< WeightDegree >& weightKey , Real& depth , Real& weight ); -public: - template< int WeightDegree > - void _GetSampleDepthAndWeight( const SparseNodeData< Real , WeightDegree >& densityWeights , Point3D< Real > position , PointSupportKey< WeightDegree >& weightKey , Real& depth , Real& weight ); - template< int WeightDegree > - void _GetSampleDepthAndWeight( const SparseNodeData< Real , WeightDegree >& densityWeights , Point3D< Real > position , ConstPointSupportKey< WeightDegree >& weightKey , Real& depth , Real& weight ); -protected: - template< int DataDegree , class V > void _SplatPointData( TreeOctNode* node , Point3D< Real > point , V v , SparseNodeData< V , DataDegree >& data , PointSupportKey< DataDegree >& dataKey ); - template< int WeightDegree , int DataDegree , class V > Real _SplatPointData( const SparseNodeData< Real , WeightDegree >& densityWeights , Point3D< Real > point , V v , SparseNodeData< V , DataDegree >& data , PointSupportKey< WeightDegree >& weightKey , PointSupportKey< DataDegree >& dataKey , int minDepth , int maxDepth , int dim=DIMENSION ); - template< int WeightDegree , int DataDegree , class V > void _MultiSplatPointData( const SparseNodeData< Real , WeightDegree >* densityWeights , Point3D< Real > point , V v , SparseNodeData< V , DataDegree >& data , PointSupportKey< WeightDegree >& weightKey , PointSupportKey< DataDegree >& dataKey , int maxDepth , int dim=DIMENSION ); - template< class V , int DataDegree > V _Evaluate( const DenseNodeData< V , DataDegree >& coefficients , Point3D< Real > p , const BSplineData< DataDegree >& bsData , const ConstPointSupportKey< DataDegree >& neighborKey ) const; - template< class V , int DataDegree > V _Evaluate( const SparseNodeData< V , DataDegree >& coefficients , Point3D< Real > p , const BSplineData< DataDegree >& bsData , const ConstPointSupportKey< DataDegree >& dataKey ) const; -public: - template< class V , int DataDegree > V Evaluate( const DenseNodeData< V , DataDegree >& coefficients , Point3D< Real > p , const BSplineData< DataDegree >& bsData ) const; - template< class V , int DataDegree > V Evaluate( const SparseNodeData< V , DataDegree >& coefficients , Point3D< Real > p , const BSplineData< DataDegree >& bsData ) const; - template< class V , int DataDegree > Pointer( V ) Evaluate( const DenseNodeData< V , DataDegree >& coefficients , int& res , Real isoValue=0.f , int depth=-1 , bool primal=false ); - - template< int NormalDegree > int _HasNormals( TreeOctNode* node , const SparseNodeData< Point3D< Real > , NormalDegree >& normalInfo ); - void _MakeComplete( void ); - void _SetValidityFlags( void ); - template< int NormalDegree > void _ClipTree( const SparseNodeData< Point3D< Real > , NormalDegree >& normalInfo ); - - //////////////////////////////////// - // Evaluation Methods // - // MultiGridOctreeData.Evaluation // - //////////////////////////////////// - static const int CHILDREN = Cube::CORNERS; - template< int FEMDegree > - struct _Evaluator - { - typename BSplineEvaluationData< FEMDegree >::Evaluator evaluator; - typename BSplineEvaluationData< FEMDegree >::ChildEvaluator childEvaluator; - Stencil< double , BSplineEvaluationData< FEMDegree >::SupportSize > cellStencil; - Stencil< double , BSplineEvaluationData< FEMDegree >::SupportSize > cellStencils [CHILDREN]; - Stencil< double , BSplineEvaluationData< FEMDegree >::SupportSize > edgeStencil [Cube::EDGES ]; - Stencil< double , BSplineEvaluationData< FEMDegree >::SupportSize > edgeStencils [CHILDREN][Cube::EDGES ]; - Stencil< double , BSplineEvaluationData< FEMDegree >::SupportSize > faceStencil [Cube::FACES ]; - Stencil< double , BSplineEvaluationData< FEMDegree >::SupportSize > faceStencils [CHILDREN][Cube::FACES ]; - Stencil< double , BSplineEvaluationData< FEMDegree >::SupportSize > cornerStencil [Cube::CORNERS]; - Stencil< double , BSplineEvaluationData< FEMDegree >::SupportSize > cornerStencils[CHILDREN][Cube::CORNERS]; - - Stencil< Point3D< double > , BSplineEvaluationData< FEMDegree >::SupportSize > dCellStencil; - Stencil< Point3D< double > , BSplineEvaluationData< FEMDegree >::SupportSize > dCellStencils [CHILDREN]; - Stencil< Point3D< double > , BSplineEvaluationData< FEMDegree >::SupportSize > dEdgeStencil [Cube::EDGES ]; - Stencil< Point3D< double > , BSplineEvaluationData< FEMDegree >::SupportSize > dEdgeStencils [CHILDREN][Cube::EDGES ]; - Stencil< Point3D< double > , BSplineEvaluationData< FEMDegree >::SupportSize > dFaceStencil [Cube::FACES ]; - Stencil< Point3D< double > , BSplineEvaluationData< FEMDegree >::SupportSize > dFaceStencils [CHILDREN][Cube::FACES ]; - Stencil< Point3D< double > , BSplineEvaluationData< FEMDegree >::SupportSize > dCornerStencil [Cube::CORNERS]; - Stencil< Point3D< double > , BSplineEvaluationData< FEMDegree >::SupportSize > dCornerStencils[CHILDREN][Cube::CORNERS]; - void set( int depth , bool dirichlet ); - }; - template< class V , int FEMDegree > - V _getCenterValue( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , const DenseNodeData< V , FEMDegree >& solution , const DenseNodeData< V , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const; - template< class V , int FEMDegree > - V _getCornerValue( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , int corner , const DenseNodeData< V , FEMDegree >& solution , const DenseNodeData< V , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const; - template< class V , int FEMDegree > - V _getEdgeValue ( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , int edge , const DenseNodeData< V , FEMDegree >& solution , const DenseNodeData< V , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const; - - template< int FEMDegree > - std::pair< Real , Point3D< Real > > _getCornerValueAndGradient( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , int corner , const DenseNodeData< Real , FEMDegree >& solution , const DenseNodeData< Real , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const; - template< int FEMDegree > - std::pair< Real , Point3D< Real > > _getEdgeValueAndGradient ( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , int edge , const DenseNodeData< Real , FEMDegree >& solution , const DenseNodeData< Real , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const; - - //////////////////////////////////////// - // Iso-Surfacing Methods // - // MultiGridOctreeData.IsoSurface.inl // - //////////////////////////////////////// - struct IsoEdge - { - long long edges[2]; - IsoEdge( void ){ edges[0] = edges[1] = 0; } - IsoEdge( long long v1 , long long v2 ){ edges[0] = v1 , edges[1] = v2; } - long long& operator[]( int idx ){ return edges[idx]; } - const long long& operator[]( int idx ) const { return edges[idx]; } - }; - struct FaceEdges - { - IsoEdge edges[2]; - int count; - }; - template< class Vertex > - struct SliceValues - { - typename SortedTreeNodes::SliceTableData sliceData; - Pointer( Real ) cornerValues ; Pointer( Point3D< Real > ) cornerGradients ; Pointer( char ) cornerSet; - Pointer( long long ) edgeKeys ; Pointer( char ) edgeSet; - Pointer( FaceEdges ) faceEdges ; Pointer( char ) faceSet; - Pointer( char ) mcIndices; - hash_map< long long , std::vector< IsoEdge > > faceEdgeMap; - hash_map< long long , std::pair< int , Vertex > > edgeVertexMap; - hash_map< long long , long long > vertexPairMap; - - SliceValues( void ); - ~SliceValues( void ); - void reset( bool nonLinearFit ); - protected: - int _oldCCount , _oldECount , _oldFCount , _oldNCount; - }; - template< class Vertex > - struct XSliceValues - { - typename SortedTreeNodes::XSliceTableData xSliceData; - Pointer( long long ) edgeKeys ; Pointer( char ) edgeSet; - Pointer( FaceEdges ) faceEdges ; Pointer( char ) faceSet; - hash_map< long long , std::vector< IsoEdge > > faceEdgeMap; - hash_map< long long , std::pair< int , Vertex > > edgeVertexMap; - hash_map< long long , long long > vertexPairMap; - - XSliceValues( void ); - ~XSliceValues( void ); - void reset( void ); - protected: - int _oldECount , _oldFCount; - }; - template< class Vertex > - struct SlabValues - { - XSliceValues< Vertex > _xSliceValues[2]; - SliceValues< Vertex > _sliceValues[2]; - SliceValues< Vertex >& sliceValues( int idx ){ return _sliceValues[idx&1]; } - const SliceValues< Vertex >& sliceValues( int idx ) const { return _sliceValues[idx&1]; } - XSliceValues< Vertex >& xSliceValues( int idx ){ return _xSliceValues[idx&1]; } - const XSliceValues< Vertex >& xSliceValues( int idx ) const { return _xSliceValues[idx&1]; } - }; - template< class Vertex , int FEMDegree > - void SetSliceIsoCorners( const DenseNodeData< Real , FEMDegree >& solution , const DenseNodeData< Real , FEMDegree >& coarseSolution , Real isoValue , int depth , int slice , std::vector< SlabValues< Vertex > >& sValues , const _Evaluator< FEMDegree >& evaluator , int threads ); - template< class Vertex , int FEMDegree > - void SetSliceIsoCorners( const DenseNodeData< Real , FEMDegree >& solution , const DenseNodeData< Real , FEMDegree >& coarseSolution , Real isoValue , int depth , int slice , int z , std::vector< SlabValues< Vertex > >& sValues , const _Evaluator< FEMDegree >& evaluator , int threads ); - template< int WeightDegree , int ColorDegree , class Vertex > - void SetSliceIsoVertices( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , int depth , int slice , int& vOffset , CoredMeshData< Vertex >& mesh , std::vector< SlabValues< Vertex > >& sValues , int threads ); - template< int WeightDegree , int ColorDegree , class Vertex > - void SetSliceIsoVertices( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , int depth , int slice , int z , int& vOffset , CoredMeshData< Vertex >& mesh , std::vector< SlabValues< Vertex > >& sValues , int threads ); - template< int WeightDegree , int ColorDegree , class Vertex > - void SetXSliceIsoVertices( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , int depth , int slab , int& vOffset , CoredMeshData< Vertex >& mesh , std::vector< SlabValues< Vertex > >& sValues , int threads ); - template< class Vertex > - void CopyFinerSliceIsoEdgeKeys( int depth , int slice , std::vector< SlabValues< Vertex > >& sValues , int threads ); - template< class Vertex > - void CopyFinerSliceIsoEdgeKeys( int depth , int slice , int z , std::vector< SlabValues< Vertex > >& sValues , int threads ); - template< class Vertex > - void CopyFinerXSliceIsoEdgeKeys( int depth , int slab , std::vector< SlabValues< Vertex > >& sValues , int threads ); - template< class Vertex > - void SetSliceIsoEdges( int depth , int slice , std::vector< SlabValues< Vertex > >& slabValues , int threads ); - template< class Vertex > - void SetSliceIsoEdges( int depth , int slice , int z , std::vector< SlabValues< Vertex > >& slabValues , int threads ); - template< class Vertex > - void SetXSliceIsoEdges( int depth , int slice , std::vector< SlabValues< Vertex > >& slabValues , int threads ); - - template< class Vertex > - void SetIsoSurface( int depth , int offset , const SliceValues< Vertex >& bValues , const SliceValues< Vertex >& fValues , const XSliceValues< Vertex >& xValues , CoredMeshData< Vertex >& mesh , bool polygonMesh , bool addBarycenter , int& vOffset , int threads ); - - template< class Vertex > - static int AddIsoPolygons( CoredMeshData< Vertex >& mesh , std::vector< std::pair< int , Vertex > >& polygon , bool polygonMesh , bool addBarycenter , int& vOffset ); - - template< int WeightDegree , int ColorDegree , class Vertex > - bool GetIsoVertex( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , ConstPointSupportKey< WeightDegree >& weightKey , ConstPointSupportKey< ColorDegree >& colorKey , const TreeOctNode* node , int edgeIndex , int z , const SliceValues< Vertex >& sValues , Vertex& vertex ); - template< int WeightDegree , int ColorDegree , class Vertex > - bool GetIsoVertex( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , ConstPointSupportKey< WeightDegree >& weightKey , ConstPointSupportKey< ColorDegree >& colorKey , const TreeOctNode* node , int cornerIndex , const SliceValues< Vertex >& bValues , const SliceValues< Vertex >& fValues , Vertex& vertex ); - -public: - static double maxMemoryUsage; - int threads; - - static double MemoryUsage( void ); - Octree( void ); - - // After calling set tree, the indices of the octree node will be stored by depth, and within depth they will be sorted by slice - template< class PointReal , int NormalDegree , int WeightDegree , int DataDegree , class Data , class _Data > - int SetTree( OrientedPointStream< PointReal >* pointStream , int minDepth , int maxDepth , int fullDepth , int splatDepth , Real samplesPerNode , - Real scaleFactor , bool useConfidence , bool useNormalWeight , - Real constraintWeight , int adaptiveExponent , - SparseNodeData< Real , WeightDegree >& densityWeights , SparseNodeData< PointData< Real > , 0 >& pointInfo , SparseNodeData< Point3D< Real > , NormalDegree >& normalInfo , SparseNodeData< Real , NormalDegree >& nodeWeights , - SparseNodeData< ProjectiveData< _Data > , DataDegree >* dataValues , - XForm4x4< Real >& xForm , bool dirichlet=false , bool makeComplete=false ); - - template< int FEMDegree > void EnableMultigrid( std::vector< int >* map ); - - template< int FEMDegree , int NormalDegree > - DenseNodeData< Real , FEMDegree > SetLaplacianConstraints( const SparseNodeData< Point3D< Real > , NormalDegree >& normalInfo ); - template< int FEMDegree > - DenseNodeData< Real , FEMDegree > SolveSystem( SparseNodeData< PointData< Real > , 0 >& pointInfo , DenseNodeData< Real , FEMDegree >& constraints , bool showResidual , int iters , int maxSolveDepth , int cgDepth=0 , double cgAccuracy=0 ); - - template< int FEMDegree , int NormalDegree > - Real GetIsoValue( const DenseNodeData< Real , FEMDegree >& solution , const SparseNodeData< Real , NormalDegree >& nodeWeights ); - template< int FEMDegree , int WeightDegree , int ColorDegree , class Vertex > - void GetMCIsoSurface( const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , const DenseNodeData< Real , FEMDegree >& solution , Real isoValue , CoredMeshData< Vertex >& mesh , bool nonLinearFit=true , bool addBarycenter=false , bool polygonMesh=false ); - - const TreeOctNode& tree( void ) const{ return _tree; } - size_t leaves( void ) const { return _tree.leaves(); } - size_t nodes( void ) const { return _tree.nodes(); } -}; - -template< class Real > -void Reset( void ) -{ - TreeNodeData::NodeCount=0; - Octree< Real >::maxMemoryUsage = 0; -} - -#include "MultiGridOctreeData.inl" -#include "MultiGridOctreeData.SortedTreeNodes.inl" -#include "MultiGridOctreeData.WeightedSamples.inl" -#include "MultiGridOctreeData.System.inl" -#include "MultiGridOctreeData.IsoSurface.inl" -#include "MultiGridOctreeData.Evaluation.inl" -#endif // MULTI_GRID_OCTREE_DATA_INCLUDED +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ +// [COMMENTS] +// -- Throughout the code, should make a distinction between indices and offsets +// -- Make an instance of _Evaluate that samples the finite-elements correctly (specifically, to handle the boundaries) +// -- Make functions like depthAndOffset parity dependent (ideally all "depth"s should be relative to the B-Slpline resolution +// -- Make all points relative to the unit-cube, regardless of degree parity +// -- It's possible that for odd degrees, the iso-surfacing will fail because the leaves in the SortedTreeNodes do not form a partition of space +// -- [MAYBE] Treat normal field as a sum of delta functions, rather than a smoothed signal (again, so that high degrees aren't forced to generate smooth reconstructions) +// -- [MAYBE] Make the degree of the B-Spline with which the normals are splatted independent of the degree of the FEM system. (This way, higher degree systems aren't forced to generate smoother normal fields.) + +// [TODO] +// -- Currently, the implementation assumes that the boundary constraints are the same for vector fields and scalar fields +// -- Fix up the ordering in the divergence evaluation + +#ifndef MULTI_GRID_OCTREE_DATA_INCLUDED +#define MULTI_GRID_OCTREE_DATA_INCLUDED + +#define NEW_CODE 1 +#define NEW_NEW_CODE 0 // Enabling this ensures that all the nodes contained in the support of the normal field are in the tree + +#define DATA_DEGREE 1 // The order of the B-Spline used to splat in data for color interpolation +#define WEIGHT_DEGREE 2 // The order of the B-Spline used to splat in the weights for density estimation +#define NORMAL_DEGREE 2 // The order of the B-Spline used to splat int the normals for constructing the Laplacian constraints + +//#define MAX_MEMORY_GB 15 +#define MAX_MEMORY_GB 0 + +#define GRADIENT_DOMAIN_SOLUTION 1 // Given the constraint vector-field V(p), there are two ways to solve for the coefficients, x, of the indicator function + // with respect to the B-spline basis {B_i(p)} + // 1] Find x minimizing: + // || V(p) - \sum_i \nabla x_i B_i(p) ||^2 + // which is solved by the system A_1x = b_1 where: + // A_1[i,j] = < \nabla B_i(p) , \nabla B_j(p) > + // b_1[i] = < \nabla B_i(p) , V(p) > + // 2] Formulate this as a Poisson equation: + // \sum_i x_i \Delta B_i(p) = \nabla \cdot V(p) + // which is solved by the system A_2x = b_2 where: + // A_2[i,j] = - < \Delta B_i(p) , B_j(p) > + // b_2[i] = - < B_i(p) , \nabla \cdot V(p) > + // Although the two system matrices should be the same (assuming that the B_i satisfy dirichlet/neumann boundary conditions) + // the constraint vectors can differ when V does not satisfy the Neumann boundary conditions: + // A_1[i,j] = \int_R < \nabla B_i(p) , \nabla B_j(p) > + // = \int_R [ \nabla \cdot ( B_i(p) \nabla B_j(p) ) - B_i(p) \Delta B_j(p) ] + // = \int_dR < N(p) , B_i(p) \nabla B_j(p) > + A_2[i,j] + // and the first integral is zero if either f_i is zero on the boundary dR or the derivative of B_i across the boundary is zero. + // However, for the constraints we have: + // b_1(i) = \int_R < \nabla B_i(p) , V(p) > + // = \int_R [ \nabla \cdot ( B_i(p) V(p) ) - B_i(p) \nabla \cdot V(p) ] + // = \int_dR < N(p) , B_i(p) V(p) > + b_2[i] + // In particular, this implies that if the B_i satisfy the Neumann boundary conditions (rather than Dirichlet), + // and V is not zero across the boundary, then the two constraints are different. + // Forcing the < V(p) , N(p) > = 0 on the boundary, by killing off the component of the vector-field in the normal direction + // (FORCE_NEUMANN_FIELD), makes the two systems equal, and the value of this flag should be immaterial. + // Note that under interpretation 1, we have: + // \sum_i b_1(i) = < \nabla \sum_ i B_i(p) , V(p) > = 0 + // because the B_i's sum to one. However, in general, we could have + // \sum_i b_2(i) \neq 0. + // This could cause trouble because the constant functions are in the kernel of the matrix A, so CG will misbehave if the constraint + // has a non-zero DC term. (Again, forcing < V(p) , N(p) > = 0 along the boundary resolves this problem.) + +#define FORCE_NEUMANN_FIELD 1 // This flag forces the normal component across the boundary of the integration domain to be zero. + // This should be enabled if GRADIENT_DOMAIN_SOLUTION is not, so that CG doesn't run into trouble. + +#if !FORCE_NEUMANN_FIELD +#pragma message( "[WARNING] Not zeroing out normal component on boundary" ) +#endif // !FORCE_NEUMANN_FIELD + +#include "Hash.h" +#include "BSplineData.h" +#include "PointStream.h" + +#ifndef _OPENMP +int omp_get_num_procs( void ){ return 1; } +int omp_get_thread_num( void ){ return 0; } +#endif // _OPENMP + +class TreeNodeData +{ +public: + static size_t NodeCount; + int nodeIndex; + char flags; + + TreeNodeData( void ); + ~TreeNodeData( void ); +}; + +class VertexData +{ + typedef OctNode< TreeNodeData > TreeOctNode; +public: + static const int VERTEX_COORDINATE_SHIFT = ( sizeof( long long ) * 8 ) / 3; + static long long EdgeIndex( const TreeOctNode* node , int eIndex , int maxDepth , int index[DIMENSION] ); + static long long EdgeIndex( const TreeOctNode* node , int eIndex , int maxDepth ); + static long long FaceIndex( const TreeOctNode* node , int fIndex , int maxDepth,int index[DIMENSION] ); + static long long FaceIndex( const TreeOctNode* node , int fIndex , int maxDepth ); + static long long CornerIndex( const TreeOctNode* node , int cIndex , int maxDepth , int index[DIMENSION] ); + static long long CornerIndex( const TreeOctNode* node , int cIndex , int maxDepth ); + static long long CenterIndex( const TreeOctNode* node , int maxDepth , int index[DIMENSION] ); + static long long CenterIndex( const TreeOctNode* node , int maxDepth ); + static long long CornerIndex( int depth , const int offSet[DIMENSION] , int cIndex , int maxDepth , int index[DIMENSION] ); + static long long CenterIndex( int depth , const int offSet[DIMENSION] , int maxDepth , int index[DIMENSION] ); + static long long CornerIndexKey( const int index[DIMENSION] ); +}; + +// This class stores the octree nodes, sorted by depth and then by z-slice. +// To support primal representations, the initializer takes a function that +// determines if a node should be included/indexed in the sorted list. +class SortedTreeNodes +{ + typedef OctNode< TreeNodeData > TreeOctNode; +protected: + Pointer( Pointer( int ) ) _sliceStart; + int _levels; +public: + Pointer( TreeOctNode* ) treeNodes; + int begin( int depth ) const{ return _sliceStart[depth][0]; } + int end( int depth ) const{ return _sliceStart[depth][(size_t)1<=_levels||slice<0||slice>=(1<=_levels) printf( "uhoh\n" ); return _sliceStart[depth][(size_t)1<* map ); + void set( TreeOctNode& root ); + + template< int Indices > + struct _Indices + { + int idx[Indices]; + _Indices( void ){ memset( idx , -1 , sizeof( int ) * Indices ); } + int& operator[] ( int i ) { return idx[i]; } + const int& operator[] ( int i ) const { return idx[i]; } + }; + typedef _Indices< Square::CORNERS > SquareCornerIndices; + typedef _Indices< Square::EDGES > SquareEdgeIndices; + typedef _Indices< Square::FACES > SquareFaceIndices; + + struct SliceTableData + { + Pointer( SquareCornerIndices ) cTable; + Pointer( SquareEdgeIndices ) eTable; + Pointer( SquareFaceIndices ) fTable; + int cCount , eCount , fCount , nodeOffset , nodeCount; + SliceTableData( void ) { + fCount = eCount = cCount = 0; + cTable = NullPointer( SquareCornerIndices ); + eTable = NullPointer( SquareEdgeIndices ); + fTable = NullPointer( SquareFaceIndices ); + _cMap = _eMap = _fMap = NullPointer( int ); + } + ~SliceTableData( void ){ clear(); } + void clear( void ){ + DeletePointer( cTable ) ; + DeletePointer( eTable ) ; + DeletePointer( fTable ) ; + fCount = eCount = cCount = 0; + DeletePointer(_cMap); // [Bruno] + DeletePointer(_eMap); // [Bruno] + DeletePointer(_fMap); // [Bruno] + } + SquareCornerIndices& cornerIndices( const TreeOctNode* node ); + SquareCornerIndices& cornerIndices( int idx ); + const SquareCornerIndices& cornerIndices( const TreeOctNode* node ) const; + const SquareCornerIndices& cornerIndices( int idx ) const; + SquareEdgeIndices& edgeIndices( const TreeOctNode* node ); + SquareEdgeIndices& edgeIndices( int idx ); + const SquareEdgeIndices& edgeIndices( const TreeOctNode* node ) const; + const SquareEdgeIndices& edgeIndices( int idx ) const; + SquareFaceIndices& faceIndices( const TreeOctNode* node ); + SquareFaceIndices& faceIndices( int idx ); + const SquareFaceIndices& faceIndices( const TreeOctNode* node ) const; + const SquareFaceIndices& faceIndices( int idx ) const; + protected: + Pointer( int ) _cMap; + Pointer( int ) _eMap; + Pointer( int ) _fMap; + friend class SortedTreeNodes; + }; + struct XSliceTableData + { + Pointer( SquareCornerIndices ) eTable; + Pointer( SquareEdgeIndices ) fTable; + int fCount , eCount , nodeOffset , nodeCount; + XSliceTableData( void ){ + fCount = eCount = 0; + eTable = NullPointer( SquareCornerIndices ); + fTable = NullPointer( SquareEdgeIndices ); + _eMap = _fMap = NullPointer( int ); + } + ~XSliceTableData( void ){ clear(); } + void clear( void ) { + DeletePointer( fTable ) ; + DeletePointer( eTable ) ; + DeletePointer( _eMap ); // [Bruno] + DeletePointer( _fMap ); // [Bruno] + fCount = eCount = 0; + } + SquareCornerIndices& edgeIndices( const TreeOctNode* node ); + SquareCornerIndices& edgeIndices( int idx ); + const SquareCornerIndices& edgeIndices( const TreeOctNode* node ) const; + const SquareCornerIndices& edgeIndices( int idx ) const; + SquareEdgeIndices& faceIndices( const TreeOctNode* node ); + SquareEdgeIndices& faceIndices( int idx ); + const SquareEdgeIndices& faceIndices( const TreeOctNode* node ) const; + const SquareEdgeIndices& faceIndices( int idx ) const; + protected: + Pointer( int ) _eMap; + Pointer( int ) _fMap; + friend class SortedTreeNodes; + }; + void setSliceTableData ( SliceTableData& sData , int depth , int offset , int threads ) const; + void setXSliceTableData( XSliceTableData& sData , int depth , int offset , int threads ) const; +}; + +template< int Degree > +struct PointSupportKey : public OctNode< TreeNodeData >::NeighborKey< BSplineEvaluationData< Degree >::SupportEnd , -BSplineEvaluationData< Degree >::SupportStart > +{ + static const int LeftRadius = BSplineEvaluationData< Degree >::SupportEnd; + static const int RightRadius = -BSplineEvaluationData< Degree >::SupportStart; + static const int Size = LeftRadius + RightRadius + 1; +}; +template< int Degree > +struct ConstPointSupportKey : public OctNode< TreeNodeData >::ConstNeighborKey< BSplineEvaluationData< Degree >::SupportEnd , -BSplineEvaluationData< Degree >::SupportStart > +{ + static const int LeftRadius = BSplineEvaluationData< Degree >::SupportEnd; + static const int RightRadius = -BSplineEvaluationData< Degree >::SupportStart; + static const int Size = LeftRadius + RightRadius + 1; +}; + +template< class Real > +struct PointData +{ + Point3D< Real > position; + Real weightedCoarserDValue; + Real weight; + PointData( Point3D< Real > p=Point3D< Real >() , Real w=0 ) { position = p , weight = w , weightedCoarserDValue = Real(0); } +}; +template< class Data , int Degree > +struct SparseNodeData +{ + std::vector< int > indices; + std::vector< Data > data; + template< class TreeNodeData > + int index( const OctNode< TreeNodeData >* node ) const { return ( !node || node->nodeData.nodeIndex<0 || node->nodeData.nodeIndex>=(int)indices.size() ) ? -1 : indices[ node->nodeData.nodeIndex ]; } +#if NEW_NEW_CODE + int index( int nodeIndex ) const { return ( nodeIndex<0 || nodeIndex>=(int)indices.size() ) ? -1 : indices[ nodeIndex ]; } +#endif // NEW_NEW_CODE + void resize( size_t sz ){ indices.resize( sz , -1 ); } + void remapIndices( const std::vector< int >& map ) + { + std::vector< int > temp = indices; + indices.resize( map.size() ); + for( size_t i=0 ; i +struct DenseNodeData +{ + Pointer( Data ) data; + DenseNodeData( void ) { data = NullPointer( Data ); } + DenseNodeData( size_t sz ){ if( sz ) data = NewPointer< Data >( sz ) ; else data = NullPointer( Data ); } + void resize( size_t sz ){ DeletePointer( data ) ; if( sz ) data = NewPointer< Data >( sz ) ; else data = NullPointer( Data ); } + Data& operator[] ( int idx ) { return data[idx]; } + const Data& operator[] ( int idx ) const { return data[idx]; } +}; + +template< class C , int N > struct Stencil{ C values[N][N][N]; }; + +template< int Degree1 , int Degree2 > +class SystemCoefficients +{ + typedef typename BSplineIntegrationData< Degree1 , Degree2 >::FunctionIntegrator FunctionIntegrator; + static const int OverlapSize = BSplineIntegrationData< Degree1 , Degree2 >::OverlapSize; + static const int OverlapStart = BSplineIntegrationData< Degree1 , Degree2 >::OverlapStart; + static const int OverlapEnd = BSplineIntegrationData< Degree1 , Degree2 >::OverlapEnd; +public: + static double GetLaplacian ( const typename FunctionIntegrator:: Integrator& integrator , const int off1[3] , const int off2[3] ); + static double GetLaplacian ( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[3] , const int off2[3] ); + static double GetDivergence1( const typename FunctionIntegrator:: Integrator& integrator , const int off1[3] , const int off2[3] , Point3D< double > normal1 ); + static double GetDivergence1( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[3] , const int off2[3] , Point3D< double > normal1 ); + static double GetDivergence2( const typename FunctionIntegrator:: Integrator& integrator , const int off1[3] , const int off2[3] , Point3D< double > normal2 ); + static double GetDivergence2( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[3] , const int off2[3] , Point3D< double > normal2 ); + static Point3D< double > GetDivergence1 ( const typename FunctionIntegrator:: Integrator& integrator , const int off1[3] , const int off2[3] ); + static Point3D< double > GetDivergence1 ( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[3] , const int off2[3] ); + static Point3D< double > GetDivergence2 ( const typename FunctionIntegrator:: Integrator& integrator , const int off1[3] , const int off2[3] ); + static Point3D< double > GetDivergence2 ( const typename FunctionIntegrator::ChildIntegrator& integrator , const int off1[3] , const int off2[3] ); + static void SetCentralDivergenceStencil ( const typename FunctionIntegrator:: Integrator& integrator , Stencil< Point3D< double > , OverlapSize >& stencil , bool scatter ); + static void SetCentralDivergenceStencils( const typename FunctionIntegrator::ChildIntegrator& integrator , Stencil< Point3D< double > , OverlapSize > stencil[2][2][2] , bool scatter ); + static void SetCentralLaplacianStencil ( const typename FunctionIntegrator:: Integrator& integrator , Stencil< double , OverlapSize >& stencil ); + static void SetCentralLaplacianStencils ( const typename FunctionIntegrator::ChildIntegrator& integrator , Stencil< double , OverlapSize > stencil[2][2][2] ); +}; + +// Note that throughout this code, the "depth" parameter refers to the depth in the octree, not the corresponding depth +// of the B-Spline element +template< class Real > +class Octree +{ + typedef OctNode< TreeNodeData > TreeOctNode; +public: + template< int FEMDegree > static void FunctionIndex( const TreeOctNode* node , int idx[3] ); + + typedef typename TreeOctNode:: NeighborKey< 1 , 1 > AdjacenctNodeKey; + typedef typename TreeOctNode::ConstNeighborKey< 1 , 1 > ConstAdjacenctNodeKey; + + template< class V > + struct ProjectiveData + { + V v; + Real w; + ProjectiveData( V vv=V(0) , Real ww=Real(0) ) : v(vv) , w(ww) { } + operator V (){ return w!=0 ? v/w : v*w; } + ProjectiveData& operator += ( const ProjectiveData& p ){ v += p.v , w += p.w ; return *this; } + ProjectiveData& operator -= ( const ProjectiveData& p ){ v -= p.v , w -= p.w ; return *this; } + ProjectiveData& operator *= ( Real s ){ v *= s , w *= s ; return *this; } + ProjectiveData& operator /= ( Real s ){ v /= s , w /= s ; return *this; } + ProjectiveData operator + ( const ProjectiveData& p ) const { return ProjectiveData( v+p.v , w+p.w ); } + ProjectiveData operator - ( const ProjectiveData& p ) const { return ProjectiveData( v-p.v , w-p.w ); } + ProjectiveData operator * ( Real s ) const { return ProjectiveData( v*s , w*s ); } + ProjectiveData operator / ( Real s ) const { return ProjectiveData( v/s , w/s ); } + }; + template< int FEMDegree > static bool IsValidNode( const TreeOctNode* node , bool dirichlet ); + + // [Bruno] need these two ones to be able to get bbox. + const Point3D& center() const { return _center; } + Real scale() const { return _scale; } + +protected: + template< int FEMDegree > bool _IsValidNode( const TreeOctNode* node ) const { return node && ( node->nodeData.flags & ( 1<<( FEMDegree&1 ) ) ) ; } + + TreeOctNode _tree; + TreeOctNode* _spaceRoot; + SortedTreeNodes _sNodes; + int _splatDepth; + int _maxDepth; + int _minDepth; + int _fullDepth; + bool _constrainValues; + bool _dirichlet; + Real _scale; + Point3D< Real > _center; + int _multigridDegree; + + bool _InBounds( Point3D< Real > ) const; + template< int FEMDegree > static int _Dimension( int depth ){ return BSplineData< FEMDegree >::Dimension( depth-1 ); } + static int _Resolution( int depth ){ return 1<<(depth-1); } + template< int FEMDegree > static bool _IsInteriorlySupported( int d , int x , int y , int z ) + { + if( d-1>=0 ) + { + int begin , end; + BSplineEvaluationData< FEMDegree >::InteriorSupportedSpan( d-1 , begin , end ); + return ( x>=begin && x=begin && y=begin && z static bool _IsInteriorlySupported( const TreeOctNode* node ) + { + if( !node ) return false; + int d , off[3]; + node->depthAndOffset( d , off ); + return _IsInteriorlySupported< FEMDegree >( d , off[0] , off[1] , off[2] ); + } + template< int FEMDegree1 , int FEMDegree2 > static bool _IsInteriorlyOverlapped( int d , int x , int y , int z ) + { + if( d-1>=0 ) + { + int begin , end; + BSplineIntegrationData< FEMDegree1 , FEMDegree2 >::InteriorOverlappedSpan( d-1 , begin , end ); + return ( x>=begin && x=begin && y=begin && z static bool _IsInteriorlyOverlapped( const TreeOctNode* node ) + { + if( !node ) return false; + int d , off[3]; + node->depthAndOffset( d , off ); + return _IsInteriorlyOverlapped< FEMDegree1 , FEMDegree2 >( d , off[0] , off[1] , off[2] ); + } + static void _DepthAndOffset( const TreeOctNode* node , int& d , int off[3] ){ node->depthAndOffset( d , off ) ; d -= 1; } + static int _Depth( const TreeOctNode* node ){ return node->depth()-1; } + static void _StartAndWidth( const TreeOctNode* node , Point3D< Real >& start , Real& width ) + { + int d , off[3]; + _DepthAndOffset( node , d , off ); + if( d>=0 ) width = Real( 1.0 / (1<< d ) ); + else width = Real( 1.0 * (1<<(-d)) ); + for( int dd=0 ; dd& center , Real& width ) + { + int d , off[3]; + _DepthAndOffset( node , d , off ); + width = Real( 1.0 / (1< + static typename TreeOctNode::ConstNeighbors< LeftRadius + RightRadius + 1 >& _Neighbors( TreeOctNode::ConstNeighborKey< LeftRadius , RightRadius >& key , int depth ){ return key.neighbors[ depth + 1 ]; } + template< int LeftRadius , int RightRadius > + static typename TreeOctNode::Neighbors< LeftRadius + RightRadius + 1 >& _Neighbors( TreeOctNode::NeighborKey< LeftRadius , RightRadius >& key , int depth ){ return key.neighbors[ depth + 1 ]; } + template< int LeftRadius , int RightRadius > + static const typename TreeOctNode::template Neighbors< LeftRadius + RightRadius + 1 >& _Neighbors( const typename TreeOctNode::template NeighborKey< LeftRadius , RightRadius >& key , int depth ){ return key.neighbors[ depth + 1 ]; } + template< int LeftRadius , int RightRadius > + static const typename TreeOctNode::template ConstNeighbors< LeftRadius + RightRadius + 1 >& _Neighbors( const typename TreeOctNode::template ConstNeighborKey< LeftRadius , RightRadius >& key , int depth ){ return key.neighbors[ depth + 1 ]; } + + static void _SetFullDepth( TreeOctNode* node , int depth ); + void _setFullDepth( int depth ); + + //////////////////////////////////// + // System construction code // + // MultiGridOctreeData.System.inl // + //////////////////////////////////// + template< int FEMDegree > + void _setMultiColorIndices( int start , int end , std::vector< std::vector< int > >& indices ) const; + template< int FEMDegree > + int _SolveSystemGS( const BSplineData< FEMDegree >& bsData , SparseNodeData< PointData< Real > , 0 >& pointInfo , int depth , DenseNodeData< Real , FEMDegree >& solution , DenseNodeData< Real , FEMDegree >& constraints , DenseNodeData< Real , FEMDegree >& metSolutionConstraints , int iters , bool coarseToFine , bool showResidual=false , double* bNorm2=NULL , double* inRNorm2=NULL , double* outRNorm2=NULL , bool forceSilent=false ); + template< int FEMDegree > + int _SolveSystemCG( const BSplineData< FEMDegree >& bsData , SparseNodeData< PointData< Real > , 0 >& pointInfo , int depth , DenseNodeData< Real , FEMDegree >& solution , DenseNodeData< Real , FEMDegree >& constraints , DenseNodeData< Real , FEMDegree >& metSolutionConstraints , int iters , bool coarseToFine , bool showResidual=false , double* bNorm2=NULL , double* inRNorm2=NULL , double* outRNorm2=NULL , double accuracy=0 ); + template< int FEMDegree > + int _SetMatrixRow( const SparseNodeData< PointData< Real > , 0 >& pointInfo , const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& neighbors , Pointer( MatrixEntry< Real > ) row , int offset , const typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator& integrator , const Stencil< double , BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& stencil , const BSplineData< FEMDegree >& bsData ) const; + template< int FEMDegree > + int _GetMatrixRowSize( const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& neighbors ) const; + + template< int FEMDegree1 , int FEMDegree2 > static void _SetParentOverlapBounds( const TreeOctNode* node , int& startX , int& endX , int& startY , int& endY , int& startZ , int& endZ ); + template< int FEMDegree > + void _UpdateConstraintsFromCoarser( const SparseNodeData< PointData< Real > , 0 >& pointInfo , const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& neighbors , const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& pNeighbors , TreeOctNode* node , DenseNodeData< Real , FEMDegree >& constraints , const DenseNodeData< Real , FEMDegree >& metSolution , const typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator , const Stencil< double , BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& stencil , const BSplineData< FEMDegree >& bsData ) const; + // Updates the constraints @(depth-1) based on the solution coefficients @(depth) + template< int FEMDegree > + void _UpdateConstraintsFromFiner( const typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator , const BSplineData< FEMDegree >& bsData , int highDepth , const DenseNodeData< Real , FEMDegree >& fineSolution , DenseNodeData< Real , FEMDegree >& coarseConstraints ) const; + // Evaluate the points @(depth) using coefficients @(depth-1) + template< int FEMDegree > + void _SetPointValuesFromCoarser( SparseNodeData< PointData< Real > , 0 >& pointInfo , int highDepth , const BSplineData< FEMDegree >& bsData , const DenseNodeData< Real , FEMDegree >& upSampledCoefficients ); + // Evalutes the solution @(depth) at the points @(depth-1) and updates the met constraints @(depth-1) + template< int FEMDegree > + void _SetPointConstraintsFromFiner( const SparseNodeData< PointData< Real > , 0 >& pointInfo , int highDepth , const BSplineData< FEMDegree >& bsData , const DenseNodeData< Real , FEMDegree >& finerCoefficients , DenseNodeData< Real , FEMDegree >& metConstraints ) const; + template< int FEMDegree > + Real _CoarserFunctionValue( Point3D< Real > p , const PointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , const BSplineData< FEMDegree >& bsData , const DenseNodeData< Real , FEMDegree >& upSampledCoefficients ) const; + template< int FEMDegree > + Real _FinerFunctionValue ( Point3D< Real > p , const PointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , const BSplineData< FEMDegree >& bsData , const DenseNodeData< Real , FEMDegree >& coefficients ) const; + template< int FEMDegree > + int _GetSliceMatrixAndUpdateConstraints( const SparseNodeData< PointData< Real > , 0 >& pointInfo , SparseMatrix< Real >& matrix , DenseNodeData< Real , FEMDegree >& constraints , typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator& integrator , typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator , const BSplineData< FEMDegree >& bsData , int depth , int slice , const DenseNodeData< Real , FEMDegree >& metSolution , bool coarseToFine ); + template< int FEMDegree > + int _GetMatrixAndUpdateConstraints( const SparseNodeData< PointData< Real > , 0 >& pointInfo , SparseMatrix< Real >& matrix , DenseNodeData< Real , FEMDegree >& constraints , typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator& integrator , typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator , const BSplineData< FEMDegree >& bsData , int depth , const DenseNodeData< Real , FEMDegree >* metSolution , bool coarseToFine ); + + // Down samples constraints @(depth) to constraints @(depth-1) + template< class C , int FEMDegree > void _DownSample( int highDepth , DenseNodeData< C , FEMDegree >& constraints ) const; + // Up samples coefficients @(depth-1) to coefficients @(depth) + template< class C , int FEMDegree > void _UpSample( int highDepth , DenseNodeData< C , FEMDegree >& coefficients ) const; + template< class C , int FEMDegree > static void _UpSample( int highDepth , ConstPointer( C ) lowCoefficients , Pointer( C ) highCoefficients , bool dirichlet , int threads ); + + ///////////////////////////////////////////// + // Code for splatting point-sample data // + // MultiGridOctreeData.WeightedSamples.inl // + ///////////////////////////////////////////// + template< int WeightDegree > + void _AddWeightContribution( SparseNodeData< Real , WeightDegree >& densityWeights , TreeOctNode* node , Point3D< Real > position , PointSupportKey< WeightDegree >& weightKey , Real weight=Real(1.0) ); + template< int WeightDegree > + Real _GetSamplesPerNode( const SparseNodeData< Real , WeightDegree >& densityWeights , const TreeOctNode* node , Point3D< Real > position , ConstPointSupportKey< WeightDegree >& weightKey ) const; + template< int WeightDegree > + Real _GetSamplesPerNode( const SparseNodeData< Real , WeightDegree >& densityWeights , TreeOctNode* node , Point3D< Real > position , PointSupportKey< WeightDegree >& weightKey ); + template< int WeightDegree > + void _GetSampleDepthAndWeight( const SparseNodeData< Real , WeightDegree >& densityWeights , const TreeOctNode* node , Point3D< Real > position , ConstPointSupportKey< WeightDegree >& weightKey , Real& depth , Real& weight ) const; + template< int WeightDegree > + void _GetSampleDepthAndWeight( const SparseNodeData< Real , WeightDegree >& densityWeights , TreeOctNode* node , Point3D< Real > position , PointSupportKey< WeightDegree >& weightKey , Real& depth , Real& weight ); +public: + template< int WeightDegree > + void _GetSampleDepthAndWeight( const SparseNodeData< Real , WeightDegree >& densityWeights , Point3D< Real > position , PointSupportKey< WeightDegree >& weightKey , Real& depth , Real& weight ); + template< int WeightDegree > + void _GetSampleDepthAndWeight( const SparseNodeData< Real , WeightDegree >& densityWeights , Point3D< Real > position , ConstPointSupportKey< WeightDegree >& weightKey , Real& depth , Real& weight ); +protected: + template< int DataDegree , class V > void _SplatPointData( TreeOctNode* node , Point3D< Real > point , V v , SparseNodeData< V , DataDegree >& data , PointSupportKey< DataDegree >& dataKey ); + template< int WeightDegree , int DataDegree , class V > Real _SplatPointData( const SparseNodeData< Real , WeightDegree >& densityWeights , Point3D< Real > point , V v , SparseNodeData< V , DataDegree >& data , PointSupportKey< WeightDegree >& weightKey , PointSupportKey< DataDegree >& dataKey , int minDepth , int maxDepth , int dim=DIMENSION ); + template< int WeightDegree , int DataDegree , class V > void _MultiSplatPointData( const SparseNodeData< Real , WeightDegree >* densityWeights , Point3D< Real > point , V v , SparseNodeData< V , DataDegree >& data , PointSupportKey< WeightDegree >& weightKey , PointSupportKey< DataDegree >& dataKey , int maxDepth , int dim=DIMENSION ); + template< class V , int DataDegree > V _Evaluate( const DenseNodeData< V , DataDegree >& coefficients , Point3D< Real > p , const BSplineData< DataDegree >& bsData , const ConstPointSupportKey< DataDegree >& neighborKey ) const; + template< class V , int DataDegree > V _Evaluate( const SparseNodeData< V , DataDegree >& coefficients , Point3D< Real > p , const BSplineData< DataDegree >& bsData , const ConstPointSupportKey< DataDegree >& dataKey ) const; +public: + template< class V , int DataDegree > V Evaluate( const DenseNodeData< V , DataDegree >& coefficients , Point3D< Real > p , const BSplineData< DataDegree >& bsData ) const; + template< class V , int DataDegree > V Evaluate( const SparseNodeData< V , DataDegree >& coefficients , Point3D< Real > p , const BSplineData< DataDegree >& bsData ) const; + template< class V , int DataDegree > Pointer( V ) Evaluate( const DenseNodeData< V , DataDegree >& coefficients , int& res , Real isoValue=0.f , int depth=-1 , bool primal=false ); + + template< int NormalDegree > int _HasNormals( TreeOctNode* node , const SparseNodeData< Point3D< Real > , NormalDegree >& normalInfo ); + void _MakeComplete( void ); + void _SetValidityFlags( void ); + template< int NormalDegree > void _ClipTree( const SparseNodeData< Point3D< Real > , NormalDegree >& normalInfo ); + + //////////////////////////////////// + // Evaluation Methods // + // MultiGridOctreeData.Evaluation // + //////////////////////////////////// + static const int CHILDREN = Cube::CORNERS; + template< int FEMDegree > + struct _Evaluator + { + typename BSplineEvaluationData< FEMDegree >::Evaluator evaluator; + typename BSplineEvaluationData< FEMDegree >::ChildEvaluator childEvaluator; + Stencil< double , BSplineEvaluationData< FEMDegree >::SupportSize > cellStencil; + Stencil< double , BSplineEvaluationData< FEMDegree >::SupportSize > cellStencils [CHILDREN]; + Stencil< double , BSplineEvaluationData< FEMDegree >::SupportSize > edgeStencil [Cube::EDGES ]; + Stencil< double , BSplineEvaluationData< FEMDegree >::SupportSize > edgeStencils [CHILDREN][Cube::EDGES ]; + Stencil< double , BSplineEvaluationData< FEMDegree >::SupportSize > faceStencil [Cube::FACES ]; + Stencil< double , BSplineEvaluationData< FEMDegree >::SupportSize > faceStencils [CHILDREN][Cube::FACES ]; + Stencil< double , BSplineEvaluationData< FEMDegree >::SupportSize > cornerStencil [Cube::CORNERS]; + Stencil< double , BSplineEvaluationData< FEMDegree >::SupportSize > cornerStencils[CHILDREN][Cube::CORNERS]; + + Stencil< Point3D< double > , BSplineEvaluationData< FEMDegree >::SupportSize > dCellStencil; + Stencil< Point3D< double > , BSplineEvaluationData< FEMDegree >::SupportSize > dCellStencils [CHILDREN]; + Stencil< Point3D< double > , BSplineEvaluationData< FEMDegree >::SupportSize > dEdgeStencil [Cube::EDGES ]; + Stencil< Point3D< double > , BSplineEvaluationData< FEMDegree >::SupportSize > dEdgeStencils [CHILDREN][Cube::EDGES ]; + Stencil< Point3D< double > , BSplineEvaluationData< FEMDegree >::SupportSize > dFaceStencil [Cube::FACES ]; + Stencil< Point3D< double > , BSplineEvaluationData< FEMDegree >::SupportSize > dFaceStencils [CHILDREN][Cube::FACES ]; + Stencil< Point3D< double > , BSplineEvaluationData< FEMDegree >::SupportSize > dCornerStencil [Cube::CORNERS]; + Stencil< Point3D< double > , BSplineEvaluationData< FEMDegree >::SupportSize > dCornerStencils[CHILDREN][Cube::CORNERS]; + void set( int depth , bool dirichlet ); + }; + template< class V , int FEMDegree > + V _getCenterValue( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , const DenseNodeData< V , FEMDegree >& solution , const DenseNodeData< V , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const; + template< class V , int FEMDegree > + V _getCornerValue( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , int corner , const DenseNodeData< V , FEMDegree >& solution , const DenseNodeData< V , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const; + template< class V , int FEMDegree > + V _getEdgeValue ( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , int edge , const DenseNodeData< V , FEMDegree >& solution , const DenseNodeData< V , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const; + + template< int FEMDegree > + std::pair< Real , Point3D< Real > > _getCornerValueAndGradient( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , int corner , const DenseNodeData< Real , FEMDegree >& solution , const DenseNodeData< Real , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const; + template< int FEMDegree > + std::pair< Real , Point3D< Real > > _getEdgeValueAndGradient ( const ConstPointSupportKey< FEMDegree >& neighborKey , const TreeOctNode* node , int edge , const DenseNodeData< Real , FEMDegree >& solution , const DenseNodeData< Real , FEMDegree >& metSolution , const _Evaluator< FEMDegree >& evaluator , bool isInterior ) const; + + //////////////////////////////////////// + // Iso-Surfacing Methods // + // MultiGridOctreeData.IsoSurface.inl // + //////////////////////////////////////// + struct IsoEdge + { + long long edges[2]; + IsoEdge( void ){ edges[0] = edges[1] = 0; } + IsoEdge( long long v1 , long long v2 ){ edges[0] = v1 , edges[1] = v2; } + long long& operator[]( int idx ){ return edges[idx]; } + const long long& operator[]( int idx ) const { return edges[idx]; } + }; + struct FaceEdges + { + IsoEdge edges[2]; + int count; + }; + template< class Vertex > + struct SliceValues + { + typename SortedTreeNodes::SliceTableData sliceData; + Pointer( Real ) cornerValues ; Pointer( Point3D< Real > ) cornerGradients ; Pointer( char ) cornerSet; + Pointer( long long ) edgeKeys ; Pointer( char ) edgeSet; + Pointer( FaceEdges ) faceEdges ; Pointer( char ) faceSet; + Pointer( char ) mcIndices; + hash_map< long long , std::vector< IsoEdge > > faceEdgeMap; + hash_map< long long , std::pair< int , Vertex > > edgeVertexMap; + hash_map< long long , long long > vertexPairMap; + + SliceValues( void ); + ~SliceValues( void ); + void reset( bool nonLinearFit ); + protected: + int _oldCCount , _oldECount , _oldFCount , _oldNCount; + }; + template< class Vertex > + struct XSliceValues + { + typename SortedTreeNodes::XSliceTableData xSliceData; + Pointer( long long ) edgeKeys ; Pointer( char ) edgeSet; + Pointer( FaceEdges ) faceEdges ; Pointer( char ) faceSet; + hash_map< long long , std::vector< IsoEdge > > faceEdgeMap; + hash_map< long long , std::pair< int , Vertex > > edgeVertexMap; + hash_map< long long , long long > vertexPairMap; + + XSliceValues( void ); + ~XSliceValues( void ); + void reset( void ); + protected: + int _oldECount , _oldFCount; + }; + template< class Vertex > + struct SlabValues + { + XSliceValues< Vertex > _xSliceValues[2]; + SliceValues< Vertex > _sliceValues[2]; + SliceValues< Vertex >& sliceValues( int idx ){ return _sliceValues[idx&1]; } + const SliceValues< Vertex >& sliceValues( int idx ) const { return _sliceValues[idx&1]; } + XSliceValues< Vertex >& xSliceValues( int idx ){ return _xSliceValues[idx&1]; } + const XSliceValues< Vertex >& xSliceValues( int idx ) const { return _xSliceValues[idx&1]; } + }; + template< class Vertex , int FEMDegree > + void SetSliceIsoCorners( const DenseNodeData< Real , FEMDegree >& solution , const DenseNodeData< Real , FEMDegree >& coarseSolution , Real isoValue , int depth , int slice , std::vector< SlabValues< Vertex > >& sValues , const _Evaluator< FEMDegree >& evaluator , int threads ); + template< class Vertex , int FEMDegree > + void SetSliceIsoCorners( const DenseNodeData< Real , FEMDegree >& solution , const DenseNodeData< Real , FEMDegree >& coarseSolution , Real isoValue , int depth , int slice , int z , std::vector< SlabValues< Vertex > >& sValues , const _Evaluator< FEMDegree >& evaluator , int threads ); + template< int WeightDegree , int ColorDegree , class Vertex > + void SetSliceIsoVertices( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , int depth , int slice , int& vOffset , CoredMeshData< Vertex >& mesh , std::vector< SlabValues< Vertex > >& sValues , int threads ); + template< int WeightDegree , int ColorDegree , class Vertex > + void SetSliceIsoVertices( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , int depth , int slice , int z , int& vOffset , CoredMeshData< Vertex >& mesh , std::vector< SlabValues< Vertex > >& sValues , int threads ); + template< int WeightDegree , int ColorDegree , class Vertex > + void SetXSliceIsoVertices( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , int depth , int slab , int& vOffset , CoredMeshData< Vertex >& mesh , std::vector< SlabValues< Vertex > >& sValues , int threads ); + template< class Vertex > + void CopyFinerSliceIsoEdgeKeys( int depth , int slice , std::vector< SlabValues< Vertex > >& sValues , int threads ); + template< class Vertex > + void CopyFinerSliceIsoEdgeKeys( int depth , int slice , int z , std::vector< SlabValues< Vertex > >& sValues , int threads ); + template< class Vertex > + void CopyFinerXSliceIsoEdgeKeys( int depth , int slab , std::vector< SlabValues< Vertex > >& sValues , int threads ); + template< class Vertex > + void SetSliceIsoEdges( int depth , int slice , std::vector< SlabValues< Vertex > >& slabValues , int threads ); + template< class Vertex > + void SetSliceIsoEdges( int depth , int slice , int z , std::vector< SlabValues< Vertex > >& slabValues , int threads ); + template< class Vertex > + void SetXSliceIsoEdges( int depth , int slice , std::vector< SlabValues< Vertex > >& slabValues , int threads ); + + template< class Vertex > + void SetIsoSurface( int depth , int offset , const SliceValues< Vertex >& bValues , const SliceValues< Vertex >& fValues , const XSliceValues< Vertex >& xValues , CoredMeshData< Vertex >& mesh , bool polygonMesh , bool addBarycenter , int& vOffset , int threads ); + + template< class Vertex > + static int AddIsoPolygons( CoredMeshData< Vertex >& mesh , std::vector< std::pair< int , Vertex > >& polygon , bool polygonMesh , bool addBarycenter , int& vOffset ); + + template< int WeightDegree , int ColorDegree , class Vertex > + bool GetIsoVertex( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , ConstPointSupportKey< WeightDegree >& weightKey , ConstPointSupportKey< ColorDegree >& colorKey , const TreeOctNode* node , int edgeIndex , int z , const SliceValues< Vertex >& sValues , Vertex& vertex ); + template< int WeightDegree , int ColorDegree , class Vertex > + bool GetIsoVertex( const BSplineData< ColorDegree >* colorBSData , const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , Real isoValue , ConstPointSupportKey< WeightDegree >& weightKey , ConstPointSupportKey< ColorDegree >& colorKey , const TreeOctNode* node , int cornerIndex , const SliceValues< Vertex >& bValues , const SliceValues< Vertex >& fValues , Vertex& vertex ); + +public: + static double maxMemoryUsage; + int threads; + + static double MemoryUsage( void ); + Octree( void ); + + // After calling set tree, the indices of the octree node will be stored by depth, and within depth they will be sorted by slice + template< class PointReal , int NormalDegree , int WeightDegree , int DataDegree , class Data , class _Data > + int SetTree( OrientedPointStream< PointReal >* pointStream , int minDepth , int maxDepth , int fullDepth , int splatDepth , Real samplesPerNode , + Real scaleFactor , bool useConfidence , bool useNormalWeight , + Real constraintWeight , int adaptiveExponent , + SparseNodeData< Real , WeightDegree >& densityWeights , SparseNodeData< PointData< Real > , 0 >& pointInfo , SparseNodeData< Point3D< Real > , NormalDegree >& normalInfo , SparseNodeData< Real , NormalDegree >& nodeWeights , + SparseNodeData< ProjectiveData< _Data > , DataDegree >* dataValues , + XForm4x4< Real >& xForm , bool dirichlet=false , bool makeComplete=false ); + + template< int FEMDegree > void EnableMultigrid( std::vector< int >* map ); + + template< int FEMDegree , int NormalDegree > + DenseNodeData< Real , FEMDegree > SetLaplacianConstraints( const SparseNodeData< Point3D< Real > , NormalDegree >& normalInfo ); + template< int FEMDegree > + DenseNodeData< Real , FEMDegree > SolveSystem( SparseNodeData< PointData< Real > , 0 >& pointInfo , DenseNodeData< Real , FEMDegree >& constraints , bool showResidual , int iters , int maxSolveDepth , int cgDepth=0 , double cgAccuracy=0 ); + + template< int FEMDegree , int NormalDegree > + Real GetIsoValue( const DenseNodeData< Real , FEMDegree >& solution , const SparseNodeData< Real , NormalDegree >& nodeWeights ); + template< int FEMDegree , int WeightDegree , int ColorDegree , class Vertex > + void GetMCIsoSurface( const SparseNodeData< Real , WeightDegree >* densityWeights , const SparseNodeData< ProjectiveData< Point3D< Real > > , ColorDegree >* colorData , const DenseNodeData< Real , FEMDegree >& solution , Real isoValue , CoredMeshData< Vertex >& mesh , bool nonLinearFit=true , bool addBarycenter=false , bool polygonMesh=false ); + + const TreeOctNode& tree( void ) const{ return _tree; } + size_t leaves( void ) const { return _tree.leaves(); } + size_t nodes( void ) const { return _tree.nodes(); } +}; + +template< class Real > +void Reset( void ) +{ + TreeNodeData::NodeCount=0; + Octree< Real >::maxMemoryUsage = 0; +} + +#include "MultiGridOctreeData.inl" +#include "MultiGridOctreeData.SortedTreeNodes.inl" +#include "MultiGridOctreeData.WeightedSamples.inl" +#include "MultiGridOctreeData.System.inl" +#include "MultiGridOctreeData.IsoSurface.inl" +#include "MultiGridOctreeData.Evaluation.inl" +#endif // MULTI_GRID_OCTREE_DATA_INCLUDED diff --git a/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.inl b/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.inl old mode 100755 new mode 100644 index a2d4a216..6141228a --- a/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.inl +++ b/src/lib/geogram/third_party/PoissonRecon/MultiGridOctreeData.inl @@ -1,558 +1,558 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - -#include "PointStream.h" - -#define ITERATION_POWER 1.0/3 -#define MEMORY_ALLOCATOR_BLOCK_SIZE 1<<12 - - -const double MATRIX_ENTRY_EPSILON = 0; -const double EPSILON = 1e-6; -const double ROUND_EPS = 1e-5; - - - -////////////////// -// TreeNodeData // -////////////////// -size_t TreeNodeData::NodeCount = 0; -TreeNodeData::TreeNodeData( void ){ nodeIndex = (int)NodeCount ; NodeCount++; } -TreeNodeData::~TreeNodeData( void ) { } - - -//////////// -// Octree // -//////////// -template< class Real > double Octree< Real >::maxMemoryUsage=0; - -template< class Real > -double Octree< Real >::MemoryUsage( void ) -{ - double mem = double( MemoryInfo::Usage() ) / (1<<20); - if( mem>maxMemoryUsage ) maxMemoryUsage=mem; - return mem; -} - -template< class Real > -Octree< Real >::Octree( void ) -{ - threads = 1; - _constrainValues = false; - _multigridDegree = 0; -} -template< class Real > -template< int FEMDegree > -void Octree< Real >::FunctionIndex( const TreeOctNode* node , int idx[3] ) -{ - int d; - node->depthAndOffset( d , idx ); - for( int dd=0 ; dd::FunctionIndex( d-1 , idx[dd] ); -} - -template< class Real > bool Octree< Real >::_InBounds( Point3D< Real > p ) const { return p[0]>=Real(0.) && p[0]<=Real(1.0) && p[1]>=Real(0.) && p[1]<=Real(1.0) && p[2]>=Real(0.) && p[2]<=Real(1.0); } -template< class Real > -template< int FEMDegree > -bool Octree< Real >::IsValidNode( const TreeOctNode* node , bool dirichlet ) -{ - if( !node || node->depth()<1 ) return false; - int d , off[3]; - node->depthAndOffset( d , off ); - int dim = BSplineData< FEMDegree >::Dimension( d-1 ); - if( FEMDegree&1 && dirichlet ) return !( off[0]<=0 || off[1]<=0 || off[2]<=0 || off[0]>=dim-1 || off[1]>=dim-1 || off[2]>=dim-1 ); - else return !( off[0]< 0 || off[1]< 0 || off[2]< 0 || off[0]> dim-1 || off[1]> dim-1 || off[2]> dim-1 ); -} -template< class Real > -void Octree< Real >::_SetFullDepth( TreeOctNode* node , int depth ) -{ - if( node->depth()==0 || _Depth( node )children ) node->initChildren(); - for( int c=0 ; cchildren+c , depth ); - } -} -template< class Real > -void Octree< Real >::_setFullDepth( int depth ) -{ - if( !_tree.children ) _tree.initChildren(); - for( int c=0 ; c -template< class PointReal , int NormalDegree , int WeightDegree , int DataDegree , class Data , class _Data > -int Octree< Real >::SetTree( OrientedPointStream< PointReal >* pointStream , int minDepth , int maxDepth , int fullDepth , - int splatDepth , Real samplesPerNode , Real scaleFactor , - bool useConfidence , bool useNormalWeights , Real constraintWeight , int adaptiveExponent , - SparseNodeData< Real , WeightDegree >& densityWeights , SparseNodeData< PointData< Real > , 0 >& pointInfo , SparseNodeData< Point3D< Real > , NormalDegree >& normalInfo , SparseNodeData< Real , NormalDegree >& nodeWeights , - SparseNodeData< ProjectiveData< _Data > , DataDegree >* dataValues , - XForm4x4< Real >& xForm , bool dirichlet , bool makeComplete ) -{ - OrientedPointStreamWithData< PointReal , Data >* pointStreamWithData = ( OrientedPointStreamWithData< PointReal , Data >* )pointStream; - _tree.initChildren() , _spaceRoot = _tree.children; - splatDepth = std::max< int >( 0 , std::min< int >( splatDepth , maxDepth ) ); - - _dirichlet = dirichlet; - _constrainValues = (constraintWeight>0); - - XForm3x3< Real > xFormN; - for( int i=0 ; i<3 ; i++ ) for( int j=0 ; j<3 ; j++ ) xFormN(i,j) = xForm(i,j); - xFormN = xFormN.transpose().inverse(); - minDepth = std::max< int >( 0 , std::min< int >( minDepth , maxDepth ) ); // 0<=minDepth <= maxDepth - fullDepth = std::max< int >( minDepth , std::min< int >( fullDepth , maxDepth ) ); // minDepth <= fullDepth <= maxDepth - -#if 0 - // For Neumann constraints, the function at depth 0 is constant so the system matrix is zero if there is no screening. - if( !_dirichlet && !_constrainValues ) minDepth = std::max< int >( minDepth , 1 ); -#endif - minDepth++ , maxDepth++; - - _minDepth = minDepth; - _fullDepth = fullDepth; - _splatDepth = splatDepth; - double pointWeightSum = 0; - int i , cnt=0; - - PointSupportKey< WeightDegree > weightKey; - PointSupportKey< DataDegree > dataKey; - PointSupportKey< NormalDegree > normalKey; - weightKey.set( maxDepth ) , dataKey.set( maxDepth ) , normalKey.set( maxDepth ); - - _setFullDepth( _fullDepth ); - - // Read through once to get the center and scale - { - Point3D< Real > min , max; - double t = Time(); - Point3D< Real > p; - OrientedPoint3D< PointReal > _p; - while( pointStream->nextPoint( _p ) ) - { - p = xForm * Point3D< Real >(_p.p); - for( i=0 ; imax[i] ) max[i] = p[i]; - } - cnt++; - } - - _scale = std::max< Real >( max[0]-min[0] , std::max< Real >( max[1]-min[1] , max[2]-min[2] ) ); - _center = ( max+min ) /2; - } - - _scale *= scaleFactor; - for( i=0 ; i trans = XForm4x4< Real >::Identity() , scale = XForm4x4< Real >::Identity(); - for( int i=0 ; i<3 ; i++ ) scale(i,i) = (Real)(1./_scale ) , trans(3,i) = -_center[i]; - xForm = scale * trans * xForm; - } - - { - double t = Time(); - cnt = 0; - pointStream->reset(); - Point3D< Real > p , n; - OrientedPoint3D< PointReal > _p; - while( pointStream->nextPoint( _p ) ) - { - p = xForm * Point3D< Real >(_p.p) , n = xFormN * Point3D< Real >(_p.n); - if( !_InBounds(p) ) continue; - Point3D< Real > myCenter = Point3D< Real >( Real(0.5) , Real(0.5) , Real(0.5) ); - Real myWidth = Real(1.0); - Real weight=Real( 1. ); - if( useConfidence ) weight = Real( Length(n) ); - if( samplesPerNode>0 ) weight /= (Real)samplesPerNode; - TreeOctNode* temp = _spaceRoot; - int d=0; - while( dchildren ) temp->initChildren(); - int cIndex=TreeOctNode::CornerIndex( myCenter , p ); - temp = temp->children + cIndex; - myWidth/=2; - if( cIndex&1 ) myCenter[0] += myWidth/2; - else myCenter[0] -= myWidth/2; - if( cIndex&2 ) myCenter[1] += myWidth/2; - else myCenter[1] -= myWidth/2; - if( cIndex&4 ) myCenter[2] += myWidth/2; - else myCenter[2] -= myWidth/2; - d++; - } - _AddWeightContribution( densityWeights , temp , p , weightKey , weight ); - cnt++; - } - } - - std::vector< PointData< Real > >& points = pointInfo.data; - - cnt = 0; - pointStream->reset(); - Point3D< Real > p , n; - OrientedPoint3D< PointReal > _p; - Data _d; - while( ( dataValues ? pointStreamWithData->nextPoint( _p , _d ) : pointStream->nextPoint( _p ) ) ) - { - p = xForm * Point3D< Real >(_p.p) , n = xFormN * Point3D< Real >(_p.n); - n *= Real(-1.); - if( !_InBounds(p) ) continue; - Real normalLength = Real( Length( n ) ); - // [Bruno Levy] using Geogram's is_nan function (to overcome portability problems) - if( GEO::Numeric::is_nan( normalLength ) || normalLength<=EPSILON ) continue; - if( !useConfidence ) n /= normalLength; - - Real pointWeight = Real(1.f); - if( samplesPerNode>0 ) - { - if( dataValues ) _MultiSplatPointData( &densityWeights , p , ProjectiveData< _Data >( _Data( _d ) , (Real)1. ) , *dataValues , weightKey , dataKey , maxDepth-1 , 2 ); - pointWeight = _SplatPointData( densityWeights , p , n , normalInfo , weightKey , normalKey , _minDepth-1 , maxDepth-1 , 3 ); - } - else - { - if( dataValues ) _MultiSplatPointData( ( SparseNodeData< Real , WeightDegree >* )NULL , p , ProjectiveData< _Data >( _Data( _d ) , (Real)1. ) , *dataValues , weightKey , dataKey , maxDepth-1 , 2 ); - - Point3D< Real > myCenter = Point3D< Real >( Real(0.5) , Real(0.5) , Real(0.5) ); - Real myWidth = Real(1.0); - TreeOctNode* temp = _spaceRoot; - int d=0; - if( splatDepth ) - { - while( dchildren[cIndex]; - myWidth /= 2; - if(cIndex&1) myCenter[0] += myWidth/2; - else myCenter[0] -= myWidth/2; - if(cIndex&2) myCenter[1] += myWidth/2; - else myCenter[1] -= myWidth/2; - if(cIndex&4) myCenter[2] += myWidth/2; - else myCenter[2] -= myWidth/2; - d++; - } - pointWeight = (Real)1.0/_GetSamplesPerNode( densityWeights , temp , p , weightKey ); - } - for( i=0 ; ichildren ) temp->initChildren(); - int cIndex=TreeOctNode::CornerIndex( myCenter , p ); - temp=&temp->children[cIndex]; - myWidth/=2; - if(cIndex&1) myCenter[0] += myWidth/2; - else myCenter[0] -= myWidth/2; - if(cIndex&2) myCenter[1] += myWidth/2; - else myCenter[1] -= myWidth/2; - if(cIndex&4) myCenter[2] += myWidth/2; - else myCenter[2] -= myWidth/2; - d++; - } - _SplatPointData( temp , p , n , normalInfo , normalKey ); - } - pointWeightSum += pointWeight; - if( _constrainValues ) - { - Real pointScreeningWeight = useNormalWeights ? Real( normalLength ) : Real(1.f); - TreeOctNode* temp = _spaceRoot; - Point3D< Real > myCenter = Point3D< Real >( Real(0.5) , Real(0.5) , Real(0.5) ); - Real myWidth = Real(1.0); - while( 1 ) - { - if( (int)pointInfo.indices.size()( p*pointScreeningWeight , pointScreeningWeight ) ); - pointInfo.indices[ temp->nodeData.nodeIndex ] = idx; - } - else - { - points[idx].position += p*pointScreeningWeight; - points[idx].weight += pointScreeningWeight; - } - - int cIndex = TreeOctNode::CornerIndex( myCenter , p ); - if( !temp->children ) break; - temp = &temp->children[cIndex]; - myWidth /= 2; - if( cIndex&1 ) myCenter[0] += myWidth/2; - else myCenter[0] -= myWidth/2; - if( cIndex&2 ) myCenter[1] += myWidth/2; - else myCenter[1] -= myWidth/2; - if( cIndex&4 ) myCenter[2] += myWidth/2; - else myCenter[2] -= myWidth/2; - } - } - cnt++; - } - - constraintWeight *= Real( pointWeightSum ); - constraintWeight /= cnt; - - MemoryUsage( ); - if( _constrainValues ) - // Set the average position and scale the weights - for( TreeOctNode* node=_tree.nextNode() ; node ; node=_tree.nextNode(node) ) - if( pointInfo.index( node )!=-1 ) - { - int idx = pointInfo.index( node ); - points[idx].position /= points[idx].weight; - int e = _Depth( node ) * adaptiveExponent - ( maxDepth - 1 ) * (adaptiveExponent-1); - if( e<0 ) points[idx].weight /= Real( 1<<(-e) ); - else points[idx].weight *= Real( 1<< e ); - points[idx].weight *= Real( constraintWeight ); - } -#if FORCE_NEUMANN_FIELD -// #pragma message( "[WARNING] This is likely wrong as it only forces the normal component of the coefficient to be zero, not the actual vector-field" ) - if( !_dirichlet ) - for( TreeOctNode* node=_tree.nextNode() ; node ; node=_tree.nextNode( node ) ) - { - int d , off[3] , res; - node->depthAndOffset( d , off ); - res = 1<& normal = normalInfo.data[ idx ]; - for( int d=0 ; d<3 ; d++ ) if( off[d]==0 || off[d]==res-1 ) normal[d] = 0; - } -#endif // FORCE_NEUMANN_FIELD - nodeWeights.resize( TreeNodeData::NodeCount ); - // Set the point weights for evaluating the iso-value - for( TreeOctNode* node=_tree.nextNode() ; node ; node=_tree.nextNode(node) ) - { - int nIdx = normalInfo.index( node ); - if( nIdx>=0 ) - { - Real l = Real( Length( normalInfo.data[ nIdx ] ) ); - if( l ) - { - int nIdx = nodeWeights.index( node ); - if( nIdx<0 ) - { - nodeWeights.indices[ node->nodeData.nodeIndex ] = (int)nodeWeights.data.size(); - nodeWeights.data.push_back( l ); - } - else nodeWeights.data[ nIdx ] = l; - } - } - } - MemoryUsage(); - if( makeComplete ) _MakeComplete( ); - else _ClipTree< NormalDegree >( normalInfo ); - _maxDepth = _tree.maxDepth(); - return cnt; -} - -template< class Real > -void Octree< Real >::_SetValidityFlags( void ) -{ - for( int i=0 ; i<_sNodes.end( _sNodes.levels()-1 ) ; i++ ) - { - _sNodes.treeNodes[i]->nodeData.flags = 0; - if( IsValidNode< 0 >( _sNodes.treeNodes[i] , _dirichlet ) ) _sNodes.treeNodes[i]->nodeData.flags |= (1<<0); - if( IsValidNode< 1 >( _sNodes.treeNodes[i] , _dirichlet ) ) _sNodes.treeNodes[i]->nodeData.flags |= (1<<1); - } -} -template< class Real > void Octree< Real >::_MakeComplete( void ){ _tree.setFullDepth( _spaceRoot->maxDepth() ) ; MemoryUsage(); } -// Trim off the branches of the tree (finer than _fullDepth) that don't contain normal points -template< class Real > -template< int NormalDegree > -void Octree< Real >::_ClipTree( const SparseNodeData< Point3D< Real > , NormalDegree >& normalInfo ) -{ -#if NEW_NEW_CODE -#define ABS_INDEX( idx ) ( (idx<0) ? -(idx) : (idx) ) - static const int SupportSize = BSplineEvaluationData< NormalDegree >::SupportSize; - static const int LeftSupportRadius = -BSplineEvaluationData< NormalDegree >::SupportStart; - static const int RightSupportRadius = BSplineEvaluationData< NormalDegree >::SupportEnd; - int maxDepth = _tree.maxDepth(); - typename TreeOctNode::NeighborKey< LeftSupportRadius , RightSupportRadius > neighborKey; - neighborKey.set( maxDepth ); - - // Set all nodes to invalid (negative indices) - for( TreeOctNode* node=_tree.nextNode() ; node ; node=_tree.nextNode(node) ) node->nodeData.nodeIndex = -node->nodeData.nodeIndex; - - // Iterate over the nodes and, if they contain a normal, make sure that the supported nodes exist and are set to valid - for( TreeOctNode* node=_tree.nextNode() ; node ; node=_tree.nextNode(node) ) if( normalInfo.index( ABS_INDEX( node->nodeData.nodeIndex ) )>=0 ) - { - int depth = node->depth(); - neighborKey.getNeighbors< true >( node ); - for( int d=0 ; d<=depth ; d++ ) - { - TreeOctNode::template Neighbors< SupportSize >& neighbors = neighborKey.neighbors[d]; - for( int i=0 ; inodeData.nodeIndex = ABS_INDEX( neighbors.neighbors[i][j][k]->nodeData.nodeIndex ); - } - } - - // Remove the invalid nodes - for( TreeOctNode* node=_tree.nextNode() ; node ; node=_tree.nextNode( node ) ) - { - if( node->children && _Depth(node)>=_fullDepth ) - { - bool hasValidChildren = false; - for( int c=0 ; cchildren[c].nodeData.nodeIndex>0 ); - if( !hasValidChildren ) node->children = NULL; - } - node->nodeData.nodeIndex = ABS_INDEX( node->nodeData.nodeIndex ); - } - - MemoryUsage(); -#undef ABS_INDEX -#else // !NEW_NEW_CODE - int maxDepth = _tree.maxDepth(); - for( TreeOctNode* temp=_tree.nextNode() ; temp ; temp=_tree.nextNode(temp) ) - if( temp->children && _Depth( temp )>=_fullDepth ) - { - int hasNormals=0; - for( int i=0 ; ichildren[i] , normalInfo ); - if( !hasNormals ) temp->children=NULL; - } - MemoryUsage(); -#endif // NEW_NEW_CODE -} - -template< class Real > -template< int FEMDegree > -void Octree< Real >::EnableMultigrid( std::vector< int >* map ) -{ - if( FEMDegree<=_multigridDegree ) return; - _multigridDegree = FEMDegree; - const int OverlapRadius = -BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; - int maxDepth = _tree.maxDepth( ); - typename TreeOctNode::NeighborKey< OverlapRadius , OverlapRadius > neighborKey; - neighborKey.set( maxDepth-1 ); - for( int d=maxDepth-1 ; d>=0 ; d-- ) - for( TreeOctNode* node=_tree.nextNode() ; node ; node=_tree.nextNode( node ) ) if( node->depth()==d && node->children ) - neighborKey.template getNeighbors< true >( node ); - _sNodes.set( _tree , map ); - _SetValidityFlags(); -} - -template< class Real > -template< int NormalDegree > -int Octree< Real >::_HasNormals( TreeOctNode* node , const SparseNodeData< Point3D< Real > , NormalDegree >& normalInfo ) -{ - int idx = normalInfo.index( node ); - if( idx>=0 ) - { - const Point3D< Real >& normal = normalInfo.data[ idx ]; - if( normal[0]!=0 || normal[1]!=0 || normal[2]!=0 ) return 1; - } - if( node->children ) for( int i=0 ; ichildren[i] , normalInfo ) ) return 1; - return 0; -} - -//////////////// -// VertexData // -//////////////// -long long VertexData::CenterIndex(const TreeOctNode* node,int maxDepth) -{ - int idx[DIMENSION]; - return CenterIndex(node,maxDepth,idx); -} -long long VertexData::CenterIndex(const TreeOctNode* node,int maxDepth,int idx[DIMENSION]) -{ - int d,o[3]; - node->depthAndOffset(d,o); - for(int i=0;idepthAndOffset( d , o ); - for( int i=0 ; idepthAndOffset(d,o); - for(int i=0;idepthAndOffset( d ,off ); - Cube::FactorEdgeIndex( eIndex , o , i1 , i2 ); - for( int i=0 ; i double Octree< Real >::maxMemoryUsage=0; + +template< class Real > +double Octree< Real >::MemoryUsage( void ) +{ + double mem = double( MemoryInfo::Usage() ) / (1<<20); + if( mem>maxMemoryUsage ) maxMemoryUsage=mem; + return mem; +} + +template< class Real > +Octree< Real >::Octree( void ) +{ + threads = 1; + _constrainValues = false; + _multigridDegree = 0; +} +template< class Real > +template< int FEMDegree > +void Octree< Real >::FunctionIndex( const TreeOctNode* node , int idx[3] ) +{ + int d; + node->depthAndOffset( d , idx ); + for( int dd=0 ; dd::FunctionIndex( d-1 , idx[dd] ); +} + +template< class Real > bool Octree< Real >::_InBounds( Point3D< Real > p ) const { return p[0]>=Real(0.) && p[0]<=Real(1.0) && p[1]>=Real(0.) && p[1]<=Real(1.0) && p[2]>=Real(0.) && p[2]<=Real(1.0); } +template< class Real > +template< int FEMDegree > +bool Octree< Real >::IsValidNode( const TreeOctNode* node , bool dirichlet ) +{ + if( !node || node->depth()<1 ) return false; + int d , off[3]; + node->depthAndOffset( d , off ); + int dim = BSplineData< FEMDegree >::Dimension( d-1 ); + if( FEMDegree&1 && dirichlet ) return !( off[0]<=0 || off[1]<=0 || off[2]<=0 || off[0]>=dim-1 || off[1]>=dim-1 || off[2]>=dim-1 ); + else return !( off[0]< 0 || off[1]< 0 || off[2]< 0 || off[0]> dim-1 || off[1]> dim-1 || off[2]> dim-1 ); +} +template< class Real > +void Octree< Real >::_SetFullDepth( TreeOctNode* node , int depth ) +{ + if( node->depth()==0 || _Depth( node )children ) node->initChildren(); + for( int c=0 ; cchildren+c , depth ); + } +} +template< class Real > +void Octree< Real >::_setFullDepth( int depth ) +{ + if( !_tree.children ) _tree.initChildren(); + for( int c=0 ; c +template< class PointReal , int NormalDegree , int WeightDegree , int DataDegree , class Data , class _Data > +int Octree< Real >::SetTree( OrientedPointStream< PointReal >* pointStream , int minDepth , int maxDepth , int fullDepth , + int splatDepth , Real samplesPerNode , Real scaleFactor , + bool useConfidence , bool useNormalWeights , Real constraintWeight , int adaptiveExponent , + SparseNodeData< Real , WeightDegree >& densityWeights , SparseNodeData< PointData< Real > , 0 >& pointInfo , SparseNodeData< Point3D< Real > , NormalDegree >& normalInfo , SparseNodeData< Real , NormalDegree >& nodeWeights , + SparseNodeData< ProjectiveData< _Data > , DataDegree >* dataValues , + XForm4x4< Real >& xForm , bool dirichlet , bool makeComplete ) +{ + OrientedPointStreamWithData< PointReal , Data >* pointStreamWithData = ( OrientedPointStreamWithData< PointReal , Data >* )pointStream; + _tree.initChildren() , _spaceRoot = _tree.children; + splatDepth = std::max< int >( 0 , std::min< int >( splatDepth , maxDepth ) ); + + _dirichlet = dirichlet; + _constrainValues = (constraintWeight>0); + + XForm3x3< Real > xFormN; + for( int i=0 ; i<3 ; i++ ) for( int j=0 ; j<3 ; j++ ) xFormN(i,j) = xForm(i,j); + xFormN = xFormN.transpose().inverse(); + minDepth = std::max< int >( 0 , std::min< int >( minDepth , maxDepth ) ); // 0<=minDepth <= maxDepth + fullDepth = std::max< int >( minDepth , std::min< int >( fullDepth , maxDepth ) ); // minDepth <= fullDepth <= maxDepth + +#if 0 + // For Neumann constraints, the function at depth 0 is constant so the system matrix is zero if there is no screening. + if( !_dirichlet && !_constrainValues ) minDepth = std::max< int >( minDepth , 1 ); +#endif + minDepth++ , maxDepth++; + + _minDepth = minDepth; + _fullDepth = fullDepth; + _splatDepth = splatDepth; + double pointWeightSum = 0; + int i , cnt=0; + + PointSupportKey< WeightDegree > weightKey; + PointSupportKey< DataDegree > dataKey; + PointSupportKey< NormalDegree > normalKey; + weightKey.set( maxDepth ) , dataKey.set( maxDepth ) , normalKey.set( maxDepth ); + + _setFullDepth( _fullDepth ); + + // Read through once to get the center and scale + { + Point3D< Real > min , max; + double t = Time(); + Point3D< Real > p; + OrientedPoint3D< PointReal > _p; + while( pointStream->nextPoint( _p ) ) + { + p = xForm * Point3D< Real >(_p.p); + for( i=0 ; imax[i] ) max[i] = p[i]; + } + cnt++; + } + + _scale = std::max< Real >( max[0]-min[0] , std::max< Real >( max[1]-min[1] , max[2]-min[2] ) ); + _center = ( max+min ) /2; + } + + _scale *= scaleFactor; + for( i=0 ; i trans = XForm4x4< Real >::Identity() , scale = XForm4x4< Real >::Identity(); + for( int i=0 ; i<3 ; i++ ) scale(i,i) = (Real)(1./_scale ) , trans(3,i) = -_center[i]; + xForm = scale * trans * xForm; + } + + { + double t = Time(); + cnt = 0; + pointStream->reset(); + Point3D< Real > p , n; + OrientedPoint3D< PointReal > _p; + while( pointStream->nextPoint( _p ) ) + { + p = xForm * Point3D< Real >(_p.p) , n = xFormN * Point3D< Real >(_p.n); + if( !_InBounds(p) ) continue; + Point3D< Real > myCenter = Point3D< Real >( Real(0.5) , Real(0.5) , Real(0.5) ); + Real myWidth = Real(1.0); + Real weight=Real( 1. ); + if( useConfidence ) weight = Real( Length(n) ); + if( samplesPerNode>0 ) weight /= (Real)samplesPerNode; + TreeOctNode* temp = _spaceRoot; + int d=0; + while( dchildren ) temp->initChildren(); + int cIndex=TreeOctNode::CornerIndex( myCenter , p ); + temp = temp->children + cIndex; + myWidth/=2; + if( cIndex&1 ) myCenter[0] += myWidth/2; + else myCenter[0] -= myWidth/2; + if( cIndex&2 ) myCenter[1] += myWidth/2; + else myCenter[1] -= myWidth/2; + if( cIndex&4 ) myCenter[2] += myWidth/2; + else myCenter[2] -= myWidth/2; + d++; + } + _AddWeightContribution( densityWeights , temp , p , weightKey , weight ); + cnt++; + } + } + + std::vector< PointData< Real > >& points = pointInfo.data; + + cnt = 0; + pointStream->reset(); + Point3D< Real > p , n; + OrientedPoint3D< PointReal > _p; + Data _d; + while( ( dataValues ? pointStreamWithData->nextPoint( _p , _d ) : pointStream->nextPoint( _p ) ) ) + { + p = xForm * Point3D< Real >(_p.p) , n = xFormN * Point3D< Real >(_p.n); + n *= Real(-1.); + if( !_InBounds(p) ) continue; + Real normalLength = Real( Length( n ) ); + // [Bruno Levy] using Geogram's is_nan function (to overcome portability problems) + if( GEO::Numeric::is_nan( normalLength ) || normalLength<=EPSILON ) continue; + if( !useConfidence ) n /= normalLength; + + Real pointWeight = Real(1.f); + if( samplesPerNode>0 ) + { + if( dataValues ) _MultiSplatPointData( &densityWeights , p , ProjectiveData< _Data >( _Data( _d ) , (Real)1. ) , *dataValues , weightKey , dataKey , maxDepth-1 , 2 ); + pointWeight = _SplatPointData( densityWeights , p , n , normalInfo , weightKey , normalKey , _minDepth-1 , maxDepth-1 , 3 ); + } + else + { + if( dataValues ) _MultiSplatPointData( ( SparseNodeData< Real , WeightDegree >* )NULL , p , ProjectiveData< _Data >( _Data( _d ) , (Real)1. ) , *dataValues , weightKey , dataKey , maxDepth-1 , 2 ); + + Point3D< Real > myCenter = Point3D< Real >( Real(0.5) , Real(0.5) , Real(0.5) ); + Real myWidth = Real(1.0); + TreeOctNode* temp = _spaceRoot; + int d=0; + if( splatDepth ) + { + while( dchildren[cIndex]; + myWidth /= 2; + if(cIndex&1) myCenter[0] += myWidth/2; + else myCenter[0] -= myWidth/2; + if(cIndex&2) myCenter[1] += myWidth/2; + else myCenter[1] -= myWidth/2; + if(cIndex&4) myCenter[2] += myWidth/2; + else myCenter[2] -= myWidth/2; + d++; + } + pointWeight = (Real)1.0/_GetSamplesPerNode( densityWeights , temp , p , weightKey ); + } + for( i=0 ; ichildren ) temp->initChildren(); + int cIndex=TreeOctNode::CornerIndex( myCenter , p ); + temp=&temp->children[cIndex]; + myWidth/=2; + if(cIndex&1) myCenter[0] += myWidth/2; + else myCenter[0] -= myWidth/2; + if(cIndex&2) myCenter[1] += myWidth/2; + else myCenter[1] -= myWidth/2; + if(cIndex&4) myCenter[2] += myWidth/2; + else myCenter[2] -= myWidth/2; + d++; + } + _SplatPointData( temp , p , n , normalInfo , normalKey ); + } + pointWeightSum += pointWeight; + if( _constrainValues ) + { + Real pointScreeningWeight = useNormalWeights ? Real( normalLength ) : Real(1.f); + TreeOctNode* temp = _spaceRoot; + Point3D< Real > myCenter = Point3D< Real >( Real(0.5) , Real(0.5) , Real(0.5) ); + Real myWidth = Real(1.0); + while( 1 ) + { + if( (int)pointInfo.indices.size()( p*pointScreeningWeight , pointScreeningWeight ) ); + pointInfo.indices[ temp->nodeData.nodeIndex ] = idx; + } + else + { + points[idx].position += p*pointScreeningWeight; + points[idx].weight += pointScreeningWeight; + } + + int cIndex = TreeOctNode::CornerIndex( myCenter , p ); + if( !temp->children ) break; + temp = &temp->children[cIndex]; + myWidth /= 2; + if( cIndex&1 ) myCenter[0] += myWidth/2; + else myCenter[0] -= myWidth/2; + if( cIndex&2 ) myCenter[1] += myWidth/2; + else myCenter[1] -= myWidth/2; + if( cIndex&4 ) myCenter[2] += myWidth/2; + else myCenter[2] -= myWidth/2; + } + } + cnt++; + } + + constraintWeight *= Real( pointWeightSum ); + constraintWeight /= cnt; + + MemoryUsage( ); + if( _constrainValues ) + // Set the average position and scale the weights + for( TreeOctNode* node=_tree.nextNode() ; node ; node=_tree.nextNode(node) ) + if( pointInfo.index( node )!=-1 ) + { + int idx = pointInfo.index( node ); + points[idx].position /= points[idx].weight; + int e = _Depth( node ) * adaptiveExponent - ( maxDepth - 1 ) * (adaptiveExponent-1); + if( e<0 ) points[idx].weight /= Real( 1<<(-e) ); + else points[idx].weight *= Real( 1<< e ); + points[idx].weight *= Real( constraintWeight ); + } +#if FORCE_NEUMANN_FIELD +// #pragma message( "[WARNING] This is likely wrong as it only forces the normal component of the coefficient to be zero, not the actual vector-field" ) + if( !_dirichlet ) + for( TreeOctNode* node=_tree.nextNode() ; node ; node=_tree.nextNode( node ) ) + { + int d , off[3] , res; + node->depthAndOffset( d , off ); + res = 1<& normal = normalInfo.data[ idx ]; + for( int d=0 ; d<3 ; d++ ) if( off[d]==0 || off[d]==res-1 ) normal[d] = 0; + } +#endif // FORCE_NEUMANN_FIELD + nodeWeights.resize( TreeNodeData::NodeCount ); + // Set the point weights for evaluating the iso-value + for( TreeOctNode* node=_tree.nextNode() ; node ; node=_tree.nextNode(node) ) + { + int nIdx = normalInfo.index( node ); + if( nIdx>=0 ) + { + Real l = Real( Length( normalInfo.data[ nIdx ] ) ); + if( l ) + { + int nIdx = nodeWeights.index( node ); + if( nIdx<0 ) + { + nodeWeights.indices[ node->nodeData.nodeIndex ] = (int)nodeWeights.data.size(); + nodeWeights.data.push_back( l ); + } + else nodeWeights.data[ nIdx ] = l; + } + } + } + MemoryUsage(); + if( makeComplete ) _MakeComplete( ); + else _ClipTree< NormalDegree >( normalInfo ); + _maxDepth = _tree.maxDepth(); + return cnt; +} + +template< class Real > +void Octree< Real >::_SetValidityFlags( void ) +{ + for( int i=0 ; i<_sNodes.end( _sNodes.levels()-1 ) ; i++ ) + { + _sNodes.treeNodes[i]->nodeData.flags = 0; + if( IsValidNode< 0 >( _sNodes.treeNodes[i] , _dirichlet ) ) _sNodes.treeNodes[i]->nodeData.flags |= (1<<0); + if( IsValidNode< 1 >( _sNodes.treeNodes[i] , _dirichlet ) ) _sNodes.treeNodes[i]->nodeData.flags |= (1<<1); + } +} +template< class Real > void Octree< Real >::_MakeComplete( void ){ _tree.setFullDepth( _spaceRoot->maxDepth() ) ; MemoryUsage(); } +// Trim off the branches of the tree (finer than _fullDepth) that don't contain normal points +template< class Real > +template< int NormalDegree > +void Octree< Real >::_ClipTree( const SparseNodeData< Point3D< Real > , NormalDegree >& normalInfo ) +{ +#if NEW_NEW_CODE +#define ABS_INDEX( idx ) ( (idx<0) ? -(idx) : (idx) ) + static const int SupportSize = BSplineEvaluationData< NormalDegree >::SupportSize; + static const int LeftSupportRadius = -BSplineEvaluationData< NormalDegree >::SupportStart; + static const int RightSupportRadius = BSplineEvaluationData< NormalDegree >::SupportEnd; + int maxDepth = _tree.maxDepth(); + typename TreeOctNode::NeighborKey< LeftSupportRadius , RightSupportRadius > neighborKey; + neighborKey.set( maxDepth ); + + // Set all nodes to invalid (negative indices) + for( TreeOctNode* node=_tree.nextNode() ; node ; node=_tree.nextNode(node) ) node->nodeData.nodeIndex = -node->nodeData.nodeIndex; + + // Iterate over the nodes and, if they contain a normal, make sure that the supported nodes exist and are set to valid + for( TreeOctNode* node=_tree.nextNode() ; node ; node=_tree.nextNode(node) ) if( normalInfo.index( ABS_INDEX( node->nodeData.nodeIndex ) )>=0 ) + { + int depth = node->depth(); + neighborKey.getNeighbors< true >( node ); + for( int d=0 ; d<=depth ; d++ ) + { + TreeOctNode::template Neighbors< SupportSize >& neighbors = neighborKey.neighbors[d]; + for( int i=0 ; inodeData.nodeIndex = ABS_INDEX( neighbors.neighbors[i][j][k]->nodeData.nodeIndex ); + } + } + + // Remove the invalid nodes + for( TreeOctNode* node=_tree.nextNode() ; node ; node=_tree.nextNode( node ) ) + { + if( node->children && _Depth(node)>=_fullDepth ) + { + bool hasValidChildren = false; + for( int c=0 ; cchildren[c].nodeData.nodeIndex>0 ); + if( !hasValidChildren ) node->children = NULL; + } + node->nodeData.nodeIndex = ABS_INDEX( node->nodeData.nodeIndex ); + } + + MemoryUsage(); +#undef ABS_INDEX +#else // !NEW_NEW_CODE + int maxDepth = _tree.maxDepth(); + for( TreeOctNode* temp=_tree.nextNode() ; temp ; temp=_tree.nextNode(temp) ) + if( temp->children && _Depth( temp )>=_fullDepth ) + { + int hasNormals=0; + for( int i=0 ; ichildren[i] , normalInfo ); + if( !hasNormals ) temp->children=NULL; + } + MemoryUsage(); +#endif // NEW_NEW_CODE +} + +template< class Real > +template< int FEMDegree > +void Octree< Real >::EnableMultigrid( std::vector< int >* map ) +{ + if( FEMDegree<=_multigridDegree ) return; + _multigridDegree = FEMDegree; + const int OverlapRadius = -BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapStart; + int maxDepth = _tree.maxDepth( ); + typename TreeOctNode::NeighborKey< OverlapRadius , OverlapRadius > neighborKey; + neighborKey.set( maxDepth-1 ); + for( int d=maxDepth-1 ; d>=0 ; d-- ) + for( TreeOctNode* node=_tree.nextNode() ; node ; node=_tree.nextNode( node ) ) if( node->depth()==d && node->children ) + neighborKey.template getNeighbors< true >( node ); + _sNodes.set( _tree , map ); + _SetValidityFlags(); +} + +template< class Real > +template< int NormalDegree > +int Octree< Real >::_HasNormals( TreeOctNode* node , const SparseNodeData< Point3D< Real > , NormalDegree >& normalInfo ) +{ + int idx = normalInfo.index( node ); + if( idx>=0 ) + { + const Point3D< Real >& normal = normalInfo.data[ idx ]; + if( normal[0]!=0 || normal[1]!=0 || normal[2]!=0 ) return 1; + } + if( node->children ) for( int i=0 ; ichildren[i] , normalInfo ) ) return 1; + return 0; +} + +//////////////// +// VertexData // +//////////////// +long long VertexData::CenterIndex(const TreeOctNode* node,int maxDepth) +{ + int idx[DIMENSION]; + return CenterIndex(node,maxDepth,idx); +} +long long VertexData::CenterIndex(const TreeOctNode* node,int maxDepth,int idx[DIMENSION]) +{ + int d,o[3]; + node->depthAndOffset(d,o); + for(int i=0;idepthAndOffset( d , o ); + for( int i=0 ; idepthAndOffset(d,o); + for(int i=0;idepthAndOffset( d ,off ); + Cube::FactorEdgeIndex( eIndex , o , i1 , i2 ); + for( int i=0 ; i - -#if !defined(__ANDROID__) -#include -#endif - -#ifndef WIN32 -#include -#endif - -inline double Time(void) { -#ifdef WIN32 - struct _timeb t; - _ftime( &t ); - return double( t.time ) + double( t.millitm ) / 1000.0; -#else - struct timeval t; - gettimeofday( &t , NULL ); - return t.tv_sec + double( t.tv_usec ) / 1000000; -#endif -} - -#endif +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ + +#ifndef MY_TIME_INCLUDED +#define MY_TIME_INCLUDED + +#include + +#if !defined(__ANDROID__) +#include +#endif + +#ifndef WIN32 +#include +#endif + +inline double Time(void) { +#ifdef WIN32 + struct _timeb t; + _ftime( &t ); + return double( t.time ) + double( t.millitm ) / 1000.0; +#else + struct timeval t; + gettimeofday( &t , NULL ); + return t.tv_sec + double( t.tv_usec ) / 1000000; +#endif +} + +#endif diff --git a/src/lib/geogram/third_party/PoissonRecon/Octree.h b/src/lib/geogram/third_party/PoissonRecon/Octree.h old mode 100755 new mode 100644 index e446be21..9d769754 --- a/src/lib/geogram/third_party/PoissonRecon/Octree.h +++ b/src/lib/geogram/third_party/PoissonRecon/Octree.h @@ -1,175 +1,175 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - -#ifndef OCT_NODE_INCLUDED -#define OCT_NODE_INCLUDED - -#include "Allocator.h" -#include "BinaryNode.h" -#include "MarchingCubes.h" - -#define NEW_OCTNODE_CODE 1 - -#define DIMENSION 3 - -template< class NodeData > -class OctNode -{ -private: - static int UseAlloc; - unsigned long long _depthAndOffset; - - const OctNode* __faceNeighbor( int dir , int off ) const; - const OctNode* __edgeNeighbor( int o , const int i[2] , const int idx[2] ) const; - OctNode* __faceNeighbor( int dir , int off , int forceChildren ); - OctNode* __edgeNeighbor( int o , const int i[2] , const int idx[2] , int forceChildren); -public: - static const int DepthShift , OffsetShift , OffsetShift1 , OffsetShift2 , OffsetShift3; - static const int DepthMask , OffsetMask; - - static Allocator< OctNode > NodeAllocator; - static int UseAllocator( void ); - static void SetAllocator( int blockSize ); - - OctNode* parent; - OctNode* children; - NodeData nodeData; - - OctNode( void ); - ~OctNode( void ); - int initChildren( void ); - - void depthAndOffset( int& depth , int offset[DIMENSION] ) const; - void centerIndex( int index[DIMENSION] ) const; - int depth( void ) const; - static inline void DepthAndOffset( const long long& index , int& depth , int offset[DIMENSION] ); - template< class Real > static inline void CenterAndWidth( const long long& index , Point3D< Real >& center , Real& width ); - template< class Real > static inline void StartAndWidth( const long long& index , Point3D< Real >& start , Real& width ); - static inline int Depth( const long long& index ); - static inline void Index( int depth , const int offset[3] , short& d , short off[DIMENSION] ); - static inline unsigned long long Index( int depth , const int offset[3] ); - template< class Real > void centerAndWidth( Point3D& center , Real& width ) const; - template< class Real > void startAndWidth( Point3D< Real >& start , Real& width ) const; - template< class Real > bool isInside( Point3D< Real > p ) const; - - size_t leaves( void ) const; - size_t maxDepthLeaves( int maxDepth ) const; - size_t nodes( void ) const; - int maxDepth( void ) const; - - const OctNode* root( void ) const; - - const OctNode* nextLeaf( const OctNode* currentLeaf=NULL ) const; - OctNode* nextLeaf( OctNode* currentLeaf=NULL ); - const OctNode* nextNode( const OctNode* currentNode=NULL ) const; - OctNode* nextNode( OctNode* currentNode=NULL ); - const OctNode* nextBranch( const OctNode* current ) const; - OctNode* nextBranch( OctNode* current ); - const OctNode* prevBranch( const OctNode* current ) const; - OctNode* prevBranch( OctNode* current ); - - void setFullDepth( int maxDepth ); - - void printLeaves( void ) const; - void printRange( void ) const; - - template< class Real > static int CornerIndex( const Point3D& center , const Point3D &p ); - - OctNode* faceNeighbor( int faceIndex , int forceChildren=0 ); - const OctNode* faceNeighbor( int faceIndex ) const; - OctNode* edgeNeighbor( int edgeIndex , int forceChildren=0 ); - const OctNode* edgeNeighbor( int edgeIndex ) const; - OctNode* cornerNeighbor( int cornerIndex , int forceChildren=0 ); - const OctNode* cornerNeighbor( int cornerIndex ) const; - - int write( const char* fileName ) const; - int write( FILE* fp ) const; - int read( const char* fileName ); - int read( FILE* fp ); - - template< unsigned int Width > - struct Neighbors - { - OctNode* neighbors[Width][Width][Width]; - Neighbors( void ); - void clear( void ); - }; - template< unsigned int Width > - struct ConstNeighbors - { - const OctNode* neighbors[Width][Width][Width]; - ConstNeighbors( void ); - void clear( void ); - }; - - template< unsigned int LeftRadius , unsigned int RightRadius > - class NeighborKey - { - int _depth; - public: - static const int Width = LeftRadius + RightRadius + 1; - Neighbors< Width >* neighbors; - - NeighborKey( void ); - NeighborKey( const NeighborKey& key ); - ~NeighborKey( void ); - int depth( void ) const { return _depth; } - - void set( int depth ); - template< bool CreateNodes > typename OctNode< NodeData >::template Neighbors< LeftRadius+RightRadius+1 >& getNeighbors( OctNode* node ); - template< bool CreateNodes , unsigned int _LeftRadius , unsigned int _RightRadius > void getNeighbors( OctNode* node , Neighbors< _LeftRadius + _RightRadius + 1 >& neighbors ); - template< bool CreateNodes > bool getChildNeighbors( int cIdx , int d , Neighbors< Width >& childNeighbors ) const; - template< bool CreateNodes , class Real > bool getChildNeighbors( Point3D< Real > p , int d , Neighbors< Width >& childNeighbors ) const; - }; - - template< unsigned int LeftRadius , unsigned int RightRadius > - class ConstNeighborKey - { - int _depth; - public: - static const int Width = LeftRadius + RightRadius + 1; - ConstNeighbors* neighbors; - - ConstNeighborKey( void ); - ConstNeighborKey( const ConstNeighborKey& key ); - ~ConstNeighborKey( void ); - int depth( void ) const { return _depth; } - - void set( int depth ); - typename OctNode< NodeData >::template ConstNeighbors< LeftRadius+RightRadius+1 >& getNeighbors( const OctNode* node ); - template< unsigned int _LeftRadius , unsigned int _RightRadius > void getNeighbors( const OctNode* node , ConstNeighbors< _LeftRadius + _RightRadius + 1 >& neighbors ); - }; - - void centerIndex( int maxDepth , int index[DIMENSION] ) const; - int width( int maxDepth ) const; -}; - - -#include "Octree.inl" - -#endif // OCT_NODE_INCLUDED +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ + +#ifndef OCT_NODE_INCLUDED +#define OCT_NODE_INCLUDED + +#include "Allocator.h" +#include "BinaryNode.h" +#include "MarchingCubes.h" + +#define NEW_OCTNODE_CODE 1 + +#define DIMENSION 3 + +template< class NodeData > +class OctNode +{ +private: + static int UseAlloc; + unsigned long long _depthAndOffset; + + const OctNode* __faceNeighbor( int dir , int off ) const; + const OctNode* __edgeNeighbor( int o , const int i[2] , const int idx[2] ) const; + OctNode* __faceNeighbor( int dir , int off , int forceChildren ); + OctNode* __edgeNeighbor( int o , const int i[2] , const int idx[2] , int forceChildren); +public: + static const int DepthShift , OffsetShift , OffsetShift1 , OffsetShift2 , OffsetShift3; + static const int DepthMask , OffsetMask; + + static Allocator< OctNode > NodeAllocator; + static int UseAllocator( void ); + static void SetAllocator( int blockSize ); + + OctNode* parent; + OctNode* children; + NodeData nodeData; + + OctNode( void ); + ~OctNode( void ); + int initChildren( void ); + + void depthAndOffset( int& depth , int offset[DIMENSION] ) const; + void centerIndex( int index[DIMENSION] ) const; + int depth( void ) const; + static inline void DepthAndOffset( const long long& index , int& depth , int offset[DIMENSION] ); + template< class Real > static inline void CenterAndWidth( const long long& index , Point3D< Real >& center , Real& width ); + template< class Real > static inline void StartAndWidth( const long long& index , Point3D< Real >& start , Real& width ); + static inline int Depth( const long long& index ); + static inline void Index( int depth , const int offset[3] , short& d , short off[DIMENSION] ); + static inline unsigned long long Index( int depth , const int offset[3] ); + template< class Real > void centerAndWidth( Point3D& center , Real& width ) const; + template< class Real > void startAndWidth( Point3D< Real >& start , Real& width ) const; + template< class Real > bool isInside( Point3D< Real > p ) const; + + size_t leaves( void ) const; + size_t maxDepthLeaves( int maxDepth ) const; + size_t nodes( void ) const; + int maxDepth( void ) const; + + const OctNode* root( void ) const; + + const OctNode* nextLeaf( const OctNode* currentLeaf=NULL ) const; + OctNode* nextLeaf( OctNode* currentLeaf=NULL ); + const OctNode* nextNode( const OctNode* currentNode=NULL ) const; + OctNode* nextNode( OctNode* currentNode=NULL ); + const OctNode* nextBranch( const OctNode* current ) const; + OctNode* nextBranch( OctNode* current ); + const OctNode* prevBranch( const OctNode* current ) const; + OctNode* prevBranch( OctNode* current ); + + void setFullDepth( int maxDepth ); + + void printLeaves( void ) const; + void printRange( void ) const; + + template< class Real > static int CornerIndex( const Point3D& center , const Point3D &p ); + + OctNode* faceNeighbor( int faceIndex , int forceChildren=0 ); + const OctNode* faceNeighbor( int faceIndex ) const; + OctNode* edgeNeighbor( int edgeIndex , int forceChildren=0 ); + const OctNode* edgeNeighbor( int edgeIndex ) const; + OctNode* cornerNeighbor( int cornerIndex , int forceChildren=0 ); + const OctNode* cornerNeighbor( int cornerIndex ) const; + + int write( const char* fileName ) const; + int write( FILE* fp ) const; + int read( const char* fileName ); + int read( FILE* fp ); + + template< unsigned int Width > + struct Neighbors + { + OctNode* neighbors[Width][Width][Width]; + Neighbors( void ); + void clear( void ); + }; + template< unsigned int Width > + struct ConstNeighbors + { + const OctNode* neighbors[Width][Width][Width]; + ConstNeighbors( void ); + void clear( void ); + }; + + template< unsigned int LeftRadius , unsigned int RightRadius > + class NeighborKey + { + int _depth; + public: + static const int Width = LeftRadius + RightRadius + 1; + Neighbors< Width >* neighbors; + + NeighborKey( void ); + NeighborKey( const NeighborKey& key ); + ~NeighborKey( void ); + int depth( void ) const { return _depth; } + + void set( int depth ); + template< bool CreateNodes > typename OctNode< NodeData >::template Neighbors< LeftRadius+RightRadius+1 >& getNeighbors( OctNode* node ); + template< bool CreateNodes , unsigned int _LeftRadius , unsigned int _RightRadius > void getNeighbors( OctNode* node , Neighbors< _LeftRadius + _RightRadius + 1 >& neighbors ); + template< bool CreateNodes > bool getChildNeighbors( int cIdx , int d , Neighbors< Width >& childNeighbors ) const; + template< bool CreateNodes , class Real > bool getChildNeighbors( Point3D< Real > p , int d , Neighbors< Width >& childNeighbors ) const; + }; + + template< unsigned int LeftRadius , unsigned int RightRadius > + class ConstNeighborKey + { + int _depth; + public: + static const int Width = LeftRadius + RightRadius + 1; + ConstNeighbors* neighbors; + + ConstNeighborKey( void ); + ConstNeighborKey( const ConstNeighborKey& key ); + ~ConstNeighborKey( void ); + int depth( void ) const { return _depth; } + + void set( int depth ); + typename OctNode< NodeData >::template ConstNeighbors< LeftRadius+RightRadius+1 >& getNeighbors( const OctNode* node ); + template< unsigned int _LeftRadius , unsigned int _RightRadius > void getNeighbors( const OctNode* node , ConstNeighbors< _LeftRadius + _RightRadius + 1 >& neighbors ); + }; + + void centerIndex( int maxDepth , int index[DIMENSION] ) const; + int width( int maxDepth ) const; +}; + + +#include "Octree.inl" + +#endif // OCT_NODE_INCLUDED diff --git a/src/lib/geogram/third_party/PoissonRecon/Octree.inl b/src/lib/geogram/third_party/PoissonRecon/Octree.inl old mode 100755 new mode 100644 index 0e9495c3..7d598f95 --- a/src/lib/geogram/third_party/PoissonRecon/Octree.inl +++ b/src/lib/geogram/third_party/PoissonRecon/Octree.inl @@ -1,1068 +1,1068 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - -#include -#include -#include - -///////////// -// OctNode // -///////////// -template< class NodeData > const int OctNode< NodeData >::DepthShift=5; -template< class NodeData > const int OctNode< NodeData >::OffsetShift = ( sizeof(long long)*8 - DepthShift ) / 3; -template< class NodeData > const int OctNode< NodeData >::DepthMask=(1< const int OctNode< NodeData >::OffsetMask=(1< const int OctNode< NodeData >::OffsetShift1=DepthShift; -template< class NodeData > const int OctNode< NodeData >::OffsetShift2=OffsetShift1+OffsetShift; -template< class NodeData > const int OctNode< NodeData >::OffsetShift3=OffsetShift2+OffsetShift; - -template< class NodeData > int OctNode< NodeData >::UseAlloc=0; -template< class NodeData > Allocator > OctNode< NodeData >::NodeAllocator; - -template< class NodeData > -void OctNode< NodeData >::SetAllocator(int blockSize) -{ - if(blockSize>0) - { - UseAlloc=1; - NodeAllocator.set(blockSize); - } - else{UseAlloc=0;} -} -template< class NodeData > -int OctNode< NodeData >::UseAllocator(void){return UseAlloc;} - -template< class NodeData > -OctNode< NodeData >::OctNode(void){ - parent=children=NULL; - _depthAndOffset = 0; -} - -template< class NodeData > -OctNode< NodeData >::~OctNode(void){ - if(!UseAlloc){if(children){delete[] children;}} - parent=children=NULL; -} -template< class NodeData > -void OctNode< NodeData >::setFullDepth( int maxDepth ) -{ - if( maxDepth ) - { - if( !children ) initChildren(); - for( int i=0 ; i<8 ; i++ ) children[i].setFullDepth( maxDepth-1 ); - } -} - -template< class NodeData > -int OctNode< NodeData >::initChildren( void ) -{ - if( UseAlloc ) children=NodeAllocator.newElements(8); - else - { - if( children ) delete[] children; - children = NULL; - children = new OctNode[Cube::CORNERS]; - } - if( !children ) - { - fprintf(stderr,"Failed to initialize children in OctNode::initChildren\n"); - exit(0); - return 0; - } - int d , off[3]; - depthAndOffset( d , off ); - for( int i=0 ; i<2 ; i++ ) for( int j=0 ; j<2 ; j++ ) for( int k=0 ; k<2 ; k++ ) - { - int idx=Cube::CornerIndex(i,j,k); - children[idx].parent = this; - children[idx].children = NULL; - int off2[3]; - off2[0] = (off[0]<<1)+i; - off2[1] = (off[1]<<1)+j; - off2[2] = (off[2]<<1)+k; - children[idx]._depthAndOffset = Index( d+1 , off2 ); - } - return 1; -} -template< class NodeData > -inline void OctNode< NodeData >::Index(int depth,const int offset[3],short& d,short off[3]){ - d=short(depth); - off[0]=short((1< -inline void OctNode< NodeData >::depthAndOffset( int& depth , int offset[DIMENSION] ) const -{ - depth = int( _depthAndOffset & DepthMask ); - offset[0] = int( (_depthAndOffset>>OffsetShift1) & OffsetMask ); - offset[1] = int( (_depthAndOffset>>OffsetShift2) & OffsetMask ); - offset[2] = int( (_depthAndOffset>>OffsetShift3) & OffsetMask ); -} -template< class NodeData > -inline void OctNode< NodeData >::centerIndex( int index[DIMENSION] ) const -{ - int d , off[DIMENSION]; - depthAndOffset( d , off ); - for( int i=0 ; i -inline unsigned long long OctNode< NodeData >::Index( int depth , const int offset[3] ) -{ - unsigned long long idx=0; - idx |= ( ( (unsigned long long)(depth ) ) & DepthMask ); - idx |= ( ( (unsigned long long)(offset[0]) ) & OffsetMask ) << OffsetShift1; - idx |= ( ( (unsigned long long)(offset[1]) ) & OffsetMask ) << OffsetShift2; - idx |= ( ( (unsigned long long)(offset[2]) ) & OffsetMask ) << OffsetShift3; - return idx; -} -template< class NodeData > -inline int OctNode< NodeData >::depth( void ) const {return int( _depthAndOffset & DepthMask );} -template< class NodeData > -inline void OctNode< NodeData >::DepthAndOffset(const long long& index,int& depth,int offset[3]){ - depth=int(index&DepthMask); - offset[0]=(int((index>>OffsetShift1)&OffsetMask)+1)&(~(1<>OffsetShift2)&OffsetMask)+1)&(~(1<>OffsetShift3)&OffsetMask)+1)&(~(1< -inline int OctNode< NodeData >::Depth(const long long& index){return int(index&DepthMask);} -template< class NodeData > -template< class Real > -void OctNode< NodeData >::centerAndWidth( Point3D& center , Real& width ) const -{ - int depth , offset[3]; - depthAndOffset( depth , offset ); - width = Real( 1.0 / (1< -template< class Real > -void OctNode< NodeData >::startAndWidth( Point3D& start , Real& width ) const -{ - int depth , offset[3]; - depthAndOffset( depth , offset ); - width = Real( 1.0 / (1< -template< class Real > -bool OctNode< NodeData >::isInside( Point3D< Real > p ) const -{ - Point3D< Real > c; - Real w; - centerAndWidth( c , w ); - w /= 2; - return (c[0]-w) -template< class Real > -inline void OctNode< NodeData >::CenterAndWidth(const long long& index,Point3D& center,Real& width){ - int depth,offset[3]; - depth=index&DepthMask; - offset[0]=(int((index>>OffsetShift1)&OffsetMask)+1)&(~(1<>OffsetShift2)&OffsetMask)+1)&(~(1<>OffsetShift3)&OffsetMask)+1)&(~(1< -template< class Real > -inline void OctNode< NodeData >::StartAndWidth( const long long& index , Point3D< Real >& start , Real& width ) -{ - int depth,offset[3]; - depth = index&DepthMask; - offset[0] = (int((index>>OffsetShift1)&OffsetMask)+1)&(~(1<>OffsetShift2)&OffsetMask)+1)&(~(1<>OffsetShift3)&OffsetMask)+1)&(~(1< -int OctNode< NodeData >::maxDepth(void) const{ - if(!children){return 0;} - else{ - int c,d; - for(int i=0;ic){c=d;} - } - return c+1; - } -} -template< class NodeData > -size_t OctNode< NodeData >::nodes( void ) const -{ - if( !children ) return 1; - else - { - size_t c=0; - for( int i=0 ; i -size_t OctNode< NodeData >::leaves( void ) const -{ - if( !children ) return 1; - else - { - size_t c=0; - for( int i=0 ; i -size_t OctNode< NodeData >::maxDepthLeaves( int maxDepth ) const -{ - if( depth()>maxDepth ) return 0; - if( !children ) return 1; - else - { - size_t c=0; - for( int i=0 ; i -const OctNode< NodeData >* OctNode< NodeData >::root(void) const{ - const OctNode* temp=this; - while(temp->parent){temp=temp->parent;} - return temp; -} - - -template< class NodeData > -const OctNode< NodeData >* OctNode< NodeData >::nextBranch( const OctNode* current ) const -{ - if( !current->parent || current==this ) return NULL; - if(current-current->parent->children==Cube::CORNERS-1) return nextBranch( current->parent ); - else return current+1; -} -template< class NodeData > -OctNode< NodeData >* OctNode< NodeData >::nextBranch(OctNode* current){ - if(!current->parent || current==this){return NULL;} - if(current-current->parent->children==Cube::CORNERS-1){return nextBranch(current->parent);} - else{return current+1;} -} -template< class NodeData > -const OctNode< NodeData >* OctNode< NodeData >::prevBranch( const OctNode* current ) const -{ - if( !current->parent || current==this ) return NULL; - if( current-current->parent->children==0 ) return prevBranch( current->parent ); - else return current-1; -} -template< class NodeData > -OctNode< NodeData >* OctNode< NodeData >::prevBranch( OctNode* current ) -{ - if( !current->parent || current==this ) return NULL; - if( current-current->parent->children==0 ) return prevBranch( current->parent ); - else return current-1; -} -template< class NodeData > -const OctNode< NodeData >* OctNode< NodeData >::nextLeaf(const OctNode* current) const{ - if(!current){ - const OctNode< NodeData >* temp=this; - while(temp->children){temp=&temp->children[0];} - return temp; - } - if(current->children){return current->nextLeaf();} - const OctNode* temp=nextBranch(current); - if(!temp){return NULL;} - else{return temp->nextLeaf();} -} -template< class NodeData > -OctNode< NodeData >* OctNode< NodeData >::nextLeaf(OctNode* current){ - if(!current){ - OctNode< NodeData >* temp=this; - while(temp->children){temp=&temp->children[0];} - return temp; - } - if(current->children){return current->nextLeaf();} - OctNode* temp=nextBranch(current); - if(!temp){return NULL;} - else{return temp->nextLeaf();} -} - -template< class NodeData > -const OctNode< NodeData >* OctNode< NodeData >::nextNode( const OctNode* current ) const -{ - if( !current ) return this; - else if( current->children ) return ¤t->children[0]; - else return nextBranch(current); -} -template< class NodeData > -OctNode< NodeData >* OctNode< NodeData >::nextNode( OctNode* current ) -{ - if( !current ) return this; - else if( current->children ) return ¤t->children[0]; - else return nextBranch( current ); -} - -template< class NodeData > -void OctNode< NodeData >::printRange(void) const -{ - Point3D< float > center; - float width; - centerAndWidth(center,width); - for(int dim=0;dim -template< class Real > -int OctNode< NodeData >::CornerIndex(const Point3D& center,const Point3D& p){ - int cIndex=0; - if(p.coords[0]>center.coords[0]){cIndex|=1;} - if(p.coords[1]>center.coords[1]){cIndex|=2;} - if(p.coords[2]>center.coords[2]){cIndex|=4;} - return cIndex; -} - -template< class NodeData > -OctNode< NodeData >* OctNode< NodeData >::faceNeighbor(int faceIndex,int forceChildren){return __faceNeighbor(faceIndex>>1,faceIndex&1,forceChildren);} -template< class NodeData > -const OctNode< NodeData >* OctNode< NodeData >::faceNeighbor(int faceIndex) const {return __faceNeighbor(faceIndex>>1,faceIndex&1);} -template< class NodeData > -OctNode< NodeData >* OctNode< NodeData >::__faceNeighbor(int dir,int off,int forceChildren){ - if(!parent){return NULL;} - int pIndex=int(this-parent->children); - pIndex^=(1<children[pIndex];} - else{ - OctNode* temp=parent->__faceNeighbor(dir,off,forceChildren); - if(!temp){return NULL;} - if(!temp->children){ - if(forceChildren){temp->initChildren();} - else{return temp;} - } - return &temp->children[pIndex]; - } -} -template< class NodeData > -const OctNode< NodeData >* OctNode< NodeData >::__faceNeighbor(int dir,int off) const { - if(!parent){return NULL;} - int pIndex=int(this-parent->children); - pIndex^=(1<children[pIndex];} - else{ - const OctNode* temp=parent->__faceNeighbor(dir,off); - if(!temp || !temp->children){return temp;} - else{return &temp->children[pIndex];} - } -} - -template< class NodeData > -OctNode< NodeData >* OctNode< NodeData >::edgeNeighbor(int edgeIndex,int forceChildren){ - int idx[2],o,i[2]; - Cube::FactorEdgeIndex(edgeIndex,o,i[0],i[1]); - switch(o){ - case 0: idx[0]=1; idx[1]=2; break; - case 1: idx[0]=0; idx[1]=2; break; - case 2: idx[0]=0; idx[1]=1; break; - }; - return __edgeNeighbor(o,i,idx,forceChildren); -} -template< class NodeData > -const OctNode< NodeData >* OctNode< NodeData >::edgeNeighbor(int edgeIndex) const { - int idx[2],o,i[2]; - Cube::FactorEdgeIndex(edgeIndex,o,i[0],i[1]); - switch(o){ - case 0: idx[0]=1; idx[1]=2; break; - case 1: idx[0]=0; idx[1]=2; break; - case 2: idx[0]=0; idx[1]=1; break; - }; - return __edgeNeighbor(o,i,idx); -} -template< class NodeData > -const OctNode< NodeData >* OctNode< NodeData >::__edgeNeighbor(int o,const int i[2],const int idx[2]) const{ - if(!parent){return NULL;} - int pIndex=int(this-parent->children); - int aIndex,x[DIMENSION]; - - Cube::FactorCornerIndex(pIndex,x[0],x[1],x[2]); - aIndex=(~((i[0] ^ x[idx[0]]) | ((i[1] ^ x[idx[1]])<<1))) & 3; - pIndex^=(7 ^ (1<__faceNeighbor(idx[0],i[0]); - if(!temp || !temp->children){return NULL;} - else{return &temp->children[pIndex];} - } - else if(aIndex==2) { // I can get the neighbor from the parent's face adjacent neighbor - const OctNode* temp=parent->__faceNeighbor(idx[1],i[1]); - if(!temp || !temp->children){return NULL;} - else{return &temp->children[pIndex];} - } - else if(aIndex==0) { // I can get the neighbor from the parent - return &parent->children[pIndex]; - } - else if(aIndex==3) { // I can get the neighbor from the parent's edge adjacent neighbor - const OctNode* temp=parent->__edgeNeighbor(o,i,idx); - if(!temp || !temp->children){return temp;} - else{return &temp->children[pIndex];} - } - else{return NULL;} -} -template< class NodeData > -OctNode< NodeData >* OctNode< NodeData >::__edgeNeighbor(int o,const int i[2],const int idx[2],int forceChildren){ - if(!parent){return NULL;} - int pIndex=int(this-parent->children); - int aIndex,x[DIMENSION]; - - Cube::FactorCornerIndex(pIndex,x[0],x[1],x[2]); - aIndex=(~((i[0] ^ x[idx[0]]) | ((i[1] ^ x[idx[1]])<<1))) & 3; - pIndex^=(7 ^ (1<__faceNeighbor(idx[0],i[0],0); - if(!temp || !temp->children){return NULL;} - else{return &temp->children[pIndex];} - } - else if(aIndex==2) { // I can get the neighbor from the parent's face adjacent neighbor - OctNode* temp=parent->__faceNeighbor(idx[1],i[1],0); - if(!temp || !temp->children){return NULL;} - else{return &temp->children[pIndex];} - } - else if(aIndex==0) { // I can get the neighbor from the parent - return &parent->children[pIndex]; - } - else if(aIndex==3) { // I can get the neighbor from the parent's edge adjacent neighbor - OctNode* temp=parent->__edgeNeighbor(o,i,idx,forceChildren); - if(!temp){return NULL;} - if(!temp->children){ - if(forceChildren){temp->initChildren();} - else{return temp;} - } - return &temp->children[pIndex]; - } - else{return NULL;} -} - -template< class NodeData > -const OctNode< NodeData >* OctNode< NodeData >::cornerNeighbor(int cornerIndex) const { - int pIndex,aIndex=0; - if(!parent){return NULL;} - - pIndex=int(this-parent->children); - aIndex=(cornerIndex ^ pIndex); // The disagreement bits - pIndex=(~pIndex)&7; // The antipodal point - if(aIndex==7){ // Agree on no bits - return &parent->children[pIndex]; - } - else if(aIndex==0){ // Agree on all bits - const OctNode* temp=((const OctNode*)parent)->cornerNeighbor(cornerIndex); - if(!temp || !temp->children){return temp;} - else{return &temp->children[pIndex];} - } - else if(aIndex==6){ // Agree on face 0 - const OctNode* temp=((const OctNode*)parent)->__faceNeighbor(0,cornerIndex & 1); - if(!temp || !temp->children){return NULL;} - else{return & temp->children[pIndex];} - } - else if(aIndex==5){ // Agree on face 1 - const OctNode* temp=((const OctNode*)parent)->__faceNeighbor(1,(cornerIndex & 2)>>1); - if(!temp || !temp->children){return NULL;} - else{return & temp->children[pIndex];} - } - else if(aIndex==3){ // Agree on face 2 - const OctNode* temp=((const OctNode*)parent)->__faceNeighbor(2,(cornerIndex & 4)>>2); - if(!temp || !temp->children){return NULL;} - else{return & temp->children[pIndex];} - } - else if(aIndex==4){ // Agree on edge 2 - const OctNode* temp=((const OctNode*)parent)->edgeNeighbor(8 | (cornerIndex & 1) | (cornerIndex & 2) ); - if(!temp || !temp->children){return NULL;} - else{return & temp->children[pIndex];} - } - else if(aIndex==2){ // Agree on edge 1 - const OctNode* temp=((const OctNode*)parent)->edgeNeighbor(4 | (cornerIndex & 1) | ((cornerIndex & 4)>>1) ); - if(!temp || !temp->children){return NULL;} - else{return & temp->children[pIndex];} - } - else if(aIndex==1){ // Agree on edge 0 - const OctNode* temp=((const OctNode*)parent)->edgeNeighbor(((cornerIndex & 2) | (cornerIndex & 4))>>1 ); - if(!temp || !temp->children){return NULL;} - else{return & temp->children[pIndex];} - } - else{return NULL;} -} -template< class NodeData > -OctNode< NodeData >* OctNode< NodeData >::cornerNeighbor(int cornerIndex,int forceChildren){ - int pIndex,aIndex=0; - if(!parent){return NULL;} - - pIndex=int(this-parent->children); - aIndex=(cornerIndex ^ pIndex); // The disagreement bits - pIndex=(~pIndex)&7; // The antipodal point - if(aIndex==7){ // Agree on no bits - return &parent->children[pIndex]; - } - else if(aIndex==0){ // Agree on all bits - OctNode* temp=((OctNode*)parent)->cornerNeighbor(cornerIndex,forceChildren); - if(!temp){return NULL;} - if(!temp->children){ - if(forceChildren){temp->initChildren();} - else{return temp;} - } - return &temp->children[pIndex]; - } - else if(aIndex==6){ // Agree on face 0 - OctNode* temp=((OctNode*)parent)->__faceNeighbor(0,cornerIndex & 1,0); - if(!temp || !temp->children){return NULL;} - else{return & temp->children[pIndex];} - } - else if(aIndex==5){ // Agree on face 1 - OctNode* temp=((OctNode*)parent)->__faceNeighbor(1,(cornerIndex & 2)>>1,0); - if(!temp || !temp->children){return NULL;} - else{return & temp->children[pIndex];} - } - else if(aIndex==3){ // Agree on face 2 - OctNode* temp=((OctNode*)parent)->__faceNeighbor(2,(cornerIndex & 4)>>2,0); - if(!temp || !temp->children){return NULL;} - else{return & temp->children[pIndex];} - } - else if(aIndex==4){ // Agree on edge 2 - OctNode* temp=((OctNode*)parent)->edgeNeighbor(8 | (cornerIndex & 1) | (cornerIndex & 2) ); - if(!temp || !temp->children){return NULL;} - else{return & temp->children[pIndex];} - } - else if(aIndex==2){ // Agree on edge 1 - OctNode* temp=((OctNode*)parent)->edgeNeighbor(4 | (cornerIndex & 1) | ((cornerIndex & 4)>>1) ); - if(!temp || !temp->children){return NULL;} - else{return & temp->children[pIndex];} - } - else if(aIndex==1){ // Agree on edge 0 - OctNode* temp=((OctNode*)parent)->edgeNeighbor(((cornerIndex & 2) | (cornerIndex & 4))>>1 ); - if(!temp || !temp->children){return NULL;} - else{return & temp->children[pIndex];} - } - else{return NULL;} -} - -//////////////////////// -// OctNode::Neighbors // -//////////////////////// -template< class NodeData > -template< unsigned int Width > -OctNode< NodeData >::Neighbors< Width >::Neighbors( void ){ clear(); } -template< class NodeData > -template< unsigned int Width > -void OctNode< NodeData >::Neighbors< Width >::clear( void ){ for( int i=0 ; i -template< unsigned int Width > -OctNode< NodeData >::ConstNeighbors< Width >::ConstNeighbors( void ){ clear(); } -template< class NodeData > -template< unsigned int Width > -void OctNode< NodeData >::ConstNeighbors< Width >::clear( void ){ for( int i=0 ; i -template< unsigned int LeftRadius , unsigned int RightRadius > -OctNode< NodeData >::NeighborKey< LeftRadius , RightRadius >::NeighborKey( void ){ _depth=-1 , neighbors=NULL; } -template< class NodeData > -template< unsigned int LeftRadius , unsigned int RightRadius > -OctNode< NodeData >::NeighborKey< LeftRadius , RightRadius >::NeighborKey( const NeighborKey& nKey ) -{ - _depth = 0 , neighbors = NULL; - set( nKey._depth ); - for( int d=0 ; d<=_depth ; d++ ) memcpy( &neighbors[d] , &nKey.neighbors[d] , sizeof( Neighbors< Width > ) ); -} -template< class NodeData > -template< unsigned int LeftRadius , unsigned int RightRadius > -OctNode< NodeData >::NeighborKey< LeftRadius , RightRadius >::~NeighborKey( void ) -{ - if( neighbors ) delete[] neighbors; - neighbors = NULL; -} - -template< class NodeData > -template< unsigned int LeftRadius , unsigned int RightRadius > -void OctNode< NodeData >::NeighborKey< LeftRadius , RightRadius >::set( int d ) -{ - if( neighbors ) delete[] neighbors; - neighbors = NULL; - _depth = d; - if( d<0 ) return; - neighbors = new Neighbors< Width >[d+1]; -} -template< class NodeData > -template< unsigned int LeftRadius , unsigned int RightRadius > -template< bool CreateNodes > -bool OctNode< NodeData >::NeighborKey< LeftRadius , RightRadius >::getChildNeighbors( int cIdx , int d , Neighbors< Width >& cNeighbors ) const -{ - Neighbors< Width >& pNeighbors = neighbors[d]; - // Check that we actuall have a center node - if( !pNeighbors.neighbors[LeftRadius][LeftRadius][LeftRadius] ) return false; - - // Get the indices of the child node that would contain the point (and its antipode) - int cx , cy , cz; - Cube::FactorCornerIndex( cIdx , cx , cy , cz ); - - - // Iterate over the finer neighbors and set them (if you can) - // Here: - // (x,y,z) give the position of the finer nodes relative to the center, - // (_x,_y,_z) give a positive global position, up to an even offset, and - // (px-LeftRadius,py-LeftRadius,pz-LeftRadius) give the positions of their parents relative to the parent of the center - for( int z=-(int)LeftRadius ; z<=(int)RightRadius ; z++ ) - { - int _z = (z+cz) + (LeftRadius<<1) , pz = ( _z>>1 ) , zz = z+LeftRadius; - for( int y=-(int)LeftRadius ; y<=(int)RightRadius ; y++ ) - { - int _y = (y+cy) + (LeftRadius<<1) , py = ( _y>>1 ) , yy = y+LeftRadius; - - int cornerIndex = ( (_z&1)<<2 ) | ( (_y&1)<<1 ); - for( int x=-(int)LeftRadius ; x<=(int)RightRadius ; x++ ) - { - int _x = (x+cx) + (LeftRadius<<1) , px = ( _x>>1 ) , xx = x+LeftRadius; - - if( CreateNodes ) - { - if( pNeighbors.neighbors[px][py][pz] ) - { - if( !pNeighbors.neighbors[px][py][pz]->children ) pNeighbors.neighbors[px][py][pz]->initChildren(); - cNeighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); - } - else cNeighbors.neighbors[xx][yy][zz] = NULL; - } - else - { - if( pNeighbors.neighbors[px][py][pz] && pNeighbors.neighbors[px][py][pz]->children ) - cNeighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); - else cNeighbors.neighbors[xx][yy][zz] = NULL; - } - } - } - } - return true; -} -template< class NodeData > -template< unsigned int LeftRadius , unsigned int RightRadius > -template< bool CreateNodes , class Real > -bool OctNode< NodeData >::NeighborKey< LeftRadius , RightRadius >::getChildNeighbors( Point3D< Real > p , int d , Neighbors< Width >& cNeighbors ) const -{ - Neighbors< Width >& pNeighbors = neighbors[d]; - // Check that we actuall have a center node - if( !pNeighbors.neighbors[LeftRadius][LeftRadius][LeftRadius] ) return false; - Point3D< Real > c; - Real w; - pNeighbors.neighbors[LeftRadius][LeftRadius][LeftRadius]->centerAndWidth( c , w ); - return getChildNeighbors< CreateNodes >( CornerIndex( c , p ) , d , cNeighbors ); -} - -template< class NodeData > -template< unsigned int LeftRadius , unsigned int RightRadius > -template< bool CreateNodes > -typename OctNode< NodeData >::template Neighbors< LeftRadius+RightRadius+1 >& OctNode< NodeData >::NeighborKey< LeftRadius , RightRadius >::getNeighbors( OctNode< NodeData >* node ) -{ - Neighbors< Width >& neighbors = this->neighbors[ node->depth() ]; - if( node==neighbors.neighbors[LeftRadius][LeftRadius][LeftRadius] ) - { - bool reset = false; - for( int i=0 ; iparent ) neighbors.neighbors[LeftRadius][LeftRadius][LeftRadius] = node; - else - { - Neighbors< Width >& pNeighbors = getNeighbors< CreateNodes >( node->parent ); - - - // Get the indices of the child node that would contain the point (and its antipode) - int cx , cy , cz; - Cube::FactorCornerIndex( (int)( node - node->parent->children ) , cx , cy , cz ); - - - // Iterate over the finer neighbors and set them (if you can) - // Here: - // (x,y,z) give the position of the finer nodes relative to the center, - // (_x,_y,_z) give a positive global position, up to an even offset, and - // (px-LeftRadius,py-LeftRadius,pz-LeftRadius) give the positions of their parents relative to the parent of the center - for( int z=-(int)LeftRadius ; z<=(int)RightRadius ; z++ ) - { - int _z = (z+cz) + (LeftRadius<<1) , pz = ( _z>>1 ) , zz = z+LeftRadius; - for( int y=-(int)LeftRadius ; y<=(int)RightRadius ; y++ ) - { - int _y = (y+cy) + (LeftRadius<<1) , py = ( _y>>1 ) , yy = y+LeftRadius; - - int cornerIndex = ( (_z&1)<<2 ) | ( (_y&1)<<1 ); - for( int x=-(int)LeftRadius ; x<=(int)RightRadius ; x++ ) - { - int _x = (x+cx) + (LeftRadius<<1) , px = ( _x>>1 ) , xx = x+LeftRadius; - if( CreateNodes ) - { - if( pNeighbors.neighbors[px][py][pz] ) - { - if( !pNeighbors.neighbors[px][py][pz]->children ) pNeighbors.neighbors[px][py][pz]->initChildren(); - neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); - } - else neighbors.neighbors[xx][yy][zz] = NULL; - } - else - { - if( pNeighbors.neighbors[px][py][pz] && pNeighbors.neighbors[px][py][pz]->children ) - neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); - else neighbors.neighbors[xx][yy][zz] = NULL; - } - } - } - } - } - } - return neighbors; -} -template< class NodeData > -template< unsigned int LeftRadius , unsigned int RightRadius > -template< bool CreateNodes , unsigned int _LeftRadius , unsigned int _RightRadius > -void OctNode< NodeData >::NeighborKey< LeftRadius , RightRadius >::getNeighbors( OctNode< NodeData >* node , Neighbors< _LeftRadius + _RightRadius + 1 >& neighbors ) -{ - neighbors.clear(); - if( !node ) return; - - // [WARNING] This estimate of the required radius is somewhat conservative if the radius is odd (depending on where the node is relative to its parent) - const unsigned int _PLeftRadius = (_LeftRadius+1)/2 , _PRightRadius = (_RightRadius+1)/2; - // If we are at the root of the tree, we are done - if( !node->parent ) neighbors.neighbors[_LeftRadius][_LeftRadius][_LeftRadius] = node; - // If we can get the data from the the key for the parent node, do that - else if( _PLeftRadius<=LeftRadius && _PRightRadius<=RightRadius ) - { - getNeighbors< CreateNodes >( node->parent ); - const Neighbors< LeftRadius + RightRadius + 1 >& pNeighbors = this->neighbors[ node->depth()-1 ]; - // Get the indices of the child node that would contain the point (and its antipode) - int cx , cy , cz; - Cube::FactorCornerIndex( (int)( node - node->parent->children ) , cx , cy , cz ); - - - // Iterate over the finer neighbors - // Here: - // (x,y,z) give the position of the finer nodes relative to the center, - // (_x,_y,_z) give a positive global position, up to an even offset, and - // (px-LeftRadius,py-LeftRadius,pz-LeftRadius) give the positions of their parents relative to the parent of the center - for( int z=-(int)_LeftRadius ; z<=(int)_RightRadius ; z++ ) - { - int _z = (z+cz) + (_LeftRadius<<1) , pz = ( _z>>1 ) - _LeftRadius + LeftRadius , zz = z + _LeftRadius; - for( int y=-(int)_LeftRadius ; y<=(int)_RightRadius ; y++ ) - { - int _y = (y+cy) + (_LeftRadius<<1) , py = ( _y>>1 ) - _LeftRadius + LeftRadius , yy = y + _LeftRadius; - - int cornerIndex = ( (_z&1)<<2 ) | ( (_y&1)<<1 ); - for( int x=-(int)_LeftRadius ; x<=(int)_RightRadius ; x++ ) - { - int _x = (x+cx) + (_LeftRadius<<1) , px = ( _x>>1 ) - _LeftRadius + LeftRadius , xx = x + _LeftRadius; - if( CreateNodes ) - { - if( pNeighbors.neighbors[px][py][pz] ) - { - if( !pNeighbors.neighbors[px][py][pz]->children ) pNeighbors.neighbors[px][py][pz]->initChildren(); - neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); - } - else neighbors.neighbors[xx][yy][zz] = NULL; - } - else - { - if( pNeighbors.neighbors[px][py][pz] && pNeighbors.neighbors[px][py][pz]->children ) - neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); - else neighbors.neighbors[xx][yy][zz] = NULL; - } - } - } - } - } - // Otherwise recurse - else - { - Neighbors< _PLeftRadius + _PRightRadius + 1 > pNeighbors; - getNeighbors< CreateNodes , _PLeftRadius , _PRightRadius >( node->parent , pNeighbors ); - - // Get the indices of the child node that would contain the point (and its antipode) - int cx , cy , cz; - Cube::FactorCornerIndex( (int)( node - node->parent->children ) , cx , cy , cz ); - - - // Iterate over the finer neighbors - // Here: - // (x,y,z) give the position of the finer nodes relative to the center, - // (_x,_y,_z) give a positive global position, up to an even offset, and - // (px-LeftRadius,py-LeftRadius,pz-LeftRadius) give the positions of their parents relative to the parent of the center - for( int z=-(int)_LeftRadius ; z<=(int)_RightRadius ; z++ ) - { - int _z = (z+cz) + (_LeftRadius<<1) , pz = ( _z>>1 ) - _LeftRadius + _PLeftRadius , zz = z + _LeftRadius; - for( int y=-(int)_LeftRadius ; y<=(int)_RightRadius ; y++ ) - { - int _y = (y+cy) + (_LeftRadius<<1) , py = ( _y>>1 ) - _LeftRadius + _PLeftRadius , yy = y + _LeftRadius; - - int cornerIndex = ( (_z&1)<<2 ) | ( (_y&1)<<1 ); - for( int x=-(int)_LeftRadius ; x<=(int)_RightRadius ; x++ ) - { - int _x = (x+cx) + (_LeftRadius<<1) , px = ( _x>>1 ) - _LeftRadius + _PLeftRadius , xx = x + _LeftRadius; - if( CreateNodes ) - { - if( pNeighbors.neighbors[px][py][pz] ) - { - if( !pNeighbors.neighbors[px][py][pz]->children ) pNeighbors.neighbors[px][py][pz]->initChildren(); - neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); - } - else neighbors.neighbors[xx][yy][zz] = NULL; - } - else - { - if( pNeighbors.neighbors[px][py][pz] && pNeighbors.neighbors[px][py][pz]->children ) - neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); - else neighbors.neighbors[xx][yy][zz] = NULL; - } - } - } - } - } -} - -/////////////////////////////// -// OctNode::ConstNeighborKey // -/////////////////////////////// -template< class NodeData > -template< unsigned int LeftRadius , unsigned int RightRadius > -OctNode< NodeData >::ConstNeighborKey< LeftRadius , RightRadius >::ConstNeighborKey( void ){ _depth=-1 , neighbors=NULL; } -template< class NodeData > -template< unsigned int LeftRadius , unsigned int RightRadius > -OctNode< NodeData >::ConstNeighborKey< LeftRadius , RightRadius >::ConstNeighborKey( const ConstNeighborKey& key ) -{ - _depth = 0 , neighbors = NULL; - set( key._depth ); - for( int d=0 ; d<=_depth ; d++ ) memcpy( &neighbors[d] , &key.neighbors[d] , sizeof( ConstNeighbors< Width > ) ); -} -template< class NodeData > -template< unsigned int LeftRadius , unsigned int RightRadius > -OctNode< NodeData >::ConstNeighborKey< LeftRadius , RightRadius >::~ConstNeighborKey( void ) -{ - if( neighbors ) delete[] neighbors; - neighbors=NULL; -} - -template< class NodeData > -template< unsigned int LeftRadius , unsigned int RightRadius > -void OctNode< NodeData >::ConstNeighborKey< LeftRadius , RightRadius >::set( int d ) -{ - if( neighbors ) delete[] neighbors; - neighbors = NULL; - _depth = d; - if( d<0 ) return; - neighbors = new ConstNeighbors< Width >[d+1]; -} -template< class NodeData > -template< unsigned int LeftRadius , unsigned int RightRadius > -typename OctNode< NodeData >::template ConstNeighbors< LeftRadius+RightRadius+1 >& OctNode< NodeData >::ConstNeighborKey< LeftRadius , RightRadius >::getNeighbors( const OctNode< NodeData >* node ) -{ - ConstNeighbors< Width >& neighbors = this->neighbors[ node->depth() ]; - if( node!=neighbors.neighbors[LeftRadius][LeftRadius][LeftRadius]) - { - neighbors.clear(); - - if( !node->parent ) neighbors.neighbors[LeftRadius][LeftRadius][LeftRadius] = node; - else - { - ConstNeighbors< Width >& pNeighbors = getNeighbors( node->parent ); - - // Get the indices of the child node that would contain the point (and its antipode) - int cx , cy , cz; - Cube::FactorCornerIndex( (int)( node - node->parent->children ) , cx , cy , cz ); - - - // Iterate over the finer neighbors and set them (if you can) - // Here: - // (x,y,z) give the position of the finer nodes relative to the center, - // (_x,_y,_z) give a positive global position, up to an even offset, and - // (px-LeftRadius,py-LeftRadius,pz-LeftRadius) give the positions of their parents relative to the parent of the center - for( int z=-(int)LeftRadius ; z<=(int)RightRadius ; z++ ) - { - int _z = (z+cz) + (LeftRadius<<1) , pz = ( _z>>1 ) , zz = z+LeftRadius; - for( int y=-(int)LeftRadius ; y<=(int)RightRadius ; y++ ) - { - int _y = (y+cy) + (LeftRadius<<1) , py = ( _y>>1 ) , yy = y+LeftRadius; - - int cornerIndex = ( (_z&1)<<2 ) | ( (_y&1)<<1 ); - for( int x=-(int)LeftRadius ; x<=(int)RightRadius ; x++ ) - { - int _x = (x+cx) + (LeftRadius<<1) , px = ( _x>>1 ) , xx = x+LeftRadius; - if( pNeighbors.neighbors[px][py][pz] && pNeighbors.neighbors[px][py][pz]->children ) - neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); - else - neighbors.neighbors[xx][yy][zz] = NULL; - } - } - } - } - } - return neighbors; -} -template< class NodeData > -template< unsigned int LeftRadius , unsigned int RightRadius > -template< unsigned int _LeftRadius , unsigned int _RightRadius > -void OctNode< NodeData >::ConstNeighborKey< LeftRadius , RightRadius >::getNeighbors( const OctNode< NodeData >* node , ConstNeighbors< _LeftRadius+_RightRadius+1 >& neighbors ) -{ - neighbors.clear(); - if( !node ) return; - - // [WARNING] This estimate of the required radius is somewhat conservative if the readius is odd (depending on where the node is relative to its parent) - const unsigned int _PLeftRadius = (_LeftRadius+1)/2 , _PRightRadius = (_RightRadius+1)/2; - // If we are at the root of the tree, we are done - if( !node->parent ) neighbors.neighbors[_LeftRadius][_LeftRadius][_LeftRadius] = node; - // If we can get the data from the the key for the parent node, do that - else if( _PLeftRadius<=LeftRadius && _PRightRadius<=RightRadius ) - { - getNeighbors( node->parent ); - const ConstNeighbors< LeftRadius + RightRadius + 1 >& pNeighbors = this->neighbors[ node->depth()-1 ]; - // Get the indices of the child node that would contain the point (and its antipode) - int cx , cy , cz; - Cube::FactorCornerIndex( (int)( node - node->parent->children ) , cx , cy , cz ); - - - // Iterate over the finer neighbors - // Here: - // (x,y,z) give the position of the finer nodes relative to the center, - // (_x,_y,_z) give a positive global position, up to an even offset, and - // (px-LeftRadius,py-LeftRadius,pz-LeftRadius) give the positions of their parents relative to the parent of the center - for( int z=-(int)_LeftRadius ; z<=(int)_RightRadius ; z++ ) - { - int _z = (z+cz) + (_LeftRadius<<1) , pz = ( _z>>1 ) - _LeftRadius + LeftRadius , zz = z + _LeftRadius; - for( int y=-(int)_LeftRadius ; y<=(int)_RightRadius ; y++ ) - { - int _y = (y+cy) + (_LeftRadius<<1) , py = ( _y>>1 ) - _LeftRadius + LeftRadius , yy = y + _LeftRadius; - - int cornerIndex = ( (_z&1)<<2 ) | ( (_y&1)<<1 ); - for( int x=-(int)_LeftRadius ; x<=(int)_RightRadius ; x++ ) - { - int _x = (x+cx) + (_LeftRadius<<1) , px = ( _x>>1 ) - _LeftRadius + LeftRadius , xx = x + _LeftRadius; - if( pNeighbors.neighbors[px][py][pz] && pNeighbors.neighbors[px][py][pz]->children ) - neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); - else - neighbors.neighbors[xx][yy][zz] = NULL; - } - } - } - } - // Otherwise recurse - else - { - ConstNeighbors< _PLeftRadius + _PRightRadius + 1 > pNeighbors; - getNeighbors< _PLeftRadius , _PRightRadius >( node->parent , pNeighbors ); - - // Get the indices of the child node that would contain the point (and its antipode) - int cx , cy , cz; - Cube::FactorCornerIndex( (int)( node - node->parent->children ) , cx , cy , cz ); - - - // Iterate over the finer neighbors - // Here: - // (x,y,z) give the position of the finer nodes relative to the center, - // (_x,_y,_z) give a positive global position, up to an even offset, and - // (px-LeftRadius,py-LeftRadius,pz-LeftRadius) give the positions of their parents relative to the parent of the center - for( int z=-(int)_LeftRadius ; z<=(int)_RightRadius ; z++ ) - { - int _z = (z+cz) + (_LeftRadius<<1) , pz = ( _z>>1 ) - _LeftRadius + _PLeftRadius , zz = z + _LeftRadius; - for( int y=-(int)_LeftRadius ; y<=(int)_RightRadius ; y++ ) - { - int _y = (y+cy) + (_LeftRadius<<1) , py = ( _y>>1 ) - _LeftRadius + _PLeftRadius , yy = y + _LeftRadius; - - int cornerIndex = ( (_z&1)<<2 ) | ( (_y&1)<<1 ); - for( int x=-(int)_LeftRadius ; x<=(int)_RightRadius ; x++ ) - { - int _x = (x+cx) + (_LeftRadius<<1) , px = ( _x>>1 ) - _LeftRadius + _PLeftRadius , xx = x + _LeftRadius; - - if( pNeighbors.neighbors[px][py][pz] && pNeighbors.neighbors[px][py][pz]->children ) - neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); - else - neighbors.neighbors[xx][yy][zz] = NULL; - } - } - } - } - return; -} - -template< class NodeData > -int OctNode< NodeData >::write(const char* fileName) const{ - FILE* fp=fopen(fileName,"wb"); - if(!fp){return 0;} - int ret=write(fp); - fclose(fp); - return ret; -} -template< class NodeData > -int OctNode< NodeData >::write(FILE* fp) const{ - fwrite(this,sizeof(OctNode< NodeData >),1,fp); - if(children){for(int i=0;i -int OctNode< NodeData >::read(const char* fileName){ - FILE* fp=fopen(fileName,"rb"); - if(!fp){return 0;} - int ret=read(fp); - fclose(fp); - return ret; -} -template< class NodeData > -int OctNode< NodeData >::read(FILE* fp){ - fread(this,sizeof(OctNode< NodeData >),1,fp); - parent=NULL; - if(children){ - children=NULL; - initChildren(); - for(int i=0;i -int OctNode< NodeData >::width(int maxDepth) const { - int d=depth(); - return 1<<(maxDepth-d); -} -template< class NodeData > -void OctNode< NodeData >::centerIndex(int maxDepth,int index[DIMENSION]) const -{ - int d,o[3]; - depthAndOffset(d,o); - for(int i=0;i +#include +#include + +///////////// +// OctNode // +///////////// +template< class NodeData > const int OctNode< NodeData >::DepthShift=5; +template< class NodeData > const int OctNode< NodeData >::OffsetShift = ( sizeof(long long)*8 - DepthShift ) / 3; +template< class NodeData > const int OctNode< NodeData >::DepthMask=(1< const int OctNode< NodeData >::OffsetMask=(1< const int OctNode< NodeData >::OffsetShift1=DepthShift; +template< class NodeData > const int OctNode< NodeData >::OffsetShift2=OffsetShift1+OffsetShift; +template< class NodeData > const int OctNode< NodeData >::OffsetShift3=OffsetShift2+OffsetShift; + +template< class NodeData > int OctNode< NodeData >::UseAlloc=0; +template< class NodeData > Allocator > OctNode< NodeData >::NodeAllocator; + +template< class NodeData > +void OctNode< NodeData >::SetAllocator(int blockSize) +{ + if(blockSize>0) + { + UseAlloc=1; + NodeAllocator.set(blockSize); + } + else{UseAlloc=0;} +} +template< class NodeData > +int OctNode< NodeData >::UseAllocator(void){return UseAlloc;} + +template< class NodeData > +OctNode< NodeData >::OctNode(void){ + parent=children=NULL; + _depthAndOffset = 0; +} + +template< class NodeData > +OctNode< NodeData >::~OctNode(void){ + if(!UseAlloc){if(children){delete[] children;}} + parent=children=NULL; +} +template< class NodeData > +void OctNode< NodeData >::setFullDepth( int maxDepth ) +{ + if( maxDepth ) + { + if( !children ) initChildren(); + for( int i=0 ; i<8 ; i++ ) children[i].setFullDepth( maxDepth-1 ); + } +} + +template< class NodeData > +int OctNode< NodeData >::initChildren( void ) +{ + if( UseAlloc ) children=NodeAllocator.newElements(8); + else + { + if( children ) delete[] children; + children = NULL; + children = new OctNode[Cube::CORNERS]; + } + if( !children ) + { + fprintf(stderr,"Failed to initialize children in OctNode::initChildren\n"); + exit(0); + return 0; + } + int d , off[3]; + depthAndOffset( d , off ); + for( int i=0 ; i<2 ; i++ ) for( int j=0 ; j<2 ; j++ ) for( int k=0 ; k<2 ; k++ ) + { + int idx=Cube::CornerIndex(i,j,k); + children[idx].parent = this; + children[idx].children = NULL; + int off2[3]; + off2[0] = (off[0]<<1)+i; + off2[1] = (off[1]<<1)+j; + off2[2] = (off[2]<<1)+k; + children[idx]._depthAndOffset = Index( d+1 , off2 ); + } + return 1; +} +template< class NodeData > +inline void OctNode< NodeData >::Index(int depth,const int offset[3],short& d,short off[3]){ + d=short(depth); + off[0]=short((1< +inline void OctNode< NodeData >::depthAndOffset( int& depth , int offset[DIMENSION] ) const +{ + depth = int( _depthAndOffset & DepthMask ); + offset[0] = int( (_depthAndOffset>>OffsetShift1) & OffsetMask ); + offset[1] = int( (_depthAndOffset>>OffsetShift2) & OffsetMask ); + offset[2] = int( (_depthAndOffset>>OffsetShift3) & OffsetMask ); +} +template< class NodeData > +inline void OctNode< NodeData >::centerIndex( int index[DIMENSION] ) const +{ + int d , off[DIMENSION]; + depthAndOffset( d , off ); + for( int i=0 ; i +inline unsigned long long OctNode< NodeData >::Index( int depth , const int offset[3] ) +{ + unsigned long long idx=0; + idx |= ( ( (unsigned long long)(depth ) ) & DepthMask ); + idx |= ( ( (unsigned long long)(offset[0]) ) & OffsetMask ) << OffsetShift1; + idx |= ( ( (unsigned long long)(offset[1]) ) & OffsetMask ) << OffsetShift2; + idx |= ( ( (unsigned long long)(offset[2]) ) & OffsetMask ) << OffsetShift3; + return idx; +} +template< class NodeData > +inline int OctNode< NodeData >::depth( void ) const {return int( _depthAndOffset & DepthMask );} +template< class NodeData > +inline void OctNode< NodeData >::DepthAndOffset(const long long& index,int& depth,int offset[3]){ + depth=int(index&DepthMask); + offset[0]=(int((index>>OffsetShift1)&OffsetMask)+1)&(~(1<>OffsetShift2)&OffsetMask)+1)&(~(1<>OffsetShift3)&OffsetMask)+1)&(~(1< +inline int OctNode< NodeData >::Depth(const long long& index){return int(index&DepthMask);} +template< class NodeData > +template< class Real > +void OctNode< NodeData >::centerAndWidth( Point3D& center , Real& width ) const +{ + int depth , offset[3]; + depthAndOffset( depth , offset ); + width = Real( 1.0 / (1< +template< class Real > +void OctNode< NodeData >::startAndWidth( Point3D& start , Real& width ) const +{ + int depth , offset[3]; + depthAndOffset( depth , offset ); + width = Real( 1.0 / (1< +template< class Real > +bool OctNode< NodeData >::isInside( Point3D< Real > p ) const +{ + Point3D< Real > c; + Real w; + centerAndWidth( c , w ); + w /= 2; + return (c[0]-w) +template< class Real > +inline void OctNode< NodeData >::CenterAndWidth(const long long& index,Point3D& center,Real& width){ + int depth,offset[3]; + depth=index&DepthMask; + offset[0]=(int((index>>OffsetShift1)&OffsetMask)+1)&(~(1<>OffsetShift2)&OffsetMask)+1)&(~(1<>OffsetShift3)&OffsetMask)+1)&(~(1< +template< class Real > +inline void OctNode< NodeData >::StartAndWidth( const long long& index , Point3D< Real >& start , Real& width ) +{ + int depth,offset[3]; + depth = index&DepthMask; + offset[0] = (int((index>>OffsetShift1)&OffsetMask)+1)&(~(1<>OffsetShift2)&OffsetMask)+1)&(~(1<>OffsetShift3)&OffsetMask)+1)&(~(1< +int OctNode< NodeData >::maxDepth(void) const{ + if(!children){return 0;} + else{ + int c,d; + for(int i=0;ic){c=d;} + } + return c+1; + } +} +template< class NodeData > +size_t OctNode< NodeData >::nodes( void ) const +{ + if( !children ) return 1; + else + { + size_t c=0; + for( int i=0 ; i +size_t OctNode< NodeData >::leaves( void ) const +{ + if( !children ) return 1; + else + { + size_t c=0; + for( int i=0 ; i +size_t OctNode< NodeData >::maxDepthLeaves( int maxDepth ) const +{ + if( depth()>maxDepth ) return 0; + if( !children ) return 1; + else + { + size_t c=0; + for( int i=0 ; i +const OctNode< NodeData >* OctNode< NodeData >::root(void) const{ + const OctNode* temp=this; + while(temp->parent){temp=temp->parent;} + return temp; +} + + +template< class NodeData > +const OctNode< NodeData >* OctNode< NodeData >::nextBranch( const OctNode* current ) const +{ + if( !current->parent || current==this ) return NULL; + if(current-current->parent->children==Cube::CORNERS-1) return nextBranch( current->parent ); + else return current+1; +} +template< class NodeData > +OctNode< NodeData >* OctNode< NodeData >::nextBranch(OctNode* current){ + if(!current->parent || current==this){return NULL;} + if(current-current->parent->children==Cube::CORNERS-1){return nextBranch(current->parent);} + else{return current+1;} +} +template< class NodeData > +const OctNode< NodeData >* OctNode< NodeData >::prevBranch( const OctNode* current ) const +{ + if( !current->parent || current==this ) return NULL; + if( current-current->parent->children==0 ) return prevBranch( current->parent ); + else return current-1; +} +template< class NodeData > +OctNode< NodeData >* OctNode< NodeData >::prevBranch( OctNode* current ) +{ + if( !current->parent || current==this ) return NULL; + if( current-current->parent->children==0 ) return prevBranch( current->parent ); + else return current-1; +} +template< class NodeData > +const OctNode< NodeData >* OctNode< NodeData >::nextLeaf(const OctNode* current) const{ + if(!current){ + const OctNode< NodeData >* temp=this; + while(temp->children){temp=&temp->children[0];} + return temp; + } + if(current->children){return current->nextLeaf();} + const OctNode* temp=nextBranch(current); + if(!temp){return NULL;} + else{return temp->nextLeaf();} +} +template< class NodeData > +OctNode< NodeData >* OctNode< NodeData >::nextLeaf(OctNode* current){ + if(!current){ + OctNode< NodeData >* temp=this; + while(temp->children){temp=&temp->children[0];} + return temp; + } + if(current->children){return current->nextLeaf();} + OctNode* temp=nextBranch(current); + if(!temp){return NULL;} + else{return temp->nextLeaf();} +} + +template< class NodeData > +const OctNode< NodeData >* OctNode< NodeData >::nextNode( const OctNode* current ) const +{ + if( !current ) return this; + else if( current->children ) return ¤t->children[0]; + else return nextBranch(current); +} +template< class NodeData > +OctNode< NodeData >* OctNode< NodeData >::nextNode( OctNode* current ) +{ + if( !current ) return this; + else if( current->children ) return ¤t->children[0]; + else return nextBranch( current ); +} + +template< class NodeData > +void OctNode< NodeData >::printRange(void) const +{ + Point3D< float > center; + float width; + centerAndWidth(center,width); + for(int dim=0;dim +template< class Real > +int OctNode< NodeData >::CornerIndex(const Point3D& center,const Point3D& p){ + int cIndex=0; + if(p.coords[0]>center.coords[0]){cIndex|=1;} + if(p.coords[1]>center.coords[1]){cIndex|=2;} + if(p.coords[2]>center.coords[2]){cIndex|=4;} + return cIndex; +} + +template< class NodeData > +OctNode< NodeData >* OctNode< NodeData >::faceNeighbor(int faceIndex,int forceChildren){return __faceNeighbor(faceIndex>>1,faceIndex&1,forceChildren);} +template< class NodeData > +const OctNode< NodeData >* OctNode< NodeData >::faceNeighbor(int faceIndex) const {return __faceNeighbor(faceIndex>>1,faceIndex&1);} +template< class NodeData > +OctNode< NodeData >* OctNode< NodeData >::__faceNeighbor(int dir,int off,int forceChildren){ + if(!parent){return NULL;} + int pIndex=int(this-parent->children); + pIndex^=(1<children[pIndex];} + else{ + OctNode* temp=parent->__faceNeighbor(dir,off,forceChildren); + if(!temp){return NULL;} + if(!temp->children){ + if(forceChildren){temp->initChildren();} + else{return temp;} + } + return &temp->children[pIndex]; + } +} +template< class NodeData > +const OctNode< NodeData >* OctNode< NodeData >::__faceNeighbor(int dir,int off) const { + if(!parent){return NULL;} + int pIndex=int(this-parent->children); + pIndex^=(1<children[pIndex];} + else{ + const OctNode* temp=parent->__faceNeighbor(dir,off); + if(!temp || !temp->children){return temp;} + else{return &temp->children[pIndex];} + } +} + +template< class NodeData > +OctNode< NodeData >* OctNode< NodeData >::edgeNeighbor(int edgeIndex,int forceChildren){ + int idx[2],o,i[2]; + Cube::FactorEdgeIndex(edgeIndex,o,i[0],i[1]); + switch(o){ + case 0: idx[0]=1; idx[1]=2; break; + case 1: idx[0]=0; idx[1]=2; break; + case 2: idx[0]=0; idx[1]=1; break; + }; + return __edgeNeighbor(o,i,idx,forceChildren); +} +template< class NodeData > +const OctNode< NodeData >* OctNode< NodeData >::edgeNeighbor(int edgeIndex) const { + int idx[2],o,i[2]; + Cube::FactorEdgeIndex(edgeIndex,o,i[0],i[1]); + switch(o){ + case 0: idx[0]=1; idx[1]=2; break; + case 1: idx[0]=0; idx[1]=2; break; + case 2: idx[0]=0; idx[1]=1; break; + }; + return __edgeNeighbor(o,i,idx); +} +template< class NodeData > +const OctNode< NodeData >* OctNode< NodeData >::__edgeNeighbor(int o,const int i[2],const int idx[2]) const{ + if(!parent){return NULL;} + int pIndex=int(this-parent->children); + int aIndex,x[DIMENSION]; + + Cube::FactorCornerIndex(pIndex,x[0],x[1],x[2]); + aIndex=(~((i[0] ^ x[idx[0]]) | ((i[1] ^ x[idx[1]])<<1))) & 3; + pIndex^=(7 ^ (1<__faceNeighbor(idx[0],i[0]); + if(!temp || !temp->children){return NULL;} + else{return &temp->children[pIndex];} + } + else if(aIndex==2) { // I can get the neighbor from the parent's face adjacent neighbor + const OctNode* temp=parent->__faceNeighbor(idx[1],i[1]); + if(!temp || !temp->children){return NULL;} + else{return &temp->children[pIndex];} + } + else if(aIndex==0) { // I can get the neighbor from the parent + return &parent->children[pIndex]; + } + else if(aIndex==3) { // I can get the neighbor from the parent's edge adjacent neighbor + const OctNode* temp=parent->__edgeNeighbor(o,i,idx); + if(!temp || !temp->children){return temp;} + else{return &temp->children[pIndex];} + } + else{return NULL;} +} +template< class NodeData > +OctNode< NodeData >* OctNode< NodeData >::__edgeNeighbor(int o,const int i[2],const int idx[2],int forceChildren){ + if(!parent){return NULL;} + int pIndex=int(this-parent->children); + int aIndex,x[DIMENSION]; + + Cube::FactorCornerIndex(pIndex,x[0],x[1],x[2]); + aIndex=(~((i[0] ^ x[idx[0]]) | ((i[1] ^ x[idx[1]])<<1))) & 3; + pIndex^=(7 ^ (1<__faceNeighbor(idx[0],i[0],0); + if(!temp || !temp->children){return NULL;} + else{return &temp->children[pIndex];} + } + else if(aIndex==2) { // I can get the neighbor from the parent's face adjacent neighbor + OctNode* temp=parent->__faceNeighbor(idx[1],i[1],0); + if(!temp || !temp->children){return NULL;} + else{return &temp->children[pIndex];} + } + else if(aIndex==0) { // I can get the neighbor from the parent + return &parent->children[pIndex]; + } + else if(aIndex==3) { // I can get the neighbor from the parent's edge adjacent neighbor + OctNode* temp=parent->__edgeNeighbor(o,i,idx,forceChildren); + if(!temp){return NULL;} + if(!temp->children){ + if(forceChildren){temp->initChildren();} + else{return temp;} + } + return &temp->children[pIndex]; + } + else{return NULL;} +} + +template< class NodeData > +const OctNode< NodeData >* OctNode< NodeData >::cornerNeighbor(int cornerIndex) const { + int pIndex,aIndex=0; + if(!parent){return NULL;} + + pIndex=int(this-parent->children); + aIndex=(cornerIndex ^ pIndex); // The disagreement bits + pIndex=(~pIndex)&7; // The antipodal point + if(aIndex==7){ // Agree on no bits + return &parent->children[pIndex]; + } + else if(aIndex==0){ // Agree on all bits + const OctNode* temp=((const OctNode*)parent)->cornerNeighbor(cornerIndex); + if(!temp || !temp->children){return temp;} + else{return &temp->children[pIndex];} + } + else if(aIndex==6){ // Agree on face 0 + const OctNode* temp=((const OctNode*)parent)->__faceNeighbor(0,cornerIndex & 1); + if(!temp || !temp->children){return NULL;} + else{return & temp->children[pIndex];} + } + else if(aIndex==5){ // Agree on face 1 + const OctNode* temp=((const OctNode*)parent)->__faceNeighbor(1,(cornerIndex & 2)>>1); + if(!temp || !temp->children){return NULL;} + else{return & temp->children[pIndex];} + } + else if(aIndex==3){ // Agree on face 2 + const OctNode* temp=((const OctNode*)parent)->__faceNeighbor(2,(cornerIndex & 4)>>2); + if(!temp || !temp->children){return NULL;} + else{return & temp->children[pIndex];} + } + else if(aIndex==4){ // Agree on edge 2 + const OctNode* temp=((const OctNode*)parent)->edgeNeighbor(8 | (cornerIndex & 1) | (cornerIndex & 2) ); + if(!temp || !temp->children){return NULL;} + else{return & temp->children[pIndex];} + } + else if(aIndex==2){ // Agree on edge 1 + const OctNode* temp=((const OctNode*)parent)->edgeNeighbor(4 | (cornerIndex & 1) | ((cornerIndex & 4)>>1) ); + if(!temp || !temp->children){return NULL;} + else{return & temp->children[pIndex];} + } + else if(aIndex==1){ // Agree on edge 0 + const OctNode* temp=((const OctNode*)parent)->edgeNeighbor(((cornerIndex & 2) | (cornerIndex & 4))>>1 ); + if(!temp || !temp->children){return NULL;} + else{return & temp->children[pIndex];} + } + else{return NULL;} +} +template< class NodeData > +OctNode< NodeData >* OctNode< NodeData >::cornerNeighbor(int cornerIndex,int forceChildren){ + int pIndex,aIndex=0; + if(!parent){return NULL;} + + pIndex=int(this-parent->children); + aIndex=(cornerIndex ^ pIndex); // The disagreement bits + pIndex=(~pIndex)&7; // The antipodal point + if(aIndex==7){ // Agree on no bits + return &parent->children[pIndex]; + } + else if(aIndex==0){ // Agree on all bits + OctNode* temp=((OctNode*)parent)->cornerNeighbor(cornerIndex,forceChildren); + if(!temp){return NULL;} + if(!temp->children){ + if(forceChildren){temp->initChildren();} + else{return temp;} + } + return &temp->children[pIndex]; + } + else if(aIndex==6){ // Agree on face 0 + OctNode* temp=((OctNode*)parent)->__faceNeighbor(0,cornerIndex & 1,0); + if(!temp || !temp->children){return NULL;} + else{return & temp->children[pIndex];} + } + else if(aIndex==5){ // Agree on face 1 + OctNode* temp=((OctNode*)parent)->__faceNeighbor(1,(cornerIndex & 2)>>1,0); + if(!temp || !temp->children){return NULL;} + else{return & temp->children[pIndex];} + } + else if(aIndex==3){ // Agree on face 2 + OctNode* temp=((OctNode*)parent)->__faceNeighbor(2,(cornerIndex & 4)>>2,0); + if(!temp || !temp->children){return NULL;} + else{return & temp->children[pIndex];} + } + else if(aIndex==4){ // Agree on edge 2 + OctNode* temp=((OctNode*)parent)->edgeNeighbor(8 | (cornerIndex & 1) | (cornerIndex & 2) ); + if(!temp || !temp->children){return NULL;} + else{return & temp->children[pIndex];} + } + else if(aIndex==2){ // Agree on edge 1 + OctNode* temp=((OctNode*)parent)->edgeNeighbor(4 | (cornerIndex & 1) | ((cornerIndex & 4)>>1) ); + if(!temp || !temp->children){return NULL;} + else{return & temp->children[pIndex];} + } + else if(aIndex==1){ // Agree on edge 0 + OctNode* temp=((OctNode*)parent)->edgeNeighbor(((cornerIndex & 2) | (cornerIndex & 4))>>1 ); + if(!temp || !temp->children){return NULL;} + else{return & temp->children[pIndex];} + } + else{return NULL;} +} + +//////////////////////// +// OctNode::Neighbors // +//////////////////////// +template< class NodeData > +template< unsigned int Width > +OctNode< NodeData >::Neighbors< Width >::Neighbors( void ){ clear(); } +template< class NodeData > +template< unsigned int Width > +void OctNode< NodeData >::Neighbors< Width >::clear( void ){ for( int i=0 ; i +template< unsigned int Width > +OctNode< NodeData >::ConstNeighbors< Width >::ConstNeighbors( void ){ clear(); } +template< class NodeData > +template< unsigned int Width > +void OctNode< NodeData >::ConstNeighbors< Width >::clear( void ){ for( int i=0 ; i +template< unsigned int LeftRadius , unsigned int RightRadius > +OctNode< NodeData >::NeighborKey< LeftRadius , RightRadius >::NeighborKey( void ){ _depth=-1 , neighbors=NULL; } +template< class NodeData > +template< unsigned int LeftRadius , unsigned int RightRadius > +OctNode< NodeData >::NeighborKey< LeftRadius , RightRadius >::NeighborKey( const NeighborKey& nKey ) +{ + _depth = 0 , neighbors = NULL; + set( nKey._depth ); + for( int d=0 ; d<=_depth ; d++ ) memcpy( &neighbors[d] , &nKey.neighbors[d] , sizeof( Neighbors< Width > ) ); +} +template< class NodeData > +template< unsigned int LeftRadius , unsigned int RightRadius > +OctNode< NodeData >::NeighborKey< LeftRadius , RightRadius >::~NeighborKey( void ) +{ + if( neighbors ) delete[] neighbors; + neighbors = NULL; +} + +template< class NodeData > +template< unsigned int LeftRadius , unsigned int RightRadius > +void OctNode< NodeData >::NeighborKey< LeftRadius , RightRadius >::set( int d ) +{ + if( neighbors ) delete[] neighbors; + neighbors = NULL; + _depth = d; + if( d<0 ) return; + neighbors = new Neighbors< Width >[d+1]; +} +template< class NodeData > +template< unsigned int LeftRadius , unsigned int RightRadius > +template< bool CreateNodes > +bool OctNode< NodeData >::NeighborKey< LeftRadius , RightRadius >::getChildNeighbors( int cIdx , int d , Neighbors< Width >& cNeighbors ) const +{ + Neighbors< Width >& pNeighbors = neighbors[d]; + // Check that we actuall have a center node + if( !pNeighbors.neighbors[LeftRadius][LeftRadius][LeftRadius] ) return false; + + // Get the indices of the child node that would contain the point (and its antipode) + int cx , cy , cz; + Cube::FactorCornerIndex( cIdx , cx , cy , cz ); + + + // Iterate over the finer neighbors and set them (if you can) + // Here: + // (x,y,z) give the position of the finer nodes relative to the center, + // (_x,_y,_z) give a positive global position, up to an even offset, and + // (px-LeftRadius,py-LeftRadius,pz-LeftRadius) give the positions of their parents relative to the parent of the center + for( int z=-(int)LeftRadius ; z<=(int)RightRadius ; z++ ) + { + int _z = (z+cz) + (LeftRadius<<1) , pz = ( _z>>1 ) , zz = z+LeftRadius; + for( int y=-(int)LeftRadius ; y<=(int)RightRadius ; y++ ) + { + int _y = (y+cy) + (LeftRadius<<1) , py = ( _y>>1 ) , yy = y+LeftRadius; + + int cornerIndex = ( (_z&1)<<2 ) | ( (_y&1)<<1 ); + for( int x=-(int)LeftRadius ; x<=(int)RightRadius ; x++ ) + { + int _x = (x+cx) + (LeftRadius<<1) , px = ( _x>>1 ) , xx = x+LeftRadius; + + if( CreateNodes ) + { + if( pNeighbors.neighbors[px][py][pz] ) + { + if( !pNeighbors.neighbors[px][py][pz]->children ) pNeighbors.neighbors[px][py][pz]->initChildren(); + cNeighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); + } + else cNeighbors.neighbors[xx][yy][zz] = NULL; + } + else + { + if( pNeighbors.neighbors[px][py][pz] && pNeighbors.neighbors[px][py][pz]->children ) + cNeighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); + else cNeighbors.neighbors[xx][yy][zz] = NULL; + } + } + } + } + return true; +} +template< class NodeData > +template< unsigned int LeftRadius , unsigned int RightRadius > +template< bool CreateNodes , class Real > +bool OctNode< NodeData >::NeighborKey< LeftRadius , RightRadius >::getChildNeighbors( Point3D< Real > p , int d , Neighbors< Width >& cNeighbors ) const +{ + Neighbors< Width >& pNeighbors = neighbors[d]; + // Check that we actuall have a center node + if( !pNeighbors.neighbors[LeftRadius][LeftRadius][LeftRadius] ) return false; + Point3D< Real > c; + Real w; + pNeighbors.neighbors[LeftRadius][LeftRadius][LeftRadius]->centerAndWidth( c , w ); + return getChildNeighbors< CreateNodes >( CornerIndex( c , p ) , d , cNeighbors ); +} + +template< class NodeData > +template< unsigned int LeftRadius , unsigned int RightRadius > +template< bool CreateNodes > +typename OctNode< NodeData >::template Neighbors< LeftRadius+RightRadius+1 >& OctNode< NodeData >::NeighborKey< LeftRadius , RightRadius >::getNeighbors( OctNode< NodeData >* node ) +{ + Neighbors< Width >& neighbors = this->neighbors[ node->depth() ]; + if( node==neighbors.neighbors[LeftRadius][LeftRadius][LeftRadius] ) + { + bool reset = false; + for( int i=0 ; iparent ) neighbors.neighbors[LeftRadius][LeftRadius][LeftRadius] = node; + else + { + Neighbors< Width >& pNeighbors = getNeighbors< CreateNodes >( node->parent ); + + + // Get the indices of the child node that would contain the point (and its antipode) + int cx , cy , cz; + Cube::FactorCornerIndex( (int)( node - node->parent->children ) , cx , cy , cz ); + + + // Iterate over the finer neighbors and set them (if you can) + // Here: + // (x,y,z) give the position of the finer nodes relative to the center, + // (_x,_y,_z) give a positive global position, up to an even offset, and + // (px-LeftRadius,py-LeftRadius,pz-LeftRadius) give the positions of their parents relative to the parent of the center + for( int z=-(int)LeftRadius ; z<=(int)RightRadius ; z++ ) + { + int _z = (z+cz) + (LeftRadius<<1) , pz = ( _z>>1 ) , zz = z+LeftRadius; + for( int y=-(int)LeftRadius ; y<=(int)RightRadius ; y++ ) + { + int _y = (y+cy) + (LeftRadius<<1) , py = ( _y>>1 ) , yy = y+LeftRadius; + + int cornerIndex = ( (_z&1)<<2 ) | ( (_y&1)<<1 ); + for( int x=-(int)LeftRadius ; x<=(int)RightRadius ; x++ ) + { + int _x = (x+cx) + (LeftRadius<<1) , px = ( _x>>1 ) , xx = x+LeftRadius; + if( CreateNodes ) + { + if( pNeighbors.neighbors[px][py][pz] ) + { + if( !pNeighbors.neighbors[px][py][pz]->children ) pNeighbors.neighbors[px][py][pz]->initChildren(); + neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); + } + else neighbors.neighbors[xx][yy][zz] = NULL; + } + else + { + if( pNeighbors.neighbors[px][py][pz] && pNeighbors.neighbors[px][py][pz]->children ) + neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); + else neighbors.neighbors[xx][yy][zz] = NULL; + } + } + } + } + } + } + return neighbors; +} +template< class NodeData > +template< unsigned int LeftRadius , unsigned int RightRadius > +template< bool CreateNodes , unsigned int _LeftRadius , unsigned int _RightRadius > +void OctNode< NodeData >::NeighborKey< LeftRadius , RightRadius >::getNeighbors( OctNode< NodeData >* node , Neighbors< _LeftRadius + _RightRadius + 1 >& neighbors ) +{ + neighbors.clear(); + if( !node ) return; + + // [WARNING] This estimate of the required radius is somewhat conservative if the radius is odd (depending on where the node is relative to its parent) + const unsigned int _PLeftRadius = (_LeftRadius+1)/2 , _PRightRadius = (_RightRadius+1)/2; + // If we are at the root of the tree, we are done + if( !node->parent ) neighbors.neighbors[_LeftRadius][_LeftRadius][_LeftRadius] = node; + // If we can get the data from the the key for the parent node, do that + else if( _PLeftRadius<=LeftRadius && _PRightRadius<=RightRadius ) + { + getNeighbors< CreateNodes >( node->parent ); + const Neighbors< LeftRadius + RightRadius + 1 >& pNeighbors = this->neighbors[ node->depth()-1 ]; + // Get the indices of the child node that would contain the point (and its antipode) + int cx , cy , cz; + Cube::FactorCornerIndex( (int)( node - node->parent->children ) , cx , cy , cz ); + + + // Iterate over the finer neighbors + // Here: + // (x,y,z) give the position of the finer nodes relative to the center, + // (_x,_y,_z) give a positive global position, up to an even offset, and + // (px-LeftRadius,py-LeftRadius,pz-LeftRadius) give the positions of their parents relative to the parent of the center + for( int z=-(int)_LeftRadius ; z<=(int)_RightRadius ; z++ ) + { + int _z = (z+cz) + (_LeftRadius<<1) , pz = ( _z>>1 ) - _LeftRadius + LeftRadius , zz = z + _LeftRadius; + for( int y=-(int)_LeftRadius ; y<=(int)_RightRadius ; y++ ) + { + int _y = (y+cy) + (_LeftRadius<<1) , py = ( _y>>1 ) - _LeftRadius + LeftRadius , yy = y + _LeftRadius; + + int cornerIndex = ( (_z&1)<<2 ) | ( (_y&1)<<1 ); + for( int x=-(int)_LeftRadius ; x<=(int)_RightRadius ; x++ ) + { + int _x = (x+cx) + (_LeftRadius<<1) , px = ( _x>>1 ) - _LeftRadius + LeftRadius , xx = x + _LeftRadius; + if( CreateNodes ) + { + if( pNeighbors.neighbors[px][py][pz] ) + { + if( !pNeighbors.neighbors[px][py][pz]->children ) pNeighbors.neighbors[px][py][pz]->initChildren(); + neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); + } + else neighbors.neighbors[xx][yy][zz] = NULL; + } + else + { + if( pNeighbors.neighbors[px][py][pz] && pNeighbors.neighbors[px][py][pz]->children ) + neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); + else neighbors.neighbors[xx][yy][zz] = NULL; + } + } + } + } + } + // Otherwise recurse + else + { + Neighbors< _PLeftRadius + _PRightRadius + 1 > pNeighbors; + getNeighbors< CreateNodes , _PLeftRadius , _PRightRadius >( node->parent , pNeighbors ); + + // Get the indices of the child node that would contain the point (and its antipode) + int cx , cy , cz; + Cube::FactorCornerIndex( (int)( node - node->parent->children ) , cx , cy , cz ); + + + // Iterate over the finer neighbors + // Here: + // (x,y,z) give the position of the finer nodes relative to the center, + // (_x,_y,_z) give a positive global position, up to an even offset, and + // (px-LeftRadius,py-LeftRadius,pz-LeftRadius) give the positions of their parents relative to the parent of the center + for( int z=-(int)_LeftRadius ; z<=(int)_RightRadius ; z++ ) + { + int _z = (z+cz) + (_LeftRadius<<1) , pz = ( _z>>1 ) - _LeftRadius + _PLeftRadius , zz = z + _LeftRadius; + for( int y=-(int)_LeftRadius ; y<=(int)_RightRadius ; y++ ) + { + int _y = (y+cy) + (_LeftRadius<<1) , py = ( _y>>1 ) - _LeftRadius + _PLeftRadius , yy = y + _LeftRadius; + + int cornerIndex = ( (_z&1)<<2 ) | ( (_y&1)<<1 ); + for( int x=-(int)_LeftRadius ; x<=(int)_RightRadius ; x++ ) + { + int _x = (x+cx) + (_LeftRadius<<1) , px = ( _x>>1 ) - _LeftRadius + _PLeftRadius , xx = x + _LeftRadius; + if( CreateNodes ) + { + if( pNeighbors.neighbors[px][py][pz] ) + { + if( !pNeighbors.neighbors[px][py][pz]->children ) pNeighbors.neighbors[px][py][pz]->initChildren(); + neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); + } + else neighbors.neighbors[xx][yy][zz] = NULL; + } + else + { + if( pNeighbors.neighbors[px][py][pz] && pNeighbors.neighbors[px][py][pz]->children ) + neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); + else neighbors.neighbors[xx][yy][zz] = NULL; + } + } + } + } + } +} + +/////////////////////////////// +// OctNode::ConstNeighborKey // +/////////////////////////////// +template< class NodeData > +template< unsigned int LeftRadius , unsigned int RightRadius > +OctNode< NodeData >::ConstNeighborKey< LeftRadius , RightRadius >::ConstNeighborKey( void ){ _depth=-1 , neighbors=NULL; } +template< class NodeData > +template< unsigned int LeftRadius , unsigned int RightRadius > +OctNode< NodeData >::ConstNeighborKey< LeftRadius , RightRadius >::ConstNeighborKey( const ConstNeighborKey& key ) +{ + _depth = 0 , neighbors = NULL; + set( key._depth ); + for( int d=0 ; d<=_depth ; d++ ) memcpy( &neighbors[d] , &key.neighbors[d] , sizeof( ConstNeighbors< Width > ) ); +} +template< class NodeData > +template< unsigned int LeftRadius , unsigned int RightRadius > +OctNode< NodeData >::ConstNeighborKey< LeftRadius , RightRadius >::~ConstNeighborKey( void ) +{ + if( neighbors ) delete[] neighbors; + neighbors=NULL; +} + +template< class NodeData > +template< unsigned int LeftRadius , unsigned int RightRadius > +void OctNode< NodeData >::ConstNeighborKey< LeftRadius , RightRadius >::set( int d ) +{ + if( neighbors ) delete[] neighbors; + neighbors = NULL; + _depth = d; + if( d<0 ) return; + neighbors = new ConstNeighbors< Width >[d+1]; +} +template< class NodeData > +template< unsigned int LeftRadius , unsigned int RightRadius > +typename OctNode< NodeData >::template ConstNeighbors< LeftRadius+RightRadius+1 >& OctNode< NodeData >::ConstNeighborKey< LeftRadius , RightRadius >::getNeighbors( const OctNode< NodeData >* node ) +{ + ConstNeighbors< Width >& neighbors = this->neighbors[ node->depth() ]; + if( node!=neighbors.neighbors[LeftRadius][LeftRadius][LeftRadius]) + { + neighbors.clear(); + + if( !node->parent ) neighbors.neighbors[LeftRadius][LeftRadius][LeftRadius] = node; + else + { + ConstNeighbors< Width >& pNeighbors = getNeighbors( node->parent ); + + // Get the indices of the child node that would contain the point (and its antipode) + int cx , cy , cz; + Cube::FactorCornerIndex( (int)( node - node->parent->children ) , cx , cy , cz ); + + + // Iterate over the finer neighbors and set them (if you can) + // Here: + // (x,y,z) give the position of the finer nodes relative to the center, + // (_x,_y,_z) give a positive global position, up to an even offset, and + // (px-LeftRadius,py-LeftRadius,pz-LeftRadius) give the positions of their parents relative to the parent of the center + for( int z=-(int)LeftRadius ; z<=(int)RightRadius ; z++ ) + { + int _z = (z+cz) + (LeftRadius<<1) , pz = ( _z>>1 ) , zz = z+LeftRadius; + for( int y=-(int)LeftRadius ; y<=(int)RightRadius ; y++ ) + { + int _y = (y+cy) + (LeftRadius<<1) , py = ( _y>>1 ) , yy = y+LeftRadius; + + int cornerIndex = ( (_z&1)<<2 ) | ( (_y&1)<<1 ); + for( int x=-(int)LeftRadius ; x<=(int)RightRadius ; x++ ) + { + int _x = (x+cx) + (LeftRadius<<1) , px = ( _x>>1 ) , xx = x+LeftRadius; + if( pNeighbors.neighbors[px][py][pz] && pNeighbors.neighbors[px][py][pz]->children ) + neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); + else + neighbors.neighbors[xx][yy][zz] = NULL; + } + } + } + } + } + return neighbors; +} +template< class NodeData > +template< unsigned int LeftRadius , unsigned int RightRadius > +template< unsigned int _LeftRadius , unsigned int _RightRadius > +void OctNode< NodeData >::ConstNeighborKey< LeftRadius , RightRadius >::getNeighbors( const OctNode< NodeData >* node , ConstNeighbors< _LeftRadius+_RightRadius+1 >& neighbors ) +{ + neighbors.clear(); + if( !node ) return; + + // [WARNING] This estimate of the required radius is somewhat conservative if the readius is odd (depending on where the node is relative to its parent) + const unsigned int _PLeftRadius = (_LeftRadius+1)/2 , _PRightRadius = (_RightRadius+1)/2; + // If we are at the root of the tree, we are done + if( !node->parent ) neighbors.neighbors[_LeftRadius][_LeftRadius][_LeftRadius] = node; + // If we can get the data from the the key for the parent node, do that + else if( _PLeftRadius<=LeftRadius && _PRightRadius<=RightRadius ) + { + getNeighbors( node->parent ); + const ConstNeighbors< LeftRadius + RightRadius + 1 >& pNeighbors = this->neighbors[ node->depth()-1 ]; + // Get the indices of the child node that would contain the point (and its antipode) + int cx , cy , cz; + Cube::FactorCornerIndex( (int)( node - node->parent->children ) , cx , cy , cz ); + + + // Iterate over the finer neighbors + // Here: + // (x,y,z) give the position of the finer nodes relative to the center, + // (_x,_y,_z) give a positive global position, up to an even offset, and + // (px-LeftRadius,py-LeftRadius,pz-LeftRadius) give the positions of their parents relative to the parent of the center + for( int z=-(int)_LeftRadius ; z<=(int)_RightRadius ; z++ ) + { + int _z = (z+cz) + (_LeftRadius<<1) , pz = ( _z>>1 ) - _LeftRadius + LeftRadius , zz = z + _LeftRadius; + for( int y=-(int)_LeftRadius ; y<=(int)_RightRadius ; y++ ) + { + int _y = (y+cy) + (_LeftRadius<<1) , py = ( _y>>1 ) - _LeftRadius + LeftRadius , yy = y + _LeftRadius; + + int cornerIndex = ( (_z&1)<<2 ) | ( (_y&1)<<1 ); + for( int x=-(int)_LeftRadius ; x<=(int)_RightRadius ; x++ ) + { + int _x = (x+cx) + (_LeftRadius<<1) , px = ( _x>>1 ) - _LeftRadius + LeftRadius , xx = x + _LeftRadius; + if( pNeighbors.neighbors[px][py][pz] && pNeighbors.neighbors[px][py][pz]->children ) + neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); + else + neighbors.neighbors[xx][yy][zz] = NULL; + } + } + } + } + // Otherwise recurse + else + { + ConstNeighbors< _PLeftRadius + _PRightRadius + 1 > pNeighbors; + getNeighbors< _PLeftRadius , _PRightRadius >( node->parent , pNeighbors ); + + // Get the indices of the child node that would contain the point (and its antipode) + int cx , cy , cz; + Cube::FactorCornerIndex( (int)( node - node->parent->children ) , cx , cy , cz ); + + + // Iterate over the finer neighbors + // Here: + // (x,y,z) give the position of the finer nodes relative to the center, + // (_x,_y,_z) give a positive global position, up to an even offset, and + // (px-LeftRadius,py-LeftRadius,pz-LeftRadius) give the positions of their parents relative to the parent of the center + for( int z=-(int)_LeftRadius ; z<=(int)_RightRadius ; z++ ) + { + int _z = (z+cz) + (_LeftRadius<<1) , pz = ( _z>>1 ) - _LeftRadius + _PLeftRadius , zz = z + _LeftRadius; + for( int y=-(int)_LeftRadius ; y<=(int)_RightRadius ; y++ ) + { + int _y = (y+cy) + (_LeftRadius<<1) , py = ( _y>>1 ) - _LeftRadius + _PLeftRadius , yy = y + _LeftRadius; + + int cornerIndex = ( (_z&1)<<2 ) | ( (_y&1)<<1 ); + for( int x=-(int)_LeftRadius ; x<=(int)_RightRadius ; x++ ) + { + int _x = (x+cx) + (_LeftRadius<<1) , px = ( _x>>1 ) - _LeftRadius + _PLeftRadius , xx = x + _LeftRadius; + + if( pNeighbors.neighbors[px][py][pz] && pNeighbors.neighbors[px][py][pz]->children ) + neighbors.neighbors[xx][yy][zz] = pNeighbors.neighbors[px][py][pz]->children + ( cornerIndex | (_x&1) ); + else + neighbors.neighbors[xx][yy][zz] = NULL; + } + } + } + } + return; +} + +template< class NodeData > +int OctNode< NodeData >::write(const char* fileName) const{ + FILE* fp=fopen(fileName,"wb"); + if(!fp){return 0;} + int ret=write(fp); + fclose(fp); + return ret; +} +template< class NodeData > +int OctNode< NodeData >::write(FILE* fp) const{ + fwrite(this,sizeof(OctNode< NodeData >),1,fp); + if(children){for(int i=0;i +int OctNode< NodeData >::read(const char* fileName){ + FILE* fp=fopen(fileName,"rb"); + if(!fp){return 0;} + int ret=read(fp); + fclose(fp); + return ret; +} +template< class NodeData > +int OctNode< NodeData >::read(FILE* fp){ + fread(this,sizeof(OctNode< NodeData >),1,fp); + parent=NULL; + if(children){ + children=NULL; + initChildren(); + for(int i=0;i +int OctNode< NodeData >::width(int maxDepth) const { + int d=depth(); + return 1<<(maxDepth-d); +} +template< class NodeData > +void OctNode< NodeData >::centerIndex(int maxDepth,int index[DIMENSION]) const +{ + int d,o[3]; + depthAndOffset(d,o); + for(int i=0;i -#include "Polynomial.h" -#include "Array.h" - -template< int Degree > -class StartingPolynomial -{ -public: - Polynomial< Degree > p; - double start; - - template< int Degree2 > - StartingPolynomial< Degree+Degree2 > operator * ( const StartingPolynomial< Degree2 >& p ) const; - StartingPolynomial scale( double s ) const; - StartingPolynomial shift( double t ) const; - int operator < ( const StartingPolynomial& sp ) const; - static int Compare( const void* v1 , const void* v2 ); -}; - -template< int Degree > -class PPolynomial -{ -public: - size_t polyCount; - Pointer( StartingPolynomial< Degree > ) polys; - - PPolynomial( void ); - PPolynomial( const PPolynomial& p ); - ~PPolynomial( void ); - - PPolynomial& operator = ( const PPolynomial& p ); - - int size( void ) const; - - void set( size_t size ); - // Note: this method will sort the elements in sps - void set( Pointer( StartingPolynomial ) sps , int count ); - void reset( size_t newSize ); - PPolynomial& compress( double delta=0. ); - - - double operator()( double t ) const; - double integral( double tMin , double tMax ) const; - double Integral( void ) const; - - template< int Degree2 > PPolynomial< Degree >& operator = ( const PPolynomial< Degree2 >& p ); - - PPolynomial operator + ( const PPolynomial& p ) const; - PPolynomial operator - ( const PPolynomial& p ) const; - - template< int Degree2 > PPolynomial< Degree+Degree2 > operator * ( const Polynomial< Degree2 >& p ) const; - template< int Degree2 > PPolynomial< Degree+Degree2 > operator * ( const PPolynomial< Degree2 >& p) const; - - - PPolynomial& operator += ( double s ); - PPolynomial& operator -= ( double s ); - PPolynomial& operator *= ( double s ); - PPolynomial& operator /= ( double s ); - PPolynomial operator + ( double s ) const; - PPolynomial operator - ( double s ) const; - PPolynomial operator * ( double s ) const; - PPolynomial operator / ( double s ) const; - - PPolynomial& addScaled( const PPolynomial& poly , double scale ); - - PPolynomial scale( double s ) const; - PPolynomial shift( double t ) const; - PPolynomial reflect( double r=0. ) const; - - PPolynomial< Degree-1 > derivative(void) const; - PPolynomial< Degree+1 > integral(void) const; - - void getSolutions( double c , std::vector< double >& roots , double EPS , double min=-DBL_MAX , double max=DBL_MAX ) const; - - void printnl( void ) const; - - PPolynomial< Degree+1 > MovingAverage( double radius ) const; - static PPolynomial BSpline( double radius=0.5 ); - - void write( FILE* fp , int samples , double min , double max ) const; -}; -#include "PPolynomial.inl" -#endif // P_POLYNOMIAL_INCLUDED +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ + +#ifndef P_POLYNOMIAL_INCLUDED +#define P_POLYNOMIAL_INCLUDED +#include +#include "Polynomial.h" +#include "Array.h" + +template< int Degree > +class StartingPolynomial +{ +public: + Polynomial< Degree > p; + double start; + + template< int Degree2 > + StartingPolynomial< Degree+Degree2 > operator * ( const StartingPolynomial< Degree2 >& p ) const; + StartingPolynomial scale( double s ) const; + StartingPolynomial shift( double t ) const; + int operator < ( const StartingPolynomial& sp ) const; + static int Compare( const void* v1 , const void* v2 ); +}; + +template< int Degree > +class PPolynomial +{ +public: + size_t polyCount; + Pointer( StartingPolynomial< Degree > ) polys; + + PPolynomial( void ); + PPolynomial( const PPolynomial& p ); + ~PPolynomial( void ); + + PPolynomial& operator = ( const PPolynomial& p ); + + int size( void ) const; + + void set( size_t size ); + // Note: this method will sort the elements in sps + void set( Pointer( StartingPolynomial ) sps , int count ); + void reset( size_t newSize ); + PPolynomial& compress( double delta=0. ); + + + double operator()( double t ) const; + double integral( double tMin , double tMax ) const; + double Integral( void ) const; + + template< int Degree2 > PPolynomial< Degree >& operator = ( const PPolynomial< Degree2 >& p ); + + PPolynomial operator + ( const PPolynomial& p ) const; + PPolynomial operator - ( const PPolynomial& p ) const; + + template< int Degree2 > PPolynomial< Degree+Degree2 > operator * ( const Polynomial< Degree2 >& p ) const; + template< int Degree2 > PPolynomial< Degree+Degree2 > operator * ( const PPolynomial< Degree2 >& p) const; + + + PPolynomial& operator += ( double s ); + PPolynomial& operator -= ( double s ); + PPolynomial& operator *= ( double s ); + PPolynomial& operator /= ( double s ); + PPolynomial operator + ( double s ) const; + PPolynomial operator - ( double s ) const; + PPolynomial operator * ( double s ) const; + PPolynomial operator / ( double s ) const; + + PPolynomial& addScaled( const PPolynomial& poly , double scale ); + + PPolynomial scale( double s ) const; + PPolynomial shift( double t ) const; + PPolynomial reflect( double r=0. ) const; + + PPolynomial< Degree-1 > derivative(void) const; + PPolynomial< Degree+1 > integral(void) const; + + void getSolutions( double c , std::vector< double >& roots , double EPS , double min=-DBL_MAX , double max=DBL_MAX ) const; + + void printnl( void ) const; + + PPolynomial< Degree+1 > MovingAverage( double radius ) const; + static PPolynomial BSpline( double radius=0.5 ); + + void write( FILE* fp , int samples , double min , double max ) const; +}; +#include "PPolynomial.inl" +#endif // P_POLYNOMIAL_INCLUDED diff --git a/src/lib/geogram/third_party/PoissonRecon/PPolynomial.inl b/src/lib/geogram/third_party/PoissonRecon/PPolynomial.inl index 0ec6cf18..64b9a8de 100644 --- a/src/lib/geogram/third_party/PoissonRecon/PPolynomial.inl +++ b/src/lib/geogram/third_party/PoissonRecon/PPolynomial.inl @@ -1,470 +1,470 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - -#include "Factor.h" - -//////////////////////// -// StartingPolynomial // -//////////////////////// -template -template -StartingPolynomial StartingPolynomial::operator * (const StartingPolynomial& p) const{ - StartingPolynomial sp; - if(start>p.start){sp.start=start;} - else{sp.start=p.start;} - sp.p=this->p*p.p; - return sp; -} -template -StartingPolynomial StartingPolynomial::scale( double s ) const -{ - StartingPolynomial q; - q.start = start*s; - q.p = p.scale(s); - return q; -} -template -StartingPolynomial StartingPolynomial::shift(double s) const{ - StartingPolynomial q; - q.start=start+s; - q.p=p.shift(s); - return q; -} - - -template -int StartingPolynomial::operator < (const StartingPolynomial& sp) const{ - if(start -int StartingPolynomial::Compare(const void* v1,const void* v2){ - double d=((StartingPolynomial*)(v1))->start-((StartingPolynomial*)(v2))->start; - if ( d<0 ) return -1; - else if( d>0 ) return 1; - else return 0; -} - -///////////////// -// PPolynomial // -///////////////// -template< int Degree > -PPolynomial< Degree >::PPolynomial( void ) -{ - polyCount = 0; - polys = NullPointer( StartingPolynomial< Degree > ); -} -template< int Degree > -PPolynomial::PPolynomial( const PPolynomial& p ) -{ - polyCount = 0; - polys = NullPointer( StartingPolynomial< Degree > ); - set( p.polyCount ); - memcpy( polys , p.polys , sizeof( StartingPolynomial ) * p.polyCount ); -} - -template< int Degree > -PPolynomial< Degree >::~PPolynomial( void ) -{ - FreePointer( polys ); - polyCount = 0; -} -template< int Degree > -void PPolynomial< Degree >::set( Pointer( StartingPolynomial< Degree > ) sps , int count ) -{ - int c=0; - set( count ); - qsort( sps , count , sizeof( StartingPolynomial< Degree > ) , StartingPolynomial< Degree >::Compare ); - for( int i=0 ; i int PPolynomial< Degree >::size( void ) const{ return int(sizeof(StartingPolynomial)*polyCount); } - -template< int Degree > -void PPolynomial::set( size_t size ) -{ - FreePointer( polys ); - polyCount = size; - if( size ) - { - polys = AllocPointer< StartingPolynomial< Degree > >( size ); - memset( (char*)polys , 0 , sizeof( StartingPolynomial< Degree > )*size ); - } -} -template< int Degree > -void PPolynomial::reset( size_t newSize ) -{ - polyCount = newSize; - polys = ReAllocPointer< StartingPolynomial< Degree > >( polys , newSize ); -} -template< int Degree > -PPolynomial< Degree >& PPolynomial< Degree >::compress( double delta ) -{ - int _polyCount = polyCount; - Pointer( StartingPolynomial< Degree > ) _polys = polys; - - polyCount = 1 , polys = NullPointer( StartingPolynomial< Degree > ); - for( int i=1 ; i<_polyCount ; i++ ) if( _polys[i].start-_polys[i-1].start>delta ) polyCount++; - if( polyCount==_polyCount ) polys = _polys; - else - { - polys = AllocPointer< StartingPolynomial< Degree > >( polyCount ); - polys[0] = _polys[0] , polyCount = 0; - for( int i=1 ; i<_polyCount ; i++ ) - { - if( _polys[i].start-_polys[i-1].start>delta ) polys[ ++polyCount ] = _polys[i]; - else polys[ polyCount ].p += _polys[i].p; - } - polyCount++; - FreePointer( _polys ); - } - return *this; -} - -template< int Degree > -PPolynomial& PPolynomial::operator = (const PPolynomial& p){ - set(p.polyCount); - memcpy(polys,p.polys,sizeof(StartingPolynomial)*p.polyCount); - return *this; -} - -template -template -PPolynomial& PPolynomial::operator = (const PPolynomial& p){ - set(p.polyCount); - for(int i=0;i -double PPolynomial::operator ()( double t ) const -{ - double v=0; - for( int i=0 ; ipolys[i].start ; i++ ) v+=polys[i].p(t); - return v; -} - -template -double PPolynomial::integral( double tMin , double tMax ) const -{ - int m=1; - double start,end,s,v=0; - start=tMin; - end=tMax; - if(tMin>tMax){ - m=-1; - start=tMax; - end=tMin; - } - for(int i=0;i -double PPolynomial::Integral(void) const{return integral(polys[0].start,polys[polyCount-1].start);} -template -PPolynomial PPolynomial::operator + (const PPolynomial& p) const{ - PPolynomial q; - int i,j; - size_t idx=0; - q.set(polyCount+p.polyCount); - i=j=-1; - - while(idx=int(p.polyCount)-1) {q.polys[idx]= polys[++i];} - else if (i>=int( polyCount)-1) {q.polys[idx]=p.polys[++j];} - else if(polys[i+1].start -PPolynomial PPolynomial::operator - (const PPolynomial& p) const{ - PPolynomial q; - int i,j; - size_t idx=0; - q.set(polyCount+p.polyCount); - i=j=-1; - - while(idx=int(p.polyCount)-1) {q.polys[idx]= polys[++i];} - else if (i>=int( polyCount)-1) {q.polys[idx].start=p.polys[++j].start;q.polys[idx].p=p.polys[j].p*(-1.0);} - else if(polys[i+1].start -PPolynomial& PPolynomial::addScaled(const PPolynomial& p,double scale){ - int i,j; - StartingPolynomial* oldPolys=polys; - size_t idx=0,cnt=0,oldPolyCount=polyCount; - polyCount=0; - polys=NULL; - set(oldPolyCount+p.polyCount); - i=j=-1; - while(cnt=int( p.polyCount)-1) {polys[idx]=oldPolys[++i];} - else if (i>=int(oldPolyCount)-1) {polys[idx].start= p.polys[++j].start;polys[idx].p=p.polys[j].p*scale;} - else if (oldPolys[i+1].start -template -PPolynomial PPolynomial::operator * (const PPolynomial& p) const{ - PPolynomial q; - StartingPolynomial *sp; - int i,j,spCount=int(polyCount*p.polyCount); - - sp=(StartingPolynomial*)malloc(sizeof(StartingPolynomial)*spCount); - for(i=0;i -template -PPolynomial PPolynomial::operator * (const Polynomial& p) const{ - PPolynomial q; - q.set(polyCount); - for(int i=0;i -PPolynomial PPolynomial::scale( double s ) const -{ - PPolynomial q; - q.set( polyCount ); - for( size_t i=0 ; i ) , StartingPolynomial< Degree >::Compare ); - return q; -} -template< int Degree > -PPolynomial< Degree > PPolynomial< Degree >::reflect( double r ) const -{ - PPolynomial q; - q.set( polyCount ); - for( size_t i=0 ; i ) , StartingPolynomial< Degree >::Compare ); - return q; -} -template -PPolynomial PPolynomial::shift( double s ) const -{ - PPolynomial q; - q.set(polyCount); - for(size_t i=0;i -PPolynomial PPolynomial::derivative(void) const{ - PPolynomial q; - q.set(polyCount); - for(size_t i=0;i -PPolynomial PPolynomial::integral(void) const{ - int i; - PPolynomial q; - q.set(polyCount); - for(i=0;i -PPolynomial& PPolynomial::operator += ( double s ) {polys[0].p+=s;} -template -PPolynomial& PPolynomial::operator -= ( double s ) {polys[0].p-=s;} -template -PPolynomial& PPolynomial::operator *= ( double s ) -{ - for(int i=0;i -PPolynomial& PPolynomial::operator /= ( double s ) -{ - for(size_t i=0;i -PPolynomial PPolynomial::operator + ( double s ) const -{ - PPolynomial q=*this; - q+=s; - return q; -} -template -PPolynomial PPolynomial::operator - ( double s ) const -{ - PPolynomial q=*this; - q-=s; - return q; -} -template -PPolynomial PPolynomial::operator * ( double s ) const -{ - PPolynomial q=*this; - q*=s; - return q; -} -template -PPolynomial PPolynomial::operator / ( double s ) const -{ - PPolynomial q=*this; - q/=s; - return q; -} - -template -void PPolynomial::printnl(void) const{ - Polynomial p; - - if(!polyCount){ - Polynomial p; - printf("[-Infinity,Infinity]\n"); - } - else{ - for(size_t i=0;i -PPolynomial< 0 > PPolynomial< 0 >::BSpline( double radius ) -{ - PPolynomial q; - q.set(2); - - q.polys[0].start=-radius; - q.polys[1].start= radius; - - q.polys[0].p.coefficients[0]= 1.0; - q.polys[1].p.coefficients[0]=-1.0; - return q; -} -template< int Degree > -PPolynomial< Degree > PPolynomial::BSpline( double radius ) -{ - return PPolynomial< Degree-1 >::BSpline().MovingAverage( radius ); -} -template -PPolynomial PPolynomial::MovingAverage( double radius ) const -{ - PPolynomial A; - Polynomial p; - Pointer( StartingPolynomial< Degree+1 > ) sps; - sps = AllocPointer< StartingPolynomial< Degree+1 > >( polyCount*2 ); - - - for(int i=0;i -void PPolynomial::getSolutions(double c,std::vector& roots,double EPS,double min,double max) const{ - Polynomial p; - std::vector tempRoots; - - p.setZero(); - for(size_t i=0;imax){break;} - if(ipolys[i].start && (i+1==polyCount || tempRoots[j]<=polys[i+1].start)){ - if(tempRoots[j]>min && tempRoots[j] -void PPolynomial::write(FILE* fp,int samples,double min,double max) const{ - fwrite(&samples,sizeof(int),1,fp); - for(int i=0;i +template +StartingPolynomial StartingPolynomial::operator * (const StartingPolynomial& p) const{ + StartingPolynomial sp; + if(start>p.start){sp.start=start;} + else{sp.start=p.start;} + sp.p=this->p*p.p; + return sp; +} +template +StartingPolynomial StartingPolynomial::scale( double s ) const +{ + StartingPolynomial q; + q.start = start*s; + q.p = p.scale(s); + return q; +} +template +StartingPolynomial StartingPolynomial::shift(double s) const{ + StartingPolynomial q; + q.start=start+s; + q.p=p.shift(s); + return q; +} + + +template +int StartingPolynomial::operator < (const StartingPolynomial& sp) const{ + if(start +int StartingPolynomial::Compare(const void* v1,const void* v2){ + double d=((StartingPolynomial*)(v1))->start-((StartingPolynomial*)(v2))->start; + if ( d<0 ) return -1; + else if( d>0 ) return 1; + else return 0; +} + +///////////////// +// PPolynomial // +///////////////// +template< int Degree > +PPolynomial< Degree >::PPolynomial( void ) +{ + polyCount = 0; + polys = NullPointer( StartingPolynomial< Degree > ); +} +template< int Degree > +PPolynomial::PPolynomial( const PPolynomial& p ) +{ + polyCount = 0; + polys = NullPointer( StartingPolynomial< Degree > ); + set( p.polyCount ); + memcpy( polys , p.polys , sizeof( StartingPolynomial ) * p.polyCount ); +} + +template< int Degree > +PPolynomial< Degree >::~PPolynomial( void ) +{ + FreePointer( polys ); + polyCount = 0; +} +template< int Degree > +void PPolynomial< Degree >::set( Pointer( StartingPolynomial< Degree > ) sps , int count ) +{ + int c=0; + set( count ); + qsort( sps , count , sizeof( StartingPolynomial< Degree > ) , StartingPolynomial< Degree >::Compare ); + for( int i=0 ; i int PPolynomial< Degree >::size( void ) const{ return int(sizeof(StartingPolynomial)*polyCount); } + +template< int Degree > +void PPolynomial::set( size_t size ) +{ + FreePointer( polys ); + polyCount = size; + if( size ) + { + polys = AllocPointer< StartingPolynomial< Degree > >( size ); + memset( (char*)polys , 0 , sizeof( StartingPolynomial< Degree > )*size ); + } +} +template< int Degree > +void PPolynomial::reset( size_t newSize ) +{ + polyCount = newSize; + polys = ReAllocPointer< StartingPolynomial< Degree > >( polys , newSize ); +} +template< int Degree > +PPolynomial< Degree >& PPolynomial< Degree >::compress( double delta ) +{ + int _polyCount = polyCount; + Pointer( StartingPolynomial< Degree > ) _polys = polys; + + polyCount = 1 , polys = NullPointer( StartingPolynomial< Degree > ); + for( int i=1 ; i<_polyCount ; i++ ) if( _polys[i].start-_polys[i-1].start>delta ) polyCount++; + if( polyCount==_polyCount ) polys = _polys; + else + { + polys = AllocPointer< StartingPolynomial< Degree > >( polyCount ); + polys[0] = _polys[0] , polyCount = 0; + for( int i=1 ; i<_polyCount ; i++ ) + { + if( _polys[i].start-_polys[i-1].start>delta ) polys[ ++polyCount ] = _polys[i]; + else polys[ polyCount ].p += _polys[i].p; + } + polyCount++; + FreePointer( _polys ); + } + return *this; +} + +template< int Degree > +PPolynomial& PPolynomial::operator = (const PPolynomial& p){ + set(p.polyCount); + memcpy(polys,p.polys,sizeof(StartingPolynomial)*p.polyCount); + return *this; +} + +template +template +PPolynomial& PPolynomial::operator = (const PPolynomial& p){ + set(p.polyCount); + for(int i=0;i +double PPolynomial::operator ()( double t ) const +{ + double v=0; + for( int i=0 ; ipolys[i].start ; i++ ) v+=polys[i].p(t); + return v; +} + +template +double PPolynomial::integral( double tMin , double tMax ) const +{ + int m=1; + double start,end,s,v=0; + start=tMin; + end=tMax; + if(tMin>tMax){ + m=-1; + start=tMax; + end=tMin; + } + for(int i=0;i +double PPolynomial::Integral(void) const{return integral(polys[0].start,polys[polyCount-1].start);} +template +PPolynomial PPolynomial::operator + (const PPolynomial& p) const{ + PPolynomial q; + int i,j; + size_t idx=0; + q.set(polyCount+p.polyCount); + i=j=-1; + + while(idx=int(p.polyCount)-1) {q.polys[idx]= polys[++i];} + else if (i>=int( polyCount)-1) {q.polys[idx]=p.polys[++j];} + else if(polys[i+1].start +PPolynomial PPolynomial::operator - (const PPolynomial& p) const{ + PPolynomial q; + int i,j; + size_t idx=0; + q.set(polyCount+p.polyCount); + i=j=-1; + + while(idx=int(p.polyCount)-1) {q.polys[idx]= polys[++i];} + else if (i>=int( polyCount)-1) {q.polys[idx].start=p.polys[++j].start;q.polys[idx].p=p.polys[j].p*(-1.0);} + else if(polys[i+1].start +PPolynomial& PPolynomial::addScaled(const PPolynomial& p,double scale){ + int i,j; + StartingPolynomial* oldPolys=polys; + size_t idx=0,cnt=0,oldPolyCount=polyCount; + polyCount=0; + polys=NULL; + set(oldPolyCount+p.polyCount); + i=j=-1; + while(cnt=int( p.polyCount)-1) {polys[idx]=oldPolys[++i];} + else if (i>=int(oldPolyCount)-1) {polys[idx].start= p.polys[++j].start;polys[idx].p=p.polys[j].p*scale;} + else if (oldPolys[i+1].start +template +PPolynomial PPolynomial::operator * (const PPolynomial& p) const{ + PPolynomial q; + StartingPolynomial *sp; + int i,j,spCount=int(polyCount*p.polyCount); + + sp=(StartingPolynomial*)malloc(sizeof(StartingPolynomial)*spCount); + for(i=0;i +template +PPolynomial PPolynomial::operator * (const Polynomial& p) const{ + PPolynomial q; + q.set(polyCount); + for(int i=0;i +PPolynomial PPolynomial::scale( double s ) const +{ + PPolynomial q; + q.set( polyCount ); + for( size_t i=0 ; i ) , StartingPolynomial< Degree >::Compare ); + return q; +} +template< int Degree > +PPolynomial< Degree > PPolynomial< Degree >::reflect( double r ) const +{ + PPolynomial q; + q.set( polyCount ); + for( size_t i=0 ; i ) , StartingPolynomial< Degree >::Compare ); + return q; +} +template +PPolynomial PPolynomial::shift( double s ) const +{ + PPolynomial q; + q.set(polyCount); + for(size_t i=0;i +PPolynomial PPolynomial::derivative(void) const{ + PPolynomial q; + q.set(polyCount); + for(size_t i=0;i +PPolynomial PPolynomial::integral(void) const{ + int i; + PPolynomial q; + q.set(polyCount); + for(i=0;i +PPolynomial& PPolynomial::operator += ( double s ) {polys[0].p+=s;} +template +PPolynomial& PPolynomial::operator -= ( double s ) {polys[0].p-=s;} +template +PPolynomial& PPolynomial::operator *= ( double s ) +{ + for(int i=0;i +PPolynomial& PPolynomial::operator /= ( double s ) +{ + for(size_t i=0;i +PPolynomial PPolynomial::operator + ( double s ) const +{ + PPolynomial q=*this; + q+=s; + return q; +} +template +PPolynomial PPolynomial::operator - ( double s ) const +{ + PPolynomial q=*this; + q-=s; + return q; +} +template +PPolynomial PPolynomial::operator * ( double s ) const +{ + PPolynomial q=*this; + q*=s; + return q; +} +template +PPolynomial PPolynomial::operator / ( double s ) const +{ + PPolynomial q=*this; + q/=s; + return q; +} + +template +void PPolynomial::printnl(void) const{ + Polynomial p; + + if(!polyCount){ + Polynomial p; + printf("[-Infinity,Infinity]\n"); + } + else{ + for(size_t i=0;i +PPolynomial< 0 > PPolynomial< 0 >::BSpline( double radius ) +{ + PPolynomial q; + q.set(2); + + q.polys[0].start=-radius; + q.polys[1].start= radius; + + q.polys[0].p.coefficients[0]= 1.0; + q.polys[1].p.coefficients[0]=-1.0; + return q; +} +template< int Degree > +PPolynomial< Degree > PPolynomial::BSpline( double radius ) +{ + return PPolynomial< Degree-1 >::BSpline().MovingAverage( radius ); +} +template +PPolynomial PPolynomial::MovingAverage( double radius ) const +{ + PPolynomial A; + Polynomial p; + Pointer( StartingPolynomial< Degree+1 > ) sps; + sps = AllocPointer< StartingPolynomial< Degree+1 > >( polyCount*2 ); + + + for(int i=0;i +void PPolynomial::getSolutions(double c,std::vector& roots,double EPS,double min,double max) const{ + Polynomial p; + std::vector tempRoots; + + p.setZero(); + for(size_t i=0;imax){break;} + if(ipolys[i].start && (i+1==polyCount || tempRoots[j]<=polys[i+1].start)){ + if(tempRoots[j]>min && tempRoots[j] +void PPolynomial::write(FILE* fp,int samples,double min,double max) const{ + fwrite(&samples,sizeof(int),1,fp); + for(int i=0;i -struct OrientedPoint3D -{ - Point3D< Real > p , n; - OrientedPoint3D( Point3D< Real > pp=Point3D< Real >() , Point3D< Real > nn=Point3D< Real >() ) : p(pp) , n(nn) { ; } -}; - -template< class Real > -class OrientedPointStream -{ -public: - virtual ~OrientedPointStream( void ){} - virtual void reset( void ) = 0; - virtual bool nextPoint( OrientedPoint3D< Real >& p ) = 0; -}; -template< class Real , class Data > -class OrientedPointStreamWithData : public OrientedPointStream< Real > -{ -public: - virtual ~OrientedPointStreamWithData( void ){} - virtual void reset( void ) = 0; - virtual bool nextPoint( OrientedPoint3D< Real >& p , Data& d ) = 0; - - virtual bool nextPoint( OrientedPoint3D< Real >& p ){ Data d ; return nextPoint( p , d ); } -}; - -template< class Real > -class MemoryOrientedPointStream : public OrientedPointStream< Real > -{ - const OrientedPoint3D< Real >* _points; - size_t _pointCount; - size_t _current; -public: - MemoryOrientedPointStream( size_t pointCount , const OrientedPoint3D< Real >* points ); - ~MemoryOrientedPointStream( void ); - void reset( void ); - bool nextPoint( OrientedPoint3D< Real >& p ); -}; - -template< class Real , class Data > -class MemoryOrientedPointStreamWithData : public OrientedPointStreamWithData< Real , Data > -{ - const std::pair< OrientedPoint3D< Real > , Data >* _points; - size_t _pointCount; - size_t _current; -public: - MemoryOrientedPointStreamWithData( size_t pointCount , const std::pair< OrientedPoint3D< Real > , Data >* points ); - ~MemoryOrientedPointStreamWithData( void ); - void reset( void ); - bool nextPoint( OrientedPoint3D< Real >& p , Data& d ); -}; - -template< class Real > -class ASCIIOrientedPointStream : public OrientedPointStream< Real > -{ - FILE* _fp; -public: - ASCIIOrientedPointStream( const char* fileName ); - ~ASCIIOrientedPointStream( void ); - void reset( void ); - bool nextPoint( OrientedPoint3D< Real >& p ); -}; - -template< class Real , class Data > -class ASCIIOrientedPointStreamWithData : public OrientedPointStreamWithData< Real , Data > -{ - FILE* _fp; - Data (*_readData)( FILE* ); -public: - ASCIIOrientedPointStreamWithData( const char* fileName , Data (*readData)( FILE* ) ); - ~ASCIIOrientedPointStreamWithData( void ); - void reset( void ); - bool nextPoint( OrientedPoint3D< Real >& p , Data& d ); -}; - -template< class Real > -class BinaryOrientedPointStream : public OrientedPointStream< Real > -{ - FILE* _fp; - static const int POINT_BUFFER_SIZE=1024; - OrientedPoint3D< Real > _pointBuffer[ POINT_BUFFER_SIZE ]; - int _pointsInBuffer , _currentPointIndex; -public: - BinaryOrientedPointStream( const char* filename ); - ~BinaryOrientedPointStream( void ); - void reset( void ); - bool nextPoint( OrientedPoint3D< Real >& p ); -}; - -template< class Real , class Data > -class BinaryOrientedPointStreamWithData : public OrientedPointStreamWithData< Real , Data > -{ - FILE* _fp; - static const int POINT_BUFFER_SIZE=1024; - std::pair< OrientedPoint3D< Real > , Data > _pointBuffer[ POINT_BUFFER_SIZE ]; - int _pointsInBuffer , _currentPointIndex; -public: - BinaryOrientedPointStreamWithData( const char* filename ); - ~BinaryOrientedPointStreamWithData( void ); - void reset( void ); - bool nextPoint( OrientedPoint3D< Real >& p , Data& d ); -}; - -#include "PointStream.inl" -#endif // POINT_STREAM_INCLUDED +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior writften permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ + +#ifndef POINT_STREAM_INCLUDED +#define POINT_STREAM_INCLUDED + +// [Bruno Levy 2016]: using a replacement class for +// Ply vertices, so that we +// do not need importing all the Ply I/O code. +// Adapted from Ply.h + +#include "PlyVertexMini.h" + +template< class Real > +struct OrientedPoint3D +{ + Point3D< Real > p , n; + OrientedPoint3D( Point3D< Real > pp=Point3D< Real >() , Point3D< Real > nn=Point3D< Real >() ) : p(pp) , n(nn) { ; } +}; + +template< class Real > +class OrientedPointStream +{ +public: + virtual ~OrientedPointStream( void ){} + virtual void reset( void ) = 0; + virtual bool nextPoint( OrientedPoint3D< Real >& p ) = 0; +}; +template< class Real , class Data > +class OrientedPointStreamWithData : public OrientedPointStream< Real > +{ +public: + virtual ~OrientedPointStreamWithData( void ){} + virtual void reset( void ) = 0; + virtual bool nextPoint( OrientedPoint3D< Real >& p , Data& d ) = 0; + + virtual bool nextPoint( OrientedPoint3D< Real >& p ){ Data d ; return nextPoint( p , d ); } +}; + +template< class Real > +class MemoryOrientedPointStream : public OrientedPointStream< Real > +{ + const OrientedPoint3D< Real >* _points; + size_t _pointCount; + size_t _current; +public: + MemoryOrientedPointStream( size_t pointCount , const OrientedPoint3D< Real >* points ); + ~MemoryOrientedPointStream( void ); + void reset( void ); + bool nextPoint( OrientedPoint3D< Real >& p ); +}; + +template< class Real , class Data > +class MemoryOrientedPointStreamWithData : public OrientedPointStreamWithData< Real , Data > +{ + const std::pair< OrientedPoint3D< Real > , Data >* _points; + size_t _pointCount; + size_t _current; +public: + MemoryOrientedPointStreamWithData( size_t pointCount , const std::pair< OrientedPoint3D< Real > , Data >* points ); + ~MemoryOrientedPointStreamWithData( void ); + void reset( void ); + bool nextPoint( OrientedPoint3D< Real >& p , Data& d ); +}; + +template< class Real > +class ASCIIOrientedPointStream : public OrientedPointStream< Real > +{ + FILE* _fp; +public: + ASCIIOrientedPointStream( const char* fileName ); + ~ASCIIOrientedPointStream( void ); + void reset( void ); + bool nextPoint( OrientedPoint3D< Real >& p ); +}; + +template< class Real , class Data > +class ASCIIOrientedPointStreamWithData : public OrientedPointStreamWithData< Real , Data > +{ + FILE* _fp; + Data (*_readData)( FILE* ); +public: + ASCIIOrientedPointStreamWithData( const char* fileName , Data (*readData)( FILE* ) ); + ~ASCIIOrientedPointStreamWithData( void ); + void reset( void ); + bool nextPoint( OrientedPoint3D< Real >& p , Data& d ); +}; + +template< class Real > +class BinaryOrientedPointStream : public OrientedPointStream< Real > +{ + FILE* _fp; + static const int POINT_BUFFER_SIZE=1024; + OrientedPoint3D< Real > _pointBuffer[ POINT_BUFFER_SIZE ]; + int _pointsInBuffer , _currentPointIndex; +public: + BinaryOrientedPointStream( const char* filename ); + ~BinaryOrientedPointStream( void ); + void reset( void ); + bool nextPoint( OrientedPoint3D< Real >& p ); +}; + +template< class Real , class Data > +class BinaryOrientedPointStreamWithData : public OrientedPointStreamWithData< Real , Data > +{ + FILE* _fp; + static const int POINT_BUFFER_SIZE=1024; + std::pair< OrientedPoint3D< Real > , Data > _pointBuffer[ POINT_BUFFER_SIZE ]; + int _pointsInBuffer , _currentPointIndex; +public: + BinaryOrientedPointStreamWithData( const char* filename ); + ~BinaryOrientedPointStreamWithData( void ); + void reset( void ); + bool nextPoint( OrientedPoint3D< Real >& p , Data& d ); +}; + +#include "PointStream.inl" +#endif // POINT_STREAM_INCLUDED diff --git a/src/lib/geogram/third_party/PoissonRecon/PointStream.inl b/src/lib/geogram/third_party/PoissonRecon/PointStream.inl old mode 100755 new mode 100644 index afd957ea..c5165d9d --- a/src/lib/geogram/third_party/PoissonRecon/PointStream.inl +++ b/src/lib/geogram/third_party/PoissonRecon/PointStream.inl @@ -1,203 +1,203 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - - -/////////////////////////////// -// MemoryOrientedPointStream // -/////////////////////////////// -template< class Real > -MemoryOrientedPointStream< Real >::MemoryOrientedPointStream( size_t pointCount , const OrientedPoint3D< Real >* points ){ _points = points , _pointCount = pointCount , _current = 0; } -template< class Real > -MemoryOrientedPointStream< Real >::~MemoryOrientedPointStream( void ){ ; } -template< class Real > -void MemoryOrientedPointStream< Real >::reset( void ) { _current=0; } -template< class Real > -bool MemoryOrientedPointStream< Real >::nextPoint( OrientedPoint3D< Real >& p ) -{ - if( _current>=_pointCount ) return false; - p = _points[_current]; - _current++; - return true; -} - -////////////////////////////// -// ASCIIOrientedPointStream // -////////////////////////////// -template< class Real > -ASCIIOrientedPointStream< Real >::ASCIIOrientedPointStream( const char* fileName ) -{ - _fp = fopen( fileName , "r" ); - if( !_fp ) fprintf( stderr , "Failed to open file for reading: %s\n" , fileName ) , exit( 0 ); -} -template< class Real > -ASCIIOrientedPointStream< Real >::~ASCIIOrientedPointStream( void ) -{ - fclose( _fp ); - _fp = NULL; -} -template< class Real > -void ASCIIOrientedPointStream< Real >::reset( void ) { fseek( _fp , SEEK_SET , 0 ); } -template< class Real > -bool ASCIIOrientedPointStream< Real >::nextPoint( OrientedPoint3D< Real >& p ) -{ - float c[2*3]; - if( fscanf( _fp , " %f %f %f %f %f %f " , &c[0] , &c[1] , &c[2] , &c[3] , &c[4] , &c[5] )!=2*3 ) return false; - p.p[0] = c[0] , p.p[1] = c[1] , p.p[2] = c[2]; - p.n[0] = c[3] , p.n[1] = c[4] , p.n[2] = c[5]; - return true; -} - -/////////////////////////////// -// BinaryOrientedPointStream // -/////////////////////////////// -template< class Real > -BinaryOrientedPointStream< Real >::BinaryOrientedPointStream( const char* fileName ) -{ - _pointsInBuffer = _currentPointIndex = 0; - _fp = fopen( fileName , "rb" ); - if( !_fp ) fprintf( stderr , "Failed to open file for reading: %s\n" , fileName ) , exit( 0 ); -} -template< class Real > -BinaryOrientedPointStream< Real >::~BinaryOrientedPointStream( void ) -{ - fclose( _fp ); - _fp = NULL; -} -template< class Real > -void BinaryOrientedPointStream< Real >::reset( void ) -{ - fseek( _fp , SEEK_SET , 0 ); - _pointsInBuffer = _currentPointIndex = 0; -} -template< class Real > -bool BinaryOrientedPointStream< Real >::nextPoint( OrientedPoint3D< Real >& p ) -{ - if( _currentPointIndex<_pointsInBuffer ) - { - p = _pointBuffer[ _currentPointIndex ]; - _currentPointIndex++; - return true; - } - else - { - _currentPointIndex = 0; - _pointsInBuffer = int( fread( _pointBuffer , sizeof( OrientedPoint3D< Real > ) , POINT_BUFFER_SIZE , _fp ) ); - if( !_pointsInBuffer ) return false; - else return nextPoint( p ); - } -} - - -/////////////////////////////////////// -// MemoryOrientedPointStreamWithData // -/////////////////////////////////////// -template< class Real , class Data > -MemoryOrientedPointStreamWithData< Real , Data >::MemoryOrientedPointStreamWithData( size_t pointCount , const std::pair< OrientedPoint3D< Real > , Data >* points ){ _points = points , _pointCount = pointCount , _current = 0; } -template< class Real , class Data > -MemoryOrientedPointStreamWithData< Real , Data >::~MemoryOrientedPointStreamWithData( void ){ ; } -template< class Real , class Data > -void MemoryOrientedPointStreamWithData< Real , Data >::reset( void ) { _current=0; } -template< class Real , class Data > -bool MemoryOrientedPointStreamWithData< Real , Data >::nextPoint( OrientedPoint3D< Real >& p , Data& d ) -{ - if( _current>=_pointCount ) return false; - p = _points[_current].first; - d = _points[_current].second; - _current++; - return true; -} - -////////////////////////////////////// -// ASCIIOrientedPointStreamWithData // -////////////////////////////////////// -template< class Real , class Data > -ASCIIOrientedPointStreamWithData< Real , Data >::ASCIIOrientedPointStreamWithData( const char* fileName , Data (*readData)( FILE* ) ) : _readData( readData ) -{ - _fp = fopen( fileName , "r" ); - if( !_fp ) fprintf( stderr , "Failed to open file for reading: %s\n" , fileName ) , exit( 0 ); -} -template< class Real , class Data > -ASCIIOrientedPointStreamWithData< Real , Data >::~ASCIIOrientedPointStreamWithData( void ) -{ - fclose( _fp ); - _fp = NULL; -} -template< class Real , class Data > -void ASCIIOrientedPointStreamWithData< Real , Data >::reset( void ) { fseek( _fp , SEEK_SET , 0 ); } -template< class Real , class Data > -bool ASCIIOrientedPointStreamWithData< Real , Data >::nextPoint( OrientedPoint3D< Real >& p , Data& d ) -{ - float c[2*3]; - if( fscanf( _fp , " %f %f %f %f %f %f " , &c[0] , &c[1] , &c[2] , &c[3] , &c[4] , &c[5] )!=2*3 ) return false; - p.p[0] = c[0] , p.p[1] = c[1] , p.p[2] = c[2]; - p.n[0] = c[3] , p.n[1] = c[4] , p.n[2] = c[5]; - d = _readData( _fp ); - return true; -} - -/////////////////////////////////////// -// BinaryOrientedPointStreamWithData // -/////////////////////////////////////// -template< class Real , class Data > -BinaryOrientedPointStreamWithData< Real , Data >::BinaryOrientedPointStreamWithData( const char* fileName ) -{ - _pointsInBuffer = _currentPointIndex = 0; - _fp = fopen( fileName , "rb" ); - if( !_fp ) fprintf( stderr , "Failed to open file for reading: %s\n" , fileName ) , exit( 0 ); -} -template< class Real , class Data > -BinaryOrientedPointStreamWithData< Real , Data >::~BinaryOrientedPointStreamWithData( void ) -{ - fclose( _fp ); - _fp = NULL; -} -template< class Real , class Data > -void BinaryOrientedPointStreamWithData< Real , Data >::reset( void ) -{ - fseek( _fp , SEEK_SET , 0 ); - _pointsInBuffer = _currentPointIndex = 0; -} -template< class Real , class Data > -bool BinaryOrientedPointStreamWithData< Real , Data >::nextPoint( OrientedPoint3D< Real >& p , Data& d ) -{ - if( _currentPointIndex<_pointsInBuffer ) - { - p = _pointBuffer[ _currentPointIndex ].first; - d = _pointBuffer[ _currentPointIndex ].second; - _currentPointIndex++; - return true; - } - else - { - _currentPointIndex = 0; - _pointsInBuffer = int( fread( _pointBuffer , sizeof( std::pair< OrientedPoint3D< Real > , Data > ) , POINT_BUFFER_SIZE , _fp ) ); - if( !_pointsInBuffer ) return false; - else return nextPoint( p , d ); - } -} - +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ + + +/////////////////////////////// +// MemoryOrientedPointStream // +/////////////////////////////// +template< class Real > +MemoryOrientedPointStream< Real >::MemoryOrientedPointStream( size_t pointCount , const OrientedPoint3D< Real >* points ){ _points = points , _pointCount = pointCount , _current = 0; } +template< class Real > +MemoryOrientedPointStream< Real >::~MemoryOrientedPointStream( void ){ ; } +template< class Real > +void MemoryOrientedPointStream< Real >::reset( void ) { _current=0; } +template< class Real > +bool MemoryOrientedPointStream< Real >::nextPoint( OrientedPoint3D< Real >& p ) +{ + if( _current>=_pointCount ) return false; + p = _points[_current]; + _current++; + return true; +} + +////////////////////////////// +// ASCIIOrientedPointStream // +////////////////////////////// +template< class Real > +ASCIIOrientedPointStream< Real >::ASCIIOrientedPointStream( const char* fileName ) +{ + _fp = fopen( fileName , "r" ); + if( !_fp ) fprintf( stderr , "Failed to open file for reading: %s\n" , fileName ) , exit( 0 ); +} +template< class Real > +ASCIIOrientedPointStream< Real >::~ASCIIOrientedPointStream( void ) +{ + fclose( _fp ); + _fp = NULL; +} +template< class Real > +void ASCIIOrientedPointStream< Real >::reset( void ) { fseek( _fp , SEEK_SET , 0 ); } +template< class Real > +bool ASCIIOrientedPointStream< Real >::nextPoint( OrientedPoint3D< Real >& p ) +{ + float c[2*3]; + if( fscanf( _fp , " %f %f %f %f %f %f " , &c[0] , &c[1] , &c[2] , &c[3] , &c[4] , &c[5] )!=2*3 ) return false; + p.p[0] = c[0] , p.p[1] = c[1] , p.p[2] = c[2]; + p.n[0] = c[3] , p.n[1] = c[4] , p.n[2] = c[5]; + return true; +} + +/////////////////////////////// +// BinaryOrientedPointStream // +/////////////////////////////// +template< class Real > +BinaryOrientedPointStream< Real >::BinaryOrientedPointStream( const char* fileName ) +{ + _pointsInBuffer = _currentPointIndex = 0; + _fp = fopen( fileName , "rb" ); + if( !_fp ) fprintf( stderr , "Failed to open file for reading: %s\n" , fileName ) , exit( 0 ); +} +template< class Real > +BinaryOrientedPointStream< Real >::~BinaryOrientedPointStream( void ) +{ + fclose( _fp ); + _fp = NULL; +} +template< class Real > +void BinaryOrientedPointStream< Real >::reset( void ) +{ + fseek( _fp , SEEK_SET , 0 ); + _pointsInBuffer = _currentPointIndex = 0; +} +template< class Real > +bool BinaryOrientedPointStream< Real >::nextPoint( OrientedPoint3D< Real >& p ) +{ + if( _currentPointIndex<_pointsInBuffer ) + { + p = _pointBuffer[ _currentPointIndex ]; + _currentPointIndex++; + return true; + } + else + { + _currentPointIndex = 0; + _pointsInBuffer = int( fread( _pointBuffer , sizeof( OrientedPoint3D< Real > ) , POINT_BUFFER_SIZE , _fp ) ); + if( !_pointsInBuffer ) return false; + else return nextPoint( p ); + } +} + + +/////////////////////////////////////// +// MemoryOrientedPointStreamWithData // +/////////////////////////////////////// +template< class Real , class Data > +MemoryOrientedPointStreamWithData< Real , Data >::MemoryOrientedPointStreamWithData( size_t pointCount , const std::pair< OrientedPoint3D< Real > , Data >* points ){ _points = points , _pointCount = pointCount , _current = 0; } +template< class Real , class Data > +MemoryOrientedPointStreamWithData< Real , Data >::~MemoryOrientedPointStreamWithData( void ){ ; } +template< class Real , class Data > +void MemoryOrientedPointStreamWithData< Real , Data >::reset( void ) { _current=0; } +template< class Real , class Data > +bool MemoryOrientedPointStreamWithData< Real , Data >::nextPoint( OrientedPoint3D< Real >& p , Data& d ) +{ + if( _current>=_pointCount ) return false; + p = _points[_current].first; + d = _points[_current].second; + _current++; + return true; +} + +////////////////////////////////////// +// ASCIIOrientedPointStreamWithData // +////////////////////////////////////// +template< class Real , class Data > +ASCIIOrientedPointStreamWithData< Real , Data >::ASCIIOrientedPointStreamWithData( const char* fileName , Data (*readData)( FILE* ) ) : _readData( readData ) +{ + _fp = fopen( fileName , "r" ); + if( !_fp ) fprintf( stderr , "Failed to open file for reading: %s\n" , fileName ) , exit( 0 ); +} +template< class Real , class Data > +ASCIIOrientedPointStreamWithData< Real , Data >::~ASCIIOrientedPointStreamWithData( void ) +{ + fclose( _fp ); + _fp = NULL; +} +template< class Real , class Data > +void ASCIIOrientedPointStreamWithData< Real , Data >::reset( void ) { fseek( _fp , SEEK_SET , 0 ); } +template< class Real , class Data > +bool ASCIIOrientedPointStreamWithData< Real , Data >::nextPoint( OrientedPoint3D< Real >& p , Data& d ) +{ + float c[2*3]; + if( fscanf( _fp , " %f %f %f %f %f %f " , &c[0] , &c[1] , &c[2] , &c[3] , &c[4] , &c[5] )!=2*3 ) return false; + p.p[0] = c[0] , p.p[1] = c[1] , p.p[2] = c[2]; + p.n[0] = c[3] , p.n[1] = c[4] , p.n[2] = c[5]; + d = _readData( _fp ); + return true; +} + +/////////////////////////////////////// +// BinaryOrientedPointStreamWithData // +/////////////////////////////////////// +template< class Real , class Data > +BinaryOrientedPointStreamWithData< Real , Data >::BinaryOrientedPointStreamWithData( const char* fileName ) +{ + _pointsInBuffer = _currentPointIndex = 0; + _fp = fopen( fileName , "rb" ); + if( !_fp ) fprintf( stderr , "Failed to open file for reading: %s\n" , fileName ) , exit( 0 ); +} +template< class Real , class Data > +BinaryOrientedPointStreamWithData< Real , Data >::~BinaryOrientedPointStreamWithData( void ) +{ + fclose( _fp ); + _fp = NULL; +} +template< class Real , class Data > +void BinaryOrientedPointStreamWithData< Real , Data >::reset( void ) +{ + fseek( _fp , SEEK_SET , 0 ); + _pointsInBuffer = _currentPointIndex = 0; +} +template< class Real , class Data > +bool BinaryOrientedPointStreamWithData< Real , Data >::nextPoint( OrientedPoint3D< Real >& p , Data& d ) +{ + if( _currentPointIndex<_pointsInBuffer ) + { + p = _pointBuffer[ _currentPointIndex ].first; + d = _pointBuffer[ _currentPointIndex ].second; + _currentPointIndex++; + return true; + } + else + { + _currentPointIndex = 0; + _pointsInBuffer = int( fread( _pointBuffer , sizeof( std::pair< OrientedPoint3D< Real > , Data > ) , POINT_BUFFER_SIZE , _fp ) ); + if( !_pointsInBuffer ) return false; + else return nextPoint( p , d ); + } +} + diff --git a/src/lib/geogram/third_party/PoissonRecon/Polynomial.h b/src/lib/geogram/third_party/PoissonRecon/Polynomial.h old mode 100755 new mode 100644 index 98dee819..397b7bdb --- a/src/lib/geogram/third_party/PoissonRecon/Polynomial.h +++ b/src/lib/geogram/third_party/PoissonRecon/Polynomial.h @@ -1,100 +1,100 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - -#ifndef POLYNOMIAL_INCLUDED -#define POLYNOMIAL_INCLUDED - -#define NEW_POLYNOMIAL_CODE 1 - -#include - -template< int Degree > -class Polynomial -{ -public: - double coefficients[Degree+1]; - - Polynomial(void); - template - Polynomial(const Polynomial& P); - double operator()( double t ) const; - double integral( double tMin , double tMax ) const; - - int operator == (const Polynomial& p) const; - int operator != (const Polynomial& p) const; - int isZero(void) const; - void setZero(void); - - template - Polynomial& operator = (const Polynomial &p); - Polynomial& operator += (const Polynomial& p); - Polynomial& operator -= (const Polynomial& p); - Polynomial operator - (void) const; - Polynomial operator + (const Polynomial& p) const; - Polynomial operator - (const Polynomial& p) const; - template - Polynomial operator * (const Polynomial& p) const; - - Polynomial& operator += ( double s ); - Polynomial& operator -= ( double s ); - Polynomial& operator *= ( double s ); - Polynomial& operator /= ( double s ); - Polynomial operator + ( double s ) const; - Polynomial operator - ( double s ) const; - Polynomial operator * ( double s ) const; - Polynomial operator / ( double s ) const; - - Polynomial scale( double s ) const; - Polynomial shift( double t ) const; - - Polynomial derivative(void) const; - Polynomial integral(void) const; - - void printnl(void) const; - - Polynomial& addScaled(const Polynomial& p,double scale); - - static void Negate(const Polynomial& in,Polynomial& out); - static void Subtract(const Polynomial& p1,const Polynomial& p2,Polynomial& q); - static void Scale(const Polynomial& p,double w,Polynomial& q); - static void AddScaled(const Polynomial& p1,double w1,const Polynomial& p2,double w2,Polynomial& q); - static void AddScaled(const Polynomial& p1,const Polynomial& p2,double w2,Polynomial& q); - static void AddScaled(const Polynomial& p1,double w1,const Polynomial& p2,Polynomial& q); - - void getSolutions(double c,std::vector& roots,double EPS) const; - int getSolutions( double c , double* roots , double EPS ) const; - - // [NOTE] Both of these methods define the indexing according to DeBoor's algorithm, so that - // Polynomial< Degree >BSplineComponent( 0 )( 1.0 )=0 for all Degree>0. - static Polynomial BSplineComponent( int i ); - static void BSplineComponentValues( double x , double* values ); - static void BinomialCoefficients( int bCoefficients[Degree+1] ); -}; - -#include "Polynomial.inl" -#endif // POLYNOMIAL_INCLUDED +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ + +#ifndef POLYNOMIAL_INCLUDED +#define POLYNOMIAL_INCLUDED + +#define NEW_POLYNOMIAL_CODE 1 + +#include + +template< int Degree > +class Polynomial +{ +public: + double coefficients[Degree+1]; + + Polynomial(void); + template + Polynomial(const Polynomial& P); + double operator()( double t ) const; + double integral( double tMin , double tMax ) const; + + int operator == (const Polynomial& p) const; + int operator != (const Polynomial& p) const; + int isZero(void) const; + void setZero(void); + + template + Polynomial& operator = (const Polynomial &p); + Polynomial& operator += (const Polynomial& p); + Polynomial& operator -= (const Polynomial& p); + Polynomial operator - (void) const; + Polynomial operator + (const Polynomial& p) const; + Polynomial operator - (const Polynomial& p) const; + template + Polynomial operator * (const Polynomial& p) const; + + Polynomial& operator += ( double s ); + Polynomial& operator -= ( double s ); + Polynomial& operator *= ( double s ); + Polynomial& operator /= ( double s ); + Polynomial operator + ( double s ) const; + Polynomial operator - ( double s ) const; + Polynomial operator * ( double s ) const; + Polynomial operator / ( double s ) const; + + Polynomial scale( double s ) const; + Polynomial shift( double t ) const; + + Polynomial derivative(void) const; + Polynomial integral(void) const; + + void printnl(void) const; + + Polynomial& addScaled(const Polynomial& p,double scale); + + static void Negate(const Polynomial& in,Polynomial& out); + static void Subtract(const Polynomial& p1,const Polynomial& p2,Polynomial& q); + static void Scale(const Polynomial& p,double w,Polynomial& q); + static void AddScaled(const Polynomial& p1,double w1,const Polynomial& p2,double w2,Polynomial& q); + static void AddScaled(const Polynomial& p1,const Polynomial& p2,double w2,Polynomial& q); + static void AddScaled(const Polynomial& p1,double w1,const Polynomial& p2,Polynomial& q); + + void getSolutions(double c,std::vector& roots,double EPS) const; + int getSolutions( double c , double* roots , double EPS ) const; + + // [NOTE] Both of these methods define the indexing according to DeBoor's algorithm, so that + // Polynomial< Degree >BSplineComponent( 0 )( 1.0 )=0 for all Degree>0. + static Polynomial BSplineComponent( int i ); + static void BSplineComponentValues( double x , double* values ); + static void BinomialCoefficients( int bCoefficients[Degree+1] ); +}; + +#include "Polynomial.inl" +#endif // POLYNOMIAL_INCLUDED diff --git a/src/lib/geogram/third_party/PoissonRecon/Polynomial.inl b/src/lib/geogram/third_party/PoissonRecon/Polynomial.inl old mode 100755 new mode 100644 index 2a8d0506..ea7ae504 --- a/src/lib/geogram/third_party/PoissonRecon/Polynomial.inl +++ b/src/lib/geogram/third_party/PoissonRecon/Polynomial.inl @@ -1,369 +1,369 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - -#include -#include -#include -#include "Factor.h" - -//////////////// -// Polynomial // -//////////////// -template -Polynomial::Polynomial(void){memset(coefficients,0,sizeof(double)*(Degree+1));} -template -template -Polynomial::Polynomial(const Polynomial& P){ - memset(coefficients,0,sizeof(double)*(Degree+1)); - for(int i=0;i<=Degree && i<=Degree2;i++){coefficients[i]=P.coefficients[i];} -} - - -template -template -Polynomial& Polynomial::operator = (const Polynomial &p){ - int d=Degree -Polynomial Polynomial::derivative(void) const{ - Polynomial p; - for(int i=0;i -Polynomial Polynomial::integral(void) const{ - Polynomial p; - p.coefficients[0]=0; - for(int i=0;i<=Degree;i++){p.coefficients[i+1]=coefficients[i]/(i+1);} - return p; -} -template<> double Polynomial< 0 >::operator() ( double t ) const { return coefficients[0]; } -template<> double Polynomial< 1 >::operator() ( double t ) const { return coefficients[0]+coefficients[1]*t; } -template<> double Polynomial< 2 >::operator() ( double t ) const { return coefficients[0]+(coefficients[1]+coefficients[2]*t)*t; } -template -double Polynomial::operator() ( double t ) const{ - double v=coefficients[Degree]; - for( int d=Degree-1 ; d>=0 ; d-- ) v = v*t + coefficients[d]; - return v; -} -template -double Polynomial::integral( double tMin , double tMax ) const -{ - double v=0; - double t1,t2; - t1=tMin; - t2=tMax; - for(int i=0;i<=Degree;i++){ - v+=coefficients[i]*(t2-t1)/(i+1); - if(t1!=-DBL_MAX && t1!=DBL_MAX){t1*=tMin;} - if(t2!=-DBL_MAX && t2!=DBL_MAX){t2*=tMax;} - } - return v; -} -template -int Polynomial::operator == (const Polynomial& p) const{ - for(int i=0;i<=Degree;i++){if(coefficients[i]!=p.coefficients[i]){return 0;}} - return 1; -} -template -int Polynomial::operator != (const Polynomial& p) const{ - for(int i=0;i<=Degree;i++){if(coefficients[i]==p.coefficients[i]){return 0;}} - return 1; -} -template -int Polynomial::isZero(void) const{ - for(int i=0;i<=Degree;i++){if(coefficients[i]!=0){return 0;}} - return 1; -} -template -void Polynomial::setZero(void){memset(coefficients,0,sizeof(double)*(Degree+1));} - -template -Polynomial& Polynomial::addScaled(const Polynomial& p,double s){ - for(int i=0;i<=Degree;i++){coefficients[i]+=p.coefficients[i]*s;} - return *this; -} -template -Polynomial& Polynomial::operator += (const Polynomial& p){ - for(int i=0;i<=Degree;i++){coefficients[i]+=p.coefficients[i];} - return *this; -} -template -Polynomial& Polynomial::operator -= (const Polynomial& p){ - for(int i=0;i<=Degree;i++){coefficients[i]-=p.coefficients[i];} - return *this; -} -template -Polynomial Polynomial::operator + (const Polynomial& p) const{ - Polynomial q; - for(int i=0;i<=Degree;i++){q.coefficients[i]=(coefficients[i]+p.coefficients[i]);} - return q; -} -template -Polynomial Polynomial::operator - (const Polynomial& p) const{ - Polynomial q; - for(int i=0;i<=Degree;i++) {q.coefficients[i]=coefficients[i]-p.coefficients[i];} - return q; -} -template -void Polynomial::Scale(const Polynomial& p,double w,Polynomial& q){ - for(int i=0;i<=Degree;i++){q.coefficients[i]=p.coefficients[i]*w;} -} -template -void Polynomial::AddScaled(const Polynomial& p1,double w1,const Polynomial& p2,double w2,Polynomial& q){ - for(int i=0;i<=Degree;i++){q.coefficients[i]=p1.coefficients[i]*w1+p2.coefficients[i]*w2;} -} -template -void Polynomial::AddScaled(const Polynomial& p1,double w1,const Polynomial& p2,Polynomial& q){ - for(int i=0;i<=Degree;i++){q.coefficients[i]=p1.coefficients[i]*w1+p2.coefficients[i];} -} -template -void Polynomial::AddScaled(const Polynomial& p1,const Polynomial& p2,double w2,Polynomial& q){ - for(int i=0;i<=Degree;i++){q.coefficients[i]=p1.coefficients[i]+p2.coefficients[i]*w2;} -} - -template -void Polynomial::Subtract(const Polynomial &p1,const Polynomial& p2,Polynomial& q){ - for(int i=0;i<=Degree;i++){q.coefficients[i]=p1.coefficients[i]-p2.coefficients[i];} -} -template -void Polynomial::Negate(const Polynomial& in,Polynomial& out){ - out=in; - for(int i=0;i<=Degree;i++){out.coefficients[i]=-out.coefficients[i];} -} - -template -Polynomial Polynomial::operator - (void) const{ - Polynomial q=*this; - for(int i=0;i<=Degree;i++){q.coefficients[i]=-q.coefficients[i];} - return q; -} -template -template -Polynomial Polynomial::operator * (const Polynomial& p) const{ - Polynomial q; - for(int i=0;i<=Degree;i++){for(int j=0;j<=Degree2;j++){q.coefficients[i+j]+=coefficients[i]*p.coefficients[j];}} - return q; -} - -template -Polynomial& Polynomial::operator += ( double s ) -{ - coefficients[0]+=s; - return *this; -} -template -Polynomial& Polynomial::operator -= ( double s ) -{ - coefficients[0]-=s; - return *this; -} -template -Polynomial& Polynomial::operator *= ( double s ) -{ - for(int i=0;i<=Degree;i++){coefficients[i]*=s;} - return *this; -} -template -Polynomial& Polynomial::operator /= ( double s ) -{ - for(int i=0;i<=Degree;i++){coefficients[i]/=s;} - return *this; -} -template -Polynomial Polynomial::operator + ( double s ) const -{ - Polynomial q=*this; - q.coefficients[0]+=s; - return q; -} -template -Polynomial Polynomial::operator - ( double s ) const -{ - Polynomial q=*this; - q.coefficients[0]-=s; - return q; -} -template -Polynomial Polynomial::operator * ( double s ) const -{ - Polynomial q; - for(int i=0;i<=Degree;i++){q.coefficients[i]=coefficients[i]*s;} - return q; -} -template -Polynomial Polynomial::operator / ( double s ) const -{ - Polynomial q; - for( int i=0 ; i<=Degree ; i++ ) q.coefficients[i] = coefficients[i]/s; - return q; -} -template -Polynomial Polynomial::scale( double s ) const -{ - Polynomial q=*this; - double s2=1.0; - for(int i=0;i<=Degree;i++){ - q.coefficients[i]*=s2; - s2/=s; - } - return q; -} -template -Polynomial Polynomial::shift( double t ) const -{ - Polynomial q; - for(int i=0;i<=Degree;i++){ - double temp=1; - for(int j=i;j>=0;j--){ - q.coefficients[j]+=coefficients[i]*temp; - temp*=-t*j; - temp/=(i-j+1); - } - } - return q; -} -template -void Polynomial::printnl(void) const{ - for(int j=0;j<=Degree;j++){ - printf("%6.4f x^%d ",coefficients[j],j); - if(j=0){printf("+");} - } - printf("\n"); -} -template -void Polynomial::getSolutions(double c,std::vector& roots,double EPS) const -{ - double r[4][2]; - int rCount=0; - roots.clear(); - switch(Degree){ - case 1: - rCount=Factor(coefficients[1],coefficients[0]-c,r,EPS); - break; - case 2: - rCount=Factor(coefficients[2],coefficients[1],coefficients[0]-c,r,EPS); - break; - case 3: - rCount=Factor(coefficients[3],coefficients[2],coefficients[1],coefficients[0]-c,r,EPS); - break; -// case 4: -// rCount=Factor(coefficients[4],coefficients[3],coefficients[2],coefficients[1],coefficients[0]-c,r,EPS); -// break; - default: - printf("Can't solve polynomial of degree: %d\n",Degree); - } - for(int i=0;i -int Polynomial::getSolutions( double c , double* roots , double EPS ) const -{ - double _roots[4][2]; - int _rCount=0; - switch( Degree ) - { - case 1: _rCount = Factor( coefficients[1] , coefficients[0]-c , _roots , EPS ) ; break; - case 2: _rCount = Factor( coefficients[2] , coefficients[1] , coefficients[0]-c , _roots , EPS ) ; break; - case 3: _rCount = Factor( coefficients[3] , coefficients[2] , coefficients[1] , coefficients[0]-c , _roots , EPS ) ; break; -// case 4: _rCount = Factor( coefficients[4] , coefficients[3] , coefficients[2] , coefficients[1] , coefficients[0]-c , _roots , EPS ) ; break; - default: printf( "Can't solve polynomial of degree: %d\n" , Degree ); - } - int rCount = 0; - for( int i=0 ; i<_rCount ; i++ ) if( fabs(_roots[i][1])<=EPS ) roots[rCount++] = _roots[i][0]; - return rCount; -} -// The 0-th order B-spline -template< > -Polynomial< 0 > Polynomial< 0 >::BSplineComponent( int i ) -{ - Polynomial p; - p.coefficients[0] = 1.; - return p; -} - -// The Degree-th order B-spline -template< int Degree > -Polynomial< Degree > Polynomial< Degree >::BSplineComponent( int i ) -{ - // B_d^i(x) = \int_x^1 B_{d-1}^{i}(y) dy + \int_0^x B_{d-1}^{i-1} y dy - // = \int_0^1 B_{d-1}^{i}(y) dy - \int_0^x B_{d-1}^{i}(y) dy + \int_0^x B_{d-1}^{i-1} y dy - Polynomial p; - if( i _p = Polynomial< Degree-1 >::BSplineComponent( i ).integral(); - p -= _p; - p.coefficients[0] += _p(1); - } - if( i>0 ) - { - Polynomial< Degree > _p = Polynomial< Degree-1 >::BSplineComponent( i-1 ).integral(); - p += _p; - } - return p; -} - - -// The 0-th order B-spline values -template< > void Polynomial< 0 >::BSplineComponentValues( double x , double* values ){ values[0] = 1.; } -// The Degree-th order B-spline -template< int Degree > void Polynomial< Degree >::BSplineComponentValues( double x , double* values ) -{ - const double Scale = 1./Degree; - Polynomial< Degree-1 >::BSplineComponentValues( x , values+1 ); - values[0] = values[1] * (1.-x) * Scale; - for( int i=1 ; i void Polynomial< 0 >::BinomialCoefficients( int bCoefficients[1] ){ bCoefficients[0] = 1; } -template< int Degree > void Polynomial< Degree >::BinomialCoefficients( int bCoefficients[Degree+1] ) -{ - Polynomial< Degree-1 >::BinomialCoefficients( bCoefficients ); - int leftValue = 0; - for( int i=0 ; i +#include +#include +#include "Factor.h" + +//////////////// +// Polynomial // +//////////////// +template +Polynomial::Polynomial(void){memset(coefficients,0,sizeof(double)*(Degree+1));} +template +template +Polynomial::Polynomial(const Polynomial& P){ + memset(coefficients,0,sizeof(double)*(Degree+1)); + for(int i=0;i<=Degree && i<=Degree2;i++){coefficients[i]=P.coefficients[i];} +} + + +template +template +Polynomial& Polynomial::operator = (const Polynomial &p){ + int d=Degree +Polynomial Polynomial::derivative(void) const{ + Polynomial p; + for(int i=0;i +Polynomial Polynomial::integral(void) const{ + Polynomial p; + p.coefficients[0]=0; + for(int i=0;i<=Degree;i++){p.coefficients[i+1]=coefficients[i]/(i+1);} + return p; +} +template<> double Polynomial< 0 >::operator() ( double t ) const { return coefficients[0]; } +template<> double Polynomial< 1 >::operator() ( double t ) const { return coefficients[0]+coefficients[1]*t; } +template<> double Polynomial< 2 >::operator() ( double t ) const { return coefficients[0]+(coefficients[1]+coefficients[2]*t)*t; } +template +double Polynomial::operator() ( double t ) const{ + double v=coefficients[Degree]; + for( int d=Degree-1 ; d>=0 ; d-- ) v = v*t + coefficients[d]; + return v; +} +template +double Polynomial::integral( double tMin , double tMax ) const +{ + double v=0; + double t1,t2; + t1=tMin; + t2=tMax; + for(int i=0;i<=Degree;i++){ + v+=coefficients[i]*(t2-t1)/(i+1); + if(t1!=-DBL_MAX && t1!=DBL_MAX){t1*=tMin;} + if(t2!=-DBL_MAX && t2!=DBL_MAX){t2*=tMax;} + } + return v; +} +template +int Polynomial::operator == (const Polynomial& p) const{ + for(int i=0;i<=Degree;i++){if(coefficients[i]!=p.coefficients[i]){return 0;}} + return 1; +} +template +int Polynomial::operator != (const Polynomial& p) const{ + for(int i=0;i<=Degree;i++){if(coefficients[i]==p.coefficients[i]){return 0;}} + return 1; +} +template +int Polynomial::isZero(void) const{ + for(int i=0;i<=Degree;i++){if(coefficients[i]!=0){return 0;}} + return 1; +} +template +void Polynomial::setZero(void){memset(coefficients,0,sizeof(double)*(Degree+1));} + +template +Polynomial& Polynomial::addScaled(const Polynomial& p,double s){ + for(int i=0;i<=Degree;i++){coefficients[i]+=p.coefficients[i]*s;} + return *this; +} +template +Polynomial& Polynomial::operator += (const Polynomial& p){ + for(int i=0;i<=Degree;i++){coefficients[i]+=p.coefficients[i];} + return *this; +} +template +Polynomial& Polynomial::operator -= (const Polynomial& p){ + for(int i=0;i<=Degree;i++){coefficients[i]-=p.coefficients[i];} + return *this; +} +template +Polynomial Polynomial::operator + (const Polynomial& p) const{ + Polynomial q; + for(int i=0;i<=Degree;i++){q.coefficients[i]=(coefficients[i]+p.coefficients[i]);} + return q; +} +template +Polynomial Polynomial::operator - (const Polynomial& p) const{ + Polynomial q; + for(int i=0;i<=Degree;i++) {q.coefficients[i]=coefficients[i]-p.coefficients[i];} + return q; +} +template +void Polynomial::Scale(const Polynomial& p,double w,Polynomial& q){ + for(int i=0;i<=Degree;i++){q.coefficients[i]=p.coefficients[i]*w;} +} +template +void Polynomial::AddScaled(const Polynomial& p1,double w1,const Polynomial& p2,double w2,Polynomial& q){ + for(int i=0;i<=Degree;i++){q.coefficients[i]=p1.coefficients[i]*w1+p2.coefficients[i]*w2;} +} +template +void Polynomial::AddScaled(const Polynomial& p1,double w1,const Polynomial& p2,Polynomial& q){ + for(int i=0;i<=Degree;i++){q.coefficients[i]=p1.coefficients[i]*w1+p2.coefficients[i];} +} +template +void Polynomial::AddScaled(const Polynomial& p1,const Polynomial& p2,double w2,Polynomial& q){ + for(int i=0;i<=Degree;i++){q.coefficients[i]=p1.coefficients[i]+p2.coefficients[i]*w2;} +} + +template +void Polynomial::Subtract(const Polynomial &p1,const Polynomial& p2,Polynomial& q){ + for(int i=0;i<=Degree;i++){q.coefficients[i]=p1.coefficients[i]-p2.coefficients[i];} +} +template +void Polynomial::Negate(const Polynomial& in,Polynomial& out){ + out=in; + for(int i=0;i<=Degree;i++){out.coefficients[i]=-out.coefficients[i];} +} + +template +Polynomial Polynomial::operator - (void) const{ + Polynomial q=*this; + for(int i=0;i<=Degree;i++){q.coefficients[i]=-q.coefficients[i];} + return q; +} +template +template +Polynomial Polynomial::operator * (const Polynomial& p) const{ + Polynomial q; + for(int i=0;i<=Degree;i++){for(int j=0;j<=Degree2;j++){q.coefficients[i+j]+=coefficients[i]*p.coefficients[j];}} + return q; +} + +template +Polynomial& Polynomial::operator += ( double s ) +{ + coefficients[0]+=s; + return *this; +} +template +Polynomial& Polynomial::operator -= ( double s ) +{ + coefficients[0]-=s; + return *this; +} +template +Polynomial& Polynomial::operator *= ( double s ) +{ + for(int i=0;i<=Degree;i++){coefficients[i]*=s;} + return *this; +} +template +Polynomial& Polynomial::operator /= ( double s ) +{ + for(int i=0;i<=Degree;i++){coefficients[i]/=s;} + return *this; +} +template +Polynomial Polynomial::operator + ( double s ) const +{ + Polynomial q=*this; + q.coefficients[0]+=s; + return q; +} +template +Polynomial Polynomial::operator - ( double s ) const +{ + Polynomial q=*this; + q.coefficients[0]-=s; + return q; +} +template +Polynomial Polynomial::operator * ( double s ) const +{ + Polynomial q; + for(int i=0;i<=Degree;i++){q.coefficients[i]=coefficients[i]*s;} + return q; +} +template +Polynomial Polynomial::operator / ( double s ) const +{ + Polynomial q; + for( int i=0 ; i<=Degree ; i++ ) q.coefficients[i] = coefficients[i]/s; + return q; +} +template +Polynomial Polynomial::scale( double s ) const +{ + Polynomial q=*this; + double s2=1.0; + for(int i=0;i<=Degree;i++){ + q.coefficients[i]*=s2; + s2/=s; + } + return q; +} +template +Polynomial Polynomial::shift( double t ) const +{ + Polynomial q; + for(int i=0;i<=Degree;i++){ + double temp=1; + for(int j=i;j>=0;j--){ + q.coefficients[j]+=coefficients[i]*temp; + temp*=-t*j; + temp/=(i-j+1); + } + } + return q; +} +template +void Polynomial::printnl(void) const{ + for(int j=0;j<=Degree;j++){ + printf("%6.4f x^%d ",coefficients[j],j); + if(j=0){printf("+");} + } + printf("\n"); +} +template +void Polynomial::getSolutions(double c,std::vector& roots,double EPS) const +{ + double r[4][2]; + int rCount=0; + roots.clear(); + switch(Degree){ + case 1: + rCount=Factor(coefficients[1],coefficients[0]-c,r,EPS); + break; + case 2: + rCount=Factor(coefficients[2],coefficients[1],coefficients[0]-c,r,EPS); + break; + case 3: + rCount=Factor(coefficients[3],coefficients[2],coefficients[1],coefficients[0]-c,r,EPS); + break; +// case 4: +// rCount=Factor(coefficients[4],coefficients[3],coefficients[2],coefficients[1],coefficients[0]-c,r,EPS); +// break; + default: + printf("Can't solve polynomial of degree: %d\n",Degree); + } + for(int i=0;i +int Polynomial::getSolutions( double c , double* roots , double EPS ) const +{ + double _roots[4][2]; + int _rCount=0; + switch( Degree ) + { + case 1: _rCount = Factor( coefficients[1] , coefficients[0]-c , _roots , EPS ) ; break; + case 2: _rCount = Factor( coefficients[2] , coefficients[1] , coefficients[0]-c , _roots , EPS ) ; break; + case 3: _rCount = Factor( coefficients[3] , coefficients[2] , coefficients[1] , coefficients[0]-c , _roots , EPS ) ; break; +// case 4: _rCount = Factor( coefficients[4] , coefficients[3] , coefficients[2] , coefficients[1] , coefficients[0]-c , _roots , EPS ) ; break; + default: printf( "Can't solve polynomial of degree: %d\n" , Degree ); + } + int rCount = 0; + for( int i=0 ; i<_rCount ; i++ ) if( fabs(_roots[i][1])<=EPS ) roots[rCount++] = _roots[i][0]; + return rCount; +} +// The 0-th order B-spline +template< > +Polynomial< 0 > Polynomial< 0 >::BSplineComponent( int i ) +{ + Polynomial p; + p.coefficients[0] = 1.; + return p; +} + +// The Degree-th order B-spline +template< int Degree > +Polynomial< Degree > Polynomial< Degree >::BSplineComponent( int i ) +{ + // B_d^i(x) = \int_x^1 B_{d-1}^{i}(y) dy + \int_0^x B_{d-1}^{i-1} y dy + // = \int_0^1 B_{d-1}^{i}(y) dy - \int_0^x B_{d-1}^{i}(y) dy + \int_0^x B_{d-1}^{i-1} y dy + Polynomial p; + if( i _p = Polynomial< Degree-1 >::BSplineComponent( i ).integral(); + p -= _p; + p.coefficients[0] += _p(1); + } + if( i>0 ) + { + Polynomial< Degree > _p = Polynomial< Degree-1 >::BSplineComponent( i-1 ).integral(); + p += _p; + } + return p; +} + + +// The 0-th order B-spline values +template< > void Polynomial< 0 >::BSplineComponentValues( double x , double* values ){ values[0] = 1.; } +// The Degree-th order B-spline +template< int Degree > void Polynomial< Degree >::BSplineComponentValues( double x , double* values ) +{ + const double Scale = 1./Degree; + Polynomial< Degree-1 >::BSplineComponentValues( x , values+1 ); + values[0] = values[1] * (1.-x) * Scale; + for( int i=1 ; i void Polynomial< 0 >::BinomialCoefficients( int bCoefficients[1] ){ bCoefficients[0] = 1; } +template< int Degree > void Polynomial< Degree >::BinomialCoefficients( int bCoefficients[Degree+1] ) +{ + Polynomial< Degree-1 >::BinomialCoefficients( bCoefficients ); + int leftValue = 0; + for( int i=0 ; i -struct MatrixEntry -{ - MatrixEntry( void ) { N =-1; Value = 0; } - MatrixEntry( int i ) { N = i; Value = 0; } - MatrixEntry( int i , T v ) { N = i; Value = v; } - int N; - T Value; -}; - -template class SparseMatrix -{ -private: - bool _contiguous; - int _maxEntriesPerRow; - void _init( void ); -public: - int rows; - Pointer( int ) rowSizes; - Pointer( Pointer( MatrixEntry< T > ) ) m_ppElements; - Pointer( MatrixEntry< T > ) operator[] ( int idx ) { return m_ppElements[idx]; } - ConstPointer( MatrixEntry< T > ) operator[] ( int idx ) const { return m_ppElements[idx]; } - - SparseMatrix( void ); - SparseMatrix( int rows ); - SparseMatrix( int rows , int maxEntriesPerRow ); - void Resize( int rows ); - void Resize( int rows , int maxEntriesPerRow ); - void SetRowSize( int row , int count ); - int Entries( void ) const; - - SparseMatrix( const SparseMatrix& M ); - ~SparseMatrix(); - - void SetZero(); - - SparseMatrix& operator = (const SparseMatrix& M); - - SparseMatrix operator * (const T& V) const; - SparseMatrix& operator *= (const T& V); - - template< class T2 > void Multiply( ConstPointer( T2 ) in , Pointer( T2 ) out , int threads=1 ) const; - template< class T2 > void MultiplyAndAddAverage( ConstPointer( T2 ) in , Pointer( T2 ) out , int threads=1 ) const; - - bool write( FILE* fp ) const; - bool write( const char* fileName ) const; - bool read( FILE* fp ); - bool read( const char* fileName ); - - template< class T2 > void getDiagonal( Pointer( T2 ) diagonal , int threads=1 ) const; - template< class T2 > static int SolveJacobi( const SparseMatrix& M , ConstPointer( T2 ) b , Pointer( T2 ) x , Pointer( T2 ) Mx , T2 sor , int threads=1 ); - template< class T2 > static int SolveJacobi( const SparseMatrix& M , ConstPointer( T2 ) diagonal , ConstPointer( T2 ) b , Pointer( T2 ) x , Pointer( T2 ) Mx , T2 sor , int threads=1 ); - template< class T2 > static int SolveGS( const SparseMatrix& M , ConstPointer( T2 ) b , Pointer( T2 ) x , bool forward ); - template< class T2 > static int SolveGS( const SparseMatrix& M , ConstPointer( T2 ) diagonal , ConstPointer( T2 ) b , Pointer( T2 ) x , bool forward ); - template< class T2 > static int SolveGS( const std::vector< std::vector< int > >& mcIndices , const SparseMatrix& M , ConstPointer( T2 ) diagonal , ConstPointer( T2 ) b , Pointer( T2 ) x , bool forward , int threads=1 ); - template< class T2 > static int SolveGS( const std::vector< std::vector< int > >& mcIndices , const SparseMatrix& M , ConstPointer( T2 ) b , Pointer( T2 ) x , bool forward , int threads=1 ); - template< class T2 > static int SolveCG( const SparseMatrix& M , ConstPointer( T2 ) b , int iters , Pointer( T2 ) x , T2 eps=1e-8 , int reset=1 , bool addDCTerm=false , bool solveNormal=false , int threads=1 ); -}; - - -#if !NEW_SPARSE_MATRIX -template< class T2 > -struct MapReduceVector -{ -private: - int _dim; -public: - std::vector< T2* > out; - MapReduceVector( void ) { _dim = 0; } - ~MapReduceVector( void ) - { - if( _dim ) for( int t=0 ; t -class SparseSymmetricMatrix : public SparseMatrix< T > -{ -public: - - template< class T2 > - Vector< T2 > operator * ( const Vector& V ) const; - - template< class T2 > - Vector< T2 > Multiply( const Vector& V ) const; - - template< class T2 > - void Multiply( const Vector& In, Vector& Out , bool addDCTerm=false ) const; - - template< class T2 > - void Multiply( const Vector& In, Vector& Out , MapReduceVector< T2 >& OutScratch , bool addDCTerm=false ) const; - - template< class T2 > - void Multiply( const Vector& In, Vector& Out , std::vector< T2* >& OutScratch , const std::vector< int >& bounds ) const; - - template< class T2 > - static int SolveCG( const SparseSymmetricMatrix& M , const Vector& b , int iters , Vector& x , T2 eps=1e-8 , int reset=1 , int threads=0 , bool addDCTerm=false , bool solveNormal=false ); - - template< class T2 > - static int SolveCG( const SparseSymmetricMatrix& M , const Vector& b , int iters , Vector& x , MapReduceVector& scratch , T2 eps=1e-8 , int reset=1 , bool addDCTerm=false , bool solveNormal=false ); -#ifdef WIN32 - template< class T2 > - static int SolveCGAtomic( const SparseSymmetricMatrix& M , const Vector& b , int iters , Vector& x , T2 eps=1e-8 , int reset=1 , int threads=0 , bool solveNormal=false ); -#endif // WIN32 - template< class T2 > - static int SolveJacobi( const SparseSymmetricMatrix& M , const Vector& diagonal , const Vector& b , Vector& x , MapReduceVector& scratch , Vector& Mx , T2 sor , int reset ); - template< class T2 > - static int SolveJacobi( const SparseSymmetricMatrix& M , const Vector& b , int iters , Vector& x , MapReduceVector& scratch , T2 sor=T2(1.) , int reset=1 ); - template< class T2 > - static int SolveJacobi( const SparseSymmetricMatrix& M , const Vector& diagonal , const Vector& b , Vector& x , Vector& Mx , T2 sor , int reset ); - template< class T2 > - static int SolveJacobi( const SparseSymmetricMatrix& M , const Vector& b , int iters , Vector& x , T2 sor=T2(1.) , int reset=1 ); - - enum - { - ORDERING_UPPER_TRIANGULAR , - ORDERING_LOWER_TRIANGULAR , - ORDERING_NONE - }; - template< class T2 > - static int SolveGS( const std::vector< std::vector< int > >& mcIndices , const SparseSymmetricMatrix& M , const Vector& diagonal , const Vector& b , Vector& x , MapReduceVector& scratch , Vector& Mx , Vector& dx , bool forward , int reset ); - template< class T2 > - static int SolveGS( const std::vector< std::vector< int > >& mcIndices , const SparseSymmetricMatrix& M , const Vector& b , int iters , Vector& x , MapReduceVector& scratch , bool forward , int reset=1 ); - - template< class T2 > - static int SolveGS( const SparseSymmetricMatrix& M , const Vector& diagonal , const Vector& b , Vector& x , MapReduceVector& scratch , Vector& Mx , Vector& dx , bool forward , int reset , int ordering ); - template< class T2 > - static int SolveGS( const SparseSymmetricMatrix& M , const Vector& b , int iters , Vector& x , MapReduceVector& scratch , bool forward , int reset=1 , int ordering=ORDERING_NONE ); - template< class T2 > - static int SolveGS( const SparseSymmetricMatrix& M , const Vector& diagonal , const Vector& b , Vector& x , Vector& Mx , Vector& dx , bool forward , int reset , int ordering ); - template< class T2 > - static int SolveGS( const SparseSymmetricMatrix& M , const Vector& b , int iters , Vector& x , bool forward , int reset=1 , int ordering=ORDERING_NONE ); - - template< class T2 > - void getDiagonal( Vector< T2 >& diagonal , int threads=1 ) const; -}; -#endif // !NEW_SPARSE_MATRIX - -#include "SparseMatrix.inl" - -#endif - +/* +Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the distribution. + +Neither the name of the Johns Hopkins University nor the names of its contributors +may be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +*/ + +#ifndef __SPARSEMATRIX_HPP +#define __SPARSEMATRIX_HPP + +#define NEW_SPARSE_MATRIX 1 +#define ZERO_TESTING_JACOBI 1 + + +#include "Array.h" + +template +struct MatrixEntry +{ + MatrixEntry( void ) { N =-1; Value = 0; } + MatrixEntry( int i ) { N = i; Value = 0; } + MatrixEntry( int i , T v ) { N = i; Value = v; } + int N; + T Value; +}; + +template class SparseMatrix +{ +private: + bool _contiguous; + int _maxEntriesPerRow; + void _init( void ); +public: + int rows; + Pointer( int ) rowSizes; + Pointer( Pointer( MatrixEntry< T > ) ) m_ppElements; + Pointer( MatrixEntry< T > ) operator[] ( int idx ) { return m_ppElements[idx]; } + ConstPointer( MatrixEntry< T > ) operator[] ( int idx ) const { return m_ppElements[idx]; } + + SparseMatrix( void ); + SparseMatrix( int rows ); + SparseMatrix( int rows , int maxEntriesPerRow ); + void Resize( int rows ); + void Resize( int rows , int maxEntriesPerRow ); + void SetRowSize( int row , int count ); + int Entries( void ) const; + + SparseMatrix( const SparseMatrix& M ); + ~SparseMatrix(); + + void SetZero(); + + SparseMatrix& operator = (const SparseMatrix& M); + + SparseMatrix operator * (const T& V) const; + SparseMatrix& operator *= (const T& V); + + template< class T2 > void Multiply( ConstPointer( T2 ) in , Pointer( T2 ) out , int threads=1 ) const; + template< class T2 > void MultiplyAndAddAverage( ConstPointer( T2 ) in , Pointer( T2 ) out , int threads=1 ) const; + + bool write( FILE* fp ) const; + bool write( const char* fileName ) const; + bool read( FILE* fp ); + bool read( const char* fileName ); + + template< class T2 > void getDiagonal( Pointer( T2 ) diagonal , int threads=1 ) const; + template< class T2 > static int SolveJacobi( const SparseMatrix& M , ConstPointer( T2 ) b , Pointer( T2 ) x , Pointer( T2 ) Mx , T2 sor , int threads=1 ); + template< class T2 > static int SolveJacobi( const SparseMatrix& M , ConstPointer( T2 ) diagonal , ConstPointer( T2 ) b , Pointer( T2 ) x , Pointer( T2 ) Mx , T2 sor , int threads=1 ); + template< class T2 > static int SolveGS( const SparseMatrix& M , ConstPointer( T2 ) b , Pointer( T2 ) x , bool forward ); + template< class T2 > static int SolveGS( const SparseMatrix& M , ConstPointer( T2 ) diagonal , ConstPointer( T2 ) b , Pointer( T2 ) x , bool forward ); + template< class T2 > static int SolveGS( const std::vector< std::vector< int > >& mcIndices , const SparseMatrix& M , ConstPointer( T2 ) diagonal , ConstPointer( T2 ) b , Pointer( T2 ) x , bool forward , int threads=1 ); + template< class T2 > static int SolveGS( const std::vector< std::vector< int > >& mcIndices , const SparseMatrix& M , ConstPointer( T2 ) b , Pointer( T2 ) x , bool forward , int threads=1 ); + template< class T2 > static int SolveCG( const SparseMatrix& M , ConstPointer( T2 ) b , int iters , Pointer( T2 ) x , T2 eps=1e-8 , int reset=1 , bool addDCTerm=false , bool solveNormal=false , int threads=1 ); +}; + + +#if !NEW_SPARSE_MATRIX +template< class T2 > +struct MapReduceVector +{ +private: + int _dim; +public: + std::vector< T2* > out; + MapReduceVector( void ) { _dim = 0; } + ~MapReduceVector( void ) + { + if( _dim ) for( int t=0 ; t +class SparseSymmetricMatrix : public SparseMatrix< T > +{ +public: + + template< class T2 > + Vector< T2 > operator * ( const Vector& V ) const; + + template< class T2 > + Vector< T2 > Multiply( const Vector& V ) const; + + template< class T2 > + void Multiply( const Vector& In, Vector& Out , bool addDCTerm=false ) const; + + template< class T2 > + void Multiply( const Vector& In, Vector& Out , MapReduceVector< T2 >& OutScratch , bool addDCTerm=false ) const; + + template< class T2 > + void Multiply( const Vector& In, Vector& Out , std::vector< T2* >& OutScratch , const std::vector< int >& bounds ) const; + + template< class T2 > + static int SolveCG( const SparseSymmetricMatrix& M , const Vector& b , int iters , Vector& x , T2 eps=1e-8 , int reset=1 , int threads=0 , bool addDCTerm=false , bool solveNormal=false ); + + template< class T2 > + static int SolveCG( const SparseSymmetricMatrix& M , const Vector& b , int iters , Vector& x , MapReduceVector& scratch , T2 eps=1e-8 , int reset=1 , bool addDCTerm=false , bool solveNormal=false ); +#ifdef WIN32 + template< class T2 > + static int SolveCGAtomic( const SparseSymmetricMatrix& M , const Vector& b , int iters , Vector& x , T2 eps=1e-8 , int reset=1 , int threads=0 , bool solveNormal=false ); +#endif // WIN32 + template< class T2 > + static int SolveJacobi( const SparseSymmetricMatrix& M , const Vector& diagonal , const Vector& b , Vector& x , MapReduceVector& scratch , Vector& Mx , T2 sor , int reset ); + template< class T2 > + static int SolveJacobi( const SparseSymmetricMatrix& M , const Vector& b , int iters , Vector& x , MapReduceVector& scratch , T2 sor=T2(1.) , int reset=1 ); + template< class T2 > + static int SolveJacobi( const SparseSymmetricMatrix& M , const Vector& diagonal , const Vector& b , Vector& x , Vector& Mx , T2 sor , int reset ); + template< class T2 > + static int SolveJacobi( const SparseSymmetricMatrix& M , const Vector& b , int iters , Vector& x , T2 sor=T2(1.) , int reset=1 ); + + enum + { + ORDERING_UPPER_TRIANGULAR , + ORDERING_LOWER_TRIANGULAR , + ORDERING_NONE + }; + template< class T2 > + static int SolveGS( const std::vector< std::vector< int > >& mcIndices , const SparseSymmetricMatrix& M , const Vector& diagonal , const Vector& b , Vector& x , MapReduceVector& scratch , Vector& Mx , Vector& dx , bool forward , int reset ); + template< class T2 > + static int SolveGS( const std::vector< std::vector< int > >& mcIndices , const SparseSymmetricMatrix& M , const Vector& b , int iters , Vector& x , MapReduceVector& scratch , bool forward , int reset=1 ); + + template< class T2 > + static int SolveGS( const SparseSymmetricMatrix& M , const Vector& diagonal , const Vector& b , Vector& x , MapReduceVector& scratch , Vector& Mx , Vector& dx , bool forward , int reset , int ordering ); + template< class T2 > + static int SolveGS( const SparseSymmetricMatrix& M , const Vector& b , int iters , Vector& x , MapReduceVector& scratch , bool forward , int reset=1 , int ordering=ORDERING_NONE ); + template< class T2 > + static int SolveGS( const SparseSymmetricMatrix& M , const Vector& diagonal , const Vector& b , Vector& x , Vector& Mx , Vector& dx , bool forward , int reset , int ordering ); + template< class T2 > + static int SolveGS( const SparseSymmetricMatrix& M , const Vector& b , int iters , Vector& x , bool forward , int reset=1 , int ordering=ORDERING_NONE ); + + template< class T2 > + void getDiagonal( Vector< T2 >& diagonal , int threads=1 ) const; +}; +#endif // !NEW_SPARSE_MATRIX + +#include "SparseMatrix.inl" + +#endif + diff --git a/src/lib/geogram/third_party/PoissonRecon/SparseMatrix.inl b/src/lib/geogram/third_party/PoissonRecon/SparseMatrix.inl index 6ea318d2..da2d3066 100644 --- a/src/lib/geogram/third_party/PoissonRecon/SparseMatrix.inl +++ b/src/lib/geogram/third_party/PoissonRecon/SparseMatrix.inl @@ -1,530 +1,530 @@ -/* -Copyright (c) 2006, Michael Kazhdan and Matthew Bolitho -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the distribution. - -Neither the name of the Johns Hopkins University nor the names of its contributors -may be used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. -*/ - -#include -#include - -/////////////////// -// SparseMatrix // -/////////////////// -/////////////////////////////////////// -// SparseMatrix Methods and Memebers // -/////////////////////////////////////// - -template< class T > -void SparseMatrix< T >::_init( void ) -{ - _contiguous = false; - _maxEntriesPerRow = 0; - rows = 0; - rowSizes = NullPointer( int ); - m_ppElements = NullPointer( Pointer( MatrixEntry< T > ) ); -} - -template< class T > SparseMatrix< T >::SparseMatrix( void ){ _init(); } - -template< class T > SparseMatrix< T >::SparseMatrix( int rows ){ _init() , Resize( rows ); } -template< class T > SparseMatrix< T >::SparseMatrix( int rows , int maxEntriesPerRow ){ _init() , Resize( rows , maxEntriesPerRow ); } - -template< class T > -SparseMatrix< T >::SparseMatrix( const SparseMatrix& M ) -{ - _init(); - if( M._contiguous ) Resize( M.rows , M._maxEntriesPerRow ); - else Resize( M.rows ); - for( int i=0 ; i ) * rowSizes[i] ); - } -} -template -int SparseMatrix::Entries( void ) const -{ - int e = 0; - for( int i=0 ; i -SparseMatrix& SparseMatrix::operator = (const SparseMatrix& M) -{ - if( M._contiguous ) Resize( M.rows , M._maxEntriesPerRow ); - else Resize( M.rows ); - for( int i=0 ; i ) * rowSizes[i] ); - } - return *this; -} - -template -SparseMatrix::~SparseMatrix( void ){ Resize( 0 ); } - -template< class T > -bool SparseMatrix< T >::write( const char* fileName ) const -{ - FILE* fp = fopen( fileName , "wb" ); - if( !fp ) return false; - bool ret = write( fp ); - fclose( fp ); - return ret; -} -template< class T > -bool SparseMatrix< T >::read( const char* fileName ) -{ - FILE* fp = fopen( fileName , "rb" ); - if( !fp ) return false; - bool ret = read( fp ); - fclose( fp ); - return ret; -} -template< class T > -bool SparseMatrix< T >::write( FILE* fp ) const -{ - if( fwrite( &rows , sizeof( int ) , 1 , fp )!=1 ) return false; - if( fwrite( rowSizes , sizeof( int ) , rows , fp )!=rows ) return false; - for( int i=0 ; i ) , rowSizes[i] , fp )!=rowSizes[i] ) return false; - return true; -} -template< class T > -bool SparseMatrix< T >::read( FILE* fp ) -{ - int r; - if( fread( &r , sizeof( int ) , 1 , fp )!=1 ) return false; - Resize( r ); - if( fread( rowSizes , sizeof( int ) , rows , fp )!=rows ) return false; - for( int i=0 ; i ) , rowSizes[i] , fp )!=rowSizes[i] ) return false; - } - return true; -} - - -template< class T > -void SparseMatrix< T >::Resize( int r ) -{ - if( rows>0 ) - { - if( _contiguous ){ if( _maxEntriesPerRow ) FreePointer( m_ppElements[0] ); } - else for( int i=0 ; i( r ); - m_ppElements = AllocPointer< Pointer( MatrixEntry< T > ) >( r ); - memset( rowSizes , 0 , sizeof( int ) * r ); - } - _contiguous = false; - _maxEntriesPerRow = 0; -} -template< class T > -void SparseMatrix< T >::Resize( int r , int e ) -{ - if( rows>0 ) - { - if( _contiguous ){ if( _maxEntriesPerRow ) FreePointer( m_ppElements[0] ); } - else for( int i=0 ; i( r ); - m_ppElements = AllocPointer< Pointer( MatrixEntry< T > ) >( r ); - m_ppElements[0] = AllocPointer< MatrixEntry< T > >( r * e ); - memset( rowSizes , 0 , sizeof( int ) * r ); - for( int i=1 ; i -void SparseMatrix< T >::SetRowSize( int row , int count ) -{ - if( _contiguous ) - { - if( count>_maxEntriesPerRow ) fprintf( stderr , "[ERROR] Cannot set row size on contiguous matrix: %d<=%d\n" , count , _maxEntriesPerRow ) , exit( 0 ); - rowSizes[row] = count; - } - else if( row>=0 && row0 ) m_ppElements[row] = AllocPointer< MatrixEntry< T > >( count ); - // [WARNING] Why wasn't this line here before??? - rowSizes[row] = count; - } -} - - -template -void SparseMatrix::SetZero() -{ - Resize(this->m_N, this->m_M); -} - -template -SparseMatrix SparseMatrix::operator * (const T& V) const -{ - SparseMatrix M(*this); - M *= V; - return M; -} - -template -SparseMatrix& SparseMatrix::operator *= (const T& V) -{ - for( int i=0 ; i -template< class T2 > -void SparseMatrix< T >::Multiply( ConstPointer( T2 ) in , Pointer( T2 ) out , int threads ) const -{ -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=0 ; i ) start = m_ppElements[i]; - ConstPointer( MatrixEntry< T > ) end = start + rowSizes[i]; - ConstPointer( MatrixEntry< T > ) e; - - // Note: m_ppElements[i] is potentially uninitialized, - // to be fixed. - - for( - e=start ; - e!=end ; - e++ - ) { - _out += in[ e->N ] * e->Value; - } - out[i] = _out; - } -} -template< class T > -template< class T2 > -void SparseMatrix< T >::MultiplyAndAddAverage( ConstPointer( T2 ) in , Pointer( T2 ) out , int threads ) const -{ - T2 average = 0; - for( int i=0 ; i -template< class T2 > -int SparseMatrix::SolveJacobi( const SparseMatrix& M , ConstPointer( T2 ) diagonal , ConstPointer( T2 ) b , Pointer( T2 ) x , Pointer( T2 ) Mx , T2 sor , int threads ) -{ - M.Multiply( x , Mx , threads ); -#if ZERO_TESTING_JACOBI - for( int j=0 ; j -template< class T2 > -int SparseMatrix::SolveJacobi( const SparseMatrix& M , ConstPointer( T2 ) b , Pointer( T2 ) x , Pointer( T2 ) Mx , T2 sor , int threads ) -{ - M.Multiply( x , Mx , threads ); -#if ZERO_TESTING_JACOBI - for( int j=0 ; j -template -int SparseMatrix::SolveGS( const SparseMatrix& M , ConstPointer( T2 ) diagonal , ConstPointer( T2 ) b , Pointer( T2 ) x , bool forward ) -{ -#define ITERATE \ - { \ - ConstPointer( MatrixEntry< T > ) start = M[j]; \ - ConstPointer( MatrixEntry< T > ) end = start + M.rowSizes[j]; \ - ConstPointer( MatrixEntry< T > ) e; \ - T2 _b = b[j]; \ - for( e=start ; e!=end ; e++ ) _b -= x[ e->N ] * e->Value; \ - x[j] += _b / diagonal[j]; \ - } - -#if ZERO_TESTING_JACOBI - if( forward ) for( int j=0 ; j=0 ; j-- ){ if( diagonal[j] ){ ITERATE; } } -#else // !ZERO_TESTING_JACOBI - if( forward ) for( int j=0 ; j=0 ; j-- ){ ITERATE; } -#endif // ZERO_TESTING_JACOBI -#undef ITERATE - return M.rows; -} -template -template -int SparseMatrix::SolveGS( const std::vector< std::vector< int > >& mcIndices , const SparseMatrix& M , ConstPointer( T2 ) diagonal , ConstPointer( T2 ) b , Pointer( T2 ) x , bool forward , int threads ) -{ - int sum=0; - -#ifdef _OPENMP -#ifdef _MSC_VER // [Bruno Levy] previously _WIN32, broke compile with MingW -#define SetOMPParallel __pragma( omp parallel for num_threads( threads ) ) -#else // !_MSC_VER -#define SetOMPParallel _Pragma( "omp parallel for num_threads( threads )" ) -#endif // _MSC_VER -#else -#define SetOMPParallel -#endif - -#if ZERO_TESTING_JACOBI -#define ITERATE( indices ) \ - { \ -SetOMPParallel \ - for( int k=0 ; k ) start = M[jj]; \ - ConstPointer( MatrixEntry< T > ) end = start + M.rowSizes[jj]; \ - ConstPointer( MatrixEntry< T > ) e; \ - T2 _b = b[jj]; \ - for( e=start ; e!=end ; e++ ) _b -= x[ e->N ] * e->Value; \ - x[jj] += _b / diagonal[jj]; \ - } \ - } -#else // !ZERO_TESTING_JACOBI -#define ITERATE( indices ) \ - { \ -SetOMPParallel \ - for( int k=0 ; k ) start = M[jj]; \ - ConstPointer( MatrixEntry< T > ) end = start + M.rowSizes[jj]; \ - ConstPointer( MatrixEntry< T > ) e; \ - T2 _b = b[jj]; \ - for( e=start ; e!=end ; e++ ) _b -= x[ e->N ] * e->Value; \ - x[jj] += _b / diagonal[jj]; \ - } \ - } -#endif // ZERO_TESTING_JACOBI - if( forward ) for( int j=0 ; j=0 ; j-- ){ sum += int( mcIndices[j].size() ) ; ITERATE( mcIndices[j] ); } -#undef ITERATE -#undef SetOMPParallel - return sum; -} -template -template -int SparseMatrix::SolveGS( const SparseMatrix& M , ConstPointer( T2 ) b , Pointer( T2 ) x , bool forward ) -{ - int start = forward ? 0 : M.rows-1 , end = forward ? M.rows : -1 , dir = forward ? 1 : -1; - for( int j=start ; j!=end ; j+=dir ) - { - T diagonal = M[j][0].Value; -#if ZERO_TESTING_JACOBI - if( diagonal ) -#endif // ZERO_TESTING_JACOBI - { - ConstPointer( MatrixEntry< T > ) start = M[j]; - ConstPointer( MatrixEntry< T > ) end = start + M.rowSizes[j]; - ConstPointer( MatrixEntry< T > ) e; - start++; - T2 _b = b[j]; - for( e=start ; e!=end ; e++ ) _b -= x[ e->N ] * e->Value; - x[j] = _b / diagonal; - } - } - return M.rows; -} -template -template -int SparseMatrix::SolveGS( const std::vector< std::vector< int > >& mcIndices , const SparseMatrix& M , ConstPointer( T2 ) b , Pointer( T2 ) x , bool forward , int threads ) -{ - int sum=0 , start = forward ? 0 : int( mcIndices.size() )-1 , end = forward ? int( mcIndices.size() ) : -1 , dir = forward ? 1 : -1; - for( int j=start ; j!=end ; j+=dir ) - { - const std::vector< int >& _mcIndices = mcIndices[j]; - sum += int( _mcIndices.size() ); - { -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int k=0 ; k ) start = M[jj]; - ConstPointer( MatrixEntry< T > ) end = start + M.rowSizes[jj]; - ConstPointer( MatrixEntry< T > ) e; - start++; - T2 _b = b[jj]; - for( e=start ; e!=end ; e++ ) _b -= x[ e->N ] * e->Value; - x[jj] = _b / diagonal; - } - } - } - } - return sum; -} - -template< class T > -template< class T2 > -void SparseMatrix< T >::getDiagonal( Pointer( T2 ) diagonal , int threads ) const -{ -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) -#endif - for( int i=0 ; i ) start = m_ppElements[i]; - ConstPointer( MatrixEntry< T > ) end = start + rowSizes[i]; - ConstPointer( MatrixEntry< T > ) e; - for( e=start ; e!=end ; e++ ) if( e->N==i ) d += e->Value; - diagonal[i] = d; - } -} -template< class T > -template< class T2 > -int SparseMatrix< T >::SolveCG( const SparseMatrix& A , ConstPointer( T2 ) b , int iters , Pointer( T2 ) x , T2 eps , int reset , bool addDCTerm , bool solveNormal , int threads ) -{ - eps *= eps; - int dim = A.rows; - Pointer( T2 ) r = AllocPointer< T2 >( dim ); - Pointer( T2 ) d = AllocPointer< T2 >( dim ); - Pointer( T2 ) q = AllocPointer< T2 >( dim ); - Pointer( T2 ) temp = NullPointer( T2 ); - if( reset ) memset( x , 0 , sizeof(T2)* dim ); - if( solveNormal ) temp = AllocPointer< T2 >( dim ); - - double delta_new = 0 , delta_0; - if( solveNormal ) - { - if( addDCTerm ) A.MultiplyAndAddAverage( ( ConstPointer( T2 ) )x , temp , threads ) , A.MultiplyAndAddAverage( ( ConstPointer( T2 ) )temp , r , threads ) , A.MultiplyAndAddAverage( ( ConstPointer( T2 ) )b , temp , threads ); - else A.Multiply( ( ConstPointer( T2 ) )x , temp , threads ) , A.Multiply( ( ConstPointer( T2 ) )temp , r , threads ) , A.Multiply( ( ConstPointer( T2 ) )b , temp , threads ); -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) reduction( + : delta_new ) -#endif - for( int i=0 ; ieps*delta_0 ; ii++ ) - { - if( solveNormal ) - if( addDCTerm ) A.MultiplyAndAddAverage( ( ConstPointer( T2 ) )d , temp , threads ) , A.MultiplyAndAddAverage( ( ConstPointer( T2 ) )temp , q , threads ); - else A.Multiply( ( ConstPointer( T2 ) )d , temp , threads ) , A.Multiply( ( ConstPointer( T2 ) )temp , q , threads ); - else - if( addDCTerm ) A.MultiplyAndAddAverage( ( ConstPointer( T2 ) )d , q , threads ); - else A.Multiply( ( ConstPointer( T2 ) )d , q , threads ); - double dDotQ = 0; -#ifdef _OPENMP -#pragma omp parallel for num_threads( threads ) reduction( + : dDotQ ) -#endif - for( int i=0 ; i +#include + +/////////////////// +// SparseMatrix // +/////////////////// +/////////////////////////////////////// +// SparseMatrix Methods and Memebers // +/////////////////////////////////////// + +template< class T > +void SparseMatrix< T >::_init( void ) +{ + _contiguous = false; + _maxEntriesPerRow = 0; + rows = 0; + rowSizes = NullPointer( int ); + m_ppElements = NullPointer( Pointer( MatrixEntry< T > ) ); +} + +template< class T > SparseMatrix< T >::SparseMatrix( void ){ _init(); } + +template< class T > SparseMatrix< T >::SparseMatrix( int rows ){ _init() , Resize( rows ); } +template< class T > SparseMatrix< T >::SparseMatrix( int rows , int maxEntriesPerRow ){ _init() , Resize( rows , maxEntriesPerRow ); } + +template< class T > +SparseMatrix< T >::SparseMatrix( const SparseMatrix& M ) +{ + _init(); + if( M._contiguous ) Resize( M.rows , M._maxEntriesPerRow ); + else Resize( M.rows ); + for( int i=0 ; i ) * rowSizes[i] ); + } +} +template +int SparseMatrix::Entries( void ) const +{ + int e = 0; + for( int i=0 ; i +SparseMatrix& SparseMatrix::operator = (const SparseMatrix& M) +{ + if( M._contiguous ) Resize( M.rows , M._maxEntriesPerRow ); + else Resize( M.rows ); + for( int i=0 ; i ) * rowSizes[i] ); + } + return *this; +} + +template +SparseMatrix::~SparseMatrix( void ){ Resize( 0 ); } + +template< class T > +bool SparseMatrix< T >::write( const char* fileName ) const +{ + FILE* fp = fopen( fileName , "wb" ); + if( !fp ) return false; + bool ret = write( fp ); + fclose( fp ); + return ret; +} +template< class T > +bool SparseMatrix< T >::read( const char* fileName ) +{ + FILE* fp = fopen( fileName , "rb" ); + if( !fp ) return false; + bool ret = read( fp ); + fclose( fp ); + return ret; +} +template< class T > +bool SparseMatrix< T >::write( FILE* fp ) const +{ + if( fwrite( &rows , sizeof( int ) , 1 , fp )!=1 ) return false; + if( fwrite( rowSizes , sizeof( int ) , rows , fp )!=rows ) return false; + for( int i=0 ; i ) , rowSizes[i] , fp )!=rowSizes[i] ) return false; + return true; +} +template< class T > +bool SparseMatrix< T >::read( FILE* fp ) +{ + int r; + if( fread( &r , sizeof( int ) , 1 , fp )!=1 ) return false; + Resize( r ); + if( fread( rowSizes , sizeof( int ) , rows , fp )!=rows ) return false; + for( int i=0 ; i ) , rowSizes[i] , fp )!=rowSizes[i] ) return false; + } + return true; +} + + +template< class T > +void SparseMatrix< T >::Resize( int r ) +{ + if( rows>0 ) + { + if( _contiguous ){ if( _maxEntriesPerRow ) FreePointer( m_ppElements[0] ); } + else for( int i=0 ; i( r ); + m_ppElements = AllocPointer< Pointer( MatrixEntry< T > ) >( r ); + memset( rowSizes , 0 , sizeof( int ) * r ); + } + _contiguous = false; + _maxEntriesPerRow = 0; +} +template< class T > +void SparseMatrix< T >::Resize( int r , int e ) +{ + if( rows>0 ) + { + if( _contiguous ){ if( _maxEntriesPerRow ) FreePointer( m_ppElements[0] ); } + else for( int i=0 ; i( r ); + m_ppElements = AllocPointer< Pointer( MatrixEntry< T > ) >( r ); + m_ppElements[0] = AllocPointer< MatrixEntry< T > >( r * e ); + memset( rowSizes , 0 , sizeof( int ) * r ); + for( int i=1 ; i +void SparseMatrix< T >::SetRowSize( int row , int count ) +{ + if( _contiguous ) + { + if( count>_maxEntriesPerRow ) fprintf( stderr , "[ERROR] Cannot set row size on contiguous matrix: %d<=%d\n" , count , _maxEntriesPerRow ) , exit( 0 ); + rowSizes[row] = count; + } + else if( row>=0 && row0 ) m_ppElements[row] = AllocPointer< MatrixEntry< T > >( count ); + // [WARNING] Why wasn't this line here before??? + rowSizes[row] = count; + } +} + + +template +void SparseMatrix::SetZero() +{ + Resize(this->m_N, this->m_M); +} + +template +SparseMatrix SparseMatrix::operator * (const T& V) const +{ + SparseMatrix M(*this); + M *= V; + return M; +} + +template +SparseMatrix& SparseMatrix::operator *= (const T& V) +{ + for( int i=0 ; i +template< class T2 > +void SparseMatrix< T >::Multiply( ConstPointer( T2 ) in , Pointer( T2 ) out , int threads ) const +{ +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=0 ; i ) start = m_ppElements[i]; + ConstPointer( MatrixEntry< T > ) end = start + rowSizes[i]; + ConstPointer( MatrixEntry< T > ) e; + + // Note: m_ppElements[i] is potentially uninitialized, + // to be fixed. + + for( + e=start ; + e!=end ; + e++ + ) { + _out += in[ e->N ] * e->Value; + } + out[i] = _out; + } +} +template< class T > +template< class T2 > +void SparseMatrix< T >::MultiplyAndAddAverage( ConstPointer( T2 ) in , Pointer( T2 ) out , int threads ) const +{ + T2 average = 0; + for( int i=0 ; i +template< class T2 > +int SparseMatrix::SolveJacobi( const SparseMatrix& M , ConstPointer( T2 ) diagonal , ConstPointer( T2 ) b , Pointer( T2 ) x , Pointer( T2 ) Mx , T2 sor , int threads ) +{ + M.Multiply( x , Mx , threads ); +#if ZERO_TESTING_JACOBI + for( int j=0 ; j +template< class T2 > +int SparseMatrix::SolveJacobi( const SparseMatrix& M , ConstPointer( T2 ) b , Pointer( T2 ) x , Pointer( T2 ) Mx , T2 sor , int threads ) +{ + M.Multiply( x , Mx , threads ); +#if ZERO_TESTING_JACOBI + for( int j=0 ; j +template +int SparseMatrix::SolveGS( const SparseMatrix& M , ConstPointer( T2 ) diagonal , ConstPointer( T2 ) b , Pointer( T2 ) x , bool forward ) +{ +#define ITERATE \ + { \ + ConstPointer( MatrixEntry< T > ) start = M[j]; \ + ConstPointer( MatrixEntry< T > ) end = start + M.rowSizes[j]; \ + ConstPointer( MatrixEntry< T > ) e; \ + T2 _b = b[j]; \ + for( e=start ; e!=end ; e++ ) _b -= x[ e->N ] * e->Value; \ + x[j] += _b / diagonal[j]; \ + } + +#if ZERO_TESTING_JACOBI + if( forward ) for( int j=0 ; j=0 ; j-- ){ if( diagonal[j] ){ ITERATE; } } +#else // !ZERO_TESTING_JACOBI + if( forward ) for( int j=0 ; j=0 ; j-- ){ ITERATE; } +#endif // ZERO_TESTING_JACOBI +#undef ITERATE + return M.rows; +} +template +template +int SparseMatrix::SolveGS( const std::vector< std::vector< int > >& mcIndices , const SparseMatrix& M , ConstPointer( T2 ) diagonal , ConstPointer( T2 ) b , Pointer( T2 ) x , bool forward , int threads ) +{ + int sum=0; + +#ifdef _OPENMP +#ifdef _MSC_VER // [Bruno Levy] previously _WIN32, broke compile with MingW +#define SetOMPParallel __pragma( omp parallel for num_threads( threads ) ) +#else // !_MSC_VER +#define SetOMPParallel _Pragma( "omp parallel for num_threads( threads )" ) +#endif // _MSC_VER +#else +#define SetOMPParallel +#endif + +#if ZERO_TESTING_JACOBI +#define ITERATE( indices ) \ + { \ +SetOMPParallel \ + for( int k=0 ; k ) start = M[jj]; \ + ConstPointer( MatrixEntry< T > ) end = start + M.rowSizes[jj]; \ + ConstPointer( MatrixEntry< T > ) e; \ + T2 _b = b[jj]; \ + for( e=start ; e!=end ; e++ ) _b -= x[ e->N ] * e->Value; \ + x[jj] += _b / diagonal[jj]; \ + } \ + } +#else // !ZERO_TESTING_JACOBI +#define ITERATE( indices ) \ + { \ +SetOMPParallel \ + for( int k=0 ; k ) start = M[jj]; \ + ConstPointer( MatrixEntry< T > ) end = start + M.rowSizes[jj]; \ + ConstPointer( MatrixEntry< T > ) e; \ + T2 _b = b[jj]; \ + for( e=start ; e!=end ; e++ ) _b -= x[ e->N ] * e->Value; \ + x[jj] += _b / diagonal[jj]; \ + } \ + } +#endif // ZERO_TESTING_JACOBI + if( forward ) for( int j=0 ; j=0 ; j-- ){ sum += int( mcIndices[j].size() ) ; ITERATE( mcIndices[j] ); } +#undef ITERATE +#undef SetOMPParallel + return sum; +} +template +template +int SparseMatrix::SolveGS( const SparseMatrix& M , ConstPointer( T2 ) b , Pointer( T2 ) x , bool forward ) +{ + int start = forward ? 0 : M.rows-1 , end = forward ? M.rows : -1 , dir = forward ? 1 : -1; + for( int j=start ; j!=end ; j+=dir ) + { + T diagonal = M[j][0].Value; +#if ZERO_TESTING_JACOBI + if( diagonal ) +#endif // ZERO_TESTING_JACOBI + { + ConstPointer( MatrixEntry< T > ) start = M[j]; + ConstPointer( MatrixEntry< T > ) end = start + M.rowSizes[j]; + ConstPointer( MatrixEntry< T > ) e; + start++; + T2 _b = b[j]; + for( e=start ; e!=end ; e++ ) _b -= x[ e->N ] * e->Value; + x[j] = _b / diagonal; + } + } + return M.rows; +} +template +template +int SparseMatrix::SolveGS( const std::vector< std::vector< int > >& mcIndices , const SparseMatrix& M , ConstPointer( T2 ) b , Pointer( T2 ) x , bool forward , int threads ) +{ + int sum=0 , start = forward ? 0 : int( mcIndices.size() )-1 , end = forward ? int( mcIndices.size() ) : -1 , dir = forward ? 1 : -1; + for( int j=start ; j!=end ; j+=dir ) + { + const std::vector< int >& _mcIndices = mcIndices[j]; + sum += int( _mcIndices.size() ); + { +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int k=0 ; k ) start = M[jj]; + ConstPointer( MatrixEntry< T > ) end = start + M.rowSizes[jj]; + ConstPointer( MatrixEntry< T > ) e; + start++; + T2 _b = b[jj]; + for( e=start ; e!=end ; e++ ) _b -= x[ e->N ] * e->Value; + x[jj] = _b / diagonal; + } + } + } + } + return sum; +} + +template< class T > +template< class T2 > +void SparseMatrix< T >::getDiagonal( Pointer( T2 ) diagonal , int threads ) const +{ +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) +#endif + for( int i=0 ; i ) start = m_ppElements[i]; + ConstPointer( MatrixEntry< T > ) end = start + rowSizes[i]; + ConstPointer( MatrixEntry< T > ) e; + for( e=start ; e!=end ; e++ ) if( e->N==i ) d += e->Value; + diagonal[i] = d; + } +} +template< class T > +template< class T2 > +int SparseMatrix< T >::SolveCG( const SparseMatrix& A , ConstPointer( T2 ) b , int iters , Pointer( T2 ) x , T2 eps , int reset , bool addDCTerm , bool solveNormal , int threads ) +{ + eps *= eps; + int dim = A.rows; + Pointer( T2 ) r = AllocPointer< T2 >( dim ); + Pointer( T2 ) d = AllocPointer< T2 >( dim ); + Pointer( T2 ) q = AllocPointer< T2 >( dim ); + Pointer( T2 ) temp = NullPointer( T2 ); + if( reset ) memset( x , 0 , sizeof(T2)* dim ); + if( solveNormal ) temp = AllocPointer< T2 >( dim ); + + double delta_new = 0 , delta_0; + if( solveNormal ) + { + if( addDCTerm ) A.MultiplyAndAddAverage( ( ConstPointer( T2 ) )x , temp , threads ) , A.MultiplyAndAddAverage( ( ConstPointer( T2 ) )temp , r , threads ) , A.MultiplyAndAddAverage( ( ConstPointer( T2 ) )b , temp , threads ); + else A.Multiply( ( ConstPointer( T2 ) )x , temp , threads ) , A.Multiply( ( ConstPointer( T2 ) )temp , r , threads ) , A.Multiply( ( ConstPointer( T2 ) )b , temp , threads ); +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) reduction( + : delta_new ) +#endif + for( int i=0 ; ieps*delta_0 ; ii++ ) + { + if( solveNormal ) + if( addDCTerm ) A.MultiplyAndAddAverage( ( ConstPointer( T2 ) )d , temp , threads ) , A.MultiplyAndAddAverage( ( ConstPointer( T2 ) )temp , q , threads ); + else A.Multiply( ( ConstPointer( T2 ) )d , temp , threads ) , A.Multiply( ( ConstPointer( T2 ) )temp , q , threads ); + else + if( addDCTerm ) A.MultiplyAndAddAverage( ( ConstPointer( T2 ) )d , q , threads ); + else A.Multiply( ( ConstPointer( T2 ) )d , q , threads ); + double dDotQ = 0; +#ifdef _OPENMP +#pragma omp parallel for num_threads( threads ) reduction( + : dDotQ ) +#endif + for( int i=0 ; i #endif +#include + // TODO: redirect to geogram Logger. void DumpOutput( const char* format , ... ) { } @@ -258,7 +260,6 @@ namespace GEO { const int Degree = 2; typedef PlyVertex Vertex; - { std::vector< int > indexMap; if( NORMAL_DEGREE>Degree ) @@ -300,7 +301,7 @@ namespace GEO { } DeletePointer(values); } - + tree.GetMCIsoSurface< Degree , WEIGHT_DEGREE , DATA_DEGREE >( densityWeights , colorData , solution , isoValue , mesh , !linear_fit_, !non_manifold_, polygon_mesh_ @@ -313,7 +314,6 @@ namespace GEO { } // Copy mesh to result - surface->clear(); surface->vertices.set_dimension(3); diff --git a/src/lib/geogram/third_party/PoissonRecon/poisson_geogram.h b/src/lib/geogram/third_party/PoissonRecon/poisson_geogram.h old mode 100755 new mode 100644 diff --git a/src/lib/geogram_gfx/CMakeLists.txt b/src/lib/geogram_gfx/CMakeLists.txt index 199a14c9..b1559752 100755 --- a/src/lib/geogram_gfx/CMakeLists.txt +++ b/src/lib/geogram_gfx/CMakeLists.txt @@ -12,11 +12,7 @@ aux_source_directories(SOURCES "Source Files\\mesh" mesh) aux_source_directories(SOURCES "Source Files\\GLUP" GLUP) aux_source_directories(SOURCES "Source Files\\GLUP\\shaders" GLUP/shaders) aux_source_directories(SOURCES "Source Files\\full_screen_effects" full_screen_effects) - - -if(NOT ANDROID) - aux_source_directories(SOURCES "Source Files\\glup_viewer" glup_viewer) -endif() +aux_source_directories(SOURCES "Source Files\\gui" gui) if(GEOGRAM_WITH_LUA) aux_source_directories(SOURCES "Source Files\\lua" lua) @@ -28,6 +24,13 @@ endif() add_library(geogram_gfx ${SOURCES} $) +if(ANDROID) + target_include_directories(geogram_gfx PRIVATE + ${ANDROID_NDK}/sources/android/native_app_glue + ) + message(STATUS "building for Android") +endif() + set_target_properties(geogram_gfx PROPERTIES VERSION ${VORPALINE_VERSION} SOVERSION ${VORPALINE_VERSION_MAJOR} diff --git a/src/lib/geogram_gfx/GLUP/GLUP.cpp b/src/lib/geogram_gfx/GLUP/GLUP.cpp index b42969fe..71a599a2 100644 --- a/src/lib/geogram_gfx/GLUP/GLUP.cpp +++ b/src/lib/geogram_gfx/GLUP/GLUP.cpp @@ -137,6 +137,7 @@ namespace { return 0; } std::string stage_str(p1, size_t(p2-p1)); + GLenum stage = 0; if(stage_str == "GL_VERTEX_SHADER") { stage = GL_VERTEX_SHADER; @@ -147,7 +148,7 @@ namespace { #ifndef GEO_OS_EMSCRIPTEN else if(stage_str == "GL_GEOMETRY_SHADER") { stage = GL_GEOMETRY_SHADER; - } else if(stage_str == "GL_TESS_CONTROL_SHADER") { + } else if(stage_str == "GL_TESS_CONTROL_SHADER") { stage = GL_TESS_CONTROL_SHADER; } else if(stage_str == "GL_TESS_EVALUATION_SHADER") { stage = GL_TESS_EVALUATION_SHADER; diff --git a/src/lib/geogram_gfx/GLUP/shaders/GLUPGLSL/vertex_shader.h b/src/lib/geogram_gfx/GLUP/shaders/GLUPGLSL/vertex_shader.h index 9c47517e..88e350da 100644 --- a/src/lib/geogram_gfx/GLUP/shaders/GLUPGLSL/vertex_shader.h +++ b/src/lib/geogram_gfx/GLUP/shaders/GLUPGLSL/vertex_shader.h @@ -13,7 +13,7 @@ in vec4 normal_in; #endif out VertexData { -# ifdef GL_ES +#ifdef GL_ES vec4 vertex_clip_space; #endif vec4 color; diff --git a/src/lib/geogram_gfx/ImGui_ext/file_dialog.cpp b/src/lib/geogram_gfx/ImGui_ext/file_dialog.cpp deleted file mode 100644 index 047d177f..00000000 --- a/src/lib/geogram_gfx/ImGui_ext/file_dialog.cpp +++ /dev/null @@ -1,640 +0,0 @@ -/* - * Copyright (c) 2012-2016, Bruno Levy - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of the ALICE Project-Team nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * If you modify this software, you should include a notice giving the - * name of the person performing the modification, the date of modification, - * and the reason for such modification. - * - * Contact: Bruno Levy - * - * Bruno.Levy@inria.fr - * http://www.loria.fr/~levy - * - * ALICE Project - * LORIA, INRIA Lorraine, - * Campus Scientifique, BP 239 - * 54506 VANDOEUVRE LES NANCY CEDEX - * FRANCE - * - */ - -#include -#include -#include -#include -#include - -#include - -namespace { - - /** - * \brief Safer version of strncpy() - * \param[in] dest a pointer to the destination string - * \param[in] source a pointer to the source string - * \param[in] max_dest_size number of characters available in - * destination string - * \return the length of the destination string after copy. If - * the source string + null terminator was greater than max_dest_size, - * then it is cropped. On exit, dest is always null-terminated (in - * contrast with strncpy()). - */ - size_t safe_strncpy( - char* dest, const char* source, size_t max_dest_size - ) { - strncpy(dest, source, max_dest_size-1); - dest[max_dest_size-1] = '\0'; - return strlen(dest); - } - - /** - * \brief Converts a complete path to a file to a label - * displayed in the file browser. - * \details Strips viewer_path from the input path. - * \param[in] path the complete path, can be either a directory or - * a file - * \return the label to be displayed in the menu - */ - std::string path_to_label( - const std::string& viewer_path, const std::string& path - ) { - std::string result = path; - if(GEO::String::string_starts_with(result, viewer_path)) { - result = result.substr( - viewer_path.length(), result.length()-viewer_path.length() - ); - } - return result; - } - - - /** - * \brief Converts an icon symbolic name and a label to a string. - * \param[in] icon_sym the symbolic name of the icon. - * \param[in] label the label to be displayed. - * \return a UTF8 string with the icon and label, or just the label - * if the icon font is not initialized. - */ - std::string icon_label(const char* icon_sym, const char* label) { - wchar_t str[2]; - str[0] = icon_wchar(icon_sym); - if(str[0] == '\0') { - return std::string(label); - } - str[1] = '\0'; - return GEO::String::wchar_to_UTF8(str) + " " + label; - } - -} - -namespace GEO { - - FileDialog::FileDialog( - Application* app, bool save_mode, const std::string& default_filename - ) : - application_(app), - visible_(false), - current_write_extension_index_(0), - pinned_(false), - show_hidden_(false), - scroll_to_file_(false), - save_mode_(save_mode), - are_you_sure_(false) - { -#if defined(GEO_OS_WINDOWS) || defined(GEO_OS_ANDROID) - directory_ = FileSystem::documents_directory() + "/"; -#else - directory_ = FileSystem::get_current_working_directory() + "/"; -#endif - set_default_filename(default_filename); - current_file_index_ = 0; - current_directory_index_ = 0; - current_write_extension_index_ = 0; - } - - FileDialog::FileDialog() : - application_(nullptr), - visible_(false), - current_write_extension_index_(0), - pinned_(false), - show_hidden_(false), - scroll_to_file_(false), - save_mode_(false), - are_you_sure_(false) - { -#if defined(GEO_OS_WINDOWS) || defined(GEO_OS_ANDROID) - directory_ = FileSystem::documents_directory() + "/"; -#else - directory_ = FileSystem::get_current_working_directory() + "/"; -#endif - current_file_index_ = 0; - current_directory_index_ = 0; - current_write_extension_index_ = 0; - } - - void FileDialog::set_default_filename(const std::string& default_filename) { - safe_strncpy( - current_file_, default_filename.c_str(), sizeof(current_file_) - ); - } - - void FileDialog::update_files() { - directories_.clear(); - files_.clear(); - - directories_.push_back("../"); - - std::vector entries; - FileSystem::get_directory_entries(directory_, entries); - std::sort(entries.begin(), entries.end()); - for(index_t i=0; i= directories_.size()) { - current_directory_index_ = 0; - } - if(current_file_index_ >= files_.size()) { - current_file_index_ = 0; - } - if(!save_mode_) { - if(current_file_index_ >= files_.size()) { - current_file_[0] = '\0'; - } else { - safe_strncpy( - current_file_, - files_[current_file_index_].c_str(), - sizeof(current_file_) - ); - } - } - } - - void FileDialog::set_directory(const std::string& directory) { - current_directory_index_ = 0; - current_file_index_ = 0; - if(directory[0] == '/' || directory[1] == ':') { - directory_ = directory; - } else { - directory_ = FileSystem::normalized_path( - directory_ + "/" + - directory - ); - } - if(directory_[directory_.length()-1] != '/') { - directory_ += "/"; - } - update_files(); - } - - int FileDialog::text_input_callback(ImGuiTextEditCallbackData* data) { - FileDialog* dlg = static_cast(data->UserData); - if((data->EventFlag & ImGuiInputTextFlags_CallbackCompletion) != 0) { - dlg->tab_callback(data); - } else if( - (data->EventFlag & ImGuiInputTextFlags_CallbackHistory) != 0 - ) { - if(data->EventKey == ImGuiKey_UpArrow) { - dlg->updown_callback(data,-1); - } else if(data->EventKey == ImGuiKey_DownArrow) { - dlg->updown_callback(data,1); - } - } - return 0; - } - - - void FileDialog::updown_callback( - ImGuiTextEditCallbackData* data, int direction - ) { - int next = int(current_file_index_) + direction; - if(next < 0) { - if(files_.size() == 0) { - current_file_index_ = 0; - } else { - current_file_index_ = index_t(files_.size()-1); - } - } else if(next >= int(files_.size())) { - current_file_index_ = 0; - } else { - current_file_index_ = index_t(next); - } - - if(files_.size() == 0) { - current_file_[0] = '\0'; - } else { - safe_strncpy( - current_file_, - files_[current_file_index_].c_str(), - sizeof(current_file_) - ); - } - update_text_edit_callback_data(data); - scroll_to_file_ = true; - } - - void FileDialog::update_text_edit_callback_data( - ImGuiTextEditCallbackData* data - ) { - data->BufTextLen = int( - safe_strncpy( - data->Buf, current_file_, (size_t)data->BufSize - ) - ); - data->CursorPos = data->BufTextLen; - data->SelectionStart = data->BufTextLen; - data->SelectionEnd = data->BufTextLen; - data->BufDirty = true; - } - - void FileDialog::tab_callback(ImGuiTextEditCallbackData* data) { - std::string file(current_file_); - bool found = false; - for(index_t i=0; isave(file) - ) { - Logger::out("I/O") << "Saved " - << current_file_ << std::endl; - } - } - } else { - selected_file_ = file; - if(application_ != nullptr) { - application_->load(file); - } - } - - if(!pinned_) { - hide(); - } - } - - void FileDialog::draw() { - - if(!visible_) { - return; - } - - ImGui::SetNextWindowSize( - ImVec2( - ImGui::scaling()*400.0f, - ImGui::scaling()*400.0f - ), - ImGuiCond_Once - ); - - ImGui::Begin( - (std::string( - save_mode_ ? "Save as...##" : "Load...##" - )+String::to_string(this)).c_str(), - &visible_, - ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoDocking - ); - - if(ImGui::Button(icon_label("arrow-circle-up","parent").c_str())) { - set_directory("../"); - } - ImGui::SameLine(); - if(ImGui::Button(icon_label("home","home").c_str())) { - set_directory(FileSystem::documents_directory()); - update_files(); - } - ImGui::SameLine(); - if(ImGui::Button(icon_label("recycle","refresh").c_str())) { - update_files(); - } - - if(!save_mode_) { - ImGui::SameLine(); - ImGui::Text("pin"); - ImGui::SameLine(); - ImGui::Checkbox("##pin", &pinned_); - if(ImGui::IsItemHovered()) { - ImGui::SetTooltip("Keeps this dialog open."); - } - } - - draw_disk_drives(); - ImGui::Separator(); - - { - std::vector path; - String::split_string(directory_, '/', path); - for(index_t i=0; i= 2 && path[0][1] == ':') { - new_dir = path[0]; - } else { - new_dir += "/"; - new_dir += path[0]; - } - for(index_t j=1; j<=i; ++j) { - new_dir += "/"; - new_dir += path[j]; - } - set_directory(new_dir); - } - ImGui::SameLine(); - ImGui::Text("/"); - } - } - - const float footer_size = 35.0f*ImGui::scaling(); - { - ImGui::BeginChild( - "##directories", - ImVec2( - ImGui::GetWindowWidth()*0.5f-10.0f*ImGui::scaling(), - -footer_size - ), - true - ); - for(index_t i=0; isupported_write_file_extensions(), - ';', extensions_ - ); - std::string ext = - FileSystem::extension(current_file_); - for(index_t i=0; i write_extensions; - for(index_t i=0; ican_load(filename); - } - std::string ext = FileSystem::extension(filename); - for(size_t i=0; i -#include - -/** - * \file geogram_gfx/ImGui_ext/file_dialog.h - * \brief Implementation of a file dialog for ImGui. - */ - -namespace GEO { - - // TODO: make it independent of GEO::Application - // through callbacks. - - class Application; - - /** - * \brief Implementation of GLUP viewer's file dialog. - */ - class GEOGRAM_GFX_API FileDialog { - public: - - /** - * \brief FileDialog constructor. - * \param[in] application a pointer to the Application - * \param[in] save_mode if true, FileDialog is used to create files - * \param[in] default_filename the default file name used if save_mode - * is set - */ - FileDialog( - Application* application, - bool save_mode=false, - const std::string& default_filename="" - ); - - /** - * \brief FileDialog constructor. - */ - FileDialog(); - - /** - * \brief Sets the default file. - * \details Only valid if save_mode is set. - * \param[in] default_filename the default file name. - */ - void set_default_filename(const std::string& default_filename); - - /** - * \brief Makes this FileDialog visible. - */ - void show() { - update_files(); - visible_ = true; - } - - /** - * \brief Makes this FileDialog invisibile. - */ - void hide() { - visible_ = false; - } - - /** - * \brief Tests whether this FileDialog is visible. - * \retval true if this FileDialog is visible - * \retval false otherwise - */ - bool is_visible() const { - return visible_; - } - - /** - * \brief Draws the console and handles the gui. - */ - void draw(); - - /** - * \brief Sets whether this file dialog is for - * saving file. - * \details If this file dialog is for saving file, - * then the user can enter the name of a non-existing - * file, else he can only select existing files. - * \param[in] x true if this file dialog is for - * saving file. - */ - void set_save_mode(bool x) { - save_mode_ = x; - } - - /** - * \brief Gets the selected file if any and resets it - * to the empty string. - * \return the selected file if there is any or the - * empty string otherwise. - */ - std::string get_and_reset_selected_file() { - std::string result; - std::swap(result,selected_file_); - return result; - } - - /** - * \brief Defines the file extensions managed by this - * FileDialog. - * \param[in] extensions a ';'-separated list of extensions - */ - void set_extensions(const std::string& extensions); - - protected: - - /** - * \brief Tests whether a file can be read. - * \param[in] filename the file name to be tested. - * \retval true if this file can be read. - * \retval false otherwise. - */ - bool can_load(const std::string& filename); - - /** - * \brief Updates the list of files and directories - * displayed by this FileDialog. - */ - void update_files(); - - /** - * \brief Changes the current directory. - * \param[in] directory either the path relative to the - * current directory or an absolute path - */ - void set_directory(const std::string& directory); - - /** - * \brief The callback for handling the text input. - * \param[in,out] data a pointer to the callback data - */ - static int text_input_callback(ImGuiTextEditCallbackData* data); - - /** - * \brief Called whenever the up or down arrows are pressed. - * \param[in,out] data a pointer to the callback data - * \param[in] direction -1 if the up arrow was pressed, 1 if the - * down arrow was pressed - */ - void updown_callback(ImGuiTextEditCallbackData* data, int direction); - - /** - * \brief Called whenever the tab key is pressed. - * \param[in,out] data a pointer to the callback data - */ - void tab_callback(ImGuiTextEditCallbackData* data); - - /** - * \brief Copies the currently selected file into the - * string currently manipulated by InputText. - * \param[out] data a pointer to the callback data - */ - void update_text_edit_callback_data( - ImGuiTextEditCallbackData* data - ); - - /** - * \brief Called whenever a file is selected. - * \param[in] force in save_mode, if set, - * overwrites the file even if it already - * exists. - */ - void file_selected(bool force=false); - - /** - * \brief Handles the "are you sure ?" dialog - * when a file is about to be overwritten. - */ - void draw_are_you_sure(); - - /** - * \brief Under Windows, add buttons to change - * disk drive. - */ - void draw_disk_drives(); - - private: - Application* application_; - bool visible_; - std::string directory_; - index_t current_directory_index_; - index_t current_file_index_; - std::vector directories_; - std::vector files_; - std::vector extensions_; - index_t current_write_extension_index_; - char current_file_[geo_imgui_string_length]; - bool pinned_; - bool show_hidden_; - bool scroll_to_file_; - bool save_mode_; - bool are_you_sure_; - std::string selected_file_; - }; - -} - -#endif diff --git a/src/lib/geogram_gfx/ImGui_ext/icon_font.cpp b/src/lib/geogram_gfx/ImGui_ext/icon_font.cpp index ce483c0f..cfba867e 100644 --- a/src/lib/geogram_gfx/ImGui_ext/icon_font.cpp +++ b/src/lib/geogram_gfx/ImGui_ext/icon_font.cpp @@ -44,6 +44,7 @@ */ #include +#include #include #include @@ -1231,3 +1232,13 @@ wchar_t icon_wchar(const char* name) { void init_icon_table() { init_font_awesome_table(); } + +namespace GEO { + std::string icon_UTF8(const char* name) { + wchar_t result[2]; + result[0] = icon_wchar(name); + result[1] = '\0'; + return String::wchar_to_UTF8(result); + } +} + diff --git a/src/lib/geogram_gfx/ImGui_ext/icon_font.h b/src/lib/geogram_gfx/ImGui_ext/icon_font.h index a712e7ef..2d6c5e0e 100755 --- a/src/lib/geogram_gfx/ImGui_ext/icon_font.h +++ b/src/lib/geogram_gfx/ImGui_ext/icon_font.h @@ -48,6 +48,10 @@ #include +#ifdef __cplusplus +#include +#endif + #ifdef __cplusplus extern "C" { #endif @@ -76,6 +80,20 @@ void GEOGRAM_GFX_API init_icon_table(); #ifdef __cplusplus } #endif - + + +#ifdef __cplusplus + +namespace GEO { + /** + * \brief Gets an icon by name. + * \param[in] name the symbolic name of the icon. + * \return an UTF8 encoded string with the icon or + * the empty string if there is no such icon. + */ + std::string GEOGRAM_GFX_API icon_UTF8(const char* name); +} +#endif + #endif diff --git a/src/lib/geogram_gfx/ImGui_ext/imgui_ext.cpp b/src/lib/geogram_gfx/ImGui_ext/imgui_ext.cpp index b66acbfa..efcf69c9 100644 --- a/src/lib/geogram_gfx/ImGui_ext/imgui_ext.cpp +++ b/src/lib/geogram_gfx/ImGui_ext/imgui_ext.cpp @@ -44,29 +44,19 @@ */ #include -#include +#include #include #include +#include #include +#include #include namespace { - bool initialized = false; - - std::map file_dialogs; + using namespace GEO; - void terminate() { - for(auto& it : file_dialogs) { - delete it.second; - } - } - - void initialize() { - if(!initialized) { - initialized = true; - atexit(terminate); - } - } + bool initialized = false; + bool tooltips_enabled = true; /** * \brief Manages the GUI of a color editor. @@ -169,9 +159,17 @@ namespace { } ImGui::Separator(); ImGui::Text("Palette"); + +#ifdef GEO_OS_ANDROID + int nb_btn_per_row = 4; + float btn_size = 35.0; +#else + int nb_btn_per_row = 8; + float btn_size = 20.0; +#endif for (int n = 0; n < 40; n++) { ImGui::PushID(n); - if ( (n % 8) != 0 ) { + if ( (n % nb_btn_per_row) != 0 ) { ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y); } if (ImGui::ColorButton( @@ -179,8 +177,8 @@ namespace { saved_palette[n], ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_NoTooltip, - ImVec2(20,20)) - ) { + ImVec2(btn_size,btn_size)) + ) { color = ImVec4( saved_palette[n].x, saved_palette[n].y, @@ -204,6 +202,681 @@ namespace { ImGui::PopID(); return result; } + + /**************************************************************************/ + + /** + * \brief Safer version of strncpy() + * \param[in] dest a pointer to the destination string + * \param[in] source a pointer to the source string + * \param[in] max_dest_size number of characters available in + * destination string + * \return the length of the destination string after copy. If + * the source string + null terminator was greater than max_dest_size, + * then it is cropped. On exit, dest is always null-terminated (in + * contrast with strncpy()). + */ + size_t safe_strncpy( + char* dest, const char* source, size_t max_dest_size + ) { + strncpy(dest, source, max_dest_size-1); + dest[max_dest_size-1] = '\0'; + return strlen(dest); + } + + /** + * \brief Converts a complete path to a file to a label + * displayed in the file browser. + * \details Strips viewer_path from the input path. + * \param[in] path the complete path, can be either a directory or + * a file + * \return the label to be displayed in the menu + */ + std::string path_to_label( + const std::string& viewer_path, const std::string& path + ) { + std::string result = path; + if(GEO::String::string_starts_with(result, viewer_path)) { + result = result.substr( + viewer_path.length(), result.length()-viewer_path.length() + ); + } + return result; + } + + + /** + * \brief Converts an icon symbolic name and a label to a string. + * \param[in] icon_sym the symbolic name of the icon. + * \param[in] label the label to be displayed. + * \return a UTF8 string with the icon and label, or just the label + * if the icon font is not initialized. + */ + std::string icon_label(const char* icon_sym, const char* label) { + wchar_t str[2]; + str[0] = icon_wchar(icon_sym); + if(str[0] == '\0') { + return std::string(label); + } + str[1] = '\0'; + return GEO::String::wchar_to_UTF8(str) + " " + label; + } + + /**************************************************************************/ + + /** + * \brief The state for OpenFileDialog() and FileDialog() + */ + class FileDialog { + public: + + /** + * \brief FileDialog constructor. + * \param[in] save_mode if true, FileDialog is used to create files + * \param[in] default_filename the default file name used if save_mode + * is set + */ + FileDialog( + bool save_mode=false, + const std::string& default_filename="" + ) : visible_(false), + current_write_extension_index_(0), + pinned_(false), + show_hidden_(false), + scroll_to_file_(false), + save_mode_(save_mode), + are_you_sure_(false) + { +#if defined(GEO_OS_WINDOWS) || defined(GEO_OS_ANDROID) + directory_ = FileSystem::documents_directory() + "/"; +#else + directory_ = FileSystem::get_current_working_directory() + "/"; +#endif + set_default_filename(default_filename); + current_file_index_ = 0; + current_directory_index_ = 0; + current_write_extension_index_ = 0; + } + + /** + * \brief Sets the default file. + * \details Only valid if save_mode is set. + * \param[in] default_filename the default file name. + */ + void set_default_filename(const std::string& default_filename) { + safe_strncpy( + current_file_, default_filename.c_str(), sizeof(current_file_) + ); + } + + /** + * \brief Makes this FileDialog visible. + */ + void show() { + update_files(); + visible_ = true; + } + + /** + * \brief Makes this FileDialog invisibile. + */ + void hide() { + visible_ = false; + } + + /** + * \brief Draws the console and handles the gui. + */ + void draw() { + if(!visible_) { + return; + } + + ImGui::SetNextWindowSize( + ImVec2(ImGui::scaling()*400.0f, ImGui::scaling()*415.0f), + ImGuiCond_Once + ); + + ImGui::Begin( + (std::string( + save_mode_ ? "Save as...##" : "Load...##" + )+String::to_string(this)).c_str(), + &visible_, + ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoDocking + ); + + if(ImGui::Button(icon_label("arrow-circle-up","parent").c_str())) { + set_directory("../"); + } + ImGui::SameLine(); + if(ImGui::Button(icon_label("home","home").c_str())) { + set_directory(FileSystem::documents_directory()); + update_files(); + } + ImGui::SameLine(); + if(ImGui::Button(icon_label("recycle","refresh").c_str())) { + update_files(); + } + + if(!save_mode_) { + ImGui::SameLine(); + ImGui::Text("pin"); + ImGui::SameLine(); + ImGui::Checkbox("##pin", &pinned_); + if(ImGui::IsItemHovered()) { + ImGui::SetTooltip("Keeps this dialog open."); + } + } + + draw_disk_drives(); + ImGui::Separator(); + + { + std::vector path; + String::split_string(directory_, '/', path); + for(index_t i=0; i= 2 && path[0][1] == ':') { + new_dir = path[0]; + } else { + new_dir += "/"; + new_dir += path[0]; + } + for(index_t j=1; j<=i; ++j) { + new_dir += "/"; + new_dir += path[j]; + } + set_directory(new_dir); + } + ImGui::SameLine(); + ImGui::Text("/"); + } + } + + const float footer_size = 35.0f*ImGui::scaling(); + { + ImGui::BeginChild( + "##directories", + ImVec2( + ImGui::GetWindowWidth()*0.5f-10.0f*ImGui::scaling(), + -footer_size + ), + true + ); + for(index_t i=0; i write_extensions; + for(index_t i=0; i entries; + FileSystem::get_directory_entries(directory_, entries); + std::sort(entries.begin(), entries.end()); + for(index_t i=0; i= directories_.size()) { + current_directory_index_ = 0; + } + if(current_file_index_ >= files_.size()) { + current_file_index_ = 0; + } + if(!save_mode_) { + if(current_file_index_ >= files_.size()) { + current_file_[0] = '\0'; + } else { + safe_strncpy( + current_file_, + files_[current_file_index_].c_str(), + sizeof(current_file_) + ); + } + } + } + + /** + * \brief Changes the current directory. + * \param[in] directory either the path relative to the + * current directory or an absolute path + */ + void set_directory(const std::string& directory) { + current_directory_index_ = 0; + current_file_index_ = 0; + if(directory[0] == '/' || directory[1] == ':') { + directory_ = directory; + } else { + directory_ = FileSystem::normalized_path( + directory_ + "/" + + directory + ); + } + if(directory_[directory_.length()-1] != '/') { + directory_ += "/"; + } + update_files(); + } + + /** + * \brief The callback for handling the text input. + * \param[in,out] data a pointer to the callback data + */ + static int text_input_callback(ImGuiTextEditCallbackData* data) { + FileDialog* dlg = static_cast(data->UserData); + if( + (data->EventFlag & + ImGuiInputTextFlags_CallbackCompletion) != 0 + ) { + dlg->tab_callback(data); + } else if( + (data->EventFlag & ImGuiInputTextFlags_CallbackHistory) != 0 + ) { + if(data->EventKey == ImGuiKey_UpArrow) { + dlg->updown_callback(data,-1); + } else if(data->EventKey == ImGuiKey_DownArrow) { + dlg->updown_callback(data,1); + } + } + return 0; + } + + /** + * \brief Called whenever the up or down arrows are pressed. + * \param[in,out] data a pointer to the callback data + * \param[in] direction -1 if the up arrow was pressed, 1 if the + * down arrow was pressed + */ + void updown_callback(ImGuiTextEditCallbackData* data, int direction) { + int next = int(current_file_index_) + direction; + if(next < 0) { + if(files_.size() == 0) { + current_file_index_ = 0; + } else { + current_file_index_ = index_t(files_.size()-1); + } + } else if(next >= int(files_.size())) { + current_file_index_ = 0; + } else { + current_file_index_ = index_t(next); + } + + if(files_.size() == 0) { + current_file_[0] = '\0'; + } else { + safe_strncpy( + current_file_, + files_[current_file_index_].c_str(), + sizeof(current_file_) + ); + } + update_text_edit_callback_data(data); + scroll_to_file_ = true; + } + + /** + * \brief Called whenever the tab key is pressed. + * \param[in,out] data a pointer to the callback data + */ + void tab_callback(ImGuiTextEditCallbackData* data) { + std::string file(current_file_); + bool found = false; + for(index_t i=0; iBufTextLen = int( + safe_strncpy( + data->Buf, current_file_, (size_t)data->BufSize + ) + ); + data->CursorPos = data->BufTextLen; + data->SelectionStart = data->BufTextLen; + data->SelectionEnd = data->BufTextLen; + data->BufDirty = true; + } + + /** + * \brief Called whenever a file is selected. + * \param[in] force in save_mode, if set, + * overwrites the file even if it already + * exists. + */ + void file_selected(bool force=false) { + std::string file = + FileSystem::normalized_path(directory_+"/"+current_file_); + + if(save_mode_) { + if(!force && FileSystem::is_file(file)) { + are_you_sure_ = true; + return; + } else { + selected_file_ = file; + } + } else { + selected_file_ = file; + } + + if(!pinned_) { + hide(); + } + } + + /** + * \brief Handles the "are you sure ?" dialog + * when a file is about to be overwritten. + */ + void draw_are_you_sure() { + if(are_you_sure_) { + ImGui::OpenPopup("File exists"); + } + if( + ImGui::BeginPopupModal( + "File exists", nullptr, ImGuiWindowFlags_AlwaysAutoResize + ) + ) { + ImGui::Text( + "%s", + (std::string("File ") + current_file_ + + " already exists\nDo you want to overwrite it ?" + ).c_str() + ); + ImGui::Separator(); + if (ImGui::Button( + "Overwrite", + ImVec2(-ImGui::GetContentRegionAvailWidth()/2.0f,0.0f)) + ) { + are_you_sure_ = false; + ImGui::CloseCurrentPopup(); + file_selected(true); + } + ImGui::SameLine(); + if (ImGui::Button("Cancel", ImVec2(-1.0f, 0.0f))) { + are_you_sure_ = false; + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } + } + + /** + * \brief Under Windows, add buttons to change + * disk drive. + */ + void draw_disk_drives() { +#ifdef GEO_OS_WINDOWS + DWORD drives = GetLogicalDrives(); + for(DWORD b=0; b<16; ++b) { + if((drives & (1u << b)) != 0) { + std::string drive; + drive += char('A' + char(b)); + drive += ":"; + if(ImGui::Button(drive.c_str())) { + set_directory(drive); + } + ImGui::SameLine(); + if( + ImGui::GetContentRegionAvailWidth() < + ImGui::CalcTextSize("X:").x + 10.0f*ImGui::scaling() + ) { + ImGui::NewLine(); + } + } + } +#endif + } + + private: + bool visible_; + std::string directory_; + index_t current_directory_index_; + index_t current_file_index_; + std::vector directories_; + std::vector files_; + std::vector extensions_; + index_t current_write_extension_index_; + char current_file_[geo_imgui_string_length]; + bool pinned_; + bool show_hidden_; + bool scroll_to_file_; + bool save_mode_; + bool are_you_sure_; + std::string selected_file_; + }; + + std::map file_dialogs; + + void terminate_imgui_ext() { + for(auto& it : file_dialogs) { + delete it.second; + } + } + + void initialize_imgui_ext() { + if(!initialized) { + initialized = true; + atexit(terminate_imgui_ext); + } + } } namespace ImGui { @@ -241,10 +914,10 @@ namespace ImGui { const char* filename, ImGuiExtFileDialogFlags flags ) { - initialize(); - GEO::FileDialog* dlg = nullptr; + initialize_imgui_ext(); + ::FileDialog* dlg = nullptr; if(file_dialogs.find(label) == file_dialogs.end()) { - file_dialogs[label] = new GEO::FileDialog(); + file_dialogs[label] = new ::FileDialog(); } dlg = file_dialogs[label]; dlg->set_extensions(extensions); @@ -264,7 +937,7 @@ namespace ImGui { filename[0] = '\0'; return false; } - GEO::FileDialog* dlg = file_dialogs[label]; + ::FileDialog* dlg = file_dialogs[label]; dlg->draw(); std::string result = dlg->get_and_reset_selected_file(); @@ -283,8 +956,24 @@ namespace ImGui { } /****************************************************************/ -} + void Tooltip(const char* str) { + if( + tooltips_enabled && (str != nullptr) && (*str != '\0') && + IsItemHovered() + ) { + SetTooltip("%s",str); + } + } + void EnableTooltips() { + tooltips_enabled = true; + } + + void DisableTooltips() { + tooltips_enabled = false; + } + +} diff --git a/src/lib/geogram_gfx/ImGui_ext/imgui_ext.h b/src/lib/geogram_gfx/ImGui_ext/imgui_ext.h index 8bb9376e..770d3296 100644 --- a/src/lib/geogram_gfx/ImGui_ext/imgui_ext.h +++ b/src/lib/geogram_gfx/ImGui_ext/imgui_ext.h @@ -47,6 +47,7 @@ #define GEOGRAM_GFX_IMGUI_EXT #include +#include #ifdef GEO_COMPILER_CLANG #pragma GCC diagnostic push @@ -69,8 +70,8 @@ namespace GEO { /** * \brief Maximum string length for ImGUI. - * \details ImGUI uses plain old C strings (I'd prefer it to use - * std::string, but it is life...). + * TODO replace with ImGui functions to handle dynamic buffer with + * InputText(). */ enum { geo_imgui_string_length = 4096 }; } @@ -130,7 +131,15 @@ namespace ImGui { const char* label, float* color ); - // extensions: ';'-separated list of extensions, whitout '.' + /** + * \brief Opens a file dialog. + * \param[in] label the window label of the file dialog + * \param[in] extensions semi-colon-separated list of extensions, without + * the dot + * \param[in] filename initial filename or empty string + * \details The file dialog is drawn and handled after, by calling + * FileDialog() + */ void GEOGRAM_GFX_API OpenFileDialog( const char* label, const char* extensions, @@ -138,10 +147,80 @@ namespace ImGui { ImGuiExtFileDialogFlags flags ); + /** + * \brief Draws a FileDialog. + * \details If OpenFileDialog() was called before, then the dialog is drawn, + * otherwise it is ignored. + * \param[in] label the window label of the file dialog + * \param[in,out] filename the file to be read + * \param[in] filename_buff_len the size of the buffer pointed by filename + * \retval true if a file was selected + * \retval false otherwise + */ bool GEOGRAM_GFX_API FileDialog( const char* label, char* filename, size_t filename_buff_len ); + + /** + * \brief Adapter for ImGui::MenuItem() for std::string. + */ + inline bool MenuItem( + const std::string& name, const char* shortcut, + bool* p_selected = nullptr, bool enabled = true + ) { + return ImGui::MenuItem(name.c_str(), shortcut, p_selected, enabled); + } + + /** + * \brief Adapter for ImGui::MenuItem() for std::string. + */ + inline bool MenuItem( + const std::string& name, const char* shortcut = nullptr, + bool selected = false, bool enabled = true + ) { + return ImGui::MenuItem(name.c_str(), shortcut, selected, enabled); + } + + /** + * \brief Adapter for ImGui::BeginMenu() for std::string. + */ + inline bool BeginMenu(const std::string& name) { + return ImGui::BeginMenu(name.c_str()); + } + + + /** + * \brief Displays a tooltip. + * \details The tooltip is displayed if the previous item is hovered, + * \p str is non-null and tooltips are enabled. + * \param[in] str the tooltip to be displayed. + * \see EnableTooltips(), DisableToolTips() + */ + void GEOGRAM_GFX_API Tooltip(const char* str); + + /** + * \brief Displays a tooltip. + * \details The tooltip is displayed if the previous item is hovered, + * \p str is non-null and tooltips are enabled. + * \param[in] str the tooltip to be displayed. + * \see EnableTooltips(), DisableToolTips() + */ + inline void Tooltip(const std::string& s) { + Tooltip(s.c_str()); + } + + /** + * \brief Enables tooltips. + * \see ToolTip() + */ + void GEOGRAM_GFX_API EnableTooltips(); + + /** + * \brief Disables tooltips. + * \see ToolTip() + */ + void GEOGRAM_GFX_API DisableTooltips(); } #endif diff --git a/src/lib/geogram_gfx/basic/GL.cpp b/src/lib/geogram_gfx/basic/GL.cpp index d49e3d0a..1c40ed05 100644 --- a/src/lib/geogram_gfx/basic/GL.cpp +++ b/src/lib/geogram_gfx/basic/GL.cpp @@ -149,7 +149,7 @@ namespace { glupBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); -#ifdef GEO_OS_EMSCRIPTEN +#if defined(GEO_OS_EMSCRIPTEN) || defined(GEO_OS_ANDROID) static const char* vshader_source = "#version 100 \n" "attribute vec2 vertex_in; \n" @@ -308,7 +308,7 @@ namespace GEO { #ifdef GEO_GL_440 static bool init = false; - static bool use_glGetBufferParameteri64v = true; + static bool use_glGetBufferParameteri64v = false; // Note: there is a version of glGetBufferParameteriv that uses // 64 bit parameters. Since array data larger than 4Gb will be @@ -486,5 +486,129 @@ namespace GEO { } } + /****************************************************************/ + + + static int htoi(char digit) { + if(digit >= '0' && digit <= '9') { + return digit - '0'; + } + if(digit >= 'a' && digit <= 'f') { + return digit - 'a' + 10; + } + if(digit >= 'A' && digit <= 'F') { + return digit - 'A' + 10; + } + fprintf(stderr, "xpm: unknown digit\n"); + return 0; + } + + /* The colormap. */ + static unsigned char i2r[1024]; + static unsigned char i2g[1024]; + static unsigned char i2b[1024]; + static unsigned char i2a[1024]; + + /* + * Converts a two-digit XPM color code into + * a color index. + */ + static int char_to_index[256][256]; + + void glTexImage2Dxpm(char const* const* xpm_data) { + int width, height, nb_colors, chars_per_pixel; + int line = 0; + int color = 0; + int key1 = 0, key2 = 0; + const char* colorcode; + int x, y; + unsigned char* rgba; + unsigned char* pixel; + + sscanf( + xpm_data[line], "%6d%6d%6d%6d", + &width, &height, &nb_colors, &chars_per_pixel + ); + line++; + if(nb_colors > 1024) { + fprintf(stderr, "xpm with more than 1024 colors\n"); + return; + } + if(chars_per_pixel != 1 && chars_per_pixel != 2) { + fprintf(stderr, "xpm with more than 2 chars per pixel\n"); + return; + } + for(color = 0; color < nb_colors; color++) { + int r, g, b; + int none ; + + key1 = xpm_data[line][0]; + key2 = (chars_per_pixel == 2) ? xpm_data[line][1] : 0; + colorcode = strstr(xpm_data[line], "c #"); + none = 0; + if(colorcode == NULL) { + colorcode = "c #000000"; + if(strstr(xpm_data[line], "None") != NULL) { + none = 1; + } else { + fprintf( + stderr, "unknown xpm color entry (replaced with black)\n" + ); + } + } + colorcode += 3; + + if(strlen(colorcode) == 12) { + r = 16 * htoi(colorcode[0]) + htoi(colorcode[1]); + g = 16 * htoi(colorcode[4]) + htoi(colorcode[5]); + b = 16 * htoi(colorcode[8]) + htoi(colorcode[9]); + } else { + r = 16 * htoi(colorcode[0]) + htoi(colorcode[1]); + g = 16 * htoi(colorcode[2]) + htoi(colorcode[3]); + b = 16 * htoi(colorcode[4]) + htoi(colorcode[5]); + } + + i2r[color] = (unsigned char) r; + i2g[color] = (unsigned char) g; + i2b[color] = (unsigned char) b; + if(none) { + i2a[color] = 0; + } else { + i2a[color] = 255; + } + char_to_index[key1][key2] = color; + line++; + } + rgba = (unsigned char*) malloc((size_t) (width * height * 4)); + pixel = rgba; + for(y = 0; y < height; y++) { + for(x = 0; x < width; x++) { + if(chars_per_pixel == 2) { + key1 = xpm_data[line][2 * x]; + key2 = xpm_data[line][2 * x + 1]; + } else { + key1 = xpm_data[line][x]; + key2 = 0; + } + color = char_to_index[key1][key2]; + pixel[0] = i2r[color]; + pixel[1] = i2g[color]; + pixel[2] = i2b[color]; + pixel[3] = i2a[color]; + pixel += 4; + } + line++; + } + + glTexImage2D( + GL_TEXTURE_2D, 0, + GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgba + ); +#ifndef __EMSCRIPTEN__ + glGenerateMipmap(GL_TEXTURE_2D); +#endif + free(rgba); + } + } diff --git a/src/lib/geogram_gfx/basic/GL.h b/src/lib/geogram_gfx/basic/GL.h index 9b859b29..41f5c854 100644 --- a/src/lib/geogram_gfx/basic/GL.h +++ b/src/lib/geogram_gfx/basic/GL.h @@ -173,6 +173,14 @@ namespace GEO { glupTexCoord4dv(v.data()); } + /** + * \brief Applies a translation. + * \param[in] v the translation vector. + */ + inline void glupTranslate(const vec3& v) { + glupTranslated(v.x, v.y, v.z); + } + /** * \brief Maps texture coordinates from a specified interval to * the unit interval. @@ -326,6 +334,9 @@ namespace GEO { #endif /***********************************************************/ + + void GEOGRAM_GFX_API glTexImage2Dxpm(char const* const* xpm_data); + } #endif diff --git a/src/lib/geogram_gfx/basic/frame_buffer_object.cpp b/src/lib/geogram_gfx/basic/frame_buffer_object.cpp index 0070d8b8..21bd5206 100644 --- a/src/lib/geogram_gfx/basic/frame_buffer_object.cpp +++ b/src/lib/geogram_gfx/basic/frame_buffer_object.cpp @@ -124,7 +124,8 @@ namespace GEO { if(with_depth_buffer) { EM_ASM( if(!Module.WEBGL_depth_texture_ext) { - Module.WEBGL_depth_texture_ext = Module.ctx.getExtension("WEBGL_depth_texture"); + Module.WEBGL_depth_texture_ext = + Module.ctx.getExtension("WEBGL_depth_texture"); if(!Module.WEBGL_depth_texture_ext) { alert("No WEBGL_depth_texture support"); } @@ -185,7 +186,7 @@ namespace GEO { glTexImage2D( GL_TEXTURE_2D, 0, internal_storage, GLsizei(width), GLsizei(height), 0, - GL_RGBA, + GL_RGBA, GL_FLOAT, nullptr ); diff --git a/src/lib/geogram_gfx/full_screen_effects/full_screen_effect.cpp b/src/lib/geogram_gfx/full_screen_effects/full_screen_effect.cpp index ad59826c..3d2a886c 100644 --- a/src/lib/geogram_gfx/full_screen_effects/full_screen_effect.cpp +++ b/src/lib/geogram_gfx/full_screen_effects/full_screen_effect.cpp @@ -56,7 +56,9 @@ namespace { void vertex_shader_preamble_pseudo_file( GLSL::PseudoFileProvider* provider, std::vector& sources ) { - FullScreenEffectImpl* ctxt = dynamic_cast(provider); + FullScreenEffectImpl* ctxt = dynamic_cast( + provider + ); geo_assert(ctxt != nullptr); ctxt->get_vertex_shader_preamble_pseudo_file(sources); } @@ -64,7 +66,9 @@ namespace { void fragment_shader_preamble_pseudo_file( GLSL::PseudoFileProvider* provider, std::vector& sources ) { - FullScreenEffectImpl* ctxt = dynamic_cast(provider); + FullScreenEffectImpl* ctxt = dynamic_cast( + provider + ); geo_assert(ctxt != nullptr); ctxt->get_fragment_shader_preamble_pseudo_file(sources); } @@ -173,7 +177,7 @@ namespace GEO { height_ = height; initialized_ = true ; core_profile_ = CmdLine::get_arg("gfx:GL_profile") == "core"; -#ifdef GEO_OS_EMSCRIPTEN +#if defined(GEO_OS_EMSCRIPTEN) || defined(GEO_OS_ANDROID) ES_profile_ = true; #endif diff --git a/src/lib/geogram_gfx/full_screen_effects/unsharp_masking.cpp b/src/lib/geogram_gfx/full_screen_effects/unsharp_masking.cpp old mode 100755 new mode 100644 index e558a26a..fb8aecb8 --- a/src/lib/geogram_gfx/full_screen_effects/unsharp_masking.cpp +++ b/src/lib/geogram_gfx/full_screen_effects/unsharp_masking.cpp @@ -49,6 +49,13 @@ #include #include +// Requirements for Android compile are the same +// as for Emscripten. +// TODO: something cleaner. +#ifdef GEO_OS_ANDROID +#define GEO_OS_EMSCRIPTEN +#endif + namespace GEO { UnsharpMaskingImpl::UnsharpMaskingImpl() { diff --git a/src/lib/geogram_gfx/glup_viewer/glup_viewer.c b/src/lib/geogram_gfx/glup_viewer/glup_viewer.c deleted file mode 100644 index f3afec25..00000000 --- a/src/lib/geogram_gfx/glup_viewer/glup_viewer.c +++ /dev/null @@ -1,2589 +0,0 @@ -/* - * _____ _ _ _ ____ - * / ___| | | | | | | / _ \ - * | | | | | | | | | |_\ \ - * | | _ | | | | | | | __ / - * | |_| | | |___ | |_| | | | - * \_____/ |_____| \_____/ |_| - * - * _ _ _ _____ _ __ _____ _____ - * | | / / | | | ____| | | / / | ____| | _ \ - * | | / / | | | |__ | | __ / / | |__ | |_| | - * | | / / | | | __| | | / | / / | __| | _ / - * | |/ / | | | |___ | |/ |/ / | |___ | | \ \ - * |___/ |_| |_____| |___/|___/ |_____| |_| \_\ - * - * Version 1.0 - * Bruno Levy, April 2016 - * INRIA, Project ALICE - * - */ - -/* - * Many documentation tags in GLFW that are - * not understood by CLANG. - */ -#ifdef __clang__ -#pragma GCC diagnostic ignored "-Wdocumentation" -#pragma GCC diagnostic ignored "-Wstrict-prototypes" -#endif - -#include "glup_viewer.h" - -#include -#include - - -#ifdef GEO_USE_SYSTEM_GLFW3 -#include -#else -#include -#endif - -#ifdef __EMSCRIPTEN__ -#include -#endif - -#include -#include - -#include - -#include -#include -#include - -#ifdef WIN32 -#include -#else -#include -#include -#endif - -#ifdef WITH_PNG -#include -#endif - -#ifndef __APPLE__ -#include -#endif - -#if defined(__APPLE__) || defined(__linux__) || defined(__EMSCRIPTEN__) -#include -static void glup_viewer_pause() { - usleep(1000); -} -#elif defined(WIN32) -static void glup_viewer_pause() { - Sleep(1); -} -#else -static void glup_viewer_pause() { -} -#endif - - -/* - * CLANG complains with a const -> non-const cast - * for a callback parameter. - */ -#ifdef __clang__ -#pragma GCC diagnostic ignored "-Wcast-qual" -#endif - -#ifdef __EMSCRIPTEN__ -#pragma GCC diagnostic ignored "-Wdouble-promotion" -#endif - -static int glup_viewer_needs_redraw = 1; -static double glup_viewer_start_time = 0.0; - -void glup_viewer_post_redisplay() { - /* - * We observed that triggering only one frame redraw can cause some - * flickering under MacOS/X (maybe it uses triple buffering ?) - */ - glup_viewer_needs_redraw += 2; - /* - * Do not queue more than 10 frame redraws - */ - if(glup_viewer_needs_redraw > 10) { - glup_viewer_needs_redraw = 10; - } -} - -#define glup_viewer_assert(x) \ - if(!(x)) { \ - fprintf(stderr, "%s: assertion fail %s -- %d\n",#x,__FILE__, __LINE__);\ - abort(); \ - } - -#define glup_viewer_assert_not_reached() \ - { \ - fprintf(stderr, "should not go there!! %s -- %d\n",__FILE__,__LINE__); \ - abort(); \ - } - -#define glup_viewer_argused(x) (void) x - -static GlupViewerDisplayFunc display_func = NULL; -static GlupViewerDisplayFunc overlay_func = NULL; -static GlupViewerKeyboardFunc keyboard_func = NULL; -static GlupViewerKeyboardFuncExt keyboard_func_ext = NULL; -static GlupViewerMouseFunc mouse_func = NULL; -static GlupViewerInitFunc init_func = NULL; -static GlupViewerDragDropFunc drag_drop_func = NULL; - -static GLboolean* toggle[256]; -static char* key_description[256]; -static GlupViewerKeyFunc key_func[256]; - -static GLboolean caps[17] = { - GL_FALSE, /* IDLE_REDRAW */ - GL_FALSE, /* DRAW_SCENE */ - GL_FALSE, /* SHOW_HELP */ - GL_FALSE, /* BACKGROUND */ - GL_FALSE, /* unused */ - GL_FALSE, /* ROTATE_LIGHT */ - GL_TRUE, /* 3D */ - GL_TRUE, /* TWEAKBARS */ - GL_FALSE, /* unused */ - GL_FALSE, /* unused */ - GL_FALSE, /* unused */ - GL_FALSE, /* STEREOSCOPIC_DISPLAY */ - GL_FALSE, /* CLIP */ - GL_TRUE, /* SHOW_CLIP */ - GL_FALSE, /* EDIT_CLIP */ - GL_FALSE, /* FIXED_CLIP */ - GL_FALSE /* FULL_SCREEN */ -}; -static int nb_caps = 17; - -static GLfloat params[7] = { - 0.0f, /* unused */ - 0.0f, /* unused */ - 0.0f, /* unused */ - 0.0f, /* unused */ - 0.0f, /* unused */ - 0.09f, /* STEREOSCOPIC_EYE_DISTANCE */ - 1.0f /* ZOOM */ -}; -static int nb_params = 7; - -static const char* title = "g33>|< Viewer"; - -static GLuint background_tex = 0; - -static GLFWwindow* glup_viewer_window = NULL; - - -static GLboolean transparent = GL_FALSE; - -/* ========================== Trackball prototypes ========================= */ -/* (from SGI, see copyright below) */ - -/* - * trackball.h - * A virtual trackball implementation - * Written by Gavin Bell for Silicon Graphics, November 1988. - */ - -/* - * Pass the x and y coordinates of the last and current positions of - * the mouse, scaled so they are from (-1.0 ... 1.0). - * - * The resulting rotation is returned as a quaternion rotation in the - * first paramater. - */ -static void trackball(float q[4], float p1x, float p1y, float p2x, float p2y); - -/* - * Given two quaternions, add them together to get a third quaternion. - * Adding quaternions to get a compound rotation is analagous to adding - * translations to get a compound translation. When incrementally - * adding rotations, the first argument here should be the new - * rotation, the second and third the total rotation (which will be - * over-written with the resulting new total rotation). - */ -static void add_quats(float* q1, float* q2, float* dest); - -/* - * A useful function, builds a rotation matrix in Matrix based on - * given quaternion. - */ -static void build_rotmatrix(float m[4][4], float q[4]); - -/* - * This function computes a quaternion based on an axis (defined by - * the given vector) and an angle about which to rotate. The angle is - * expressed in radians. The result is put into the third argument. - */ -static void axis_to_quat(float a[3], float phi, float q[4]); - -/* ==================== Timing ========================================= */ - -static double now() { -#ifdef WIN32 - return (double)(GetTickCount()) / 1000.0; -#else - struct tms now_tms; - return (double)(times(&now_tms)) / 100.0; -/* return (double)(clock()) / (double) (CLOCKS_PER_SEC); */ -#endif -} - -int glup_viewer_fps() { - static int init = 1; - static double ref = 0; - static int frame = 0; - static double result = 0; - if(init) { - ref = now(); - init = 0; - } - frame++; - if((frame % 20) == 0) { - double new_t = now(); - result = frame / (new_t - ref); - ref = new_t; - frame = 0; - } - return (int) result; -} - -/* ==================== GlupViewer implementation ========================= */ - -static int glup_viewer_W = 800; -static int glup_viewer_H = 800; -static int last_x, last_y; -static float cur_rot[4] = {0.0, 0.0, 0.0, 0.0}; -static float cur_xlat[3] = {0.0, 0.0, 0.0}; -static float cur_rot_light[4] = {0.0, 0.0, 0.0, 0.0}; -static float cur_rot_clip[4] = {0.0, 0.0, 0.0, 0.0}; -static float cur_xlat_clip[3] = {0.0, 0.0, 0.0}; - -static enum { - NONE, ROTATE, PAN, ZOOM -} mode = NONE; -static float xmin = -1, ymin = -1, zmin = -1, xmax = 1, ymax = 1, zmax = 1; -static float roi_radius = 1.4f; -static int window_w = 0, window_h = 0; - -float* glup_viewer_get_scene_quaternion() { - return cur_rot; -} - -float* glup_viewer_get_scene_translation() { - return cur_xlat; -} - -float* glup_viewer_get_light_quaternion() { - return cur_rot_light; -} - -float* glup_viewer_get_clip_quaternion() { - return cur_rot_clip; -} - -void glup_viewer_enable(int cap) { - glup_viewer_assert(cap < nb_caps); - caps[cap] = GL_TRUE; -} - -void glup_viewer_disable(int cap) { - glup_viewer_assert(cap < nb_caps); - caps[cap] = GL_FALSE; -} - -GLboolean glup_viewer_is_enabled(int cap) { - glup_viewer_assert(cap < nb_caps); - return caps[cap]; -} - -GLboolean* glup_viewer_is_enabled_ptr(int cap) { - glup_viewer_assert(cap < nb_caps); - return &(caps[cap]); -} - -void glup_viewer_toggle(int cap) { - glup_viewer_assert(cap < nb_caps); - caps[cap] = !caps[cap]; -} - -void glup_viewer_set_float(int param, GLfloat value) { - glup_viewer_assert(param < nb_params); - params[param] = value; -} - -GLfloat glup_viewer_get_float(int param) { - glup_viewer_assert(param < nb_params); - return params[param]; -} - -GLfloat* glup_viewer_float_ptr(int param) { - glup_viewer_assert(param < nb_params); - return &(params[param]); -} - -void glup_viewer_get_screen_size(int* w, int* h) { - *w = glup_viewer_W; - *h = glup_viewer_H; -} - -void glup_viewer_set_screen_size(int w, int h) { - glup_viewer_W = w; - glup_viewer_H = h; -} - -static void reshape(int w, int h) { - - int viewport_x = 0; - int viewport_y = 0; - int viewport_width = w; - int viewport_height = h; - - glViewport( - viewport_x, viewport_y, viewport_width, viewport_height - ); - - glup_viewer_W = w; - glup_viewer_H = h; - window_w = w; - window_h = h; - - if(glup_viewer_is_enabled(GLUP_VIEWER_TWEAKBARS)) { - glup_viewer_gui_resize(w,h); - } - - glup_viewer_post_redisplay(); -} - -static GLboolean transform_saved = GL_FALSE; -static GLdouble modelview_save[16]; -static GLdouble project_save[16]; -static GLint viewport_save[4]; - -void glup_viewer_save_transform_for_picking() { - transform_saved = GL_TRUE; - glupGetMatrixdv(GLUP_MODELVIEW_MATRIX, modelview_save); - glupGetMatrixdv(GLUP_PROJECTION_MATRIX, project_save); - glGetIntegerv(GL_VIEWPORT, viewport_save); -} - -static GLdouble ray_p_save[3]; -static GLdouble ray_v_save[3]; -static GLdouble ray_p3d_save[3]; -static GLboolean ray_hit_background; - -void glup_viewer_get_picked_ray(GLdouble* p, GLdouble* v) { - unsigned int i; - for(i = 0; i < 3; i++) { - p[i] = ray_p_save[i]; - v[i] = ray_v_save[i]; - } -} - -void glup_viewer_get_picked_point(GLdouble* p, GLboolean* hit_background) { - unsigned int i; - for(i = 0; i < 3; i++) { - p[i] = ray_p3d_save[i]; - } - *hit_background = ray_hit_background; -} - -void glup_viewer_project( - double x_in, double y_in, double z_in, - double* x_out, double* y_out, double* z_out -) { - glupProject( - x_in, y_in, z_in, - modelview_save, project_save, viewport_save, - x_out, y_out, z_out - ); -} - -void glup_viewer_unproject( - double x_in, double y_in, double z_in, - double* x_out, double* y_out, double* z_out -) { - glupUnProject( - x_in, y_in, z_in, - modelview_save, project_save, viewport_save, - x_out, y_out, z_out - ); -} - -static void save_picked_ray(int x_in, int y_in) { - - if(transform_saved) { - unsigned int i; - GLdouble temp[3]; - GLdouble x = (GLdouble) x_in; - GLdouble y = (GLdouble) (viewport_save[3] - y_in); - GLfloat z; - - /* - * Get the correct value of Z - * (since even 2D mode uses perspective xform, if we do not do - * that, we cannot get correct x,y). - */ - - glupProject( - x, y, 0.0, modelview_save, project_save, viewport_save, - &(temp[0]), &(temp[1]), &(temp[2]) - ); - - glupUnProject( - x, y, temp[2], modelview_save, project_save, viewport_save, - &(ray_p_save[0]), &(ray_p_save[1]), &(ray_p_save[2]) - ); - - glupUnProject( - x, y, 1.0, modelview_save, project_save, viewport_save, - &(ray_v_save[0]), &(ray_v_save[1]), &(ray_v_save[2]) - ); - - for(i = 0; i < 3; i++) { - ray_v_save[i] -= ray_p_save[i]; - } - -#ifdef __EMSCRIPTEN__ - /* Cannot read depth buffer with OpenGL/ES2.0, zutalors !! */ - z = 0.5f; -#else - glReadPixels( - (GLint) x, (GLint) y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z - ); -#endif - - glupUnProject( - x, y, (double)(z), - modelview_save, project_save, viewport_save, - &(ray_p3d_save[0]), &(ray_p3d_save[1]), &(ray_p3d_save[2]) - ); - - ray_hit_background = (z == 1.0f); - } -} - -static GLboolean call_mouse_func( - int x, int y, int button, enum GlupViewerEvent event -) { - double l = (double) (window_w > window_h ? window_w : window_h) / 2.0; - double fx = x - (double) window_w / 2.0; - double fy = y - (double) window_h / 2.0; - int mx = (int) (3000.0 * fx / l); - int my = -(int) (3000.0 * fy / l); - GLboolean result = GL_FALSE; - save_picked_ray(x, y); - if(mouse_func == NULL) { - return result; - } - result = mouse_func((float) mx, (float) my, button, event); - glup_viewer_post_redisplay(); - return result; -} - -static int mouse_x = 0; -static int mouse_y = 0; -static int mouse_pressed = 0; - -static void mouse(GLFWwindow* w, int button, int action, int mods) { - glup_viewer_post_redisplay(); - glup_viewer_gui_mouse_button_callback(w, button, action, mods); - if(glup_viewer_gui_takes_input()) { - return; - } - - mouse_pressed = (action == GLFW_PRESS); - if(call_mouse_func( - mouse_x, mouse_y, button, - (action == GLFW_PRESS) ? GLUP_VIEWER_DOWN : GLUP_VIEWER_UP) - ) { - return; - } - mode = NONE; - if(action != GLFW_PRESS) { - return; - } - switch(button) { - case GLFW_MOUSE_BUTTON_1: - mode = PAN; - break; - case GLFW_MOUSE_BUTTON_3: - mode = ZOOM; - break; - case GLFW_MOUSE_BUTTON_2: - mode = ROTATE; - break; - } - last_x = mouse_x; - last_y = mouse_y; -} - -static void scroll(GLFWwindow* w, double xoffset, double yoffset) { - glup_viewer_post_redisplay(); - glup_viewer_gui_scroll_callback(w, xoffset, yoffset); - if(glup_viewer_gui_takes_input()) { - return; - } - -/* - * Under emscripten and apple, mouse wheel is inversed - * as compared to the other platforms. - */ -#if defined(__EMSCRIPTEN__) || defined(__APPLE__) - yoffset *= -1.0; -#endif - - if(yoffset > 0.0) { - *glup_viewer_float_ptr(GLUP_VIEWER_ZOOM) /= 1.1f; - glup_viewer_post_redisplay(); - } else if(yoffset < 0.0) { - *glup_viewer_float_ptr(GLUP_VIEWER_ZOOM) *= 1.1f; - glup_viewer_post_redisplay(); - } -} - -static void motion(int x, int y); - -static void passive_mouse(GLFWwindow* w, double xf, double yf) { - glup_viewer_argused(w); - glup_viewer_post_redisplay(); - if(glup_viewer_gui_takes_input()) { - return; - } - - mouse_x = (int)(xf); - mouse_y = (int)(yf); - - if(mouse_pressed) { - motion(mouse_x,mouse_y); - } -} - -static void motion(int x, int y) { - - int W = window_w; - int H = window_h; - - if(call_mouse_func(x, y, -1, GLUP_VIEWER_MOVE)) { - return; - } - - switch(mode) { - case ROTATE: { - float delta_rot[4]; - trackball(delta_rot, - (float) (2 * last_x - W) / (float) W, - (float) (H - 2 * last_y) / (float) H, - (float) (2 * x - W) / (float) W, - (float) (H - 2 * y) / (float) H - ); - if(glup_viewer_is_enabled(GLUP_VIEWER_ROTATE_LIGHT)) { - add_quats(delta_rot, cur_rot_light, cur_rot_light); - } else { - if( - glup_viewer_is_enabled(GLUP_VIEWER_EDIT_CLIP) || - !glup_viewer_is_enabled(GLUP_VIEWER_FIXED_CLIP) - ) { - add_quats(delta_rot, cur_rot_clip, cur_rot_clip); - } - if( - !glup_viewer_is_enabled(GLUP_VIEWER_CLIP) || - !glup_viewer_is_enabled(GLUP_VIEWER_EDIT_CLIP) - ) { - add_quats(delta_rot, cur_rot, cur_rot); - } - } - } break; - case PAN: { - if(!glup_viewer_is_enabled(GLUP_VIEWER_ROTATE_LIGHT)) { - float delta_x = (float) (last_x - x) / (float) W; - float delta_y = (float) (y - last_y) / (float) H; - if(!glup_viewer_is_enabled(GLUP_VIEWER_EDIT_CLIP)) { - cur_xlat[0] -= 2.0f * delta_x / params[GLUP_VIEWER_ZOOM]; - cur_xlat[1] -= 2.0f * delta_y / params[GLUP_VIEWER_ZOOM]; - } - if( - glup_viewer_is_enabled(GLUP_VIEWER_EDIT_CLIP) || - !glup_viewer_is_enabled(GLUP_VIEWER_FIXED_CLIP) - ) { - cur_xlat_clip[0] -= - 2.0f * delta_x / params[GLUP_VIEWER_ZOOM]; - cur_xlat_clip[1] -= - 2.0f * delta_y / params[GLUP_VIEWER_ZOOM]; - } - } - } break; - case ZOOM: { - if(!glup_viewer_is_enabled(GLUP_VIEWER_ROTATE_LIGHT)) { - params[GLUP_VIEWER_ZOOM] *= - (1.0f + (float) (y - last_y) / (float) H); - } - } break; - case NONE: - break; - } - - last_x = x; - last_y = y; - glup_viewer_post_redisplay(); -} - -void drag_drop(GLFWwindow* w, int nb, const char** p); - -void drag_drop(GLFWwindow* w, int nb, const char** p) { - int i; - glup_viewer_post_redisplay(); - glup_viewer_argused(w); - if(drag_drop_func != NULL) { - for(i=0; i glup_viewer_H) { - cur_text_y *= ((float) glup_viewer_H / (float) glup_viewer_W); - } else { - cur_text_x *= ((float) glup_viewer_W / (float) glup_viewer_H); - } -} - -void glup_viewer_printf(const char* format, ...) { - va_list args; - char buffer[1024]; - va_start(args, format); - vsprintf(buffer, format, args); - va_end(args); - - glupSetColor3f(GLUP_FRONT_AND_BACK_COLOR, 1.0, 1.0, 1.0); - glQuickTextPrintString( - (double)(cur_text_x), (double)(cur_text_y), 0.0, 10.0, buffer - ); - cur_text_y -= 200; -} - - -static void draw_foreground() { - float aspect; - GLboolean vertex_colors_save; - GLboolean texturing_save; - GLboolean mesh_save; - GLUPfloat shrink_save; - GLUPfloat side; - - glup_viewer_clear_text(); - glupMatrixMode(GLUP_PROJECTION_MATRIX); - glupLoadIdentity(); - aspect = (float) (glup_viewer_W) / (float) (glup_viewer_H); - if(aspect > 1.0f) { - side = 3000 * aspect; - } else { - side = 3000 / aspect; - } - - glupOrtho2D( - (double)(-side), (double)(side), (double)(-side), (double)(side) - ); - - glupMatrixMode(GLUP_MODELVIEW_MATRIX); - glupLoadIdentity(); - glDisable(GL_DEPTH_TEST); - glupDisable(GLUP_LIGHTING); - - if( - glup_viewer_is_enabled(GLUP_VIEWER_SHOW_HELP) && - !glup_viewer_is_enabled(GLUP_VIEWER_TWEAKBARS) - ) { - int i; - - glupDisable(GLUP_CLIPPING); - - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glupSetColor4f(GLUP_FRONT_AND_BACK_COLOR, 0, 0, 0.5, 0.5); - - vertex_colors_save = glupIsEnabled(GLUP_VERTEX_COLORS); - texturing_save = glupIsEnabled(GLUP_TEXTURING); - mesh_save = glupIsEnabled(GLUP_DRAW_MESH); - shrink_save = glupGetCellsShrink(); - - glupDisable(GLUP_VERTEX_COLORS); - glupDisable(GLUP_TEXTURING); - glupDisable(GLUP_DRAW_MESH); - glupSetCellsShrink(0.0f); - - glupBegin(GLUP_TRIANGLES); - glupVertex2f(-side, -side); - glupVertex2f(-side, side); - glupVertex2f(side, side); - glupVertex2f(-side, -side); - glupVertex2f(side, side); - glupVertex2f(side, -side); - glupEnd(); - - glDisable(GL_BLEND); - glupColor4f(5, 5, 5, 1); - - glupSetMeshWidth(1); - - glupColor3f(5, 5, 5); - - if(glup_viewer_is_enabled(GLUP_VIEWER_IDLE_REDRAW)) { - glup_viewer_printf( - " --- %s help [%4d FPS ] --- ", title, glup_viewer_fps() - ); - } else { - glup_viewer_printf(" --- %s help --- ", title); - } - glup_viewer_printf(""); - - for(i = 0; i < 256; i++) { - if(!isprint(i)) { - continue; - } - if(key_description[i] != NULL) { - if(toggle[i] != NULL) { - glup_viewer_printf( - "%c:toggle %s (%s)\n", - (char) i, key_description[i], - *toggle[i] ? "on" : "off" - ); - } - if(key_func[i] != NULL) { - glup_viewer_printf("%c:%s\n", (char) i, key_description[i]); - } - } - } - glDisable(GL_BLEND); - if(vertex_colors_save) { - glupEnable(GLUP_VERTEX_COLORS); - } - if(texturing_save) { - glupEnable(GLUP_TEXTURING); - } - if(mesh_save) { - glupEnable(GLUP_DRAW_MESH); - } - glupSetCellsShrink(shrink_save); - } -} - -static void display(void); - -static GLboolean in_main_loop_ = GL_FALSE; -void glup_viewer_redraw() { - if(in_main_loop_) { - display(); - } -} - -#ifndef M_PI -#define M_PI 3.14159 -#endif - -static float to_radians(float x) { - return x * 2.0f * (float) M_PI / 360.0f; -} - -GLfloat* glup_viewer_get_light_matrix() { - static GLfloat m[4][4]; - build_rotmatrix(m, cur_rot_light); - return &m[0][0]; -} - -static float bkg1[3] = {1.0, 1.0, 1.0}; -static float bkg2[3] = {0.0, 0.0, 0.5}; - -void glup_viewer_set_background_color(GLfloat r, GLfloat g, GLfloat b) { - bkg1[0] = r; - bkg1[1] = g; - bkg1[2] = b; -} - -void glup_viewer_set_background_color2(GLfloat r, GLfloat g, GLfloat b) { - bkg2[0] = r; - bkg2[1] = g; - bkg2[2] = b; -} - -GLfloat* glup_viewer_get_background_color() { - return bkg1; -} - -GLfloat* glup_viewer_get_background_color2() { - return bkg2; -} - -static void draw_background() { - float z = 1.0f; - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glDisable(GL_DEPTH_TEST); - glDisable(GL_POLYGON_OFFSET_FILL); - glClear((GLbitfield) (GL_DEPTH_BUFFER_BIT)); - glupMatrixMode(GLUP_PROJECTION_MATRIX); - glupLoadIdentity(); - glupMatrixMode(GLUP_MODELVIEW_MATRIX); - glupLoadIdentity(); - - glupDisable(GLUP_LIGHTING); - glupDisable(GLUP_TEXTURING); - glupDisable(GLUP_CLIPPING); - glupDisable(GLUP_DRAW_MESH); - glupDisable(GLUP_PICKING); - glupSetCellsShrink(0.0f); - - if(background_tex == 0) { - - if(transparent) { - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClear(GL_COLOR_BUFFER_BIT); - } else { - glupEnable(GLUP_VERTEX_COLORS); - glupBegin(GLUP_QUADS); - glupColor3fv(bkg1); - glupVertex3f(-1, -1, z); - glupVertex3f(1, -1, z); - glupColor3fv(bkg2); - glupVertex3f(1, 1, z); - glupVertex3f(-1, 1, z); - glupEnd(); - } - - } else { - - float w = 1.0f; - float h = 1.0f; - - glupEnable(GLUP_TEXTURING); - glupTextureType(GLUP_TEXTURE_2D); - glActiveTexture(GL_TEXTURE0 + GLUP_TEXTURE_2D_UNIT); - glBindTexture(GL_TEXTURE_2D, background_tex); - glupColor4f(1, 1, 1, 1); - glupBegin(GLUP_QUADS); - glupTexCoord2f(0, 0); - glupVertex3f(-w, -h, z); - glupTexCoord2f(1, 0); - glupVertex3f(w, -h, z); - glupTexCoord2f(1, 1); - glupVertex3f(w, h, z); - glupTexCoord2f(0, 1); - glupVertex3f(-w, h, z); - glupEnd(); - glupDisable(GLUP_TEXTURING); - } - glEnable(GL_DEPTH_TEST); - glupEnable(GLUP_LIGHTING); - glEnable(GL_POLYGON_OFFSET_FILL); - glupDisable(GLUP_VERTEX_COLORS); -} - -static void transform_vector( - GLfloat* vtrans, const GLfloat* M, const GLfloat* v -) { - unsigned int i,j; - for(i=0; i<4; ++i) { - vtrans[i] = 0.0; - for(j=0; j<4; ++j) { - vtrans[i] += M[j*4+i]*v[j]; - } - } -} - -static void actually_render_display(double offset) { - GLfloat m[4][4]; - - /* Infinite light location (normalize (1,1,1) */ - static GLfloat light_position[] = {0.57735f, 0.57735f, 0.57735f, 0.0f}; - - /* Transformed light vector */ - GLfloat light_pos_transformed[4]; - - /* field of view of the larger dimension in degrees */ - float camera_aperture = 9.0f; - - float zoom = params[GLUP_VIEWER_ZOOM]; - float zNear = 1.0f; /* near clipping plane */ - float zFar = 10.0f; /* far clipping plane */ - float zScreen = 5.0f; /* screen projection plane */ - - /* half of the distance between the eyes, if in stereo mode */ - float eye_offset = (float) offset; - - /* aspect ratio of the window */ - float aspect = (float) glup_viewer_W / (float) glup_viewer_H; - - /* half the width of the screen */ - float vue_max_size = (float) ( - zScreen * (float) tan((double)(to_radians(camera_aperture) / 2.0f)) - ); - - /* from the central point of view - shift of the vue from the current point of view */ - float vue_shift = eye_offset * zNear / zScreen; - - int i; - - double clip_eqn[4]; - - glup_viewer_effect_begin_frame(); - - if(glup_viewer_is_enabled(GLUP_VIEWER_BACKGROUND)) { - draw_background(); - } else { - glClearColor(bkg1[0], bkg1[1], bkg1[2], 1.0f); - glClear((GLbitfield) (GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT)); - } - - glEnable(GL_DEPTH_TEST); - - glupMatrixMode(GLUP_PROJECTION_MATRIX); - glupLoadIdentity(); - - if(glup_viewer_is_enabled(GLUP_VIEWER_3D)) { - float right; - float top; - - if(aspect < 1) { - top = vue_max_size; - right = top * aspect; - } else { - right = vue_max_size; - top = right / aspect; - } - right /= zoom; - top /= zoom; - glupFrustum( - (double)(-right - vue_shift), (double)(right - vue_shift), - (double)(-top), (double)(top), - (double)(zNear), (double)(zFar) - ); - glupTranslatef(-eye_offset, 0.0, 0.0); - } else { - float x = 1.0f / zoom; - float y = 1.0f / zoom; - if(aspect > 1.0f) { - x *= aspect; - } else { - y /= aspect; - } - glupOrtho( - (double)(-x), (double)(x), - (double)(-y), (double)(y), - (double)(zNear), (double)(zFar) - ); - } - - - build_rotmatrix(m, cur_rot_light); - transform_vector(light_pos_transformed, &m[0][0], light_position); - glupLightVector3fv(light_pos_transformed); - - - glupMatrixMode(GLUP_MODELVIEW_MATRIX); - glupLoadIdentity(); - - glupDisable(GLUP_CLIPPING); - if(glup_viewer_is_enabled(GLUP_VIEWER_CLIP)) { - float* background_color; - - glupPushMatrix(); - - /* translate the world of the distance between eye and center */ - glupTranslatef(0.0, 0.0, -zScreen); - glupTranslatef(cur_xlat_clip[0], cur_xlat_clip[1], cur_xlat_clip[2]); - build_rotmatrix(m, cur_rot_clip); - glupMultMatrixf(&m[0][0]); - - background_color = glup_viewer_get_background_color(); - glupSetColor3f( - GLUP_FRONT_AND_BACK_COLOR, - 1.0f - background_color[0], - 1.0f - background_color[1], - 1.0f - background_color[2] - ); - - - if(glup_viewer_is_enabled(GLUP_VIEWER_SHOW_CLIP)) { - - float sq_w = 1.25f / params[GLUP_VIEWER_ZOOM]; - - GLboolean vertex_colors_save = glupIsEnabled(GLUP_VERTEX_COLORS); - GLboolean texturing_save = glupIsEnabled(GLUP_TEXTURING); - glupDisable(GLUP_VERTEX_COLORS); - glupDisable(GLUP_TEXTURING); - - /* Draw the cross */ - glupBegin(GLUP_LINES); - glupVertex3f(-sq_w, 0.0f, 0.0f); - glupVertex3f(sq_w, 0.0f, 0.0f); - glupVertex3f(0.0f, -sq_w, 0.0f); - glupVertex3f(0.0f, sq_w, 0.0f); - - /* Draw the square around the cross */ - for(i=0; i<3; ++i) { - glupVertex3f(sq_w, -sq_w, 0.0f); - glupVertex3f(sq_w, sq_w, 0.0f); - glupVertex3f(sq_w, sq_w, 0.0f); - glupVertex3f(-sq_w, sq_w, 0.0f); - glupVertex3f(-sq_w, sq_w, 0.0f); - glupVertex3f(-sq_w, -sq_w, 0.0f); - glupVertex3f(-sq_w, -sq_w, 0.0f); - glupVertex3f(sq_w, -sq_w, 0.0f); - sq_w = sq_w * 1.01f; - } - - glupEnd(); - - if(vertex_colors_save) { - glupEnable(GLUP_VERTEX_COLORS); - } - - if(texturing_save) { - glupEnable(GLUP_TEXTURING); - } - - } - - clip_eqn[0] = 0.0; - clip_eqn[1] = 0.0; - clip_eqn[2] = -1.0; - clip_eqn[3] = 0.0; - glupEnable(GLUP_CLIPPING); - glupClipPlane(clip_eqn); - glupPopMatrix(); - } else { - clip_eqn[0] = 0.0; - clip_eqn[1] = 0.0; - clip_eqn[2] = 0.0; - clip_eqn[3] = 0.0; - glupClipPlane(clip_eqn); - glupDisable(GLUP_CLIPPING); - } - - /* translate the world of the distance between eye and center */ - glupTranslatef(0.0, 0.0, -zScreen); - - - /* apply pan */ - glupTranslatef(cur_xlat[0], cur_xlat[1], cur_xlat[2]); - - /* if enabled, apply rotation */ - if(glup_viewer_is_enabled(GLUP_VIEWER_3D)) { - build_rotmatrix(m, cur_rot); - glupMultMatrixf(&m[0][0]); - } - - /* restrict view to the Region Of Interest */ - glupScalef(1.0f / roi_radius, 1.0f / roi_radius, 1.0f / roi_radius); - glupTranslatef( - -0.5f * (xmin + xmax), - -0.5f * (ymin + ymax), - -0.5f * (zmin + zmax) - ); - - if(display_func != NULL) { - glup_viewer_save_transform_for_picking(); - display_func(); - } - - glup_viewer_effect_end_frame(); - - draw_foreground(); -} - -static void display() { -#ifndef __EMSCRIPTEN__ - double eye_dist = - (double)(glup_viewer_get_float(GLUP_VIEWER_STEREOSCOPIC_EYE_DISTANCE)); -#endif - - -#ifndef __EMSCRIPTEN__ - if(glup_viewer_is_enabled(GLUP_VIEWER_STEREOSCOPIC_DISPLAY)) { - /* left eye */ - glDrawBuffer(GL_BACK_LEFT); - glClear(GL_COLOR_BUFFER_BIT); - actually_render_display(-eye_dist); - - /* right eye */ - glDrawBuffer(GL_BACK_RIGHT); - glClear(GL_COLOR_BUFFER_BIT); - actually_render_display(eye_dist); - } else -#endif - - { -#ifndef __EMSCRIPTEN__ - glDrawBuffer(GL_BACK); -#endif - glClear(GL_COLOR_BUFFER_BIT); - actually_render_display(0.0); - } -} - -static void copy_image_to_clipboard(void); - -void glup_viewer_char_callback(GLFWwindow* w, unsigned int c); - -void glup_viewer_char_callback(GLFWwindow* w, unsigned int c) { - - glup_viewer_gui_char_callback(w,c); - - if(glup_viewer_gui_takes_input()) { - return; - } - - if(c == 3) { /* 3 = C */ - copy_image_to_clipboard(); - return; - } - if(keyboard_func != NULL) { - keyboard_func((char) c); - } - if(toggle[c] != NULL) { - *toggle[c] = !*toggle[c]; - glup_viewer_post_redisplay(); - } - if(key_func[c] != NULL) { - key_func[c](); - glup_viewer_post_redisplay(); - } - glup_viewer_post_redisplay(); -} - -static void toggle_clip() { - glup_viewer_toggle(GLUP_VIEWER_CLIP); - if(!glup_viewer_is_enabled(GLUP_VIEWER_CLIP)) { - glup_viewer_disable(GLUP_VIEWER_EDIT_CLIP); - } -} - -static void toggle_edit_clip() { - if(glup_viewer_is_enabled(GLUP_VIEWER_CLIP)) { - glup_viewer_toggle(GLUP_VIEWER_EDIT_CLIP); - } else { - glup_viewer_disable(GLUP_VIEWER_EDIT_CLIP); - } -} - -static void toggle_fixed_clip() { - if(glup_viewer_is_enabled(GLUP_VIEWER_CLIP)) { - glup_viewer_toggle(GLUP_VIEWER_FIXED_CLIP); - glup_viewer_disable(GLUP_VIEWER_EDIT_CLIP); - } -} - -static void glup_viewer_key_callback( - GLFWwindow* w, int key, int scancode, int action, int mods -) { - GLboolean handled = GL_FALSE; - enum GlupViewerEvent ev; - const char* keyname = NULL; - -#ifdef __EMSCRIPTEN__ - static char buffer[2]; -#endif - - glup_viewer_gui_key_callback(w, key, scancode, action, mods); - - if(glup_viewer_gui_takes_input()) { - /* - * We continue capturing keypresses on function keys even if - * ImGUI window is active, else we cannot "run program" with - * F5 / "save file" with F2 in geocod ! - */ - if(key < GLFW_KEY_F1 || key > GLFW_KEY_F12) { - return; - } - } - - - if(keyboard_func_ext != NULL && action != GLFW_REPEAT) { - ev = (action == GLFW_PRESS) ? GLUP_VIEWER_DOWN : GLUP_VIEWER_UP; - -#ifdef __EMSCRIPTEN__ - /* Argh, glfwGetKeyName is not implemented in Emscripten */ - if(key < 128) { - buffer[1] = '\0'; - buffer[0] = (char)(key); - keyname = buffer; - } -#else - keyname = glfwGetKeyName(key,0); -#endif - if(keyname != NULL) { - handled = keyboard_func_ext(keyname,ev); - } else { - if(key == GLFW_KEY_LEFT) { - handled = keyboard_func_ext("left",ev); - } else if(key == GLFW_KEY_RIGHT) { - handled = keyboard_func_ext("right",ev); - } else if(key == GLFW_KEY_UP) { - handled = keyboard_func_ext("up",ev); - } else if(key == GLFW_KEY_DOWN) { - handled = keyboard_func_ext("down",ev); - } else if(key == GLFW_KEY_SPACE) { - handled = keyboard_func_ext(" ",ev); - } else if(key == GLFW_KEY_F1) { - handled = keyboard_func_ext("F1",ev); - } else if(key == GLFW_KEY_F2) { - handled = keyboard_func_ext("F2",ev); - } else if(key == GLFW_KEY_F3) { - handled = keyboard_func_ext("F3",ev); - } else if(key == GLFW_KEY_F4) { - handled = keyboard_func_ext("F4",ev); - } else if(key == GLFW_KEY_F5) { - handled = keyboard_func_ext("F5",ev); - } else if(key == GLFW_KEY_F6) { - handled = keyboard_func_ext("F6",ev); - } else if(key == GLFW_KEY_F7) { - handled = keyboard_func_ext("F7",ev); - } else if(key == GLFW_KEY_F18) { - handled = keyboard_func_ext("F8",ev); - } else if(key == GLFW_KEY_F9) { - handled = keyboard_func_ext("F9",ev); - } else if(key == GLFW_KEY_F10) { - handled = keyboard_func_ext("F10",ev); - } else if(key == GLFW_KEY_F11) { - handled = keyboard_func_ext("F11",ev); - } else if(key == GLFW_KEY_F12) { - handled = keyboard_func_ext("F12",ev); - } else if(key == GLFW_KEY_LEFT_CONTROL) { - handled = keyboard_func_ext("left_control",ev); - } else if(key == GLFW_KEY_RIGHT_CONTROL) { - handled = keyboard_func_ext("right_control",ev); - } else if(key == GLFW_KEY_LEFT_ALT) { - handled = keyboard_func_ext("left_alt",ev); - } else if(key == GLFW_KEY_RIGHT_ALT) { - handled = keyboard_func_ext("right_alt",ev); - } else if(key == GLFW_KEY_LEFT_SHIFT) { - handled = keyboard_func_ext("left_shift",ev); - } else if(key == GLFW_KEY_RIGHT_SHIFT) { - handled = keyboard_func_ext("right_shift",ev); - } else if(key == GLFW_KEY_ESCAPE) { - handled = keyboard_func_ext("escape",ev); - } else if(key == GLFW_KEY_TAB) { - handled = keyboard_func_ext("tab",ev); - } else if(key == GLFW_KEY_BACKSPACE) { - handled = keyboard_func_ext("backspace",ev); - } - } - if(handled) { - glup_viewer_post_redisplay(); - return; - } - } - - if(action != GLFW_PRESS) { - return; - } - - switch(key) { - case GLFW_KEY_F1: - toggle_clip(); - break; - case GLFW_KEY_F2: - toggle_edit_clip(); - break; - case GLFW_KEY_F3: - toggle_fixed_clip(); - break; - case GLFW_KEY_F4: - glup_viewer_toggle(GLUP_VIEWER_SHOW_CLIP); - break; - } - - glup_viewer_post_redisplay(); -} - - -void glup_viewer_home(void) { - cur_xlat[0] = cur_xlat[1] = cur_xlat[2] = 0.0; - params[GLUP_VIEWER_ZOOM] = 1.0; - trackball(cur_rot, 0.0, 0.0, 0.0, 0.0); - trackball(cur_rot_light, 0.0, 0.0, 0.0, 0.0); - trackball(cur_rot_clip, 0.0, 0.0, 0.0, 0.0); -} - -static void init() { - -#ifndef __EMSCRIPTEN__ - if(!gladLoadGL()) { - printf("GLAD: could not load OpenGL\n"); - exit(-1); - } -#endif - - if(glupCurrentContext() == NULL) { - glupMakeCurrent(glupCreateContext()); - } - - if(glupCurrentContext() == NULL) { - exit(-1); - } - - glup_viewer_gui_init(glup_viewer_window); - - glup_viewer_disable(GLUP_VIEWER_IDLE_REDRAW); - glup_viewer_enable(GLUP_VIEWER_DRAW_SCENE); - -#ifndef __EMSCRIPTEN__ - glup_viewer_add_key_func('q', glup_viewer_exit_main_loop, "quit"); - glup_viewer_add_key_func(27, glup_viewer_exit_main_loop, "quit"); -#endif - - glup_viewer_add_key_func('H', glup_viewer_home, "home"); - - glup_viewer_add_toggle('h', &caps[GLUP_VIEWER_SHOW_HELP], "help"); - glup_viewer_add_toggle( - 'l', &caps[GLUP_VIEWER_ROTATE_LIGHT], "light rotation" - ); - - glupEnable(GLUP_LIGHTING); - glEnable(GL_DEPTH_TEST); - - glPolygonOffset(1.0, 2.0); - glEnable(GL_POLYGON_OFFSET_FILL); - - glup_viewer_home(); -} - -void glup_viewer_set_window_title(const char* s) { - title = s; -} - -/***************************************************************/ - -void glup_viewer_set_display_func(GlupViewerDisplayFunc f) { - display_func = f; -} - -void glup_viewer_set_overlay_func(GlupViewerDisplayFunc f) { - overlay_func = f; -} - -void glup_viewer_set_keyboard_func(GlupViewerKeyboardFunc f) { - keyboard_func = f; -} - -void glup_viewer_set_keyboard_func_ext(GlupViewerKeyboardFuncExt f) { - keyboard_func_ext = f; -} - -void glup_viewer_set_mouse_func(GlupViewerMouseFunc f) { - mouse_func = f; -} - -void glup_viewer_set_init_func(GlupViewerInitFunc f) { - init_func = f; -} - -void glup_viewer_set_drag_drop_func(GlupViewerDragDropFunc f) { - drag_drop_func = f; -} - -GlupViewerDisplayFunc glup_viewer_get_display_func() { - return display_func; -} - -GlupViewerDisplayFunc glup_viewer_get_overlay_func() { - return overlay_func; -} - -GlupViewerKeyboardFunc glup_viewer_get_keyboard_func() { - return keyboard_func; -} - -GlupViewerMouseFunc glup_viewer_get_mouse_func() { - return mouse_func; -} - -GlupViewerInitFunc glup_viewer_get_init_func() { - return init_func; -} - -GlupViewerDragDropFunc glup_viewer_get_drag_drop_func() { - return drag_drop_func; -} - -/***************************************************************/ - -static void init_keys_if_needed() { - static int first = 1; - if(first) { - int i; - first = 0; - for(i = 0; i < 256; i++) { - toggle[i] = NULL; - key_description[i] = NULL; - key_func[i] = NULL; - } - } -} - -static void set_key_description(char key, const char* description) { - if(key_description[(int) key] != NULL) { - printf( - "Warning: overriding key %c with %s (was %s)\n", - key, description ? description : "NULL", key_description[(int) key] - ); - } - free(key_description[(int) key]); - if(description == NULL) { - key_description[(int) key] = NULL; - } else { - key_description[(int) key] = malloc(strlen(description) + 1); - strcpy(key_description[(int) key], description); - } -} - -void glup_viewer_add_toggle( - char key, GLboolean* pointer, const char* description -) { - init_keys_if_needed(); - toggle[(int) key] = pointer; - key_func[(int) key] = NULL; - set_key_description(key, description); -} - -void glup_viewer_add_key_func( - char key, GlupViewerKeyFunc f, const char* description -) { - init_keys_if_needed(); - key_func[(int) key] = f; - toggle[(int) key] = NULL; - set_key_description(key, description); -} - -void glup_viewer_unbind_key(char key) { - key_func[(int) key] = NULL; - toggle[(int) key] = NULL; - set_key_description(key, NULL); -} - -static void cleanup(void) { - int i; - glup_viewer_gui_cleanup(); - for(i = 0; i < 256; ++i) { - if(key_description[i] != NULL) { - free(key_description[i]); - } - } -} - -void glup_viewer_exit_main_loop() { - in_main_loop_ = GL_FALSE; -} - - -/* exported, used in glup_viewer_gui.cpp */ -void glup_viewer_one_frame(void); - -void glup_viewer_one_frame() { - int cur_width; - int cur_height; - GlupViewerInitFunc init = init_func; - - /* - can happen when ImGUI Graphite application - triggers update too soon. - */ - if(glup_viewer_window == NULL) { - return; - } - - if(init != NULL) { - init_func = NULL; - init(); - glup_viewer_start_time = now(); - } - - if(!glfwWindowShouldClose(glup_viewer_window) && in_main_loop_) { - glfwGetFramebufferSize(glup_viewer_window, &cur_width, &cur_height); - if(glup_viewer_W != cur_width || glup_viewer_H != cur_height) { - reshape(cur_width, cur_height); - } - glfwPollEvents(); - if( - glup_viewer_is_enabled(GLUP_VIEWER_IDLE_REDRAW) || - glup_viewer_needs_redraw > 0 || - (now()-glup_viewer_start_time) < 1.0 - /* overcomes missing update at startup */ - ) { - if(glup_viewer_is_enabled(GLUP_VIEWER_TWEAKBARS)) { - glup_viewer_gui_begin_frame(); - display(); - glup_viewer_gui_end_frame(); - } else { - display(); - } - if(glup_viewer_needs_redraw > 0) { - --glup_viewer_needs_redraw; - } - } else { - glup_viewer_pause(); - } -#ifdef __EMSCRIPTEN__ - /* - * Set alpha channel to 1 else the image is composited - * with the background - */ - glClearColor(1.0f, 1.0f, 1.0f, 1.0f); - glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); - glClear(GL_COLOR_BUFFER_BIT); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); -#endif - glfwSwapBuffers(glup_viewer_window); - } -} - -void glup_viewer_main_loop(int argc, char** argv) { - (void)argc; /* suppresses a warning */ - (void)argv; /* suppresses a warning */ - - if(!glfwInit()) { - fprintf(stderr, "Could not initialize GLFW\n"); - exit(-1); - } - - in_main_loop_ = GL_TRUE; - - if(glup_viewer_test_arg_string("gfx:GL_profile", "core")) { - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); - glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - } - - - if(glup_viewer_get_arg_bool("gfx:GL_debug")) { - glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); - } - - if(glup_viewer_is_high_dpi()) { - glup_viewer_W *= 2; - glup_viewer_H *= 2; - } - - glup_viewer_set_screen_size_from_args(); - - transparent = glup_viewer_get_arg_bool("gfx:transparent"); - - if(transparent) { -/* glfwWindowHint(GLFW_ALPHA_BITS,8); */ -#ifdef GLFW_ALPHA_MASK - glfwWindowHint(GLFW_ALPHA_MASK,GL_TRUE); -#else - fprintf(stderr,"Transparent not supported by this version of GLFW\n"); -#endif - } - - if( - glup_viewer_get_arg_bool("gfx:fullscreen") || - glup_viewer_is_enabled(GLUP_VIEWER_FULL_SCREEN) - ) { - GLFWmonitor* monitor = glfwGetPrimaryMonitor(); - const GLFWvidmode* vidmode = glfwGetVideoMode(monitor); - glup_viewer_W = vidmode->width; - glup_viewer_H = vidmode->height; - - if(glup_viewer_get_arg_bool("gfx:no_decoration")) { - glfwWindowHint(GLFW_FOCUSED,GL_TRUE); - glfwWindowHint(GLFW_DECORATED,GL_FALSE); - glfwWindowHint(GLFW_RESIZABLE,GL_FALSE); - glfwWindowHint(GLFW_AUTO_ICONIFY,GL_FALSE); - glfwWindowHint(GLFW_FLOATING,GL_FALSE); - glfwWindowHint(GLFW_MAXIMIZED,GL_TRUE); - } - - glup_viewer_window = glfwCreateWindow( - glup_viewer_W, glup_viewer_H, title, - ( - glup_viewer_get_arg_bool("gfx:no_decoration") ? - glfwGetPrimaryMonitor() : NULL - ), - NULL - ); - } else { - glup_viewer_window = glfwCreateWindow( - glup_viewer_W, glup_viewer_H, title, NULL, NULL - ); - } - - - if(glup_viewer_window == NULL) { - fprintf(stderr, "Could not create GLFW window\n"); - exit(-1); - } - - glfwMakeContextCurrent(glup_viewer_window); - glfwSwapInterval(1); - - - glfwSetMouseButtonCallback(glup_viewer_window,mouse); - glfwSetCursorPosCallback(glup_viewer_window,passive_mouse); - glfwSetCharCallback(glup_viewer_window,glup_viewer_char_callback); - glfwSetKeyCallback(glup_viewer_window,glup_viewer_key_callback); - -#ifndef __EMSCRIPTEN__ - glfwSetDropCallback(glup_viewer_window,drag_drop); -#endif - - glfwSetScrollCallback(glup_viewer_window,scroll); - - init(); - glfwGetFramebufferSize(glup_viewer_window, &glup_viewer_W, &glup_viewer_H); - reshape(glup_viewer_W, glup_viewer_H); - - atexit(cleanup); - - glup_viewer_start_time = now(); - -#ifdef __EMSCRIPTEN__ - emscripten_set_main_loop(glup_viewer_one_frame, 0, 1); -#else - while (!glfwWindowShouldClose(glup_viewer_window) && in_main_loop_) { - glup_viewer_one_frame(); - } -#endif - - glfwDestroyWindow(glup_viewer_window); - glup_viewer_window = NULL; - glfwTerminate(); - - in_main_loop_ = GL_FALSE; -} - -void glup_viewer_set_region_of_interest( - float xm, float ym, float zm, float xM, float yM, float zM -) { - xmin = xm; - ymin = ym; - zmin = zm; - xmax = xM; - ymax = yM; - zmax = zM; - roi_radius = (float) sqrt((double)( - 0.25f * (xmax - xmin) * (xmax - xmin) + - 0.25f * (ymax - ymin) * (ymax - ymin) + - 0.25f * (zmax - zmin) * (zmax - zmin) - )); -} - -void glup_viewer_get_region_of_interest( - float* xm, float* ym, float* zm, float* xM, float* yM, float* zM -) { - *xm = xmin; - *ym = ymin; - *zm = zmin; - *xM = xmax; - *yM = ymax; - *zM = zmax; -} - -void glup_viewer_set_background(int tex) { - background_tex = (GLuint) tex; -} - -int glup_viewer_get_background() { - return (int) background_tex; -} - -/* =============================== Trackball code ========================= */ - -/* - * (c) Copyright 1993, 1994, Silicon Graphics, Inc. - * ALL RIGHTS RESERVED - * Permission to use, copy, modify, and distribute this software for - * any purpose and without fee is hereby granted, provided that the above - * copyright notice appear in all copies and that both the copyright notice - * and this permission notice appear in supporting documentation, and that - * the name of Silicon Graphics, Inc. not be used in advertising - * or publicity pertaining to distribution of the software without specific, - * written prior permission. - * - * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" - * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR - * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, - * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY - * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, - * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF - * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN - * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE - * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. - * - * US Government Users Restricted Rights - * Use, duplication, or disclosure by the Government is subject to - * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph - * (c)(1)(ii) of the Rights in Technical Data and Computer Software - * clause at DFARS 252.227-7013 and/or in similar or successor - * clauses in the FAR or the DOD or NASA FAR Supplement. - * Unpublished-- rights reserved under the copyright laws of the - * United States. Contractor/manufacturer is Silicon Graphics, - * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. - * - * OpenGL(TM) is a trademark of Silicon Graphics, Inc. - */ -/* - * Trackball code: - * - * Implementation of a virtual trackball. - * Implemented by Gavin Bell, lots of ideas from Thant Tessman and - * the August '88 issue of Siggraph's "Computer Graphics," pp. 121-129. - * - * Vector manip code: - * - * Original code from: - * David M. Ciemiewicz, Mark Grossman, Henry Moreton, and Paul Haeberli - * - * Much mucking with by: - * Gavin Bell - */ - -/* - * This size should really be based on the distance from the center of - * rotation to the point on the object underneath the mouse. That - * point would then track the mouse as closely as possible. This is a - * simple example, though, so that is left as an Exercise for the - * Programmer. - */ -#define TRACKBALLSIZE (0.8f) - -/* - * Local function prototypes (not defined in trackball.h) - */ -static float tb_project_to_sphere(float, float, float); -static void normalize_quat(float[4]); - -static void vzero(float* v) { - v[0] = 0.0; - v[1] = 0.0; - v[2] = 0.0; -} - -static void vset(float* v, float x, float y, float z) { - v[0] = x; - v[1] = y; - v[2] = z; -} - -static void vsub(const float* src1, const float* src2, float* dst) { - dst[0] = src1[0] - src2[0]; - dst[1] = src1[1] - src2[1]; - dst[2] = src1[2] - src2[2]; -} - -static void vcopy(const float* v1, float* v2) { - int i; - for(i = 0; i < 3; i++) { - v2[i] = v1[i]; - } -} - -static void vcross(const float* v1, const float* v2, float* cross) { - float temp[3]; - - temp[0] = (v1[1] * v2[2]) - (v1[2] * v2[1]); - temp[1] = (v1[2] * v2[0]) - (v1[0] * v2[2]); - temp[2] = (v1[0] * v2[1]) - (v1[1] * v2[0]); - vcopy(temp, cross); -} - -static float vlength(const float* v) { - return (float) sqrt((double)(v[0] * v[0] + v[1] * v[1] + v[2] * v[2])); -} - -static void vscale(float* v, float div) { - v[0] *= div; - v[1] *= div; - v[2] *= div; -} - -static void vnormal(float* v) { - vscale(v, 1.0f / vlength(v)); -} - -static float vdot(const float* v1, const float* v2) { - return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]; -} - -static void vadd(const float* src1, const float* src2, float* dst) { - dst[0] = src1[0] + src2[0]; - dst[1] = src1[1] + src2[1]; - dst[2] = src1[2] + src2[2]; -} - -/* - * Ok, simulate a track-ball. Project the points onto the virtual - * trackball, then figure out the axis of rotation, which is the cross - * product of P1 P2 and O P1 (O is the center of the ball, 0,0,0) - * Note: This is a deformed trackball-- is a trackball in the center, - * but is deformed into a hyperbolic sheet of rotation away from the - * center. This particular function was chosen after trying out - * several variations. - * - * It is assumed that the arguments to this routine are in the range - * (-1.0 ... 1.0) - */ -static void trackball(float q[4], float p1x, float p1y, float p2x, float p2y) { - float a[3]; /* Axis of rotation */ - float phi; /* how much to rotate about axis */ - float p1[3], p2[3], d[3]; - float t; - - if(p1x == p2x && p1y == p2y) { - /* Zero rotation */ - vzero(q); - q[3] = 1.0; - return; - } - - /* - * First, figure out z-coordinates for projection of P1 and P2 to - * deformed sphere - */ - vset(p1, p1x, p1y, tb_project_to_sphere(TRACKBALLSIZE, p1x, p1y)); - vset(p2, p2x, p2y, tb_project_to_sphere(TRACKBALLSIZE, p2x, p2y)); - - /* - * Now, we want the cross product of P1 and P2 - */ - vcross(p2, p1, a); - - /* - * Figure out how much to rotate around that axis. - */ - vsub(p1, p2, d); - t = vlength(d) / (2.0f * TRACKBALLSIZE); - - /* - * Avoid problems with out-of-control values... - */ - if(t > 1.0f) { - t = 1.0; - } - if(t < -1.0f) { - t = -1.0; - } - phi = 2.0f * (float) asin((double)t); - - axis_to_quat(a, phi, q); -} - -/* - * Given an axis and angle, compute quaternion. - */ -void axis_to_quat(float a[3], float phi, float q[4]) -{ - vnormal(a); - vcopy(a, q); - vscale(q, (float) sin(((double)phi) / 2.0)); - q[3] = (float) cos(((double)phi) / 2.0); -} - -void glup_viewer_set_scene_rotation( - float xyz[3], float angle -) { - axis_to_quat(xyz, (float)((double)angle * M_PI / 180.0), cur_rot); -} - -/* - * Project an x,y pair onto a sphere of radius r OR a hyperbolic sheet - * if we are away from the center of the sphere. - */ -static float tb_project_to_sphere(float r, float x, float y) { - float d, z; - - d = (float) sqrt((double)(x * x + y * y)); - if(d < r * 0.70710678118654752440f) { /* Inside sphere */ - z = (float) sqrt((double)(r * r - d * d)); - } else { /* On hyperbola */ - float t = r / 1.41421356237309504880f; - z = t * t / d; - } - return z; -} - -/* - * Given two rotations, e1 and e2, expressed as quaternion rotations, - * figure out the equivalent single rotation and stuff it into dest. - * - * NOTE: This routine is written so that q1 or q2 may be the same - * as dest (or each other). - */ - -void -add_quats(float q1[4], float q2[4], float dest[4]) -{ - float t1[4], t2[4], t3[4]; - float tf[4]; - - vcopy(q1, t1); - vscale(t1, q2[3]); - - vcopy(q2, t2); - vscale(t2, q1[3]); - - vcross(q2, q1, t3); - vadd(t1, t2, tf); - vadd(t3, tf, tf); - tf[3] = q1[3] * q2[3] - vdot(q1, q2); - - dest[0] = tf[0]; - dest[1] = tf[1]; - dest[2] = tf[2]; - dest[3] = tf[3]; - - normalize_quat(dest); -} - -/* - * Quaternions always obey: a^2 + b^2 + c^2 + d^2 = 1.0 - * If they don't add up to 1.0, dividing by their magnitued will - * renormalize them. - * - * Note: See the following for more information on quaternions: - * - * - Shoemake, K., Animating rotation with quaternion curves, Computer - * Graphics 19, No 3 (Proc. SIGGRAPH'85), 245-254, 1985. - * - Pletinckx, D., Quaternion calculus as a basic tool in computer - * graphics, The Visual Computer 5, 2-13, 1989. - */ -static void -normalize_quat(float q[4]) -{ - int i; - float mag; - - mag = (q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3]); - for(i = 0; i < 4; i++) { - q[i] /= mag; - } -} - -/* - * Build a rotation matrix, given a quaternion rotation. - * - */ -void -build_rotmatrix(float m[4][4], float q[4]) -{ - m[0][0] = 1.0f - 2.0f * (q[1] * q[1] + q[2] * q[2]); - m[0][1] = 2.0f * (q[0] * q[1] - q[2] * q[3]); - m[0][2] = 2.0f * (q[2] * q[0] + q[1] * q[3]); - m[0][3] = 0.0f; - - m[1][0] = 2.0f * (q[0] * q[1] + q[2] * q[3]); - m[1][1] = 1.0f - 2.0f * (q[2] * q[2] + q[0] * q[0]); - m[1][2] = 2.0f * (q[1] * q[2] - q[0] * q[3]); - m[1][3] = 0.0f; - - m[2][0] = 2.0f * (q[2] * q[0] - q[1] * q[3]); - m[2][1] = 2.0f * (q[1] * q[2] + q[0] * q[3]); - m[2][2] = 1.0f - 2.0f * (q[1] * q[1] + q[0] * q[0]); - m[2][3] = 0.0f; - - m[3][0] = 0.0f; - m[3][1] = 0.0f; - m[3][2] = 0.0f; - m[3][3] = 1.0f; -} - -/*---------------------------------------------------------------------------*/ - -#ifdef WIN32 - -static void copy_image_to_clipboard() { - int w = glup_viewer_W; - int h = glup_viewer_H; - /* int row_len = w * 3 ; */ - int image_size, size; - HANDLE handle; - char* base_mem; - char* pData; - BITMAPINFOHEADER* header; - - /* Step 1: Try to open Window's clipboard - * NULL -> bind to current process - */ - if(!OpenClipboard(NULL)) { - return; - } - - /* Step 2: create a shared memory segment, with - * a DIB (Device Independent Bitmap) in it. - */ - - image_size = 3 * w * h; - size = sizeof(BITMAPINFOHEADER) + image_size; - - handle = (HANDLE) GlobalAlloc(GHND, size); - if(handle == NULL) { - return; - } - - pData = GlobalLock((HGLOBAL) handle); - header = (BITMAPINFOHEADER*) pData; - - header->biSize = sizeof(BITMAPINFOHEADER); - header->biWidth = w; - header->biHeight = h; - header->biPlanes = 1; - header->biBitCount = 24; - header->biCompression = BI_RGB; - header->biSizeImage = 0; - header->biXPelsPerMeter = 1000000; - header->biYPelsPerMeter = 1000000; - header->biClrUsed = 0; - header->biClrImportant = 0; - - base_mem = pData + sizeof(BITMAPINFOHEADER); - glReadPixels(0, 0, w, h, GL_BGR_EXT, GL_UNSIGNED_BYTE, base_mem); - - /* Step 3: Detach the clipboard from current process. */ - GlobalUnlock((HGLOBAL) handle); - EmptyClipboard(); - SetClipboardData(CF_DIB, handle); - CloseClipboard(); -} - -#else -static void copy_image_to_clipboard() { -} - -#endif - -/* -------------------------------------------------------------------------- */ - -static int htoi(char digit) { - if(digit >= '0' && digit <= '9') { - return digit - '0'; - } - if(digit >= 'a' && digit <= 'f') { - return digit - 'a' + 10; - } - if(digit >= 'A' && digit <= 'F') { - return digit - 'A' + 10; - } - fprintf(stderr, "xpm: unknown digit\n"); - return 0; -} - -/* The colormap. */ -static unsigned char i2r[1024]; -static unsigned char i2g[1024]; -static unsigned char i2b[1024]; -static unsigned char i2a[1024]; - -/* Converts a two-digit XPM color code into - * a color index. - */ -static int char_to_index[256][256]; - -void glTexImage2DXPM(char const* const* xpm_data) { - int width, height, nb_colors, chars_per_pixel; - int line = 0; - int color = 0; - int key1 = 0, key2 = 0; - char* colorcode; - int x, y; - unsigned char* rgba; - unsigned char* pixel; - - sscanf( - xpm_data[line], "%6d%6d%6d%6d", - &width, &height, &nb_colors, &chars_per_pixel - ); - line++; - if(nb_colors > 1024) { - fprintf(stderr, "xpm with more than 1024 colors\n"); - return; - } - if(chars_per_pixel != 1 && chars_per_pixel != 2) { - fprintf(stderr, "xpm with more than 2 chars per pixel\n"); - return; - } - for(color = 0; color < nb_colors; color++) { - int r, g, b; - int none ; - - key1 = xpm_data[line][0]; - key2 = (chars_per_pixel == 2) ? xpm_data[line][1] : 0; - colorcode = strstr(xpm_data[line], "c #"); - none = 0; - if(colorcode == NULL) { - colorcode = "c #000000"; - if(strstr(xpm_data[line], "None") != NULL) { - none = 1; - } else { - fprintf( - stderr, "unknown xpm color entry (replaced with black)\n" - ); - } - } - colorcode += 3; - - if(strlen(colorcode) == 12) { - r = 16 * htoi(colorcode[0]) + htoi(colorcode[1]); - g = 16 * htoi(colorcode[4]) + htoi(colorcode[5]); - b = 16 * htoi(colorcode[8]) + htoi(colorcode[9]); - } else { - r = 16 * htoi(colorcode[0]) + htoi(colorcode[1]); - g = 16 * htoi(colorcode[2]) + htoi(colorcode[3]); - b = 16 * htoi(colorcode[4]) + htoi(colorcode[5]); - } - - i2r[color] = (unsigned char) r; - i2g[color] = (unsigned char) g; - i2b[color] = (unsigned char) b; - if(none) { - i2a[color] = 0; - } else { - i2a[color] = 255; - } - char_to_index[key1][key2] = color; - line++; - } - rgba = (unsigned char*) malloc((size_t) (width * height * 4)); - pixel = rgba; - for(y = 0; y < height; y++) { - for(x = 0; x < width; x++) { - if(chars_per_pixel == 2) { - key1 = xpm_data[line][2 * x]; - key2 = xpm_data[line][2 * x + 1]; - } else { - key1 = xpm_data[line][x]; - key2 = 0; - } - color = char_to_index[key1][key2]; - pixel[0] = i2r[color]; - pixel[1] = i2g[color]; - pixel[2] = i2b[color]; - pixel[3] = i2a[color]; - pixel += 4; - } - line++; - } - - glTexImage2D( - GL_TEXTURE_2D, 0, - GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgba - ); -#ifndef __EMSCRIPTEN__ - glGenerateMipmap(GL_TEXTURE_2D); -#endif - free(rgba); -} - -/*----------------------------------------------------------------------------*/ - -#ifdef WITH_PNG -static GLboolean glup_viewer_load_image_PNG( - const char* filename, - GLuint* width_in, GLuint* height_in, GLuint* bpp, GLvoid** pixels_in -) { - - FILE* in; - png_structp png_ptr; - png_infop info_ptr; - unsigned long width, height; - int bit_depth, color_type, interlace_type; - png_bytep row_pointer; - unsigned int row; - char** pixels = (char**) pixels_in; - png_uint_32 w, h; - - in = fopen(filename, "rb"); - if(in == NULL) { - fprintf(stderr, "PNG loader: failed opening file %s\n", filename); - return GL_FALSE; - } - - png_ptr = png_create_read_struct( - PNG_LIBPNG_VER_STRING, - (png_voidp) NULL, (png_error_ptr) NULL, (png_error_ptr) NULL - ); - if(png_ptr == NULL) { - fclose(in); - fprintf(stderr, "PNG loader: error while loading %s\n", filename); - return GL_FALSE; - } - - info_ptr = png_create_info_struct(png_ptr); - if(info_ptr == NULL) { - png_destroy_read_struct( - &png_ptr, (png_infopp) NULL, (png_infopp) NULL - ); - fprintf(stderr, "PNG loader: error while loading %s\n", filename); - fclose(in); - return GL_FALSE; - } - - png_init_io(png_ptr, in); - - /* read header */ - png_read_info(png_ptr, info_ptr); - png_get_IHDR( - png_ptr, info_ptr, &w, &h, &bit_depth, &color_type, - &interlace_type, NULL, NULL - ); - width = w; - height = h; - - if(color_type == PNG_COLOR_TYPE_GRAY) { - *bpp = 1; - } else if(color_type == PNG_COLOR_TYPE_RGB_ALPHA) { - *bpp = 4; - } else { - *bpp = 3; - } - - if(color_type == PNG_COLOR_TYPE_PALETTE) { - png_set_expand(png_ptr); - } - - *pixels = malloc(width * height * *bpp); - if(*pixels == NULL) { - png_destroy_read_struct( - &png_ptr, (png_infopp) NULL, (png_infopp) NULL - ); - fprintf( - stderr, - "PNG loader: error while loading %s, unable to allocate sufficient memory\n" - , filename - ); - fclose(in); - return GL_FALSE; - } - - /* Read the image one line at a time */ - row_pointer = (png_bytep) malloc(width * *bpp); - - for(row = 0; row < height; row++) { - png_read_rows(png_ptr, &row_pointer, NULL, 1); - memcpy( - *pixels + (height - 1 - row) * width * *bpp, - row_pointer, - width * *bpp - ); - } - free(row_pointer); - - png_read_end(png_ptr, info_ptr); - png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) NULL); - - *width_in = (GLuint) width; - *height_in = (GLuint) height; - - fclose(in); - return GL_TRUE; -} - -#endif - -/*----------------------------------------------------------------------------*/ - -#define GLUP_VIEWER_BMP_RLE_8 1 -#define GLUP_VIEWER_BMP_RLE_4 2 - -typedef unsigned int bmp_int32; -typedef unsigned short bmp_int16; - -#define readH(x) fread(&(header.x), sizeof(header.x), 1, f); - -typedef struct { - bmp_int16 sType; - bmp_int32 iSizeOfFile; - bmp_int16 sReserved1; - bmp_int16 sReserved2; - bmp_int32 iOffBits; - bmp_int32 iSize; - bmp_int32 iWidth; - bmp_int32 iHeight; - bmp_int16 sPlanes; - bmp_int16 sBitCount; - bmp_int32 iCompression; - bmp_int32 iSizeImage; - bmp_int32 iXpelsPerMeter; - bmp_int32 iYpelsPerMeter; - bmp_int32 iClrUsed; - bmp_int32 iClrImportant; -} GlupViewerBMPHeader; - -static void rgb_to_bgr( - GLuint width, GLuint height, GLuint bpp, GLvoid* pixels -) { - char* p = (char*) pixels; - int i; - if(bpp != 3 && bpp != 4) { - return; - } - for(i = 0; i < (int) (width * height); i++) { - char tmp = p[0]; - p[0] = p[2]; - p[2] = tmp; - p += bpp; - } -} - -static GLboolean glup_viewer_load_image_BMP( - const char* filename, - GLuint* width, GLuint* height, GLuint* bpp, GLvoid** pixels_in -) { - GlupViewerBMPHeader header; - char padding[3]; - size_t rowlen; - int i; - char* pixels; - FILE* f = fopen(filename, "rb"); - int ok = 1; - - if(f == NULL) { - fprintf(stderr, "cannot open %s\n", filename); - return GL_FALSE; - } - - - - /* - * Argh, I need to read the header field by field, seems - * that the compiler aligns the fields in a way that makes - * the memory layout mismatch the file layout. - */ - - memset(&header, 0, sizeof(GlupViewerBMPHeader)); - ok = ok && readH(sType); - ok = ok && readH(iSizeOfFile); - ok = ok && readH(sReserved1); - ok = ok && readH(sReserved2); - ok = ok && readH(iOffBits); - ok = ok && readH(iSize); - ok = ok && readH(iWidth); - ok = ok && readH(iHeight); - ok = ok && readH(sPlanes); - ok = ok && readH(sBitCount); - ok = ok && readH(iCompression); - ok = ok && readH(iSizeImage); - ok = ok && readH(iXpelsPerMeter); - ok = ok && readH(iYpelsPerMeter); - ok = ok && readH(iClrUsed); - ok = ok && readH(iClrImportant); - - if(!ok) { - fprintf(stderr, "Error while reading BMP header of %s\n", filename); - fclose(f); - return GL_FALSE; - } - - if( - (header.iCompression & GLUP_VIEWER_BMP_RLE_8) || - (header.iCompression & GLUP_VIEWER_BMP_RLE_4) - ) { - fprintf( - stderr, - "BMP loader: cannot load compressed BMP files, sorry\n" - ); - fclose(f); - return GL_FALSE; - } - *width = header.iWidth; - *height = header.iHeight; - *bpp = header.sBitCount / 8; - - pixels = malloc(*width * *height * *bpp); - - rowlen = (size_t) (*width * *bpp); - for(i = 0; i < (int) *height; i++) { - ok = ok && fread(pixels + i * (int) rowlen, rowlen, (size_t) 1, f); - /* BMP rows are padded to 4-bytes multiples */ - ok = ok && fread(padding, rowlen % 4, (size_t) 1, f); - } - - rgb_to_bgr(*width, *height, *bpp, pixels); - *pixels_in = pixels; - - fclose(f); - - if(!ok) { - fprintf(stderr, "Error while reading BMP data from %s\n", filename); - free(pixels); - return GL_FALSE; - } - - return GL_TRUE; -} - -/*----------------------------------------------------------------------------*/ - -static const char* extension(const char* filename) { - const char* point_loc = strrchr(filename, '.'); - return (point_loc == NULL) ? NULL : (point_loc + 1); -} - -GLboolean glup_viewer_load_image( - const char* filename, GLuint* width, GLuint* height, - GLuint* bpp, GLvoid** pixels -) { - const char* ext = extension(filename); -#ifdef WITH_PNG - if(!strcmp(ext, "png") || !strcmp(ext, "PNG")) { - return glup_viewer_load_image_PNG(filename, width, height, bpp, pixels); - } -#endif - if(!strcmp(ext, "bmp") || !strcmp(ext, "BMP")) { - return glup_viewer_load_image_BMP(filename, width, height, bpp, pixels); - } - return GL_FALSE; -} - -void glTexImage2Dfile(const char* filename) { - GLuint width, height, bpp; - GLvoid* pixels; - if(!glup_viewer_load_image(filename, &width, &height, &bpp, &pixels)) { - return; - } - switch(bpp) { - case 1: - glTexImage2D( - GL_TEXTURE_2D, 0, GL_LUMINANCE, - (GLsizei) width, (GLsizei) height, 0, - GL_LUMINANCE, GL_UNSIGNED_BYTE, pixels - ); - break; - case 3: - glTexImage2D( - GL_TEXTURE_2D, 0, GL_RGB, - (GLsizei) width, (GLsizei) height, 0, - GL_RGB, GL_UNSIGNED_BYTE, pixels - ); - break; - case 4: - glTexImage2D( - GL_TEXTURE_2D, 0, GL_RGBA, - (GLsizei) width, (GLsizei) height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, pixels - ); - break; - default: - glup_viewer_assert_not_reached(); - } -#ifndef __EMSCRIPTEN__ - glGenerateMipmap(GL_TEXTURE_2D); -#endif - free(pixels); -} - - -#define c1 0.35 -#define c2 0.5 -#define c3 1.0 - -static double color_table[12][3] = { - {c3, c2, c2}, - {c2, c3, c2}, - {c2, c2, c3}, - {c2, c3, c3}, - {c3, c2, c3}, - {c3, c3, c2}, - - {c1, c2, c2}, - {c2, c1, c2}, - {c2, c2, c1}, - {c2, c1, c1}, - {c1, c2, c1}, - {c1, c1, c2} -}; - -static int random_color_index_ = 0 ; - - -static float white[4] = { - 0.8f, 0.8f, 0.3f, 1.0f -}; - -void glup_viewer_random_color() { - glupColor3d( - color_table[random_color_index_][0], - color_table[random_color_index_][1], - color_table[random_color_index_][2] - ); - random_color_index_ = (random_color_index_ + 1) % 12 ; -} - -void glup_viewer_randomize_colors(int index) { - random_color_index_ = (index % 12) ; -} - -void glup_viewer_random_color_from_index(int index) { - if(index >= 0) { - glup_viewer_randomize_colors(index) ; - glup_viewer_random_color() ; - } else { - glupColor4fv(white) ; - } -} - -GLboolean glup_viewer_is_high_dpi(void) { -#ifdef __EMSCRIPTEN__ - return GL_FALSE; -#else - GLFWmonitor* monitor = glfwGetPrimaryMonitor(); - const GLFWvidmode* vidmode = glfwGetVideoMode(monitor); - return (vidmode->width > 1920); -#endif -} - -void glup_viewer_snapshot(const char* filename) { - FILE* f = fopen(filename, "wb"); - int line_size = glup_viewer_W*3; - void* data = NULL; - char* line1; - char* line2; - int y; - int xx; - char tmp; - - if(f == NULL) { - return; - } - - /* Read OpenGL frame buffer */ - data = malloc((size_t)(glup_viewer_W*glup_viewer_H*3)); - glReadPixels( - 0, 0, glup_viewer_W, glup_viewer_H, - GL_RGB, GL_UNSIGNED_BYTE, data - ); - - /* Flip image along vertical axis */ - for(y=0; y -#define GL_GLEXT_PROTOTYPES -#include -typedef double GLdouble; -#else -#include -#endif - -#include - -#ifdef __cplusplus -#include -#endif - -#if defined(_MSC_VER) && defined(GEO_DYNAMIC_LIBS) -#ifdef geogram_gfx_EXPORTS -#define GLUP_VIEWER_API __declspec(dllexport) -#else -#define GLUP_VIEWER_API __declspec(dllimport) -#endif -#else -#if defined(__GNUC__) && defined(GEO_DYNAMIC_LIBS) -#define GLUP_VIEWER_API __attribute__ ((visibility("default"))) -#else -#define GLUP_VIEWER_API -#endif - -#endif - - -#ifdef __cplusplus -#include -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -enum GlupViewerEvent { - GLUP_VIEWER_DOWN, - GLUP_VIEWER_MOVE, - GLUP_VIEWER_UP -}; - -/** - * \brief Callback function to be called to display each frame. - * \see glup_viewer_set_display_func() - */ -typedef void (* GlupViewerDisplayFunc)(void); - -/** - * \brief Callback function to be called when a key is pressed. - * \details For high-level input, typically key shortcuts for command. - * Videogames should use glup_viewer_set_keyboard_func_ext. The function - * is supposed to return GL_TRUE if the key was taken into account, GL_FALSE - * otherwise. - * \see glup_viewer_set_keyboard_func() - */ -typedef GLboolean (* GlupViewerKeyboardFunc)(char key); - -/** - * \brief Callback function to be called when a key is pressed. - * \details For low-level input, typically videogames. The function - * is supposed to return GL_TRUE if the key was taken into account, GL_FALSE - * otherwise. The key argument is either a single-character string with the - * key, or the symbolic name of the key ("left", "right", "alt", "control", - * "tab", "esc"). The ev argument is one of GLUP_VIEWER_DOWN, GLUP_VIEWER_UP. - * \see glup_viewer_set_keyboard_func() - */ -typedef GLboolean (* GlupViewerKeyboardFuncExt)( - const char* key, enum GlupViewerEvent ev -); - -/** - * \brief Callback function associated to an individual key. - * \see glup_viewer_set_key_func() - */ -typedef void (* GlupViewerKeyFunc)(void); - -/** - * \brief Callback function called when the first frame is displayed. - * \details Can be used to setup OpenGL objects, create textures etc... - * \see glup_viewer_set_init_func() - */ -typedef void (* GlupViewerInitFunc)(void); - -/** - * \brief Callback function called when a file is dropped in the window. - * \see glup_viewer_set_drag_drop_func() - */ -typedef void (* GlupViewerDragDropFunc)(char*); - - -typedef GLboolean (* GlupViewerMouseFunc)( - float x, float y, int button, enum GlupViewerEvent event -); - -#define GLUP_VIEWER_IDLE_REDRAW 0 -#define GLUP_VIEWER_DRAW_SCENE 1 -#define GLUP_VIEWER_SHOW_HELP 2 -#define GLUP_VIEWER_BACKGROUND 3 - -#define GLUP_VIEWER_ROTATE_LIGHT 5 -#define GLUP_VIEWER_3D 6 -#define GLUP_VIEWER_TWEAKBARS 7 - -#define GLUP_VIEWER_STEREOSCOPIC_DISPLAY 11 -#define GLUP_VIEWER_CLIP 12 -#define GLUP_VIEWER_SHOW_CLIP 13 -#define GLUP_VIEWER_EDIT_CLIP 14 -#define GLUP_VIEWER_FIXED_CLIP 15 -#define GLUP_VIEWER_FULL_SCREEN 16 - -#define GLUP_VIEWER_NO_EFFECT 0 -#define GLUP_VIEWER_AMBIENT_OCCLUSION 1 -#define GLUP_VIEWER_UNSHARP_MASKING 2 -#define GLUP_VIEWER_TEST_EFFECT 3 - -extern GLUP_VIEWER_API void glup_viewer_enable(int cap); -extern GLUP_VIEWER_API void glup_viewer_disable(int cap); -extern GLUP_VIEWER_API GLboolean glup_viewer_is_enabled(int cap); -extern GLUP_VIEWER_API GLboolean* glup_viewer_is_enabled_ptr(int cap); -extern GLUP_VIEWER_API void glup_viewer_toggle(int cap); - -#define GLUP_VIEWER_STEREOSCOPIC_EYE_DISTANCE 5 -#define GLUP_VIEWER_ZOOM 6 - -extern GLUP_VIEWER_API void glup_viewer_set_float(int param, GLfloat value); -extern GLUP_VIEWER_API GLfloat glup_viewer_get_float(int param); -extern GLUP_VIEWER_API GLfloat* glup_viewer_float_ptr(int param); - -extern GLUP_VIEWER_API void glup_viewer_main_loop(int argc, char** argv); -extern GLUP_VIEWER_API void glup_viewer_exit_main_loop(void); -extern GLUP_VIEWER_API void glup_viewer_set_window_title(const char* title); - -extern GLUP_VIEWER_API void glup_viewer_set_display_func( - GlupViewerDisplayFunc f -); - -extern GLUP_VIEWER_API void glup_viewer_set_overlay_func( - GlupViewerDisplayFunc f -); - -extern GLUP_VIEWER_API void glup_viewer_set_keyboard_func( - GlupViewerKeyboardFunc f -); - -extern GLUP_VIEWER_API void glup_viewer_set_keyboard_func_ext( - GlupViewerKeyboardFuncExt f -); - -extern GLUP_VIEWER_API void glup_viewer_set_mouse_func(GlupViewerMouseFunc f); -extern GLUP_VIEWER_API void glup_viewer_set_init_func(GlupViewerInitFunc f); -extern GLUP_VIEWER_API void glup_viewer_set_drag_drop_func( - GlupViewerDragDropFunc f -); - -extern GLUP_VIEWER_API GlupViewerDisplayFunc glup_viewer_get_display_func(void); -extern GLUP_VIEWER_API GlupViewerDisplayFunc glup_viewer_get_overlay_func(void); -extern GLUP_VIEWER_API GlupViewerKeyboardFunc glup_viewer_get_keyboard_func( - void -); - -extern GLUP_VIEWER_API GlupViewerMouseFunc glup_viewer_get_mouse_func(void); -extern GLUP_VIEWER_API GlupViewerInitFunc glup_viewer_get_init_func(void); -extern GLUP_VIEWER_API GlupViewerDragDropFunc glup_viewer_get_drag_drop_func( - void -); - -extern GLUP_VIEWER_API void glup_viewer_add_toggle( - char key, GLboolean* pointer, const char* description -); -extern GLUP_VIEWER_API void glup_viewer_add_key_func( - char key, GlupViewerKeyFunc f, const char* description -); -extern GLUP_VIEWER_API void glup_viewer_unbind_key(char key); -extern GLUP_VIEWER_API void glup_viewer_set_region_of_interest( - float xmin, float ymin, float zmin, float xmax, float ymax, float zmax -); -extern GLUP_VIEWER_API void glup_viewer_get_region_of_interest( - float* xmin, float* ymin, float* zmin, float* xmax, float* ymax, float* zmax -); -extern GLUP_VIEWER_API void glup_viewer_set_screen_size(int w, int h); -extern GLUP_VIEWER_API void glup_viewer_get_screen_size(int* w, int* h); - -extern GLUP_VIEWER_API void glup_viewer_clear_text(void); -extern GLUP_VIEWER_API void glup_viewer_printf(const char* format, ...); -extern GLUP_VIEWER_API void glup_viewer_set_background(int texture); -extern GLUP_VIEWER_API int glup_viewer_get_background(void); -extern GLUP_VIEWER_API void glup_viewer_set_background_color( - GLfloat r, GLfloat g, GLfloat b -); -extern GLUP_VIEWER_API void glup_viewer_set_background_color2( - GLfloat r, GLfloat g, GLfloat b -); -extern GLUP_VIEWER_API GLfloat* glup_viewer_get_background_color(void); -extern GLUP_VIEWER_API GLfloat* glup_viewer_get_background_color2(void); - -extern GLUP_VIEWER_API float* glup_viewer_get_scene_quaternion(void); -extern GLUP_VIEWER_API float* glup_viewer_get_scene_translation(void); -extern GLUP_VIEWER_API float* glup_viewer_get_light_matrix(void); -extern GLUP_VIEWER_API float* glup_viewer_get_light_quaternion(void); -extern GLUP_VIEWER_API float* glup_viewer_get_clip_quaternion(void); - -extern GLUP_VIEWER_API void glup_viewer_set_scene_rotation( - float xyz[3], float angle -); - -extern GLUP_VIEWER_API void glTexImage2DXPM(char const* const* xpm_data); -extern GLUP_VIEWER_API void glTexImage2Dfile(const char* filename); - -extern GLUP_VIEWER_API GLboolean glup_viewer_load_image( - const char* filename, GLuint* width, GLuint* height, GLuint* bpp, - GLvoid** pixels -); - -extern GLUP_VIEWER_API int glup_viewer_fps(void); - -extern GLUP_VIEWER_API void glup_viewer_redraw(void); - -extern GLUP_VIEWER_API void glup_viewer_save_transform_for_picking(void); -extern GLUP_VIEWER_API void glup_viewer_get_picked_ray( - GLdouble* p, GLdouble* v -); -extern GLUP_VIEWER_API void glup_viewer_get_picked_point( - GLdouble* p, GLboolean* hit_background -); -extern GLUP_VIEWER_API void glup_viewer_project( - double x_in, double y_in, double z_in, - double* x_out, double* y_out, double* z_out -); -extern GLUP_VIEWER_API void glup_viewer_unproject( - double x_in, double y_in, double z_in, - double* x_out, double* y_out, double* z_out -); - -extern GLUP_VIEWER_API void glup_viewer_random_color(void); - -extern GLUP_VIEWER_API void glup_viewer_randomize_colors(int); - -extern GLUP_VIEWER_API void glup_viewer_random_color_from_index(int index); - -extern GLUP_VIEWER_API void glup_viewer_post_redisplay(void); - -extern GLUP_VIEWER_API void glup_viewer_home(void); - -extern GLUP_VIEWER_API GLboolean glup_viewer_is_high_dpi(void); - -/** - * \brief Saves a copy of the current window to a file. - * \details Uses the PPM file format. - * \param[in] filename name of the file - */ -extern GLUP_VIEWER_API void glup_viewer_snapshot(const char* filename); - -/** - * \brief Sets the effect. - * \param[in] effect one of GLUP_VIEWER_NO_EFFECT, GLUP_VIEWER_AMBIENT_OCCLUSION, - * GLUP_VIEWER_UNSHARP_MASKING - */ -extern GLUP_VIEWER_API GLboolean glup_viewer_set_effect(GLenum effect); - -#ifdef __cplusplus -} -#endif - -#ifdef __cplusplus -inline void glup_viewer_printf(const std::string& s) { - glup_viewer_printf(s.c_str()); -} - -inline void glup_viewer_add_toggle( - char key, bool* toggle, const char* description -) { - assert(sizeof(bool) == sizeof(GLboolean)); - glup_viewer_add_toggle(key, (GLboolean*)(toggle), description); -} - - -#endif - -#endif - diff --git a/src/lib/geogram_gfx/glup_viewer/glup_viewer_gui.cpp b/src/lib/geogram_gfx/glup_viewer/glup_viewer_gui.cpp deleted file mode 100644 index bdf0a451..00000000 --- a/src/lib/geogram_gfx/glup_viewer/glup_viewer_gui.cpp +++ /dev/null @@ -1,2484 +0,0 @@ -/* - * Copyright (c) 2012-2016, Bruno Levy - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of the ALICE Project-Team nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * If you modify this software, you should include a notice giving the - * name of the person performing the modification, the date of modification, - * and the reason for such modification. - * - * Contact: Bruno Levy - * - * Bruno.Levy@inria.fr - * http://www.loria.fr/~levy - * - * ALICE Project - * LORIA, INRIA Lorraine, - * Campus Scientifique, BP 239 - * 54506 VANDOEUVRE LES NANCY CEDEX - * FRANCE - * - */ - -#include -#include -#include -#include - -#ifdef GEOGRAM_WITH_LUA -#include -#include -#include -#include -#endif - -#include - -#include -#include -#include -#include -#include - -#include - -#ifdef GEO_OS_EMSCRIPTEN -#include -#endif - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern "C" { - void glup_viewer_char_callback(void* w, unsigned int c); -} - - -#ifdef GEOGRAM_WITH_LUA -extern "C" { -#include -#include -#include -} -#endif - -namespace { - /** - * \brief Removes the underscores from a string and - * replaces them with spaces. - * \details Utility for the prototype parser used by - * Command. - * \param[in] s a const reference to the input string - * \return a copy of \p s with underscores replaced with - * spaces - */ - std::string remove_underscores(const std::string& s) { - std::string result = s; - for(GEO::index_t i=0; i0; --j) { - if(line[j-1] != ' ') { - break; - } - } - if(j>i) { - line = line.substr(i, j-i); - } else { - line = ""; - } - } - - /** - * \brief Converts a complete path to a file to a label - * displayed in the file browser. - * \details Strips viewer_path from the input path. - * \param[in] path the complete path, can be either a directory or - * a file - * \return the label to be displayed in the menu - */ - std::string path_to_label( - const std::string& viewer_path, const std::string& path - ) { - std::string result = path; - if(GEO::String::string_starts_with(result, viewer_path)) { - result = result.substr( - viewer_path.length(), result.length()-viewer_path.length() - ); - } - return result; - } -} - -namespace GEO { - - /*****************************************************************/ - - StatusBar::StatusBar() { - step_ = 0; - percent_ = 0; - progress_ = false; - canceled_ = false; - nb_active_ = 0; - } - - void StatusBar::begin() { - progress_ = true; - canceled_ = false; - ++nb_active_; - } - - void StatusBar::progress(GEO::index_t step, GEO::index_t percent) { - step_ = step; - percent_ = percent; - update(); - } - - void StatusBar::end(bool canceled) { - geo_argused(canceled); - step_ = 0; - percent_ = 0; - progress_ = false; - --nb_active_; - } - - void StatusBar::draw() { - ImGui::Begin( - "##Status", nullptr, - ImGuiWindowFlags_NoResize | - ImGuiWindowFlags_NoMove | - ImGuiWindowFlags_NoCollapse | - ImGuiWindowFlags_NoTitleBar | - ImGuiWindowFlags_NoScrollbar - ); - if(progress_) { - if(ImGui::Button("cancel")) { - Progress::cancel(); - } - ImGui::SameLine(); - ImGui::Text( - "%s", Progress::current_task()->task_name().c_str() - ); - ImGui::SameLine(); - std::string overlay = - String::to_string(step_) + "/" + - String::to_string( - Progress::current_task()->max_steps() - ) + " (" + - String::to_string(percent_) + - "%)"; - - ImGui::ProgressBar( - std::max(0.001f, float(percent_)/float(100.0)), - ImVec2(-1,0.0), - overlay.c_str() - ); - } - ImGui::End(); - } - - void StatusBar::update() { - glup_viewer_gui_update(); - } - - /*****************************************************************/ - - Console::Console(bool* visible_flag) : - visible_flag_(visible_flag), - completion_callback_(nullptr), - history_callback_(nullptr), - history_index_(0), - max_history_index_(0), - fixed_layout_(true) { - input_buf_[0] = '\0'; - console_font_ = nullptr; - scroll_to_bottom_ = false; - } - - void Console::notify_error(const std::string& err) { - geo_argused(err); - return; - } - - void Console::div(const std::string& value) { - this->printf("========== %s", value.c_str()); - } - - void Console::out(const std::string& value) { - this->printf(" %s", value.c_str()); - } - - void Console::warn(const std::string& value) { - this->printf("[W] %s", value.c_str()); - if(visible_flag_ != nullptr) { - *visible_flag_ = true; - } - } - - void Console::err(const std::string& value) { - this->printf("[E] %s", value.c_str()); - if(visible_flag_ != nullptr) { - *visible_flag_ = true; - } - notify_error(value); - } - - void Console::status(const std::string& value) { - // Do not display error messages twice. - if(String::string_starts_with(value, "Error:")) { - return; - } - this->printf("[status] %s", value.c_str()); - } - - void Console::clear() { - buf_.clear(); - line_offsets_.clear(); - } - - void Console::printf(const char* fmt, ...) { - va_list args; - va_start(args, fmt); - int old_size = buf_.size(); - buf_.appendfv(fmt, args); - va_end(args); - for (int new_size = buf_.size(); old_size < new_size; old_size++) { - if (buf_[old_size] == '\n') { - line_offsets_.push_back(old_size); - } - } - scroll_to_bottom_ = true; - update(); - } - - void Console::update() { - glup_viewer_gui_update(); - } - - static int TextEditCallbackStub(ImGuiTextEditCallbackData* data) { - Console* console = (Console*)data->UserData; - return console->TextEditCallback(data); - } - - - int Console::TextEditCallback(ImGuiTextEditCallbackData* data) { - switch (data->EventFlag) { - case ImGuiInputTextFlags_CallbackCompletion: { - if(completion_callback_ != nullptr) { - static const char* - completer_word_break_characters = " .(){},+-*/="; - // Locate beginning of current word - const char* word_end = data->Buf + data->CursorPos; - const char* word_start = word_end; - while (word_start > data->Buf) - { - const char c = word_start[-1]; - if(strchr(completer_word_break_characters,c) != nullptr) { - break; - } - word_start--; - } - index_t startw = index_t(word_start - data->Buf); - index_t endw = index_t(word_end - data->Buf); - std::string cmpword(word_start, size_t(word_end - word_start)); - std::vector matches; - completion_callback_( - this, std::string(data->Buf), - startw, endw, cmpword, matches - ); - if(matches.size() == 0) { - this->printf("Completions: no match\n"); - } else if(matches.size() == 1) { - // Single match. Delete the beginning of the word and - // replace it entirely so we've got nice casing - data->DeleteChars( - (int)(word_start-data->Buf), - (int)(word_end-word_start) - ); - data->InsertChars(data->CursorPos, matches[0].c_str()); - } else { - // Several matches, find longest common prefix - std::string longest_prefix; - size_t cur_char = 0; - bool finished = false; - while(!finished) { - char c = '\0'; - for(size_t i=0; i= matches[i].length() || - (i != 0 && matches[i][cur_char] != c) - ) { - finished = true; - break; - } - c = matches[i][cur_char]; - } - if(!finished) { - longest_prefix.push_back(c); - } - ++cur_char; - } - // Replace edited text with longest prefix - if(longest_prefix.length() != 0) { - data->DeleteChars( - (int)(word_start-data->Buf), - (int)(word_end-word_start) - ); - data->InsertChars( - data->CursorPos, longest_prefix.c_str() - ); - } - this->printf("Completions:\n"); - for(size_t i=0; iprintf( - "[%d] ... %s\n", int(i), matches[i].c_str() - ); - } - } - } - } break; - case ImGuiInputTextFlags_CallbackHistory: { - if(history_callback_ != nullptr) { - std::string history_command; - // Call the callback first, to give it the opportunity to - // declare the history size. - history_callback_(this, history_index_, history_command); - if(max_history_index_ > 0) { - int h = int(history_index_); - if(data->EventKey == ImGuiKey_UpArrow) { - --h; - if(h < 0) { - h = int(max_history_index_); - } - } else if(data->EventKey == ImGuiKey_DownArrow) { - ++h; - if(h > int(max_history_index_)) { - h = 0; - } - } - { - history_index_ = index_t(h); - if(history_index_ == max_history_index_) { - history_command = ""; - } else { - history_callback_(this, history_index_, history_command); - } - int newpos = std::min( - data->BufSize-1, int(history_command.length()) - ); - strncpy(data->Buf, history_command.c_str(), size_t(newpos)); - data->Buf[newpos] = '\0'; - data->CursorPos = newpos; - data->SelectionStart = newpos; - data->SelectionEnd = newpos; - data->BufTextLen = newpos; - data->BufDirty = true; - } - } - } - } break; - } - return 0; - } - - bool Console::exec_command(const char* command) { - // Note: history_index_ and max_history_index_ are - // not managed here. They are managed by the callback. - return Application::instance()->exec_command(command); - } - - void Console::draw(bool* visible, bool with_window) { - if(!*visible) { - return; - } - if(with_window) { - ImGui::Begin( - "Console", visible, - fixed_layout_ ? ( - ImGuiWindowFlags_NoResize | - ImGuiWindowFlags_NoMove | - ImGuiWindowFlags_NoCollapse - ) : 0 - ); - } - if (ImGui::Button("Clear")) { - clear(); - } - ImGui::SameLine(); - bool copy = ImGui::Button("Copy"); - ImGui::SameLine(); - filter_.Draw("Filter", -100.0f); - ImGui::Separator(); - - if(console_font_ != nullptr) { - ImGui::PushFont(console_font_); - } else if( - ImGui::GetIO().Fonts->Fonts.size() >= 4 && - Application::instance() != nullptr - ) { - if(Application::instance()->scaling() == 2.0f) { - console_font_ = ImGui::GetIO().Fonts->Fonts[3]; - } else { - console_font_ = ImGui::GetIO().Fonts->Fonts[2]; - } - ImGui::PushFont(console_font_); - } - - - float scaling = ImGui::GetIO().FontDefault->FontSize / 16.0f; - - ImGui::BeginChild( - "scrolling", - ImVec2( - 0.0f, - -20.0f * scaling - ), - false, - ImGuiWindowFlags_HorizontalScrollbar - ); - if (copy) { - ImGui::LogToClipboard(); - } - - { - const char* buf_begin = buf_.begin(); - const char* line = buf_begin; - for (int line_no = 0; line != nullptr; line_no++) { - const char* line_end = - (line_no < line_offsets_.Size) ? - buf_begin + line_offsets_[line_no] : nullptr; - - if (!filter_.IsActive() || - filter_.PassFilter(line, line_end) - ) { - bool is_error = ((line_end - line) >= 3 && - line[0] == '[' && - line[2] == ']' && - (line[1] == 'E' || line[1] == 'W') - ); - if(is_error) { - ImGui::PushStyleColor( - ImGuiCol_Text,ImVec4(1.0f,0.0f,0.0f,1.0f) - ); - } - ImGui::TextUnformatted(line, line_end); - if(is_error) { - ImGui::PopStyleColor(); - } - } - line = line_end && line_end[1] ? line_end + 1 : nullptr; - } - } - if (scroll_to_bottom_) { - ImGui::SetScrollHere(); - } - scroll_to_bottom_ = false; - ImGui::EndChild(); - - ImGui::Text(">>>"); - ImGui::SameLine(); - ImGui::PushItemWidth(-20); - if(ImGui::InputText( - "##CommandInput", input_buf_, geo_imgui_string_length, - ImGuiInputTextFlags_EnterReturnsTrue | - ImGuiInputTextFlags_CallbackCompletion | - ImGuiInputTextFlags_CallbackHistory, - &TextEditCallbackStub, (void*)this) - ) { - char* input_end = input_buf_+strlen(input_buf_); - while (input_end > input_buf_ && input_end[-1] == ' ') { - input_end--; - } - *input_end = 0; - if (input_buf_[0]) { - exec_command(input_buf_); - } - strcpy(input_buf_, ""); - } - ImGui::PopItemWidth(); - - // Keeping auto focus on the input box - if ( - ImGui::IsItemHovered() /* || ( - ImGui::IsRootWindowOrAnyChildFocused() && - !ImGui::IsAnyItemActive() && !ImGui::IsMouseClicked(0) - ) */ - ) { - ImGui::SetKeyboardFocusHere(-1); // Auto focus previous widget - } - - if(console_font_ != nullptr) { - ImGui::PopFont(); - } - - if(with_window) { - ImGui::End(); - } - } - - /*****************************************************************/ - - CommandInvoker::CommandInvoker() { - } - - CommandInvoker::~CommandInvoker() { - } - - /*****************************************************************/ - - void Command::flush_queue() { - if(queued_ != nullptr) { - // Steal the queued command to avoid - // infinite recursion. - SmartPointer queued = queued_; - queued_ = nullptr; - queued->apply(); - } - } - - Command::~Command() { - } - - Command::Command(const std::string& prototype_in) : visible_(false) { - - // If there is no brace, then protype only has function - // name, and then the invoker will construct the arguments - // with names arg1, arg2 ... - auto_create_args_ = - (prototype_in.find('(') == std::string::npos); - - if(auto_create_args_) { - name_ = prototype_in; - if(name_ == "") { - name_ = "command"; - } - help_ = "Hay You Programmer ! No prototype was specified, \n" - "see Command::make_current() documentation\n" - "in geogram_gfx/glup_viewer/command.h\n" - "to specify parameter names (and tooltips)"; - return; - } - - // Parsing the prototype... - - std::string prototype = prototype_in; - - // Transform carriage returns into spaces - { - for(index_t i=0; i name_parts; - String::split_string(name_, ' ', name_parts); - name_ = name_parts[name_parts.size()-1]; - } - - // Find help if any - { - size_t bq1 = prototype.find('[',p2); - size_t bq2 = prototype.find(']',p2); - if(bq1 != std::string::npos && bq2 != std::string::npos) { - help_ = prototype.substr(bq1+1, bq2-bq1-1); - } - } - - std::string args_string = prototype.substr(p1+1,p2-p1-1); - std::vector args; - String::split_string(args_string, ',', args); - - for(index_t i=0; i arg_words; - String::split_string(arg, ' ', arg_words); - - // Argument name is the last word - const std::string& arg_name = arg_words[arg_words.size()-1]; - int type = -1; - if(arg_words.size() > 1) { - bool is_unsigned = false; - for(index_t w=0; winvoke(); - } - } - - int Command::int_arg_by_index(index_t i) const { - const Arg& arg = find_arg_by_index(i); - geo_assert( - arg.type == Arg::ARG_INT || - arg.type == Arg::ARG_UINT - ); - int result = arg.val.int_val; - if( - arg.type == Arg::ARG_UINT && - result < 0 - ) { - Logger::warn("Cmd") - << "Argument " << arg.name - << "Of type UNIT had a negative value" - << std::endl; - result = 0; - } - return result; - } - - unsigned int Command::uint_arg_by_index(index_t i) const { - const Arg& arg = find_arg_by_index(i); - geo_assert( - arg.type == Arg::ARG_INT || - arg.type == Arg::ARG_UINT - ); - int result = arg.val.int_val; - if(result < 0) { - Logger::warn("Cmd") - << "Argument " << arg.name - << "queried as uint had a negative value" - << std::endl; - result = 0; - } - return (unsigned int)(result); - } - - void Command::draw() { - if(ImGui::Button("apply")) { - queued_ = this; - } - if(ImGui::IsItemHovered()) { - if(help_ == "") { - ImGui::SetTooltip("apply command"); - } else { - ImGui::SetTooltip("%s",help_.c_str()); - } - } - ImGui::SameLine(); - if(ImGui::Button("default")) { - reset_factory_settings(); - } - if(ImGui::IsItemHovered()) { - ImGui::SetTooltip("reset factory settings"); - } - ImGui::Separator(); - for(index_t i=0; i Command::current_; - SmartPointer Command::queued_; - - /**********************************************************************/ - - namespace { - - /** - * \brief Zooms in. - * \details Zooming factor is 1.1x. - */ - void zoom_in() { - *glup_viewer_float_ptr(GLUP_VIEWER_ZOOM) *= 1.1f; - } - - /** - * \brief Zooms out. - * \details De-zooming factor is (1/1.1)x. - */ - void zoom_out() { - *glup_viewer_float_ptr(GLUP_VIEWER_ZOOM) /= 1.1f; - } - - } - - /**********************************************************************/ - - TextEditor::TextEditor(bool* visible) : visible_(visible) { - impl_.SetText("\n"); - impl_.SetCursorPosition( - ::TextEditor::Coordinates(0,0) - ); - impl_.SetLanguageDefinition( - ::TextEditor::LanguageDefinition::Lua() - ); - impl_.SetPalette(::TextEditor::GetDarkPalette()); - } - - std::string TextEditor::text() const { - return impl_.GetText(); - } - - void TextEditor::draw() { - ImGui::Begin( - "Text Editor", visible_, - ImGuiWindowFlags_NoResize | - ImGuiWindowFlags_NoMove | - ImGuiWindowFlags_NoCollapse - ); - - if(Application::instance()->scaling() == 2.0f) { - ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[3]); - } else { - ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[2]); - } - - impl_.Render("##source"); - - ImGui::PopFont(); - - ImGui::End(); - } - - void TextEditor::load(const std::string& filename) { - std::ifstream in(filename.c_str()); - std::string text; - std::string line; - while(std::getline(in,line)) { - text += line; - text += "\n"; - } - impl_.SetText(text); - impl_.SetCursorPosition( - ::TextEditor::Coordinates(0,0) - ); - } - - void TextEditor::save(const std::string& filename) { - std::ofstream out(filename.c_str()); - out << impl_.GetText(); - } - - void TextEditor::clear() { - impl_.SetText("\n"); - impl_.SetCursorPosition( - ::TextEditor::Coordinates(0,0) - ); - } - - void TextEditor::load_data(const char* data) { - impl_.SetText(data); - impl_.SetCursorPosition( - ::TextEditor::Coordinates(0,0) - ); - } - - /**********************************************************************/ - - Application* Application::instance_ = nullptr; - - Application::Application( - int argc, char** argv, const std::string& usage, lua_State* lua_state - ) : - argc_(argc), - argv_(argv), - usage_(usage), - load_dialog_(this,false), - save_dialog_(this,true), - text_editor_visible_(false), - text_editor_(&text_editor_visible_) - { - - name_ = (argc == 0) ? "" : FileSystem::base_name(argv[0]); - geo_assert(instance_ == nullptr); - instance_ = this; - - GEO::initialize(); - Logger::instance()->set_quiet(false); - - // Import the arg groups needed by graphics. - CmdLine::import_arg_group("standard"); - CmdLine::import_arg_group("algo"); - CmdLine::import_arg_group("gfx"); - - left_pane_visible_ = true; - right_pane_visible_ = true; - console_visible_ = false; - text_editor_visible_ = false; - - console_ = new Console(&console_visible_); - status_bar_ = new StatusBar; - - lighting_ = true; - effect_ = GLUP_VIEWER_NO_EFFECT; - - clip_mode_ = GLUP_CLIP_WHOLE_CELLS; - - geogram_logo_texture_ = 0; - - scaling_ = 1.0f; - fixed_layout_ = true; - retina_mode_ = false; - - GEO::CmdLine::declare_arg( - "gfx:gui", true, "show/hide GUI" - ); - - GEO::CmdLine::declare_arg( - "gfx:background", true, "fancy/plain background" - ); - - GEO::CmdLine::declare_arg( - "gfx:rotate", "", - "initial rotation (four ','-separated doubles: x,y,z,angle)" - ); - - GEO::CmdLine::declare_arg( - "gfx:snapshot", "", "snapshot image file name (.ppm)" - ); - - GEO::CmdLine::declare_arg( - "gfx:keypress", "", "initial simulated sequence of pressed keys" - ); - -#ifdef GEOGRAM_WITH_LUA - lua_error_occured_ = false; - if(lua_state != nullptr) { - lua_state_ = lua_state; - owns_lua_state_ = false; - } else { - lua_state_ = luaL_newstate(); - owns_lua_state_ = true; - luaL_openlibs(lua_state_); - init_lua_io(lua_state_); - } - init_lua_glup(lua_state_); - init_lua_glup_viewer(lua_state_); - init_lua_imgui(lua_state_); -#endif - geo_cite_with_info( - "WEB:ImGUI", - "Used to create the GUI of GEOGRAM utilities " - "(vorpaview, geobox, geocod)." - ); - - background_color_1_ = vec4f(1.0f, 1.0f, 1.0f, 1.0f); - background_color_2_ = vec4f(0.0f, 0.0f, 0.7f, 1.0f); - } - - Application::~Application() { - if(geogram_logo_texture_ != 0) { - glDeleteTextures(1, &geogram_logo_texture_); - } - for(index_t i=0; ion_key_pressed(q)); - break; - case GLUP_VIEWER_MOVE: - break; - case GLUP_VIEWER_UP: - result = GLboolean(Application::instance()->on_key_released(q)); - break; - } - return result; - } - - void Application::start() { - std::vector filenames; - if(!GEO::CmdLine::parse(argc_, argv_, filenames, usage_)) { - return; - } - - if(filenames.size() == 1 && FileSystem::is_directory(filenames[0])) { - path_ = filenames[0]; - } else if(filenames.size() > 0) { - for(index_t i=0; i 0) { - path_ = FileSystem::dir_name(filenames[filenames.size()-1]); - } - } else { - path_ = FileSystem::documents_directory(); - } - - glup_viewer_set_window_title(name_.c_str()); - glup_viewer_set_init_func(init_graphics_callback); - glup_viewer_set_display_func(draw_scene_callback); - glup_viewer_set_overlay_func(draw_gui_callback); - glup_viewer_set_drag_drop_func(dropped_file_callback); - glup_viewer_set_keyboard_func_ext(keyboard_func_ext); - - if(GEO::CmdLine::get_arg_bool("gfx:full_screen")) { - glup_viewer_enable(GLUP_VIEWER_FULL_SCREEN); - } - - if(GEO::CmdLine::get_arg_bool("gfx:gui")) { - glup_viewer_enable(GLUP_VIEWER_TWEAKBARS); - } else { - glup_viewer_disable(GLUP_VIEWER_TWEAKBARS); - } - - if(GEO::CmdLine::get_arg_bool("gfx:background")) { - glup_viewer_enable(GLUP_VIEWER_BACKGROUND); - } else { - glup_viewer_disable(GLUP_VIEWER_BACKGROUND); - } - - glup_viewer_main_loop(argc_, argv_); - } - - void Application::quit() { - glup_viewer_exit_main_loop(); - } - - bool Application::save(const std::string& filename) { - Logger::warn("GLUP") << "Could not save " << filename << std::endl; - Logger::warn("GLUP") << "Application::save() needs to be overloaded" - << std::endl; - return false; - } - - bool Application::load(const std::string& filename) { - Logger::warn("GLUP") << "Could not load " << filename << std::endl; - Logger::warn("GLUP") << "Application::load() needs to be overloaded" - << std::endl; - return false; - } - - bool Application::can_load(const std::string& filename) { - std::string extensions_str = supported_read_file_extensions(); - if(extensions_str == "") { - return false; - } - if(extensions_str == "*") { - return true; - } - std::string extension = FileSystem::extension(filename); - std::vector extensions; - String::split_string(extensions_str, ';', extensions); - for(index_t i=0; i files; - GEO::FileSystem::get_directory_entries(path,files); - - for(GEO::index_t i=0; iregister_client(console_); - Progress::set_client(status_bar_); - - GEO::Graphics::initialize(); - - glup_viewer_add_toggle( - 'a', glup_viewer_is_enabled_ptr(GLUP_VIEWER_IDLE_REDRAW), "animate" - ); - glup_viewer_add_toggle( - 'T', glup_viewer_is_enabled_ptr(GLUP_VIEWER_TWEAKBARS), "tweakbars" - ); - - glup_viewer_add_key_func('z', zoom_in, "Zoom in"); - glup_viewer_add_key_func('Z', zoom_out, "Zoom out"); - glup_viewer_add_toggle('L', &lighting_, "lighting"); - -#ifdef GEO_OS_EMSCRIPTEN - { - std::vector all_files; - GEO::FileSystem::get_directory_entries("/",all_files); - if(all_files.size() > 0 && can_load(all_files[0])) { - load(all_files[0]); - } - } -#endif - - glGenTextures(1, &geogram_logo_texture_); - glActiveTexture(GL_TEXTURE0 + GLUP_TEXTURE_2D_UNIT); - glBindTexture(GL_TEXTURE_2D, geogram_logo_texture_); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexImage2DXPM(geogram_logo_256_xpm); - - if(glup_viewer_is_high_dpi()) { - retina_mode_ = true; - scaling_ = 2.0f; - } - - std::string rotate = GEO::CmdLine::get_arg("gfx:rotate"); - if(rotate != "") { - float axis[3]; - float angle; - sscanf( - rotate.c_str(), - "%f,%f,%f,%f", - &axis[0], &axis[1], &axis[2], &angle - ); - glup_viewer_set_scene_rotation(axis,angle); - } - - std::string keys = GEO::CmdLine::get_arg("gfx:keypress"); - for(size_t i=0; iinit_graphics(); - } - } - - void Application::draw_scene() { - } - - void Application::draw_scene_callback() { - if(instance() != nullptr) { - - glup_viewer_set_background_color( - instance()->background_color_1_.x, - instance()->background_color_1_.y, - instance()->background_color_1_.z - ); - - glup_viewer_set_background_color2( - instance()->background_color_2_.x, - instance()->background_color_2_.y, - instance()->background_color_2_.z - ); - - if(instance()->lighting_) { - glupEnable(GLUP_LIGHTING); - } else { - glupDisable(GLUP_LIGHTING); - } - glupClipMode(instance()->clip_mode_); - instance()->draw_scene(); - std::string snapshot = CmdLine::get_arg("gfx:snapshot"); - if(snapshot != "") { - glup_viewer_snapshot(snapshot.c_str()); - exit(0); - } - } - } - - void Application::draw_gui() { - // TODO: better management of font size (for now we use two - // hardwired sizes) - // Fonts are created in glup_viewer_gui_init(), in glup_viewer_gui_private.cpp - - //ImGui::GetIO().FontGlobalScale = scaling_; - if(scaling_ == 2.0f) { - ImGui::GetIO().FontDefault = ImGui::GetIO().Fonts->Fonts[1]; - } else { - ImGui::GetIO().FontDefault = ImGui::GetIO().Fonts->Fonts[0]; - } - - draw_menu_bar(); - if(text_editor_visible_) { - int w,h; - glup_viewer_get_screen_size(&w, &h); - if(status_bar_->active()) { - h -= (STATUS_HEIGHT()+1); - } - if(console_visible_) { - h -= (CONSOLE_HEIGHT()+1); - } - h -= MENU_HEIGHT(); - ImGui::SetNextWindowPos( - ImVec2(0.0f, float(MENU_HEIGHT())), - fixed_layout_ ? ImGuiCond_Always : ImGuiCond_Once - ); - ImGui::SetNextWindowSize( - ImVec2(float(w), float(h)), - fixed_layout_ ? ImGuiCond_Always : ImGuiCond_Once - ); - text_editor_.draw(); - if(console_visible_) { - draw_console(); - } - if(status_bar_->active()) { - draw_status_bar(); - } - } else { - if(left_pane_visible_) { - draw_left_pane(); - } - if(right_pane_visible_) { - draw_right_pane(); - } - if(console_visible_) { - draw_console(); - } - if(status_bar_->active()) { - draw_status_bar(); - } - } - load_dialog_.draw(); - save_dialog_.draw(); - } - - void Application::draw_left_pane() { - int w,h; - glup_viewer_get_screen_size(&w, &h); - if(status_bar_->active()) { - h -= (STATUS_HEIGHT()+1); - } - if(console_visible_) { - h -= (CONSOLE_HEIGHT()+1); - } - h -= MENU_HEIGHT(); - - if(Command::current() != nullptr) { - h /= 2; - } - - if(fixed_layout_) { - ImGui::SetNextWindowPos( - ImVec2(0.0f, float(MENU_HEIGHT())), - ImGuiCond_Always - ); - ImGui::SetNextWindowSize( - ImVec2(float(PANE_WIDTH()), float(h)), - ImGuiCond_Always - ); - } else { - ImGui::SetNextWindowPos( - ImVec2(float(MENU_HEIGHT()), 2.0f*float(MENU_HEIGHT())), - ImGuiCond_Once - ); - ImGui::SetNextWindowSize( - ImVec2(float(PANE_WIDTH()), float(h)/2.0f), - ImGuiCond_Once - ); - } - - draw_viewer_properties_window(); - - if(Command::current() != nullptr) { - ImGui::SetNextWindowPos( - ImVec2(0.0f, float(MENU_HEIGHT()+h+1)), - ImGuiCond_Always - ); - ImGui::SetNextWindowSize( - ImVec2(float(PANE_WIDTH()), float(h-1)), - ImGuiCond_Always - ); - draw_command(); - } - } - - void Application::draw_right_pane() { - int w,h; - glup_viewer_get_screen_size(&w, &h); - if(status_bar_->active()) { - h -= (STATUS_HEIGHT()+1); - } - if(console_visible_) { - h -= (CONSOLE_HEIGHT()+1); - } - h -= MENU_HEIGHT(); - - ImGui::SetNextWindowPos( - ImVec2(float(w-PANE_WIDTH()), float(MENU_HEIGHT())), - fixed_layout_ ? ImGuiCond_Always : ImGuiCond_Once - ); - - ImGui::SetNextWindowSize( - ImVec2(float(PANE_WIDTH()), float(h)), - fixed_layout_ ? ImGuiCond_Always : ImGuiCond_Once - ); - - draw_object_properties_window(); - } - - void Application::draw_viewer_properties_window() { - ImGui::Begin( - "Viewer", - fixed_layout_ ? &left_pane_visible_ : nullptr, - fixed_layout_ ? ( - ImGuiWindowFlags_NoResize | - ImGuiWindowFlags_NoMove | - ImGuiWindowFlags_NoCollapse - ) : 0 - ); - draw_viewer_properties(); - ImGui::End(); - } - - void Application::draw_viewer_properties() { - if(ImGui::Button("home [H]", ImVec2(-1,0))) { - glup_viewer_home(); - } - ImGui::Separator(); - ImGui::Checkbox( - "Lighting [L]", &lighting_ - ); - if(lighting_) { - ImGui::Checkbox( - "edit light [l]", - (bool*)glup_viewer_is_enabled_ptr(GLUP_VIEWER_ROTATE_LIGHT) - ); - } - - ImGui::Separator(); - ImGui::Checkbox( - "Clipping [F1]", (bool*)glup_viewer_is_enabled_ptr(GLUP_VIEWER_CLIP) - ); - if(glup_viewer_is_enabled(GLUP_VIEWER_CLIP)) { - ImGui::Combo( - "mode", - (int*)&clip_mode_, - "std. GL\0cells\0straddle\0slice\0\0" - ); - ImGui::Checkbox( - "edit clip [F2]", - (bool*)glup_viewer_is_enabled_ptr(GLUP_VIEWER_EDIT_CLIP) - ); - ImGui::Checkbox( - "fixed clip [F3]", - (bool*)glup_viewer_is_enabled_ptr(GLUP_VIEWER_FIXED_CLIP) - ); - } - - ImGui::Separator(); - ImGui::Text("Style"); - if(ImGui::ColorEdit3WithPalette( - "Background 1", background_color_1_.data()) - ) { - glup_viewer_enable(GLUP_VIEWER_BACKGROUND); - } - if(ImGui::ColorEdit3WithPalette( - "Background 2", background_color_2_.data()) - ) { - glup_viewer_enable(GLUP_VIEWER_BACKGROUND); - } - if( - ImGui::Combo( - "sfx", - (int*)&effect_, - "none\0SSAO\0cartoon\0\0" - ) - ) { - if(!glup_viewer_set_effect(effect_)) { - Logger::err("GLUP") << "Could not activate effect" - << std::endl; - } - } - } - - void Application::draw_object_properties_window() { - ImGui::Begin( - "Object", &right_pane_visible_, - fixed_layout_ ? ( - ImGuiWindowFlags_NoResize | - ImGuiWindowFlags_NoMove | - ImGuiWindowFlags_NoCollapse - ) : 0 - ); - draw_object_properties(); - ImGui::End(); - } - - void Application::draw_object_properties() { - ImGui::Separator(); - ImGui::Text("Object properties..."); - } - - void Application::draw_command() { - geo_assert(Command::current() != nullptr); - if(!Command::current()->is_visible()) { - Command::reset_current(); - return; - } - ImGui::Begin( - Command::current()->name().c_str(), - Command::current()->is_visible_ptr(), - ImGuiWindowFlags_NoResize | - ImGuiWindowFlags_NoMove | - ImGuiWindowFlags_NoCollapse - ); - Command::current()->draw(); - ImGui::End(); - } - - void Application::draw_console() { - int w,h; - glup_viewer_get_screen_size(&w, &h); - h = h - CONSOLE_HEIGHT(); - if(!fixed_layout_ || status_bar_->active()) { - h -= (STATUS_HEIGHT() + 1); - } - if(fixed_layout_) { - ImGui::SetNextWindowPos( - ImVec2(0.0f, float(h)), - ImGuiCond_Always - ); - ImGui::SetNextWindowSize( - ImVec2(float(w),float(CONSOLE_HEIGHT())), - ImGuiCond_Always - ); - } else { - ImGui::SetNextWindowPos( - ImVec2(float(MENU_HEIGHT()), float(h) - float(MENU_HEIGHT())), - ImGuiCond_Once - ); - ImGui::SetNextWindowSize( - ImVec2( - float(w) - 2.0f * float(MENU_HEIGHT()), - float(CONSOLE_HEIGHT()) - ), - ImGuiCond_Once - ); - } - console_->set_fixed_layout(fixed_layout_); - console_->draw(&console_visible_); - } - - void Application::draw_status_bar() { - int w,h; - glup_viewer_get_screen_size(&w, &h); - ImGui::SetNextWindowPos( - ImVec2(0.0f, float(h-STATUS_HEIGHT())), - ImGuiCond_Always - ); - ImGui::SetNextWindowSize( - ImVec2(float(w),float(STATUS_HEIGHT()-1)), - ImGuiCond_Always - ); - status_bar_->draw(); - } - - void Application::draw_menu_bar() { - if(ImGui::BeginMainMenuBar()) { - if(ImGui::BeginMenu("File")) { - if(supported_read_file_extensions() != "") { - draw_load_menu(); - } -#ifndef GEO_OS_EMSCRIPTEN - if(current_file_ != "") { - if(ImGui::MenuItem("Save")) { - if(save(current_file_)) { - Logger::out("I/O") << "Saved " - << current_file_ << std::endl; - } else { - Logger::out("I/O") << "Could not save " - << current_file_ << std::endl; - } - } - } -#endif - if(supported_write_file_extensions() != "") { - draw_save_menu(); - } - draw_fileops_menu(); - draw_about(); -#ifndef GEO_OS_EMSCRIPTEN - ImGui::Separator(); - if(ImGui::MenuItem("quit [q]")) { - glup_viewer_exit_main_loop(); - } -#endif - ImGui::EndMenu(); - } - draw_windows_menu(); - draw_application_menus(); - - ImGui::EndMainMenuBar(); - } - } - - void Application::draw_application_menus() { - // Meant to be overloaded in derived classes. - } - - void Application::draw_load_menu() { -#ifdef GEO_OS_EMSCRIPTEN - ImGui::Text("To load a file,"); - ImGui::Text("use the \"Browse\""); - ImGui::Text("button on the top"); - ImGui::Text("(or \"recent files\""); - ImGui::Text("below)"); - ImGui::Separator(); - if(ImGui::BeginMenu("Recent files...")) { - browse(path_); - ImGui::EndMenu(); - } -#else - if(ImGui::MenuItem("Load...")) { - load_dialog_.show(); - } -#endif - } - - void Application::draw_save_menu() { -#ifdef GEO_OS_EMSCRIPTEN - if(ImGui::BeginMenu("Save as...")) { - ImGui::MenuItem("Supported extensions:", nullptr, false, false); - std::vector extensions; - String::split_string( - supported_write_file_extensions(), ';', extensions - ); - for(index_t i=0; iget_value("version") - ).c_str() - ); - ImGui::EndMenu(); - } - } - - void Application::draw_windows_menu() { - if(ImGui::BeginMenu("Windows")) { - ImGui::MenuItem("object properties", nullptr, &right_pane_visible_); - ImGui::MenuItem("viewer properties", nullptr, &left_pane_visible_); - ImGui::MenuItem("console", nullptr, &console_visible_); - ImGui::MenuItem("text editor", nullptr, &text_editor_visible_); - - if(ImGui::MenuItem( - "show/hide GUI [T]", nullptr, - (bool*)glup_viewer_is_enabled_ptr(GLUP_VIEWER_TWEAKBARS) - )) { - glup_viewer_post_redisplay(); - } - ImGui::Separator(); - if(ImGui::MenuItem("Big text", nullptr, &retina_mode_)) { - scaling_ = retina_mode_ ? 2.0f : 1.0f; - glup_viewer_post_redisplay(); - } - ImGui::EndMenu(); - } - } - - void Application::draw_gui_callback() { - if(instance() != nullptr) { - instance()->draw_gui(); - } - } - - void Application::dropped_file_callback(char* filename) { - if(instance() != nullptr) { - instance()->load(std::string(filename)); - } - } - - void Application::init_colormap( - const std::string& name, const char** xpm_data - ) { - colormaps_.push_back(ColormapInfo()); - colormaps_.rbegin()->name = name; - glGenTextures(1, &colormaps_.rbegin()->texture); - glBindTexture(GL_TEXTURE_2D, colormaps_.rbegin()->texture); - glTexImage2DXPM(xpm_data); - glGenerateMipmap(GL_TEXTURE_2D); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri( - GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR - ); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glBindTexture(GL_TEXTURE_2D, 0); - } - - void Application::init_colormaps() { - init_colormap("french", french_xpm); - init_colormap("black_white", black_white_xpm); - init_colormap("viridis", viridis_xpm); - init_colormap("rainbow", rainbow_xpm); - init_colormap("cei_60757", cei_60757_xpm); - init_colormap("inferno", inferno_xpm); - init_colormap("magma", magma_xpm); - init_colormap("parula", parula_xpm); - init_colormap("plasma", plasma_xpm); - init_colormap("blue_red", blue_red_xpm); - } - - /**********************************************************************/ - - bool Application::exec_command(const char* command) { -#ifdef GEOGRAM_WITH_LUA - if(luaL_dostring(lua_state_,command)) { - adjust_lua_glup_state(lua_state_); - const char* msg = lua_tostring(lua_state_,-1); - const char* msg2 = strchr(msg,']'); - if(msg2 != nullptr) { - msg = msg2+2; - } - Logger::err("LUA") << "line " << msg << std::endl; - lua_error_occured_ = true; - } else { - lua_error_occured_ = false; - } - return !lua_error_occured_; -#else - geo_argused(command); - Logger::err("LUA") << "Compiled without LUA support" - << std::endl; - return false; -#endif - } - - bool Application::on_key_pressed(const char* q) { - geo_argused(q); - return false; - } - - bool Application::on_key_released(const char* q) { - geo_argused(q); - return false; - } - - /**********************************************************************/ - - int Application::MENU_HEIGHT() const { - return int(20 * scaling()); - } - - int Application::PANE_WIDTH() const { - return int(140 * scaling()); - } - - int Application::CONSOLE_HEIGHT() const { - return int(200 * scaling()); - } - - int Application::STATUS_HEIGHT() const { - return retina_mode() ? 48 : 35; - } - - /**********************************************************************/ - - SimpleMeshApplication::SimpleMeshApplication( - int argc, char** argv, const std::string& usage - ) : Application(argc, argv, usage) { - std::vector extensions; - GEO::MeshIOHandlerFactory::list_creators(extensions); - file_extensions_ = String::join_strings(extensions, ';'); - - save_dialog_.set_default_filename("out.meshb"); - - anim_speed_ = 1.0f; - anim_time_ = 0.0f; - - show_vertices_ = false; - show_vertices_selection_ = true; - vertices_size_ = 1.0f; - vertices_color_ = vec4f(0.0f, 1.0f, 0.0f, 1.0f); - - show_surface_ = true; - show_surface_sides_ = false; - show_mesh_ = true; - mesh_color_ = vec4f(0.0f, 0.0f, 0.0f, 1.0f); - mesh_width_ = 0.1f; - - show_surface_borders_ = false; - surface_color_ = vec4f(0.0f, 0.5f, 1.0f, 1.0f); - surface_color_2_ = vec4f(1.0f, 0.5f, 0.0f, 1.0f); - - show_volume_ = false; - volume_color_ = vec4f(0.9f, 0.9f, 0.9f, 1.0f); - cells_shrink_ = 0.0f; - show_colored_cells_ = false; - show_hexes_ = true; - show_connectors_ = true; - - GEO::CmdLine::declare_arg( - "attributes", true, "load mesh attributes" - ); - - GEO::CmdLine::declare_arg( - "single_precision", true, "use single precision vertices (FP32)" - ); - - show_attributes_ = false; - current_colormap_texture_ = 0; - attribute_min_ = 0.0f; - attribute_max_ = 0.0f; - attribute_ = "vertices.point_fp32[0]"; - attribute_name_ = "point_fp32[0]"; - attribute_subelements_ = MESH_VERTICES; - } - - std::string SimpleMeshApplication::supported_read_file_extensions() { - return file_extensions_; - } - - std::string SimpleMeshApplication::supported_write_file_extensions() { - return file_extensions_; - } - - void SimpleMeshApplication::autorange() { - if(attribute_subelements_ != MESH_NONE) { - attribute_min_ = 0.0; - attribute_max_ = 0.0; - const MeshSubElementsStore& subelements = - mesh_.get_subelements_by_type(attribute_subelements_); - ReadOnlyScalarAttributeAdapter attribute( - subelements.attributes(), attribute_name_ - ); - if(attribute.is_bound()) { - attribute_min_ = Numeric::max_float32(); - attribute_max_ = Numeric::min_float32(); - for(index_t i=0; i attributes; - String::split_string(attribute_names(), ';', attributes); - for(index_t i=0; i= 6) { - ImGui::Separator(); - ImGui::Checkbox( - "Animate [a]", - (bool*)glup_viewer_is_enabled_ptr(GLUP_VIEWER_IDLE_REDRAW) - ); - ImGui::SliderFloat("spd.", &anim_speed_, 1.0f, 10.0f, "%.1f"); - ImGui::SliderFloat("t.", &anim_time_, 0.0f, 1.0f, "%.2f"); - } - - ImGui::Separator(); - ImGui::Checkbox("##VertOnOff", &show_vertices_); - ImGui::SameLine(); - ImGui::ColorEdit3WithPalette("Vert. [p]", vertices_color_.data()); - - if(show_vertices_) { - ImGui::Checkbox("selection", &show_vertices_selection_); - ImGui::SliderFloat("sz.", &vertices_size_, 0.1f, 5.0f, "%.1f"); - } - - if(mesh_.facets.nb() != 0) { - ImGui::Separator(); - ImGui::Checkbox("##SurfOnOff", &show_surface_); - ImGui::SameLine(); - ImGui::ColorEdit3WithPalette( - "Surf. [S]", surface_color_.data() - ); - if(show_surface_) { - ImGui::Checkbox("##SidesOnOff", &show_surface_sides_); - ImGui::SameLine(); - ImGui::ColorEdit3WithPalette( - "2sided [c]", surface_color_2_.data() - ); - - ImGui::Checkbox("##MeshOnOff", &show_mesh_); - ImGui::SameLine(); - ImGui::ColorEdit3WithPalette("mesh [m]", mesh_color_.data()); - - if(show_mesh_) { - ImGui::SliderFloat( - "wid.", &mesh_width_, 0.1f, 2.0f, "%.1f" - ); - } - - ImGui::Checkbox("borders [B]", &show_surface_borders_); - } - } - - if(mesh_.cells.nb() != 0) { - ImGui::Separator(); - ImGui::Checkbox("##VolumeOnOff", &show_volume_); - ImGui::SameLine(); - ImGui::ColorEdit3WithPalette("Volume [V]", volume_color_.data()); - if(show_volume_) { - ImGui::SliderFloat( - "shrk.", &cells_shrink_, 0.0f, 1.0f, "%.2f" - ); - if(!mesh_.cells.are_simplices()) { - ImGui::Checkbox("colored cells [C]", &show_colored_cells_); - ImGui::Checkbox("hexes [j]", &show_hexes_); - } - } - } - } - - void SimpleMeshApplication::increment_anim_time_callback() { - instance()->anim_time_ = std::min( - instance()->anim_time_ + 0.05f, 1.0f - ); - } - - void SimpleMeshApplication::decrement_anim_time_callback() { - instance()->anim_time_ = std::max( - instance()->anim_time_ - 0.05f, 0.0f - ); - } - - void SimpleMeshApplication::increment_cells_shrink_callback() { - instance()->cells_shrink_ = std::min( - instance()->cells_shrink_ + 0.05f, 1.0f - ); - } - - void SimpleMeshApplication::decrement_cells_shrink_callback() { - instance()->cells_shrink_ = std::max( - instance()->cells_shrink_ - 0.05f, 0.0f - ); - } - - void SimpleMeshApplication::init_graphics() { - glup_viewer_add_toggle('p', &show_vertices_, "vertices"); - glup_viewer_add_toggle('S', &show_surface_, "surface"); - glup_viewer_add_toggle('c', &show_surface_sides_, "2sided"); - glup_viewer_add_toggle('B', &show_surface_borders_,"borders"); - glup_viewer_add_toggle('m', &show_mesh_, "mesh"); - glup_viewer_add_toggle('V', &show_volume_, "volume"); - glup_viewer_add_toggle('j', &show_hexes_, "hexes"); - glup_viewer_add_toggle('k', &show_connectors_, "connectors"); - glup_viewer_add_toggle('C', &show_colored_cells_, "colored cells"); - - glup_viewer_add_key_func( - 'r', decrement_anim_time_callback, "Decrement time" - ); - - glup_viewer_add_key_func( - 't', increment_anim_time_callback, "Increment time" - ); - - glup_viewer_add_key_func( - 'x', decrement_cells_shrink_callback, "Decrement shrink" - ); - - glup_viewer_add_key_func( - 'w', increment_cells_shrink_callback, "Increment shrink" - ); - - init_colormaps(); - current_colormap_texture_ = colormaps_[3].texture; - Application::init_graphics(); - } - - void SimpleMeshApplication::draw_scene() { - - if(mesh_gfx_.mesh() == nullptr) { - return; - } - - if(glup_viewer_is_enabled(GLUP_VIEWER_IDLE_REDRAW)) { - anim_time_ = float( - sin(double(anim_speed_) * GEO::SystemStopwatch::now()) - ); - anim_time_ = 0.5f * (anim_time_ + 1.0f); - } - - mesh_gfx_.set_lighting(lighting_); - mesh_gfx_.set_time(double(anim_time_)); - - if(show_attributes_) { - mesh_gfx_.set_scalar_attribute( - attribute_subelements_, attribute_name_, - double(attribute_min_), double(attribute_max_), - current_colormap_texture_, 1 - ); - } else { - mesh_gfx_.unset_scalar_attribute(); - } - - if(show_vertices_) { - mesh_gfx_.set_points_color( - vertices_color_.x, vertices_color_.y, vertices_color_.z - ); - mesh_gfx_.set_points_size(vertices_size_); - mesh_gfx_.draw_vertices(); - } - - if(show_vertices_selection_) { - mesh_gfx_.set_points_color(1.0, 0.0, 0.0); - mesh_gfx_.set_points_size(2.0f * vertices_size_); - mesh_gfx_.set_vertices_selection("selection"); - mesh_gfx_.draw_vertices(); - mesh_gfx_.set_vertices_selection(""); - } - - mesh_gfx_.set_mesh_color(0.0, 0.0, 0.0); - - mesh_gfx_.set_surface_color( - surface_color_.x, surface_color_.y, surface_color_.z - ); - if(show_surface_sides_) { - mesh_gfx_.set_backface_surface_color( - surface_color_2_.x, surface_color_2_.y, surface_color_2_.z - ); - } - - mesh_gfx_.set_show_mesh(show_mesh_); - mesh_gfx_.set_mesh_color(mesh_color_.x, mesh_color_.y, mesh_color_.z); - mesh_gfx_.set_mesh_width(index_t(mesh_width_*10.0f)); - - if(show_surface_) { - float specular_backup = glupGetSpecular(); - glupSetSpecular(0.4f); - mesh_gfx_.draw_surface(); - glupSetSpecular(specular_backup); - } - - if(show_surface_borders_) { - mesh_gfx_.draw_surface_borders(); - } - - if(show_mesh_) { - mesh_gfx_.draw_edges(); - } - - if(show_volume_) { - - if( - glupIsEnabled(GLUP_CLIPPING) && - glupGetClipMode() == GLUP_CLIP_SLICE_CELLS - ) { - mesh_gfx_.set_lighting(false); - } - - mesh_gfx_.set_shrink(double(cells_shrink_)); - mesh_gfx_.set_draw_cells(GEO::MESH_HEX, show_hexes_); - mesh_gfx_.set_draw_cells(GEO::MESH_CONNECTOR, show_connectors_); - - if(show_colored_cells_) { - mesh_gfx_.set_cells_colors_by_type(); - } else { - mesh_gfx_.set_cells_color( - volume_color_.x, volume_color_.y, volume_color_.z - ); - } - mesh_gfx_.draw_volume(); - - mesh_gfx_.set_lighting(lighting_); - } - } - - bool SimpleMeshApplication::load(const std::string& filename) { - if(!FileSystem::is_file(filename)) { - Logger::out("I/O") << "is not a file" << std::endl; - } - mesh_gfx_.set_mesh(nullptr); - - mesh_.clear(false,false); - - if(GEO::CmdLine::get_arg_bool("single_precision")) { - mesh_.vertices.set_single_precision(); - } - - MeshIOFlags flags; - if(CmdLine::get_arg_bool("attributes")) { - flags.set_attribute(MESH_FACET_REGION); - flags.set_attribute(MESH_CELL_REGION); - } - if(!mesh_load(filename, mesh_, flags)) { - return false; - } - - if( - FileSystem::extension(filename) == "obj6" || - FileSystem::extension(filename) == "tet6" - ) { - Logger::out("Vorpaview") - << "Displaying mesh animation." << std::endl; - - glup_viewer_enable(GLUP_VIEWER_IDLE_REDRAW); - - mesh_gfx_.set_animate(true); - double xyzmin[3]; - double xyzmax[3]; - get_bbox(mesh_, xyzmin, xyzmax, true); - glup_viewer_set_region_of_interest( - float(xyzmin[0]), float(xyzmin[1]), float(xyzmin[2]), - float(xyzmax[0]), float(xyzmax[1]), float(xyzmax[2]) - ); - } else { - mesh_gfx_.set_animate(false); - mesh_.vertices.set_dimension(3); - double xyzmin[3]; - double xyzmax[3]; - get_bbox(mesh_, xyzmin, xyzmax, false); - glup_viewer_set_region_of_interest( - float(xyzmin[0]), float(xyzmin[1]), float(xyzmin[2]), - float(xyzmax[0]), float(xyzmax[1]), float(xyzmax[2]) - ); - } - - show_vertices_ = (mesh_.facets.nb() == 0); - mesh_gfx_.set_mesh(&mesh_); - - current_file_ = filename; - return true; - } - - bool SimpleMeshApplication::save(const std::string& filename) { - MeshIOFlags flags; - if(CmdLine::get_arg_bool("attributes")) { - flags.set_attribute(MESH_FACET_REGION); - flags.set_attribute(MESH_CELL_REGION); - } - if(mesh_save(mesh_, filename, flags)) { - current_file_ = filename; - return true; - } - return false; - } - - void SimpleMeshApplication::get_bbox( - const Mesh& M_in, double* xyzmin, double* xyzmax, bool animate - ) { - geo_assert(M_in.vertices.dimension() >= index_t(animate ? 6 : 3)); - for(index_t c = 0; c < 3; c++) { - xyzmin[c] = Numeric::max_float64(); - xyzmax[c] = Numeric::min_float64(); - } - - for(index_t v = 0; v < M_in.vertices.nb(); ++v) { - if(M_in.vertices.single_precision()) { - const float* p = M_in.vertices.single_precision_point_ptr(v); - for(coord_index_t c = 0; c < 3; ++c) { - xyzmin[c] = std::min(xyzmin[c], double(p[c])); - xyzmax[c] = std::max(xyzmax[c], double(p[c])); - if(animate) { - xyzmin[c] = std::min(xyzmin[c], double(p[c+3])); - xyzmax[c] = std::max(xyzmax[c], double(p[c+3])); - } - } - } else { - const double* p = M_in.vertices.point_ptr(v); - for(coord_index_t c = 0; c < 3; ++c) { - xyzmin[c] = std::min(xyzmin[c], p[c]); - xyzmax[c] = std::max(xyzmax[c], p[c]); - if(animate) { - xyzmin[c] = std::min(xyzmin[c], p[c+3]); - xyzmax[c] = std::max(xyzmax[c], p[c+3]); - } - } - } - } - } -} - diff --git a/src/lib/geogram_gfx/glup_viewer/glup_viewer_gui_private.cpp b/src/lib/geogram_gfx/glup_viewer/glup_viewer_gui_private.cpp deleted file mode 100644 index d428c178..00000000 --- a/src/lib/geogram_gfx/glup_viewer/glup_viewer_gui_private.cpp +++ /dev/null @@ -1,289 +0,0 @@ -/* - * _____ _ _ _ ____ - * / ___| | | | | | | / _ \ - * | | | | | | | | | |_\ \ - * | | _ | | | | | | | __ / - * | |_| | | |___ | |_| | | | - * \_____/ |_____| \_____/ |_| - * - * _ _ _ _____ _ __ _____ _____ - * | | / / | | | ____| | | / / | ____| | _ \ - * | | / / | | | |__ | | __ / / | |__ | |_| | - * | | / / | | | __| | | / | / / | __| | _ / - * | |/ / | | | |___ | |/ |/ / | |___ | | \ \ - * |___/ |_| |_____| |___/|___/ |_____| |_| \_\ - * - * Version 1.0 - * Bruno Levy, April 2016 - * INRIA, Project ALICE - * - * Used internally by GLUP Viewer for interfacing with ImGUI - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -/* - *Lots of documentation tags in GLFW that are - * not understood by CLANG. - */ -#ifdef __clang__ -#pragma GCC diagnostic ignored "-Wdocumentation" -#endif - -#ifdef GEO_OS_EMSCRIPTEN -#include -#include -#include -#else -#include -#endif - -#include - -#include -#include - - -/***************************************************************************/ - -static GEO::FullScreenEffectImpl_var effect_; - - -// Commands may need to update the GUI (when using -// the console or the progressbar). The Command class -// does that outside of the ImGui handler, but if client -// code does that directly, then we may have two nested -// invocations of the ImGui handler, which is not correct. -// This variable avoids to have two nested invocations of -// the ImGui handler. -static bool glup_viewer_gui_locked = false; - -extern "C" { - void glup_viewer_one_frame(void); -} - - - -void glup_viewer_gui_update() { - // It's a pity, but under Emscripten, only the browser can have the - // control of the rendering loop, therefore it is not possible (or I - // don't know how) to update the graphics during computations. -#ifndef GEO_OS_EMSCRIPTEN - glup_viewer_post_redisplay(); - if(!glup_viewer_gui_locked) { - glup_viewer_one_frame(); - } -#endif -} - -/***************************************************************************/ - -#ifdef GEO_OS_EMSCRIPTEN -extern "C" { - void drag_drop(GLFWwindow* w, int nb, const char** p); -} - -void load_latest_file(); - -/** - * \brief This function is called by the HTML shell each - * time a file is loaded. - * \details For now, it uses the fact that the latest loaded - * file appears first in the list (to be improved). - */ -void load_latest_file() { - std::vector all_files; - GEO::FileSystem::get_directory_entries("/",all_files); - if( - all_files.size() > 0 && - GEO::FileSystem::is_file(all_files[0]) - ) { - const char* pname = all_files[0].c_str(); - drag_drop(nullptr, 1, &pname); - } -} -#endif - - -void glup_viewer_gui_init(GLFWwindow* w) { - -#ifdef GEO_OS_EMSCRIPTEN - GEO::FileSystem::set_file_system_changed_callback(load_latest_file); -#endif - - ImGui::CreateContext(); - ImGuiIO& io = ImGui::GetIO(); - ImGui_ImplGlfw_InitForOpenGL(w,false); - { - GEO::Logger::out("ImGUI") << "Viewer GUI init (GL3)" - << std::endl; -#if defined(GEO_OS_APPLE) - ImGui_ImplOpenGL3_Init("#version 330"); -#elif defined(GEO_OS_ANDROID) - // TODO: have also version for OpenGL ES 2.0. - ImGui_ImplOpenGL3_Init("#version 300 es"); -#else - ImGui_ImplOpenGL3_Init("#version 100"); -#endif - } - - ImGuiStyle& style = ImGui::GetStyle(); - style.WindowRounding = 10.0f; - style.FrameRounding = 10.0f; - style.GrabRounding = 10.0f; - io.IniFilename = nullptr; - - io.FontDefault = io.Fonts->AddFontFromMemoryCompressedTTF( - roboto_medium_compressed_data, roboto_medium_compressed_size, 16.0f - ); - - io.Fonts->AddFontFromMemoryCompressedTTF( - roboto_medium_compressed_data, roboto_medium_compressed_size, 32.0f - ); - - io.FontDefault = io.Fonts->AddFontFromMemoryCompressedTTF( - cousine_regular_compressed_data, cousine_regular_compressed_size, 16.0f - ); - - io.Fonts->AddFontFromMemoryCompressedTTF( - cousine_regular_compressed_data, cousine_regular_compressed_size, 32.0f - ); - -} - -void glup_viewer_gui_cleanup() { - ImGui_ImplOpenGL3_Shutdown(); - ImGui_ImplGlfw_Shutdown(); - ImGui::DestroyContext(); -} - - -void glup_viewer_gui_begin_frame() { - glup_viewer_gui_locked = true; - ImGui_ImplOpenGL3_NewFrame(); - ImGui_ImplGlfw_NewFrame(); - ImGui::NewFrame(); -} - -void glup_viewer_gui_end_frame() { - GlupViewerDisplayFunc overlay_func = glup_viewer_get_overlay_func(); - if(overlay_func != nullptr) { - overlay_func(); - ImGui::Render(); - ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); - } - glup_viewer_gui_locked = false; - // We flush the queued command here, once ImGui::Render() was - // called, so that if it triggers a frame rendering (e.g. through - // the Logger or the ProgressLogger), then ImGui calls are correctly - // nested. - GEO::Command::flush_queue(); - if(glup_viewer_gui_takes_input()) { - glup_viewer_post_redisplay(); - } -} - -int glup_viewer_gui_takes_input() { - if(!glup_viewer_is_enabled(GLUP_VIEWER_TWEAKBARS)) { - return 0; - } - return ( - ImGui::GetIO().WantCaptureMouse || - ImGui::GetIO().WantCaptureKeyboard - ) ? 1 : 0; -} - -void glup_viewer_gui_mouse_button_callback( - GLFWwindow* window, int button, int action, int mods -) { - glup_viewer_post_redisplay(); - ImGui_ImplGlfw_MouseButtonCallback(window, button, action, mods); -} - -void glup_viewer_gui_scroll_callback( - GLFWwindow* window, double xoffset, double yoffset -) { - ImGui_ImplGlfw_ScrollCallback(window, xoffset, yoffset); -} - -void glup_viewer_gui_key_callback( - GLFWwindow* window, int key, int scancode, int action, int mods -) { - ImGui_ImplGlfw_KeyCallback(window, key, scancode, action, mods); -} - -void glup_viewer_gui_char_callback(GLFWwindow* window, unsigned int c) { - glup_viewer_post_redisplay(); - ImGui_ImplGlfw_CharCallback(window, c); -} - -void glup_viewer_gui_resize(int width, int height) { - glup_viewer_post_redisplay(); - ImGui::GetIO().DisplaySize.x = float(width); - ImGui::GetIO().DisplaySize.y = float(height); -} - -GLboolean glup_viewer_get_arg_bool(const char* param) { - return GEO::CmdLine::get_arg_bool(param) ? GL_TRUE : GL_FALSE; -} - -GLboolean glup_viewer_test_arg_string(const char* param, const char* arg) { - return (GEO::CmdLine::get_arg(param) == arg) ? GL_TRUE : GL_FALSE; -} - -void glup_viewer_set_screen_size_from_args() { - std::string geometry = GEO::CmdLine::get_arg("gfx:geometry"); - int w,h; - sscanf(geometry.c_str(),"%dx%d",&w,&h); - glup_viewer_set_screen_size(w,h); -} - -GLboolean glup_viewer_set_effect(GLenum effect) { - switch(effect) { - case GLUP_VIEWER_NO_EFFECT: - effect_.reset(); - break; - case GLUP_VIEWER_AMBIENT_OCCLUSION: - effect_ = new GEO::AmbientOcclusionImpl(); - break; - case GLUP_VIEWER_UNSHARP_MASKING: - effect_ = new GEO::UnsharpMaskingImpl(); - break; - } - GLboolean result = (effect_.is_null() || effect_->OK()) ? GL_TRUE : GL_FALSE; - if(!effect_.is_null() && !effect_->OK()) { - effect_.reset(); - } - return result; -} - -void glup_viewer_effect_begin_frame() { - if(!effect_.is_null()) { - int w,h; - glup_viewer_get_screen_size(&w,&h); - effect_->pre_render(GEO::index_t(w), GEO::index_t(h)); - } -} - -void glup_viewer_effect_end_frame() { - if(!effect_.is_null()) { - effect_->post_render(); - } -} - diff --git a/src/lib/geogram_gfx/glup_viewer/glup_viewer_gui_private.h b/src/lib/geogram_gfx/glup_viewer/glup_viewer_gui_private.h deleted file mode 100755 index b11f6b62..00000000 --- a/src/lib/geogram_gfx/glup_viewer/glup_viewer_gui_private.h +++ /dev/null @@ -1,166 +0,0 @@ -/* - * _____ _ _ _ ____ - * / ___| | | | | | | / _ \ - * | | | | | | | | | |_\ \ - * | | _ | | | | | | | __ / - * | |_| | | |___ | |_| | | | - * \_____/ |_____| \_____/ |_| - * - * _ _ _ _____ _ __ _____ _____ - * | | / / | | | ____| | | / / | ____| | _ \ - * | | / / | | | |__ | | __ / / | |__ | |_| | - * | | / / | | | __| | | / | / / | __| | _ / - * | |/ / | | | |___ | |/ |/ / | |___ | | \ \ - * |___/ |_| |_____| |___/|___/ |_____| |_| \_\ - * - * Version 1.0 - * Bruno Levy, April 2016 - * INRIA, Project ALICE - * - * Used internally by GLUP Viewer for interfacing with ImGUI - * - */ - - -#ifndef GLUP_VIEWER_GUI -#define GLUP_VIEWER_GUI - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - /** - * \file geogram_gfx/glup_viewer/glup_viewer_gui_private.h - * \short These functions are used internally by - * glup_viewer for interfacing with ImGUI. - */ - - struct GLFWwindow; - - /** - * \brief Initializes GLUP viewer GUI structures. - * \details Called at application startup. - * \param[in] w a pointer to the GLFWwindow - */ - void GLUP_VIEWER_API glup_viewer_gui_init(GLFWwindow* w); - - /** - * \brief Deletes all the variables allocated for the GUI. - * \details Called at application shutdown. - */ - void GLUP_VIEWER_API glup_viewer_gui_cleanup(void); - - /** - * \brief Starts a new frame. - */ - void GLUP_VIEWER_API glup_viewer_gui_begin_frame(void); - - /** - * \brief Ends a frame. - */ - void GLUP_VIEWER_API glup_viewer_gui_end_frame(void); - - /** - * \brief Tests whether callbacks are directed towards - * GUI elements or application. - * \retval non-zero if callbacks are directed towards GUI - * \retval zero if callbacks should be taken into account - * by the application. - */ - int GLUP_VIEWER_API glup_viewer_gui_takes_input(void); - - /** - * \brief Callback for mouse button events. - * \param[in] window a pointer to the GLFWwindow - * \param[in] button the mouse button - * \param[in] action the action - * \param[in] mods modifiers - */ - void GLUP_VIEWER_API glup_viewer_gui_mouse_button_callback( - GLFWwindow* window, int button, int action, int mods - ); - - /** - * \brief Callback for mouse wheel events. - * \param[in] window a pointer to the GLFWwindow - * \param[in] xoffset horizontal displacement - * \param[in] yoffset vertical displacement - */ - void GLUP_VIEWER_API glup_viewer_gui_scroll_callback( - GLFWwindow* window, double xoffset, double yoffset - ); - - /** - * \brief Callback for low-level key events - * \param[in] window a pointer to the GLFWwindow - * \param[in] key the key code - * \param[in] scancode the scan code - * \param[in] action the action - * \param[in] mods modifiers - */ - void GLUP_VIEWER_API glup_viewer_gui_key_callback( - GLFWwindow* window, int key, int scancode, int action, int mods - ); - - /** - * \brief Callback for high-level key events. - * \param[in] window a pointer to the GLFWwindow - * \param[in] c the character that corresponds to the - * pushed key - */ - void GLUP_VIEWER_API glup_viewer_gui_char_callback( - GLFWwindow* window, unsigned int c - ); - - /** - * \brief Callback for window resize events. - * \param[in] width the new width - * \param[in] height the new height - */ - void GLUP_VIEWER_API glup_viewer_gui_resize(int width, int height); - - /** - * \brief Redraws the GUI and the scene. - * \details It can be used from a command to update the graphics during - * a computation. It is called whenever a message is displayed in the - * console or whenever the progress bar is updated. It is ignored if called - * from the redraw or from the overlay callbacks. - */ - void GLUP_VIEWER_API glup_viewer_gui_update(void); - - /** - * \brief Tests a boolean command line argument. - * \param[in] param the name of the argument - * \return the value of the argument - */ - GLboolean GLUP_VIEWER_API glup_viewer_get_arg_bool(const char* param); - - /** - * \brief Tests a string command line argument. - * \param[in] param the name of the argument - * \param[in] arg the value to be tested - * \retval GLtrue if command line argument \p param has value \p arg - * \retval GLfalse otherwise - */ - GLboolean GLUP_VIEWER_API glup_viewer_test_arg_string( - const char* param, const char* arg - ); - - - /** - * \brief Gets the screen size from the arglist and sends it to GLUP. - */ - void GLUP_VIEWER_API glup_viewer_set_screen_size_from_args(void); - - - void GLUP_VIEWER_API glup_viewer_effect_begin_frame(void); - - void GLUP_VIEWER_API glup_viewer_effect_end_frame(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/lib/geogram_gfx/gui/application.cpp b/src/lib/geogram_gfx/gui/application.cpp new file mode 100644 index 00000000..918398e5 --- /dev/null +++ b/src/lib/geogram_gfx/gui/application.cpp @@ -0,0 +1,1236 @@ +/* + * Copyright (c) 2012-2016, Bruno Levy All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#include + +#include + +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + + +#if defined(GEO_GLFW) +# include +// Too many documentation warnings in glfw +// (glfw uses tags that clang does not understand). +# ifdef __clang__ +# pragma GCC diagnostic ignored "-Wdocumentation" +# endif + +# if defined(GEO_USE_SYSTEM_GLFW3) || defined(GEO_OS_EMSCRIPTEN) +# include +# else +# include +# endif + + +#endif + +namespace ImGui { + void UpdateHoveredWindowAndCaptureFlags(); +} + +namespace GEO { + + void StyleColorsCorporateGrey(bool threeD); + /** + * \brief Computes the pixel ratio for hidpi devices. + * \details Uses the current GLFW window. + */ + double pixel_ratio(); + + /** + * \brief Computes the scaling factor for hidpi devices. + * \details Uses the current GLFW window. + */ + double hidpi_scaling(); + + + /** + * \brief If nothing happens during 100 frames, then + * we (micro)-sleep instead of redrawing the + * window. + */ + const index_t NB_FRAMES_UPDATE_INIT = 100; + +#if defined(GEO_GLFW) + class ApplicationData { + public: + ApplicationData() { + window_ = nullptr; + GLFW_callbacks_initialized_ = false; + ImGui_callback_mouse_button = nullptr; + ImGui_callback_cursor_pos = nullptr; + ImGui_callback_scroll = nullptr; + ImGui_callback_key = nullptr; + ImGui_callback_char = nullptr; + ImGui_callback_drop = nullptr; + ImGui_callback_refresh = nullptr; + } + GLFWwindow* window_; + bool GLFW_callbacks_initialized_; + GLFWmousebuttonfun ImGui_callback_mouse_button; + GLFWcursorposfun ImGui_callback_cursor_pos; + GLFWscrollfun ImGui_callback_scroll; + GLFWkeyfun ImGui_callback_key; + GLFWcharfun ImGui_callback_char; + GLFWdropfun ImGui_callback_drop; + GLFWwindowrefreshfun ImGui_callback_refresh; + }; + +#else +# error "No windowing system" +#endif + +} + +namespace GEO { + + Application* Application::instance_ = nullptr; + + Application::Application(const std::string& name) { + geo_assert(instance_ == nullptr); + GEO::initialize(); + instance_ = this; + name_ = name; + data_ = new ApplicationData(); + ImGui_restart_ = false; + ImGui_reload_font_ = false; + ImGui_initialized_ = false; + width_ = 800; + height_ = 800; + in_main_loop_ = false; + accept_drops_ = true; + scaling_ = 1.0; + font_size_ = 18; + nb_update_locks_ = 0; + nb_frames_update_ = NB_FRAMES_UPDATE_INIT; + hidpi_scaling_ = 1.0; + pixel_ratio_ = 1.0; + currently_drawing_gui_ = false; + animate_ = false; + menubar_visible_ = true; + } + + Application::~Application() { + geo_assert(instance_ == this); + delete data_; + data_ = nullptr; + instance_ = nullptr; + } + + void Application::start(int argc, char** argv) { + if(argc != 0 && argv != nullptr) { + geogram_initialize(argc, argv); + } + if(CmdLine::arg_is_declared("gui:font_size")) { + set_font_size(CmdLine::get_arg_uint("gui:font_size")); + } + create_window(); + main_loop(); + delete_window(); + } + + void Application::stop() { + in_main_loop_ = false; + } + + std::string Application::get_styles() { + return "Light;Dark;CorporateGrey"; + } + + void Application::set_style(const std::string& style_name) { + style_ = style_name; + + if(style_name == "Light") { + ImGui::StyleColorsLight(); + ImGuiStyle& style = ImGui::GetStyle(); + style.WindowRounding = 10.0f; + style.FrameRounding = 5.0f; + style.GrabRounding = 10.0f; + style.WindowBorderSize = 1.5f; + style.FrameBorderSize = 1.0f; + style.PopupBorderSize = 1.0f; + ImVec4* colors = style.Colors; + colors[ImGuiCol_Text] = ImVec4(0.0f, 0.0f, 0.25f, 1.00f); + colors[ImGuiCol_TextDisabled] = ImVec4(0.25f, 0.25f, 0.75f, 1.00f); + colors[ImGuiCol_Separator] = ImVec4(0.75f, 0.75f, 0.75f, 1.00f); + } else if(style_name == "Dark") { + ImGuiStyle& style = ImGui::GetStyle(); + style.WindowRounding = 10.0f; + style.FrameRounding = 5.0f; + style.GrabRounding = 10.0f; + style.WindowBorderSize = 1.5f; + style.FrameBorderSize = 0.0f; + style.PopupBorderSize = 1.0f; + ImGui::StyleColorsDark(); + } else if(style_name == "CorporateGrey") { + StyleColorsCorporateGrey(true); + } else { + set_style("Light"); + Logger::err("Skin") << style_name << ": no such style" + << std::endl; + } + + ImGuiStyle& style = ImGui::GetStyle(); + if(CmdLine::get_arg_bool("gfx:transparent")) { + // Make ImGui windows opaque if background is + // transparent (else it becomes difficult to + // distinguish anything...) + style.Alpha = 1.0f; + } else { + style.Alpha = 0.90f; + } + + + } + + void Application::set_font_size(index_t value) { + font_size_ = index_t(value); + scaling_ = double(font_size_)/16.0; + if(CmdLine::arg_is_declared("gui:font_size")) { + CmdLine::set_arg("gui:font_size", String::to_string(value)); + } + if(ImGui_initialized_) { + ImGui_reload_font_ = true; + } + } + + double Application::scaling() const { + return scaling_ * hidpi_scaling_ / pixel_ratio_; + } + + + void Application::resize(index_t w, index_t h) { + width_ = w; + height_ = h; + update(); + } + + void Application::draw_gui() { + } + + void Application::draw_graphics() { + } + + void Application::mouse_button_callback( + int button, int action, int mods, int source + ) { + geo_argused(button); + geo_argused(action); + geo_argused(mods); + geo_argused(source); + } + + void Application::scroll_callback(double xoffset, double yoffset) { + geo_argused(xoffset); + geo_argused(yoffset); + } + + void Application::cursor_pos_callback(double x, double y, int source) { + geo_argused(x); + geo_argused(y); + geo_argused(source); + } + + void Application::drop_callback(int nb, const char** f) { + geo_argused(nb); + geo_argused(f); + } + + void Application::char_callback(unsigned int c) { + geo_argused(c); + } + + void Application::key_callback( + int key, int scancode, int action, int mods + ) { + geo_argused(key); + geo_argused(scancode); + geo_argused(action); + geo_argused(mods); + } + + void Application::draw_dock_space() { + ImGuiIO& io = ImGui::GetIO(); + // Create window and dockspace for docking. + if((io.ConfigFlags & ImGuiConfigFlags_DockingEnable) != 0) { + ImGuiViewport* viewport = ImGui::GetMainViewport(); + ImGui::SetNextWindowPos(viewport->Pos); + ImGui::SetNextWindowSize(viewport->Size); + ImGui::SetNextWindowViewport(viewport->ID); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + ImGui::PushStyleVar( + ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f) + ); + static bool open = true; + ImGui::Begin( + "DockSpace", &open, + ImGuiWindowFlags_NoDocking | + ImGuiWindowFlags_NoTitleBar | + ImGuiWindowFlags_NoCollapse | + ImGuiWindowFlags_NoResize | + ImGuiWindowFlags_NoMove | + ImGuiWindowFlags_NoBringToFrontOnFocus | + ImGuiWindowFlags_NoNavFocus | + ImGuiWindowFlags_NoBackground | + (menubar_visible_ ? ImGuiWindowFlags_MenuBar : 0) + ); + ImGui::PopStyleVar(3); + ImGuiID dockspace_id = ImGui::GetID("MyDockSpace"); + ImGui::DockSpace( + dockspace_id, ImVec2(0.0f, 0.0f), + ImGuiDockNodeFlags_None | + ImGuiDockNodeFlags_PassthruCentralNode | + ImGuiDockNodeFlags_AutoHideTabBar + ); + ImGui::End(); + } + } + + void Application::draw() { + if(!ImGui_initialized_) { + return; + } + update(); + if(nb_update_locks_ == 0 && !Process::is_running_threads()) { + one_frame(); + } + } + + void Application::GL_initialize() { + GEO::Graphics::initialize(); + geo_assert(glupCurrentContext() == nullptr); + glupMakeCurrent(glupCreateContext()); + if(glupCurrentContext() == nullptr) { + Logger::err("Skin") << "Could not create GLUP context" + << std::endl; + exit(-1); + } + } + + void Application::GL_terminate() { + glupDeleteContext(glupCurrentContext()); + glupMakeCurrent(nullptr); + } + + void Application::ImGui_initialize() { + geo_assert(!ImGui_initialized_ ); + ImGui::CreateContext(); + { + std::string state = CmdLine::get_arg("gui:state"); + for(size_t i=0; iwindow_, !data_->GLFW_callbacks_initialized_ + ); +#endif + +#if defined(GEO_OS_APPLE) + ImGui_ImplOpenGL3_Init("#version 330"); +#else + ImGui_ImplOpenGL3_Init("#version 100"); +#endif + callbacks_initialize(); + + if(style_ != "") { + set_style(style_); + } else if(Environment::instance()->has_value("gui:style")) { + std::string style = Environment::instance()->get_value("gui:style"); + set_style(style); + } else { + set_style("Light"); + } + + ImGui_load_fonts(); + ImGui_initialized_ = true; + } + + void Application::ImGui_load_fonts() { + ImGuiIO& io = ImGui::GetIO(); + io.IniFilename = nullptr; + + float font_size = float(double(font_size_) * hidpi_scaling_); + + // Default font + io.FontDefault = io.Fonts->AddFontFromMemoryCompressedTTF( + roboto_medium_compressed_data, + roboto_medium_compressed_size, font_size + ); + + // Add icons to default font. + { +#define ICON_MIN_FA 0xf000 +#define ICON_MAX_FA 0xf63c + + ImFontConfig config; + config.MergeMode = true; + + // Make the icon monospaced + config.GlyphMinAdvanceX = 1.5f*font_size; + config.GlyphOffset.y += 2.0f; + + static const ImWchar icon_ranges[] = { + ICON_MIN_FA, ICON_MAX_FA, 0 + }; + + io.Fonts->AddFontFromMemoryCompressedTTF( + fa_solid_compressed_data, + fa_solid_compressed_size, font_size, + &config, icon_ranges + ); + + init_icon_table(); + } + + // Fixed font for console and editor + io.Fonts->AddFontFromMemoryCompressedTTF( + cousine_regular_compressed_data, + cousine_regular_compressed_size, font_size + ); + + // Larger font + io.Fonts->AddFontFromMemoryCompressedTTF( + roboto_medium_compressed_data, + roboto_medium_compressed_size, font_size*1.5f + ); + + + io.FontGlobalScale = float(1.0 / pixel_ratio_); + } + + void Application::ImGui_terminate() { + geo_assert(ImGui_initialized_); + ImGui_ImplOpenGL3_Shutdown(); +#if defined(GEO_GLFW) + ImGui_ImplGlfw_Shutdown(); +#endif + ImGui::DestroyContext(); + ImGui_initialized_ = false; + } + + void Application::ImGui_new_frame() { + ImGui_ImplOpenGL3_NewFrame(); +#if defined(GEO_GLFW) + ImGui_ImplGlfw_NewFrame(); +#endif + ImGui::NewFrame(); + } + + void Application::geogram_initialize(int argc, char** argv) { + GEO::initialize(); + CmdLine::import_arg_group("standard"); + CmdLine::import_arg_group("algo"); + CmdLine::import_arg_group("gfx"); + CmdLine::import_arg_group("gui"); + CmdLine::parse(argc, argv, filenames_); + } + + bool Application::needs_to_redraw() const { + return + animate_ || + ImGui::GetIO().WantCaptureMouse || + ImGui::GetIO().WantCaptureKeyboard || + (nb_frames_update_ > 0); + } + + void Application::update() { + // We redraw several frames, in order to make + // sure all events are properly processed. + nb_frames_update_ = NB_FRAMES_UPDATE_INIT; + } + + void Application::set_gui_state(std::string x) { + CmdLine::set_arg("gui:state", x); + if(!ImGui_initialized_) { + return; + } + ImGui_restart_ = true; + } + + std::string Application::get_gui_state() const { + std::string state; + if(ImGui_initialized_) { + state = std::string(ImGui::SaveIniSettingsToMemory()); + for(size_t i=0; i words; + String::split_string(geometry, 'x', words); + if(words.size() != 2) { + Logger::err("Skin") + << "Invalid gfx:geometry:" << geometry << std::endl; + exit(-1); + } + if( + !String::string_to_unsigned_integer(words[0].c_str(), width_) || + !String::string_to_unsigned_integer(words[1].c_str(), height_) + ) { + Logger::err("Skin") + << "Invalid gfx:geometry:" << geometry << std::endl; + exit(-1); + } + } + + if(CmdLine::get_arg_bool("gfx:transparent")) { +#ifdef GLFW_TRANSPARENT_FRAMEBUFFER + glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE); +#else + Logger::warn("Skin") + << "Transparent not supported by this version of GLFW" + << std::endl; +#endif + } + + if(CmdLine::get_arg_bool("gfx:full_screen")) { + GLFWmonitor* monitor = glfwGetPrimaryMonitor(); + const GLFWvidmode* vidmode = glfwGetVideoMode(monitor); + width_ = index_t(vidmode->width); + height_ = index_t(vidmode->height); + + bool no_decoration = CmdLine::get_arg_bool("gfx:no_decoration"); + + if(no_decoration) { + glfwWindowHint(GLFW_FOCUSED,GL_TRUE); + glfwWindowHint(GLFW_DECORATED,GL_FALSE); + glfwWindowHint(GLFW_RESIZABLE,GL_FALSE); + glfwWindowHint(GLFW_AUTO_ICONIFY,GL_FALSE); + glfwWindowHint(GLFW_FLOATING,GL_FALSE); + glfwWindowHint(GLFW_MAXIMIZED,GL_TRUE); + } + + data_->window_ = glfwCreateWindow( + int(width_), int(height_), title, + no_decoration ? glfwGetPrimaryMonitor() : nullptr, + nullptr + ); + + } else { + data_->window_ = glfwCreateWindow( + int(width_), int(height_), title, nullptr, nullptr + ); + } + + if(data_->window_ == nullptr) { + Logger::err("Skin") + << "Could not create GLFW window" << std::endl; + exit(-1); + } + + glfwSetWindowUserPointer(data_->window_, this); + + glfwMakeContextCurrent(data_->window_); + glfwSwapInterval(1); + + hidpi_scaling_ = hidpi_scaling(); + pixel_ratio_ = pixel_ratio(); + + Logger::out("Skin") + << "hidpi_scaling=" << hidpi_scaling_ << std::endl; + Logger::out("Skin") + << "pixel_ratio=" << pixel_ratio_ << std::endl; + } + + void Application::delete_window() { + glfwDestroyWindow(data_->window_); + data_->window_ = nullptr; + glfwTerminate(); + in_main_loop_ = false; + } + + + void Application::one_frame() { + // Avoid nested ImGui calls + // (due to calling draw()) + if(currently_drawing_gui_) { + return; + } + + // Can happen when ImGui Graphite application + // triggers update too soon. + if(data_->window_ == nullptr) { + return; + } + + if(glfwWindowShouldClose(data_->window_) || !in_main_loop_) { + return; + } + + { + int cur_width, cur_height; + glfwGetFramebufferSize(data_->window_, &cur_width, &cur_height); + if(int(width_) != cur_width || int(height_) != cur_height) { + resize(index_t(cur_width), index_t(cur_height)); + } + } + + { + // Detect if hidpi scaling changed. This can happen when + // dragging the window from the laptop screen to an external + // monitor. + if( + glfwGetCurrentContext() != nullptr && + hidpi_scaling() != hidpi_scaling_ + ) { + hidpi_scaling_ = hidpi_scaling(); + pixel_ratio_ = pixel_ratio(); + set_font_size(font_size_); // This reloads the font. + } + } + + glfwPollEvents(); + + + if(needs_to_redraw()) { + pre_draw(); + currently_drawing_gui_ = true; + ImGui_new_frame(); + draw_graphics(); + draw_gui(); + ImGui::Render(); + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + currently_drawing_gui_ = false; + glfwSwapBuffers(data_->window_); + post_draw(); + if(nb_frames_update_ > 0 && !animate_) { + --nb_frames_update_; + } + } else { + // Sleep for 0.2 seconds, to let the processor cold-down + // instead of actively waiting (be a good citizen for the + // other processes. + Process::sleep(20000); + } + + // ImGui needs to be restarted whenever docking state is reloaded. + if(ImGui_restart_) { + ImGui_restart_ = false; + ImGui_terminate(); + if(CmdLine::arg_is_declared("gui:font_size")) { + set_font_size(CmdLine::get_arg_uint("gui:font_size")); + ImGui_reload_font_ = false; + } + ImGui_initialize(); + } else if(ImGui_reload_font_) { + ImGuiIO& io = ImGui::GetIO(); + io.Fonts->Clear(); + ImGui_load_fonts(); + ImGui_ImplOpenGL3_DestroyDeviceObjects(); + ImGui_reload_font_ = false; + } + } + + void Application::main_loop() { + in_main_loop_ = true; + bool initialized = false; + while (!glfwWindowShouldClose(data_->window_) && in_main_loop_) { + if(!initialized) { + GL_initialize(); + ImGui_initialize(); + initialized = true; + } + one_frame(); + } + if(initialized) { + ImGui_terminate(); + GL_terminate(); + } + } + + namespace { + void GLFW_callback_mouse_button( + GLFWwindow* w, int button, int action, int mods + ) { + Application* app = static_cast( + glfwGetWindowUserPointer(w) + ); + app->update(); + if(!ImGui::GetIO().WantCaptureMouse) { + app->mouse_button_callback(button,action,mods); + } + // Note: when a menu is open and you click elsewhere, the + // WantCaptureMouse flag is still set, and the framework + // misses the "mouse button up" event. If a translation is + // active, it remains active later ("sticky translation" bug). + // The following code always generates a "mouse button up" event + // to solve this problem. + if(ImGui::GetIO().WantCaptureMouse && action==EVENT_ACTION_UP) { + ImVec2 mouse_pos = ImGui::GetIO().MousePos; + app->cursor_pos_callback(mouse_pos.x, mouse_pos.y); + app->mouse_button_callback(button,action,mods); + } + if(app->impl_data()->ImGui_callback_mouse_button != nullptr) { + app->impl_data()->ImGui_callback_mouse_button( + w, button, action, mods + ); + } + } + + void GLFW_callback_cursor_pos( + GLFWwindow* w, double xf, double yf + ) { + Application* app = static_cast( + glfwGetWindowUserPointer(w) + ); + app->update(); + if(app->impl_data()->ImGui_callback_cursor_pos != nullptr) { + app->impl_data()->ImGui_callback_cursor_pos(w, xf, yf); + } + if(!ImGui::GetIO().WantCaptureMouse) { + app->cursor_pos_callback(xf, yf); + } + } + + void GLFW_callback_scroll( + GLFWwindow* w, double xoffset, double yoffset + ) { + Application* app = static_cast( + glfwGetWindowUserPointer(w) + ); + app->update(); + if(!ImGui::GetIO().WantCaptureMouse) { + app->scroll_callback(xoffset, yoffset); + } + if(app->impl_data()->ImGui_callback_scroll != nullptr) { + app->impl_data()->ImGui_callback_scroll(w, xoffset, yoffset); + } + } + + void GLFW_callback_drop( + GLFWwindow* w, int nb, const char** p + ) { + Application* app = static_cast( + glfwGetWindowUserPointer(w) + ); + app->update(); + if(app->impl_data()->ImGui_callback_drop != nullptr) { + app->impl_data()->ImGui_callback_drop(w, nb, p); + } + app->drop_callback(nb, p); + } + + void GLFW_callback_char(GLFWwindow* w, unsigned int c) { + Application* app = static_cast( + glfwGetWindowUserPointer(w) + ); + app->update(); + if(app->impl_data()->ImGui_callback_char != nullptr) { + app->impl_data()->ImGui_callback_char(w, c); + } + if(!ImGui::GetIO().WantCaptureKeyboard) { + app->char_callback(c); + } + } + + void GLFW_callback_key( + GLFWwindow* w, int key, int scancode, int action, int mods + ) { + Application* app = static_cast( + glfwGetWindowUserPointer(w) + ); + app->update(); + if(app->impl_data()->ImGui_callback_key != nullptr) { + app->impl_data()->ImGui_callback_key( + w, key, scancode, action, mods + ); + } + if(!ImGui::GetIO().WantCaptureKeyboard) { + app->key_callback(key,scancode,action,mods); + } + } + + void GLFW_callback_refresh(GLFWwindow* w) { + Application* app = static_cast( + glfwGetWindowUserPointer(w) + ); + app->update(); + if(app->impl_data()->ImGui_callback_refresh != nullptr) { + app->impl_data()->ImGui_callback_refresh(w); + } + } + } + + void Application::callbacks_initialize() { + if(data_->GLFW_callbacks_initialized_) { + GEO::Logger::out("ImGui") << "Viewer GUI restart (config. changed)" + << std::endl; + } else { + GEO::Logger::out("ImGui") << "Viewer GUI init (GL3)" + << std::endl; + } + + if(!data_->GLFW_callbacks_initialized_) { + // Get previous callbacks so that we can call them if ImGui + // wants to handle user input. + data_->ImGui_callback_mouse_button = glfwSetMouseButtonCallback( + data_->window_,GLFW_callback_mouse_button + ); + data_->ImGui_callback_cursor_pos = glfwSetCursorPosCallback( + data_->window_,GLFW_callback_cursor_pos + ); + data_->ImGui_callback_scroll = glfwSetScrollCallback( + data_->window_,GLFW_callback_scroll + ); + data_->ImGui_callback_char = glfwSetCharCallback( + data_->window_,GLFW_callback_char + ); + data_->ImGui_callback_key = glfwSetKeyCallback( + data_->window_,GLFW_callback_key + ); + data_->ImGui_callback_drop = glfwSetDropCallback( + data_->window_,GLFW_callback_drop + ); + data_->ImGui_callback_refresh = glfwSetWindowRefreshCallback( + data_->window_,GLFW_callback_refresh + ); + data_->GLFW_callbacks_initialized_ = true; + } + } + + void Application::set_window_icon(Image* icon_image) { + GLFWimage glfw_image; + glfw_image.width = int(icon_image->width()); + glfw_image.height = int(icon_image->height()); + glfw_image.pixels = icon_image->base_mem(); + glfwSetWindowIcon(data_->window_, 1, &glfw_image); + } + + void Application::set_full_screen_mode( + index_t w, index_t h, index_t Hz, index_t monitor + ) { + if(data_->window_ == nullptr) { + return; + } + int count; + GLFWmonitor** monitors = glfwGetMonitors(&count); + if(int(monitor) >= count) { + Logger::err("Skin") << monitor << ": no such monitor" + << std::endl; + } + if((w == 0) || (h == 0) || (Hz == 0)) { + Logger::out("Application") + << "Using default video mode" << std::endl; + const GLFWvidmode* mode = glfwGetVideoMode(monitors[monitor]); + w = index_t(mode->width); + h = index_t(mode->height); + Hz = index_t(mode->refreshRate); + } + glfwSetWindowMonitor( + data_->window_, monitors[monitor], 0, 0, int(w), int(h), int(Hz) + ); + update(); + } + + void Application::set_windowed_mode(index_t w, index_t h) { + if(w != 0 && h != 0) { + width_ = w; + height_ = w; + } + glfwSetWindowMonitor( + data_->window_, nullptr, 0, 0, int(width_), int(height_), 50 + ); + update(); + } + + + void Application::list_video_modes() { + int nb_monitors = 0; + GLFWmonitor** monitors = glfwGetMonitors(&nb_monitors); + Logger::out("Application") << "Detected " << nb_monitors + << " monitor(s)" + << std::endl; + for(int m=0; mwindow_ == nullptr ){ + return ; + } + glfwIconifyWindow(data_->window_); + } + + void Application::restore() { + if(data_->window_ == nullptr ){ + return ; + } + + // In full screen mode, glfwRestoreWindow() + // does not seem to work, so we switch to + // windowed mode, deiconify, then switch back + // to full screen mode. + if(get_full_screen()) { + set_full_screen(false); + glfwRestoreWindow(data_->window_); + set_full_screen(true); + } else { + glfwRestoreWindow(data_->window_); + } + } + + bool Application::get_full_screen() const { + return (data_->window_ != nullptr && + glfwGetWindowMonitor(data_->window_) != nullptr); + } + + void Application::set_full_screen(bool x) { + if(x != get_full_screen()) { + if(x) { + set_full_screen_mode(); + } else { + set_windowed_mode(); + } + } + } + + void* Application::impl_window() { + return data_->window_; + } + +#else +# error "No windowing system" +#endif + + +#ifdef GEO_GLFW + const char* Application::key_to_string(int key) { + if(key == GLFW_KEY_LEFT) { + return "left"; + } + if(key == GLFW_KEY_RIGHT) { + return "right"; + } + if(key == GLFW_KEY_UP) { + return "up"; + } + if(key == GLFW_KEY_DOWN) { + return "down"; + } + if(key == GLFW_KEY_F1) { + return "F1"; + } + if(key == GLFW_KEY_F2) { + return "F2"; + } + if(key == GLFW_KEY_F3) { + return "F3"; + } + if(key == GLFW_KEY_F4) { + return "F4"; + } + if(key == GLFW_KEY_F5) { + return "F5"; + } + if(key == GLFW_KEY_F6) { + return "F6"; + } + if(key == GLFW_KEY_F7) { + return "F7"; + } + if(key == GLFW_KEY_F8) { + return "F8"; + } + if(key == GLFW_KEY_F9) { + return "F9"; + } + if(key == GLFW_KEY_F10) { + return "F10"; + } + if(key == GLFW_KEY_F11) { + return "F11"; + } + if(key == GLFW_KEY_F12) { + return "F12"; + } + if(key == GLFW_KEY_LEFT_CONTROL) { + return "left_control"; + } + if(key == GLFW_KEY_RIGHT_CONTROL) { + return "right_control"; + } + if(key == GLFW_KEY_LEFT_ALT) { + return "left_alt"; + } + if(key == GLFW_KEY_RIGHT_ALT) { + return "right_alt"; + } + if(key == GLFW_KEY_LEFT_SHIFT) { + return "left_shift"; + } + if(key == GLFW_KEY_RIGHT_SHIFT) { + return "right_shift"; + } + if(key == GLFW_KEY_ESCAPE) { + return "escape"; + } + if(key == GLFW_KEY_TAB) { + return "tab"; + } + if(key == GLFW_KEY_BACKSPACE) { + return "backspace"; + } + return ""; + } +#else + const char* Application::key_to_string(int key) { + return ""; + } +#endif + +} + +/************************ Utilities *************************************/ + +namespace GEO { + + void StyleColorsCorporateGrey(bool threeD) { + ImGuiStyle & style = ImGui::GetStyle(); + ImVec4 * colors = style.Colors; + + /// 0 = FLAT APPEARENCE + /// 1 = MORE "3D" LOOK + float is3D = threeD ? 1.0f : 0.0f; + + colors[ImGuiCol_Text] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); + colors[ImGuiCol_TextDisabled] = ImVec4(0.40f, 0.40f, 0.40f, 1.00f); + colors[ImGuiCol_ChildBg] = ImVec4(0.15f, 0.15f, 0.15f, 1.00f); //BL orig=0.25 + colors[ImGuiCol_WindowBg] = ImVec4(0.20f, 0.20f, 0.20f, 1.00f); //BL orig=0.25 + colors[ImGuiCol_PopupBg] = ImVec4(0.25f, 0.25f, 0.25f, 1.00f); + colors[ImGuiCol_Border] = ImVec4(0.12f, 0.12f, 0.12f, 0.71f); + colors[ImGuiCol_BorderShadow] = ImVec4(1.00f, 1.00f, 1.00f, 0.06f); + colors[ImGuiCol_FrameBg] = ImVec4(0.42f, 0.42f, 0.42f, 0.54f); + colors[ImGuiCol_FrameBgHovered] = ImVec4(0.42f, 0.42f, 0.42f, 0.40f); + colors[ImGuiCol_FrameBgActive] = ImVec4(0.56f, 0.56f, 0.56f, 0.67f); + colors[ImGuiCol_TitleBg] = ImVec4(0.19f, 0.19f, 0.19f, 1.00f); + colors[ImGuiCol_TitleBgActive] = ImVec4(0.22f, 0.22f, 0.22f, 1.00f); + colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.17f, 0.17f, 0.17f, 0.90f); + colors[ImGuiCol_MenuBarBg] = ImVec4(0.335f, 0.335f, 0.335f, 1.000f); + colors[ImGuiCol_ScrollbarBg] = ImVec4(0.24f, 0.24f, 0.24f, 0.53f); + colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.41f, 0.41f, 0.41f, 1.00f); + colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.52f, 0.52f, 0.52f, 1.00f); + colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.76f, 0.76f, 0.76f, 1.00f); + colors[ImGuiCol_CheckMark] = ImVec4(0.65f, 0.65f, 0.65f, 1.00f); + colors[ImGuiCol_SliderGrab] = ImVec4(0.52f, 0.52f, 0.52f, 1.00f); + colors[ImGuiCol_SliderGrabActive] = ImVec4(0.64f, 0.64f, 0.64f, 1.00f); + colors[ImGuiCol_Button] = ImVec4(0.54f, 0.54f, 0.54f, 0.35f); + colors[ImGuiCol_ButtonHovered] = ImVec4(0.52f, 0.52f, 0.52f, 0.59f); + colors[ImGuiCol_ButtonActive] = ImVec4(0.76f, 0.76f, 0.76f, 1.00f); + colors[ImGuiCol_Header] = ImVec4(0.38f, 0.38f, 0.38f, 1.00f); + colors[ImGuiCol_HeaderHovered] = ImVec4(0.47f, 0.47f, 0.47f, 1.00f); + colors[ImGuiCol_HeaderActive] = ImVec4(0.76f, 0.76f, 0.76f, 0.77f); + colors[ImGuiCol_Separator] = ImVec4(0.000f, 0.000f, 0.000f, 0.137f); + colors[ImGuiCol_SeparatorHovered] = ImVec4(0.700f, 0.671f, 0.600f, 0.290f); + colors[ImGuiCol_SeparatorActive] = ImVec4(0.702f, 0.671f, 0.600f, 0.674f); + colors[ImGuiCol_ResizeGrip] = ImVec4(0.26f, 0.59f, 0.98f, 0.25f); + colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); + colors[ImGuiCol_ResizeGripActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f); + colors[ImGuiCol_PlotLines] = ImVec4(0.61f, 0.61f, 0.61f, 1.00f); + colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.43f, 0.35f, 1.00f); + colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); + colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.60f, 0.00f, 1.00f); + colors[ImGuiCol_TextSelectedBg] = ImVec4(0.73f, 0.73f, 0.73f, 0.35f); + colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.35f); + colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 0.90f); + colors[ImGuiCol_NavHighlight] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); + colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 1.00f, 1.00f, 0.70f); + colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.20f); + + style.PopupRounding = 3; + + style.WindowPadding = ImVec2(4, 4); + style.FramePadding = ImVec2(6, 4); + style.ItemSpacing = ImVec2(6, 2); + + style.ScrollbarSize = 18; + + style.WindowBorderSize = 1; + style.ChildBorderSize = 1; + style.PopupBorderSize = 1; + style.FrameBorderSize = is3D; + + style.WindowRounding = 3; + style.ChildRounding = 3; + style.FrameRounding = 3; + style.ScrollbarRounding = 2; + style.GrabRounding = 3; + +#ifdef IMGUI_HAS_DOCK + style.TabBorderSize = is3D; + style.TabRounding = 3; + + colors[ImGuiCol_DockingEmptyBg] = ImVec4(0.38f, 0.38f, 0.38f, 1.00f); + colors[ImGuiCol_Tab] = ImVec4(0.25f, 0.25f, 0.25f, 1.00f); + colors[ImGuiCol_TabHovered] = ImVec4(0.40f, 0.40f, 0.40f, 1.00f); + colors[ImGuiCol_TabActive] = ImVec4(0.33f, 0.33f, 0.33f, 1.00f); + colors[ImGuiCol_TabUnfocused] = ImVec4(0.25f, 0.25f, 0.25f, 1.00f); + colors[ImGuiCol_TabUnfocusedActive] = ImVec4(0.33f, 0.33f, 0.33f, 1.00f); + colors[ImGuiCol_DockingPreview] = ImVec4(0.85f, 0.85f, 0.85f, 0.28f); + + if (ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_ViewportsEnable) + { + style.WindowRounding = 0.0f; + style.Colors[ImGuiCol_WindowBg].w = 1.0f; + } +#endif + } + + +#if defined(GEO_GLFW) && !defined(GEO_OS_EMSCRIPTEN) + + double pixel_ratio() { + int buf_size[2]; + int win_size[2]; + GLFWwindow* window = glfwGetCurrentContext(); + glfwGetFramebufferSize(window, &buf_size[0], &buf_size[1]); + glfwGetWindowSize(window, &win_size[0], &win_size[1]); + return double(buf_size[0]) / double(win_size[0]); + } + + double hidpi_scaling() { + float xscale, yscale; + GLFWwindow* window = glfwGetCurrentContext(); + glfwGetWindowContentScale(window, &xscale, &yscale); + return 0.5 * double(xscale + yscale); + } + +#else + + double pixel_ratio() { + return 1.0; + } + + double hidpi_scaling() { + return 1.0; + } + +#endif + +} + diff --git a/src/lib/geogram_gfx/gui/application.h b/src/lib/geogram_gfx/gui/application.h new file mode 100644 index 00000000..482d082c --- /dev/null +++ b/src/lib/geogram_gfx/gui/application.h @@ -0,0 +1,557 @@ +/* + * Copyright (c) 2012-2016, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#ifndef H_GEOGRAM_GFX_GUI_APPLICATION_H +#define H_GEOGRAM_GFX_GUI_APPLICATION_H + +#include +#include + +#ifndef GEO_OS_ANDROID +# define GEO_GLFW +#endif + +/** + * \file geogram_gfx/gui/application.h + * \brief Base class for all applications. + */ + +namespace GEO { + + class Image; + class ApplicationData; + + /** + * \brief Base class for all applications. + * \details This class handles the cross-platform creation of a window, + * OpenGL context, and ImGui. Client code may use SimpleApplication + * instead. + */ + class GEOGRAM_GFX_API Application { + public: + + /** + * \brief Application constructor. + * \param[in] name the name of the application + */ + Application(const std::string& name); + + /** + * \brief Application destructor. + */ + virtual ~Application(); + + /** + * \brief Gets the instance. + * \return a pointer to the instance. + */ + static Application* instance() { + return instance_; + } + + + /** + * \brief Gets the name of this application. + * \return the name. + */ + const std::string& name() const { + return name_; + } + + + /** + * \brief Starts the main event loop of the application. + * \param[in] argc , argv optional command line parameters. If specified + * then they are used to initialize geogram, else geogram is supposed + * to be already initialized by caller. + */ + virtual void start(int argc=0, char** argv=nullptr); + + /** + * \brief Stops the application. + */ + virtual void stop(); + + /** + * \brief Gets the style. + * \return a string with the current style; + */ + const std::string& get_style() const { + return style_; + } + + /** + * \brief Sets the style of the application. + * \param[in] value one of Dark, Light, DarkGray, LightGray + * \see get_styles() + */ + virtual void set_style(const std::string& value); + + /** + * \brief Gets the possible styles. + * \return A semi-colon separated list of the possible + * styles. + */ + static std::string get_styles(); + + /** + * \brief Sets the font size. + * \param[in] value the font size. + */ + void set_font_size(index_t value); + + /** + * \brief Gets the font size. + * \return the font size. + */ + index_t get_font_size() const { + return font_size_; + } + + /** + * \brief Indicates that the main window should be redrawn. + */ + virtual void update(); + + /** + * \brief Draws a dockspace that fills the current + * window. + */ + void draw_dock_space(); + + /** + * \brief Lock updates. + * \details If this function is called, updates are ignored. + * It is useful when a RenderingContext operation is occuring, to + * prevent the Console for triggering a drawing operation. + */ + void lock_updates() { + ++nb_update_locks_; + } + + /** + * \brief Unlock updates. + */ + void unlock_updates() { + // Note: Under Windows, when the Graphite window is iconified, + // it can happen that nb_update_locks_ is already 0 when + // reaching this point. + if(nb_update_locks_ > 0) { + --nb_update_locks_; + } + } + + /** + * \brief Redraws the main window. + * \details This function is called by commands that animate + * objects during computation, by the progress bar and by + * console output. + */ + virtual void draw(); + + /** + * \brief Gets the global scaling to be applied to all GUI elements. + * \return 1.0 if the default font is used, more/less if a larger/ + * smaller font is used. + */ + double scaling() const; + + /** + * \brief Sets full-screen mode. + * \details All arguments to zero sets default mode. + * \param[in] w , h width and height in pixels + * \param[in] hz refresh rate in Hz + * \param[in] monitor the id of the monitor + */ + void set_full_screen_mode( + index_t w=0, index_t h=0, index_t hz=0, + index_t monitor=0 + ); + + /** + * \brief Sets windowed mode. + * \param[in] w , h width and height in pixels. If + * zero, use current dimensions. + */ + void set_windowed_mode(index_t w=0, index_t h=0); + + /** + * \brief Lists the video modes that can be used for + * set_full_screen_mode() + * \details The video modes are listed in the terminal. + */ + void list_video_modes(); + + /** + * \brief Iconifies this application. + */ + void iconify(); + + /** + * \brief Restores this application. + */ + void restore(); + + /** + * \brief Sets the gui state. + * \param[in] x a string that encodes + * the windows geometries and docking configuration + * obtained through get_gui_state() + */ + void set_gui_state(std::string x); + + /** + * \brief Gets the gui state. + * \return a string that encodes + * the windows geometries and docking configuration + */ + std::string get_gui_state() const; + + /** + * \brief Sets full-screen mode. + * \param[in] x true if full-screen mode should be used, + * false if windowed-mode should be used. + */ + void set_full_screen(bool x); + + /** + * \brief Tests whether this application is in full-screen mode. + * \retval true if full-screen mode is used. + * \retval false if windowed mode is used. + */ + bool get_full_screen() const; + + /** + * \brief Gets the width of the window. + * \return the width of the window in pixels. + */ + index_t get_width() const { + // I do not understand why I need to divide by pixel_ratio_ + // (experimentally it does the correct thing on HiDPI Macs) + return index_t(double(width_) / pixel_ratio_); + } + + /** + * \brief Gets the height of the window. + * \return the height of the window in pixels. + */ + index_t get_height() const { + // I do not understand why I need to divide by pixel_ratio_ + // (experimentally it does the correct thing on HiDPI Macs) + return index_t(double(height_) / pixel_ratio_); + } + + /** + * \brief Sets whether drag and drop events should be + * taken into account. + * \param[in] value true if drag and drop events should be taken into + * account, false otherwise + */ + void set_accept_drops(bool value) { + accept_drops_ = value; + } + + /** + * \brief Tests whether drag and drop events are taken into + * account. + * \retval true if drag and drop events are taken into account + * \retval false otherwise + */ + bool get_accept_drops() const { + return accept_drops_; + } + + /** + * \brief Sets the icon of the window. + * \param[in] image a pointer to the image to be used as the icon. + */ + void set_window_icon(Image* image); + + /** + * \brief Callback called whenenver a mouse button changed. + * \param[in] button the button + * \param[in] action the action (one of + * EVENT_ACTION_UP, EVENT_ACTION_DOWN, EVENT_ACTION_DRAG) + * \param[in] mods the current key modifiers (not implemented yet) + * \param[in] source the event source (one of EVENT_SOURCE_MOUSE, + * EVENT_SOURCE_FINGER, EVENT_SOURCE_STYLUS) + */ + virtual void mouse_button_callback( + int button, int action, int mods=0, int source=EVENT_SOURCE_MOUSE + ); + + /** + * \brief Callback called whenenver the mouse wheel is moved. + * \param[in] xoffset , yoffset wheel displacement + */ + virtual void scroll_callback(double xoffset, double yoffset); + + /** + * \brief Callback called whenever the mouse cursor is moved. + * \param[in] x , y the new position of the mouse cursor. + * \param[in] source the event source (one of EVENT_SOURCE_MOUSE, + * EVENT_SOURCE_FINGER, EVENT_SOURCE_STYLUS) + */ + virtual void cursor_pos_callback( + double x, double y, int source=EVENT_SOURCE_MOUSE + ); + + /** + * \brief Callback called whenever files are dropped in the window. + * \param[in] nb number of files. + * \param[in] f the array of file names. + */ + virtual void drop_callback(int nb, const char** f); + + /** + * \brief Callback called whenever a key is pushed (high level version) + * \param[in] c the ASCII code of the character that corresponds to the + * pushed key. + */ + virtual void char_callback(unsigned int c); + + /** + * \brief Callback called whenever a key is pushed (low level version) + * \param[in] key key code (window system specific) + * \param[in] scancode scan code (window system specific) + * \param[in] action push or release (window system specific) + * \param[in] mods current key modifieds (window system specific) + */ + virtual void key_callback(int key, int scancode, int action, int mods); + + /** + * \brief Restarts the gui. + * \details A flag is set and the gui is restarted at the next frame. + */ + void restart_gui() { + ImGui_restart_ = true; + } + + /** + * \brief Gets a pointer to the implementation-specific data. + * \details For internal use only. + * \return a pointer to the implementation-specific data. + */ + ApplicationData* impl_data() { + return data_; + } + + /** + * \brief Gets a pointer to the implementation-specific window. + * \details For internal use only. + * \return a pointer to the implementation-specific window. + */ + void* impl_window(); + + protected: + + /** + * \brief Converts a key to a symbolic string with the name of the key. + * \param[in] key the key. + * \return a string with the symbolic name of the key. + */ + const char* key_to_string(int key); + + /** + * \brief This function is called when the GUI should be redisplayed. + * \details This function is meant to be overloaded by subclasses. + * default implementation does nothing. + */ + virtual void draw_gui(); + + /** + * \brief This function is called when the 3d content should be + * redisplayed. + * \details This function is meant to be overloaded by subclasses. + * default implementation does nothing. + */ + virtual void draw_graphics(); + + /** + * \brief This function is called before starting drawing operations. + * \details Some implementations use it to initialize / restore graphic + * objects. + */ + virtual void pre_draw(); + + /** + * \brief This function is called after all drawing operations. + * \details It can be used to execute queued commands. + */ + virtual void post_draw(); + + /** + * \brief Tests whether the window needs to be redrawn. + * \retval true if the window needs to be redrawn. + * \retval false if the window is up to date. + */ + virtual bool needs_to_redraw() const; + + /** + * \brief Creates the window using GLFW. + */ + virtual void create_window(); + + /** + * \brief Deletes the window created by GLFW. + */ + virtual void delete_window(); + + /** + * \brief Called whenever window size changes + * \param[in] w , h the new width and height in pixels. + * \details Called whenenver the size of the window does not + * match the current size. + */ + virtual void resize(index_t w, index_t h); + + /** + * \brief Draws one frame. + * \details This triggers a GUI and/or a scene update as needed. + */ + virtual void one_frame(); + + /** + * \brief Enters the main application loop. + * \details create_window() needs to be called before. + * This initializes OpenGL and ImGui before the first frame is + * displayed. + */ + virtual void main_loop(); + + /** + * \brief Initializes OpenGL and GLUP objects. + */ + virtual void GL_initialize(); + + /** + * \brief Deallocates OpenGL and GLUP objects. + */ + virtual void GL_terminate(); + + /** + * \brief Initializes the ImGui library. + */ + virtual void ImGui_initialize(); + + /** + * \brief Loads the fonts in ImGui. + */ + virtual void ImGui_load_fonts(); + + /** + * \brief Deallocates objects used by the ImGui library. + */ + virtual void ImGui_terminate(); + + /** + * \brief Notifies ImGui that a new frame has just started. + */ + virtual void ImGui_new_frame(); + + /* + * \param[in] argc , argv command line parameters, used + * to initialize geogram. + */ + virtual void geogram_initialize(int argc, char** argv); + + /** + * \brief Initializes the callbacks if not already initialized. + */ + void callbacks_initialize(); + + /** + * \brief Gets all the filenames specified on the command line. + * \return a const reference to a vector of strings with the filenames. + */ + const std::vector& filenames() const { + return filenames_; + } + + bool animate() const { + return animate_; + } + + bool* animate_ptr() { + return &animate_; + } + + void start_animation() { + animate_ = true; + } + + void stop_animation() { + animate_ = false; + } + + private: + static Application* instance_; /**< a pointer to the instance */ + ApplicationData* data_; /**< implementation dependent */ + index_t width_; /**< window width */ + index_t height_; /**< window height */ + bool in_main_loop_; /**< main loop is running */ + bool accept_drops_; /**< application accepts dropping files */ + double scaling_; /**< global scaling applied to all sizes */ + index_t nb_update_locks_; /**< lock graphic updates */ + std::string style_; /**< ImGui style (Dark, Light, ...) */ + bool ImGui_restart_; /**< true if ImGui needs to be restarted */ + bool ImGui_reload_font_; /**< true if font size has changed */ + bool ImGui_initialized_; /**< true if ImGui was initialized */ + index_t font_size_; /**< current font size */ + index_t nb_frames_update_; /**< if 0, take a small sleep */ + double hidpi_scaling_; /**< for retina displays */ + double pixel_ratio_; /**< for retina displays */ + std::string name_; /**< application name */ + bool currently_drawing_gui_; /**< currently drawing ImGui elements */ + std::vector filenames_; /**< from the command line */ + bool animate_; /**< true if drawing always */ + protected: + bool menubar_visible_; + }; + +} + +#endif + diff --git a/src/lib/geogram_gfx/glup_viewer/arc_ball_impl.cpp b/src/lib/geogram_gfx/gui/arc_ball.cpp old mode 100755 new mode 100644 similarity index 89% rename from src/lib/geogram_gfx/glup_viewer/arc_ball_impl.cpp rename to src/lib/geogram_gfx/gui/arc_ball.cpp index 118c1e93..1e88c04f --- a/src/lib/geogram_gfx/glup_viewer/arc_ball_impl.cpp +++ b/src/lib/geogram_gfx/gui/arc_ball.cpp @@ -43,14 +43,14 @@ * */ -#include +#include #include namespace GEO { /******************************************************************/ - ArcBallImpl::ArcBallImpl() : + ArcBall::ArcBall() : center_(0.0,0.0), radius_(1.0), last_point_(0.0,0.0) @@ -60,7 +60,7 @@ namespace GEO { grabbed_ = false ; } - vec3 ArcBallImpl::constrain_vector( + vec3 ArcBall::constrain_vector( const vec3& vector, const vec3& axis ) const { @@ -68,7 +68,7 @@ namespace GEO { return result ; } - vec3 ArcBallImpl::mouse_to_sphere( + vec3 ArcBall::mouse_to_sphere( const vec2& p_in ) { @@ -98,18 +98,16 @@ namespace GEO { } - void ArcBallImpl::grab(const vec2& value) { + void ArcBall::grab(const vec2& value) { last_point_ = value ; grabbed_ = true ; } - void ArcBallImpl::release(const vec2&) { - // value_changed(matrix_) ; + void ArcBall::release(const vec2&) { grabbed_ = false ; } - void ArcBallImpl::drag(const vec2& value) { - + void ArcBall::drag(const vec2& value) { if(!grabbed_) { return ; } @@ -124,17 +122,19 @@ namespace GEO { mat4 update_matrix = update_quaternion.to_matrix() ; matrix_ = matrix_ * update_matrix ; - - // value_changed(matrix_) ; - last_point_ = new_point ; } - void ArcBallImpl::set_value(const mat4& m) { + void ArcBall::set_value(const mat4& m) { matrix_ = m ; - // value_changed(matrix_) ; } + void ArcBall::reset() { + matrix_.load_identity(); + grabbed_ = false; + last_point_ = vec2(0.0, 0.0); + } + /*****************************************************/ } diff --git a/src/lib/geogram_gfx/glup_viewer/arc_ball_impl.h b/src/lib/geogram_gfx/gui/arc_ball.h old mode 100755 new mode 100644 similarity index 95% rename from src/lib/geogram_gfx/glup_viewer/arc_ball_impl.h rename to src/lib/geogram_gfx/gui/arc_ball.h index b4dd07ca..1efa6ea1 --- a/src/lib/geogram_gfx/glup_viewer/arc_ball_impl.h +++ b/src/lib/geogram_gfx/gui/arc_ball.h @@ -43,14 +43,14 @@ * */ -#ifndef H_GEOGRAM_GFX_GLUP_VIEWER_ARCBALL_IMPL_H -#define H_GEOGRAM_GFX_GLUP_VIEWER_ARCBALL_IMPL_H +#ifndef H_GEOGRAM_GFX_GLUP_VIEWER_ARCBALL_H +#define H_GEOGRAM_GFX_GLUP_VIEWER_ARCBALL_H #include #include /** - * \file geogram_gfx/glup_viewer/arc_ball_impl.h + * \file geogram_gfx/gui/arc_ball.h * \brief Controls a 3d rotation from user mouse input. */ @@ -69,12 +69,12 @@ namespace GEO { * mouse up), and creates the appropriate quaternions and 4x4 matrices * to represent the rotation given by the mouse. */ - class GEOGRAM_GFX_API ArcBallImpl { + class GEOGRAM_GFX_API ArcBall { public: /** - * \brief ArcBallImpl constructor. + * \brief ArcBall constructor. */ - ArcBallImpl(); + ArcBall(); /** * \brief Gets the value of the rotation. @@ -149,6 +149,11 @@ namespace GEO { */ void release(const vec2& value); + /** + * \brief Resets this ArcBall to the default value. + */ + void reset(); + protected: /** * \brief Discards the component of a vector that is diff --git a/src/lib/geogram_gfx/glup_viewer/colormaps/README.txt b/src/lib/geogram_gfx/gui/colormaps/README.txt similarity index 100% rename from src/lib/geogram_gfx/glup_viewer/colormaps/README.txt rename to src/lib/geogram_gfx/gui/colormaps/README.txt diff --git a/src/lib/geogram_gfx/glup_viewer/colormaps/black_white.xpm b/src/lib/geogram_gfx/gui/colormaps/black_white.xpm similarity index 100% rename from src/lib/geogram_gfx/glup_viewer/colormaps/black_white.xpm rename to src/lib/geogram_gfx/gui/colormaps/black_white.xpm diff --git a/src/lib/geogram_gfx/glup_viewer/colormaps/blue_red.xpm b/src/lib/geogram_gfx/gui/colormaps/blue_red.xpm similarity index 100% rename from src/lib/geogram_gfx/glup_viewer/colormaps/blue_red.xpm rename to src/lib/geogram_gfx/gui/colormaps/blue_red.xpm diff --git a/src/lib/geogram_gfx/glup_viewer/colormaps/cei_60757.xpm b/src/lib/geogram_gfx/gui/colormaps/cei_60757.xpm similarity index 100% rename from src/lib/geogram_gfx/glup_viewer/colormaps/cei_60757.xpm rename to src/lib/geogram_gfx/gui/colormaps/cei_60757.xpm diff --git a/src/lib/geogram_gfx/glup_viewer/colormaps/french.xpm b/src/lib/geogram_gfx/gui/colormaps/french.xpm similarity index 100% rename from src/lib/geogram_gfx/glup_viewer/colormaps/french.xpm rename to src/lib/geogram_gfx/gui/colormaps/french.xpm diff --git a/src/lib/geogram_gfx/glup_viewer/colormaps/inferno.xpm b/src/lib/geogram_gfx/gui/colormaps/inferno.xpm similarity index 100% rename from src/lib/geogram_gfx/glup_viewer/colormaps/inferno.xpm rename to src/lib/geogram_gfx/gui/colormaps/inferno.xpm diff --git a/src/lib/geogram_gfx/glup_viewer/colormaps/magma.xpm b/src/lib/geogram_gfx/gui/colormaps/magma.xpm similarity index 100% rename from src/lib/geogram_gfx/glup_viewer/colormaps/magma.xpm rename to src/lib/geogram_gfx/gui/colormaps/magma.xpm diff --git a/src/lib/geogram_gfx/glup_viewer/colormaps/parula.xpm b/src/lib/geogram_gfx/gui/colormaps/parula.xpm similarity index 100% rename from src/lib/geogram_gfx/glup_viewer/colormaps/parula.xpm rename to src/lib/geogram_gfx/gui/colormaps/parula.xpm diff --git a/src/lib/geogram_gfx/glup_viewer/colormaps/plasma.xpm b/src/lib/geogram_gfx/gui/colormaps/plasma.xpm similarity index 100% rename from src/lib/geogram_gfx/glup_viewer/colormaps/plasma.xpm rename to src/lib/geogram_gfx/gui/colormaps/plasma.xpm diff --git a/src/lib/geogram_gfx/glup_viewer/colormaps/rainbow.xpm b/src/lib/geogram_gfx/gui/colormaps/rainbow.xpm similarity index 100% rename from src/lib/geogram_gfx/glup_viewer/colormaps/rainbow.xpm rename to src/lib/geogram_gfx/gui/colormaps/rainbow.xpm diff --git a/src/lib/geogram_gfx/glup_viewer/colormaps/viridis.xpm b/src/lib/geogram_gfx/gui/colormaps/viridis.xpm similarity index 100% rename from src/lib/geogram_gfx/glup_viewer/colormaps/viridis.xpm rename to src/lib/geogram_gfx/gui/colormaps/viridis.xpm diff --git a/src/lib/geogram_gfx/gui/command.cpp b/src/lib/geogram_gfx/gui/command.cpp new file mode 100644 index 00000000..b3bddc0f --- /dev/null +++ b/src/lib/geogram_gfx/gui/command.cpp @@ -0,0 +1,551 @@ +/* + * Copyright (c) 2012-2016, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#include +#include +#include +#include + +namespace { + /** + * \brief Removes the underscores from a string and + * replaces them with spaces. + * \details Utility for the prototype parser used by + * Command. + * \param[in] s a const reference to the input string + * \return a copy of \p s with underscores replaced with + * spaces + */ + std::string remove_underscores(const std::string& s) { + std::string result = s; + for(GEO::index_t i=0; i0; --j) { + if(line[j-1] != ' ') { + break; + } + } + if(j>i) { + line = line.substr(i, j-i); + } else { + line = ""; + } + } +} + +namespace GEO { + + /*****************************************************************/ + + CommandInvoker::CommandInvoker() { + } + + CommandInvoker::~CommandInvoker() { + } + + /*****************************************************************/ + + void Command::flush_queue() { + if(queued_ != nullptr) { + // Steal the queued command to avoid + // infinite recursion. + SmartPointer queued = queued_; + queued_ = nullptr; + queued->apply(); + } + } + + Command::~Command() { + } + + Command::Command(const std::string& prototype_in) : visible_(false) { + + // If there is no brace, then protype only has function + // name, and then the invoker will construct the arguments + // with names arg1, arg2 ... + auto_create_args_ = + (prototype_in.find('(') == std::string::npos); + + if(auto_create_args_) { + name_ = prototype_in; + if(name_ == "") { + name_ = "command"; + } + help_ = "Hay You Programmer ! No prototype was specified, \n" + "see Command::make_current() documentation\n" + "in geogram_gfx/glup_viewer/command.h\n" + "to specify parameter names (and tooltips)"; + return; + } + + // Parsing the prototype... + + std::string prototype = prototype_in; + + // Transform carriage returns into spaces + { + for(index_t i=0; i name_parts; + String::split_string(name_, ' ', name_parts); + name_ = name_parts[name_parts.size()-1]; + } + + // Find help if any + { + size_t bq1 = prototype.find('[',p2); + size_t bq2 = prototype.find(']',p2); + if(bq1 != std::string::npos && bq2 != std::string::npos) { + help_ = prototype.substr(bq1+1, bq2-bq1-1); + } + } + + std::string args_string = prototype.substr(p1+1,p2-p1-1); + std::vector args; + String::split_string(args_string, ',', args); + + for(index_t i=0; i arg_words; + String::split_string(arg, ' ', arg_words); + + // Argument name is the last word + const std::string& arg_name = arg_words[arg_words.size()-1]; + int type = -1; + if(arg_words.size() > 1) { + bool is_unsigned = false; + for(index_t w=0; winvoke(); + } + } + + int Command::int_arg_by_index(index_t i) const { + const Arg& arg = find_arg_by_index(i); + geo_assert( + arg.type == Arg::ARG_INT || + arg.type == Arg::ARG_UINT + ); + int result = arg.val.int_val; + if( + arg.type == Arg::ARG_UINT && + result < 0 + ) { + Logger::warn("Cmd") + << "Argument " << arg.name + << "Of type UNIT had a negative value" + << std::endl; + result = 0; + } + return result; + } + + unsigned int Command::uint_arg_by_index(index_t i) const { + const Arg& arg = find_arg_by_index(i); + geo_assert( + arg.type == Arg::ARG_INT || + arg.type == Arg::ARG_UINT + ); + int result = arg.val.int_val; + if(result < 0) { + Logger::warn("Cmd") + << "Argument " << arg.name + << "queried as uint had a negative value" + << std::endl; + result = 0; + } + return (unsigned int)(result); + } + + void Command::draw() { + ImGui::Text("%s",name().c_str()); + if(ImGui::Button( + icon_UTF8("cog").c_str() + )) { + reset_factory_settings(); + } + ImGui::Tooltip("reset factory settings"); + ImGui::SameLine(); + if(ImGui::Button(icon_UTF8("window-close").c_str())) { + visible_ = false; + } + ImGui::Tooltip("close command"); + ImGui::SameLine(); + if(ImGui::Button(icon_UTF8("check").c_str(), ImVec2(-1.0, 0.0))) { + queued_ = this; + } + if(help_ == "") { + ImGui::Tooltip("apply command"); + } else { + ImGui::Tooltip(help_); + } + ImGui::Separator(); + for(index_t i=0; i Command::current_; + SmartPointer Command::queued_; +} + diff --git a/src/lib/geogram_gfx/glup_viewer/glup_viewer_gui.h b/src/lib/geogram_gfx/gui/command.h similarity index 66% rename from src/lib/geogram_gfx/glup_viewer/glup_viewer_gui.h rename to src/lib/geogram_gfx/gui/command.h index 93521abd..607e6c32 100644 --- a/src/lib/geogram_gfx/glup_viewer/glup_viewer_gui.h +++ b/src/lib/geogram_gfx/gui/command.h @@ -43,235 +43,21 @@ * */ -#ifndef GEOGRAM_GFX_GLUP_VIEWER_GLUP_VIEWER_GUI -#define GEOGRAM_GFX_GLUP_VIEWER_GLUP_VIEWER_GUI +#ifndef GEOGRAM_GFX_GUI_COMMAND +#define GEOGRAM_GFX_GUI_COMMAND #include -#include - -#include - -#include -#include #include -#include #include -#include -#include - -#include - -struct lua_State; - /** - * \file geogram_gfx/glup_viewer/glup_viewer_gui.h - * \brief Utilities and C++ classes for easily creating - * applications with glup_viewer and ImGui. + * \file geogram_gfx/gui/command.h + * \brief A simple system to interface C++ functions + * with a ImGui interface. Used mainly by geobox. */ namespace GEO { - /*****************************************************************/ - - /** - * \brief Implementation of the GLUP viewer's status bar, that - * displays the progress bar. - */ - class GEOGRAM_GFX_API StatusBar : public GEO::ProgressClient { - public: - - /** - * \brief StatusBar constructor. - */ - StatusBar(); - - /** - * \copydoc GEO::ProgressClient::begin() - */ - virtual void begin(); - - /** - * \copydoc GEO::ProgressClient::progress() - */ - virtual void progress(GEO::index_t step, GEO::index_t percent); - - /** - * \copydoc GEO::ProgressClient::end() - */ - virtual void end(bool canceled); - - /** - * \brief Draws the status bar and handles the GUI. - */ - void draw(); - - /** - * \brief Tests whether this status bar should be displayed. - * \details The status bar is displayed whenever there is an - * active progress bar. - */ - bool active() const { - return (nb_active_ > 0); - } - - /** - * \brief Redraws the GUI. - */ - virtual void update(); - - private: - bool progress_; - index_t step_; - index_t percent_; - bool canceled_; - index_t nb_active_; - }; - - /*****************************************************************/ - - /** - * \brief Implementation of the GLUP viewer's console, where - * Logger message are displayed. - * \details Inspired from ImGui AppLog example. - */ - class GEOGRAM_GFX_API Console : public GEO::LoggerClient { - - public: - - /** - * \brief Console constructor. - * \param[in] visible_flag an optional pointer to application's - * variable that controls the visibility of this Console. - */ - Console(bool* visible_flag = nullptr); - - /** - * \copydoc GEO::LoggerClient::div() - */ - virtual void div(const std::string& value); - - /** - * \copydoc GEO::LoggerClient::out() - */ - virtual void out(const std::string& value); - - /** - * \copydoc GEO::LoggerClient::warn() - */ - virtual void warn(const std::string& value); - - /** - * \copydoc GEO::LoggerClient::err() - */ - virtual void err(const std::string& value); - - /** - * \copydoc GEO::LoggerClient::status() - */ - virtual void status(const std::string& value); - - /** - * \brief Clears the contents of the console. - */ - void clear(); - - /** - * \brief Displays a formatted string to the console. - */ - virtual void printf(const char* fmt, ...) /* IM_FMTARGS(1) */; - - /** - * \brief Draws the console and handles the gui. - * \param[in] visible an optional pointer to a visibility - * flag, controlled by a close button if different from nullptr. - * \param[in] with_window if true, then creates a new window - * using imgui::Begin() / imgui::End(), else caller is responsible - * for doing that. - */ - virtual void draw(bool* visible=nullptr, bool with_window=true); - - int TextEditCallback(ImGuiTextEditCallbackData* data); - - void show() { - *visible_flag_ = true; - } - - void hide() { - *visible_flag_ = false; - } - - typedef void (*CompletionCallback)( - Console* console, - const std::string& line, index_t startw, index_t endw, - const std::string& cmpword, std::vector& matches - ); - - void set_completion_callback(CompletionCallback CB) { - completion_callback_ = CB; - } - - typedef void (*HistoryCallback)( - Console* console, - index_t index, - std::string& command - ); - - void set_history_callback(HistoryCallback CB) { - history_callback_ = CB; - } - - void set_history_size(index_t n) { - if(n != max_history_index_) { - history_index_ = n; - } - max_history_index_ = n; - } - - void set_fixed_layout(bool x) { - fixed_layout_ = x; - } - - void set_console_font(ImFont* font) { - console_font_ = font; - } - - protected: - /** - * \brief This function is called whenever an error is - * displayed using err() - * \details Base implementation does nothing. This function - * is meant to be overloaded in derived classes. - * \param[in] err the error message sent to err() - */ - virtual void notify_error(const std::string& err); - - virtual bool exec_command(const char* command); - - /** - * \brief Redraws the GUI. - */ - virtual void update(); - - ImGuiTextBuffer buf_; - ImGuiTextFilter filter_; - /** \brief Index to lines offset */ - ImVector line_offsets_; - bool scroll_to_bottom_; - bool* visible_flag_; - char input_buf_[geo_imgui_string_length]; - CompletionCallback completion_callback_; - HistoryCallback history_callback_; - index_t history_index_; - index_t max_history_index_; - bool fixed_layout_; - ImFont* console_font_; - }; - - /*****************************************************************/ - - class Application; - /** * \brief Abstract class for calling functions or * calling member functions. @@ -1633,676 +1419,9 @@ namespace GEO { new MemberFunctionCommandInvoker(current(), target, tfun) ); } - - /*****************************************************************/ - /** - * \brief A simple text editor - */ - class GEOGRAM_GFX_API TextEditor { - public: - TextEditor(bool* visible); - void draw(); - std::string text() const; - void load(const std::string& filename); - void save(const std::string& filename); - void clear(); - void load_data(const char* data); - - private: - ::TextEditor impl_; - bool* visible_; - }; - /*****************************************************************/ - - /** - * \brief Base class for glup_viewer applications with a gui. - */ - class GEOGRAM_GFX_API Application { - public: - /** - * \brief Application constructor. - * \param[in] argc , argv command line arguments copied from main() - * \param[in] usage the usage string - * \param[in] lua_state an optional pointer to a LUA state or nullptr. If - * nullptr, then a LUA state is created. - * \see CmdLine::parse() - */ - Application( - int argc, char** argv, const std::string& usage, - lua_State* lua_state = nullptr - ); - - /** - * \brief Application destructor. - */ - virtual ~Application(); - - /** - * \brief Starts the application. - */ - void start(); - - - /** - * \brief Stops the application. - */ - void quit(); - - /** - * \brief Gets the instance. - * \return A pointer to the instance. - */ - static Application* instance() { - return instance_; - } - - /** - * \brief Saves the current content to a file. - * \details Baseclass implementation does nothing. Derived classes - * may overload this function. - * \retval true if the file could be sucessfully saved. - * \retval false otherwise - */ - virtual bool save(const std::string& filename); - - /** - * \brief Loads a file. - * \details Baseclass implementation does nothing. Derived classes - * may overload this function. - * \retval true if the file could be sucessfully loaded - * \retval false otherwise - */ - virtual bool load(const std::string& filename); - - /** - * \brief Tests whether a file can be loaded. - * \details This function can be used to filter the files displayed - * in the "Load..." menu. Baseclass implementation always return true. - * Derived classes may overload it and return false for files with - * unknown extensions. - */ - virtual bool can_load(const std::string& filename); - - /** - * \brief Gets the list of supported file extensions for reading. - * \details This function may be olverloaded by derived class. Base - * class implementation returns "". If this function returns "", then - * no "Load..." option is displayed in the "File" menu. - * \return The semi-colon separated list of supported file extensions, - * or "*" if all file extensions are supported. - */ - virtual std::string supported_read_file_extensions(); - - /** - * \brief Gets the list of supported file extensions for writing. - * \details This function may be olverloaded by derived class. Base - * class implementation returns "". If this function returns "", then - * no "Save..." option is displayed in the "File" menu. - * If it returns a colon-separated list of extensions, then the - * "Save..." option displays a list of possible file names for each - * supported extension. - * \return The semi-colon separated list of supported file extensions, - * or "*" if all file extensions are supported. - */ - virtual std::string supported_write_file_extensions(); - - /** - * \brief Gets the scaling applied to all dimensions. - * \details This function is used by retina displays to ensure that - * GUI elements remain visible. - * \return The scaling used for fonts and all sizes. - */ - float scaling() const { - return scaling_; - } - - /** - * \brief Sets the scaling applied to all dimensions. - * \details This function is used by retina displays to ensure that - * GUI elements remain visible. - * \param x The scaling used for fonts and all sizes. - */ - void set_scaling(float x) { - scaling_ = x; - } - - - bool console_visible() const { - return console_visible_; - } - - void set_console_visible(bool x) { - console_visible_ = x; - } - - virtual bool exec_command(const char* command); - - Console* console() { - return console_; - } - - bool retina_mode() const { - return retina_mode_; - } - - void set_retina_mode(bool x) { - retina_mode_ = x; - scaling_ = retina_mode_ ? 2.0f : 1.0f; - } - - virtual bool on_key_pressed(const char* key); - virtual bool on_key_released(const char* key); - - void set_lighting(bool x) { - lighting_ = x; - } - - - void set_background_color_1(float r, float g, float b) { - background_color_1_.x = r; - background_color_1_.y = g; - background_color_1_.z = b; - background_color_1_.w = 1.0; - } - - void set_background_color_2(float r, float g, float b) { - background_color_2_.x = r; - background_color_2_.y = g; - background_color_2_.z = b; - background_color_1_.w = 1.0; - } - - void set_background_color_1(const vec4f& value) { - background_color_1_ = value; - } - - void set_background_color_2(const vec4f& value) { - background_color_2_ = value; - } - - const vec4f& get_background_color_1() const { - return background_color_1_; - } - - const vec4f& get_background_color_2() const { - return background_color_2_; - } - - protected: - - /** - * \brief Converts an OpenGL texture ID into an ImGUI texture ID. - * \param[in] gl_texture_id_in the OpenGL texture ID - * \return the corresponding ImGUI texture ID - */ - ImTextureID convert_to_ImTextureID(GLuint gl_texture_id_in); - - /** - * \brief Recursively browses a directory and generates - * menu items. - * \param[in] path the path to be browsed - * \param[in] subdirs if true, browse subdirectories as well - */ - void browse(const std::string& path, bool subdirs=false); - - /** - * \brief Initializes graphic objects. - * \details This function is called once the OpenGL context is - * ready for rendering. Derived classes may overload it to - * initialize additional graphic objects. - */ - virtual void init_graphics(); - - /** - * \brief Calls Application's instance init_graphics(). - * \details Used as a callback for glup_viewer / GLFW. - */ - static void init_graphics_callback(); - - /** - * \brief Draws the scene. - * \details Derived classes need to overload this function. - */ - virtual void draw_scene(); - - /** - * \brief Calls Application's instance draw_scene(). - * \details Used as a callback for glup_viewer / GLFW. - */ - static void draw_scene_callback(); - - /** - * \brief Draws the graphic user interface using ImGUI. - * \details Derived classes may overload this function, and/or - * the functions that draw individual GUI elements. - */ - virtual void draw_gui(); - - /** - * \brief Draws the menu bar. - */ - virtual void draw_menu_bar(); - - /** - * \brief Draws the load menu and browser. - */ - virtual void draw_load_menu(); - - /** - * \brief Draws the save menu. - */ - virtual void draw_save_menu(); - - /** - * \brief Draws other file operation menu. - * \details Default implementation does nothing. - * It can be overloaded to add other menu - * items in the file menu. - */ - virtual void draw_fileops_menu(); - - /** - * \brief Draws the about box in the file menu. - */ - virtual void draw_about(); - - /** - * \brief Draws the windows menu. - */ - virtual void draw_windows_menu(); - - /** - * \brief Draws the application menus. - * \details Meant to be overloaded by derived classes. - */ - virtual void draw_application_menus(); - - /** - * \brief Draws the left pane. - * \details The left pane has the viewer properties and the command. - */ - virtual void draw_left_pane(); - - /** - * \brief Draws the viewer properties window frame and contents. - */ - virtual void draw_viewer_properties_window(); - - /** - * \brief Draws the contents of viewer properties window. - */ - virtual void draw_viewer_properties(); - - /** - * \brief Draw the object properties window frame and contents. - */ - virtual void draw_object_properties_window(); - - /** - * \brief Draws the contents of the object properties window. - */ - virtual void draw_object_properties(); - - /** - * \brief Draws the active command if any. - */ - virtual void draw_command(); - - /** - * \brief Draws the right pane. - * \details The right pane has the object properties. This function - * is meant to be overloaded by client code. - */ - virtual void draw_right_pane(); - - /** - * \brief Draws the console. - */ - virtual void draw_console(); - - /** - * \brief Draws the status bar. - */ - virtual void draw_status_bar(); - - /** - * \brief Calls Application's instance draw_gui() - * \details Used as a callback for glup_viewer / GLFW. - */ - static void draw_gui_callback(); - - /** - * \brief Calls Application's instance load() - * \details Used as a callback for glup_viewer / GLFW. - */ - static void dropped_file_callback(char* filename); - - /** - * \brief Makes the console visible. - */ - void show_console() { - console_visible_ = true; - } - - /** - * \brief Makes the console invisible. - */ - void hide_console() { - console_visible_ = false; - } - - /** - * \brief Initializes a new colormap from name and xpm data. - * \details This function can be called only once the OpenGL - * context is ready, for instance in the init_graphics() function. - * \param[in] name the name of the colormap - * \param[in] xpm_data the image data of the colormap. - */ - void init_colormap(const std::string& name, const char** xpm_data); - - /** - * \brief Initializes all the default colormaps. - * \details This function can be called only once the OpenGL - * context is ready, for instance in the init_graphics() function. - */ - void init_colormaps(); - - protected: - static Application* instance_; - - int argc_; - char** argv_; - - std::string usage_; - std::string name_; - std::string path_; - - bool left_pane_visible_; - bool right_pane_visible_; - bool console_visible_; - - virtual int MENU_HEIGHT() const; - virtual int PANE_WIDTH() const; - virtual int CONSOLE_HEIGHT() const; - virtual int STATUS_HEIGHT() const; - - SmartPointer console_; - SmartPointer status_bar_; - - bool lighting_; - GLenum effect_; - - GLUPclipMode clip_mode_; - GLuint geogram_logo_texture_; - - struct ColormapInfo { - ColormapInfo() : texture(0) { - } - GLuint texture; - std::string name; - }; - - vector colormaps_; - - FileDialog load_dialog_; - FileDialog save_dialog_; - std::string current_file_; - - bool text_editor_visible_; - TextEditor text_editor_; - - bool fixed_layout_; - float scaling_; - bool retina_mode_; - - vec4f background_color_1_; - vec4f background_color_2_; - -#ifdef GEOGRAM_WITH_LUA - lua_State* lua_state_; -#else - void* lua_state_; -#endif - bool lua_error_occured_; - bool owns_lua_state_; - }; - - /*****************************************************************/ - - /** - * \brief An Application that manipulates a single Mesh. - */ - class GEOGRAM_GFX_API SimpleMeshApplication : public Application { - public: - /** - * \brief Application constructor. - * \param[in] argc , argv command line arguments copied from main() - * \param[in] usage the usage string - * \see CmdLine::parse() - */ - SimpleMeshApplication(int argc, char** argv, const std::string& usage); - - /** - * \copydoc Application::supported_read_file_extensions() - */ - virtual std::string supported_read_file_extensions(); - - /** - * \copydoc Application::supported_write_file_extensions() - */ - virtual std::string supported_write_file_extensions(); - - /** - * \copydoc Application::draw_object_properties() - */ - virtual void draw_object_properties(); - - /** - * \copydoc Application::draw_scene() - */ - virtual void draw_scene(); - - /** - * \copydoc Application::init_graphics() - */ - virtual void init_graphics(); - - /** - * \copydoc Application::load() - */ - virtual bool load(const std::string& filename); - - /** - * \copydoc Application::save() - */ - virtual bool save(const std::string& filename); - - /** - * \brief Gets the instance. - * \return a pointer to the current SimpleMeshApplication. - */ - static SimpleMeshApplication* instance() { - SimpleMeshApplication* result = - dynamic_cast(Application::instance()); - geo_assert(result != nullptr); - return result; - } - - protected: - - /** - * \brief Gets the bounding box of a mesh animation. - * \details In animated mode, the mesh animation is stored as - * a mesh with 6d coordinates, that correspond to the geometric - * location at the vertices at time 0 and at time 1. - * \param[in] M_in the mesh - * \param[out] xyzmin a pointer to the three minimum coordinates - * \param[out] xyzmax a pointer to the three maximum coordinates - * \param[in] animate true if displaying a mesh animation - */ - void get_bbox( - const Mesh& M_in, double* xyzmin, double* xyzmax, bool animate - ); - - /** - * \brief increments the animation time in the current instance. - * \details Callback bound to the 't' key - */ - static void increment_anim_time_callback(); - - /** - * \brief derements the animation time in the current instance. - * \details Callback bound to the 'r' key - */ - static void decrement_anim_time_callback(); - - /** - * \brief increments the cells shrinkage. - * \details Callback bound to the 'w' key - */ - static void increment_cells_shrink_callback(); - - /** - * \brief decrements the cells shrinkage. - * \details Callback bound to the 'x' key - */ - static void decrement_cells_shrink_callback(); - - protected: - /** - * \brief Gets the mesh. - * \return a pointer to the Mesh. - */ - Mesh* mesh() { - return &mesh_; - } - - /** - * \brief Gets the mesh graphics. - * \return a pointer to the MeshGfx. - */ - MeshGfx* mesh_gfx() { - return &mesh_gfx_; - } - - /** - * \brief Makes the vertices visible. - */ - void show_vertices() { - show_vertices_ = true; - } - - /** - * \brief Makes the vertices invisible. - */ - void hide_vertices() { - show_vertices_ = false; - } - - /** - * \brief Makes the surface facets visible. - */ - void show_surface() { - show_surface_ = true; - } - - /** - * \brief Makes the surface facets invisible. - */ - void hide_surface() { - show_surface_ = false; - } - - /** - * \brief Makes the volume cells visible. - */ - void show_volume() { - show_volume_ = true; - } - - /** - * \brief Makes the volume cells invisible. - */ - void hide_volume() { - show_volume_ = false; - } - - /** - * \brief Makes the attributes visible. - */ - void show_attributes() { - show_attributes_ = true; - } - - /** - * \brief Makes the attributes invisible. - */ - void hide_attributes() { - show_attributes_ = false; - } - - /** - * \brief Adjusts the current minimum and maximum attribute value - * to the currently bound attribute if any. - */ - void autorange(); - - /** - * \brief Gets the list of attribute names. - * \return the ';'-separated list of attribute names. - */ - std::string attribute_names(); - - /** - * \brief Sets the currently displayed attribute. - * \param[in] attribute the name of the attribute - * to be displayed, prefixed by element type. - */ - void set_attribute(const std::string& attribute); - - protected: - Mesh mesh_; - MeshGfx mesh_gfx_; - std::string file_extensions_; - - float anim_speed_; - float anim_time_; - - bool show_vertices_; - bool show_vertices_selection_; - float vertices_size_; - vec4f vertices_color_; - - bool show_surface_; - bool show_surface_sides_; - bool show_mesh_; - float mesh_width_; - vec4f mesh_color_; - - bool show_surface_borders_; - vec4f surface_color_; - vec4f surface_color_2_; - - bool show_volume_; - float cells_shrink_; - vec4f volume_color_; - bool show_colored_cells_; - bool show_hexes_; - bool show_connectors_; - - bool show_attributes_; - GLuint current_colormap_texture_; - std::string attribute_; - MeshElementsFlags attribute_subelements_; - std::string attribute_name_; - float attribute_min_; - float attribute_max_; - }; - - /*****************************************************************/ } #endif diff --git a/src/lib/geogram_gfx/gui/console.cpp b/src/lib/geogram_gfx/gui/console.cpp new file mode 100644 index 00000000..c31986ee --- /dev/null +++ b/src/lib/geogram_gfx/gui/console.cpp @@ -0,0 +1,393 @@ +/* + * Copyright (c) 2012-2016, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#include +#include +#include +#include + +namespace GEO { + + Console::Console(bool* visible_flag) : + command_prompt_(true), + visible_flag_(visible_flag), + completion_callback_(nullptr), + history_callback_(nullptr), + history_index_(0), + max_history_index_(0) + { + input_buf_[0] = '\0'; + scroll_to_bottom_ = 0; + } + + void Console::notify_error(const std::string& err) { + geo_argused(err); + return; + } + + void Console::div(const std::string& value) { + this->printf("========== %s", value.c_str()); + } + + void Console::out(const std::string& value) { + this->printf(" %s", value.c_str()); + } + + void Console::warn(const std::string& value) { + this->printf("[W] %s", value.c_str()); + if(visible_flag_ != nullptr) { + *visible_flag_ = true; + } + } + + void Console::err(const std::string& value) { + this->printf("[E] %s", value.c_str()); + if(visible_flag_ != nullptr) { + *visible_flag_ = true; + } + notify_error(value); + } + + void Console::status(const std::string& value) { + // Do not display error messages twice. + if(String::string_starts_with(value, "Error:")) { + return; + } + this->printf("[status] %s", value.c_str()); + } + + void Console::clear() { + buf_.clear(); + line_offsets_.clear(); + } + + void Console::printf(const char* fmt, ...) { + va_list args; + va_start(args, fmt); + int old_size = buf_.size(); + buf_.appendfv(fmt, args); + va_end(args); + for (int new_size = buf_.size(); old_size < new_size; old_size++) { + if (buf_[old_size] == '\n') { + line_offsets_.push_back(old_size); + } + } + // If I just use a boolean as in ImGuiDemo, then when printing to a + // hidden console then showing it again does not scroll to bottom + // (it seems that ImGui needs a couple of frames to 'figure out' + // what happened). + scroll_to_bottom_ = 10; + update(); + } + + void Console::update() { + if(Application::instance() != nullptr) { + Application::instance()->draw(); + } + } + + static int TextEditCallbackStub(ImGuiTextEditCallbackData* data) { + Console* console = (Console*)data->UserData; + return console->TextEditCallback(data); + } + + + int Console::TextEditCallback(ImGuiTextEditCallbackData* data) { + switch (data->EventFlag) { + case ImGuiInputTextFlags_CallbackCompletion: { + if(completion_callback_ != nullptr) { + static const char* + completer_word_break_characters = " .(){},+-*/="; + // Locate beginning of current word + const char* word_end = data->Buf + data->CursorPos; + const char* word_start = word_end; + while (word_start > data->Buf) + { + const char c = word_start[-1]; + if(strchr(completer_word_break_characters,c) != nullptr) { + break; + } + word_start--; + } + index_t startw = index_t(word_start - data->Buf); + index_t endw = index_t(word_end - data->Buf); + std::string cmpword(word_start, size_t(word_end - word_start)); + std::vector matches; + completion_callback_( + this, std::string(data->Buf), + startw, endw, cmpword, matches + ); + if(matches.size() == 0) { + this->printf("Completions: no match\n"); + } else if(matches.size() == 1) { + // Single match. Delete the beginning of the word and + // replace it entirely so we've got nice casing + data->DeleteChars( + (int)(word_start-data->Buf), + (int)(word_end-word_start) + ); + data->InsertChars(data->CursorPos, matches[0].c_str()); + } else { + // Several matches, find longest common prefix + std::string longest_prefix; + size_t cur_char = 0; + bool finished = false; + while(!finished) { + char c = '\0'; + for(size_t i=0; i= matches[i].length() || + (i != 0 && matches[i][cur_char] != c) + ) { + finished = true; + break; + } + c = matches[i][cur_char]; + } + if(!finished) { + longest_prefix.push_back(c); + } + ++cur_char; + } + // Replace edited text with longest prefix + if(longest_prefix.length() != 0) { + data->DeleteChars( + (int)(word_start-data->Buf), + (int)(word_end-word_start) + ); + data->InsertChars( + data->CursorPos, longest_prefix.c_str() + ); + } + this->printf("Completions:\n"); + for(size_t i=0; iprintf( + "[%d] ... %s\n", int(i), matches[i].c_str() + ); + } + } + } + } break; + case ImGuiInputTextFlags_CallbackHistory: { + if(history_callback_ != nullptr) { + std::string history_command; + // Call the callback first, to give it the opportunity to + // declare the history size. + history_callback_(this, history_index_, history_command); + if(max_history_index_ > 0) { + int h = int(history_index_); + if(data->EventKey == ImGuiKey_UpArrow) { + --h; + if(h < 0) { + h = int(max_history_index_); + } + } else if(data->EventKey == ImGuiKey_DownArrow) { + ++h; + if(h > int(max_history_index_)) { + h = 0; + } + } + { + history_index_ = index_t(h); + if(history_index_ == max_history_index_) { + history_command = ""; + } else { + history_callback_( + this, history_index_, history_command + ); + } + int newpos = std::min( + data->BufSize-1, int(history_command.length()) + ); + strncpy( + data->Buf, history_command.c_str(), size_t(newpos) + ); + data->Buf[newpos] = '\0'; + data->CursorPos = newpos; + data->SelectionStart = newpos; + data->SelectionEnd = newpos; + data->BufTextLen = newpos; + data->BufDirty = true; + } + } + } + } break; + } + return 0; + } + + bool Console::exec_command(const char* command) { + geo_argused(command); + // Note: history_index_ and max_history_index_ are + // not managed here. They are managed by the callback. + return false; + } + + void Console::draw(bool* visible, bool with_window) { + if(!*visible) { + return; + } + if(with_window) { + ImGui::Begin("Console", visible); + } +// Add a close button under Android +#ifdef GEO_OS_ANDROID + if (ImGui::Button(icon_UTF8("window-close").c_str())) { + *visible = false; + } + ImGui::SameLine(); +#endif + if (ImGui::Button("Clear")) { + clear(); + } + ImGui::SameLine(); + bool copy = ImGui::Button("Copy"); + ImGui::SameLine(); + filter_.Draw("Filter", -200.0f); + ImGui::Separator(); + +#ifdef GEO_OS_ANDROID + // Use smaller font if using phone in vertical mode. + if( + Application::instance() != nullptr && + Application::instance()->get_height() > + Application::instance()->get_width() + ) { + ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[3]); + } else { + ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]); + } +#else + ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]); +#endif + + float scaling = ImGui::GetIO().FontDefault->FontSize / 16.0f; + + ImGui::BeginChild( + "scrolling", + (command_prompt_?ImVec2(0.0f,-20.0f*scaling):ImVec2(0.0f, 0.0f)), + false, + ImGuiWindowFlags_HorizontalScrollbar + ); + + if (copy) { + ImGui::LogToClipboard(); + } + + { + const char* buf_begin = buf_.begin(); + const char* line = buf_begin; + for (int line_no = 0; line != nullptr; line_no++) { + const char* line_end = + (line_no < line_offsets_.Size) ? + buf_begin + line_offsets_[line_no] : nullptr; + + if (!filter_.IsActive() || + filter_.PassFilter(line, line_end) + ) { + bool is_error = ((line_end - line) >= 3 && + line[0] == '[' && + line[2] == ']' && + (line[1] == 'E' || line[1] == 'W') + ); + if(is_error) { + ImGui::PushStyleColor( + ImGuiCol_Text,ImVec4(1.0f,0.0f,0.0f,1.0f) + ); + } + ImGui::TextUnformatted(line, line_end); + if(is_error) { + ImGui::PopStyleColor(); + } + } + line = line_end && line_end[1] ? line_end + 1 : nullptr; + } + } + // If I just use a boolean as in ImGuiDemo, then when printing to a + // hidden console then showing it again does not scroll to bottom + // (it seems that ImGui needs a couple of frames to 'figure out' + // what happened). + if (scroll_to_bottom_ > 0) { + ImGui::SetScrollHereY(1.0); + --scroll_to_bottom_; + } + ImGui::EndChild(); + ImGui::PopFont(); + + if(command_prompt_) { + ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]); + ImGui::Text(">>>"); + ImGui::SameLine(); + ImGui::PushItemWidth(-20); + if(ImGui::InputText( + "##CommandInput", input_buf_, geo_imgui_string_length, + ImGuiInputTextFlags_EnterReturnsTrue | + ImGuiInputTextFlags_CallbackCompletion | + ImGuiInputTextFlags_CallbackHistory, + &TextEditCallbackStub, (void*)this) + ) { + char* input_end = input_buf_+strlen(input_buf_); + while (input_end > input_buf_ && input_end[-1] == ' ') { + input_end--; + } + *input_end = 0; + if (input_buf_[0]) { + exec_command(input_buf_); + } + strcpy(input_buf_, ""); + } + ImGui::PopItemWidth(); + // Keeping auto focus on the input box + if (ImGui::IsItemHovered()) { + ImGui::SetKeyboardFocusHere(-1); // Auto focus previous widget + } + ImGui::PopFont(); + } + + if(with_window) { + ImGui::End(); + } + } +} diff --git a/src/lib/geogram_gfx/gui/console.h b/src/lib/geogram_gfx/gui/console.h new file mode 100644 index 00000000..4f7817c8 --- /dev/null +++ b/src/lib/geogram_gfx/gui/console.h @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2012-2016, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#ifndef H_GEOGRAM_GFX_GUI_CONSOLE_H +#define H_GEOGRAM_GFX_GUI_CONSOLE_H + +#include +#include +#include + +/** + * \file geogram_gfx/gui/console.h + * \brief A console. + */ + +namespace GEO { + + /** + * \brief A console, that displays logger messages, and where the + * user can enter commands. + * \details Inspired from ImGui AppLog example. + */ + class GEOGRAM_GFX_API Console : public GEO::LoggerClient { + + public: + + /** + * \brief Console constructor. + * \param[in] visible_flag an optional pointer to application's + * variable that controls the visibility of this Console. + */ + Console(bool* visible_flag = nullptr); + + /** + * \copydoc GEO::LoggerClient::div() + */ + virtual void div(const std::string& value); + + /** + * \copydoc GEO::LoggerClient::out() + */ + virtual void out(const std::string& value); + + /** + * \copydoc GEO::LoggerClient::warn() + */ + virtual void warn(const std::string& value); + + /** + * \copydoc GEO::LoggerClient::err() + */ + virtual void err(const std::string& value); + + /** + * \copydoc GEO::LoggerClient::status() + */ + virtual void status(const std::string& value); + + /** + * \brief Clears the contents of the console. + */ + void clear(); + + /** + * \brief Displays a formatted string to the console. + */ + virtual void printf(const char* fmt, ...) /* IM_FMTARGS(1) */; + + /** + * \brief Draws the console and handles the gui. + * \param[in] visible an optional pointer to a visibility + * flag, controlled by a close button if different from nullptr. + * \param[in] with_window if true, then creates a new window + * using imgui::Begin() / imgui::End(), else caller is responsible + * for doing that. + */ + virtual void draw(bool* visible=nullptr, bool with_window=true); + + int TextEditCallback(ImGuiTextEditCallbackData* data); + + void show() { + *visible_flag_ = true; + } + + void hide() { + *visible_flag_ = false; + } + + typedef void (*CompletionCallback)( + Console* console, + const std::string& line, index_t startw, index_t endw, + const std::string& cmpword, std::vector& matches + ); + + void set_completion_callback(CompletionCallback CB) { + completion_callback_ = CB; + } + + typedef void (*HistoryCallback)( + Console* console, + index_t index, + std::string& command + ); + + void set_history_callback(HistoryCallback CB) { + history_callback_ = CB; + } + + void set_history_size(index_t n) { + if(n != max_history_index_) { + history_index_ = n; + } + max_history_index_ = n; + } + + void show_command_prompt() { + command_prompt_ = true; + } + + void hide_command_prompt() { + command_prompt_ = false; + } + + protected: + /** + * \brief This function is called whenever an error is + * displayed using err() + * \details Base implementation does nothing. This function + * is meant to be overloaded in derived classes. + * \param[in] err the error message sent to err() + */ + virtual void notify_error(const std::string& err); + + virtual bool exec_command(const char* command); + + /** + * \brief Redraws the GUI. + */ + virtual void update(); + + bool command_prompt_; + ImGuiTextBuffer buf_; + ImGuiTextFilter filter_; + /** \brief Index to lines offset */ + ImVector line_offsets_; + index_t scroll_to_bottom_; + bool* visible_flag_; + char input_buf_[geo_imgui_string_length]; + CompletionCallback completion_callback_; + HistoryCallback history_callback_; + index_t history_index_; + index_t max_history_index_; + }; + + typedef SmartPointer Console_var; +} + +#endif diff --git a/src/lib/geogram_gfx/gui/events.h b/src/lib/geogram_gfx/gui/events.h new file mode 100644 index 00000000..fb7a0bb9 --- /dev/null +++ b/src/lib/geogram_gfx/gui/events.h @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2012-2016, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#ifndef H_GEOGRAM_GFX_GUI_EVENT_H +#define H_GEOGRAM_GFX_GUI_EVENT_H + +namespace GEO { + + enum EventAction { + EVENT_ACTION_UP=0, + EVENT_ACTION_DOWN=1, + EVENT_ACTION_DRAG=2, + EVENT_ACTION_UNKNOWN=255 + }; + + enum EventSource { + EVENT_SOURCE_KEYBOARD=0, + EVENT_SOURCE_MOUSE=1, + EVENT_SOURCE_FINGER=2, + EVENT_SOURCE_STYLUS=3 + }; + +} + +#endif diff --git a/src/lib/geogram_gfx/glup_viewer/geogram_logo_256.xpm b/src/lib/geogram_gfx/gui/geogram_logo_256.xpm old mode 100755 new mode 100644 similarity index 100% rename from src/lib/geogram_gfx/glup_viewer/geogram_logo_256.xpm rename to src/lib/geogram_gfx/gui/geogram_logo_256.xpm diff --git a/src/lib/geogram_gfx/gui/gui_state.h b/src/lib/geogram_gfx/gui/gui_state.h new file mode 100644 index 00000000..1c1d14ef --- /dev/null +++ b/src/lib/geogram_gfx/gui/gui_state.h @@ -0,0 +1,4 @@ +// Serialized ImGui windows docking configuration +// generated using gui:expert=true +// then Windows->Export gui state to C++ +const char gui_state[] = u8"[Window][DockSpace] Pos=0,0 Size=1024,1024 Collapsed=0 [Window][ Viewer] Pos=0,24 Size=158,825 Collapsed=0 DockId=0x00000009,0 [Window][ Object] Pos=858,24 Size=166,825 Collapsed=0 DockId=0x00000004,0 [Window][Console] Pos=0,851 Size=1024,172 Collapsed=0 DockId=0x00000002 [Window][Text Editor] Pos=220,24 Size=580,764 Collapsed=0 DockId=0x00000006,1 [Window][Debug##Default] Pos=60,60 Size=400,400 Collapsed=0 [Window][ImGui Demo] Pos=160,24 Size=640,764 Collapsed=0 DockId=0x00000006,0 [Window][say hello] Pos=0,496 Size=158,292 Collapsed=0 DockId=0x00000008 [Window][Command] Pos=0,493 Size=158,295 Collapsed=0 DockId=0x0000000A [Docking][Data] DockSpace ID=0x09EF459F Pos=0,24 Size=1024,999 Split=Y DockNode ID=0x00000001 Parent=0x09EF459F SizeRef=1024,825 Split=X DockNode ID=0x00000003 Parent=0x00000001 SizeRef=856,764 Split=X DockNode ID=0x00000005 Parent=0x00000003 SizeRef=158,764 Split=Y SelectedTab=0x07957BC8 DockNode ID=0x00000007 Parent=0x00000005 SizeRef=158,470 Split=Y SelectedTab=0x07957BC8 DockNode ID=0x00000009 Parent=0x00000007 SizeRef=158,467 HiddenTabBar=1 SelectedTab=0x07957BC8 DockNode ID=0x0000000A Parent=0x00000007 SizeRef=158,295 HiddenTabBar=1 SelectedTab=0x4177D348 DockNode ID=0x00000008 Parent=0x00000005 SizeRef=158,292 HiddenTabBar=1 SelectedTab=0xBD088ACE DockNode ID=0x00000006 Parent=0x00000003 SizeRef=696,764 CentralNode=1 HiddenTabBar=1 SelectedTab=0x080FC883 DockNode ID=0x00000004 Parent=0x00000001 SizeRef=166,764 HiddenTabBar=1 SelectedTab=0xB7250CB4 DockNode ID=0x00000002 Parent=0x09EF459F SizeRef=1024,172 HiddenTabBar=1 SelectedTab=0xF9BEF62A "; diff --git a/src/lib/geogram_gfx/gui/gui_state_bigfont_h.h b/src/lib/geogram_gfx/gui/gui_state_bigfont_h.h new file mode 100644 index 00000000..1dc9e328 --- /dev/null +++ b/src/lib/geogram_gfx/gui/gui_state_bigfont_h.h @@ -0,0 +1,4 @@ +// Serialized ImGui windows docking configuration +// generated using gui:expert=true +// then Windows->Export gui state to C++ +const char gui_state_h[] = u8"[Window][DockSpace] Pos=0,0 Size=1024,1024 Collapsed=0 [Window][ Viewer] Pos=749,552 Size=275,471 Collapsed=0 DockId=0x00000004,0 [Window][ Object] Pos=749,552 Size=275,471 Collapsed=0 DockId=0x00000004,1 [Window][Console] Pos=0,62 Size=1024,488 Collapsed=0 DockId=0x00000001,0 [Window][Text Editor] Pos=220,24 Size=580,764 Collapsed=0 DockId=0x00000006,1 [Window][Debug##Default] Pos=60,60 Size=400,400 Collapsed=0 [Window][ImGui Demo] Pos=160,24 Size=640,764 Collapsed=0 DockId=0x00000006,0 [Window][say hello] Pos=0,496 Size=158,292 Collapsed=0 DockId=0x00000008 [Window][Command] Pos=0,62 Size=436,961 Collapsed=0 DockId=0x00000007 [Docking][Data] DockSpace ID=0x09EF459F Pos=0,62 Size=1024,961 Split=Y DockNode ID=0x00000001 Parent=0x09EF459F SizeRef=1024,488 HiddenTabBar=1 SelectedTab=0xF9BEF62A DockNode ID=0x00000002 Parent=0x09EF459F SizeRef=1024,471 Split=X DockNode ID=0x00000003 Parent=0x00000002 SizeRef=747,764 Split=X DockNode ID=0x00000005 Parent=0x00000003 SizeRef=436,764 Split=Y SelectedTab=0x07957BC8 DockNode ID=0x00000007 Parent=0x00000005 SizeRef=158,470 HiddenTabBar=1 SelectedTab=0x4177D348 DockNode ID=0x00000008 Parent=0x00000005 SizeRef=158,292 HiddenTabBar=1 SelectedTab=0xBD088ACE DockNode ID=0x00000006 Parent=0x00000003 SizeRef=309,764 CentralNode=1 HiddenTabBar=1 SelectedTab=0x080FC883 DockNode ID=0x00000004 Parent=0x00000002 SizeRef=275,764 SelectedTab=0xB7250CB4 "; diff --git a/src/lib/geogram_gfx/gui/gui_state_bigfont_v.h b/src/lib/geogram_gfx/gui/gui_state_bigfont_v.h new file mode 100644 index 00000000..8596dcc3 --- /dev/null +++ b/src/lib/geogram_gfx/gui/gui_state_bigfont_v.h @@ -0,0 +1,4 @@ +// Serialized ImGui windows docking configuration +// generated using gui:expert=true +// then Windows->Export gui state to C++ +const char gui_state_v[] = u8"[Window][DockSpace] Pos=0,0 Size=1024,1024 Collapsed=0 [Window][ Viewer] Pos=0,893 Size=365,130 Collapsed=0 DockId=0x00000009,0 [Window][ Object] Pos=367,893 Size=657,130 Collapsed=0 DockId=0x0000000A,0 [Window][Console] Pos=0,62 Size=1024,434 Collapsed=0 DockId=0x00000001,0 [Window][Text Editor] Pos=220,24 Size=580,764 Collapsed=0 DockId=0x00000006,1 [Window][Debug##Default] Pos=60,60 Size=400,400 Collapsed=0 [Window][ImGui Demo] Pos=160,24 Size=640,764 Collapsed=0 DockId=0x00000006,0 [Window][say hello] Pos=0,496 Size=158,292 Collapsed=0 DockId=0x00000008 [Window][Command] Pos=0,62 Size=445,550 Collapsed=0 DockId=0x00000007 [Docking][Data] DockSpace ID=0x09EF459F Pos=0,62 Size=1024,961 Split=Y DockNode ID=0x00000001 Parent=0x09EF459F SizeRef=1024,434 HiddenTabBar=1 SelectedTab=0xF9BEF62A DockNode ID=0x00000002 Parent=0x09EF459F SizeRef=1024,525 Split=Y DockNode ID=0x00000003 Parent=0x00000002 SizeRef=1024,393 Split=X DockNode ID=0x00000005 Parent=0x00000003 SizeRef=445,764 Split=Y SelectedTab=0x07957BC8 DockNode ID=0x00000007 Parent=0x00000005 SizeRef=158,470 HiddenTabBar=1 SelectedTab=0x4177D348 DockNode ID=0x00000008 Parent=0x00000005 SizeRef=158,292 HiddenTabBar=1 SelectedTab=0xBD088ACE DockNode ID=0x00000006 Parent=0x00000003 SizeRef=577,764 CentralNode=1 HiddenTabBar=1 SelectedTab=0x080FC883 DockNode ID=0x00000004 Parent=0x00000002 SizeRef=1024,130 Split=X SelectedTab=0x07957BC8 DockNode ID=0x00000009 Parent=0x00000004 SizeRef=365,488 HiddenTabBar=1 SelectedTab=0xEF4FD93E DockNode ID=0x0000000A Parent=0x00000004 SizeRef=657,488 HiddenTabBar=1 SelectedTab=0x52429743 "; diff --git a/src/lib/geogram_gfx/gui/simple_application.cpp b/src/lib/geogram_gfx/gui/simple_application.cpp new file mode 100644 index 00000000..5c2ff0d5 --- /dev/null +++ b/src/lib/geogram_gfx/gui/simple_application.cpp @@ -0,0 +1,1250 @@ +/* + * Copyright (c) 2012-2016, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef GEOGRAM_WITH_LUA +#include +#include +#include +#include + +extern "C" { +#include +#include +#include +} + +#endif + +#ifdef GEO_OS_EMSCRIPTEN +#include +#endif + +namespace { +#include +#include +#include +} + +/******************************************************************************/ + +namespace { + + /** + * \brief Converts a complete path to a file to a label + * displayed in the file browser. + * \details Strips viewer_path from the input path. + * \param[in] path the complete path, can be either a directory or + * a file + * \return the label to be displayed in the menu + */ + std::string path_to_label( + const std::string& viewer_path, const std::string& path + ) { + std::string result = path; + if(GEO::String::string_starts_with(result, viewer_path)) { + result = result.substr( + viewer_path.length(), result.length()-viewer_path.length() + ); + } + return result; + } +} + +/******************************************************************************/ + +namespace GEO { + + SimpleApplication::SimpleApplication( + const std::string& name + ) : + Application(name), + text_editor_(&text_editor_visible_) + { + lighting_ = true; + edit_light_ = false; + clipping_ = false; + clip_mode_ = GLUP_CLIP_WHOLE_CELLS; + edit_clip_ = false; + fixed_clip_ = false; + background_color_ = vec4f(0.0f, 0.0f, 0.0f, 1.0f); + effect_ = GLenum(0); + + filename_[0] = '\0'; + geogram_logo_texture_ = 0; + viewer_properties_visible_ = true; + object_properties_visible_ = true; +#ifdef GEO_OS_ANDROID + console_visible_ = false; +#else + console_visible_ = true; +#endif + use_text_editor_ = false; + text_editor_visible_ = false; + menubar_visible_ = true; + + console_ = new Console(&console_visible_); + console_->hide_command_prompt(); + text_editor_.set_fixed_layout(false); + status_bar_ = new StatusBar; + + add_key_func("q", [this]() { stop(); }); + add_key_func("z", [this]() { zoom_in(); }); + add_key_func("Z", [this]() { zoom_out(); }); + add_key_func("H", [this]() { home(); }); + add_key_toggle("L", &lighting_); + add_key_toggle("l", &edit_light_); + add_key_toggle("F1", &clipping_); + add_key_toggle("F2", &edit_clip_); + add_key_toggle("F3", &fixed_clip_); + add_key_toggle("a", animate_ptr()); + add_key_toggle("F6", &text_editor_visible_); + add_key_toggle("F7", &viewer_properties_visible_); + add_key_toggle("F8", &object_properties_visible_); + add_key_toggle("F9", &console_visible_); + add_key_toggle("F12", &menubar_visible_); + set_region_of_interest( + 0.0, 0.0, 0.0, 1.0, 1.0, 1.0 + ); + + object_translation_ = vec3(0.0, 0.0, 0.0); + + mouse_op_ = MOUSE_NOOP; + mouse_target_ = MOUSE_NOTARGET; + + three_D_ = true; + zoom_ = 1.0; + zoom_down_ = 1.0; + +#ifdef GEOGRAM_WITH_LUA + lua_error_occured_ = false; + lua_state_ = luaL_newstate(); + luaL_openlibs(lua_state_); + init_lua_io(lua_state_); + init_lua_glup(lua_state_); + init_lua_simple_application(lua_state_); + init_lua_imgui(lua_state_); +#else + lua_error_occured_ = false; + lua_state_ = nullptr; +#endif + geo_cite_with_info( + "WEB:ImGUI", + "Used to create the GUI of GEOGRAM utilities " + "(vorpaview, geobox, geocod)." + ); + } + + SimpleApplication::~SimpleApplication() { +#ifdef GEOGRAM_WITH_LUA + if(lua_state_ != nullptr) { + lua_close(lua_state_); + lua_state_ = nullptr; + } +#endif + } + + void SimpleApplication::home() { + zoom_ = 1.0; + object_translation_ = vec3(0.0, 0.0, 0.0); + object_rotation_.reset(); + light_rotation_.reset(); + clip_rotation_.reset(); + clip_translation_ = vec3(0.0, 0.0, 0.0); + clipping_ = false; + edit_clip_ = false; + fixed_clip_ = false; + edit_light_ = false; + } + + void SimpleApplication::add_key_func( + const std::string& key, std::function cb + ) { + key_funcs_[key] = cb; + } + + void SimpleApplication::add_key_toggle( + const std::string& key, bool* p_val + ) { + add_key_func( + key, [p_val]() { *p_val = !*p_val; } + ); + } + + void SimpleApplication::char_callback(unsigned int c){ + Application::char_callback(c); + if(text_editor_visible_) { + return; + } + std::string k=" "; + k[0] = char(c); + auto F = key_funcs_.find(k); + if(F != key_funcs_.end()) { + F->second(); + } + } + + void SimpleApplication::key_callback( + int key, int scancode, int action, int mods + ) { + Application::key_callback(key, scancode, action, mods); + if(action == 0) { + auto F = key_funcs_.find(std::string(key_to_string(key))); + if(F != key_funcs_.end()) { + F->second(); + } + } + } + + void SimpleApplication::set_style(const std::string& style) { + Application::set_style(style); + if(String::string_starts_with(style, "Light")) { + background_color_ = vec4f(1.0f, 1.0f, 1.0f, 1.0f); + } else { + background_color_ = vec4f(0.0f, 0.0f, 0.0f, 1.0f); + } + } + + void SimpleApplication::set_region_of_interest( + double xmin, double ymin, double zmin, + double xmax, double ymax, double zmax + ) { + roi_.xyz_min[0] = xmin; + roi_.xyz_min[1] = ymin; + roi_.xyz_min[2] = zmin; + roi_.xyz_max[0] = xmax; + roi_.xyz_max[1] = ymax; + roi_.xyz_max[2] = zmax; + roi_radius_ = sqrt( + 0.25 * (xmax - xmin) * (xmax - xmin) + + 0.25 * (ymax - ymin) * (ymax - ymin) + + 0.25 * (zmax - zmin) * (zmax - zmin) + ); + } + + void SimpleApplication::get_region_of_interest( + double& xmin, double& ymin, double& zmin, + double& xmax, double& ymax, double& zmax + ) const { + xmin = roi_.xyz_min[0]; + ymin = roi_.xyz_min[1]; + zmin = roi_.xyz_min[2]; + xmax = roi_.xyz_max[0]; + ymax = roi_.xyz_max[1]; + zmax = roi_.xyz_max[2]; + } + + void SimpleApplication::draw_gui() { + draw_menu_bar(); + draw_dock_space(); + draw_viewer_properties_window(); + draw_object_properties_window(); + draw_console(); + draw_command_window(); + if(text_editor_visible_) { + text_editor_.draw(); + } + if( + ImGui::FileDialog("##load_dlg", filename_, geo_imgui_string_length) + ) { + load(filename_); + } + if( + ImGui::FileDialog("##save_dlg", filename_, geo_imgui_string_length) + ) { + save(filename_); + } + if(status_bar_->active()) { + float w = float(get_width()); + float h = float(get_height()); + float STATUS_HEIGHT = 50.0f * float(scaling()); + ImGui::SetNextWindowPos( + ImVec2(0.0f, h-STATUS_HEIGHT), + ImGuiCond_Always + ); + ImGui::SetNextWindowSize( + ImVec2(w,STATUS_HEIGHT-1.0f), + ImGuiCond_Always + ); + status_bar_->draw(); + } + } + + void SimpleApplication::draw_scene_begin() { + glClearColor( + background_color_.x, + background_color_.y, + background_color_.z, + background_color_.w + ); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + + glViewport(0, 0, int(get_width()), int(get_height())); + + double zScreen = 5.0; // screen projection plane + { + glupMatrixMode(GLUP_PROJECTION_MATRIX); + glupLoadIdentity(); + + double aspect = double(get_width()) / double(get_height()); + double zNear = 1.0; // near clipping plane. + double zFar = 10.0; // far clipping plane. + if(three_D_) { + double camera_aperture = 9.0; // field of view in degrees. + double view_max_size = zScreen * tan( + (camera_aperture * M_PI / 180.0) / 2.0 + ); + double right; + double top; + if(aspect < 1.0) { + top = view_max_size; + right = top * aspect; + } else { + right = view_max_size; + top = right / aspect; + } + right /= zoom_; + top /= zoom_; + glupFrustum(-right, right, -top, top, zNear, zFar); + } else { + double x = 1.0 / zoom_; + double y = 1.0 / zoom_; + if(aspect > 1.0) { + x *= aspect; + } else { + y /= aspect; + } + glupOrtho(-x, x, -y, y, zNear, zFar); + } + } + + static vec3 light0 = normalize(vec3(1.0, 1.0, 1.0)); + vec3 light = transform_vector( + light0, light_rotation_.get_value() + ); + glupLightVector3f(float(light.x), float(light.y), float(light.z)); + + glupMatrixMode(GLUP_MODELVIEW_MATRIX); + glupLoadIdentity(); + glupTranslated(0.0, 0.0, -zScreen); + + // Clipping + { + static double clip_eqn[4]; + clip_eqn[0] = 0.0; + clip_eqn[1] = 0.0; + clip_eqn[2] = 0.0; + clip_eqn[3] = 0.0; + glupClipPlane(clip_eqn); + glupDisable(GLUP_CLIPPING); + + if(clipping_) { + glupPushMatrix(); + glupTranslated( + clip_translation_.x, + clip_translation_.y, + clip_translation_.z + ); + glupMultMatrix(clip_rotation_.get_value()); + + { + glupSetColor3f( + GLUP_FRONT_AND_BACK_COLOR, + 1.0f - background_color_.x, + 1.0f - background_color_.y, + 1.0f - background_color_.z + ); + float sq_w = 1.25f / float(zoom_); + + GLboolean vertex_colors_save = + glupIsEnabled(GLUP_VERTEX_COLORS); + GLboolean texturing_save = glupIsEnabled(GLUP_TEXTURING); + glupDisable(GLUP_VERTEX_COLORS); + glupDisable(GLUP_TEXTURING); + + // Draw the cross + glupBegin(GLUP_LINES); + glupVertex3f(-sq_w, 0.0f, 0.0f); + glupVertex3f(sq_w, 0.0f, 0.0f); + glupVertex3f(0.0f, -sq_w, 0.0f); + glupVertex3f(0.0f, sq_w, 0.0f); + + // Draw the square around the cross + for(index_t i=0; i<3; ++i) { + glupVertex3f(sq_w, -sq_w, 0.0f); + glupVertex3f(sq_w, sq_w, 0.0f); + glupVertex3f(sq_w, sq_w, 0.0f); + glupVertex3f(-sq_w, sq_w, 0.0f); + glupVertex3f(-sq_w, sq_w, 0.0f); + glupVertex3f(-sq_w, -sq_w, 0.0f); + glupVertex3f(-sq_w, -sq_w, 0.0f); + glupVertex3f(sq_w, -sq_w, 0.0f); + sq_w = sq_w * 1.01f; + } + glupEnd(); + if(vertex_colors_save) { + glupEnable(GLUP_VERTEX_COLORS); + } + if(texturing_save) { + glupEnable(GLUP_TEXTURING); + } + } + clip_eqn[0] = 0.0; + clip_eqn[1] = 0.0; + clip_eqn[2] = -1.0; + clip_eqn[3] = 0.0; + glupEnable(GLUP_CLIPPING); + glupClipPlane(clip_eqn); + glupClipMode(clip_mode_); + glupPopMatrix(); + } + } + + glupTranslate(object_translation_); + glupMultMatrix(object_rotation_.get_value()); + + glupScaled( + 1.5 / roi_radius_, 1.5 / roi_radius_, 1.5 / roi_radius_ + ); + glupTranslated( + -0.5 * (roi_.xyz_min[0] + roi_.xyz_max[0]), + -0.5 * (roi_.xyz_min[1] + roi_.xyz_max[1]), + -0.5 * (roi_.xyz_min[2] + roi_.xyz_max[2]) + ); + + if(lighting_) { + glupEnable(GLUP_LIGHTING); + } else { + glupDisable(GLUP_LIGHTING); + } + + // Save transform for picking + { + glGetIntegerv(GL_VIEWPORT, viewport_); + // Note: OpenGL uses column-major order for matrices + // (thus what we get is the transpose of each matrix) + glupGetMatrixdv(GLUP_MODELVIEW_MATRIX, modelview_transpose_.data()); + glupGetMatrixdv(GLUP_PROJECTION_MATRIX, project_transpose_.data()); + } + } + + vec3 SimpleApplication::project(const vec3& p) { + vec3 result; + glupProject( + p.x, p.y, p.z, + modelview_transpose_.data(), project_transpose_.data(), viewport_, + &result.x, &result.y, &result.z + ); + return result; + } + + vec3 SimpleApplication::unproject(const vec3& p) { + vec3 result; + glupUnProject( + p.x, p.y, p.z, + modelview_transpose_.data(), project_transpose_.data(), viewport_, + &result.x, &result.y, &result.z + ); + return result; + } + + vec2 SimpleApplication::unproject_2d(const vec2& p) { + double z = project(vec3(0.0, 0.0, 0.0)).z; + vec3 result3d = unproject(vec3(p.x, p.y, z)); + return vec2(result3d.x, result3d.y); + } + + void SimpleApplication::draw_scene_end() { + } + + void SimpleApplication::draw_scene() { + } + + void SimpleApplication::draw_graphics() { + if(!full_screen_effect_.is_null()) { + full_screen_effect_->pre_render(get_width(), get_height()); + } + draw_scene_begin(); + draw_scene(); + draw_scene_end(); + if(!full_screen_effect_.is_null()) { + full_screen_effect_->post_render(); + } + } + + void SimpleApplication::draw_viewer_properties_window() { + if(!viewer_properties_visible_) { + return; + } + if(ImGui::Begin( + (icon_UTF8("camera")+" Viewer").c_str(), + &viewer_properties_visible_) + ) { + draw_viewer_properties(); + } + ImGui::End(); + } + + void SimpleApplication::draw_viewer_properties() { + if(ImGui::Button( + (icon_UTF8("home") + " Home [H]").c_str(), ImVec2(-1.0, 0.0)) + ) { + home(); + } + ImGui::Separator(); + ImGui::Checkbox("Animate [a]", animate_ptr()); + if(three_D_) { + ImGui::Checkbox("Lighting [L]", &lighting_); + if(lighting_) { + ImGui::Checkbox("Edit light [l]", &edit_light_); + } + ImGui::Separator(); + ImGui::Checkbox("Clipping [F1]", &clipping_); + if(clipping_) { + ImGui::Combo( + "mode", (int*)&clip_mode_, + "std. GL\0cells\0straddle\0slice\0\0" + ); + ImGui::Checkbox( + "edit clip [F2]", &edit_clip_ + ); + ImGui::Checkbox( + "fixed clip [F3]", &fixed_clip_ + ); + } + ImGui::Separator(); + } + ImGui::ColorEdit3WithPalette("Background", background_color_.data()); +#ifndef GEO_OS_ANDROID + if(three_D_) { + if(ImGui::Combo("sfx", (int*)&effect_, "none\0SSAO\0cartoon\0\0")) { + switch(effect_) { + case 0: + full_screen_effect_.reset(); + break; + case 1: + full_screen_effect_ = new AmbientOcclusionImpl(); + break; + case 2: + full_screen_effect_ = new UnsharpMaskingImpl(); + break; + } + } + } +#endif + } + + void SimpleApplication::draw_object_properties_window() { + if(!object_properties_visible_) { + return; + } + if(ImGui::Begin( + (icon_UTF8("edit")+" Object").c_str(), + &object_properties_visible_) + ) { + draw_object_properties(); + } + ImGui::End(); + } + + void SimpleApplication::draw_object_properties() { + } + + void SimpleApplication::draw_command_window() { + if(Command::current() == nullptr) { + return; + } + if(!Command::current()->is_visible()) { + Command::reset_current(); + return; + } + if(ImGui::Begin( + "Command", + Command::current()->is_visible_ptr() + )) { + Command::current()->draw(); + } + ImGui::End(); + } + + void SimpleApplication::draw_console() { + console_->draw(&console_visible_); + } + + void SimpleApplication::draw_menu_bar() { + if(!menubar_visible_) { + return; + } + if(ImGui::BeginMainMenuBar()) { + if(ImGui::BeginMenu("File")) { + if(supported_read_file_extensions() != "") { + draw_load_menu(); + } +#ifndef GEO_OS_EMSCRIPTEN + if(current_file_ != "") { + if(ImGui::MenuItem(icon_UTF8("save") + " Save")) { + if(save(current_file_)) { + Logger::out("I/O") << "Saved " + << current_file_ << std::endl; + } else { + Logger::out("I/O") << "Could not save " + << current_file_ << std::endl; + } + } + } +#endif + if(supported_write_file_extensions() != "") { + draw_save_menu(); + } + draw_fileops_menu(); +#ifndef GEO_OS_EMSCRIPTEN + ImGui::Separator(); + if(ImGui::MenuItem(icon_UTF8("door-open") + " quit", + "[q]", false, true) + ) { + this->stop(); + } +#endif + draw_about(); + ImGui::EndMenu(); + } + if(ImGui::BeginMenu("Windows")) { + draw_windows_menu(); + ImGui::EndMenu(); + } + draw_application_menus(); + + ImGui::EndMainMenuBar(); + } + } + + void SimpleApplication::draw_load_menu() { +#ifdef GEO_OS_EMSCRIPTEN + ImGui::Text("To load a file,"); + ImGui::Text("use the \"Browse\""); + ImGui::Text("button on the top"); + ImGui::Text("(or \"recent files\""); + ImGui::Text("below)"); + ImGui::Separator(); + if(ImGui::BeginMenu("Recent files...")) { + browse(path_); + ImGui::EndMenu(); + } +#else + if(ImGui::MenuItem(icon_UTF8("folder-open") + " Load...")) { + ImGui::OpenFileDialog( + "##load_dlg", + supported_read_file_extensions().c_str(), + filename_, + ImGuiExtFileDialogFlags_Load + ); + } +#endif + } + + void SimpleApplication::draw_save_menu() { +#ifdef GEO_OS_EMSCRIPTEN + if(ImGui::BeginMenu(icon_UTF8("save") + " Save as...")) { + ImGui::MenuItem("Supported extensions:", nullptr, false, false); + std::vector extensions; + String::split_string( + supported_write_file_extensions(), ';', extensions + ); + for(index_t i=0; iget_value("version") + ).c_str() + ); + ImGui::EndMenu(); + } + } + + void SimpleApplication::draw_windows_menu() { + if(use_text_editor_) { + ImGui::MenuItem( + "text editor", "[F6]", &text_editor_visible_ + ); + } + ImGui::MenuItem( + "viewer properties", "[F7]", &viewer_properties_visible_ + ); + ImGui::MenuItem( + "object properties", "[F8]", &object_properties_visible_ + ); + ImGui::MenuItem( + "console", "[F9]", &console_visible_ + ); +#ifndef GEO_OS_ANDROID + ImGui::MenuItem( + "menubar", "[F12]", &menubar_visible_ + ); +#endif + ImGui::Separator(); + if(ImGui::BeginMenu("Font size")) { + static index_t font_sizes[] = { + 10, 12, 18, 22, 24, 30, 32, 36, 40, 46, 50, 56 + }; + for(index_t i=0; i styles; + String::split_string(get_styles(), ';', styles); + for(index_t i=0; i gui:expert=true" + << std::endl; + out << "// then Windows->Export gui state to C++" + << std::endl; + out << "const char gui_state[] = u8\"" + << state + << "\";" << std::endl; + } + } + } + + void SimpleApplication::set_default_layout() { + set_gui_state(default_layout()); + } + + const char* SimpleApplication::default_layout_android_vertical() const { + return gui_state_v; + } + + const char* SimpleApplication::default_layout_android_horizontal() const { + return gui_state_h; + } + + const char* SimpleApplication::default_layout() const { +#ifdef GEO_OS_ANDROID + if(get_height() >= get_width()) { + return default_layout_android_vertical(); + } else { + return default_layout_android_horizontal(); + } +#else + return gui_state; +#endif + } + + + void SimpleApplication::resize(index_t w, index_t h) { + Application::resize(w,h); +#ifdef GEO_OS_ANDROID + set_default_layout(); +#endif + } + + void SimpleApplication::draw_application_menus() { + } + + void SimpleApplication::post_draw() { + Command::flush_queue(); + } + + void SimpleApplication::mouse_button_callback( + int button, int action, int mods, int source + ) { + geo_argused(mods); + + // Swap "buttons" if using fingers (it is more + // natural to do the rotation with one finger, + // zoom with two fingers and then translation) + // Same thing if editing light and event source + // is stylus. + if( + source == EVENT_SOURCE_FINGER || + (lighting_ && source == EVENT_SOURCE_STYLUS && edit_light_) + ) { + if(button == 0) { + button = 1; + } else if(button == 1) { + button = 0; + } + } + + if(action == EVENT_ACTION_DOWN) { + mouse_down_xy_ = mouse_xy_; + if(button == 1) { + if(three_D_) { + mouse_op_ = MOUSE_ROTATE; + } else { + mouse_op_ = MOUSE_TRANSLATE; + } + } else if(button == 0) { + mouse_op_ = MOUSE_TRANSLATE; + } else if(button == 2) { + mouse_op_ = MOUSE_ZOOM; + zoom_down_ = zoom_; + } + if(clipping_ && edit_clip_) { + mouse_target_ = MOUSE_CLIP; + } else if(lighting_ && edit_light_) { + mouse_target_ = MOUSE_LIGHT; + } else { + mouse_target_ = MOUSE_OBJECT; + } + if(three_D_ && mouse_op_ == MOUSE_ROTATE) { + switch(mouse_target_) { + case MOUSE_NOTARGET: + break; + case MOUSE_OBJECT: + object_rotation_.grab(mouse_xy_); + if(fixed_clip_) { + clip_rotation_.grab(mouse_xy_); + } + break; + case MOUSE_LIGHT: + light_rotation_.grab(mouse_xy_); + break; + case MOUSE_CLIP: + clip_rotation_.grab(mouse_xy_); + break; + } + } + } else if(action == EVENT_ACTION_UP) { + if(three_D_ && mouse_op_ == MOUSE_ROTATE) { + switch(mouse_target_) { + case MOUSE_NOTARGET: + break; + case MOUSE_OBJECT: + object_rotation_.release(mouse_xy_); + if(fixed_clip_) { + clip_rotation_.release(mouse_xy_); + } + break; + case MOUSE_LIGHT: + light_rotation_.release(mouse_xy_); + break; + case MOUSE_CLIP: + clip_rotation_.release(mouse_xy_); + break; + } + } + mouse_op_ = MOUSE_NOOP; + mouse_target_ = MOUSE_NOTARGET; + } + } + + void SimpleApplication::cursor_pos_callback( + double x, double y, int source + ) { + geo_argused(source); + mouse_xy_ = vec2( + double(x) / double(get_width()), + double(y) / double(get_height()) + ); + mouse_xy_ *= 2.0; + mouse_xy_ -= vec2(1.0, 1.0); + if(three_D_ && mouse_op_ == MOUSE_ROTATE) { + switch(mouse_target_) { + case MOUSE_NOTARGET: + break; + case MOUSE_OBJECT: + object_rotation_.drag(mouse_xy_); + if(fixed_clip_) { + clip_rotation_.drag(mouse_xy_); + } + break; + case MOUSE_LIGHT: + light_rotation_.drag(mouse_xy_); + break; + case MOUSE_CLIP: + clip_rotation_.drag(mouse_xy_); + break; + } + } else if(mouse_op_ == MOUSE_ZOOM && mouse_target_ == MOUSE_OBJECT) { + double R = mouse_xy_.y - mouse_down_xy_.y; + double fact = (1.0 + R); + fact = std::min(fact, 2.0); + fact = std::max(fact, 0.1); + zoom_ = zoom_down_ * fact; + } else if( mouse_op_ == MOUSE_TRANSLATE) { + double dx = mouse_xy_.x - mouse_down_xy_.x; + double dy = mouse_xy_.y - mouse_down_xy_.y; + if(mouse_target_ == MOUSE_OBJECT) { + object_translation_.x += 2.0 * dx / zoom_; + object_translation_.y -= 2.0 * dy / zoom_; + if(fixed_clip_) { + clip_translation_.x += 2.0 * dx / zoom_; + clip_translation_.y -= 2.0 * dy / zoom_; + } + } else if(mouse_target_ == MOUSE_CLIP) { + clip_translation_.x += 2.0 * dx / zoom_; + clip_translation_.y -= 2.0 * dy / zoom_; + } + mouse_down_xy_ = mouse_xy_; + } + } + + void SimpleApplication::scroll_callback(double xoffset, double yoffset) { + geo_argused(xoffset); + double dy = -40.0*double(yoffset) / double(get_height()); + zoom_ *= (1.0 + dy); + } + + bool SimpleApplication::save(const std::string& filename) { + Logger::warn("GLUP") + << "Could not save " << filename << std::endl; + Logger::warn("GLUP") + << "SimpleApplication::save() needs to be overloaded" + << std::endl; + return false; + } + + bool SimpleApplication::load(const std::string& filename) { + Logger::warn("GLUP") + << "Could not load " << filename << std::endl; + Logger::warn("GLUP") + << "SimpleApplication::load() needs to be overloaded" + << std::endl; + return false; + } + + bool SimpleApplication::can_load(const std::string& filename) { + std::string extensions_str = supported_read_file_extensions(); + if(extensions_str == "") { + return false; + } + if(extensions_str == "*") { + return true; + } + std::string extension = FileSystem::extension(filename); + std::vector extensions; + String::split_string(extensions_str, ';', extensions); + for(index_t i=0; i files; + FileSystem::get_directory_entries(path,files); + + for(index_t i=0; i 0) { + for(index_t i=0; i 0) { + path_ = FileSystem::dir_name(filenames()[filenames().size()-1]); + } + } else { + path_ = FileSystem::documents_directory(); + } + Logger::instance()->register_client(console_); + Progress::set_client(status_bar_); + set_default_layout(); + } + + void SimpleApplication::init_colormap( + const std::string& name, const char** xpm_data + ) { + colormaps_.push_back(ColormapInfo()); + colormaps_.rbegin()->name = name; + glGenTextures(1, &colormaps_.rbegin()->texture); + glBindTexture(GL_TEXTURE_2D, colormaps_.rbegin()->texture); + glTexImage2Dxpm(xpm_data); + glGenerateMipmap(GL_TEXTURE_2D); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri( + GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR + ); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glBindTexture(GL_TEXTURE_2D, 0); + } + + void SimpleApplication::init_colormaps() { + init_colormap("french", french_xpm); + init_colormap("black_white", black_white_xpm); + init_colormap("viridis", viridis_xpm); + init_colormap("rainbow", rainbow_xpm); + init_colormap("cei_60757", cei_60757_xpm); + init_colormap("inferno", inferno_xpm); + init_colormap("magma", magma_xpm); + init_colormap("parula", parula_xpm); + init_colormap("plasma", plasma_xpm); + init_colormap("blue_red", blue_red_xpm); + } + + bool SimpleApplication::exec_command(const char* command) { +#ifdef GEOGRAM_WITH_LUA + if(luaL_dostring(lua_state_,command)) { + adjust_lua_glup_state(lua_state_); + const char* msg = lua_tostring(lua_state_,-1); + const char* msg2 = strchr(msg,']'); + if(msg2 != nullptr) { + msg = msg2+2; + } + Logger::err("LUA") << "line " << msg << std::endl; + lua_error_occured_ = true; + } else { + lua_error_occured_ = false; + } + return !lua_error_occured_; +#else + geo_argused(command); + Logger::err("LUA") << "Compiled without LUA support" + << std::endl; + return false; +#endif + } + + void SimpleApplication::ImGui_initialize() { + CmdLine::set_arg("gui:style","Light"); + Application::ImGui_initialize(); +// Tooltips do not play well with touch screens. +#ifdef GEO_OS_ANDROID + ImGui::DisableTooltips(); +#endif + } +} diff --git a/src/lib/geogram_gfx/gui/simple_application.h b/src/lib/geogram_gfx/gui/simple_application.h new file mode 100644 index 00000000..bef2618a --- /dev/null +++ b/src/lib/geogram_gfx/gui/simple_application.h @@ -0,0 +1,547 @@ +/* + * Copyright (c) 2012-2016, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#ifndef H_GEOGRAM_GFX_GUI_SIMPLE_APPLICATION_H +#define H_GEOGRAM_GFX_GUI_SIMPLE_APPLICATION_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +struct lua_State; + +// MSVC compiler before VC2013 do not support UTF8 litterals +#if defined(_MSC_VER) && (_MSC_VER <= 1800) +#define u8 +#pragma execution_character_set(“utf-8”) +#endif + +namespace GEO { + + class GEOGRAM_GFX_API SimpleApplication : public Application { + public: + + /** + * \brief SimpleApplication constructor. + * \param[in] name the name of the application. + */ + SimpleApplication(const std::string& name); + + /** + * \brief SimpleApplication destructor. + */ + ~SimpleApplication() override; + + /** + * \copydoc GEO::Application::draw_gui() + */ + void draw_gui() override; + + /** + * \copydoc GEO::Application::draw_graphics() + */ + void draw_graphics() override; + + /** + * \brief Saves the current content to a file. + * \details Baseclass implementation does nothing. Derived classes + * may overload this function. + * \retval true if the file could be sucessfully saved. + * \retval false otherwise + */ + virtual bool save(const std::string& filename); + + /** + * \brief Loads a file. + * \details Baseclass implementation does nothing. Derived classes + * may overload this function. + * \retval true if the file could be sucessfully loaded + * \retval false otherwise + */ + virtual bool load(const std::string& filename); + + /** + * \brief Gets the text editor. + * \return a reference to the text editor. + */ + TextEditor& text_editor() { + return text_editor_; + } + + /** + * \brief Shows the text editor. + */ + void show_text_editor() { + text_editor_visible_ = true; + } + + /** + * \brief Hides the text editor. + */ + void hide_text_editor() { + text_editor_visible_ = false; + } + + /** + * \brief Shows the console. + */ + void show_console() { + console_visible_ = true; + } + + /** + * \brief Hides the console. + */ + void hide_console() { + console_visible_ = false; + } + + /** + * \brief Restores default viewing parameters. + */ + void home(); + + /** + * \copydoc GEO::Application::set_style() + */ + void set_style(const std::string& style) override; + + /** + * \brief Sets the region of interest + * \details This defines the default target of the camera + * \param[in] xmin , ymin , zmin , xmax , ymax , zmax the + * bounds of the region of interest. + */ + void set_region_of_interest( + double xmin, double ymin, double zmin, + double xmax, double ymax, double zmax + ); + + /** + * \brief Gets the region of interest + * \see set_region_of_interest() + * \param[out] xmin , ymin , zmin , xmax , ymax , zmax the + * bounds of the region of interest. + */ + void get_region_of_interest( + double& xmin, double& ymin, double& zmin, + double& xmax, double& ymax, double& zmax + ) const; + + void zoom_in() { + zoom_ *= 1.1; + } + + void zoom_out() { + zoom_ /= 1.1; + } + + void set_clipping(bool x) { + clipping_ = x; + } + + void set_lighting(bool x) { + lighting_ = x; + } + + void set_background_color(const vec4f& color) { + background_color_ = color; + } + + virtual bool exec_command(const char* command); + + static SimpleApplication* instance() { + return dynamic_cast( + GEO::Application::instance() + ); + } + + /** + * \brief Projects a point from model space to window coordinates. + * \param[in] p the point in model space coordinates. + * \return the point in window coordinates, that is + * [0,width-1] x [0,height-1] + */ + vec3 project(const vec3& p); + + /** + * \brief Unprojects a 3d point from window coordinates to model space. + * \param[in] p the 3d point in window coordinates, that is + * [0,width-1] x [0,height-1] + * \return the point in model space coordinates. + */ + vec3 unproject(const vec3& p); + + /** + * \brief Unprojects a 2d point from window coordinates to model space. + * \param[in] p the 2d point in screen space coordinates. + * \return the 2d point in model space coordinates. + */ + vec2 unproject_2d(const vec2& p); + + protected: + + /** + * \brief Declares a function to be triggered when a key is pressed. + * \param[in] key the key ("a" for a, "F1" for F1) + * \param[in] cb the function to be called + */ + void add_key_func(const std::string& key, std::function cb); + + /** + * \brief Declares a boolean to be toggled when a key is pressed. + * \param[in] key the key ("a" for a, "F1" for F1) + * \param[in] p_val a pointer to the boolean + */ + void add_key_toggle(const std::string& key, bool* p_val); + + /** + * \copydoc GEO::Application::char_callback() + */ + void char_callback(unsigned int c) override; + + /** + * \copydoc GEO::Application::key_callback() + */ + void key_callback(int key, int scancode, int action, int mods) override; + + /** + * \copydoc GEO::Application::mouse_button_callback() + */ + void mouse_button_callback( + int button, int action, int mods, int source + ) override; + + /** + * \copydoc GEO::Application::cursor_pos_callback() + */ + void cursor_pos_callback(double x, double y, int source) override; + + /** + * \copydoc GEO::Application::scroll_callback() + */ + void scroll_callback(double xoffset, double yoffset) override; + + /** + * \brief Setups OpenGL for scene drawing. + */ + virtual void draw_scene_begin(); + + /** + * \brief Draws the scene. + */ + virtual void draw_scene(); + + /** + * \brief Cleanups OpenGL after scene drawing. + */ + virtual void draw_scene_end(); + + /** + * \brief Draws the viewer properties window frame and contents. + */ + virtual void draw_viewer_properties_window(); + + /** + * \brief Draws the contents of viewer properties window. + */ + virtual void draw_viewer_properties(); + + /** + * \brief Draw the object properties window frame and contents. + */ + virtual void draw_object_properties_window(); + + /** + * \brief Draws the contents of the object properties window. + */ + virtual void draw_object_properties(); + + + /** + * \brief Draws the active command window if any. + */ + virtual void draw_command_window(); + + /** + * \brief Draws the console. + */ + virtual void draw_console(); + + + /** + * \brief Draws the menu bar. + */ + virtual void draw_menu_bar(); + + + /** + * \brief Draws the load menu and browser. + */ + virtual void draw_load_menu(); + + /** + * \brief Draws the save menu. + */ + virtual void draw_save_menu(); + + /** + * \brief Draws other file operation menu. + * \details Default implementation does nothing. + * It can be overloaded to add other menu + * items in the file menu. + */ + virtual void draw_fileops_menu(); + + /** + * \brief Draws the about box in the file menu. + */ + virtual void draw_about(); + + /** + * \brief Draws the windows menu. + */ + virtual void draw_windows_menu(); + + /** + * \brief Draws the application menus. + * \details Meant to be overloaded by derived classes. + */ + virtual void draw_application_menus(); + + /** + * \copydoc Application::post_draw() + */ + void post_draw() override; + + /** + * \brief Tests whether a file can be loaded. + * \details This function can be used to filter the files displayed + * in the "Load..." menu. Baseclass implementation always return true. + * Derived classes may overload it and return false for files with + * unknown extensions. + */ + virtual bool can_load(const std::string& filename); + + /** + * \brief Gets the list of supported file extensions for reading. + * \details This function may be olverloaded by derived class. Base + * class implementation returns "". If this function returns "", then + * no "Load..." option is displayed in the "File" menu. + * \return The semi-colon separated list of supported file extensions, + * or "*" if all file extensions are supported. + */ + virtual std::string supported_read_file_extensions(); + + /** + * \brief Gets the list of supported file extensions for writing. + * \details This function may be olverloaded by derived class. Base + * class implementation returns "". If this function returns "", then + * no "Save..." option is displayed in the "File" menu. + * If it returns a colon-separated list of extensions, then the + * "Save..." option displays a list of possible file names for each + * supported extension. + * \return The semi-colon separated list of supported file extensions, + * or "*" if all file extensions are supported. + */ + virtual std::string supported_write_file_extensions(); + + /** + * \brief Converts an OpenGL texture ID into an ImGUI texture ID. + * \param[in] gl_texture_id_in the OpenGL texture ID + * \return the corresponding ImGUI texture ID + */ + ImTextureID convert_to_ImTextureID(GLuint gl_texture_id_in); + + /** + * \copydoc GEO::Application::GL_initialize() + */ + void GL_initialize() override; + + /** + * \copydoc GEO::Application::GL_terminate() + */ + void GL_terminate() override; + + /** + * \brief Recursively browses a directory and generates + * menu items. + * \param[in] path the path to be browsed + * \param[in] subdirs if true, browse subdirectories as well + */ + void browse(const std::string& path, bool subdirs=false); + + /** + * \copydoc GEO::Application::geogram_initialize() + */ + void geogram_initialize(int argc, char** argv) override; + + /** + * \brief Sets the default filename used to save + * the current file. + * \param[in] filename the default filename. + */ + void set_default_filename(const std::string& filename) { + strcpy(filename_, filename.c_str()); + } + + /** + * \brief Initializes a new colormap from name and xpm data. + * \details This function can be called only once the OpenGL + * context is ready, for instance in the init_graphics() function. + * \param[in] name the name of the colormap + * \param[in] xpm_data the image data of the colormap. + */ + void init_colormap(const std::string& name, const char** xpm_data); + + /** + * \brief Initializes all the default colormaps. + * \details This function can be called only once the OpenGL + * context is ready, for instance in the init_graphics() function. + */ + void init_colormaps(); + + /** + * \copydoc Application::ImGui_initialize() + */ + void ImGui_initialize() override; + + void set_2d() { + three_D_ = false; + } + + void set_3d() { + three_D_ = true; + } + + void set_default_layout(); + + void resize(index_t w, index_t h) override; + + virtual const char* default_layout() const; + virtual const char* default_layout_android_vertical() const; + virtual const char* default_layout_android_horizontal() const; + + protected: + bool lighting_; + bool edit_light_; + bool clipping_; + GLUPclipMode clip_mode_; + bool edit_clip_; + bool fixed_clip_; + GLenum effect_; + vec4f background_color_; + + bool viewer_properties_visible_; + bool object_properties_visible_; + bool console_visible_; + bool text_editor_visible_; + bool use_text_editor_; + + Box roi_; + double roi_radius_; + vec3 object_translation_; + ArcBall object_rotation_; + ArcBall light_rotation_; + ArcBall clip_rotation_; + vec3 clip_translation_; + bool three_D_; + double zoom_; + double zoom_down_; /**< Zoom when mouse down. */ + + enum MouseOp { + MOUSE_NOOP, MOUSE_ROTATE, MOUSE_TRANSLATE, MOUSE_ZOOM + } mouse_op_; + + enum MouseTarget { + MOUSE_NOTARGET, MOUSE_OBJECT, MOUSE_LIGHT, MOUSE_CLIP + } mouse_target_; + + vec2 mouse_down_xy_; // in [-1,1] x [-1,1] + vec2 mouse_xy_; // in [-1,1] x [-1,1] + + // Current transform, for picking + GLint viewport_[4]; + mat4 modelview_transpose_; + mat4 project_transpose_; + + std::string path_; + std::string current_file_; + char filename_[geo_imgui_string_length]; // Buffer for file dialog. + GLuint geogram_logo_texture_; + + Console_var console_; + StatusBar_var status_bar_; + TextEditor text_editor_; + + std::map< std::string, std::function > key_funcs_; + + struct ColormapInfo { + ColormapInfo() : texture(0) { + } + GLuint texture; + std::string name; + }; + + vector colormaps_; + FullScreenEffectImpl_var full_screen_effect_; + + lua_State* lua_state_; + bool lua_error_occured_; + }; + +} + +#endif diff --git a/src/lib/geogram_gfx/gui/simple_mesh_application.cpp b/src/lib/geogram_gfx/gui/simple_mesh_application.cpp new file mode 100644 index 00000000..9148f89d --- /dev/null +++ b/src/lib/geogram_gfx/gui/simple_mesh_application.cpp @@ -0,0 +1,527 @@ +/* + * Copyright (c) 2012-2016, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#include +#include +#include +#include +#include + +namespace GEO { + + /**********************************************************************/ + + SimpleMeshApplication::SimpleMeshApplication( + const std::string& name + ) : SimpleApplication(name) { + std::vector extensions; + GEO::MeshIOHandlerFactory::list_creators(extensions); + file_extensions_ = String::join_strings(extensions, ';'); + + set_default_filename("out.meshb"); + + anim_speed_ = 1.0f; + anim_time_ = 0.0f; + + show_vertices_ = false; + show_vertices_selection_ = true; + vertices_size_ = 1.0f; + vertices_color_ = vec4f(0.0f, 1.0f, 0.0f, 1.0f); + + show_surface_ = true; + show_surface_sides_ = false; + show_mesh_ = true; + mesh_color_ = vec4f(0.0f, 0.0f, 0.0f, 1.0f); + mesh_width_ = 0.1f; + + show_surface_borders_ = false; + surface_color_ = vec4f(0.0f, 0.5f, 1.0f, 1.0f); + surface_color_2_ = vec4f(1.0f, 0.5f, 0.0f, 1.0f); + + show_volume_ = false; + volume_color_ = vec4f(0.9f, 0.9f, 0.9f, 1.0f); + cells_shrink_ = 0.0f; + show_colored_cells_ = false; + show_hexes_ = true; + show_connectors_ = true; + + show_attributes_ = false; + current_colormap_texture_ = 0; + attribute_min_ = 0.0f; + attribute_max_ = 0.0f; + attribute_ = "vertices.point_fp32[0]"; + attribute_name_ = "point_fp32[0]"; + attribute_subelements_ = MESH_VERTICES; + + add_key_toggle("p", &show_vertices_); + add_key_toggle("S", &show_surface_); + add_key_toggle("c", &show_surface_sides_); + add_key_toggle("B", &show_surface_borders_); + add_key_toggle("m", &show_mesh_); + add_key_toggle("V", &show_volume_); + add_key_toggle("j", &show_hexes_); + add_key_toggle("k", &show_connectors_); + add_key_toggle("C", &show_colored_cells_); + + add_key_func("r", decrement_anim_time_callback); + add_key_func("t", increment_anim_time_callback); + add_key_func("x", decrement_cells_shrink_callback); + add_key_func("w", increment_cells_shrink_callback); + } + + void SimpleMeshApplication::geogram_initialize(int argc, char** argv) { + GEO::initialize(); + GEO::CmdLine::declare_arg( + "attributes", true, "load mesh attributes" + ); + + GEO::CmdLine::declare_arg( + "single_precision", true, "use single precision vertices (FP32)" + ); + SimpleApplication::geogram_initialize(argc, argv); + } + + std::string SimpleMeshApplication::supported_read_file_extensions() { + return file_extensions_; + } + + std::string SimpleMeshApplication::supported_write_file_extensions() { + return file_extensions_; + } + + void SimpleMeshApplication::autorange() { + if(attribute_subelements_ != MESH_NONE) { + attribute_min_ = 0.0; + attribute_max_ = 0.0; + const MeshSubElementsStore& subelements = + mesh_.get_subelements_by_type(attribute_subelements_); + ReadOnlyScalarAttributeAdapter attribute( + subelements.attributes(), attribute_name_ + ); + if(attribute.is_bound()) { + attribute_min_ = Numeric::max_float32(); + attribute_max_ = Numeric::min_float32(); + for(index_t i=0; i attributes; + String::split_string(attribute_names(), ';', attributes); + for(index_t i=0; i= 6) { + ImGui::Separator(); + ImGui::Checkbox( + "Animate [a]", animate_ptr() + ); + ImGui::SliderFloat("spd.", &anim_speed_, 1.0f, 10.0f, "%.1f"); + ImGui::SliderFloat("t.", &anim_time_, 0.0f, 1.0f, "%.2f"); + } + + ImGui::Separator(); + ImGui::Checkbox("##VertOnOff", &show_vertices_); + ImGui::SameLine(); + ImGui::ColorEdit3WithPalette("Vert. [p]", vertices_color_.data()); + + if(show_vertices_) { + ImGui::Checkbox("selection", &show_vertices_selection_); + ImGui::SliderFloat("sz.", &vertices_size_, 0.1f, 5.0f, "%.1f"); + } + + if(mesh_.facets.nb() != 0) { + ImGui::Separator(); + ImGui::Checkbox("##SurfOnOff", &show_surface_); + ImGui::SameLine(); + ImGui::ColorEdit3WithPalette( + "Surf. [S]", surface_color_.data() + ); + if(show_surface_) { + ImGui::Checkbox("##SidesOnOff", &show_surface_sides_); + ImGui::SameLine(); + ImGui::ColorEdit3WithPalette( + "2sided [c]", surface_color_2_.data() + ); + + ImGui::Checkbox("##MeshOnOff", &show_mesh_); + ImGui::SameLine(); + ImGui::ColorEdit3WithPalette("mesh [m]", mesh_color_.data()); + + if(show_mesh_) { + ImGui::SliderFloat( + "wid.", &mesh_width_, 0.1f, 2.0f, "%.1f" + ); + } + + ImGui::Checkbox("borders [B]", &show_surface_borders_); + } + } + + if(mesh_.cells.nb() != 0) { + ImGui::Separator(); + ImGui::Checkbox("##VolumeOnOff", &show_volume_); + ImGui::SameLine(); + ImGui::ColorEdit3WithPalette("Volume [V]", volume_color_.data()); + if(show_volume_) { + ImGui::SliderFloat( + "shrk.", &cells_shrink_, 0.0f, 1.0f, "%.2f" + ); + if(!mesh_.cells.are_simplices()) { + ImGui::Checkbox("colored cells [C]", &show_colored_cells_); + ImGui::Checkbox("hexes [j]", &show_hexes_); + } + } + } + } + + void SimpleMeshApplication::increment_anim_time_callback() { + instance()->anim_time_ = std::min( + instance()->anim_time_ + 0.05f, 1.0f + ); + } + + void SimpleMeshApplication::decrement_anim_time_callback() { + instance()->anim_time_ = std::max( + instance()->anim_time_ - 0.05f, 0.0f + ); + } + + void SimpleMeshApplication::increment_cells_shrink_callback() { + instance()->cells_shrink_ = std::min( + instance()->cells_shrink_ + 0.05f, 1.0f + ); + } + + void SimpleMeshApplication::decrement_cells_shrink_callback() { + instance()->cells_shrink_ = std::max( + instance()->cells_shrink_ - 0.05f, 0.0f + ); + } + + void SimpleMeshApplication::GL_initialize() { + SimpleApplication::GL_initialize(); + current_colormap_texture_ = colormaps_[3].texture; + } + + void SimpleMeshApplication::draw_scene() { + + if(mesh_gfx_.mesh() == nullptr) { + return; + } + + if(animate()) { + anim_time_ = float( + sin(double(anim_speed_) * GEO::SystemStopwatch::now()) + ); + anim_time_ = 0.5f * (anim_time_ + 1.0f); + } + + mesh_gfx_.set_lighting(lighting_); + mesh_gfx_.set_time(double(anim_time_)); + + if(show_attributes_) { + mesh_gfx_.set_scalar_attribute( + attribute_subelements_, attribute_name_, + double(attribute_min_), double(attribute_max_), + current_colormap_texture_, 1 + ); + } else { + mesh_gfx_.unset_scalar_attribute(); + } + + if(show_vertices_) { + mesh_gfx_.set_points_color( + vertices_color_.x, vertices_color_.y, vertices_color_.z + ); + mesh_gfx_.set_points_size(vertices_size_); + mesh_gfx_.draw_vertices(); + } + + if(show_vertices_selection_) { + mesh_gfx_.set_points_color(1.0, 0.0, 0.0); + mesh_gfx_.set_points_size(2.0f * vertices_size_); + mesh_gfx_.set_vertices_selection("selection"); + mesh_gfx_.draw_vertices(); + mesh_gfx_.set_vertices_selection(""); + } + + mesh_gfx_.set_mesh_color(0.0, 0.0, 0.0); + + mesh_gfx_.set_surface_color( + surface_color_.x, surface_color_.y, surface_color_.z + ); + if(show_surface_sides_) { + mesh_gfx_.set_backface_surface_color( + surface_color_2_.x, surface_color_2_.y, surface_color_2_.z + ); + } + + mesh_gfx_.set_show_mesh(show_mesh_); + mesh_gfx_.set_mesh_color(mesh_color_.x, mesh_color_.y, mesh_color_.z); + mesh_gfx_.set_mesh_width(index_t(mesh_width_*10.0f)); + + if(show_surface_) { + float specular_backup = glupGetSpecular(); + glupSetSpecular(0.4f); + mesh_gfx_.draw_surface(); + glupSetSpecular(specular_backup); + } + + if(show_surface_borders_) { + mesh_gfx_.draw_surface_borders(); + } + + if(show_mesh_) { + mesh_gfx_.draw_edges(); + } + + if(show_volume_) { + + if( + glupIsEnabled(GLUP_CLIPPING) && + glupGetClipMode() == GLUP_CLIP_SLICE_CELLS + ) { + mesh_gfx_.set_lighting(false); + } + + mesh_gfx_.set_shrink(double(cells_shrink_)); + mesh_gfx_.set_draw_cells(GEO::MESH_HEX, show_hexes_); + mesh_gfx_.set_draw_cells(GEO::MESH_CONNECTOR, show_connectors_); + + if(show_colored_cells_) { + mesh_gfx_.set_cells_colors_by_type(); + } else { + mesh_gfx_.set_cells_color( + volume_color_.x, volume_color_.y, volume_color_.z + ); + } + mesh_gfx_.draw_volume(); + + mesh_gfx_.set_lighting(lighting_); + } + } + + bool SimpleMeshApplication::load(const std::string& filename) { + if(!FileSystem::is_file(filename)) { + Logger::out("I/O") << "is not a file" << std::endl; + } + mesh_gfx_.set_mesh(nullptr); + + mesh_.clear(false,false); + + if(GEO::CmdLine::get_arg_bool("single_precision")) { + mesh_.vertices.set_single_precision(); + } + + MeshIOFlags flags; + if(CmdLine::get_arg_bool("attributes")) { + flags.set_attribute(MESH_FACET_REGION); + flags.set_attribute(MESH_CELL_REGION); + } + if(!mesh_load(filename, mesh_, flags)) { + return false; + } + + if( + FileSystem::extension(filename) == "obj6" || + FileSystem::extension(filename) == "tet6" + ) { + Logger::out("Vorpaview") + << "Displaying mesh animation." << std::endl; + + start_animation(); + + mesh_gfx_.set_animate(true); + double xyzmin[3]; + double xyzmax[3]; + get_bbox(mesh_, xyzmin, xyzmax, true); + set_region_of_interest( + xyzmin[0], xyzmin[1], xyzmin[2], + xyzmax[0], xyzmax[1], xyzmax[2] + ); + } else { + mesh_gfx_.set_animate(false); + mesh_.vertices.set_dimension(3); + double xyzmin[3]; + double xyzmax[3]; + get_bbox(mesh_, xyzmin, xyzmax, false); + set_region_of_interest( + xyzmin[0], xyzmin[1], xyzmin[2], + xyzmax[0], xyzmax[1], xyzmax[2] + ); + } + + show_vertices_ = (mesh_.facets.nb() == 0); + mesh_gfx_.set_mesh(&mesh_); + + current_file_ = filename; + return true; + } + + bool SimpleMeshApplication::save(const std::string& filename) { + MeshIOFlags flags; + if(CmdLine::get_arg_bool("attributes")) { + flags.set_attribute(MESH_FACET_REGION); + flags.set_attribute(MESH_CELL_REGION); + } + if(FileSystem::extension(filename) == "geogram") { + mesh_.vertices.set_double_precision(); + } + bool result = true; + if(mesh_save(mesh_, filename, flags)) { + current_file_ = filename; + } else { + result = false; + } + if(GEO::CmdLine::get_arg_bool("single_precision")) { + mesh_.vertices.set_single_precision(); + } + return result; + } + + void SimpleMeshApplication::get_bbox( + const Mesh& M_in, double* xyzmin, double* xyzmax, bool animate + ) { + geo_assert(M_in.vertices.dimension() >= index_t(animate ? 6 : 3)); + for(index_t c = 0; c < 3; c++) { + xyzmin[c] = Numeric::max_float64(); + xyzmax[c] = Numeric::min_float64(); + } + + for(index_t v = 0; v < M_in.vertices.nb(); ++v) { + if(M_in.vertices.single_precision()) { + const float* p = M_in.vertices.single_precision_point_ptr(v); + for(coord_index_t c = 0; c < 3; ++c) { + xyzmin[c] = std::min(xyzmin[c], double(p[c])); + xyzmax[c] = std::max(xyzmax[c], double(p[c])); + if(animate) { + xyzmin[c] = std::min(xyzmin[c], double(p[c+3])); + xyzmax[c] = std::max(xyzmax[c], double(p[c+3])); + } + } + } else { + const double* p = M_in.vertices.point_ptr(v); + for(coord_index_t c = 0; c < 3; ++c) { + xyzmin[c] = std::min(xyzmin[c], p[c]); + xyzmax[c] = std::max(xyzmax[c], p[c]); + if(animate) { + xyzmin[c] = std::min(xyzmin[c], p[c+3]); + xyzmax[c] = std::max(xyzmax[c], p[c+3]); + } + } + } + } + } + +} diff --git a/src/lib/geogram_gfx/gui/simple_mesh_application.h b/src/lib/geogram_gfx/gui/simple_mesh_application.h new file mode 100644 index 00000000..9fead33a --- /dev/null +++ b/src/lib/geogram_gfx/gui/simple_mesh_application.h @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2012-2016, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#ifndef H_GEOGRAM_GFX_GUI_SIMPLE_MESH_APPLICATION_H +#define H_GEOGRAM_GFX_GUI_SIMPLE_MESH_APPLICATION_H + +#include +#include +#include + +namespace GEO { + + /** + * \brief An Application that manipulates a single Mesh. + */ + class GEOGRAM_GFX_API SimpleMeshApplication : public SimpleApplication { + public: + /** + * \brief Application constructor. + */ + SimpleMeshApplication(const std::string& name); + + protected: + + /** + * \copydoc SimpleApplication::geogram_initialize() + */ + void geogram_initialize(int argc, char** argv) override; + + /** + * \copydoc SimpleApplication::supported_read_file_extensions() + */ + std::string supported_read_file_extensions() override; + + /** + * \copydoc SimpleApplication::supported_write_file_extensions() + */ + std::string supported_write_file_extensions() override; + + /** + * \copydoc SimpleApplication::draw_object_properties() + */ + void draw_object_properties() override; + + /** + * \copydoc SimpleApplication::draw_scene() + */ + void draw_scene() override; + + /** + * \copydoc SimpleApplication::GL_initialize() + */ + void GL_initialize() override; + + /** + * \copydoc SimpleApplication::load() + */ + bool load(const std::string& filename) override; + + /** + * \copydoc SimpleApplication::save() + */ + bool save(const std::string& filename) override; + + /** + * \brief Gets the instance. + * \return a pointer to the current SimpleMeshApplication. + */ + static SimpleMeshApplication* instance() { + SimpleMeshApplication* result = + dynamic_cast( + SimpleApplication::instance() + ); + geo_assert(result != nullptr); + return result; + } + + protected: + + /** + * \brief Gets the bounding box of a mesh animation. + * \details In animated mode, the mesh animation is stored as + * a mesh with 6d coordinates, that correspond to the geometric + * location at the vertices at time 0 and at time 1. + * \param[in] M_in the mesh + * \param[out] xyzmin a pointer to the three minimum coordinates + * \param[out] xyzmax a pointer to the three maximum coordinates + * \param[in] animate true if displaying a mesh animation + */ + void get_bbox( + const Mesh& M_in, double* xyzmin, double* xyzmax, bool animate + ); + + /** + * \brief increments the animation time in the current instance. + * \details Callback bound to the 't' key + */ + static void increment_anim_time_callback(); + + /** + * \brief derements the animation time in the current instance. + * \details Callback bound to the 'r' key + */ + static void decrement_anim_time_callback(); + + /** + * \brief increments the cells shrinkage. + * \details Callback bound to the 'w' key + */ + static void increment_cells_shrink_callback(); + + /** + * \brief decrements the cells shrinkage. + * \details Callback bound to the 'x' key + */ + static void decrement_cells_shrink_callback(); + + protected: + + /** + * \brief Gets the mesh. + * \return a pointer to the Mesh. + */ + Mesh* mesh() { + return &mesh_; + } + + /** + * \brief Gets the mesh graphics. + * \return a pointer to the MeshGfx. + */ + MeshGfx* mesh_gfx() { + return &mesh_gfx_; + } + + /** + * \brief Makes the vertices visible. + */ + void show_vertices() { + show_vertices_ = true; + } + + /** + * \brief Makes the vertices invisible. + */ + void hide_vertices() { + show_vertices_ = false; + } + + /** + * \brief Makes the surface facets visible. + */ + void show_surface() { + show_surface_ = true; + } + + /** + * \brief Makes the surface facets invisible. + */ + void hide_surface() { + show_surface_ = false; + } + + /** + * \brief Makes the volume cells visible. + */ + void show_volume() { + show_volume_ = true; + } + + /** + * \brief Makes the volume cells invisible. + */ + void hide_volume() { + show_volume_ = false; + } + + /** + * \brief Makes the attributes visible. + */ + void show_attributes() { + show_attributes_ = true; + } + + /** + * \brief Makes the attributes invisible. + */ + void hide_attributes() { + show_attributes_ = false; + } + + /** + * \brief Adjusts the current minimum and maximum attribute value + * to the currently bound attribute if any. + */ + void autorange(); + + /** + * \brief Gets the list of attribute names. + * \return the ';'-separated list of attribute names. + */ + std::string attribute_names(); + + /** + * \brief Sets the currently displayed attribute. + * \param[in] attribute the name of the attribute + * to be displayed, prefixed by element type. + */ + void set_attribute(const std::string& attribute); + + protected: + Mesh mesh_; + MeshGfx mesh_gfx_; + std::string file_extensions_; + + float anim_speed_; + float anim_time_; + + bool show_vertices_; + bool show_vertices_selection_; + float vertices_size_; + vec4f vertices_color_; + + bool show_surface_; + bool show_surface_sides_; + bool show_mesh_; + float mesh_width_; + vec4f mesh_color_; + + bool show_surface_borders_; + vec4f surface_color_; + vec4f surface_color_2_; + + bool show_volume_; + float cells_shrink_; + vec4f volume_color_; + bool show_colored_cells_; + bool show_hexes_; + bool show_connectors_; + + bool show_attributes_; + GLuint current_colormap_texture_; + std::string attribute_; + MeshElementsFlags attribute_subelements_; + std::string attribute_name_; + float attribute_min_; + float attribute_max_; + }; + + /*****************************************************************/ +} + +#endif diff --git a/src/lib/geogram_gfx/gui/status_bar.cpp b/src/lib/geogram_gfx/gui/status_bar.cpp new file mode 100644 index 00000000..53c693b4 --- /dev/null +++ b/src/lib/geogram_gfx/gui/status_bar.cpp @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2012-2016, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#include +#include +#include +#include + +namespace GEO { + StatusBar::StatusBar() { + step_ = 0; + percent_ = 0; + progress_ = false; + canceled_ = false; + nb_active_ = 0; + } + + void StatusBar::begin() { + progress_ = true; + canceled_ = false; + ++nb_active_; + } + + void StatusBar::progress(GEO::index_t step, GEO::index_t percent) { + step_ = step; + percent_ = percent; + update(); + } + + void StatusBar::end(bool canceled) { + geo_argused(canceled); + step_ = 0; + percent_ = 0; + progress_ = false; + --nb_active_; + } + + void StatusBar::draw() { + ImGui::Begin( + "##Status", nullptr, + ImGuiWindowFlags_NoResize | + ImGuiWindowFlags_NoMove | + ImGuiWindowFlags_NoCollapse | + ImGuiWindowFlags_NoTitleBar | + ImGuiWindowFlags_NoScrollbar + ); + if(progress_) { +// "Cancel" button does not work for now under Android +// (to be investigated...) +#ifndef GEO_OS_ANDROID + if(ImGui::Button("cancel")) { + Progress::cancel(); + } + ImGui::SameLine(); +#endif + ImGui::Text( + "%s", Progress::current_task()->task_name().c_str() + ); + ImGui::SameLine(); + std::string overlay = + String::to_string(step_) + "/" + + String::to_string( + Progress::current_task()->max_steps() + ) + " (" + + String::to_string(percent_) + + "%)"; + + ImGui::ProgressBar( + std::max(0.001f, float(percent_)/float(100.0)), + ImVec2(-1,0.0), + overlay.c_str() + ); + } + ImGui::End(); + } + + void StatusBar::update() { + if(Application::instance() != nullptr) { + Application::instance()->draw(); + } + } +} diff --git a/src/lib/geogram_gfx/gui/status_bar.h b/src/lib/geogram_gfx/gui/status_bar.h new file mode 100644 index 00000000..0e58813f --- /dev/null +++ b/src/lib/geogram_gfx/gui/status_bar.h @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2012-2016, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#ifndef H_GEOGRAM_GFX_GUI_STATUS_BAR_H +#define H_GEOGRAM_GFX_GUI_STATUS_BAR_H + +#include +#include + +/** + * \file geogram_gfx/gui/status_bar.h + * \brief Implementation of the status bar. + */ + +namespace GEO { + + /** + * \brief StatusBar displays the progress bar. + */ + class GEOGRAM_GFX_API StatusBar : public GEO::ProgressClient { + public: + + /** + * \brief StatusBar constructor. + */ + StatusBar(); + + /** + * \copydoc GEO::ProgressClient::begin() + */ + virtual void begin(); + + /** + * \copydoc GEO::ProgressClient::progress() + */ + virtual void progress(GEO::index_t step, GEO::index_t percent); + + /** + * \copydoc GEO::ProgressClient::end() + */ + virtual void end(bool canceled); + + /** + * \brief Draws the status bar and handles the GUI. + */ + void draw(); + + /** + * \brief Tests whether this status bar should be displayed. + * \details The status bar is displayed whenever there is an + * active progress bar. + */ + bool active() const { + return (nb_active_ > 0); + } + + /** + * \brief Redraws the GUI. + */ + virtual void update(); + + private: + bool progress_; + index_t step_; + index_t percent_; + bool canceled_; + index_t nb_active_; + }; + + typedef SmartPointer StatusBar_var; +} + +#endif diff --git a/src/lib/geogram_gfx/gui/text_editor.cpp b/src/lib/geogram_gfx/gui/text_editor.cpp new file mode 100644 index 00000000..3eee3967 --- /dev/null +++ b/src/lib/geogram_gfx/gui/text_editor.cpp @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2012-2016, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#include +#include +#include +#include + +namespace GEO { + + TextEditor::TextEditor(bool* visible) : visible_(visible) { + impl_.SetText("\n"); + impl_.SetCursorPosition( + ::TextEditor::Coordinates(0,0) + ); + impl_.SetLanguageDefinition( + ::TextEditor::LanguageDefinition::Lua() + ); + impl_.SetPalette(::TextEditor::GetDarkPalette()); + fixed_layout_ = true; + } + + std::string TextEditor::text() const { + return impl_.GetText(); + } + + void TextEditor::draw() { + ImGui::Begin( + "Text Editor", visible_, + fixed_layout_ ? ( + ImGuiWindowFlags_NoResize | + ImGuiWindowFlags_NoMove | + ImGuiWindowFlags_NoCollapse + ) : 0 + ); + + ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]); + + if(Application::instance() != nullptr) { + if( + String::string_starts_with( + Application::instance()->get_style(), + "Light" + ) + ) { + impl_.SetPalette(::TextEditor::GetLightPalette()); + } else { + impl_.SetPalette(::TextEditor::GetDarkPalette()); + } + } + + impl_.Render("##source"); + + ImGui::PopFont(); + + ImGui::End(); + } + + void TextEditor::load(const std::string& filename) { + std::ifstream in(filename.c_str()); + std::string text; + std::string line; + while(std::getline(in,line)) { + text += line; + text += "\n"; + } + impl_.SetText(text); + impl_.SetCursorPosition( + ::TextEditor::Coordinates(0,0) + ); + } + + void TextEditor::save(const std::string& filename) { + std::ofstream out(filename.c_str()); + out << impl_.GetText(); + } + + void TextEditor::clear() { + impl_.SetText("\n"); + impl_.SetCursorPosition( + ::TextEditor::Coordinates(0,0) + ); + } + + void TextEditor::load_data(const char* data) { + impl_.SetText(data); + impl_.SetCursorPosition( + ::TextEditor::Coordinates(0,0) + ); + } + +} diff --git a/src/lib/geogram_gfx/gui/text_editor.h b/src/lib/geogram_gfx/gui/text_editor.h new file mode 100644 index 00000000..74185e0f --- /dev/null +++ b/src/lib/geogram_gfx/gui/text_editor.h @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2012-2016, Bruno Levy + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the ALICE Project-Team nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * If you modify this software, you should include a notice giving the + * name of the person performing the modification, the date of modification, + * and the reason for such modification. + * + * Contact: Bruno Levy + * + * Bruno.Levy@inria.fr + * http://www.loria.fr/~levy + * + * ALICE Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE + * + */ + +#ifndef H_GEOGRAM_GFX_GUI_TEXT_EDITOR_H +#define H_GEOGRAM_GFX_GUI_TEXT_EDITOR_H + +#include +#include + +/** + * \file geogram_gfx/gui/text_editor.h + * \brief A simple text editor. + */ + +namespace GEO { + + /** + * \brief A minimalistic text editor + * \details It is the text editor used by geocod. Note that Graphite uses + * a more elaborate text editor, not based on this class. + */ + class GEOGRAM_GFX_API TextEditor { + public: + TextEditor(bool* visible); + void draw(); + std::string text() const; + void load(const std::string& filename); + void save(const std::string& filename); + void clear(); + void load_data(const char* data); + void set_fixed_layout(bool x) { + fixed_layout_ = x; + } + + private: + ::TextEditor impl_; + bool* visible_; + bool fixed_layout_; + }; +} + +#endif diff --git a/src/lib/geogram_gfx/lua/lua_imgui.cpp b/src/lib/geogram_gfx/lua/lua_imgui.cpp index 13ba27c4..695c0e31 100644 --- a/src/lib/geogram_gfx/lua/lua_imgui.cpp +++ b/src/lib/geogram_gfx/lua/lua_imgui.cpp @@ -44,11 +44,11 @@ */ #include -#include #include #include #include #include +#include #include extern void LoadImguiBindings(); diff --git a/src/lib/geogram_gfx/lua/lua_glup_viewer.cpp b/src/lib/geogram_gfx/lua/lua_simple_application.cpp similarity index 66% rename from src/lib/geogram_gfx/lua/lua_glup_viewer.cpp rename to src/lib/geogram_gfx/lua/lua_simple_application.cpp index 95eb96ca..30b25959 100644 --- a/src/lib/geogram_gfx/lua/lua_glup_viewer.cpp +++ b/src/lib/geogram_gfx/lua/lua_simple_application.cpp @@ -43,19 +43,8 @@ * */ -#ifdef __ANDROID__ - -#include - -void init_lua_glup_viewer(lua_State* L) { - (void)L; -} - -#else - -#include -#include -#include +#include +#include #include #include @@ -83,19 +72,13 @@ namespace { L, "'GLUP.ResetViewer()' invalid number of arguments" ); } - glup_viewer_home(); - glup_viewer_disable(GLUP_VIEWER_CLIP); - glup_viewer_disable(GLUP_VIEWER_EDIT_CLIP); - glup_viewer_disable(GLUP_VIEWER_FIXED_CLIP); - glup_viewer_disable(GLUP_VIEWER_ROTATE_LIGHT); - glup_viewer_enable(GLUP_VIEWER_BACKGROUND); - GEO::Application::instance()->set_lighting(true); - GEO::Application::instance()->set_background_color_1( - 1.0f, 1.0f, 1.0f - ); - GEO::Application::instance()->set_background_color_2( - 0.0f, 0.0f, 0.7f - ); + + GEO::SimpleApplication* app = GEO::SimpleApplication::instance(); + if(app != nullptr) { + app->home(); + app->set_lighting(true); + } + t0 = GEO::SystemStopwatch::now(); return 0; } @@ -106,15 +89,14 @@ namespace { L, "'GLUP.ArcadeStyle()' invalid number of arguments" ); } - glup_viewer_home(); - glup_viewer_disable(GLUP_VIEWER_CLIP); - glup_viewer_disable(GLUP_VIEWER_EDIT_CLIP); - glup_viewer_disable(GLUP_VIEWER_FIXED_CLIP); - glup_viewer_disable(GLUP_VIEWER_ROTATE_LIGHT); - glup_viewer_disable(GLUP_VIEWER_BACKGROUND); - GEO::Application::instance()->set_lighting(false); - GEO::Application::instance()->set_background_color_1(0,0,0); - GEO::Application::instance()->set_background_color_2(0,0,0); + + GEO::SimpleApplication* app = GEO::SimpleApplication::instance(); + if(app != nullptr) { + app->home(); + app->set_lighting(false); + app->set_background_color(vec4f(0.0, 0.0, 0.0, 1.0)); + } + return 0; } @@ -134,42 +116,51 @@ namespace { !lua_isnumber(L,6) ) { return luaL_error( - L, "'GLUP.SetRegionOfInterest()' arguments should be numbers" + L, + "'GLUP.SetRegionOfInterest()' arguments should be numbers" + ); + } + GEO::SimpleApplication* app = GEO::SimpleApplication::instance(); + if(app != nullptr) { + app->set_region_of_interest( + lua_tonumber(L,1), + lua_tonumber(L,2), + lua_tonumber(L,3), + lua_tonumber(L,4), + lua_tonumber(L,5), + lua_tonumber(L,6) ); } - glup_viewer_set_region_of_interest( - float(lua_tonumber(L,1)), - float(lua_tonumber(L,2)), - float(lua_tonumber(L,3)), - float(lua_tonumber(L,4)), - float(lua_tonumber(L,5)), - float(lua_tonumber(L,6)) - ); return 0; } static int GetRegionOfInterest(lua_State* L) { if(lua_gettop(L) != 0) { return luaL_error( - L, "'GLUP.GetRegionOfInterest()' invalid number of arguments" + L, + "'GLUP.GetRegionOfInterest()' invalid number of arguments" ); } - float xm,ym,zm,xM,yM,zM; - glup_viewer_get_region_of_interest( - &xm, &ym, &zm, &xM, &yM, &zM - ); - lua_pushnumber(L,double(xm)); - lua_pushnumber(L,double(ym)); - lua_pushnumber(L,double(zm)); - lua_pushnumber(L,double(xM)); - lua_pushnumber(L,double(yM)); - lua_pushnumber(L,double(zM)); + + GEO::SimpleApplication* app = GEO::SimpleApplication::instance(); + if(app != nullptr) { + double xm,ym,zm,xM,yM,zM; + app->get_region_of_interest( + xm, ym, zm, xM, yM, zM + ); + lua_pushnumber(L,xm); + lua_pushnumber(L,ym); + lua_pushnumber(L,zm); + lua_pushnumber(L,xM); + lua_pushnumber(L,yM); + lua_pushnumber(L,zM); + } return 6; } } } -void init_lua_glup_viewer(lua_State* L) { +void init_lua_simple_application(lua_State* L) { lua_getglobal(L,"GLUP"); geo_assert(!lua_isnil(L,-1)); // Make sure GLUP was registered before. GEO::lua_bindwrapper(L,LUAGLUPVIEWERImpl::ElapsedTime); @@ -180,4 +171,3 @@ void init_lua_glup_viewer(lua_State* L) { lua_pop(L,1); } -#endif diff --git a/src/lib/geogram_gfx/lua/lua_glup_viewer.h b/src/lib/geogram_gfx/lua/lua_simple_application.h similarity index 90% rename from src/lib/geogram_gfx/lua/lua_glup_viewer.h rename to src/lib/geogram_gfx/lua/lua_simple_application.h index 4ac8cd5e..61ca5247 100644 --- a/src/lib/geogram_gfx/lua/lua_glup_viewer.h +++ b/src/lib/geogram_gfx/lua/lua_simple_application.h @@ -43,8 +43,8 @@ * */ -#ifndef GEOGRAM_GFX_LUA_LUA_GLUP_VIEWER -#define GEOGRAM_GFX_LUA_LUA_GLUP_VIEWER +#ifndef GEOGRAM_GFX_LUA_LUA_SIMPLE_APPLICATION +#define GEOGRAM_GFX_LUA_LUA_SIMPLE_APPLICATION #include #ifdef __cplusplus @@ -54,15 +54,15 @@ extern "C" { #include /** - * \file geogram_gfx/lua/lua_glup_viewer_lua.h - * \brief LUA bindings for glup_viewer. + * \file geogram_gfx/lua/lua_simple_application.h + * \brief LUA bindings for SimpleApplication. */ /** * \brief Registers glup_viewer functions to LUA. * \param[in] L a pointer to the LUA state. */ -void GEOGRAM_GFX_API init_lua_glup_viewer(lua_State* L); +void GEOGRAM_GFX_API init_lua_simple_application(lua_State* L); #ifdef __cplusplus } diff --git a/src/lib/geogram_gfx/mesh/mesh_gfx.cpp b/src/lib/geogram_gfx/mesh/mesh_gfx.cpp index 312e3192..78d9d0f4 100644 --- a/src/lib/geogram_gfx/mesh/mesh_gfx.cpp +++ b/src/lib/geogram_gfx/mesh/mesh_gfx.cpp @@ -182,6 +182,11 @@ namespace GEO { ) { return false; } +#ifdef GEO_GL_NO_DOUBLES + if(attribute_subelements_ != MESH_NONE) { + return false; + } +#endif if(long_vector_attribute_) { return false; } @@ -1132,6 +1137,8 @@ namespace GEO { ); } else { #ifdef GEO_GL_NO_DOUBLES + // TODO: switch to immediate mode API in this case, as when + // mesh is displayed with ES2 profile. // Logger::warn("MeshGfx") // << "Double precision GL attributes not supported by this arch." // << std::endl; @@ -1351,7 +1358,11 @@ namespace GEO { scalar_attribute_.attribute_store()->element_size(); GLint dimension = GLint(scalar_attribute_.attribute_store()->dimension()); + // nb_items should be scalar_attribute_.size(), using capacity() + // instead seemingly fixes a display bug (zero attribute on last + // vertex). To be further investigated... index_t nb_items = scalar_attribute_.size(); + // ... or ... scalar_attribute_.attribute_store()->capacity(); const void* data = scalar_attribute_.attribute_store()->data(); update_or_check_buffer_object( @@ -1437,9 +1448,11 @@ namespace GEO { case ReadOnlyScalarAttributeAdapter::ET_VEC2: case ReadOnlyScalarAttributeAdapter::ET_VEC3: #ifdef GEO_GL_NO_DOUBLES - Logger::warn("MeshGfx") - << "Double precision GL attributes not supported by this arch." - << std::endl; + // TODO: switch to immediate mode API in this case, as when + // mesh is displayed with ES2 profile. + // Logger::warn("MeshGfx") + // << "Double precision GL attributes not supported by this arch." + // << std::endl; #else glVertexAttribPointer( 2, dimension, GL_DOUBLE, GL_FALSE, stride, offset diff --git a/src/lib/geogram_gfx/third_party/ImGui/imgui.cpp b/src/lib/geogram_gfx/third_party/ImGui/imgui.cpp index 7495aceb..b764ad0c 100644 --- a/src/lib/geogram_gfx/third_party/ImGui/imgui.cpp +++ b/src/lib/geogram_gfx/third_party/ImGui/imgui.cpp @@ -5758,6 +5758,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) // Decide if we are going to handle borders and resize grips const bool handle_borders_and_resize_grips = (window->DockNodeAsHost || !window->DockIsActive); + // [Bruno] HERE ? // Handle manual resize: Resize Grips, Borders, Gamepad int border_held = -1; ImU32 resize_grip_col[4] = { 0 }; diff --git a/src/lib/geogram_gfx/third_party/ImGui/imgui_impl_android.cpp b/src/lib/geogram_gfx/third_party/ImGui/imgui_impl_android.cpp deleted file mode 100644 index 57212ae4..00000000 --- a/src/lib/geogram_gfx/third_party/ImGui/imgui_impl_android.cpp +++ /dev/null @@ -1,615 +0,0 @@ -// ImGui Platform Binding for: Android -// [Bruno Levy] Sun Aug 19 08:01:39 CEST 2018 -// Note: not part (yet) of the official ImGui distribution -// -// Note: to use, include in the CMakeLists.txt that compiles this file: -// if(ANDROID) -// target_include_directories(geogram_gfx_third_party PRIVATE -// ${ANDROID_NDK}/sources/android/native_app_glue -// ) -// endif() - -// What works: -// Rendering with OpenGL ES 2.x -// Fingers/Stylus/Mouse interaction -// Virtual and physical keyboard interaction - -// TODO (Bugs to be fixed): -// ------------------------ -// - soft keyboard directional keys do not always work (it depends on the used keyboard, -// for some keyboards, they work a little bit, randomly, for some others they work...) -// -// - app is restarted when connecting/disconnecting a physical keyboard -// while application is running (I do not understand, I have: -// android:configChanges="orientation|keyboardHidden|keyboard" -// in AndroidManifest.xml) -> this one is more related to android_main.cpp - -// TODO (Improvements): -// -------------------- -// - UTF8 text input (probably not very difficult to add). -// -// - mouse cursors (https://developer.android.com/about/versions/nougat/android-7.0#custom_pointer_api) -// (need to overload Java function, cannot do that with native_glue I think, unless we can change -// methods of an existing Java object with JNI) -// -// - setMousePos - - - -#ifdef __ANDROID__ - -#include "imgui.h" -#include "imgui_impl_android.h" - -#include -#include -#include -#include -#include -#include -#include - -namespace { - double g_Time = 0.0; - float g_mouseX = 0.0f; - float g_mouseY = 0.0f; - bool g_mousePressed[5] = {false, false, false, false, false}; - bool g_resetKeys = false; - ImGui_ImplAndroid_MouseUserCallback g_mouse_CB = nullptr; -} - -// Some utilities functions that interact with Android. -namespace AndroidUtils { - - // Shows or hides the software keyboard. - void set_soft_keyboard_visibility(struct android_app* app, bool show); - - // Converts a keycode to a unicode. - // deviceId, keyCode, metaState can be obtained from the InputEvent. - jint keycode_to_unicode( - struct android_app* app, - int32_t deviceId, int32_t keyCode, int32_t metaState - ); -} - -void ImGui_ImplAndroid_SetMouseUserCallback( - ImGui_ImplAndroid_MouseUserCallback CB -) { - g_mouse_CB = CB; -} - - - -bool ImGui_ImplAndroid_Init(struct android_app* app) { - g_Time = 0.0; - g_mouseX = 0.0f; - g_mouseY = 0.0f; - for (int i = 0; i < IM_ARRAYSIZE(g_mousePressed); i++) { - g_mousePressed[i] = false; - } - // TODO: mouse cursor - // TODO: setmousepos ? - - ImGuiIO& io = ImGui::GetIO(); - io.KeyMap[ImGuiKey_Tab] = AKEYCODE_TAB; - io.KeyMap[ImGuiKey_LeftArrow] = AKEYCODE_DPAD_LEFT; - io.KeyMap[ImGuiKey_RightArrow] = AKEYCODE_DPAD_RIGHT; - io.KeyMap[ImGuiKey_UpArrow] = AKEYCODE_DPAD_UP; - io.KeyMap[ImGuiKey_DownArrow] = AKEYCODE_DPAD_DOWN; - io.KeyMap[ImGuiKey_PageUp] = AKEYCODE_PAGE_UP; - io.KeyMap[ImGuiKey_PageDown] = AKEYCODE_PAGE_DOWN; - io.KeyMap[ImGuiKey_Home] = AKEYCODE_MOVE_HOME; - io.KeyMap[ImGuiKey_End] = AKEYCODE_MOVE_END; - io.KeyMap[ImGuiKey_Insert] = AKEYCODE_INSERT; - io.KeyMap[ImGuiKey_Delete] = AKEYCODE_FORWARD_DEL; - io.KeyMap[ImGuiKey_Backspace] = AKEYCODE_DEL; - io.KeyMap[ImGuiKey_Space] = AKEYCODE_SPACE; - io.KeyMap[ImGuiKey_Enter] = AKEYCODE_ENTER; - io.KeyMap[ImGuiKey_Escape] = AKEYCODE_ESCAPE; - io.KeyMap[ImGuiKey_A] = AKEYCODE_A; - io.KeyMap[ImGuiKey_C] = AKEYCODE_C; - io.KeyMap[ImGuiKey_V] = AKEYCODE_V; - io.KeyMap[ImGuiKey_X] = AKEYCODE_X; - io.KeyMap[ImGuiKey_Y] = AKEYCODE_Y; - io.KeyMap[ImGuiKey_Z] = AKEYCODE_Z; - - - // Install callbacks - if(app != nullptr) { - app->onInputEvent = ImGui_ImplAndroid_InputEvent; - } - - return true; -} - -void ImGui_ImplAndroid_Shutdown() { - // TODO: destroy mouse cursors. -} - -static void ImGui_ImplAndroid_UpdateMousePosAndButtons() -{ - ImGuiIO& io = ImGui::GetIO(); - - for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) { - io.MouseDown[i] = g_mousePressed[i]; - } - io.MousePos = ImVec2(g_mouseX, g_mouseY); -} - -static void ImGui_ImplAndroid_UpdateMouseCursor() { - // TODO... -} - -void ImGui_ImplAndroid_NewFrame() { - ImGuiIO& io = ImGui::GetIO(); - // Font atlas needs to be built, call renderer _NewFrame() function - // e.g. ImGui_ImplOpenGL3_NewFrame() - IM_ASSERT(io.Fonts->IsBuilt()); - - // Get current display size - EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); - EGLSurface surface = eglGetCurrentSurface(EGL_DRAW); - int w=0; - int h=0; - eglQuerySurface(display, surface, EGL_WIDTH, &w); - eglQuerySurface(display, surface, EGL_HEIGHT, &h); - int display_w = w; - int display_h = h; - - io.DisplaySize = ImVec2((float)w, (float)h); - io.DisplayFramebufferScale = - ImVec2( - w > 0 ?((float)display_w / w) : 0, - h > 0 ? ((float)display_h / h) : 0 - ); - - // Setup time step - timespec now; - clock_gettime(CLOCK_MONOTONIC, &now); - double current_time = double(now.tv_sec) + double(now.tv_nsec) * 1e-9; - - io.DeltaTime = g_Time > 0.0 ? float(current_time - g_Time) : 1.0f/60.0f; - g_Time = current_time; - - ImGui_ImplAndroid_UpdateMousePosAndButtons(); - ImGui_ImplAndroid_UpdateMouseCursor(); - - // TODO: Gamepad navigation mapping ? -} - - -void ImGui_ImplAndroid_EndFrame() { - // g_resetKeys is set when the latest key event came from the soft keyboard, - // then we need to reset the keys. - if(g_resetKeys) { - ImGuiIO& io = ImGui::GetIO(); - for(int key = 0; key < IM_ARRAYSIZE(io.KeysDown); ++key) { - io.KeysDown[key] = false; - } - io.KeyShift = false; - io.KeyCtrl = false; - io.KeyAlt = false; - io.KeySuper = false; - g_resetKeys = false; - } -} - -// Emulates mouse buttons using multiple fingers: -// emulated mouse button is determined by number of fingers -// coordinates are defined by last finger -int32_t ImGui_ImplAndroid_FingerEvent( - struct android_app* app, AInputEvent* event -) { - int32_t action = AMotionEvent_getAction(event); - bool down_or_move = (action == AMOTION_EVENT_ACTION_DOWN || - action == AMOTION_EVENT_ACTION_MOVE ); - - int nb_fingers = int(AMotionEvent_getPointerCount(event)); - int btn = nb_fingers-1; - for(int i=0; i= 0 && key < IM_ARRAYSIZE(io.KeysDown)) { - if((AKeyEvent_getFlags(event) & AKEY_EVENT_FLAG_SOFT_KEYBOARD)) { - // The soft keyboard generates Push/Release events when the - // key is released. Thus we mark the key as pushed, and - // set g_resetKeys so that ImGui_ImplAndroid_EndFrame() - // will mark the key as released after ImGui could do what - // it has to do with the key. - io.KeysDown[key] = true; - g_resetKeys = true; - } else { - io.KeysDown[key] = (action == AKEY_EVENT_ACTION_DOWN); - g_resetKeys = false; - } - io.KeyShift = ((modifiers & AMETA_SHIFT_ON) != 0); - io.KeyCtrl = ((modifiers & AMETA_CTRL_ON) != 0); - io.KeyAlt = ((modifiers & AMETA_ALT_ON) != 0); - io.KeySuper = ((modifiers & AMETA_META_ON) != 0); - } - - if(action == AKEY_EVENT_ACTION_DOWN) { - if(key == AKEYCODE_BACK) { - AndroidUtils::set_soft_keyboard_visibility(app, true); - } else { - jint unicode = AndroidUtils::keycode_to_unicode( - app, device, key, modifiers - ); - // TODO: use AddInputCharactersUTF8() - char c = char(unicode); - if(isprint(c)) { - io.AddInputCharacter(c); - } - } - } - - return 1; -} - -int32_t ImGui_ImplAndroid_InputEvent( - struct android_app* app, AInputEvent* event -) { - int32_t result = 0; - switch(AInputEvent_getType(event)) { - case AINPUT_EVENT_TYPE_MOTION: - result = ImGui_ImplAndroid_MotionEvent(app, event); - break; - case AINPUT_EVENT_TYPE_KEY: - result = ImGui_ImplAndroid_KeyEvent(app, event); - break; - default: - break; - } - return result; -} - -/*****************************************************************/ - -// Functions that interact with Java. - -namespace AndroidUtils { - - // Display soft keyboard programmatically - //https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/Tk3g00wLKhk - // (see alto messages about how to attach/detach thread). - // There is a function supposed to do that: - // ANativeActivity_showSoftInput( - // mApplication->activity,ANATIVEACTIVITY_SHOW_SOFT_INPUT_FORCED - // ); - // (or ANATIVEACTIVITY_SHOW_SOFT_INPUT_IMPLICIT) - // but I did not manage to make it work. - - void set_soft_keyboard_visibility(struct android_app* app, bool pShow) { - - JavaVM* lJavaVM = app->activity->vm; - JNIEnv* lJNIEnv = nullptr; - bool lThreadAttached = false; - - // Get JNIEnv from lJavaVM using GetEnv to test whether - // thread is attached or not to the VM. If not, attach it - // (and note that it will need to be detached at the end - // of the function). - switch (lJavaVM->GetEnv((void**)&lJNIEnv, JNI_VERSION_1_6)) { - case JNI_OK: - break; - case JNI_EDETACHED: { - jint lResult = lJavaVM->AttachCurrentThread(&lJNIEnv, nullptr); - if(lResult == JNI_ERR) { - throw std::runtime_error("Could not attach current thread"); - } - lThreadAttached = true; - } break; - case JNI_EVERSION: - throw std::runtime_error("Invalid java version"); - } - - // Retrieves NativeActivity. - jobject lNativeActivity = app->activity->clazz; - jclass ClassNativeActivity = lJNIEnv->GetObjectClass(lNativeActivity); - - // Retrieves Context.INPUT_METHOD_SERVICE. - jclass ClassContext = lJNIEnv->FindClass("android/content/Context"); - jfieldID FieldINPUT_METHOD_SERVICE = - lJNIEnv->GetStaticFieldID( - ClassContext,"INPUT_METHOD_SERVICE", "Ljava/lang/String;" - ); - jobject INPUT_METHOD_SERVICE = - lJNIEnv->GetStaticObjectField( - ClassContext, FieldINPUT_METHOD_SERVICE - ); - - // Runs getSystemService(Context.INPUT_METHOD_SERVICE). - jclass ClassInputMethodManager = lJNIEnv->FindClass( - "android/view/inputmethod/InputMethodManager" - ); - jmethodID MethodGetSystemService = lJNIEnv->GetMethodID( - ClassNativeActivity, "getSystemService", - "(Ljava/lang/String;)Ljava/lang/Object;" - ); - jobject lInputMethodManager = lJNIEnv->CallObjectMethod( - lNativeActivity, MethodGetSystemService, - INPUT_METHOD_SERVICE - ); - - // Runs getWindow().getDecorView(). - jmethodID MethodGetWindow = lJNIEnv->GetMethodID( - ClassNativeActivity, "getWindow", - "()Landroid/view/Window;" - ); - jobject lWindow = lJNIEnv->CallObjectMethod( - lNativeActivity, MethodGetWindow - ); - jclass ClassWindow = lJNIEnv->FindClass("android/view/Window"); - jmethodID MethodGetDecorView = lJNIEnv->GetMethodID( - ClassWindow, "getDecorView", "()Landroid/view/View;" - ); - jobject lDecorView = lJNIEnv->CallObjectMethod( - lWindow, MethodGetDecorView - ); - - if (pShow) { - // Runs lInputMethodManager.showSoftInput(...). - jmethodID MethodShowSoftInput = lJNIEnv->GetMethodID( - ClassInputMethodManager, "showSoftInput", - "(Landroid/view/View;I)Z" - ); - lJNIEnv->CallBooleanMethod( - lInputMethodManager, MethodShowSoftInput, - lDecorView, 0 - ); - } else { - // Runs lWindow.getViewToken() - jclass ClassView = lJNIEnv->FindClass( - "android/view/View" - ); - jmethodID MethodGetWindowToken = lJNIEnv->GetMethodID( - ClassView, "getWindowToken", "()Landroid/os/IBinder;" - ); - jobject lBinder = lJNIEnv->CallObjectMethod( - lDecorView, MethodGetWindowToken - ); - - // lInputMethodManager.hideSoftInput(...). - jmethodID MethodHideSoftInput = lJNIEnv->GetMethodID( - ClassInputMethodManager, "hideSoftInputFromWindow", - "(Landroid/os/IBinder;I)Z" - ); - lJNIEnv->CallBooleanMethod( - lInputMethodManager, MethodHideSoftInput, - lBinder, 0 - ); - } - - if(lThreadAttached) { - lJavaVM->DetachCurrentThread(); - } - } - - jint keycode_to_unicode( - struct android_app* app, - int32_t pDeviceId, int32_t pKeyCode, int32_t pMetaState - ) { - jint result = 0; - - // Early exit for special keys - // (works without it, but well, why calling all that - // Java stuff if we now in advance that we do not need - // to ?). - if( - pKeyCode == AKEYCODE_TAB || - pKeyCode == AKEYCODE_DPAD_LEFT || - pKeyCode == AKEYCODE_DPAD_RIGHT || - pKeyCode == AKEYCODE_DPAD_UP || - pKeyCode == AKEYCODE_DPAD_DOWN || - pKeyCode == AKEYCODE_PAGE_UP || - pKeyCode == AKEYCODE_PAGE_DOWN || - pKeyCode == AKEYCODE_MOVE_HOME || - pKeyCode == AKEYCODE_MOVE_END || - pKeyCode == AKEYCODE_INSERT || - pKeyCode == AKEYCODE_FORWARD_DEL || - pKeyCode == AKEYCODE_DEL || - pKeyCode == AKEYCODE_ENTER || - pKeyCode == AKEYCODE_ESCAPE - ) { - return result; - } - - - JavaVM* lJavaVM = app->activity->vm; - JNIEnv* lJNIEnv = nullptr; - bool lThreadAttached = false; - - // Get JNIEnv from lJavaVM using GetEnv to test whether - // thread is attached or not to the VM. If not, attach it - // (and note that it will need to be detached at the end - // of the function). - switch (lJavaVM->GetEnv((void**)&lJNIEnv, JNI_VERSION_1_6)) { - case JNI_OK: - break; - case JNI_EDETACHED: { - jint lResult = lJavaVM->AttachCurrentThread(&lJNIEnv, nullptr); - if(lResult == JNI_ERR) { - throw std::runtime_error("Could not attach current thread"); - } - lThreadAttached = true; - } break; - case JNI_EVERSION: - throw std::runtime_error("Invalid java version"); - } - - jclass ClassKeyCharacterMap = lJNIEnv->FindClass( - "android/view/KeyCharacterMap" - ); - - jmethodID MethodLoad = lJNIEnv->GetStaticMethodID( - ClassKeyCharacterMap, "load", - "(I)Landroid/view/KeyCharacterMap;" - ); - - jobject lKeyCharacterMap = lJNIEnv->CallStaticObjectMethod( - ClassKeyCharacterMap, MethodLoad, jint(pDeviceId) - ); - - jmethodID MethodGet = lJNIEnv->GetMethodID( - ClassKeyCharacterMap, "get", - "(II)I" - ); - - result = lJNIEnv->CallIntMethod( - lKeyCharacterMap, MethodGet, - jint(pKeyCode), jint(pMetaState) - ); - - if(lThreadAttached) { - lJavaVM->DetachCurrentThread(); - } - - return result; - } -} - -#endif - -/********************************************************************/ - -/* - - Notes, links etc... - =================== - - In pre-4.3 Androids, there was a bug on some devices making the - app. crash when hiding the soft keyboard. Normally it was fixed in Android 4.3. - - https://stackoverflow.com/questions/15913080/crash-when-closing-soft-keyboard-while-using-native-activity - -*/ - diff --git a/src/lib/geogram_gfx/third_party/ImGui/imgui_impl_android.h b/src/lib/geogram_gfx/third_party/ImGui/imgui_impl_android.h deleted file mode 100644 index d74564b5..00000000 --- a/src/lib/geogram_gfx/third_party/ImGui/imgui_impl_android.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * ImGui Platform Binding for: Android - * Author: Bruno Levy Sun Aug 19 08:01:39 CEST 2018 - * Note: not part (yet) of the official ImGui distribution - */ - -#ifdef __ANDROID__ -#include - -// param app: if non-null, registers input handler to specified app. -IMGUI_IMPL_API bool ImGui_ImplAndroid_Init( - struct android_app* app = nullptr -); - -IMGUI_IMPL_API void ImGui_ImplAndroid_Shutdown(); - -// Needs to be called at the beginning of each frame, -// before ImGui::NewFrame(). -IMGUI_IMPL_API void ImGui_ImplAndroid_NewFrame(); - -// Needs to be called at the end of each frame, -// after all other ImGui functions. -IMGUI_IMPL_API void ImGui_ImplAndroid_EndFrame(); - -// The event handler, to be used if not registered by ImGui_ImplAndroid_Init(). -IMGUI_IMPL_API int32_t ImGui_ImplAndroid_InputEvent( - struct android_app* app, AInputEvent* event -); - -typedef void (*ImGui_ImplAndroid_MouseUserCallback)( - float x, float y, int button -); - -// Registers a user mouse event handler called when no UI element -// is under the mouse pointer. -IMGUI_IMPL_API void ImGui_ImplAndroid_SetMouseUserCallback( - ImGui_ImplAndroid_MouseUserCallback CB -); - - -#endif diff --git a/src/lib/geogram_gfx/third_party/ImGui/imgui_internal.h b/src/lib/geogram_gfx/third_party/ImGui/imgui_internal.h index 2ec59755..b853e50e 100644 --- a/src/lib/geogram_gfx/third_party/ImGui/imgui_internal.h +++ b/src/lib/geogram_gfx/third_party/ImGui/imgui_internal.h @@ -1517,7 +1517,7 @@ struct ImGuiTabItem float Width; // Width currently displayed float WidthContents; // Width of actual contents, stored during BeginTabItem() call - ImGuiTabItem() { ID = Flags = 0; Window = NULL; LastFrameVisible = LastFrameSelected = -1; NameOffset = -1; Offset = Width = WidthContents = 0.0f; } + ImGuiTabItem() { ID = 0; Flags = 0; Window = NULL; LastFrameVisible = LastFrameSelected = -1; NameOffset = -1; Offset = Width = WidthContents = 0.0f; } }; // Storage for a tab bar (sizeof() 92~96 bytes) diff --git a/src/lib/geogram_gfx/third_party/ImGuiColorTextEdit/OLD/TextEditor.cpp b/src/lib/geogram_gfx/third_party/ImGuiColorTextEdit/OLD/TextEditor.cpp deleted file mode 100755 index 92e489f4..00000000 --- a/src/lib/geogram_gfx/third_party/ImGuiColorTextEdit/OLD/TextEditor.cpp +++ /dev/null @@ -1,2248 +0,0 @@ -#include - -// [Bruno Levy] replaced chrono with -// geogram stopwatch for now (some -// of our older compilers do not support -// chrono yet). -#include - -#include -#include -#include - -// [Bruno Levy] include path redirected to geogram. -#include -#include - -// [Bruno Levy] made syntax highlighting optional, -// deactivated for older compilers that do not have std::regex -#ifndef GEO_OLD_COMPILER -#include -#endif - -// [Bruno Levy] includes for GLFW, needed by new callbacks -// (for key constants). -#ifdef GEO_USE_SYSTEM_GLFW3 -#include -#else -#include -#endif - - -// [Bruno Levy] replaced std::equal() with local function -// so that we do not depend on C++ 2014 -namespace { - - template - bool my_equal( - ITERATOR1 b1, ITERATOR1 e1, - ITERATOR2 b2, ITERATOR2 e2, - PREDICATE pred - ) { - while( b1 != e1 && b2 != e2 ) { - if( !pred(*b1,*b2) ) { - return false; - } - ++b1; - ++b2; - } - return b1 == e1 && b2 == e2; - } - -#if defined(_MSC_VER) && _MSC_VER < 1900 -# define snprintf c99_snprintf -# define vsnprintf c99_vsnprintf - -__inline int c99_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap) { - int count = -1; - - if (size != 0) - count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap); - if (count == -1) - count = _vscprintf(format, ap); - - return count; -} - - __inline int c99_snprintf(char *outBuf, size_t size, const char *format, ...) { - int count; - va_list ap; - va_start(ap, format); - count = c99_vsnprintf(outBuf, size, format, ap); - va_end(ap); - return count; - } -#endif - - -} - -static const int cTextStart = 7; - -// TODO -// - multiline comments vs single-line: latter is blocking start of a ML -// - handle non-monospace fonts -// - handle unicode/utf -// - testing - -TextEditor::TextEditor() - : mLineSpacing(0.0f) - , mUndoIndex(0) - , mTabSize(4) - , mOverwrite(false) - , mReadOnly(false) - , mWithinRender(false) - , mScrollToCursor(false) - , mWordSelectionMode(false) - , mColorRangeMin(0) - , mColorRangeMax(0) - , mCheckMultilineComments(true) -{ - SetPalette(GetDarkPalette()); - SetLanguageDefinition(LanguageDefinition::HLSL()); - // [Bruno Levy] additional callback. - callback_ = nullptr; - callback_client_data_ = nullptr; -} - - -TextEditor::~TextEditor() -{ -} - -void TextEditor::SetLanguageDefinition(const LanguageDefinition & aLanguageDef) -{ - mLanguageDefinition = aLanguageDef; -// [Bruno Levy] made syntax highlighting optional -#ifndef GEO_OLD_COMPILER - mRegexList.clear(); - - for (auto& r : mLanguageDefinition.mTokenRegexStrings) - mRegexList.push_back(std::make_pair(std::regex(r.first, std::regex_constants::optimize), r.second)); -#endif -} - -void TextEditor::SetPalette(const Palette & aValue) -{ - mPalette = aValue; -} - -int TextEditor::AppendBuffer(std::string& aBuffer, char chr, int aIndex) -{ - if (chr != '\t') - { - aBuffer.push_back(chr); - return aIndex + 1; - } - else - { - auto num = mTabSize - aIndex % mTabSize; - for (int j = num; j > 0; --j) - aBuffer.push_back(' '); - return aIndex + num; - } -} - -std::string TextEditor::GetText(const Coordinates & aStart, const Coordinates & aEnd) const -{ - std::string result; - - int prevLineNo = aStart.mLine; - for (auto it = aStart; it <= aEnd; Advance(it)) - { - if (prevLineNo != it.mLine && it.mLine < (int) mLines.size()) - result.push_back('\n'); - - if (it == aEnd) - break; - - prevLineNo = it.mLine; - const auto& line = mLines[it.mLine]; - if (!line.empty() && it.mColumn < (int)line.size()) - result.push_back(line[it.mColumn].mChar); - } - - return result; -} - -std::string TextEditor::GetLine(int l) const { - std::string result; - if(l >= int(mLines.size())) { - return result; - } - const Line& line = mLines[l]; - for(int i=0; i= aStart); - assert(!mReadOnly); - - if (aEnd == aStart) - return; - - if (aStart.mLine == aEnd.mLine) - { - auto& line = mLines[aStart.mLine]; - if (aEnd.mColumn >= (int)line.size()) - line.erase(line.begin() + aStart.mColumn, line.end()); - else - line.erase(line.begin() + aStart.mColumn, line.begin() + aEnd.mColumn); - } - else - { - auto& firstLine = mLines[aStart.mLine]; - auto& lastLine = mLines[aEnd.mLine]; - - firstLine.erase(firstLine.begin() + aStart.mColumn, firstLine.end()); - lastLine.erase(lastLine.begin(), lastLine.begin() + aEnd.mColumn); - - if (aStart.mLine < aEnd.mLine) - firstLine.insert(firstLine.end(), lastLine.begin(), lastLine.end()); - - if (aStart.mLine < aEnd.mLine) - RemoveLine(aStart.mLine + 1, aEnd.mLine + 1); - } -} - -int TextEditor::InsertTextAt(Coordinates& /* inout */ aWhere, const char * aValue) -{ - assert(!mReadOnly); - - int totalLines = 0; - auto chr = *aValue; - while (chr != '\0') - { - if (mLines.empty()) - mLines.push_back(Line()); - - if (chr == '\r') - { - // skip - } - else if (chr == '\n') - { - if (aWhere.mColumn < (int)mLines[aWhere.mLine].size()) - { - auto& newLine = InsertLine(aWhere.mLine + 1); - auto& line = mLines[aWhere.mLine]; - newLine.insert(newLine.begin(), line.begin() + aWhere.mColumn, line.end()); - line.erase(line.begin() + aWhere.mColumn, line.end()); - } - else - { - InsertLine(aWhere.mLine + 1); - } - ++aWhere.mLine; - aWhere.mColumn = 0; - ++totalLines; - } - else - { - auto& line = mLines[aWhere.mLine]; - line.insert(line.begin() + aWhere.mColumn, Glyph(chr, PaletteIndex::Default)); - ++aWhere.mColumn; - } - chr = *(++aValue); - } - - return totalLines; -} - -void TextEditor::AddUndo(UndoRecord& aValue) -{ - assert(!mReadOnly); - - mUndoBuffer.resize(mUndoIndex + 1); - mUndoBuffer.back() = aValue; - ++mUndoIndex; -} - -TextEditor::Coordinates TextEditor::ScreenPosToCoordinates(const ImVec2& aPosition) const -{ - ImVec2 origin = ImGui::GetCursorScreenPos(); - ImVec2 local(aPosition.x - origin.x, aPosition.y - origin.y); - - int lineNo = std::max(0, (int)floor(local.y / mCharAdvance.y)); - int columnCoord = std::max(0, (int)floor(local.x / mCharAdvance.x) - cTextStart); - - int column = 0; - if (lineNo >= 0 && lineNo < (int)mLines.size()) - { - auto& line = mLines[lineNo]; - auto distance = 0; - while (distance < columnCoord && column < (int)line.size()) - { - if (line[column].mChar == '\t') - distance = (distance / mTabSize) * mTabSize + mTabSize; - else - ++distance; - ++column; - } - } - return Coordinates(lineNo, column); -} - -TextEditor::Coordinates TextEditor::FindWordStart(const Coordinates & aFrom) const -{ - Coordinates at = aFrom; - if (at.mLine >= (int)mLines.size()) - return at; - - auto& line = mLines[at.mLine]; - - if (at.mColumn >= (int)line.size()) - return at; - - auto cstart = (PaletteIndex)line[at.mColumn].mColorIndex; - while (at.mColumn > 0) - { - if (cstart != (PaletteIndex)line[at.mColumn - 1].mColorIndex) - break; - --at.mColumn; - } - return at; -} - -TextEditor::Coordinates TextEditor::FindWordEnd(const Coordinates & aFrom) const -{ - Coordinates at = aFrom; - if (at.mLine >= (int)mLines.size()) - return at; - - auto& line = mLines[at.mLine]; - - if (at.mColumn >= (int)line.size()) - return at; - - auto cstart = (PaletteIndex)line[at.mColumn].mColorIndex; - while (at.mColumn < (int)line.size()) - { - if (cstart != (PaletteIndex)line[at.mColumn].mColorIndex) - break; - ++at.mColumn; - } - return at; -} - -bool TextEditor::IsOnWordBoundary(const Coordinates & aAt) const -{ - if (aAt.mLine >= (int)mLines.size() || aAt.mColumn == 0) - return true; - - auto& line = mLines[aAt.mLine]; - if (aAt.mColumn >= (int)line.size()) - return true; - - return line[aAt.mColumn].mColorIndex != line[aAt.mColumn - 1].mColorIndex; -} - -void TextEditor::RemoveLine(int aStart, int aEnd) -{ - assert(!mReadOnly); - - ErrorMarkers etmp; - for (auto& i : mErrorMarkers) - { - ErrorMarkers::value_type e(i.first >= aStart ? i.first - 1 : i.first, i.second); - if (e.first >= aStart && e.first <= aEnd) - continue; - etmp.insert(e); - } - mErrorMarkers = std::move(etmp); - - Breakpoints btmp; - for (auto i : mBreakpoints) - { - if (i >= aStart && i <= aEnd) - continue; - btmp.insert(i >= aStart ? i - 1 : i); - } - mBreakpoints = std::move(btmp); - - mLines.erase(mLines.begin() + aStart, mLines.begin() + aEnd); - -} - -void TextEditor::RemoveLine(int aIndex) -{ - assert(!mReadOnly); - - ErrorMarkers etmp; - for (auto& i : mErrorMarkers) - { - ErrorMarkers::value_type e(i.first >= aIndex ? i.first - 1 : i.first, i.second); - if (e.first == aIndex) - continue; - etmp.insert(e); - } - mErrorMarkers = std::move(etmp); - - Breakpoints btmp; - for (auto i : mBreakpoints) - { - if (i == aIndex) - continue; - btmp.insert(i >= aIndex ? i - 1 : i); - } - mBreakpoints = std::move(btmp); - - mLines.erase(mLines.begin() + aIndex); -} - -TextEditor::Line& TextEditor::InsertLine(int aIndex) -{ - assert(!mReadOnly); - - auto& result = *mLines.insert(mLines.begin() + aIndex, Line()); - - ErrorMarkers etmp; - for (auto& i : mErrorMarkers) - etmp.insert(ErrorMarkers::value_type(i.first >= aIndex ? i.first + 1 : i.first, i.second)); - mErrorMarkers = std::move(etmp); - - Breakpoints btmp; - for (auto i : mBreakpoints) - btmp.insert(i >= aIndex ? i + 1 : i); - mBreakpoints = std::move(btmp); - - return result; -} - -std::string TextEditor::GetWordUnderCursor() const -{ - auto c = GetCursorPosition(); - return GetWordAt(c); -} - -std::string TextEditor::GetWordAt(const Coordinates & aCoords) const -{ - auto start = FindWordStart(aCoords); - auto end = FindWordEnd(aCoords); - - std::string r; - - for (auto it = start; it < end; Advance(it)) - r.push_back(mLines[it.mLine][it.mColumn].mChar); - - return r; -} - -void TextEditor::Render(const char* aTitle, const ImVec2& aSize, bool aBorder) -{ - mWithinRender = true; - - ImGuiIO& io = ImGui::GetIO(); - - // [Bruno Levy] read font size from current font (instead of default font) - ImGuiContext& g = *GImGui; - auto xadv = (g.Font->IndexAdvanceX['X']); - mCharAdvance = ImVec2(xadv, g.Font->FontSize + mLineSpacing); // TODO: apply pixel scaling for HiDPI displays. - - //[Bruno Levy] commented-out (I prefer to use default style) - // ImGui::PushStyleColor(ImGuiCol_ChildWindowBg, ImGui::ColorConvertU32ToFloat4(mPalette[(int)PaletteIndex::Background])); - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0.0f, 0.0f)); - //[Bruno Levy] added 'NoNav' flag - ImGui::BeginChild(aTitle, aSize, aBorder, ImGuiWindowFlags_HorizontalScrollbar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoNav); - - ImGui::PushAllowKeyboardFocus(true); - - auto shift = io.KeyShift; - auto ctrl = io.KeyCtrl; - auto alt = io.KeyAlt; - - if (ImGui::IsWindowFocused()) - { - if (ImGui::IsWindowHovered()) { - ImGui::SetMouseCursor(ImGuiMouseCursor_TextInput); - //ImGui::CaptureKeyboardFromApp(true); // [Bruno Levy] seems to be needed (to be checked) - ImGui::CaptureMouseFromApp(true); - } - - // [Bruno Levy] IsKeyPressed() supposes QWERTY ! - if (!IsReadOnly() && (ImGui::IsKeyPressed('Z') || ImGui::IsKeyPressed('W'))) - if (ctrl && !shift && !alt) - Undo(); - if (!IsReadOnly() && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Backspace))) - if (!ctrl && !shift && alt) - Undo(); - if (!IsReadOnly() && ctrl && !shift && !alt && ImGui::IsKeyPressed('Y')) - Redo(); - - if (!ctrl && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_UpArrow))) - MoveUp(1, shift); - else if (!ctrl && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_DownArrow))) - MoveDown(1, shift); - else if (!alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_LeftArrow))) - MoveLeft(1, shift, ctrl); - else if (!alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_RightArrow))) - MoveRight(1, shift, ctrl); - else if (!alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_PageUp))) - MoveUp(GetPageSize() - 4, shift); - else if (!alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_PageDown))) - MoveDown(GetPageSize() - 4, shift); - else if (!alt && ctrl && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Home))) - MoveTop(shift); - else if (ctrl && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_End))) - MoveBottom(shift); - else if (!ctrl && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Home))) - MoveHome(shift); - else if (!ctrl && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_End))) - MoveEnd(shift); - else if (!IsReadOnly() && !ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Delete))) - Delete(); - else if (!IsReadOnly() && !ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Backspace))) - BackSpace(); - else if (!ctrl && !shift && !alt && ImGui::IsKeyPressed(45)) - mOverwrite ^= true; - else if (ctrl && !shift && !alt && ImGui::IsKeyPressed(45)) - Copy(); - else if (ctrl && !shift && !alt && ImGui::IsKeyPressed('C')) - Copy(); - else if (!IsReadOnly() && !ctrl && shift && !alt && ImGui::IsKeyPressed(45)) - Paste(); - else if (!IsReadOnly() && ctrl && !shift && !alt && ImGui::IsKeyPressed('V')) - Paste(); - else if (ctrl && !shift && !alt && ImGui::IsKeyPressed('X')) - Cut(); - else if (!ctrl && shift && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Delete))) - Cut(); - else if(ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Enter))) { // [Bruno Levy] Seems that this was missing. - EnterCharacter('\n'); - } else if(ctrl && !shift && !alt && (ImGui::IsKeyPressed('A') || ImGui::IsKeyPressed('Q'))) { - // [Bruno Levy] select all - SetSelection(Coordinates(0,0), Coordinates(GetTotalLines(),0), false); - SetCursorPosition(Coordinates(GetTotalLines(),0)); - } - - // [Bruno Levy] additional callback - if(callback_ != nullptr){ - if (!ctrl && !shift && !alt && ImGui::IsKeyPressed(GLFW_KEY_F2)) { - callback_(TEXT_EDITOR_SAVE, callback_client_data_); - } - if (!ctrl && !shift && !alt && ImGui::IsKeyPressed(GLFW_KEY_F5)) { - callback_(TEXT_EDITOR_RUN, callback_client_data_); - } - if (ctrl && !shift && !alt && ImGui::IsKeyPressed('F')) { - callback_(TEXT_EDITOR_FIND, callback_client_data_); - } - if (ctrl && !shift && !alt && ImGui::IsKeyPressed('C') && !HasSelection()) { - callback_(TEXT_EDITOR_STOP, callback_client_data_); - } - if (!ctrl && !shift && !alt && ImGui::IsKeyPressed(GLFW_KEY_TAB)) { - callback_(TEXT_EDITOR_COMPLETION, callback_client_data_); - } - } - - if (!IsReadOnly()) - { - for (size_t i = 0; i < sizeof(io.InputCharacters) / sizeof(io.InputCharacters[0]); i++) - { - auto c = (unsigned char)io.InputCharacters[i]; - if (c != 0) - { - if (isprint(c) || isspace(c)) - { - if (c == '\r') - c = '\n'; - EnterCharacter((char)c); - } - } - } - } - } - - if (ImGui::IsWindowHovered()) - { - if (!shift && !alt) - { - if (ImGui::IsMouseClicked(0)) - { - mState.mCursorPosition = mInteractiveStart = mInteractiveEnd = SanitizeCoordinates(ScreenPosToCoordinates(ImGui::GetMousePos())); - if (ctrl) - mWordSelectionMode = true; - SetSelection(mInteractiveStart, mInteractiveEnd, mWordSelectionMode); - } - if (ImGui::IsMouseDoubleClicked(0) && !ctrl) - { - mState.mCursorPosition = mInteractiveStart = mInteractiveEnd = SanitizeCoordinates(ScreenPosToCoordinates(ImGui::GetMousePos())); - mWordSelectionMode = true; - SetSelection(mInteractiveStart, mInteractiveEnd, mWordSelectionMode); - } - else if (ImGui::IsMouseDragging(0) && ImGui::IsMouseDown(0)) - { - mState.mCursorPosition = mInteractiveEnd = SanitizeCoordinates(ScreenPosToCoordinates(ImGui::GetMousePos())); - SetSelection(mInteractiveStart, mInteractiveEnd, mWordSelectionMode); - } - } - - if (!ImGui::IsMouseDown(0)) - mWordSelectionMode = false; - } - - ColorizeInternal(); - - static std::string buffer; - auto contentSize = ImGui::GetWindowContentRegionMax(); - auto drawList = ImGui::GetWindowDrawList(); - int appendIndex = 0; - int longest = cTextStart; - - ImVec2 cursorScreenPos = ImGui::GetCursorScreenPos(); - auto scrollX = ImGui::GetScrollX(); - auto scrollY = ImGui::GetScrollY(); - - auto lineNo = (int)floor(scrollY / mCharAdvance.y); - auto lineMax = std::max(0, std::min((int)mLines.size() - 1, lineNo + (int)floor((scrollY + contentSize.y) / mCharAdvance.y))); - if (!mLines.empty()) - { - while (lineNo <= lineMax) - { - ImVec2 lineStartScreenPos = ImVec2(cursorScreenPos.x, cursorScreenPos.y + lineNo * mCharAdvance.y); - ImVec2 textScreenPos = ImVec2(lineStartScreenPos.x + mCharAdvance.x * cTextStart, lineStartScreenPos.y); - - auto& line = mLines[lineNo]; - longest = std::max(cTextStart + TextDistanceToLineStart(Coordinates(lineNo, (int) line.size())), longest); - auto columnNo = 0; - Coordinates lineStartCoord(lineNo, 0); - Coordinates lineEndCoord(lineNo, (int)line.size()); - - int sstart = -1; - int ssend = -1; - - assert(mState.mSelectionStart <= mState.mSelectionEnd); - if (mState.mSelectionStart <= lineEndCoord) - sstart = mState.mSelectionStart > lineStartCoord ? TextDistanceToLineStart(mState.mSelectionStart) : 0; - if (mState.mSelectionEnd > lineStartCoord) - ssend = TextDistanceToLineStart(mState.mSelectionEnd < lineEndCoord ? mState.mSelectionEnd : lineEndCoord); - - if (mState.mSelectionEnd.mLine > lineNo) - ++ssend; - - if (sstart != -1 && ssend != -1 && sstart < ssend) - { - ImVec2 vstart(lineStartScreenPos.x + (mCharAdvance.x) * (sstart + cTextStart), lineStartScreenPos.y); - ImVec2 vend(lineStartScreenPos.x + (mCharAdvance.x) * (ssend + cTextStart), lineStartScreenPos.y + mCharAdvance.y); - drawList->AddRectFilled(vstart, vend, mPalette[(int)PaletteIndex::Selection]); - } - - static char buf[16]; - - if (mBreakpoints.find(lineNo + 1) != mBreakpoints.end()) - { - auto end = ImVec2(lineStartScreenPos.x + contentSize.x, lineStartScreenPos.y + mCharAdvance.y); - drawList->AddRectFilled(lineStartScreenPos, end, mPalette[(int)PaletteIndex::Breakpoint]); - } - - auto errorIt = mErrorMarkers.find(lineNo + 1); - if (errorIt != mErrorMarkers.end()) - { - auto end = ImVec2(lineStartScreenPos.x + contentSize.x, lineStartScreenPos.y + mCharAdvance.y); - drawList->AddRectFilled(lineStartScreenPos, end, mPalette[(int)PaletteIndex::ErrorMarker]); - - if (ImGui::IsMouseHoveringRect(lineStartScreenPos, end)) - { - // [Bruno Levy] changed font and color for error messages. - ImGui::BeginTooltip(); - ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[0]); - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 0.2f, 0.2f, 1.0f)); - ImGui::Text("Error at line %d:", errorIt->first); - ImGui::Separator(); - ImGui::Text("%s", errorIt->second.c_str()); - ImGui::PopStyleColor(); - ImGui::PopFont(); - ImGui::EndTooltip(); - } - } - - snprintf(buf, 16, "%6d", lineNo + 1); - drawList->AddText(ImVec2(lineStartScreenPos.x /*+ mCharAdvance.x * 1*/, lineStartScreenPos.y), mPalette[(int)PaletteIndex::LineNumber], buf); - - if (mState.mCursorPosition.mLine == lineNo) - { - auto focused = ImGui::IsWindowFocused(); - - if (!HasSelection()) - { - auto start = ImVec2(lineStartScreenPos.x + scrollX, lineStartScreenPos.y); - auto end = ImVec2(start.x + contentSize.x + scrollX, start.y + mCharAdvance.y); - drawList->AddRectFilled(start, end, mPalette[(int)(focused ? PaletteIndex::CurrentLineFill : PaletteIndex::CurrentLineFillInactive)]); - drawList->AddRect(start, end, mPalette[(int)PaletteIndex::CurrentLineEdge], 1.0f); - } - - int cx = TextDistanceToLineStart(mState.mCursorPosition); - - if (focused) - { - // [Bruno Levy] replaced chrono with - // geogram stopwatch for now (some - // of our older compilers do not support - // chrono yet). - - static double timeStart = GEO::SystemStopwatch::now(); - double timeEnd = GEO::SystemStopwatch::now(); - int elapsed = int((timeEnd - timeStart)*1000); - - if (elapsed > 400) - { - ImVec2 cstart(lineStartScreenPos.x + mCharAdvance.x * (cx + cTextStart), lineStartScreenPos.y); - ImVec2 cend(lineStartScreenPos.x + mCharAdvance.x * (cx + cTextStart) + (mOverwrite ? mCharAdvance.x : 1.0f), lineStartScreenPos.y + mCharAdvance.y); - drawList->AddRectFilled(cstart, cend, mPalette[(int)PaletteIndex::Cursor]); - if (elapsed > 800) - timeStart = timeEnd; - } - } - } - - appendIndex = 0; - auto prevColor = line.empty() ? PaletteIndex::Default : (line[0].mMultiLineComment ? PaletteIndex::MultiLineComment : line[0].mColorIndex); - - for (auto& glyph : line) - { - auto color = glyph.mMultiLineComment ? PaletteIndex::MultiLineComment : glyph.mColorIndex; - - if (color != prevColor && !buffer.empty()) - { - drawList->AddText(textScreenPos, mPalette[(uint8_t)prevColor], buffer.c_str()); - textScreenPos.x += mCharAdvance.x * buffer.length(); - buffer.clear(); - prevColor = color; - } - appendIndex = AppendBuffer(buffer, glyph.mChar, appendIndex); - ++columnNo; - } - - if (!buffer.empty()) - { - drawList->AddText(textScreenPos, mPalette[(uint8_t)prevColor], buffer.c_str()); - buffer.clear(); - } - appendIndex = 0; - lineStartScreenPos.y += mCharAdvance.y; - textScreenPos.x = lineStartScreenPos.x + mCharAdvance.x * cTextStart; - textScreenPos.y = lineStartScreenPos.y; - ++lineNo; - } - - // [Bruno Levy] My tooltips (work in progress) - if(ImGui::IsWindowHovered() && callback_ != nullptr) { - ImVec2 mouse = ImGui::GetMousePos(); - ImVec2 origin = ImGui::GetCursorScreenPos(); - if(mouse.y > origin.y) { - Coordinates coord = ScreenPosToCoordinates(ImGui::GetMousePos()); - // Display tooltip only if there is not already an error tooltip - // to display. - if(mErrorMarkers.find(coord.mLine + 1) == mErrorMarkers.end()) { - word_context_ = GetWordContextAt(coord); - if(!word_context_.empty() && word_context_ != " ") { - callback_(TEXT_EDITOR_TOOLTIP, callback_client_data_); - } - } - } - } - - /* // [Bruno Levy] Commented-out (just get 'built-in function', not very interesting). - // TODO: try getting meta-information from GOM and displaying it in tooltips. - auto id = GetWordAt(ScreenPosToCoordinates(ImGui::GetMousePos())); - if (!id.empty()) - { - auto it = mLanguageDefinition.mIdentifiers.find(id); - if (it != mLanguageDefinition.mIdentifiers.end()) - { - ImGui::BeginTooltip(); - ImGui::TextUnformatted(it->second.mDeclaration.c_str()); - ImGui::EndTooltip(); - } - else - { - auto pi = mLanguageDefinition.mPreprocIdentifiers.find(id); - if (pi != mLanguageDefinition.mPreprocIdentifiers.end()) - { - ImGui::BeginTooltip(); - ImGui::TextUnformatted(pi->second.mDeclaration.c_str()); - ImGui::EndTooltip(); - } - } - } - */ - } - - - ImGui::Dummy(ImVec2((longest + 2) * mCharAdvance.x, mLines.size() * mCharAdvance.y)); - - if (mScrollToCursor) - { - EnsureCursorVisible(); - // ImGui::SetWindowFocus(); // [Bruno Levy] commented-out because this breaks my - mScrollToCursor = false; - } - - ImGui::PopAllowKeyboardFocus(); - ImGui::EndChild(); - ImGui::PopStyleVar(); -// [Bruno Levy] Commented out because I'd rather use the default style. -// ImGui::PopStyleColor(); - - mWithinRender = false; -} - -void TextEditor::SetText(const std::string & aText) -{ - mLines.clear(); - for (auto chr : aText) - { - if (mLines.empty()) - mLines.push_back(Line()); - if (chr == '\n') - mLines.push_back(Line()); - else - { - mLines.back().push_back(Glyph(chr, PaletteIndex::Default)); - } - } - - mUndoBuffer.clear(); - - Colorize(); - - if(callback_ != nullptr) { - callback_(TEXT_EDITOR_TEXT_CHANGED, callback_client_data_); - } -} - -void TextEditor::EnterCharacter(Char aChar) -{ - assert(!mReadOnly); - - // [Bruno Levy] clear error markers whenever text is entered. - mErrorMarkers.clear(); - - UndoRecord u; - - u.mBefore = mState; - - if (HasSelection()) - { - u.mRemoved = GetSelectedText(); - u.mRemovedStart = mState.mSelectionStart; - u.mRemovedEnd = mState.mSelectionEnd; - DeleteSelection(); - } - - auto coord = GetActualCursorCoordinates(); - u.mAddedStart = coord; - - if (mLines.empty()) - mLines.push_back(Line()); - - if (aChar == '\n') - { - InsertLine(coord.mLine + 1); - auto& line = mLines[coord.mLine]; - auto& newLine = mLines[coord.mLine + 1]; - newLine.insert(newLine.begin(), line.begin() + coord.mColumn, line.end()); - line.erase(line.begin() + coord.mColumn, line.begin() + line.size()); - mState.mCursorPosition = Coordinates(coord.mLine + 1, 0); - } - else - { - auto& line = mLines[coord.mLine]; - if (mOverwrite && (int)line.size() < coord.mColumn) - line[coord.mColumn] = Glyph(aChar, PaletteIndex::Default); - else - line.insert(line.begin() + coord.mColumn, Glyph(aChar, PaletteIndex::Default)); - mState.mCursorPosition = coord; - ++mState.mCursorPosition.mColumn; - } - - u.mAdded = aChar; - u.mAddedEnd = GetActualCursorCoordinates(); - u.mAfter = mState; - - AddUndo(u); - - Colorize(coord.mLine - 1, 3); - EnsureCursorVisible(); - - if(callback_ != nullptr) { - callback_(TEXT_EDITOR_TEXT_CHANGED, callback_client_data_); - } -} - -void TextEditor::SetReadOnly(bool aValue) -{ - mReadOnly = aValue; -} - -void TextEditor::SetCursorPosition(const Coordinates & aPosition) -{ - if (mState.mCursorPosition != aPosition) - { - mState.mCursorPosition = aPosition; - EnsureCursorVisible(); - } -} - -void TextEditor::SetSelectionStart(const Coordinates & aPosition) -{ - mState.mSelectionStart = SanitizeCoordinates(aPosition); - if (mState.mSelectionStart > mState.mSelectionEnd) - std::swap(mState.mSelectionStart, mState.mSelectionEnd); -} - -void TextEditor::SetSelectionEnd(const Coordinates & aPosition) -{ - mState.mSelectionEnd = SanitizeCoordinates(aPosition); - if (mState.mSelectionStart > mState.mSelectionEnd) - std::swap(mState.mSelectionStart, mState.mSelectionEnd); -} - -void TextEditor::SetSelection(const Coordinates & aStart, const Coordinates & aEnd, bool aWordMode) -{ - mState.mSelectionStart = SanitizeCoordinates(aStart); - mState.mSelectionEnd = SanitizeCoordinates(aEnd); - if (aStart > aEnd) - std::swap(mState.mSelectionStart, mState.mSelectionEnd); - - if (aWordMode) - { - mState.mSelectionStart = FindWordStart(mState.mSelectionStart); - if (!IsOnWordBoundary(mState.mSelectionEnd)) - mState.mSelectionEnd = FindWordEnd(FindWordStart(mState.mSelectionEnd)); - } -} - -void TextEditor::InsertText(const std::string & aValue) -{ - InsertText(aValue.c_str()); -} - -void TextEditor::InsertText(const char * aValue) -{ - if (aValue == nullptr) - return; - - auto pos = GetActualCursorCoordinates(); - auto start = std::min(pos, mState.mSelectionStart); - int totalLines = pos.mLine - start.mLine; - - totalLines += InsertTextAt(pos, aValue); - - SetSelection(pos, pos); - SetCursorPosition(pos); - Colorize(start.mLine - 1, totalLines + 2); -} - -void TextEditor::DeleteSelection() -{ - assert(mState.mSelectionEnd >= mState.mSelectionStart); - - if (mState.mSelectionEnd == mState.mSelectionStart) - return; - - DeleteRange(mState.mSelectionStart, mState.mSelectionEnd); - - SetSelection(mState.mSelectionStart, mState.mSelectionStart); - SetCursorPosition(mState.mSelectionStart); - Colorize(mState.mSelectionStart.mLine, 1); - - if(callback_ != nullptr) { - callback_(TEXT_EDITOR_TEXT_CHANGED, callback_client_data_); - } -} - -void TextEditor::MoveUp(int aAmount, bool aSelect) -{ - auto oldPos = mState.mCursorPosition; - mState.mCursorPosition.mLine = std::max(0, mState.mCursorPosition.mLine - aAmount); - if (oldPos != mState.mCursorPosition) - { - if (aSelect) - { - if (oldPos == mInteractiveStart) - mInteractiveStart = mState.mCursorPosition; - else if (oldPos == mInteractiveEnd) - mInteractiveEnd = mState.mCursorPosition; - else - { - mInteractiveStart = mState.mCursorPosition; - mInteractiveEnd = oldPos; - } - } - else - mInteractiveStart = mInteractiveEnd = mState.mCursorPosition; - SetSelection(mInteractiveStart, mInteractiveEnd); - - EnsureCursorVisible(); - } -} - -void TextEditor::MoveDown(int aAmount, bool aSelect) -{ - assert(mState.mCursorPosition.mColumn >= 0); - auto oldPos = mState.mCursorPosition; - mState.mCursorPosition.mLine = std::max(0, std::min((int)mLines.size() - 1, mState.mCursorPosition.mLine + aAmount)); - - if (mState.mCursorPosition != oldPos) - { - if (aSelect) - { - if (oldPos == mInteractiveEnd) - mInteractiveEnd = mState.mCursorPosition; - else if (oldPos == mInteractiveStart) - mInteractiveStart = mState.mCursorPosition; - else - { - mInteractiveStart = oldPos; - mInteractiveEnd = mState.mCursorPosition; - } - } - else - mInteractiveStart = mInteractiveEnd = mState.mCursorPosition; - SetSelection(mInteractiveStart, mInteractiveEnd); - - EnsureCursorVisible(); - } -} - -void TextEditor::MoveLeft(int aAmount, bool aSelect, bool aWordMode) -{ - if (mLines.empty()) - return; - - auto oldPos = mState.mCursorPosition; - mState.mCursorPosition = GetActualCursorCoordinates(); - - while (aAmount-- > 0) - { - if (mState.mCursorPosition.mColumn == 0) - { - if (mState.mCursorPosition.mLine > 0) - { - --mState.mCursorPosition.mLine; - mState.mCursorPosition.mColumn = (int)mLines[mState.mCursorPosition.mLine].size(); - } - } - else - { - mState.mCursorPosition.mColumn = std::max(0, mState.mCursorPosition.mColumn - 1); - if (aWordMode) - mState.mCursorPosition = FindWordStart(mState.mCursorPosition); - } - } - - assert(mState.mCursorPosition.mColumn >= 0); - if (aSelect) - { - if (oldPos == mInteractiveStart) - mInteractiveStart = mState.mCursorPosition; - else if (oldPos == mInteractiveEnd) - mInteractiveEnd = mState.mCursorPosition; - else - { - mInteractiveStart = mState.mCursorPosition; - mInteractiveEnd = oldPos; - } - } - else - mInteractiveStart = mInteractiveEnd = mState.mCursorPosition; - SetSelection(mInteractiveStart, mInteractiveEnd, aSelect && aWordMode); - - EnsureCursorVisible(); -} - -void TextEditor::MoveRight(int aAmount, bool aSelect, bool aWordMode) -{ - auto oldPos = mState.mCursorPosition; - - if (mLines.empty()) - return; - - while (aAmount-- > 0) - { - auto& line = mLines[mState.mCursorPosition.mLine]; - if (mState.mCursorPosition.mColumn >= (int)line.size()) - { - mState.mCursorPosition.mLine = std::max(0, std::min((int)mLines.size() - 1, mState.mCursorPosition.mLine + 1)); - mState.mCursorPosition.mColumn = 0; - } - else - { - mState.mCursorPosition.mColumn = std::max(0, std::min((int)line.size(), mState.mCursorPosition.mColumn + 1)); - if (aWordMode) - mState.mCursorPosition = FindWordEnd(mState.mCursorPosition); - } - } - - if (aSelect) - { - if (oldPos == mInteractiveEnd) - mInteractiveEnd = SanitizeCoordinates(mState.mCursorPosition); - else if (oldPos == mInteractiveStart) - mInteractiveStart = mState.mCursorPosition; - else - { - mInteractiveStart = oldPos; - mInteractiveEnd = mState.mCursorPosition; - } - } - else - mInteractiveStart = mInteractiveEnd = mState.mCursorPosition; - SetSelection(mInteractiveStart, mInteractiveEnd, aSelect && aWordMode); - - EnsureCursorVisible(); -} - -void TextEditor::MoveTop(bool aSelect) -{ - auto oldPos = mState.mCursorPosition; - SetCursorPosition(Coordinates(0, 0)); - - if (mState.mCursorPosition != oldPos) - { - if (aSelect) - { - mInteractiveEnd = oldPos; - mInteractiveStart = mState.mCursorPosition; - } - else - mInteractiveStart = mInteractiveEnd = mState.mCursorPosition; - SetSelection(mInteractiveStart, mInteractiveEnd); - } -} - -void TextEditor::MoveBottom(bool aSelect) -{ - auto oldPos = GetCursorPosition(); - auto newPos = Coordinates((int)mLines.size() - 1, 0); - SetCursorPosition(newPos); - if (aSelect) - { - mInteractiveStart = oldPos; - mInteractiveEnd = newPos; - } - else - mInteractiveStart = mInteractiveEnd = newPos; - SetSelection(mInteractiveStart, mInteractiveEnd); -} - -void TextEditor::MoveHome(bool aSelect) -{ - auto oldPos = mState.mCursorPosition; - SetCursorPosition(Coordinates(mState.mCursorPosition.mLine, 0)); - - if (mState.mCursorPosition != oldPos) - { - if (aSelect) - { - if (oldPos == mInteractiveStart) - mInteractiveStart = mState.mCursorPosition; - else if (oldPos == mInteractiveEnd) - mInteractiveEnd = mState.mCursorPosition; - else - { - mInteractiveStart = mState.mCursorPosition; - mInteractiveEnd = oldPos; - } - } - else - mInteractiveStart = mInteractiveEnd = mState.mCursorPosition; - SetSelection(mInteractiveStart, mInteractiveEnd); - } -} - -void TextEditor::MoveEnd(bool aSelect) -{ - auto oldPos = mState.mCursorPosition; - SetCursorPosition(Coordinates(mState.mCursorPosition.mLine, (int)mLines[oldPos.mLine].size())); - - if (mState.mCursorPosition != oldPos) - { - if (aSelect) - { - if (oldPos == mInteractiveEnd) - mInteractiveEnd = mState.mCursorPosition; - else if (oldPos == mInteractiveStart) - mInteractiveStart = mState.mCursorPosition; - else - { - mInteractiveStart = oldPos; - mInteractiveEnd = mState.mCursorPosition; - } - } - else - mInteractiveStart = mInteractiveEnd = mState.mCursorPosition; - SetSelection(mInteractiveStart, mInteractiveEnd); - } -} - -void TextEditor::Delete() -{ - assert(!mReadOnly); - - // [Bruno Levy] clear error markers whenever text is entered. - mErrorMarkers.clear(); - - if (mLines.empty()) - return; - - UndoRecord u; - u.mBefore = mState; - - if (HasSelection()) - { - u.mRemoved = GetSelectedText(); - u.mRemovedStart = mState.mSelectionStart; - u.mRemovedEnd = mState.mSelectionEnd; - - DeleteSelection(); - } - else - { - auto pos = GetActualCursorCoordinates(); - SetCursorPosition(pos); - auto& line = mLines[pos.mLine]; - - if (pos.mColumn == (int)line.size()) - { - if (pos.mLine == (int)mLines.size() - 1) - return; - - u.mRemoved = '\n'; - u.mRemovedStart = u.mRemovedEnd = GetActualCursorCoordinates(); - Advance(u.mRemovedEnd); - - auto& nextLine = mLines[pos.mLine + 1]; - line.insert(line.end(), nextLine.begin(), nextLine.end()); - RemoveLine(pos.mLine + 1); - } - else - { - u.mRemoved = line[pos.mColumn].mChar; - u.mRemovedStart = u.mRemovedEnd = GetActualCursorCoordinates(); - u.mRemovedEnd.mColumn++; - - line.erase(line.begin() + pos.mColumn); - } - - Colorize(pos.mLine, 1); - } - - u.mAfter = mState; - AddUndo(u); -} - -void TextEditor::BackSpace() -{ - assert(!mReadOnly); - - // [Bruno Levy] clear error markers whenever text is entered. - mErrorMarkers.clear(); - - if (mLines.empty()) - return; - - if (HasSelection()) - DeleteSelection(); - else - { - mState.mCursorPosition = GetActualCursorCoordinates(); - if (mState.mCursorPosition.mColumn == 0) - { - if (mState.mCursorPosition.mLine == 0) - return; - - auto& line = mLines[mState.mCursorPosition.mLine]; - auto& prevLine = mLines[mState.mCursorPosition.mLine - 1]; - auto prevSize = (int)prevLine.size(); - prevLine.insert(prevLine.end(), line.begin(), line.end()); - RemoveLine(mState.mCursorPosition.mLine); - --mState.mCursorPosition.mLine; - mState.mCursorPosition.mColumn = prevSize; - } - else - { - auto& line = mLines[mState.mCursorPosition.mLine]; - --mState.mCursorPosition.mColumn; - if (mState.mCursorPosition.mColumn < (int)line.size()) - line.erase(line.begin() + mState.mCursorPosition.mColumn); - } - EnsureCursorVisible(); - Colorize(mState.mCursorPosition.mLine, 1); - } -} - -void TextEditor::SelectWordUnderCursor() -{ - auto c = GetCursorPosition(); - SetSelection(FindWordStart(c), FindWordEnd(c)); -} - -bool TextEditor::HasSelection() const -{ - return mState.mSelectionEnd > mState.mSelectionStart; -} - -void TextEditor::Copy() -{ - if (HasSelection()) - { - ImGui::SetClipboardText(GetSelectedText().c_str()); - } - else - { - if (!mLines.empty()) - { - std::string str; - auto& line = mLines[GetActualCursorCoordinates().mLine]; - for (auto& g : line) - str.push_back(g.mChar); - ImGui::SetClipboardText(str.c_str()); - } - } -} - -void TextEditor::Cut() -{ - if (IsReadOnly()) - { - Copy(); - } - else - { - if (HasSelection()) - { - UndoRecord u; - u.mBefore = mState; - u.mRemoved = GetSelectedText(); - u.mRemovedStart = mState.mSelectionStart; - u.mRemovedEnd = mState.mSelectionEnd; - - Copy(); - DeleteSelection(); - - u.mAfter = mState; - AddUndo(u); - } - } -} - -void TextEditor::Paste() -{ - auto clipText = ImGui::GetClipboardText(); - if (clipText != nullptr && strlen(clipText) > 0) - { - UndoRecord u; - u.mBefore = mState; - - if (HasSelection()) - { - u.mRemoved = GetSelectedText(); - u.mRemovedStart = mState.mSelectionStart; - u.mRemovedEnd = mState.mSelectionEnd; - DeleteSelection(); - } - - u.mAdded = clipText; - u.mAddedStart = GetActualCursorCoordinates(); - - InsertText(clipText); - - u.mAddedEnd = GetActualCursorCoordinates(); - u.mAfter = mState; - AddUndo(u); - } - - if(callback_ != nullptr) { - callback_(TEXT_EDITOR_TEXT_CHANGED, callback_client_data_); - } -} - -bool TextEditor::CanUndo() const -{ - return mUndoIndex > 0; -} - -bool TextEditor::CanRedo() const -{ - return mUndoIndex < (int)mUndoBuffer.size(); -} - -void TextEditor::Undo(int aSteps) -{ - while (CanUndo() && aSteps-- > 0) - mUndoBuffer[--mUndoIndex].Undo(this); -} - -void TextEditor::Redo(int aSteps) -{ - while (CanRedo() && aSteps-- > 0) - mUndoBuffer[mUndoIndex++].Redo(this); -} - -const TextEditor::Palette & TextEditor::GetDarkPalette() -{ - // [Bruno Levy] separated declaration of values - // for older compilers. - static unsigned int data[] = { - 0xffffffff, // None - 0xffd69c56, // Keyword - 0xff00ff00, // Number - 0xff7070e0, // String - 0xff70a0e0, // Char literal - 0xffffffff, // Punctuation - 0xff409090, // Preprocessor - 0xffaaaaaa, // Identifier - 0xff9bc64d, // Known identifier - 0xffc040a0, // Preproc identifier - 0xff20A020, // Comment (single line) [BL]: A0 instead of 60, else it's too dark. - 0xff40A020, // Comment (multi line) [BL]: A0 instead of 60, else it's too dark. - 0xff101010, // Background - 0xffe0e0e0, // Cursor - 0x80a06020, // Selection - 0x800020ff, // ErrorMarker - 0x40f08000, // Breakpoint - 0xff707000, // Line number - 0x40000000, // Current line fill - 0x40808080, // Current line fill (inactive) - 0x40a0a0a0, // Current line edge - }; - static Palette p; - for(unsigned int i=0; i<(unsigned)PaletteIndex::Max; ++i) { - p[i] = data[i]; - } - return p; -} - -const TextEditor::Palette & TextEditor::GetLightPalette() -{ - // [Bruno Levy] separated declaration of values - // for older compilers. - static unsigned int data[] = { - 0xff000000, // None - 0xffff0c06, // Keyword - 0xff008000, // Number - 0xff2020a0, // String - 0xff304070, // Char literal - 0xff000000, // Punctuation - 0xff409090, // Preprocessor - 0xff404040, // Identifier - 0xff606010, // Known identifier - 0xffc040a0, // Preproc identifier - 0xff205020, // Comment (single line) - 0xff405020, // Comment (multi line) - 0xffffffff, // Background - 0xff000000, // Cursor - 0x80600000, // Selection - 0xa00010ff, // ErrorMarker - 0x80f08000, // Breakpoint - 0xff505000, // Line number - 0x40000000, // Current line fill - 0x40808080, // Current line fill (inactive) - 0x40000000, // Current line edge - }; - static Palette p; - for(unsigned int i=0; i<(unsigned)PaletteIndex::Max; ++i) { - p[i] = data[i]; - } - return p; -} - -std::string TextEditor::GetText() const -{ - return GetText(Coordinates(), Coordinates((int)mLines.size(), 0)); -} - -std::string TextEditor::GetSelectedText() const -{ - return GetText(mState.mSelectionStart, mState.mSelectionEnd); -} - -void TextEditor::ProcessInputs() -{ -} - -void TextEditor::Colorize(int aFromLine, int aLines) -{ - int toLine = aLines == -1 ? (int)mLines.size() : std::min((int)mLines.size(), aFromLine + aLines); - mColorRangeMin = std::min(mColorRangeMin, aFromLine); - mColorRangeMax = std::max(mColorRangeMax, toLine); - mColorRangeMin = std::max(0, mColorRangeMin); - mColorRangeMax = std::max(mColorRangeMin, mColorRangeMax); - mCheckMultilineComments = true; -} - -void TextEditor::ColorizeRange(int aFromLine, int aToLine) -{ -// [Bruno Levy] made syntax highlighting optional -#ifdef GEO_OLD_COMPILER - (void)aFromLine; // Silence arg not used warning - (void)aToLine; -#else - if (mLines.empty() || aFromLine >= aToLine) - return; - - std::string buffer; - int endLine = std::max(0, std::min((int)mLines.size(), aToLine)); - for (int i = aFromLine; i < endLine; ++i) - { - bool preproc = false; - auto& line = mLines[i]; - buffer.clear(); - for (auto g : mLines[i]) - { - buffer.push_back(g.mChar); - g.mColorIndex = PaletteIndex::Default; - } - - std::match_results results; - auto last = buffer.cend(); - for (auto first = buffer.cbegin(); first != last; ++first) - { - for (auto& p : mRegexList) - { - if (std::regex_search(first, last, results, p.first, std::regex_constants::match_continuous)) - { - auto v = *results.begin(); - auto start = v.first - buffer.begin(); - auto end = v.second - buffer.begin(); - auto id = buffer.substr(start, end - start); - auto color = p.second; - if (color == PaletteIndex::Identifier) - { - if (!mLanguageDefinition.mCaseSensitive) - std::transform(id.begin(), id.end(), id.begin(), ::toupper); - - if (!preproc) - { - if (mLanguageDefinition.mKeywords.find(id) != mLanguageDefinition.mKeywords.end()) - color = PaletteIndex::Keyword; - else if (mLanguageDefinition.mIdentifiers.find(id) != mLanguageDefinition.mIdentifiers.end()) - color = PaletteIndex::KnownIdentifier; - else if (mLanguageDefinition.mPreprocIdentifiers.find(id) != mLanguageDefinition.mPreprocIdentifiers.end()) - color = PaletteIndex::PreprocIdentifier; - } - else - { - if (mLanguageDefinition.mPreprocIdentifiers.find(id) != mLanguageDefinition.mPreprocIdentifiers.end()) - color = PaletteIndex::PreprocIdentifier; - else - color = PaletteIndex::Identifier; - } - } - else if (color == PaletteIndex::Preprocessor) - { - preproc = true; - } - for (int j = (int)start; j < (int)end; ++j) - line[j].mColorIndex = color; - first += end - start - 1; - break; - } - } - } - } -#endif -} - -void TextEditor::ColorizeInternal() -{ - if (mLines.empty()) - return; - - if (mCheckMultilineComments) - { - auto end = Coordinates((int)mLines.size(), 0); - auto commentStart = end; - auto withinString = false; - for (auto i = Coordinates(0, 0); i < end; Advance(i)) - { - auto& line = mLines[i.mLine]; - if (!line.empty()) - { - auto g = line[i.mColumn]; - auto c = g.mChar; - - bool inComment = commentStart <= i; - - if (withinString) - { - line[i.mColumn].mMultiLineComment = inComment; - - if (c == '\"') - { - if (i.mColumn + 1 < (int)line.size() && line[i.mColumn + 1].mChar == '\"') - { - Advance(i); - if (i.mColumn < (int)line.size()) - line[i.mColumn].mMultiLineComment = inComment; - } - else - withinString = false; - } - else if (c == '\\') - { - Advance(i); - if (i.mColumn < (int)line.size()) - line[i.mColumn].mMultiLineComment = inComment; - } - } - else - { - if (c == '\"') - { - withinString = true; - line[i.mColumn].mMultiLineComment = inComment; - } - else - { - auto pred = [](const char& a, const Glyph& b) { return a == b.mChar; }; - auto from = line.begin() + i.mColumn; - auto& startStr = mLanguageDefinition.mCommentStart; - - // [Bruno Levy] replaced std::equal with my_equal (2 occurences) - - if (i.mColumn + startStr.size() <= line.size() && - my_equal(startStr.begin(), startStr.end(), from, from + startStr.size(), pred)) - commentStart = i; - - inComment = commentStart <= i; - - line[i.mColumn].mMultiLineComment = inComment; - - auto& endStr = mLanguageDefinition.mCommentEnd; - if (i.mColumn + 1 >= (int)endStr.size() && - my_equal(endStr.begin(), endStr.end(), from + 1 - endStr.size(), from + 1, pred)) - commentStart = end; - } - } - } - } - mCheckMultilineComments = false; - return; - } - - if (mColorRangeMin < mColorRangeMax) - { - int to = std::min(mColorRangeMin + 10, mColorRangeMax); - ColorizeRange(mColorRangeMin, to); - mColorRangeMin = to; - - if (mColorRangeMax == mColorRangeMin) - { - mColorRangeMin = std::numeric_limits::max(); - mColorRangeMax = 0; - } - return; - } -} - -int TextEditor::TextDistanceToLineStart(const Coordinates& aFrom) const -{ - auto& line = mLines[aFrom.mLine]; - auto len = 0; - for (size_t it = 0u; it < line.size() && it < (unsigned)aFrom.mColumn; ++it) - len = line[it].mChar == '\t' ? (len / mTabSize) * mTabSize + mTabSize : len + 1; - return len; -} - -void TextEditor::EnsureCursorVisible() -{ - if (!mWithinRender) - { - mScrollToCursor = true; - return; - } - - float scrollX = ImGui::GetScrollX(); - float scrollY = ImGui::GetScrollY(); - - auto height = ImGui::GetWindowHeight(); - auto width = ImGui::GetWindowWidth(); - - auto top = 1 + (int)ceil(scrollY / mCharAdvance.y); - auto bottom = (int)ceil((scrollY + height) / mCharAdvance.y); - - auto left = (int)ceil(scrollX / mCharAdvance.x); - auto right = (int)ceil((scrollX + width) / mCharAdvance.x); - - auto pos = GetActualCursorCoordinates(); - auto len = TextDistanceToLineStart(pos); - - if (pos.mLine < top) - ImGui::SetScrollY(std::max(0.0f, (pos.mLine - 1) * mCharAdvance.y)); - if (pos.mLine > bottom - 4) - ImGui::SetScrollY(std::max(0.0f, (pos.mLine + 4) * mCharAdvance.y - height)); - if (len + cTextStart < left + 4) - ImGui::SetScrollX(std::max(0.0f, (len + cTextStart - 4) * mCharAdvance.x)); - if (len + cTextStart > right - 4) - ImGui::SetScrollX(std::max(0.0f, (len + cTextStart + 4) * mCharAdvance.x - width)); -} - -int TextEditor::GetPageSize() const -{ - auto height = ImGui::GetWindowHeight() - 20.0f; - return (int)floor(height / mCharAdvance.y); -} - -TextEditor::UndoRecord::UndoRecord( - const std::string& aAdded, - const TextEditor::Coordinates aAddedStart, - const TextEditor::Coordinates aAddedEnd, - const std::string& aRemoved, - const TextEditor::Coordinates aRemovedStart, - const TextEditor::Coordinates aRemovedEnd, - TextEditor::EditorState& aBefore, - TextEditor::EditorState& aAfter) - : mAdded(aAdded) - , mAddedStart(aAddedStart) - , mAddedEnd(aAddedEnd) - , mRemoved(aRemoved) - , mRemovedStart(aRemovedStart) - , mRemovedEnd(aRemovedEnd) - , mBefore(aBefore) - , mAfter(aAfter) -{ - assert(mAddedStart <= mAddedEnd); - assert(mRemovedStart <= mRemovedEnd); -} - -void TextEditor::UndoRecord::Undo(TextEditor * aEditor) -{ - if (!mAdded.empty()) - { - aEditor->DeleteRange(mAddedStart, mAddedEnd); - aEditor->Colorize(mAddedStart.mLine - 1, mAddedEnd.mLine - mAddedStart.mLine + 2); - } - - if (!mRemoved.empty()) - { - auto start = mRemovedStart; - aEditor->InsertTextAt(start, mRemoved.c_str()); - aEditor->Colorize(mRemovedStart.mLine - 1, mRemovedEnd.mLine - mRemovedStart.mLine + 2); - } - - aEditor->mState = mBefore; - aEditor->EnsureCursorVisible(); - -} - -void TextEditor::UndoRecord::Redo(TextEditor * aEditor) -{ - if (!mRemoved.empty()) - { - aEditor->DeleteRange(mRemovedStart, mRemovedEnd); - aEditor->Colorize(mRemovedStart.mLine - 1, mRemovedEnd.mLine - mRemovedStart.mLine + 1); - } - - if (!mAdded.empty()) - { - auto start = mAddedStart; - aEditor->InsertTextAt(start, mAdded.c_str()); - aEditor->Colorize(mAddedStart.mLine - 1, mAddedEnd.mLine - mAddedStart.mLine + 1); - } - - aEditor->mState = mAfter; - aEditor->EnsureCursorVisible(); -} - -TextEditor::LanguageDefinition TextEditor::LanguageDefinition::CPlusPlus() -{ - static bool inited = false; - static LanguageDefinition langDef; - if (!inited) - { - static const char* const cppKeywords[] = { - "alignas", "alignof", "and", "and_eq", "asm", "atomic_cancel", "atomic_commit", "atomic_noexcept", "auto", "bitand", "bitor", "bool", "break", "case", "catch", "char", "char16_t", "char32_t", "class", - "compl", "concept", "const", "constexpr", "const_cast", "continue", "decltype", "default", "delete", "do", "double", "dynamic_cast", "else", "enum", "explicit", "export", "extern", "false", "float", - "for", "friend", "goto", "if", "import", "inline", "int", "long", "module", "mutable", "namespace", "new", "noexcept", "not", "not_eq", "nullptr", "operator", "or", "or_eq", "private", "protected", "public", - "register", "reinterpret_cast", "requires", "return", "short", "signed", "sizeof", "static", "static_assert", "static_cast", "struct", "switch", "synchronized", "template", "this", "thread_local", - "throw", "true", "try", "typedef", "typeid", "typename", "union", "unsigned", "using", "virtual", "void", "volatile", "wchar_t", "while", "xor", "xor_eq" - }; - for (auto& k : cppKeywords) - langDef.mKeywords.insert(k); - - static const char* const identifiers[] = { - "abort", "abs", "acos", "asin", "atan", "atexit", "atof", "atoi", "atol", "ceil", "clock", "cosh", "ctime", "div", "exit", "fabs", "floor", "fmod", "getchar", "getenv", "isalnum", "isalpha", "isdigit", "isgraph", - "ispunct", "isspace", "isupper", "kbhit", "log10", "log2", "log", "memcmp", "modf", "pow", "printf", "sprintf", "snprintf", "putchar", "putenv", "puts", "rand", "remove", "rename", "sinh", "sqrt", "srand", "strcat", "strcmp", "strerror", "time", "tolower", "toupper", - "std", "string", "vector", "map", "unordered_map", "set", "unordered_set", "min", "max" - }; - for (auto& k : identifiers) - { - Identifier id; - id.mDeclaration = "Built-in function"; - langDef.mIdentifiers.insert(std::make_pair(std::string(k), id)); - } - - langDef.mTokenRegexStrings.push_back(std::make_pair("//.*", PaletteIndex::Comment)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[ \t]*#[ \\t]*[a-zA-Z_]+", PaletteIndex::Preprocessor)); - langDef.mTokenRegexStrings.push_back(std::make_pair("L?\\\"(\\\\.|[^\\\"])*\\\"", PaletteIndex::String)); - langDef.mTokenRegexStrings.push_back(std::make_pair("\\'\\\\?[^\\']\\'", PaletteIndex::CharLiteral)); - langDef.mTokenRegexStrings.push_back(std::make_pair("0[xX][0-9a-fA-F]+[uU]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)([eE][+-]?[0-9]+)?[fF]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("0[0-7]+[Uu]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[+-]?[0-9]+[Uu]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[a-zA-Z_][a-zA-Z0-9_]*", PaletteIndex::Identifier)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[\\[\\]\\{\\}\\!\\%\\^\\&\\*\\(\\)\\-\\+\\=\\~\\|\\<\\>\\?\\/\\;\\,\\.]", PaletteIndex::Punctuation)); - - langDef.mCommentStart = "/*"; - langDef.mCommentEnd = "*/"; - - langDef.mCaseSensitive = true; - - langDef.mName = "C++"; - - inited = true; - } - return langDef; -} - -TextEditor::LanguageDefinition TextEditor::LanguageDefinition::HLSL() -{ - static bool inited = false; - static LanguageDefinition langDef; - if (!inited) - { - static const char* const keywords[] = { - "AppendStructuredBuffer", "asm", "asm_fragment", "BlendState", "bool", "break", "Buffer", "ByteAddressBuffer", "case", "cbuffer", "centroid", "class", "column_major", "compile", "compile_fragment", - "CompileShader", "const", "continue", "ComputeShader", "ConsumeStructuredBuffer", "default", "DepthStencilState", "DepthStencilView", "discard", "do", "double", "DomainShader", "dword", "else", - "export", "extern", "false", "float", "for", "fxgroup", "GeometryShader", "groupshared", "half", "Hullshader", "if", "in", "inline", "inout", "InputPatch", "int", "interface", "line", "lineadj", - "linear", "LineStream", "matrix", "min16float", "min10float", "min16int", "min12int", "min16uint", "namespace", "nointerpolation", "noperspective", "NULL", "out", "OutputPatch", "packoffset", - "pass", "pixelfragment", "PixelShader", "point", "PointStream", "precise", "RasterizerState", "RenderTargetView", "return", "register", "row_major", "RWBuffer", "RWByteAddressBuffer", "RWStructuredBuffer", - "RWTexture1D", "RWTexture1DArray", "RWTexture2D", "RWTexture2DArray", "RWTexture3D", "sample", "sampler", "SamplerState", "SamplerComparisonState", "shared", "snorm", "stateblock", "stateblock_state", - "static", "string", "struct", "switch", "StructuredBuffer", "tbuffer", "technique", "technique10", "technique11", "texture", "Texture1D", "Texture1DArray", "Texture2D", "Texture2DArray", "Texture2DMS", - "Texture2DMSArray", "Texture3D", "TextureCube", "TextureCubeArray", "true", "typedef", "triangle", "triangleadj", "TriangleStream", "uint", "uniform", "unorm", "unsigned", "vector", "vertexfragment", - "VertexShader", "void", "volatile", "while", - "bool1","bool2","bool3","bool4","double1","double2","double3","double4", "float1", "float2", "float3", "float4", "int1", "int2", "int3", "int4", "in", "out", "inout", - "uint1", "uint2", "uint3", "uint4", "dword1", "dword2", "dword3", "dword4", "half1", "half2", "half3", "half4", - "float1x1","float2x1","float3x1","float4x1","float1x2","float2x2","float3x2","float4x2", - "float1x3","float2x3","float3x3","float4x3","float1x4","float2x4","float3x4","float4x4", - "half1x1","half2x1","half3x1","half4x1","half1x2","half2x2","half3x2","half4x2", - "half1x3","half2x3","half3x3","half4x3","half1x4","half2x4","half3x4","half4x4", - }; - for (auto& k : keywords) - langDef.mKeywords.insert(k); - - static const char* const identifiers[] = { - "abort", "abs", "acos", "all", "AllMemoryBarrier", "AllMemoryBarrierWithGroupSync", "any", "asdouble", "asfloat", "asin", "asint", "asint", "asuint", - "asuint", "atan", "atan2", "ceil", "CheckAccessFullyMapped", "clamp", "clip", "cos", "cosh", "countbits", "cross", "D3DCOLORtoUBYTE4", "ddx", - "ddx_coarse", "ddx_fine", "ddy", "ddy_coarse", "ddy_fine", "degrees", "determinant", "DeviceMemoryBarrier", "DeviceMemoryBarrierWithGroupSync", - "distance", "dot", "dst", "errorf", "EvaluateAttributeAtCentroid", "EvaluateAttributeAtSample", "EvaluateAttributeSnapped", "exp", "exp2", - "f16tof32", "f32tof16", "faceforward", "firstbithigh", "firstbitlow", "floor", "fma", "fmod", "frac", "frexp", "fwidth", "GetRenderTargetSampleCount", - "GetRenderTargetSamplePosition", "GroupMemoryBarrier", "GroupMemoryBarrierWithGroupSync", "InterlockedAdd", "InterlockedAnd", "InterlockedCompareExchange", - "InterlockedCompareStore", "InterlockedExchange", "InterlockedMax", "InterlockedMin", "InterlockedOr", "InterlockedXor", "isfinite", "isinf", "isnan", - "ldexp", "length", "lerp", "lit", "log", "log10", "log2", "mad", "max", "min", "modf", "msad4", "mul", "noise", "normalize", "pow", "printf", - "Process2DQuadTessFactorsAvg", "Process2DQuadTessFactorsMax", "Process2DQuadTessFactorsMin", "ProcessIsolineTessFactors", "ProcessQuadTessFactorsAvg", - "ProcessQuadTessFactorsMax", "ProcessQuadTessFactorsMin", "ProcessTriTessFactorsAvg", "ProcessTriTessFactorsMax", "ProcessTriTessFactorsMin", - "radians", "rcp", "reflect", "refract", "reversebits", "round", "rsqrt", "saturate", "sign", "sin", "sincos", "sinh", "smoothstep", "sqrt", "step", - "tan", "tanh", "tex1D", "tex1D", "tex1Dbias", "tex1Dgrad", "tex1Dlod", "tex1Dproj", "tex2D", "tex2D", "tex2Dbias", "tex2Dgrad", "tex2Dlod", "tex2Dproj", - "tex3D", "tex3D", "tex3Dbias", "tex3Dgrad", "tex3Dlod", "tex3Dproj", "texCUBE", "texCUBE", "texCUBEbias", "texCUBEgrad", "texCUBElod", "texCUBEproj", "transpose", "trunc" - }; - for (auto& k : identifiers) - { - Identifier id; - id.mDeclaration = "Built-in function"; - langDef.mIdentifiers.insert(std::make_pair(std::string(k), id)); - } - - langDef.mTokenRegexStrings.push_back(std::make_pair("//.*", PaletteIndex::Comment)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[ \t]*#[ \\t]*[a-zA-Z_]+", PaletteIndex::Preprocessor)); - langDef.mTokenRegexStrings.push_back(std::make_pair("L?\\\"(\\\\.|[^\\\"])*\\\"", PaletteIndex::String)); - langDef.mTokenRegexStrings.push_back(std::make_pair("\\'\\\\?[^\\']\\'", PaletteIndex::CharLiteral)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)([eE][+-]?[0-9]+)?[fF]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[+-]?[0-9]+[Uu]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("0[0-7]+[Uu]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("0[xX][0-9a-fA-F]+[uU]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[a-zA-Z_][a-zA-Z0-9_]*", PaletteIndex::Identifier)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[\\[\\]\\{\\}\\!\\%\\^\\&\\*\\(\\)\\-\\+\\=\\~\\|\\<\\>\\?\\/\\;\\,\\.]", PaletteIndex::Punctuation)); - - langDef.mCommentStart = "/*"; - langDef.mCommentEnd = "*/"; - - langDef.mCaseSensitive = true; - - langDef.mName = "HLSL"; - - inited = true; - } - return langDef; -} - -TextEditor::LanguageDefinition TextEditor::LanguageDefinition::GLSL() -{ - static bool inited = false; - static LanguageDefinition langDef; - if (!inited) - { - static const char* const keywords[] = { - "auto", "break", "case", "char", "const", "continue", "default", "do", "double", "else", "enum", "extern", "float", "for", "goto", "if", "inline", "int", "long", "register", "restrict", "return", "short", - "signed", "sizeof", "static", "struct", "switch", "typedef", "union", "unsigned", "void", "volatile", "while", "_Alignas", "_Alignof", "_Atomic", "_Bool", "_Complex", "_Generic", "_Imaginary", - "_Noreturn", "_Static_assert", "_Thread_local" - }; - for (auto& k : keywords) - langDef.mKeywords.insert(k); - - static const char* const identifiers[] = { - "abort", "abs", "acos", "asin", "atan", "atexit", "atof", "atoi", "atol", "ceil", "clock", "cosh", "ctime", "div", "exit", "fabs", "floor", "fmod", "getchar", "getenv", "isalnum", "isalpha", "isdigit", "isgraph", - "ispunct", "isspace", "isupper", "kbhit", "log10", "log2", "log", "memcmp", "modf", "pow", "putchar", "putenv", "puts", "rand", "remove", "rename", "sinh", "sqrt", "srand", "strcat", "strcmp", "strerror", "time", "tolower", "toupper" - }; - for (auto& k : identifiers) - { - Identifier id; - id.mDeclaration = "Built-in function"; - langDef.mIdentifiers.insert(std::make_pair(std::string(k), id)); - } - - langDef.mTokenRegexStrings.push_back(std::make_pair("//.*", PaletteIndex::Comment)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[ \t]*#[ \\t]*[a-zA-Z_]+", PaletteIndex::Preprocessor)); - langDef.mTokenRegexStrings.push_back(std::make_pair("L?\\\"(\\\\.|[^\\\"])*\\\"", PaletteIndex::String)); - langDef.mTokenRegexStrings.push_back(std::make_pair("\\'\\\\?[^\\']\\'", PaletteIndex::CharLiteral)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)([eE][+-]?[0-9]+)?[fF]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[+-]?[0-9]+[Uu]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("0[0-7]+[Uu]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("0[xX][0-9a-fA-F]+[uU]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[a-zA-Z_][a-zA-Z0-9_]*", PaletteIndex::Identifier)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[\\[\\]\\{\\}\\!\\%\\^\\&\\*\\(\\)\\-\\+\\=\\~\\|\\<\\>\\?\\/\\;\\,\\.]", PaletteIndex::Punctuation)); - - langDef.mCommentStart = "/*"; - langDef.mCommentEnd = "*/"; - - langDef.mCaseSensitive = true; - - langDef.mName = "GLSL"; - - inited = true; - } - return langDef; -} - -TextEditor::LanguageDefinition TextEditor::LanguageDefinition::C() -{ - static bool inited = false; - static LanguageDefinition langDef; - if (!inited) - { - static const char* const keywords[] = { - "auto", "break", "case", "char", "const", "continue", "default", "do", "double", "else", "enum", "extern", "float", "for", "goto", "if", "inline", "int", "long", "register", "restrict", "return", "short", - "signed", "sizeof", "static", "struct", "switch", "typedef", "union", "unsigned", "void", "volatile", "while", "_Alignas", "_Alignof", "_Atomic", "_Bool", "_Complex", "_Generic", "_Imaginary", - "_Noreturn", "_Static_assert", "_Thread_local" - }; - for (auto& k : keywords) - langDef.mKeywords.insert(k); - - static const char* const identifiers[] = { - "abort", "abs", "acos", "asin", "atan", "atexit", "atof", "atoi", "atol", "ceil", "clock", "cosh", "ctime", "div", "exit", "fabs", "floor", "fmod", "getchar", "getenv", "isalnum", "isalpha", "isdigit", "isgraph", - "ispunct", "isspace", "isupper", "kbhit", "log10", "log2", "log", "memcmp", "modf", "pow", "putchar", "putenv", "puts", "rand", "remove", "rename", "sinh", "sqrt", "srand", "strcat", "strcmp", "strerror", "time", "tolower", "toupper" - }; - for (auto& k : identifiers) - { - Identifier id; - id.mDeclaration = "Built-in function"; - langDef.mIdentifiers.insert(std::make_pair(std::string(k), id)); - } - - langDef.mTokenRegexStrings.push_back(std::make_pair("//.*", PaletteIndex::Comment)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[ \t]*#[ \\t]*[a-zA-Z_]+", PaletteIndex::Preprocessor)); - langDef.mTokenRegexStrings.push_back(std::make_pair("L?\\\"(\\\\.|[^\\\"])*\\\"", PaletteIndex::String)); - langDef.mTokenRegexStrings.push_back(std::make_pair("\\'\\\\?[^\\']\\'", PaletteIndex::CharLiteral)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)([eE][+-]?[0-9]+)?[fF]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[+-]?[0-9]+[Uu]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("0[0-7]+[Uu]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("0[xX][0-9a-fA-F]+[uU]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[a-zA-Z_][a-zA-Z0-9_]*", PaletteIndex::Identifier)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[\\[\\]\\{\\}\\!\\%\\^\\&\\*\\(\\)\\-\\+\\=\\~\\|\\<\\>\\?\\/\\;\\,\\.]", PaletteIndex::Punctuation)); - - langDef.mCommentStart = "/*"; - langDef.mCommentEnd = "*/"; - - langDef.mCaseSensitive = true; - - langDef.mName = "C"; - - inited = true; - } - return langDef; -} - -TextEditor::LanguageDefinition TextEditor::LanguageDefinition::SQL() -{ - static bool inited = false; - static LanguageDefinition langDef; - if (!inited) - { - static const char* const keywords[] = { - "ADD", "EXCEPT", "PERCENT", "ALL", "EXEC", "PLAN", "ALTER", "EXECUTE", "PRECISION", "AND", "EXISTS", "PRIMARY", "ANY", "EXIT", "PRINT", "AS", "FETCH", "PROC", "ASC", "FILE", "PROCEDURE", - "AUTHORIZATION", "FILLFACTOR", "PUBLIC", "BACKUP", "FOR", "RAISERROR", "BEGIN", "FOREIGN", "READ", "BETWEEN", "FREETEXT", "READTEXT", "BREAK", "FREETEXTTABLE", "RECONFIGURE", - "BROWSE", "FROM", "REFERENCES", "BULK", "FULL", "REPLICATION", "BY", "FUNCTION", "RESTORE", "CASCADE", "GOTO", "RESTRICT", "CASE", "GRANT", "RETURN", "CHECK", "GROUP", "REVOKE", - "CHECKPOINT", "HAVING", "RIGHT", "CLOSE", "HOLDLOCK", "ROLLBACK", "CLUSTERED", "IDENTITY", "ROWCOUNT", "COALESCE", "IDENTITY_INSERT", "ROWGUIDCOL", "COLLATE", "IDENTITYCOL", "RULE", - "COLUMN", "IF", "SAVE", "COMMIT", "IN", "SCHEMA", "COMPUTE", "INDEX", "SELECT", "CONSTRAINT", "INNER", "SESSION_USER", "CONTAINS", "INSERT", "SET", "CONTAINSTABLE", "INTERSECT", "SETUSER", - "CONTINUE", "INTO", "SHUTDOWN", "CONVERT", "IS", "SOME", "CREATE", "JOIN", "STATISTICS", "CROSS", "KEY", "SYSTEM_USER", "CURRENT", "KILL", "TABLE", "CURRENT_DATE", "LEFT", "TEXTSIZE", - "CURRENT_TIME", "LIKE", "THEN", "CURRENT_TIMESTAMP", "LINENO", "TO", "CURRENT_USER", "LOAD", "TOP", "CURSOR", "NATIONAL", "TRAN", "DATABASE", "NOCHECK", "TRANSACTION", - "DBCC", "NONCLUSTERED", "TRIGGER", "DEALLOCATE", "NOT", "TRUNCATE", "DECLARE", "NULL", "TSEQUAL", "DEFAULT", "NULLIF", "UNION", "DELETE", "OF", "UNIQUE", "DENY", "OFF", "UPDATE", - "DESC", "OFFSETS", "UPDATETEXT", "DISK", "ON", "USE", "DISTINCT", "OPEN", "USER", "DISTRIBUTED", "OPENDATASOURCE", "VALUES", "DOUBLE", "OPENQUERY", "VARYING","DROP", "OPENROWSET", "VIEW", - "DUMMY", "OPENXML", "WAITFOR", "DUMP", "OPTION", "WHEN", "ELSE", "OR", "WHERE", "END", "ORDER", "WHILE", "ERRLVL", "OUTER", "WITH", "ESCAPE", "OVER", "WRITETEXT" - }; - - for (auto& k : keywords) - langDef.mKeywords.insert(k); - - static const char* const identifiers[] = { - "ABS", "ACOS", "ADD_MONTHS", "ASCII", "ASCIISTR", "ASIN", "ATAN", "ATAN2", "AVG", "BFILENAME", "BIN_TO_NUM", "BITAND", "CARDINALITY", "CASE", "CAST", "CEIL", "CHARTOROWID", "CHR", "COALESCE", "COMPOSE", "CONCAT", "CONVERT", "CORR", "COS", "COSH", "COUNT", "COVAR_POP", "COVAR_SAMP", "CUME_DIST", "CURRENT_DATE", "CURRENT_TIMESTAMP", "DBTIMEZONE", "DECODE", "DECOMPOSE", "DENSE_RANK", "DUMP", "EMPTY_BLOB", "EMPTY_CLOB", "EXP", "EXTRACT", "FIRST_VALUE", "FLOOR", "FROM_TZ", "GREATEST", "GROUP_ID", "HEXTORAW", "INITCAP", "INSTR", "INSTR2", "INSTR4", "INSTRB", "INSTRC", "LAG", "LAST_DAY", "LAST_VALUE", "LEAD", "LEAST", "LENGTH", "LENGTH2", "LENGTH4", "LENGTHB", "LENGTHC", "LISTAGG", "LN", "LNNVL", "LOCALTIMESTAMP", "LOG", "LOWER", "LPAD", "LTRIM", "MAX", "MEDIAN", "MIN", "MOD", "MONTHS_BETWEEN", "NANVL", "NCHR", "NEW_TIME", "NEXT_DAY", "NTH_VALUE", "NULLIF", "NUMTODSINTERVAL", "NUMTOYMINTERVAL", "NVL", "NVL2", "POWER", "RANK", "RAWTOHEX", "REGEXP_COUNT", "REGEXP_INSTR", "REGEXP_REPLACE", "REGEXP_SUBSTR", "REMAINDER", "REPLACE", "ROUND", "ROWNUM", "RPAD", "RTRIM", "SESSIONTIMEZONE", "SIGN", "SIN", "SINH", "SOUNDEX", "SQRT", "STDDEV", "SUBSTR", "SUM", "SYS_CONTEXT", "SYSDATE", "SYSTIMESTAMP", "TAN", "TANH", "TO_CHAR", "TO_CLOB", "TO_DATE", "TO_DSINTERVAL", "TO_LOB", "TO_MULTI_BYTE", "TO_NCLOB", "TO_NUMBER", "TO_SINGLE_BYTE", "TO_TIMESTAMP", "TO_TIMESTAMP_TZ", "TO_YMINTERVAL", "TRANSLATE", "TRIM", "TRUNC", "TZ_OFFSET", "UID", "UPPER", "USER", "USERENV", "VAR_POP", "VAR_SAMP", "VARIANCE", "VSIZE " - }; - for (auto& k : identifiers) - { - Identifier id; - id.mDeclaration = "Built-in function"; - langDef.mIdentifiers.insert(std::make_pair(std::string(k), id)); - } - - langDef.mTokenRegexStrings.push_back(std::make_pair("\\-\\-.*", PaletteIndex::Comment)); - langDef.mTokenRegexStrings.push_back(std::make_pair("L?\\\"(\\\\.|[^\\\"])*\\\"", PaletteIndex::String)); - langDef.mTokenRegexStrings.push_back(std::make_pair("\\\'[^\\\']*\\\'", PaletteIndex::String)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)([eE][+-]?[0-9]+)?[fF]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[+-]?[0-9]+[Uu]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("0[0-7]+[Uu]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("0[xX][0-9a-fA-F]+[uU]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[a-zA-Z_][a-zA-Z0-9_]*", PaletteIndex::Identifier)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[\\[\\]\\{\\}\\!\\%\\^\\&\\*\\(\\)\\-\\+\\=\\~\\|\\<\\>\\?\\/\\;\\,\\.]", PaletteIndex::Punctuation)); - - langDef.mCommentStart = "/*"; - langDef.mCommentEnd = "*/"; - - langDef.mCaseSensitive = false; - - langDef.mName = "SQL"; - - inited = true; - } - return langDef; -} - -TextEditor::LanguageDefinition TextEditor::LanguageDefinition::AngelScript() -{ - static bool inited = false; - static LanguageDefinition langDef; - if (!inited) - { - static const char* const keywords[] = { - "and", "abstract", "auto", "bool", "break", "case", "cast", "class", "const", "continue", "default", "do", "double", "else", "enum", "false", "final", "float", "for", - "from", "funcdef", "function", "get", "if", "import", "in", "inout", "int", "interface", "int8", "int16", "int32", "int64", "is", "mixin", "namespace", "not", - "null", "or", "out", "override", "private", "protected", "return", "set", "shared", "super", "switch", "this ", "true", "typedef", "uint", "uint8", "uint16", "uint32", - "uint64", "void", "while", "xor" - }; - - for (auto& k : keywords) - langDef.mKeywords.insert(k); - - static const char* const identifiers[] = { - "cos", "sin", "tab", "acos", "asin", "atan", "atan2", "cosh", "sinh", "tanh", "log", "log10", "pow", "sqrt", "abs", "ceil", "floor", "fraction", "closeTo", "fpFromIEEE", "fpToIEEE", - "complex", "opEquals", "opAddAssign", "opSubAssign", "opMulAssign", "opDivAssign", "opAdd", "opSub", "opMul", "opDiv" - }; - for (auto& k : identifiers) - { - Identifier id; - id.mDeclaration = "Built-in function"; - langDef.mIdentifiers.insert(std::make_pair(std::string(k), id)); - } - - langDef.mTokenRegexStrings.push_back(std::make_pair("//.*", PaletteIndex::Comment)); - langDef.mTokenRegexStrings.push_back(std::make_pair("L?\\\"(\\\\.|[^\\\"])*\\\"", PaletteIndex::String)); - langDef.mTokenRegexStrings.push_back(std::make_pair("\\'\\\\?[^\\']\\'", PaletteIndex::String)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)([eE][+-]?[0-9]+)?[fF]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[+-]?[0-9]+[Uu]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("0[0-7]+[Uu]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("0[xX][0-9a-fA-F]+[uU]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[a-zA-Z_][a-zA-Z0-9_]*", PaletteIndex::Identifier)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[\\[\\]\\{\\}\\!\\%\\^\\&\\*\\(\\)\\-\\+\\=\\~\\|\\<\\>\\?\\/\\;\\,\\.]", PaletteIndex::Punctuation)); - - langDef.mCommentStart = "/*"; - langDef.mCommentEnd = "*/"; - - langDef.mCaseSensitive = true; - - langDef.mName = "AngelScript"; - - inited = true; - } - return langDef; -} - -TextEditor::LanguageDefinition TextEditor::LanguageDefinition::Lua() -{ - static bool inited = false; - static LanguageDefinition langDef; - if (!inited) - { - static const char* const keywords[] = { - "and", "break", "do", "", "else", "elseif", "end", "false", "for", "function", "if", "in", "", "local", "nil", "not", "or", "repeat", "return", "then", "true", "until", "while" - }; - - for (auto& k : keywords) - langDef.mKeywords.insert(k); - - static const char* const identifiers[] = { - "assert", "collectgarbage", "dofile", "error", "getmetatable", "ipairs", "loadfile", "load", "loadstring", "next", "pairs", "pcall", "print", "rawequal", "rawlen", "rawget", "rawset", - "select", "setmetatable", "tonumber", "tostring", "type", "xpcall", "_G", "_VERSION","arshift", "band", "bnot", "bor", "bxor", "btest", "extract", "lrotate", "lshift", "replace", - "rrotate", "rshift", "create", "resume", "running", "status", "wrap", "yield", "isyieldable", "debug","getuservalue", "gethook", "getinfo", "getlocal", "getregistry", "getmetatable", - "getupvalue", "upvaluejoin", "upvalueid", "setuservalue", "sethook", "setlocal", "setmetatable", "setupvalue", "traceback", "close", "flush", "input", "lines", "open", "output", "popen", - "read", "tmpfile", "type", "write", "close", "flush", "lines", "read", "seek", "setvbuf", "write", "__gc", "__tostring", "abs", "acos", "asin", "atan", "ceil", "cos", "deg", "exp", "tointeger", - "floor", "fmod", "ult", "log", "max", "min", "modf", "rad", "random", "randomseed", "sin", "sqrt", "string", "tan", "type", "atan2", "cosh", "sinh", "tanh", - "pow", "frexp", "ldexp", "log10", "pi", "huge", "maxinteger", "mininteger", "loadlib", "searchpath", "seeall", "preload", "cpath", "path", "searchers", "loaded", "module", "require", "clock", - "date", "difftime", "execute", "exit", "getenv", "remove", "rename", "setlocale", "time", "tmpname", "byte", "char", "dump", "find", "format", "gmatch", "gsub", "len", "lower", "match", "rep", - "reverse", "sub", "upper", "pack", "packsize", "unpack", "concat", "maxn", "insert", "pack", "unpack", "remove", "move", "sort", "offset", "codepoint", "char", "len", "codes", "charpattern", - "coroutine", "table", "io", "os", "string", "utf8", "bit32", "math", "debug", "package" - }; - for (auto& k : identifiers) - { - Identifier id; - id.mDeclaration = "Built-in function"; - langDef.mIdentifiers.insert(std::make_pair(std::string(k), id)); - } - - langDef.mTokenRegexStrings.push_back(std::make_pair("\\-\\-.*", PaletteIndex::Comment)); - langDef.mTokenRegexStrings.push_back(std::make_pair("L?\\\"(\\\\.|[^\\\"])*\\\"", PaletteIndex::String)); - langDef.mTokenRegexStrings.push_back(std::make_pair("\\\'[^\\\']*\\\'", PaletteIndex::String)); - langDef.mTokenRegexStrings.push_back(std::make_pair("0[xX][0-9a-fA-F]+[uU]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)([eE][+-]?[0-9]+)?[fF]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[+-]?[0-9]+[Uu]?[lL]?[lL]?", PaletteIndex::Number)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[a-zA-Z_][a-zA-Z0-9_]*", PaletteIndex::Identifier)); - langDef.mTokenRegexStrings.push_back(std::make_pair("[\\[\\]\\{\\}\\!\\%\\^\\&\\*\\(\\)\\-\\+\\=\\~\\|\\<\\>\\?\\/\\;\\,\\.]", PaletteIndex::Punctuation)); - - langDef.mCommentStart = "\\-\\-\\[\\["; - langDef.mCommentEnd = "\\]\\]"; - - langDef.mCaseSensitive = true; - - langDef.mName = "Lua"; - - inited = true; - } - return langDef; -} - -/****************************************************/ - -// [Bruno Levy] additional function for finding the context for tooltips -// -// TODO: more subtle detection of function parameters versus result of -// function call, depending of where the mouse pointer is. - -bool TextEditor::IsWordContextBoundary(char c) const { - return - c == ' ' || - c == '\t' || - c == ',' || - c == '(' || - c == ')' || - c == '=' ; - ; -} - -TextEditor::Coordinates TextEditor::FindWordContextStart(const Coordinates& aFrom) const { - Coordinates at = aFrom; - if (at.mLine >= (int)mLines.size()) { - return at; - } - - auto& line = mLines[at.mLine]; - - if (at.mColumn >= (int)line.size()) { - return at; - } - - while (at.mColumn > 0) { - if(IsWordContextBoundary(line[at.mColumn - 1].mChar)) { - break; - } - --at.mColumn; - } - return at; -} - -TextEditor::Coordinates TextEditor::FindWordContextEnd(const Coordinates& aFrom) const { - Coordinates at = aFrom; - if (at.mLine >= (int)mLines.size()) { - return at; - } - - auto& line = mLines[at.mLine]; - - if (at.mColumn >= (int)line.size()) { - return at; - } - - while (at.mColumn < (int)line.size()) { - if(IsWordContextBoundary(line[at.mColumn].mChar)) { - break; - } - ++at.mColumn; - } - return at; -} - -std::string TextEditor::GetWordContextAt(const Coordinates & aCoords) const { - std::string r; - - if(aCoords.mLine >= int(mLines.size())) { - return r; - } - - // Test if we are inside a comment - { - int pos = -1; - const Line& L = mLines[aCoords.mLine]; - for(int i=0; i+1 < int(L.size()); ++i) { - if(L[i].mChar == '-' && L[i+1].mChar == '-') { - pos = i; - break; - } - } - if(pos != -1 && aCoords.mColumn > pos) { - return r; - } - } - - auto start = FindWordContextStart(aCoords); - auto end = FindWordContextEnd(aCoords); - for (auto it = start; it < end; Advance(it)) { - r.push_back(mLines[it.mLine][it.mColumn].mChar); - } - return r; -} - - - - - diff --git a/src/lib/geogram_gfx/third_party/ImGuiColorTextEdit/OLD/TextEditor.h b/src/lib/geogram_gfx/third_party/ImGuiColorTextEdit/OLD/TextEditor.h deleted file mode 100755 index f54b3311..00000000 --- a/src/lib/geogram_gfx/third_party/ImGuiColorTextEdit/OLD/TextEditor.h +++ /dev/null @@ -1,445 +0,0 @@ -#pragma once - -// [Bruno Levy] For the older compilers that does not have -// regex support, uncomment to deactivate syntax highlighting -// #define GEO_OLD_COMPILER - -#include -#include -#include -#include - -#ifndef GEO_OLD_COMPILER -#include -#include -#include -#include -#else -#include -namespace std { - - /** - * \brief Minimal drop-in replacement for class std::array. - */ - template class array { - public: - typedef array thisclass; - - array() { - } - - array(const thisclass& rhs) { - for(unsigned int i=0; i inline const T& move(const T& x) { - return x; - } - -} -#endif - -// [Bruno Levy] include path redirected to geogram. -#include -#include - -// [Bruno Levy] additional callback type. -enum TextEditorAction { - TEXT_EDITOR_RUN, TEXT_EDITOR_SAVE, - TEXT_EDITOR_FIND, TEXT_EDITOR_STOP, - TEXT_EDITOR_TOOLTIP, - TEXT_EDITOR_COMPLETION, - TEXT_EDITOR_TEXT_CHANGED -}; - -typedef void (*TextEditorCallback)( - TextEditorAction action, void* client_data -); - -class GEOGRAM_GFX_API TextEditor -{ -public: - enum class PaletteIndex : uint8_t - { - Default, - Keyword, - Number, - String, - CharLiteral, - Punctuation, - Preprocessor, - Identifier, - KnownIdentifier, - PreprocIdentifier, - Comment, - MultiLineComment, - Background, - Cursor, - Selection, - ErrorMarker, - Breakpoint, - LineNumber, - CurrentLineFill, - CurrentLineFillInactive, - CurrentLineEdge, - Max - }; - - struct Breakpoint - { - int mLine; - bool mEnabled; - std::string mCondition; - - Breakpoint() - : mLine(-1) - , mEnabled(false) - {} - }; - - struct Coordinates - { - int mLine, mColumn; - Coordinates() : mLine(0), mColumn(0) {} - Coordinates(int aLine, int aColumn) : mLine(aLine), mColumn(aColumn) - { - assert(aLine >= 0); - assert(aColumn >= 0); - } - static Coordinates Invalid() { static Coordinates invalid(-1, -1); return invalid; } - - bool operator ==(const Coordinates& o) const - { - return - mLine == o.mLine && - mColumn == o.mColumn; - } - - bool operator !=(const Coordinates& o) const - { - return - mLine != o.mLine || - mColumn != o.mColumn; - } - - bool operator <(const Coordinates& o) const - { - if (mLine != o.mLine) - return mLine < o.mLine; - return mColumn < o.mColumn; - } - - bool operator >(const Coordinates& o) const - { - if (mLine != o.mLine) - return mLine > o.mLine; - return mColumn > o.mColumn; - } - - bool operator <=(const Coordinates& o) const - { - if (mLine != o.mLine) - return mLine < o.mLine; - return mColumn <= o.mColumn; - } - - bool operator >=(const Coordinates& o) const - { - if (mLine != o.mLine) - return mLine > o.mLine; - return mColumn >= o.mColumn; - } - }; - - struct Identifier - { - Coordinates mLocation; - std::string mDeclaration; - }; - - typedef std::string String; - - // [Bruno Levy] for old compilers that do not have std::unordered_set - // and map. -#ifdef GEO_OLD_COMPILER - typedef std::map Identifiers; - typedef std::set Keywords; - typedef std::set Breakpoints; -#else - typedef std::unordered_map Identifiers; - typedef std::unordered_set Keywords; - typedef std::unordered_set Breakpoints; -#endif - - typedef std::map ErrorMarkers; - typedef std::array Palette; - typedef char Char; - - struct Glyph - { - Char mChar; - PaletteIndex mColorIndex : 8; // [Bruno Levy]: 7 is too small to hold all values - bool mMultiLineComment : 1; - - Glyph(Char aChar, PaletteIndex aColorIndex) : mChar(aChar), mColorIndex(aColorIndex), mMultiLineComment(false) {} - }; - - typedef std::vector Line; - typedef std::vector Lines; - - struct GEOGRAM_GFX_API LanguageDefinition - { - typedef std::pair TokenRegexString; - typedef std::vector TokenRegexStrings; - - std::string mName; - Keywords mKeywords; - Identifiers mIdentifiers; - Identifiers mPreprocIdentifiers; - std::string mCommentStart, mCommentEnd; - - TokenRegexStrings mTokenRegexStrings; - - bool mCaseSensitive; - - static LanguageDefinition CPlusPlus(); - static LanguageDefinition HLSL(); - static LanguageDefinition GLSL(); - static LanguageDefinition C(); - static LanguageDefinition SQL(); - static LanguageDefinition AngelScript(); - static LanguageDefinition Lua(); - }; - - TextEditor(); - ~TextEditor(); - - void SetLanguageDefinition(const LanguageDefinition& aLanguageDef); - const LanguageDefinition& GetLanguageDefinition() const { return mLanguageDefinition; } - - const Palette& GetPalette() const { return mPalette; } - void SetPalette(const Palette& aValue); - - void SetErrorMarkers(const ErrorMarkers& aMarkers) { mErrorMarkers = aMarkers; } - const ErrorMarkers& GetErrorMarkers() const { return mErrorMarkers; } //[Bruno] - - void SetBreakpoints(const Breakpoints& aMarkers) { mBreakpoints = aMarkers; } - const Breakpoints& GetBreakpoints() const { return mBreakpoints; } //[Bruno] - - void Render(const char* aTitle, const ImVec2& aSize = ImVec2(), bool aBorder = false); - void SetText(const std::string& aText); - std::string GetText() const; - //[Bruno] made public - std::string GetText(const Coordinates& aStart, const Coordinates& aEnd) const; - std::string GetSelectedText() const; - Coordinates GetSelectionStart() const { - return mState.mSelectionStart; - } - Coordinates GetSelectionEnd() const { - return mState.mSelectionEnd; - } - int nbLines() const { - return int(mLines.size()); - } - std::string GetLine(int line) const; - - int GetTotalLines() const { return (int)mLines.size(); } - bool IsOverwrite() const { return mOverwrite; } - - void SetReadOnly(bool aValue); - bool IsReadOnly() const { return mReadOnly; } - - Coordinates GetCursorPosition() const { return GetActualCursorCoordinates(); } - - // [Bruno Levy] added this function. - Coordinates GetMousePosition() const { return ScreenPosToCoordinates(ImGui::GetMousePos()); } - - void SetCursorPosition(const Coordinates& aPosition); - - void InsertText(const std::string& aValue); - void InsertText(const char* aValue); - - void MoveUp(int aAmount = 1, bool aSelect = false); - void MoveDown(int aAmount = 1, bool aSelect = false); - void MoveLeft(int aAmount = 1, bool aSelect = false, bool aWordMode = false); - void MoveRight(int aAmount = 1, bool aSelect = false, bool aWordMode = false); - void MoveTop(bool aSelect = false); - void MoveBottom(bool aSelect = false); - void MoveHome(bool aSelect = false); - void MoveEnd(bool aSelect = false); - - void SetSelectionStart(const Coordinates& aPosition); - void SetSelectionEnd(const Coordinates& aPosition); - void SetSelection(const Coordinates& aStart, const Coordinates& aEnd, bool awordmode = false); - void SelectWordUnderCursor(); - bool HasSelection() const; - - void Copy(); - void Cut(); - void Paste(); - void Delete(); - - bool CanUndo() const; - bool CanRedo() const; - void Undo(int aSteps = 1); - void Redo(int aSteps = 1); - - static const Palette& GetDarkPalette(); - static const Palette& GetLightPalette(); - - // [Bruno Levy] gets the text source element under the pointer - // when a tooltip should be displayed. - const std::string& GetWordContext() const { - return word_context_; - } - -private: - -// [Bruno Levy] Made syntax hightlighting optional -#ifndef GEO_OLD_COMPILER - typedef std::vector> RegexList; -#endif - - struct EditorState - { - Coordinates mSelectionStart; - Coordinates mSelectionEnd; - Coordinates mCursorPosition; - }; - - class UndoRecord - { - public: - UndoRecord() {} - ~UndoRecord() {} - - UndoRecord( - const std::string& aAdded, - const TextEditor::Coordinates aAddedStart, - const TextEditor::Coordinates aAddedEnd, - - const std::string& aRemoved, - const TextEditor::Coordinates aRemovedStart, - const TextEditor::Coordinates aRemovedEnd, - - TextEditor::EditorState& aBefore, - TextEditor::EditorState& aAfter); - - void Undo(TextEditor* aEditor); - void Redo(TextEditor* aEditor); - - std::string mAdded; - Coordinates mAddedStart; - Coordinates mAddedEnd; - - std::string mRemoved; - Coordinates mRemovedStart; - Coordinates mRemovedEnd; - - EditorState mBefore; - EditorState mAfter; - }; - - typedef std::vector UndoBuffer; - - void ProcessInputs(); - void Colorize(int aFromLine = 0, int aCount = -1); - void ColorizeRange(int aFromLine = 0, int aToLine = 0); - void ColorizeInternal(); - int TextDistanceToLineStart(const Coordinates& aFrom) const; - void EnsureCursorVisible(); - int GetPageSize() const; - int AppendBuffer(std::string& aBuffer, char chr, int aIndex); - - Coordinates GetActualCursorCoordinates() const; - Coordinates SanitizeCoordinates(const Coordinates& aValue) const; - void Advance(Coordinates& aCoordinates) const; - void DeleteRange(const Coordinates& aStart, const Coordinates& aEnd); - int InsertTextAt(Coordinates& aWhere, const char* aValue); - void AddUndo(UndoRecord& aValue); - Coordinates ScreenPosToCoordinates(const ImVec2& aPosition) const; - Coordinates FindWordStart(const Coordinates& aFrom) const; - Coordinates FindWordEnd(const Coordinates& aFrom) const; - - // [Bruno Levy] additional function for finding the context for - // tooltips - bool IsWordContextBoundary(char c) const; - Coordinates FindWordContextStart(const Coordinates& aFrom) const; - Coordinates FindWordContextEnd(const Coordinates& aFrom) const; - std::string GetWordContextAt(const Coordinates & aCoords) const; - - bool IsOnWordBoundary(const Coordinates& aAt) const; - void RemoveLine(int aStart, int aEnd); - void RemoveLine(int aIndex); - Line& InsertLine(int aIndex); - void EnterCharacter(Char aChar); - void BackSpace(); - void DeleteSelection(); - std::string GetWordUnderCursor() const; - std::string GetWordAt(const Coordinates& aCoords) const; - - float mLineSpacing; - Lines mLines; - EditorState mState; - UndoBuffer mUndoBuffer; - int mUndoIndex; - - int mTabSize; - bool mOverwrite; - bool mReadOnly; - bool mWithinRender; - bool mScrollToCursor; - bool mWordSelectionMode; - int mColorRangeMin, mColorRangeMax; - - Palette mPalette; - LanguageDefinition mLanguageDefinition; - -// [Bruno Levy] Made syntax hightlighting optional -#ifndef GEO_OLD_COMPILER - RegexList mRegexList; -#endif - bool mCheckMultilineComments; - Breakpoints mBreakpoints; - ErrorMarkers mErrorMarkers; - ImVec2 mCharAdvance; - Coordinates mInteractiveStart, mInteractiveEnd; - -// [Bruno Levy] Additional callback. - public: - void set_callback( - TextEditorCallback cb, void* cb_cli_data = nullptr - ) { - callback_ = cb; - callback_client_data_ = cb_cli_data; - } - private: - TextEditorCallback callback_; - void* callback_client_data_; - std::string word_context_; -}; - diff --git a/svn-commit.tmp b/svn-commit.tmp new file mode 100644 index 00000000..68f32a68 --- /dev/null +++ b/svn-commit.tmp @@ -0,0 +1,4 @@ + +--This line, and those below, will be ignored-- + +M src/AndroidApps/Evert/app/build.gradle diff --git a/tests/FileInput.txt b/tests/FileInput.txt old mode 100755 new mode 100644 index 4389953f..b6b706b0 --- a/tests/FileInput.txt +++ b/tests/FileInput.txt @@ -24,9 +24,6 @@ xfail corrupted.obj invalid floating point value xfail corrupted.obj invalid facet vertex index Run Fail Test ${DATADIR}${/}corrupted_invalid_facet_vertex.obj -xfail truncated.obj - Run Fail Test ${DATADIR}${/}truncated.obj - xfail corrupted.off invalid integer value Run Fail Test ${DATADIR}${/}corrupted_invalid_int.off