From aa25450966fc5f1250edad9371c65d2b8053079e Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Sat, 20 Jan 2024 22:37:17 -0800 Subject: [PATCH] chore: use vite/vitest in place of esbuild/karma+jasmine Neuroglancer can now be used as a regular NPM dependency with vite, parcel, or webpack as the bundler (but unfortunately not esbuild due to https://github.com/evanw/esbuild/issues/795), and can be installed as a dependency via a git URL. Node.js import/export conditions are now used to enable/disable layer types and datasources, which can be configured by dependent projects rather than when Neuroglancer itself is built/published. The Python tests accept a `--build-client` option to run the dev server automatically rather than requiring a pre-built Python Neuroglancer client. --- .eslintignore | 11 + .eslintrc | 19 - .eslintrc.yml | 67 + .github/workflows/build.yml | 12 +- .gitignore | 4 +- .prettierignore | 3 + .prettierrc.yml | 4 + CONTRIBUTING.md | 2 +- biome.json | 68 - build_tools/build-package.ts | 170 + build_tools/cli.ts | 266 + build_tools/postpack.ts | 11 + build_tools/update-conditions.ts | 141 + build_tools/vite/vite-plugin-binary.ts | 35 + .../vite/vite-plugin-dev-server-path-map.ts | 18 + config/bundle-config.js | 257 - config/config.js | 10 - config/esbuild-cli.js | 234 - config/esbuild-dev-server.js | 81 - config/esbuild.js | 327 - config/esbuild_svg_inline_loader.js | 35 - config/{generate_code.js => generate-code.ts} | 0 config/karma-entry-points.js | 75 - config/karma.benchmark.js | 50 - config/karma.conf.js | 52 - config/resolve_real.js | 31 - config/static-site-live-server.js | 359 - examples/README.md | 47 + examples/parcel/README.md | 90 + .../parcel/parcel-project-built/.gitignore | 3 + .../parcel/parcel-project-built/.parcelrc | 9 + .../parcel/parcel-project-built/index.html | 8 + .../parcel-project-built/package-lock.json | 4307 +++++ .../parcel/parcel-project-built/package.json | 29 + .../parcel/parcel-project-built/src/index.js | 3 + .../parcel-project-built/svgo.config.json | 13 + .../parcel/parcel-project-source/.gitignore | 3 + .../parcel/parcel-project-source/.parcelrc | 9 + .../parcel/parcel-project-source/index.html | 8 + .../parcel-project-source/package-lock.json | 4383 +++++ .../parcel/parcel-project-source/package.json | 29 + .../parcel/parcel-project-source/src/index.js | 3 + .../parcel-project-source/svgo.config.json | 13 + .../parcel-project-source/tsconfig.json | 5 + examples/vite/vite-project-built/.gitignore | 2 + examples/vite/vite-project-built/index.html | 11 + .../vite/vite-project-built/package-lock.json | 994 + examples/vite/vite-project-built/package.json | 18 + .../vite/vite-project-built/vite.config.ts | 26 + examples/vite/vite-project-source/.gitignore | 2 + examples/vite/vite-project-source/index.html | 11 + .../vite-project-source/package-lock.json | 1070 ++ .../vite/vite-project-source/package.json | 18 + .../vite/vite-project-source/vite.config.ts | 26 + .../webpack/webpack-project-built/.gitignore | 2 + .../webpack/webpack-project-built/README.md | 1 + .../webpack-project-built/package-lock.json | 4200 +++++ .../webpack-project-built/package.json | 29 + .../webpack-project-built/src/index.js | 3 + .../webpack-project-built/webpack.config.js | 49 + .../webpack/webpack-project-source/.gitignore | 2 + .../webpack-project-source/package-lock.json | 4764 +++++ .../webpack-project-source/package.json | 30 + .../webpack-project-source/src/index.js | 3 + .../webpack-project-source/webpack.config.js | 59 + index.html | 7 + package-lock.json | 15121 ++++++++++------ package.json | 425 +- public/bossauth.html | 23 + public/google_oauth2_redirect.html | 21 + python/neuroglancer/__init__.py | 1 + python/neuroglancer/cli.py | 9 +- python/neuroglancer/server.py | 80 +- python/neuroglancer/static/.gitignore | 6 +- python/neuroglancer/static/__init__.py | 16 +- python/neuroglancer/webdriver.py | 65 +- python/tests/client_test.py | 300 + python/tests/conftest.py | 29 +- setup.py | 4 + src/annotation/annotation_layer_state.ts | 44 +- src/annotation/backend.ts | 62 +- src/annotation/base.ts | 15 +- src/annotation/bounding_box.ts | 38 +- src/annotation/ellipsoid.ts | 29 +- ...pec.ts => frontend_source.browser_test.ts} | 15 +- src/annotation/frontend_source.ts | 70 +- src/annotation/index.ts | 25 +- src/annotation/line.ts | 23 +- src/annotation/point.ts | 21 +- src/annotation/renderlayer.ts | 145 +- src/annotation/selection.ts | 2 +- src/annotation/type_handler.ts | 47 +- src/async_computation.bundle.js | 6 + src/async_computation/decode_blosc.ts | 8 +- src/async_computation/decode_blosc_request.ts | 2 +- src/async_computation/decode_compresso.ts | 6 +- .../decode_compresso_request.ts | 2 +- src/async_computation/decode_gzip.ts | 4 +- src/async_computation/decode_gzip_request.ts | 2 +- src/async_computation/decode_jpeg.ts | 8 +- src/async_computation/decode_jpeg_request.ts | 4 +- src/async_computation/decode_png.ts | 6 +- src/async_computation/decode_png_request.ts | 2 +- src/async_computation/decode_zstd.ts | 8 +- src/async_computation/decode_zstd_request.ts | 2 +- .../encode_compressed_segmentation.ts | 10 +- .../encode_compressed_segmentation_request.ts | 2 +- src/async_computation/handler.ts | 2 +- src/async_computation/obj_mesh.ts | 14 +- src/async_computation/obj_mesh_request.ts | 4 +- src/async_computation/request.ts | 34 +- src/async_computation/vtk_mesh.ts | 8 +- src/async_computation/vtk_mesh_request.ts | 4 +- src/axes_lines.ts | 14 +- src/chunk_manager/backend.ts | 48 +- src/chunk_manager/base.ts | 4 + src/chunk_manager/frontend.ts | 44 +- src/chunk_manager/generic_file_source.ts | 23 +- src/chunk_worker.bundle.js | 11 + src/coordinate_transform.spec.ts | 16 +- src/coordinate_transform.ts | 25 +- .../chunk_source_frontend.ts | 12 +- src/credentials_provider/default_manager.ts | 2 +- src/credentials_provider/http_request.ts | 15 +- src/credentials_provider/index.ts | 11 +- src/credentials_provider/oauth2.ts | 10 +- src/credentials_provider/shared.ts | 19 +- .../shared_counterpart.ts | 15 +- src/data_panel_layout.ts | 63 +- src/datasource/boss/api.ts | 10 +- src/datasource/boss/async_computation.ts | 2 + src/datasource/boss/backend.ts | 37 +- src/datasource/boss/base.ts | 2 +- src/datasource/boss/credentials_provider.ts | 18 +- src/datasource/boss/frontend.ts | 61 +- .../boss/register_credentials_provider.ts | 6 +- src/datasource/boss/register_default.ts | 4 +- src/datasource/brainmaps/api.ts | 13 +- src/datasource/brainmaps/async_computation.ts | 1 + src/datasource/brainmaps/backend.ts | 87 +- src/datasource/brainmaps/base.ts | 4 +- .../brainmaps/credentials_provider.ts | 2 +- src/datasource/brainmaps/frontend.ts | 87 +- .../register_credentials_provider.ts | 19 +- src/datasource/brainmaps/register_default.ts | 9 +- src/datasource/deepzoom/async_computation.ts | 2 + src/datasource/deepzoom/backend.ts | 30 +- src/datasource/deepzoom/frontend.ts | 55 +- src/datasource/deepzoom/register_default.ts | 4 +- src/datasource/default_provider.ts | 13 +- src/datasource/dvid/api.ts | 11 +- src/datasource/dvid/async_computation.ts | 1 + src/datasource/dvid/backend.ts | 44 +- src/datasource/dvid/credentials_provider.ts | 13 +- src/datasource/dvid/frontend.ts | 65 +- .../dvid/register_credentials_provider.ts | 6 +- src/datasource/dvid/register_default.ts | 4 +- .../enabled_async_computation_modules.ts | 13 + src/datasource/enabled_backend_modules.ts | 15 + src/datasource/enabled_frontend_modules.ts | 19 + src/datasource/graphene/async_computation.ts | 2 + src/datasource/graphene/backend.ts | 103 +- src/datasource/graphene/base.ts | 16 +- src/datasource/graphene/frontend.ts | 187 +- src/datasource/graphene/register_default.ts | 4 +- src/datasource/index.ts | 48 +- .../middleauth/credentials_provider.ts | 12 +- .../register_credentials_provider.ts | 6 +- src/datasource/n5/async_computation.ts | 3 + src/datasource/n5/backend.ts | 34 +- src/datasource/n5/frontend.ts | 57 +- src/datasource/n5/register_default.ts | 4 +- src/datasource/ngauth/credentials_provider.ts | 16 +- .../ngauth/register_credentials_provider.ts | 6 +- .../nggraph/credentials_provider.ts | 6 +- src/datasource/nggraph/frontend.ts | 47 +- src/datasource/nggraph/register_default.ts | 4 +- src/datasource/nifti/async_computation.ts | 1 + src/datasource/nifti/backend.ts | 62 +- src/datasource/nifti/base.ts | 2 +- src/datasource/nifti/frontend.ts | 40 +- src/datasource/nifti/register_default.ts | 4 +- src/datasource/obj/async_computation.ts | 1 + src/datasource/obj/backend.ts | 10 +- src/datasource/obj/frontend.ts | 12 +- src/datasource/obj/register_default.ts | 4 +- .../precomputed/async_computation.ts | 4 + src/datasource/precomputed/backend.ts | 105 +- src/datasource/precomputed/base.ts | 9 +- src/datasource/precomputed/frontend.ts | 94 +- .../precomputed/register_default.ts | 4 +- src/datasource/python/backend.ts | 40 +- src/datasource/python/base.ts | 3 +- ...ntend.spec.ts => frontend.browser_test.ts} | 3 +- src/datasource/python/frontend.ts | 54 +- src/datasource/render/async_computation.ts | 1 + src/datasource/render/backend.ts | 30 +- src/datasource/render/frontend.ts | 39 +- src/datasource/render/register_default.ts | 4 +- src/datasource/state_share.ts | 14 +- src/datasource/vtk/async_computation.ts | 1 + src/datasource/vtk/backend.ts | 13 +- src/datasource/vtk/frontend.ts | 12 +- src/datasource/vtk/register_default.ts | 4 +- src/datasource/zarr/async_computation.ts | 3 + src/datasource/zarr/backend.ts | 40 +- src/datasource/zarr/base.ts | 2 +- src/datasource/zarr/codec/blosc/decode.ts | 12 +- src/datasource/zarr/codec/blosc/resolve.ts | 8 +- src/datasource/zarr/codec/bytes/decode.ts | 13 +- src/datasource/zarr/codec/bytes/resolve.ts | 14 +- src/datasource/zarr/codec/crc32c/decode.ts | 8 +- src/datasource/zarr/codec/crc32c/resolve.ts | 6 +- src/datasource/zarr/codec/decode.ts | 14 +- src/datasource/zarr/codec/gzip/decode.ts | 12 +- src/datasource/zarr/codec/gzip/resolve.ts | 10 +- src/datasource/zarr/codec/index.ts | 2 +- src/datasource/zarr/codec/resolve.ts | 10 +- .../zarr/codec/sharding_indexed/decode.ts | 27 +- .../zarr/codec/sharding_indexed/resolve.ts | 14 +- src/datasource/zarr/codec/transpose/decode.ts | 9 +- .../zarr/codec/transpose/resolve.ts | 10 +- src/datasource/zarr/codec/zstd/decode.ts | 12 +- src/datasource/zarr/codec/zstd/resolve.ts | 8 +- src/datasource/zarr/frontend.ts | 74 +- src/datasource/zarr/metadata/index.ts | 6 +- src/datasource/zarr/metadata/parse.ts | 40 +- src/datasource/zarr/metadata/parse_util.ts | 41 + src/datasource/zarr/ome.ts | 10 +- src/datasource/zarr/register_default.ts | 4 +- src/display_context.ts | 20 +- src/gpu_hash/hash_table.benchmark.ts | 11 +- src/gpu_hash/hash_table.spec.ts | 39 +- src/gpu_hash/hash_table.ts | 6 +- ...{shader.spec.ts => shader.browser_test.ts} | 34 +- src/gpu_hash/shader.ts | 15 +- src/help/input_event_bindings.ts | 23 +- src/kvstore/index.ts | 2 +- src/kvstore/special/index.ts | 16 +- .../annotation/index.ts} | 93 +- .../annotation/style.css} | 0 src/layer/enabled_frontend_modules.ts | 5 + .../image/index.ts} | 92 +- .../image/style.css} | 0 src/{layer.ts => layer/index.ts} | 128 +- src/{ => layer}/layer_data_source.ts | 35 +- .../segmentation/index.ts} | 414 +- src/layer/segmentation/json_keys.ts | 27 + src/layer/segmentation/layer_controls.ts | 156 + .../segmentation/style.css} | 0 .../single_mesh/index.ts} | 32 +- .../single_mesh/style.css} | 0 src/layer_group_viewer.ts | 72 +- src/layer_groups_layout.ts | 36 +- src/layout.ts | 4 +- src/main.bundle.js | 3 + src/main.ts | 7 +- src/main_module.ts | 77 +- src/main_python.ts | 44 +- src/mesh/backend.ts | 64 +- src/mesh/draco/index.ts | 41 +- src/mesh/frontend.ts | 68 +- src/mesh/multiscale.spec.ts | 7 +- src/mesh/multiscale.ts | 5 +- src/mesh/triangle_strips.spec.ts | 3 +- src/mesh/triangle_strips.ts | 4 +- src/navigation_state.ts | 28 +- src/object_picking.ts | 6 +- src/overlay.ts | 12 +- src/perspective_view/backend.ts | 16 +- src/perspective_view/panel.ts | 90 +- src/perspective_view/render_layer.ts | 18 +- src/projection_parameters.ts | 10 +- src/python_integration/api.ts | 16 +- .../credentials_provider.ts | 16 +- src/python_integration/event_action_map.ts | 8 +- src/python_integration/prefetch.ts | 21 +- src/python_integration/remote_actions.ts | 16 +- .../remote_status_messages.ts | 10 +- src/python_integration/screenshots.ts | 39 +- src/python_integration/volume.ts | 56 +- src/render_coordinate_transform.ts | 30 +- src/render_layer_backend.ts | 18 +- src/render_scale_statistics.ts | 8 +- src/rendered_data_panel.ts | 49 +- src/renderlayer.ts | 45 +- ....spec.ts => segment_color.browser_test.ts} | 12 +- src/segment_color.ts | 24 +- src/segmentation_display_state/backend.ts | 31 +- src/segmentation_display_state/base.ts | 14 +- src/segmentation_display_state/frontend.ts | 71 +- .../property_map.spec.ts | 5 +- .../property_map.ts | 35 +- src/segmentation_graph/local.spec.ts | 21 +- src/segmentation_graph/local.ts | 22 +- src/segmentation_graph/segment_id.ts | 2 +- src/segmentation_graph/source.ts | 27 +- src/shared_disjoint_sets.ts | 16 +- src/shared_watchable_value.ts | 7 +- src/single_mesh/backend.ts | 47 +- src/single_mesh/base.ts | 2 +- ...ntend.spec.ts => frontend.browser_test.ts} | 21 +- src/single_mesh/frontend.ts | 77 +- src/skeleton/backend.ts | 25 +- src/skeleton/base.ts | 2 +- src/skeleton/decode_precomputed_skeleton.ts | 14 +- src/skeleton/decode_swc_skeleton.spec.ts | 5 +- src/skeleton/decode_swc_skeleton.ts | 4 +- src/skeleton/frontend.ts | 84 +- src/sliceview/backend.ts | 52 +- .../backend_chunk_decoders/bossNpz.ts | 16 +- .../compressed_segmentation.ts | 4 +- .../backend_chunk_decoders/compresso.ts | 12 +- src/sliceview/backend_chunk_decoders/index.ts | 4 +- src/sliceview/backend_chunk_decoders/jpeg.ts | 10 +- .../backend_chunk_decoders/ndstoreNpz.ts | 16 +- src/sliceview/backend_chunk_decoders/png.ts | 12 +- .../backend_chunk_decoders/postprocess.ts | 10 +- src/sliceview/backend_chunk_decoders/raw.ts | 13 +- src/sliceview/base.spec.ts | 7 +- src/sliceview/base.ts | 24 +- src/sliceview/bounding_box_shader_helper.ts | 6 +- src/sliceview/chunk_format_handlers.ts | 4 +- src/sliceview/chunk_format_testing.ts | 69 +- src/sliceview/chunk_layout.ts | 4 +- ...t.spec.ts => chunk_format.browser_test.ts} | 19 +- .../compressed_segmentation/chunk_format.ts | 33 +- .../compressed_segmentation/decode_uint32.ts | 2 +- .../compressed_segmentation/decode_uint64.ts | 4 +- .../encode.benchmark.ts | 26 +- .../compressed_segmentation/encode_common.ts | 2 +- .../encode_uint32.spec.ts | 11 +- .../compressed_segmentation/encode_uint32.ts | 8 +- .../encode_uint64.spec.ts | 11 +- .../compressed_segmentation/encode_uint64.ts | 8 +- src/sliceview/compresso/index.ts | 35 +- src/sliceview/frontend.ts | 96 +- src/sliceview/panel.ts | 54 +- src/sliceview/png/index.ts | 36 +- src/sliceview/renderlayer.ts | 58 +- src/sliceview/single_texture_chunk_format.ts | 22 +- ...uncompressed_chunk_format.browser_test.ts} | 13 +- src/sliceview/uncompressed_chunk_format.ts | 33 +- src/sliceview/volume/backend.ts | 19 +- src/sliceview/volume/base.ts | 23 +- src/sliceview/volume/frontend.ts | 23 +- src/sliceview/volume/image_renderlayer.ts | 37 +- src/sliceview/volume/renderlayer.ts | 67 +- .../volume/segmentation_renderlayer.ts | 40 +- src/sliceview/wire_frame.ts | 16 +- src/status.ts | 2 +- {third_party => src/third_party}/jpgjs/README | 0 .../third_party/jpgjs/jpg.d.ts | 12 +- src/third_party/jpgjs/jpg.js | 5255 ++++++ .../third_party}/jpgjs/webpack-fix.diff | 0 src/trackable_alpha.ts | 4 +- src/trackable_blend.ts | 2 +- src/trackable_boolean.ts | 10 +- src/trackable_finite_float.ts | 4 +- src/trackable_value.ts | 25 +- src/trackable_vec3.ts | 8 +- src/ui/annotations.ts | 114 +- src/ui/context_menu.ts | 9 +- src/ui/default_clipboard_handling.spec.ts | 3 +- src/ui/default_clipboard_handling.ts | 6 +- src/ui/default_input_event_bindings.ts | 4 +- src/ui/default_viewer.ts | 14 +- src/ui/default_viewer_setup.ts | 17 +- src/ui/disable_default_actions.ts | 2 +- src/ui/drag_and_drop.ts | 7 +- src/ui/layer_bar.ts | 36 +- src/ui/layer_data_sources_tab.ts | 67 +- src/ui/layer_drag_and_drop.ts | 18 +- src/ui/layer_list_panel.ts | 47 +- src/ui/layer_side_panel.ts | 47 +- src/ui/layer_side_panel_state.ts | 16 +- src/ui/minimal_viewer.ts | 25 +- src/ui/position_drag_and_drop.ts | 11 +- src/ui/segment_list.ts | 102 +- src/ui/segment_select_tools.ts | 25 +- src/ui/segment_split_merge_tools.ts | 48 +- src/ui/segmentation_display_options_tab.ts | 26 +- src/ui/selection_details.ts | 31 +- src/ui/side_panel.ts | 23 +- src/ui/side_panel_location.ts | 8 +- src/ui/state_editor.ts | 20 +- src/ui/statistics.ts | 30 +- src/ui/title.ts | 4 +- src/ui/tool.ts | 47 +- src/ui/url_hash_binding.ts | 19 +- src/ui/viewer_settings.ts | 28 +- src/uint64_map.spec.ts | 5 +- src/uint64_map.ts | 12 +- src/uint64_ordered_set.ts | 6 +- src/uint64_set.spec.ts | 5 +- src/uint64_set.ts | 12 +- src/util/array.spec.ts | 3 +- src/util/automatic_focus.ts | 8 +- src/util/byte_range_http_requests.ts | 13 +- src/util/cancellation.spec.ts | 22 +- src/util/cancellation.ts | 2 +- src/util/clipboard.ts | 2 +- .../{color.spec.ts => color.browser_test.ts} | 5 +- src/util/color.ts | 8 +- src/util/completion.ts | 2 +- src/util/data_type.ts | 2 +- src/util/disjoint_sets.spec.ts | 5 +- src/util/disjoint_sets.ts | 7 +- src/util/disposable.ts | 2 - src/util/drag_and_drop.spec.ts | 3 +- src/util/drag_and_drop.ts | 4 +- src/util/endian.spec.ts | 3 +- src/util/event_action_map.ts | 8 +- src/util/false.ts | 3 + src/util/float.ts | 2 +- src/util/float32_to_string.spec.ts | 3 +- src/util/gcs_bucket_listing.ts | 12 +- src/util/geom.spec.ts | 5 +- src/util/geom.ts | 6 +- src/util/google_oauth2.ts | 34 +- src/util/google_tag_manager.ts | 16 + src/util/hash.ts | 2 +- src/util/http_path_completion.ts | 26 +- src/util/http_request.ts | 11 +- src/util/json.spec.ts | 3 +- src/util/json.ts | 6 +- src/util/keyboard_bindings.ts | 12 +- src/util/lerp.ts | 8 +- src/util/matrix.spec.ts | 3 +- src/util/matrix.ts | 2 +- src/util/memoize.ts | 5 +- src/util/message_list.ts | 2 +- src/util/mouse_bindings.ts | 10 +- src/util/npy.spec.ts | 87 +- src/util/npy.ts | 13 +- src/util/number_to_string.spec.ts | 3 +- src/util/numpy_dtype.ts | 4 +- src/util/pairing_heap.0.ts | 2 +- src/util/pairing_heap.1.ts | 2 +- src/util/random.ts | 2 +- src/util/s3.ts | 8 +- src/util/s3_bucket_listing.ts | 8 +- src/util/si_units.spec.ts | 7 +- src/util/si_units.ts | 2 +- src/util/signal.spec.ts | 4 +- src/util/signal.ts | 1 + src/util/signal_binding_updater.ts | 2 +- src/util/spatial_units.ts | 5 +- src/util/special_protocol_request.ts | 32 +- src/util/touch_bindings.ts | 12 +- src/util/trackable.ts | 7 +- src/util/trackable_enum.ts | 6 +- src/util/true.ts | 3 + src/util/uint64.spec.ts | 31 +- src/util/vector.ts | 2 +- src/util/watchable_map.ts | 4 +- src/util/zorder.spec.ts | 5 +- src/util/zorder.ts | 4 +- src/viewer.ts | 161 +- src/viewer_state.ts | 14 +- src/visibility_priority/backend.ts | 10 +- src/visibility_priority/frontend.ts | 7 +- src/volume_rendering/backend.ts | 30 +- src/volume_rendering/base.ts | 14 +- ...ts => volume_render_layer.browser_test.ts} | 7 +- src/volume_rendering/volume_render_layer.ts | 83 +- src/webgl/buffer.ts | 11 +- src/webgl/circles.ts | 4 +- src/webgl/context.ts | 4 +- src/webgl/dynamic_shader.ts | 24 +- src/webgl/ellipse.ts | 3 +- src/webgl/empirical_cdf.ts | 22 +- ...pec.ts => index_emulation.browser_test.ts} | 5 +- src/webgl/index_emulation.ts | 10 +- .../{lerp.spec.ts => lerp.browser_test.ts} | 39 +- src/webgl/lerp.ts | 15 +- src/webgl/lines.ts | 6 +- src/webgl/offscreen.ts | 16 +- src/webgl/shader.ts | 8 +- ...lib.spec.ts => shader_lib.browser_test.ts} | 43 +- src/webgl/shader_lib.ts | 12 +- ...spec.ts => shader_testing.browser_test.ts} | 3 +- src/webgl/shader_testing.ts | 25 +- ....ts => shader_ui_controls.browser_test.ts} | 7 +- src/webgl/shader_ui_controls.ts | 44 +- src/webgl/spheres.ts | 9 +- src/webgl/square_corners_buffer.ts | 6 +- src/webgl/testing.ts | 12 +- src/webgl/texture.ts | 2 +- ...spec.ts => texture_access.browser_test.ts} | 34 +- src/webgl/texture_access.ts | 17 +- src/webgl/trivial_shaders.ts | 7 +- src/webgl/vertex_id.ts | 8 +- src/widget/add_button.ts | 5 +- src/widget/annotation_tool_status.ts | 21 +- src/widget/channel_dimensions_widget.ts | 20 +- src/widget/checkbox_icon.ts | 9 +- src/widget/close_button.ts | 5 +- src/widget/color.ts | 10 +- src/widget/coordinate_transform.ts | 36 +- src/widget/copy_button.ts | 5 +- src/widget/delete_button.ts | 5 +- src/widget/dependent_view_widget.ts | 10 +- src/widget/display_dimensions_widget.ts | 29 +- src/widget/enum_widget.ts | 4 +- src/widget/eye_button.ts | 7 +- src/widget/filter_button.ts | 5 +- src/widget/help_button.ts | 3 +- src/widget/icon.ts | 2 +- src/widget/invlerp.ts | 72 +- src/widget/layer_control.ts | 18 +- src/widget/layer_control_channel_invlerp.ts | 24 +- src/widget/layer_control_checkbox.ts | 8 +- src/widget/layer_control_color.ts | 13 +- src/widget/layer_control_enum.ts | 11 +- src/widget/layer_control_property_invlerp.ts | 24 +- src/widget/layer_control_range.ts | 12 +- src/widget/layer_reference.ts | 9 +- src/widget/linked_layer.ts | 13 +- src/widget/maximize_button.ts | 5 +- src/widget/move_to_button.ts | 3 +- src/widget/multiline_autocomplete.ts | 33 +- src/widget/number_input_widget.ts | 7 +- src/widget/position_plot.ts | 22 +- src/widget/position_widget.ts | 172 +- src/widget/range.ts | 8 +- src/widget/render_scale_widget.ts | 36 +- src/widget/scale_bar.ts | 24 +- src/widget/segmentation_color_mode.ts | 20 +- src/widget/shader_code_widget.ts | 23 +- src/widget/shader_controls.ts | 45 +- src/widget/star_button.ts | 7 +- src/widget/tab_view.ts | 20 +- src/widget/text_icon_button.ts | 2 +- src/widget/text_input.ts | 10 +- src/widget/tooltip.ts | 6 +- src/widget/vec3_entry_widget.ts | 12 +- src/widget/virtual_list.ts | 11 +- src/worker_rpc.ts | 19 +- src/worker_rpc_context.ts | 2 +- third_party/jpgjs/jpg.js | 4280 ----- tsconfig.json | 17 +- typings/binary.d.ts | 4 + typings/glsl-editor.d.ts | 2 +- typings/glsl.d.ts | 24 - typings/html.d.ts | 4 + typings/index.d.ts | 11 +- typings/jpgjs.d.ts | 39 - typings/svg.d.ts | 24 - typings/url-loader.d.ts | 24 - vite.config.ts | 76 + vitest.workspace.ts | 34 + 552 files changed, 41905 insertions(+), 16515 deletions(-) delete mode 100644 .eslintrc create mode 100644 .eslintrc.yml delete mode 100644 biome.json create mode 100644 build_tools/build-package.ts create mode 100644 build_tools/cli.ts create mode 100644 build_tools/postpack.ts create mode 100644 build_tools/update-conditions.ts create mode 100644 build_tools/vite/vite-plugin-binary.ts create mode 100644 build_tools/vite/vite-plugin-dev-server-path-map.ts delete mode 100644 config/bundle-config.js delete mode 100644 config/config.js delete mode 100644 config/esbuild-cli.js delete mode 100644 config/esbuild-dev-server.js delete mode 100644 config/esbuild.js delete mode 100644 config/esbuild_svg_inline_loader.js rename config/{generate_code.js => generate-code.ts} (100%) delete mode 100644 config/karma-entry-points.js delete mode 100644 config/karma.benchmark.js delete mode 100644 config/karma.conf.js delete mode 100644 config/resolve_real.js delete mode 100644 config/static-site-live-server.js create mode 100644 examples/README.md create mode 100644 examples/parcel/README.md create mode 100644 examples/parcel/parcel-project-built/.gitignore create mode 100644 examples/parcel/parcel-project-built/.parcelrc create mode 100644 examples/parcel/parcel-project-built/index.html create mode 100644 examples/parcel/parcel-project-built/package-lock.json create mode 100644 examples/parcel/parcel-project-built/package.json create mode 100644 examples/parcel/parcel-project-built/src/index.js create mode 100644 examples/parcel/parcel-project-built/svgo.config.json create mode 100644 examples/parcel/parcel-project-source/.gitignore create mode 100644 examples/parcel/parcel-project-source/.parcelrc create mode 100644 examples/parcel/parcel-project-source/index.html create mode 100644 examples/parcel/parcel-project-source/package-lock.json create mode 100644 examples/parcel/parcel-project-source/package.json create mode 100644 examples/parcel/parcel-project-source/src/index.js create mode 100644 examples/parcel/parcel-project-source/svgo.config.json create mode 100644 examples/parcel/parcel-project-source/tsconfig.json create mode 100644 examples/vite/vite-project-built/.gitignore create mode 100644 examples/vite/vite-project-built/index.html create mode 100644 examples/vite/vite-project-built/package-lock.json create mode 100644 examples/vite/vite-project-built/package.json create mode 100644 examples/vite/vite-project-built/vite.config.ts create mode 100644 examples/vite/vite-project-source/.gitignore create mode 100644 examples/vite/vite-project-source/index.html create mode 100644 examples/vite/vite-project-source/package-lock.json create mode 100644 examples/vite/vite-project-source/package.json create mode 100644 examples/vite/vite-project-source/vite.config.ts create mode 100644 examples/webpack/webpack-project-built/.gitignore create mode 100644 examples/webpack/webpack-project-built/README.md create mode 100644 examples/webpack/webpack-project-built/package-lock.json create mode 100644 examples/webpack/webpack-project-built/package.json create mode 100644 examples/webpack/webpack-project-built/src/index.js create mode 100644 examples/webpack/webpack-project-built/webpack.config.js create mode 100644 examples/webpack/webpack-project-source/.gitignore create mode 100644 examples/webpack/webpack-project-source/package-lock.json create mode 100644 examples/webpack/webpack-project-source/package.json create mode 100644 examples/webpack/webpack-project-source/src/index.js create mode 100644 examples/webpack/webpack-project-source/webpack.config.js create mode 100644 index.html create mode 100644 public/bossauth.html create mode 100644 public/google_oauth2_redirect.html create mode 100644 python/tests/client_test.py rename src/annotation/{frontend_source.spec.ts => frontend_source.browser_test.ts} (95%) create mode 100644 src/async_computation.bundle.js create mode 100644 src/chunk_worker.bundle.js create mode 100644 src/datasource/boss/async_computation.ts create mode 100644 src/datasource/brainmaps/async_computation.ts create mode 100644 src/datasource/deepzoom/async_computation.ts create mode 100644 src/datasource/dvid/async_computation.ts create mode 100644 src/datasource/enabled_async_computation_modules.ts create mode 100644 src/datasource/enabled_backend_modules.ts create mode 100644 src/datasource/enabled_frontend_modules.ts create mode 100644 src/datasource/graphene/async_computation.ts create mode 100644 src/datasource/n5/async_computation.ts create mode 100644 src/datasource/nifti/async_computation.ts create mode 100644 src/datasource/obj/async_computation.ts create mode 100644 src/datasource/precomputed/async_computation.ts rename src/datasource/python/{frontend.spec.ts => frontend.browser_test.ts} (90%) create mode 100644 src/datasource/render/async_computation.ts create mode 100644 src/datasource/vtk/async_computation.ts create mode 100644 src/datasource/zarr/async_computation.ts create mode 100644 src/datasource/zarr/metadata/parse_util.ts rename src/gpu_hash/{shader.spec.ts => shader.browser_test.ts} (86%) rename src/{annotation/user_layer.ts => layer/annotation/index.ts} (90%) rename src/{annotation/user_layer.css => layer/annotation/style.css} (100%) create mode 100644 src/layer/enabled_frontend_modules.ts rename src/{image_user_layer.ts => layer/image/index.ts} (87%) rename src/{image_user_layer.css => layer/image/style.css} (100%) rename src/{layer.ts => layer/index.ts} (96%) rename src/{ => layer}/layer_data_source.ts (93%) rename src/{segmentation_user_layer.ts => layer/segmentation/index.ts} (77%) create mode 100644 src/layer/segmentation/json_keys.ts create mode 100644 src/layer/segmentation/layer_controls.ts rename src/{segmentation_user_layer.css => layer/segmentation/style.css} (100%) rename src/{single_mesh_user_layer.ts => layer/single_mesh/index.ts} (89%) rename src/{single_mesh_user_layer.css => layer/single_mesh/style.css} (100%) create mode 100644 src/main.bundle.js rename src/{segment_color.spec.ts => segment_color.browser_test.ts} (86%) rename src/single_mesh/{frontend.spec.ts => frontend.browser_test.ts} (84%) rename src/sliceview/compressed_segmentation/{chunk_format.spec.ts => chunk_format.browser_test.ts} (84%) rename src/sliceview/{uncompressed_chunk_format.spec.ts => uncompressed_chunk_format.browser_test.ts} (85%) rename {third_party => src/third_party}/jpgjs/README (100%) rename typings/karma-benchmark.d.ts => src/third_party/jpgjs/jpg.d.ts (72%) create mode 100644 src/third_party/jpgjs/jpg.js rename {third_party => src/third_party}/jpgjs/webpack-fix.diff (100%) rename src/util/{color.spec.ts => color.browser_test.ts} (96%) create mode 100644 src/util/false.ts create mode 100644 src/util/google_tag_manager.ts create mode 100644 src/util/true.ts rename src/volume_rendering/{volume_render_layer.spec.ts => volume_render_layer.browser_test.ts} (88%) rename src/webgl/{index_emulation.spec.ts => index_emulation.browser_test.ts} (91%) rename src/webgl/{lerp.spec.ts => lerp.browser_test.ts} (94%) rename src/webgl/{shader_lib.spec.ts => shader_lib.browser_test.ts} (86%) rename src/webgl/{shader_testing.spec.ts => shader_testing.browser_test.ts} (97%) rename src/webgl/{shader_ui_controls.spec.ts => shader_ui_controls.browser_test.ts} (98%) rename src/webgl/{texture_access.spec.ts => texture_access.browser_test.ts} (80%) delete mode 100644 third_party/jpgjs/jpg.js create mode 100644 typings/binary.d.ts delete mode 100644 typings/glsl.d.ts create mode 100644 typings/html.d.ts delete mode 100644 typings/jpgjs.d.ts delete mode 100644 typings/svg.d.ts delete mode 100644 typings/url-loader.d.ts create mode 100644 vite.config.ts create mode 100644 vitest.workspace.ts diff --git a/.eslintignore b/.eslintignore index a04eb624b6..068d2f1146 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,3 +2,14 @@ node_modules dist python templates/neuroglancer/sliceview +src/third_party/jpgjs/jpg.js +templates +build +.tox +.nox +/lib +python +config +typings +src/mesh/draco/stub.js +tsconfig.tsbuildinfo diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index b5f5d90037..0000000000 --- a/.eslintrc +++ /dev/null @@ -1,19 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint"], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended" - ], - "rules": { - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/no-inferrable-types": "off", - "@typescript-eslint/no-this-alias": "off", - "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/no-empty-interface": "off" - } -} diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 0000000000..0e53e5ca1c --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,67 @@ +root: true +parser: "@typescript-eslint/parser" +plugins: + - "@typescript-eslint" + - "import" +settings: + "import/parsers": + "@typescript-eslint/parser": [".ts", ".tsx"] + "import/resolver": + "typescript": + "node": +extends: + - "eslint:recommended" + - "plugin:@typescript-eslint/eslint-recommended" + - "plugin:@typescript-eslint/recommended" + - "plugin:import/recommended" +rules: + "@typescript-eslint/no-explicit-any": "off" + "@typescript-eslint/explicit-module-boundary-types": "off" + "@typescript-eslint/no-non-null-assertion": "off" + "@typescript-eslint/no-inferrable-types": "off" + "@typescript-eslint/no-this-alias": "off" + "@typescript-eslint/no-empty-function": "off" + "@typescript-eslint/no-empty-interface": "off" + "prefer-const": + - "error" + - destructuring: "all" + "no-constant-condition": "off" + "@typescript-eslint/no-unused-vars": + - "error" + - argsIgnorePattern: "^_" + ignoreRestSiblings: true + "@typescript-eslint/ban-types": + - "error" + - types: + # unban Function + "Function": false + extendDefaults: true + "no-unsafe-finally": "off" + "require-yield": "off" + "no-inner-declarations": "off" + "import/no-named-as-default-member": "off" + "import/no-cycle": "error" + "@typescript-eslint/consistent-type-imports": "error" + "import/no-unresolved": "error" + "import/no-extraneous-dependencies": "error" + "import/first": "error" + "import/order": + - "error" + - groups: + - "builtin" + - "external" + - "internal" + alphabetize: + order: "asc" + orderImportKind: "asc" +overrides: + - files: + - "src/**/*" + rules: + "no-restricted-imports": + - "error" + - patterns: + - group: + - "./" + - "../" + message: "Relative imports are not allowed." diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c66803460d..c76781e760 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,16 +38,7 @@ jobs: run: npm run build-python -- --no-typecheck - uses: ./.github/actions/setup-firefox - name: Run JavaScript tests (including WebGL) - # Swiftshader, used by Chrome headless, crashes when running Neuroglancer - # tests. - # - # The only reliable headless configuration is Firefox on Linux under - # xvfb-run, which uses Mesa software rendering. - if: startsWith(runner.os, 'Linux') - run: xvfb-run --auto-servernum --server-args='-screen 0 1024x768x24' npm run test -- --browsers Firefox - - name: Run JavaScript tests (excluding WebGL) - if: ${{ !startsWith(runner.os, 'Linux') }} - run: npm run test -- --browsers ChromeHeadless --define=NEUROGLANCER_SKIP_WEBGL_TESTS + run: npm test - name: Run JavaScript benchmarks run: npm run benchmark @@ -63,6 +54,7 @@ jobs: - "3.9" - "3.10" - "3.11" + - "3.12" node-version: - "20.x" os: diff --git a/.gitignore b/.gitignore index 47161fcf76..47de04f74f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -/node_modules/ +node_modules /dist/ /trans /build/ @@ -18,3 +18,5 @@ tsconfig.tsbuildinfo .nox .pytest_cache /ngauth_server/secrets/ +.eslintcache +/lib diff --git a/.prettierignore b/.prettierignore index 9ad83dc42d..56db52f7be 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,3 +2,6 @@ /python/ /third_party/jpgjs/jpg.js /testdata/*.json +.parcel-cache +dist +/lib diff --git a/.prettierrc.yml b/.prettierrc.yml index e69de29bb2..14ff3cbc80 100644 --- a/.prettierrc.yml +++ b/.prettierrc.yml @@ -0,0 +1,4 @@ +overrides: + - files: ".parcelrc" + options: + parser: "json5" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fbbb00cd77..808efa17ae 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,7 +23,7 @@ All submissions, including submissions by project members, require review. ### Coding Style For consistency, please ensure that all TypeScript/JavaScript files -are linted with Biome and formatted by `prettier`. +are linted with `eslint` and formatted by `prettier`. You can check for lint/format issues with: diff --git a/biome.json b/biome.json deleted file mode 100644 index 30759a3d28..0000000000 --- a/biome.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/1.4.1/schema.json", - "vcs": { - "clientKind": "git", - "enabled": true, - "useIgnoreFile": true - }, - "files": { - "include": [ - "src/**/*.ts", - "src/**/*.js", - "config/**/*.ts", - "config/**/*.js" - ], - "ignore": [ - "python/**", - "templates/**", - "testdata/*.json", - "third_party/jpgjs/jpg.js", - "dist/**", - ".tox/**", - ".nox/**", - "build/**" - ] - }, - "organizeImports": { - "enabled": true - }, - "formatter": { - "enabled": false, - "indentStyle": "space" - }, - "linter": { - "enabled": true, - "rules": { - "recommended": true, - "suspicious": { - "noRedundantUseStrict": "off", - "noAssignInExpressions": "off", - "noExplicitAny": "off", - "noUnsafeDeclarationMerging": "off", - "noFallthroughSwitchClause": "off", - "noConfusingVoidType": "off" - }, - "complexity": { - "noForEach": "off", - "noBannedTypes": "off", - "noStaticOnlyClass": "off", - "noThisInStatic": "off" - }, - "style": { - "noNonNullAssertion": "off", - "noParameterAssign": "off", - "useTemplate": "off", - "useLiteralEnumMembers": "off", - "useEnumInitializers": "off", - "noArguments": "off" - }, - "correctness": { - "useYield": "off", - "noUnsafeFinally": "off" - }, - "performance": { - "noDelete": "off" - } - } - } -} diff --git a/build_tools/build-package.ts b/build_tools/build-package.ts new file mode 100644 index 0000000000..1873f380a1 --- /dev/null +++ b/build_tools/build-package.ts @@ -0,0 +1,170 @@ +// Builds the library package. +// +// This involves transpiling the TypeScript to JavaScript using esbuild. +// +// By default, the built package is staged in `dist/package`, with a +// `package.json` suitable for publishing to the NPM registry. +// +// If --inplace is specfied, the package is instead built in-place, and +// `package.json` is modified in place to be suitable for packing. The original +// `package.json` is saved as `package.json.prepack` and is restored +// automatically by `postpack.ts` (which is run as a postpack script). + +import fs from "node:fs/promises"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import esbuild from "esbuild"; +import { glob } from "glob"; +import yargs from "yargs"; + +const __dirname = path.resolve(path.dirname(fileURLToPath(import.meta.url))); +const rootDir = path.resolve(__dirname, ".."); + +async function buildPackage(options: { inplace?: boolean }) { + const { inplace = false } = options; + + const srcDir = path.resolve(rootDir, "src"); + const outDir = inplace ? rootDir : path.resolve(rootDir, "dist", "package"); + const libDir = path.resolve(outDir, "lib"); + + const packageJsonPath = path.resolve(rootDir, "package.json"); + + if (inplace) { + await fs.rm(libDir, { recursive: true, force: true }); + + // Save backup that can be restored by `postpack` script. + await fs.copyFile( + packageJsonPath, + path.resolve(rootDir, "package.json.prepack"), + ); + } else { + await fs.rm(outDir, { recursive: true }); + } + + const typescriptSources = await glob(["**/*.ts"], { + cwd: srcDir, + ignore: ["**/*.spec.ts", "**/*.browser_test.ts"], + nodir: true, + }); + + await esbuild.build({ + entryPoints: typescriptSources.map((name) => path.resolve(srcDir, name)), + outbase: srcDir, + bundle: false, + outdir: libDir, + }); + + const otherSources = await glob(["**/*.{css,js,html,wasm}"], { + cwd: srcDir, + nodir: true, + }); + await Promise.all( + otherSources.map((name) => + fs.copyFile(path.resolve(srcDir, name), path.resolve(libDir, name)), + ), + ); + + if (!inplace) { + const otherFiles = ["README.md", "LICENSE"]; + await Promise.all( + otherFiles.map((name) => + fs.copyFile(path.resolve(rootDir, name), path.resolve(outDir, name)), + ), + ); + } + + const packageJson = JSON.parse( + await fs.readFile(packageJsonPath, { + encoding: "utf-8", + }), + ); + delete packageJson["devDependencies"]; + if (inplace) { + // Delete all scripts except `postpack`. If the `postpack` script (which is + // needed to restore `package.json.prepack`) were removed, then `npm` does + // not run it, because it re-reads `package.json` to resolve each script. The residual postpack script won't work, but + const { postpack } = packageJson["scripts"]; + delete packageJson["scripts"]; + packageJson["scripts"] = { postpack }; + } else { + delete packageJson["private"]; + delete packageJson["scripts"]; + delete packageJson["files"]; + } + + function convertExportMap(map: Record) { + for (const [key, value] of Object.entries(map)) { + if (typeof value === "string") { + map[key] = value + .replace(/\.ts$/, ".js") + .replace(/^\.\/src\//, "./lib/"); + } else { + convertExportMap(value); + } + } + } + + convertExportMap(packageJson["imports"]); + convertExportMap(packageJson["exports"]); + + const outputPackageJson = path.resolve(outDir, "package.json"); + const tempPackageJsonPath = outputPackageJson + ".tmp"; + await fs.writeFile( + tempPackageJsonPath, + JSON.stringify(packageJson, undefined, 2) + "\n", + { encoding: "utf-8" }, + ); + await fs.rename(tempPackageJsonPath, outputPackageJson); +} + +async function parseArgsAndRunMain() { + const argv = await yargs(process.argv.slice(2)) + .options({ + inplace: { + type: "boolean", + default: false, + description: "Convert package to built format inplace.", + }, + ["if-not-toplevel"]: { + type: "boolean", + default: false, + description: "Skip building if invoked on a top-level npm repository.", + implies: "inplace", + }, + }) + .strict() + .demandCommand(0, 0) + .version(false) + .help() + .parse(); + + if (argv.ifNotToplevel) { + // https://stackoverflow.com/a/53239387 + + // When invoked as a run script, CWD always equals `rootDir`, and + // `process.env.INIT_CWD` indicates the CWD of the original command. + // + // - When running `npm install` with no arguments within a git checkout of + // this repository, `INIT_CWD` will be equal to `rootDir` or a descendant. + // + // - When running `npm install git+...`, `INIT_CWD` will equal the original + // path, and `rootDir` will be some cache directory containing the git - + // checkout, and will never be an ancestor of `INIT_CWD`. + const initCwd = process.env.INIT_CWD, + cwd = process.cwd(); + if ( + initCwd !== undefined && + (initCwd === cwd || initCwd.startsWith(cwd + path.sep)) + ) { + console.warn( + `Not building package due to --if-not-toplevel: cwd=${JSON.stringify(cwd)}, INIT_CWD=${JSON.stringify(initCwd)}`, + ); + return; + } + } + buildPackage({ inplace: argv.inplace }); +} + +if (process.argv[1] === fileURLToPath(import.meta.url)) { + parseArgsAndRunMain(); +} diff --git a/build_tools/cli.ts b/build_tools/cli.ts new file mode 100644 index 0000000000..bf736ee2ce --- /dev/null +++ b/build_tools/cli.ts @@ -0,0 +1,266 @@ +/** + * @license + * Copyright 2020 Google LLC + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Command-line interface for building Neuroglancer. + +import process from "node:process"; +import { fileURLToPath, pathToFileURL } from "node:url"; +import path from "path"; +import * as vite from "vite"; +import checkerPlugin from "vite-plugin-checker"; +import yargs from "yargs"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +// yargs strips quotes from string values in config objects +// (https://github.com/yargs/yargs-parser/issues/385). As a workaround, we add +// in extra quotes. +// function mungeConfig(config) { +// if (Array.isArray(config)) { +// return config.map(mungeConfig); +// } +// if (typeof config === "object") { +// const result = {}; +// for (const key of Object.keys(config)) { +// result[key] = mungeConfig(config[key]); +// } +// return result; +// } +// if (typeof config !== "string") { +// return config; +// } +// return `"${config}"`; +// } + +function parseDefines( + definesArg: + | Record + | string + | string[] + | Record[], +): Record { + const defines: Record = {}; + if (typeof definesArg === "object" && !Array.isArray(definesArg)) { + definesArg = [definesArg]; + } + let defineList = definesArg || []; + if (typeof defineList === "string") { + defineList = [defineList]; + } + for (const entry of defineList) { + if (typeof entry !== "string") { + Object.assign(defines, entry); + continue; + } + const splitPoint = entry.indexOf("="); + let key; + let value; + if (splitPoint === -1) { + key = entry; + value = "true"; + } else { + key = entry.substring(0, splitPoint); + value = entry.substring(splitPoint + 1); + } + defines[key] = value; + } + for (const key of Object.keys(defines)) { + const value = defines[key]; + if (typeof value !== "string") { + defines[key] = JSON.stringify(value); + } + } + return defines; +} + +type Argv = Awaited>; + +async function getViteConfig(argv: Argv): Promise { + let config: vite.UserConfig = {}; + for (const configPath of argv.config) { + const loadedConfig = (await import(pathToFileURL(configPath).href)).default; + config = vite.mergeConfig(config, loadedConfig); + } + + const conditions = argv.conditions; + if (argv.python) conditions.push("neuroglancer/python"); + const outDir = + (argv.output as string | undefined) ?? + (argv.python + ? path.resolve( + __dirname, + "..", + "python", + "neuroglancer", + "static", + "client", + ) + : undefined); + const inlineConfig = { + root: path.resolve(__dirname, ".."), + base: argv.base, + define: argv.define, + ...(argv.mode !== undefined ? { mode: argv.mode } : {}), + build: { + watch: argv.watch ? {} : undefined, + outDir, + }, + plugins: [ + argv.typecheck || argv.lint + ? checkerPlugin({ + typescript: argv.typecheck ?? false, + eslint: argv.lint + ? { + lintCommand: "eslint .", + } + : undefined, + }) + : undefined, + ], + resolve: { + conditions, + }, + } satisfies vite.UserConfig; + return vite.mergeConfig(config, inlineConfig); +} + +function parseArgs() { + return yargs(process.argv.slice(2)) + .options({ + typecheck: { + type: "boolean", + default: true, + description: "Typecheck the TypeScript code.", + }, + lint: { + type: "boolean", + default: true, + description: "Run eslint.", + }, + python: { + type: "boolean", + description: + "Build Python client, equivalent to --conditions=neuroglancer/python", + default: false, + }, + conditions: { + type: "array", + coerce: (arg: string[]) => arg.map((x) => x.split(",")).flat(), + nargs: 1, + default: [], + description: + "Comma-separated list of additional custom Node.js package import/export conditions.", + }, + define: { + type: "array", + coerce: parseDefines, + nargs: 1, + default: [], + description: + "JavaScript global identifiers to define when building. Usage: `--define VARIABLE=EXPR`.", + }, + mode: { + description: "Build mode", + type: "string", + }, + base: { + type: "string", + description: "Base path to assume.", + }, + config: { + array: true, + string: true, + nargs: 1, + default: [], + description: + "Additional vite config module to merge into configuration.", + }, + }) + .command({ + command: "serve", + aliases: ["$0"], + describe: "Run the development server.", + builder: (parser) => + parser.options({ + mode: { + default: "development", + }, + port: { + group: "Development server options", + type: "number", + nargs: 1, + default: 8080, + description: "Port number for the development server", + }, + host: { + group: "Development server options", + type: "string", + nargs: 1, + description: "Specifies bind address for development server.", + default: "localhost", + }, + }), + handler: async (argv) => { + const server = await vite.createServer( + vite.mergeConfig(await getViteConfig(argv), { + server: { + port: argv.port, + host: argv.host, + }, + }), + ); + await server.listen(); + + server.printUrls(); + server.bindCLIShortcuts({ print: true }); + }, + }) + .command({ + command: "build", + describe: "Build the client.", + builder: (parser) => + parser.options({ + output: { + group: "Build options", + type: "string", + nargs: 1, + description: "Output directory.", + }, + watch: { + type: "boolean", + default: false, + description: "Watch for changes.", + }, + mode: { + default: "production", + }, + }), + handler: async (argv) => { + await vite.build(vite.mergeConfig(await getViteConfig(argv), {})); + }, + }) + .strict() + .version(false) + .help() + .parse(); +} + +async function parseArgsAndRunMain() { + parseArgs(); +} +if (process.argv[1] === fileURLToPath(import.meta.url)) { + parseArgsAndRunMain(); +} diff --git a/build_tools/postpack.ts b/build_tools/postpack.ts new file mode 100644 index 0000000000..1fa41e8ad8 --- /dev/null +++ b/build_tools/postpack.ts @@ -0,0 +1,11 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = path.resolve(path.dirname(fileURLToPath(import.meta.url))); +const rootDir = path.resolve(__dirname, ".."); + +await fs.rename( + path.resolve(rootDir, "package.json.prepack"), + path.resolve(rootDir, "package.json"), +); diff --git a/build_tools/update-conditions.ts b/build_tools/update-conditions.ts new file mode 100644 index 0000000000..91b6ebfe57 --- /dev/null +++ b/build_tools/update-conditions.ts @@ -0,0 +1,141 @@ +import fs from "node:fs"; +import path from "node:path"; + +import { fileURLToPath } from "node:url"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const rootDir = path.resolve(__dirname, ".."); + +const packageJsonPath = path.resolve(rootDir, "package.json"); + +const packageJson = JSON.parse( + await fs.promises.readFile(packageJsonPath, { encoding: "utf-8" }), +); + +const JS_EXT = ".ts"; + +const NOOP = "./src/util/false" + JS_EXT; + +const imports: Record = {}; +imports["#src/third_party/jpgjs/jpg.js"] = "./src/third_party/jpgjs/jpg.js"; +imports["#src/*.js"] = "./src/*.ts"; +imports["#src/*"] = "./src/*"; +imports["#testdata/*"] = "./testdata/*"; + +const datasourceDir = path.resolve(rootDir, "src", "datasource"); +const layerDir = path.resolve(rootDir, "src", "layer"); + +const datasources = ( + await fs.promises.readdir(datasourceDir, { withFileTypes: true }) +) + .filter((e) => e.isDirectory()) + .map((e) => e.name); + +const layers = (await fs.promises.readdir(layerDir, { withFileTypes: true })) + .filter((e) => e.isDirectory()) + .map((e) => e.name); + +const datasourceKeys = { + backend: "backend", + async_computation: "async_computation", + register_default: "frontend", + register_credentials_provider: "frontend", +} as const; + +const datasourceModules = Object.fromEntries( + Object.values(datasourceKeys).map((key) => [key, new Array()]), +); + +for (const datasource of datasources) { + for (const [filePrefix, moduleKind] of Object.entries(datasourceKeys)) { + const sourcePrefix = `./src/datasource/${datasource}/${filePrefix}`; + if ( + await fs.promises + .stat(path.resolve(rootDir, `${sourcePrefix}.ts`)) + .catch(() => undefined) + ) { + const source = sourcePrefix + JS_EXT; + const conditions: Record = {}; + if (datasource === "python") { + conditions["neuroglancer/python"] = source; + conditions.default = NOOP; + } else { + if (filePrefix === "register_credentials_provider") { + conditions["neuroglancer/python"] = NOOP; + } + conditions[`neuroglancer/datasource/${datasource}:enabled`] = source; + conditions["neuroglancer/datasource:none_by_default"] = NOOP; + conditions[`neuroglancer/datasource/${datasource}:disabled`] = source; + conditions.default = source; + } + const moduleId = `#datasource/${datasource}/${filePrefix}`; + imports[moduleId] = conditions; + datasourceModules[moduleKind].push(moduleId); + } + } +} + +for (const layer of layers) { + const source = `./src/layer/${layer}/index` + JS_EXT; + imports[`#layer/${layer}`] = { + [`neuroglancer/layer/${layer}:enabled`]: source, + "neuroglancer/layer:none_by_default": NOOP, + [`neuroglancer/layer/${layer}:enabled`]: source, + default: source, + }; +} + +// main entrypoint. +imports["#main"] = { + "neuroglancer/python": "./src/main_python" + JS_EXT, + default: "./src/main" + JS_EXT, +}; + +// main entrypoint. +imports["#python_integration_build"] = { + "neuroglancer/python": "./src/util/true" + JS_EXT, + default: NOOP, +}; + +async function writeModule(modulePath: string, imports: string[]) { + await fs.promises.writeFile( + modulePath, + "// DO NOT EDIT: Generated by config/update_conditions.ts\n" + + imports.map((name) => `import ${JSON.stringify(name)};\n`).join(""), + { encoding: "utf-8" }, + ); +} + +for (const [moduleKind, moduleIds] of Object.entries(datasourceModules)) { + await writeModule( + path.resolve( + rootDir, + "src", + "datasource", + `enabled_${moduleKind}_modules.ts`, + ), + moduleIds, + ); +} + +await writeModule( + path.resolve(rootDir, "src", "layer", "enabled_frontend_modules.ts"), + layers.map((name) => `#layer/${name}`), +); + +packageJson.imports = imports; + +packageJson.exports = { + ".": "./src/main_module.ts", + "./*.js": "./src/*.ts", + "./*": "./src/*", +}; + +const tempPackageJsonPath = packageJsonPath + ".tmp"; + +await fs.promises.writeFile( + tempPackageJsonPath, + JSON.stringify(packageJson, undefined, 2) + "\n", + { encoding: "utf-8" }, +); +await fs.promises.rename(tempPackageJsonPath, packageJsonPath); diff --git a/build_tools/vite/vite-plugin-binary.ts b/build_tools/vite/vite-plugin-binary.ts new file mode 100644 index 0000000000..1839172163 --- /dev/null +++ b/build_tools/vite/vite-plugin-binary.ts @@ -0,0 +1,35 @@ +import { readFile } from "fs/promises"; +import type { FilterPattern } from "@rollup/pluginutils"; +import { createFilter } from "@rollup/pluginutils"; +import type { PluginContext } from "rollup"; +import type { Plugin } from "vite"; + +export default ( + options: { include?: FilterPattern; exclude?: FilterPattern } = {}, +): Plugin => { + const { include, exclude } = options; + const filter = createFilter(include, exclude); + return { + name: "neuroglancer:binary", + async load(this: PluginContext, id: string) { + if (id[0] === "\0") { + // Ignore per rollup convention. + return undefined; + } + const file = id.replace(/[?#].*$/, ""); + if (!filter(file)) return undefined; + this.addWatchFile(file); + const encoded = await readFile(file, { encoding: "base64" }); + const text = ` +const s = atob(${JSON.stringify(encoded)}); +const length = s.length; +const buffer = new Uint8Array(length); +for (let i = 0; i < length; ++i) { + buffer[i] = s.charCodeAt(i); +} +export default buffer; +`; + return text; + }, + }; +}; diff --git a/build_tools/vite/vite-plugin-dev-server-path-map.ts b/build_tools/vite/vite-plugin-dev-server-path-map.ts new file mode 100644 index 0000000000..50a0b71edf --- /dev/null +++ b/build_tools/vite/vite-plugin-dev-server-path-map.ts @@ -0,0 +1,18 @@ +import type { Plugin } from "vite"; + +export default (options: { map: Map }): Plugin => { + const { map } = options; + return { + name: "neuroglancer-dev-server-path-map", + configureServer(server) { + server.middlewares.use((req, _res, next) => { + const dest = map.get(req.url!); + if (dest !== undefined) { + req.url = dest; + //req.path = dest; + } + next(); + }); + }, + }; +}; diff --git a/config/bundle-config.js b/config/bundle-config.js deleted file mode 100644 index 7847027610..0000000000 --- a/config/bundle-config.js +++ /dev/null @@ -1,257 +0,0 @@ -/** - * @license - * Copyright 2016-2020 Google LLC - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -"use strict"; - -const resolveReal = require("./resolve_real"); - -const DEFAULT_DATA_SOURCES = (exports.DEFAULT_DATA_SOURCES = [ - { - source: "#/datasource/brainmaps", - registerCredentials: "#/datasource/brainmaps/register_credentials_provider", - asyncComputation: ["#/async_computation/decode_jpeg"], - }, - { - source: "#/datasource/boss", - registerCredentials: "#/datasource/boss/register_credentials_provider", - asyncComputation: [ - "#/async_computation/decode_jpeg", - "#/async_computation/decode_gzip", - ], - }, - { - source: "#/datasource/deepzoom", - asyncComputation: [ - "#/async_computation/decode_jpeg", - "#/async_computation/decode_png", - ], - }, - { - source: "#/datasource/dvid", - registerCredentials: "#/datasource/dvid/register_credentials_provider", - asyncComputation: ["#/async_computation/decode_jpeg"], - }, - { - source: "#/datasource/render", - asyncComputation: ["#/async_computation/decode_jpeg"], - }, - { - source: "#/datasource/precomputed", - asyncComputation: [ - "#/async_computation/decode_jpeg", - "#/async_computation/decode_gzip", - "#/async_computation/decode_compresso", - "#/async_computation/decode_png", - ], - }, - { - source: "#/datasource/nifti", - asyncComputation: ["#/async_computation/decode_gzip"], - }, - { - source: "#/datasource/n5", - asyncComputation: [ - "#/async_computation/decode_gzip", - "#/async_computation/decode_blosc", - ], - }, - { - source: "#/datasource/zarr", - asyncComputation: [ - "#/async_computation/decode_gzip", - "#/async_computation/decode_blosc", - "#/async_computation/decode_zstd", - ], - }, - // '#/datasource/computed', - // '#/datasource/computed/example', - // '#/datasource/computed/tensorflow', - { - source: "#/datasource/vtk", - asyncComputation: ["#/async_computation/vtk_mesh"], - }, - { - source: "#/datasource/obj", - asyncComputation: ["#/async_computation/obj_mesh"], - }, - { - source: "#/datasource/ngauth", - frontend: null, - backend: null, - register: null, - registerCredentials: "#/datasource/ngauth/register_credentials_provider", - }, - { - source: "#/datasource/middleauth", - frontend: null, - backend: null, - register: null, - registerCredentials: - "#/datasource/middleauth/register_credentials_provider", - }, - { - source: "#/datasource/nggraph", - }, - { - source: "#/datasource/graphene", - asyncComputation: [ - "#/async_computation/decode_jpeg", - "#/async_computation/decode_gzip", - ], - }, -]); - -const DEFAULT_SUPPORTED_LAYERS = (exports.DEFAULT_SUPPORTED_LAYERS = [ - "#/image_user_layer", - "#/segmentation_user_layer", - "#/single_mesh_user_layer", - "#/annotation/user_layer", -]); - -function getBundleSources(options) { - const dataSources = [ - ...(options.dataSources || DEFAULT_DATA_SOURCES), - ...(options.extraDataSources || []), - ]; - const supportedLayers = options.supportedLayers || DEFAULT_SUPPORTED_LAYERS; - const frontendDataSourceModules = []; - const backendDataSourceModules = []; - const asyncComputationDataSourceModules = new Set(); - const registerCredentials = - options.registerCredentials !== undefined - ? options.registerCredentials - : !options.python; - for (let datasource of dataSources) { - if (typeof datasource === "string") { - datasource = { source: datasource }; - } - if (datasource.frontend !== null) { - frontendDataSourceModules.push( - datasource.frontend || `${datasource.source}/frontend`, - ); - } - if (registerCredentials && datasource.registerCredentials) { - frontendDataSourceModules.push(datasource.registerCredentials); - } - if (datasource.register === undefined) { - frontendDataSourceModules.push(`${datasource.source}/register_default`); - } else if (datasource.register !== null) { - frontendDataSourceModules.push(datasource.register); - } - if (datasource.backend !== null) { - backendDataSourceModules.push( - datasource.backend || `${datasource.source}/backend`, - ); - } - if (datasource.asyncComputation !== undefined) { - for (const m of datasource.asyncComputation) { - asyncComputationDataSourceModules.add(m); - } - } - } - const defaultDefines = { - // This is the default client ID used for the hosted neuroglancer. - // In addition to the hosted neuroglancer origin, it is valid for - // the origins: - // - // localhost:8000 - // 127.0.0.1:8000 - // localhost:8080 - // 127.0.0.1:8080 - // - // To deploy to a different origin, you will need to generate your - // own client ID from on the Google Developer Console and substitute - // it in. - BRAINMAPS_CLIENT_ID: JSON.stringify( - "639403125587-4k5hgdfumtrvur8v48e3pr7oo91d765k.apps.googleusercontent.com", - ), - - "process.env.NODE_ENV": JSON.stringify("production"), - - global: "window", - }; - const extraDefines = options.defines || {}; - const srcDir = resolveReal(__dirname, "..", "src"); - const extraChunkWorkerModules = options.chunkWorkerModules || []; - const extraAsyncComputationModules = options.asyncComputationModules || []; - const chunkWorkerModules = [ - "#/worker_rpc_context", - "#/chunk_manager/backend", - "#/sliceview/backend", - "#/perspective_view/backend", - "#/volume_rendering/backend", - "#/annotation/backend", - ...backendDataSourceModules, - ...extraChunkWorkerModules, - ]; - const asyncComputationModules = [ - "#/async_computation/handler", - "#/async_computation/encode_compressed_segmentation", - ...asyncComputationDataSourceModules, - ...extraAsyncComputationModules, - ]; - const frontendModules = options.frontendModules || [ - resolveReal(srcDir, "main.ts"), - ]; - const frontendLayerModules = []; - for (const name of supportedLayers) { - frontendLayerModules.push(name); - } - - return { - main: [ - ...frontendDataSourceModules, - ...frontendLayerModules, - ...frontendModules, - ], - workers: { - chunk_worker: chunkWorkerModules, - async_computation: asyncComputationModules, - }, - defines: { ...defaultDefines, ...extraDefines }, - }; -} -exports.getBundleSources = getBundleSources; - -function makePythonClientOptions(options) { - const srcDir = resolveReal(__dirname, "..", "src"); - options = Object.assign({}, options); - options.extraDataSources = [ - ...(options.extraDataSources || []), - { source: "#/datasource/python", register: null }, - ]; - options.frontendModules = options.frontendModules || [ - resolveReal(srcDir, "main_python.ts"), - ]; - options.registerCredentials = false; - options.defines = Object.assign(options.defines || {}, { - NEUROGLANCER_PYTHON_INTEGRATION: "true", - }); - return options; -} - -exports.makePythonClientOptions = makePythonClientOptions; - -exports.getViewerOptions = (baseConfig, options = {}) => { - if (options.python) { - baseConfig = makePythonClientOptions(baseConfig); - } - if (options.module) { - const srcDir = resolveReal(__dirname, "..", "src"); - baseConfig.frontendModules = [resolveReal(srcDir, "main_module.ts")]; - } - return baseConfig; -}; diff --git a/config/config.js b/config/config.js deleted file mode 100644 index 2b9bf04b1b..0000000000 --- a/config/config.js +++ /dev/null @@ -1,10 +0,0 @@ -// Add in additional command-line build options here. -module.exports = { - define: { - // NEUROGLANCER_CREDIT_LINK: JSON.stringify({url: '...', text: '...'}), - // NEUROGLANCER_DEFAULT_STATE_FRAGMENT: JSON.stringify('gs://bucket/state.json'), - // NEUROGLANCER_SHOW_LAYER_BAR_EXTRA_BUTTONS: true, - // NEUROGLANCER_SHOW_OBJECT_SELECTION_TOOLTIP: true - }, - // googleTagManager: 'GTM-XXXXXX', -}; diff --git a/config/esbuild-cli.js b/config/esbuild-cli.js deleted file mode 100644 index 475366b8ab..0000000000 --- a/config/esbuild-cli.js +++ /dev/null @@ -1,234 +0,0 @@ -/** - * @license - * Copyright 2020 Google LLC - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Command-line interface for building Neuroglancer. - -"use strict"; - -const { Builder } = require("./esbuild"); -const path = require("path"); -const fs = require("fs"); - -// yargs strips quotes from string values in config objects -// (https://github.com/yargs/yargs-parser/issues/385). As a workaround, we add -// in extra quotes. -function mungeConfig(config) { - if (Array.isArray(config)) { - return config.map(mungeConfig); - } - if (typeof config === "object") { - const result = {}; - for (const key of Object.keys(config)) { - result[key] = mungeConfig(config[key]); - } - return result; - } - if (typeof config !== "string") { - return config; - } - return `"${config}"`; -} - -function parseDefines(definesArg) { - const defines = {}; - if (typeof definesArg === "object" && !Array.isArray(definesArg)) { - definesArg = [definesArg]; - } - let defineList = definesArg || []; - if (typeof defineList === "string") { - defineList = [defineList]; - } - for (const entry of defineList) { - if (typeof entry !== "string") { - Object.assign(defines, entry); - continue; - } - const splitPoint = entry.indexOf("="); - let key; - let value; - if (splitPoint === -1) { - key = entry; - value = "true"; - } else { - key = entry.substring(0, splitPoint); - value = entry.substring(splitPoint + 1); - } - defines[key] = value; - } - for (const key of Object.keys(defines)) { - const value = defines[key]; - if (typeof value !== "string") { - defines[key] = JSON.stringify(value); - } - } - return defines; -} -exports.parseDefines = parseDefines; - -async function main(argv) { - let minify = true; - let python = false; - let moduleBuild = false; - let outDir = argv.output; - const id = argv.config; - const pythonOutDir = - argv.output !== undefined - ? argv.output - : path.resolve(__dirname, "..", "python", "neuroglancer", "static"); - - switch (id) { - case "min": - break; - case "dev": - minify = false; - break; - case "python-min": - python = true; - outDir = pythonOutDir; - break; - case "python-dev": - python = true; - minify = false; - outDir = pythonOutDir; - break; - case "module": - minify = false; - moduleBuild = true; - break; - default: - throw new Error(`Unsupported config: ${id}`); - } - const skipTypeCheck = !argv.typecheck; - const builder = new Builder({ - outDir, - id, - minify, - python, - module: moduleBuild, - define: argv.define, - inject: argv.inject, - googleTagManager: argv.googleTagManager, - analyze: argv.analyze, - }); - if (moduleBuild && argv.output === undefined) { - try { - if ((await fs.promises.lstat(builder.outDir)).isDirectory()) { - await fs.promises.rm(builder.outDir, { recursive: true }); - } - } catch (e) { - // Ignore errors. - } - } else { - await builder.clearOutput(); - } - if (argv.watch) { - await require("./esbuild-dev-server")(builder, { - serve: argv.serve, - host: argv.host, - port: argv.port, - skipTypeCheck, - }); - } else { - await builder.buildOrExit({ skipTypeCheck }); - } -} -if (require.main === module) { - const argv = require("yargs") - .options({ - config: { - description: "Build configuration identifier", - type: "string", - nargs: 1, - choices: ["min", "dev", "python-min", "python-dev", "module"], - default: "min", - }, - analyze: { - type: "boolean", - default: false, - description: "Print bundle analysis.", - }, - typecheck: { - type: "boolean", - default: true, - description: "Typecheck the TypeScript code.", - }, - define: { - type: "array", - coerce: parseDefines, - default: [], - description: - "JavaScript global identifiers to define when building. Usage: `--define VARIABLE=EXPR`.", - }, - inject: { - type: "array", - default: [], - description: "Additional modules to inject into global scope.", - }, - watch: { - type: "boolean", - default: false, - description: "Watch sources for changes and rebuild automatically.", - }, - serve: { - group: "Development server options:", - type: "boolean", - default: false, - description: "Run a development server.", - }, - host: { - group: "Development server options:", - type: "string", - nargs: 1, - description: - "Specifies bind address for development server, e.g. 0.0.0.0 or 127.0.0.1", - default: "127.0.0.1", - }, - port: { - group: "Development server options:", - type: "number", - nargs: 1, - default: 8080, - description: "Port number for the development server", - }, - configfile: { - config: true, - description: "Additional JSON/JavaScript config file to load.", - configParser: (x) => mungeConfig(require(x)), - }, - output: { - type: "string", - nargs: 1, - description: "Output directory.", - }, - "google-tag-manager": { - group: "Customization", - type: "string", - nargs: 1, - description: "Google tag manager id to include in index.html", - }, - }) - .strict() - .config(mungeConfig(require("./config.js"))) - .demandCommand(0, 0) - .version(false) - .env("NEUROGLANCER") - .help() - .parse(); - if (argv.serve) { - argv.watch = true; - } - main(argv); -} diff --git a/config/esbuild-dev-server.js b/config/esbuild-dev-server.js deleted file mode 100644 index f6e8b123d0..0000000000 --- a/config/esbuild-dev-server.js +++ /dev/null @@ -1,81 +0,0 @@ -/** - * @license - * Copyright 2020 Google LLC - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Live reload development server for static site bundled using esbuild - -"use strict"; - -const chokidar = require("chokidar"); -const LiveServer = require("./static-site-live-server"); -const path = require("path"); - -async function tryBuild(builder) { - try { - await builder.build(); - return true; - } catch (e) { - console.log(`Build failed: ${e}`, e.stack); - return false; - } -} - -async function main(builder, options) { - if (!options.skipTypeCheck) { - builder.typeCheckWatch(); - } - await tryBuild(builder); - - const { serve = false } = options; - - let liveServer = undefined; - if (serve) { - liveServer = new LiveServer(); - liveServer.start({ - host: options.host, - port: options.port, - root: builder.outDir, - file: "index.html", - }); - } - - let building = false; - let needBuild = false; - const sourceWatcher = chokidar - .watch(path.resolve(builder.srcDir, "**")) - .on("change", async (filePath) => { - if (building) { - needBuild = true; - return; - } - do { - needBuild = false; - try { - const result = await tryBuild(builder); - if (serve) { - if (result) { - liveServer.reload(); - } else { - console.log("Not reloading due to errors"); - } - } - } catch (e) { - console.log(`Error building: ${e.message}`); - } - } while (needBuild); - building = false; - }); -} -module.exports = main; diff --git a/config/esbuild.js b/config/esbuild.js deleted file mode 100644 index b9ce7063d8..0000000000 --- a/config/esbuild.js +++ /dev/null @@ -1,327 +0,0 @@ -/** - * @license - * Copyright 2020 Google LLC - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// esbuild/typescript configuration and launcher for Neuroglancer. - -"use strict"; - -const svgInlineLoader = require("./esbuild_svg_inline_loader"); - -const esbuild = require("esbuild"); -const path = require("path"); -const fs = require("fs"); -const bundleConfig = require("./bundle-config"); -const { spawn } = require("child_process"); - -function getEntryPointContents(sources) { - return sources.map((path) => `import ${JSON.stringify(path)};\n`).join(""); -} - -const getEntryPointPlugin = (entryPointSources) => { - const entryPointResolveDir = path.resolve(__dirname, ".."); - const plugin = { - name: "entrypoint", - setup(build) { - build.onResolve({ filter: /^neuroglancer_entrypoint\// }, (args) => ({ - path: args.path.substr("neuroglancer_entrypoint/".length), - namespace: "neuroglancer_entrypoint", - })); - build.onLoad( - { filter: /.*/, namespace: "neuroglancer_entrypoint" }, - (args) => { - const m = args.path.match(/(.*)\.bundle.js$/); - if (m === null) return undefined; - const entryPoint = m[1]; - const sources = entryPointSources[entryPoint]; - if (sources === undefined) return undefined; - return { - contents: getEntryPointContents(sources), - resolveDir: entryPointResolveDir, - }; - }, - ); - }, - }; - const entryPoints = Object.keys(entryPointSources).map( - (name) => `neuroglancer_entrypoint/${name}.bundle.js`, - ); - return { plugin, entryPoints }; -}; -exports.getEntryPointPlugin = getEntryPointPlugin; - -function getCommonPlugins() { - return [svgInlineLoader({ removeSVGTagAttrs: false, removeTags: true })]; -} -exports.getCommonPlugins = getCommonPlugins; - -class Builder { - constructor(options = {}) { - const { id = "min" } = options; - const { - outDir = path.resolve(__dirname, "..", "dist", id), - python = false, - module: moduleBuild = false, - define = {}, - inject = [], - minify = true, - googleTagManager = undefined, - analyze = false, - } = options; - this.outDir = outDir; - this.cacheId = id; - const viewerConfig = bundleConfig.getViewerOptions( - {}, - { - python, - module: moduleBuild, - }, - ); - this.module = options.module; - this.bundleSources = bundleConfig.getBundleSources(viewerConfig); - this.minify = minify; - this.python = options.python; - this.srcDir = path.resolve(__dirname, "..", "src"); - this.plugins = getCommonPlugins(); - this.define = define; - this.inject = inject; - this.googleTagManager = googleTagManager; - this.analyze = analyze; - } - - // Deletes .js/.css/.html files from `this.outDir`. Can safely be used on - // `python/neuroglancer/static` directory. - async clearOutput() { - try { - const pattern = /\.(js|js\.map|html|css)$/; - const paths = await fs.promises.readdir(this.outDir); - for (const filename of paths) { - const p = path.resolve(this.outDir, filename); - if (!pattern.test(p)) continue; - try { - await fs.promises.unlink(p); - } catch { - // Ignore errors removing output files - } - } - } catch { - // ignore errors listing output directory (e.g. if it does not already exist) - } - } - - async writeIndex() { - let indexHtml = ` - - - - neuroglancer - -`; - - const { googleTagManager } = this; - if (googleTagManager) { - indexHtml += ` - - -`; - } - - indexHtml += ` - -
- - - -`; - - await fs.promises.writeFile( - path.resolve(this.outDir, "index.html"), - indexHtml, - ); - } - - getBaseEsbuildConfig(entryPointSources) { - const { plugin: entryPointPlugin, entryPoints } = - getEntryPointPlugin(entryPointSources); - return { - outdir: this.outDir, - define: { ...this.bundleSources.defines, ...this.define }, - inject: this.inject, - minify: this.minify, - target: "es2019", - plugins: [entryPointPlugin, ...this.plugins], - entryPoints, - loader: { ".wasm": "dataurl" }, - // TODO(jbms): Remove this workaround once evanw/esbuild#1202 is fixed. - banner: { - js: "function require(x) { throw new Error('Cannot require ' + x) }", - }, - }; - } - - getWorkerEntrypoints() { - return this.bundleSources.workers; - } - - getMainEntrypoint() { - return { main: this.bundleSources.main }; - } - - async build() { - const startTime = Date.now(); - try { - await fs.promises.mkdir(this.outDir, { recursive: true }); - if (this.module) { - await this.buildModule(); - } else { - await this.buildNonModule(); - } - } catch (e) { - console.log(`Error: ${e.message}`); - throw e; - } finally { - console.log(`Built in ${(Date.now() - startTime) / 1000.0} seconds`); - } - } - - async buildNonModule() { - await this.writeIndex(); - if (!this.python) { - await fs.promises.copyFile( - path.resolve(this.srcDir, "datasource/boss/bossauth.html"), - path.resolve(this.outDir, "bossauth.html"), - ); - await fs.promises.copyFile( - path.resolve(this.srcDir, "util/google_oauth2_redirect.html"), - path.resolve(this.outDir, "google_oauth2_redirect.html"), - ); - } - const result = await esbuild.build({ - ...this.getBaseEsbuildConfig({ - ...this.getMainEntrypoint(), - ...this.getWorkerEntrypoints(), - }), - bundle: true, - sourcemap: true, - metafile: true, - }); - if (this.analyze) { - console.log(await esbuild.analyzeMetafile(result.metafile)); - } - } - - async buildModule() { - await fs.promises.rm(this.outDir, { recursive: true }); - const { outDir } = this; - // Build workers and main bundle. The main bundle won't be saved, it is - // just to analyze dependencies and to generate the CSS bundle. - const [mainBuildResult, workerBuildResult] = await Promise.all([ - esbuild.build({ - ...this.getBaseEsbuildConfig(this.getMainEntrypoint()), - bundle: true, - write: false, - metafile: true, - }), - esbuild.build({ - ...this.getBaseEsbuildConfig(this.getWorkerEntrypoints()), - bundle: true, - }), - ]); - const metaEntry = mainBuildResult.metafile; - const cssEntry = mainBuildResult.outputFiles.find((entry) => - entry.path.endsWith(".css"), - ).contents; - await fs.promises.writeFile( - path.resolve(this.outDir, "main.css"), - cssEntry, - ); - const srcDirPrefix = this.srcDir + path.sep; - const dependencies = Object.keys(metaEntry.inputs).filter((x) => - x.startsWith("src/"), - ); - const buildResult = await esbuild.build({ - ...this.getBaseEsbuildConfig({}), - entryPoints: dependencies, - bundle: false, - write: false, - format: "esm", - }); - for (const entry of buildResult.outputFiles) { - if (entry.path.endsWith(".css")) continue; - await fs.promises.mkdir(path.dirname(entry.path), { recursive: true }); - await fs.promises.writeFile(entry.path, entry.contents); - } - } - - async typeCheck() { - const startTime = Date.now(); - try { - await new Promise((resolve, reject) => { - const child = spawn( - process.execPath, - [require.resolve("typescript/lib/tsc.js"), "--noEmit"], - { stdio: "inherit" }, - ); - child.on("close", (code) => { - if (code === 0) { - resolve(); - } else { - reject(new Error(`tsc exited with code: ${code}`)); - } - }); - }); - } finally { - console.log( - `Type checked in ${(Date.now() - startTime) / 1000.0} seconds`, - ); - } - } - - typeCheckWatch() { - const child = spawn( - process.execPath, - [ - require.resolve("typescript/lib/tsc.js"), - "--noEmit", - "--watch", - "--preserveWatchOutput", - ], - { stdio: "inherit" }, - ); - } - - async buildAndTypeCheck(options) { - const buildPromise = this.build(); - if (!options.skipTypeCheck) { - await this.typeCheck(); - } - await buildPromise; - } - - async buildOrExit(options) { - try { - await this.buildAndTypeCheck(options); - } catch (e) { - process.exit(1); - } - } -} -exports.Builder = Builder; diff --git a/config/esbuild_svg_inline_loader.js b/config/esbuild_svg_inline_loader.js deleted file mode 100644 index 1f11732d8f..0000000000 --- a/config/esbuild_svg_inline_loader.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @license - * Copyright 2020 Google LLC - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// esbuild equivalent of webpack's svg-inline-loader - -const fs = require("fs"); - -module.exports = (options) => { - const getExtractedSVG = require("svg-inline-loader").getExtractedSVG; - return { - name: "svg-inline-loader", - setup(build) { - build.onLoad({ filter: /.*\.svg$/, namespace: "file" }, async (args) => { - const text = await fs.promises.readFile(args.path, "utf8"); - const converted = getExtractedSVG(text, options); - return { - contents: `export default ${JSON.stringify(converted)};`, - }; - }); - }, - }; -}; diff --git a/config/generate_code.js b/config/generate-code.ts similarity index 100% rename from config/generate_code.js rename to config/generate-code.ts diff --git a/config/karma-entry-points.js b/config/karma-entry-points.js deleted file mode 100644 index 42d2e4a13b..0000000000 --- a/config/karma-entry-points.js +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @license - * Copyright 2016 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -"use strict"; - -const path = require("path"); -const yargs = require("yargs"); -const glob = require("glob"); -const { parseDefines } = require("./esbuild-cli"); -const { createEntryPointFile, getCommonPlugins } = require("./esbuild"); - -const getTestSources = (exports.getTestSources = (testPattern) => { - const { - argv: { pattern: userPattern }, - } = yargs.options({ - pattern: { - type: "string", - nargs: 1, - }, - }); - let testPaths = glob.sync(testPattern); - const userCwd = process.env.INIT_CWD || process.cwd(); - if (userPattern !== undefined) { - console.log( - "Restricting test files by glob pattern: " + JSON.stringify(userPattern), - ); - const userPaths = new Set(glob.sync(path.resolve(userCwd, userPattern))); - testPaths = testPaths.filter((x) => userPaths.has(x)); - console.log("Loading tests from: \n" + testPaths.join("\n")); - } - return testPaths; -}); - -exports.getEntryPointConfig = (testPattern, preprocessors = []) => { - const sources = getTestSources(testPattern); - return { - files: sources.map((name) => ({ pattern: name, watched: true })), - preprocessors: Object.fromEntries( - sources.map((name) => [name, ["esbuild", ...preprocessors]]), - ), - }; -}; - -exports.getEsbuildConfig = () => { - const { argv } = yargs.options({ - define: { - type: "array", - coerce: parseDefines, - default: [], - }, - }); - return { - target: "es2019", - plugins: getCommonPlugins(), - loader: { - ".json": "json", - ".dat": "binary", - ".npy": "binary", - }, - define: argv.define, - }; -}; diff --git a/config/karma.benchmark.js b/config/karma.benchmark.js deleted file mode 100644 index 09cdff4ac9..0000000000 --- a/config/karma.benchmark.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @license - * Copyright 2016-2020 Google LLC - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -"use strict"; - -const path = require("path"); -const { - getEntryPointConfig, - getEsbuildConfig, -} = require("./karma-entry-points"); - -module.exports = (config) => { - config.set({ - ...getEntryPointConfig( - path.resolve(__dirname, "..", "src", "**", "*.benchmark.ts"), - ), - esbuild: getEsbuildConfig(), - frameworks: ["benchmark"], - browsers: [ - "ChromeHeadless", - // 'Chrome', - // 'ChromeCanary', - ], - colors: true, - browserNoActivityTimeout: 60000, - reporters: ["benchmark"], - // logLevel: config.LOG_DEBUG, - singleRun: true, - plugins: [ - "karma-benchmark", - "karma-benchmark-reporter", - "karma-chrome-launcher", - "karma-firefox-launcher", - "karma-esbuild", - ], - }); -}; diff --git a/config/karma.conf.js b/config/karma.conf.js deleted file mode 100644 index 67ba143761..0000000000 --- a/config/karma.conf.js +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @license - * Copyright 2016 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -"use strict"; - -const path = require("path"); -const { - getEntryPointConfig, - getEsbuildConfig, -} = require("./karma-entry-points"); - -module.exports = (config) => { - config.set({ - ...getEntryPointConfig( - path.resolve(__dirname, "..", "src", "**", "*.spec.ts"), - ["sourcemap"], - ), - esbuild: getEsbuildConfig(), - frameworks: ["jasmine"], - browsers: [ - // 'Firefox', - // 'FirefoxHeadless', - // 'ChromeHeadless_custom', - // 'Chrome', - // 'ChromeCanary', - ], - colors: true, - browserNoActivityTimeout: 60000, - reporters: ["mocha"], - plugins: [ - "karma-sourcemap-loader", - "karma-jasmine", - "karma-mocha-reporter", - "karma-chrome-launcher", - "karma-firefox-launcher", - "karma-esbuild", - ], - }); -}; diff --git a/config/resolve_real.js b/config/resolve_real.js deleted file mode 100644 index a424a92d39..0000000000 --- a/config/resolve_real.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @license - * Copyright 2016 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -"use strict"; - -const path = require("path"); -const fs = require("fs"); - -/** - * Resolve a path to an absolute path, expanding all symbolic links. This is - * used to ensure that the same file is not seen under multiple paths by the - * TypeScript compiler, leading to the same file being compiled more than once, - * which can result in various errors. - */ -function resolveReal() { - return fs.realpathSync(path.resolve.apply(undefined, arguments)); -} -module.exports = resolveReal; diff --git a/config/static-site-live-server.js b/config/static-site-live-server.js deleted file mode 100644 index 2fb42514db..0000000000 --- a/config/static-site-live-server.js +++ /dev/null @@ -1,359 +0,0 @@ -/** - * @license - * Copyright 2020 Google LLC - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -"use strict"; - -// Serves a directory of static files, with programmatic control to force a -// browser reload. - -// Derived from https://github.com/tapio/live-server -// License -// Uses MIT licensed code from Connect and Roots. - -// (MIT License) - -// Copyright (c) 2012 Tapio Vierros - -// 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. - -const fs = require("fs"); -const connect = require("connect"); -const logger = require("morgan"); -const WebSocket = require("faye-websocket"); -const path = require("path"); -const url = require("url"); -const http = require("http"); -const send = require("send"); -const es = require("event-stream"); -const os = require("os"); -require("colors"); - -const getInjectedCode = ( - initialGeneration, -) => ` - -`; - -/** - * Rewrite request URL and pass it back to the static handler. - * @param staticHandler {function} Next handler - * @param file {string} Path to the entry point file - */ -function entryPoint(staticHandler, file) { - if (!file) - return (req, res, next) => { - next(); - }; - - return (req, res, next) => { - req.url = "/" + file; - staticHandler(req, res, next); - }; -} - -class LiveServer { - constructor(options = {}) { - this.generation = ""; - this.logLevel = 2; - this.clients = []; - } - - // Based on connect.static(), but streamlined and with added code injecter - staticServer(root) { - let isFile = false; - try { - // For supporting mounting files instead of just directories - isFile = fs.statSync(root).isFile(); - } catch (e) { - if (e.code !== "ENOENT") throw e; - } - return (req, res, next) => { - if (req.method !== "GET" && req.method !== "HEAD") return next(); - const reqpath = isFile ? "" : url.parse(req.url).pathname; - const hasNoOrigin = !req.headers.origin; - const injectCandidates = [ - new RegExp("", "i"), - new RegExp(""), - new RegExp("", "i"), - ]; - let injectTag = null; - let fileExt = ""; - - const directory = () => { - const pathname = url.parse(req.originalUrl).pathname; - res.statusCode = 301; - res.setHeader("Location", pathname + "/"); - res.end("Redirecting"); - }; - - const file = (filepath /*, stat*/) => { - fileExt = path.extname(filepath).toLocaleLowerCase(); - const possibleExtensions = [ - "", - ".html", - ".htm", - ".xhtml", - ".php", - ".svg", - ]; - - if (hasNoOrigin && possibleExtensions.indexOf(fileExt) > -1) { - // TODO: Sync file read here is not nice, but we need to determine if the html should be - // injected or not - const contents = fs.readFileSync(filepath, "utf8"); - for (let i = 0; i < injectCandidates.length; ++i) { - const match = injectCandidates[i].exec(contents); - if (match) { - injectTag = match[0]; - break; - } - } - if (injectTag === null && this.logLevel >= 3) { - console.warn( - "Failed to inject refresh script!".yellow, - "Couldn't find any of the tags ", - injectCandidates, - "from", - filepath, - ); - } - } - }; - - const error = (err) => { - if (err.status === 404) return next(); - next(err); - }; - - const inject = (stream) => { - if (fileExt === ".wasm") { - res.setHeader("Content-Type", "application/wasm"); - } - if (injectTag) { - const injectedCode = getInjectedCode(this.generation); - // We need to modify the length given to browser - const len = injectedCode.length + res.getHeader("Content-Length"); - res.setHeader("Content-Length", len); - const originalPipe = stream.pipe; - stream.pipe = (resp) => { - originalPipe - .call( - stream, - es.replace( - new RegExp(injectTag, "i"), - injectedCode + injectTag, - ), - ) - .pipe(resp); - }; - } - }; - - send(req, reqpath, { root: root }) - .on("error", error) - .on("directory", directory) - .on("file", file) - .on("stream", inject) - .pipe(res); - }; - } - - /** - * Start a live server with parameters given as an object - * @param host {string} Address to bind to (default: 0.0.0.0) - * @param port {number} Port number (default: 8080) - * @param root {string} Path to root directory (default: cwd) - * @param mount {array} Mount directories onto a route, e.g. [['/components', './node_modules']]. - * @param logLevel {number} 0 = errors only, 1 = some, 2 = lots - * @param file {string} Path to the entry point file - * }]. - */ - start(options = {}) { - const host = options.host || "0.0.0.0"; - const port = options.port !== undefined ? options.port : 8080; // 0 means random - const root = options.root || process.cwd(); - const mount = options.mount || []; - this.logLevel = options.logLevel === undefined ? 2 : options.logLevel; - const file = options.file; - const staticServerHandler = this.staticServer(root); - - // Setup a web server - const app = connect(); - - // Add logger. Level 2 logs only errors - if (this.logLevel === 2) { - app.use( - logger("dev", { - skip: (req, res) => res.statusCode < 400, - }), - ); - // Level 2 or above logs all requests - } else if (this.logLevel > 2) { - app.use(logger("dev")); - } - mount.forEach(function (mountRule) { - const mountPath = path.resolve(process.cwd(), mountRule[1]); - app.use(mountRule[0], this.staticServer(mountPath)); - if (this.logLevel >= 1) - console.log('Mapping %s to "%s"', mountRule[0], mountPath); - }); - app - .use(staticServerHandler) // Custom static server - .use(entryPoint(staticServerHandler, file)); - - const server = http.createServer(app); - const protocol = "http"; - - // Handle server startup errors - server.addListener("error", (e) => { - if (e.code === "EADDRINUSE") { - const serveURL = protocol + "://" + host + ":" + port; - console.log( - "%s is already in use. Trying another port.".yellow, - serveURL, - ); - setTimeout(() => { - server.listen(0, host); - }, 1000); - } else { - console.error(e.toString().red); - this.shutdown(); - } - }); - - // Handle successful server - server.addListener("listening", (/*e*/) => { - this.server = server; - - const address = server.address(); - const serveHost = - address.address === "0.0.0.0" ? "127.0.0.1" : address.address; - const openHost = host === "0.0.0.0" ? "127.0.0.1" : host; - - const serveURL = protocol + "://" + serveHost + ":" + address.port; - const openURL = protocol + "://" + openHost + ":" + address.port; - - let serveURLs = [serveURL]; - if (this.logLevel > 2 && address.address === "0.0.0.0") { - const ifaces = os.networkInterfaces(); - serveURLs = Object.keys(ifaces) - .map((iface) => ifaces[iface]) - // flatten address data, use only IPv4 - .reduce((data, addresses) => { - addresses - .filter((addr) => addr.family === "IPv4") - .forEach((addr) => { - data.push(addr); - }); - return data; - }, []) - .map((addr) => protocol + "://" + addr.address + ":" + address.port); - } - - // Output - if (this.logLevel >= 1) { - if (serveURL === openURL) - if (serveURLs.length === 1) { - console.log('Serving "%s" at %s'.green, root, serveURLs[0]); - } else { - console.log( - 'Serving "%s" at\n\t%s'.green, - root, - serveURLs.join("\n\t"), - ); - } - else - console.log('Serving "%s" at %s (%s)'.green, root, openURL, serveURL); - } - }); - - // Setup server to listen at port - server.listen(port, host); - - // WebSocket - server.addListener("upgrade", (request, socket, head) => { - const ws = new WebSocket(request, socket, head); - ws.onopen = () => { - ws.send(this.generation); - }; - - ws.onclose = () => { - this.clients = this.clients.filter((x) => x !== ws); - }; - - this.clients.push(ws); - }); - this.server = server; - return server; - } - - reload() { - this.generation = "" + Math.random(); - this.clients.forEach((ws) => { - if (ws) ws.send(this.generation); - }); - } - - shutdown() { - if (this.server) { - this.server.close(); - } - } -} - -module.exports = LiveServer; diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000000..644e58486a --- /dev/null +++ b/examples/README.md @@ -0,0 +1,47 @@ +This directory contains examples showing how to use Neuroglancer as a library in +a client-side web application. + +WARNING: Neuroglancer does not yet offer any stability guarantees for the +JavaScript API. + +Neuroglancer can be used as a dependency in three ways: + +1. Installing the published npm package via: + + ```shell + npm install neuroglancer + ``` + + This will use the built Neuroglancer package, with the TypeScript sources + already transpiled to JavaScript. This is the normal, recommended way to use + Neuroglancer and imposes the least requirements. + +2. Installing directly from the Github repository, via: + + ```shell + npm install google/neuroglancer + ``` + +3. Linking to a local checkout of the Neuroglancer repository via: + + ```shell + npm link neuroglancer + ``` + + or + + ```shell + npm install file:/local/path/to/neuroglancer + ``` + + This may be useful when developing Neuroglancer locally. In this case the + dependent project directly consumes the original TypeScript sources, and must + be configured with appropriate transpilation support. + +The following bundlers are known to be compatible: + +- [vite](./vite/) +- [parcel](./parcel/) +- [webpack](./webpack/) + +esbuild is not compatible due to https://github.com/evanw/esbuild/issues/795 diff --git a/examples/parcel/README.md b/examples/parcel/README.md new file mode 100644 index 0000000000..5afed86bd6 --- /dev/null +++ b/examples/parcel/README.md @@ -0,0 +1,90 @@ +# Using Parcel to bundle a dependent project + +## Required configuration + +### Subpath imports + +As described in +https://github.com/parcel-bundler/parcel/issues/7840#issuecomment-1570728149, to +support Node.js subpath imports and exports that are used by Neuroglancer, the +following must be included in `package.json`: + +```json +{ + "@parcel/resolver-default": { + "packageExports": true + } +} +``` + +### SVG inlining + +Neuroglancer expects to embed SVG contents directly by importing ".svg?raw" +modules. + +As this import syntax is not natively supported by Parcel, support must be added +explicitly in `.parcelrc`: + +```javascript + transformers: { + "*.svg": ["...", "@parcel/transformer-inline-string"], + }, +``` + +### SVGO configuration + +Parcel uses SVGO to minimize SVG assets. There are several issues that make the default SVGO configuration incompatible with Neuroglancer: + +- removeViewBox: https://github.com/svg/svgo/issues/1128 +- convertShapeToPath: https://github.com/svg/svgo/issues/1466 + +Thw following svgo configuration, which can be specified in `svgo.config.json`, +disables the problematic plugins: + +```json +{ + "plugins": [ + { + "name": "preset-default", + "params": { + "overrides": { + "removeViewBox": false, + "convertShapeToPath": false + } + } + } + ] +} +``` + +### HTML assets for auth redirect + +`.html` files that are used as auth redirect pages for the brainmaps and bossDB +data sources need to have stable names. This is accomplished using the +`parcel-namer-rewrite` plugin with the following configuration in +`package.json`: + +```json +{ + "parcel-namer-rewrite": { + "rules": { + "(.*).html": "$1.html" + } + } +} +``` + +and the following configuration in `.parcelrc`: + +```json +{ + "namers": ["parcel-namer-rewrite"] +} +``` + +## Limitations + +- Node.js conditions [cannot be + configured](https://github.com/parcel-bundler/parcel/issues/9514) (without a + custom resolver plugin), which means that it is not possible to disable + specific Neuroglancer features. diff --git a/examples/parcel/parcel-project-built/.gitignore b/examples/parcel/parcel-project-built/.gitignore new file mode 100644 index 0000000000..41889b37d4 --- /dev/null +++ b/examples/parcel/parcel-project-built/.gitignore @@ -0,0 +1,3 @@ +/node_modules/ +/dist/ +/.parcel-cache/ diff --git a/examples/parcel/parcel-project-built/.parcelrc b/examples/parcel/parcel-project-built/.parcelrc new file mode 100644 index 0000000000..717fb35101 --- /dev/null +++ b/examples/parcel/parcel-project-built/.parcelrc @@ -0,0 +1,9 @@ +{ + extends: "@parcel/config-default", + // Needed to ensure stable names for auth redirect .html files. + namers: ["parcel-namer-rewrite"], + // Needed for embedded svg icons. + transformers: { + "*.svg": ["...", "@parcel/transformer-inline-string"], + }, +} diff --git a/examples/parcel/parcel-project-built/index.html b/examples/parcel/parcel-project-built/index.html new file mode 100644 index 0000000000..17e5273b9f --- /dev/null +++ b/examples/parcel/parcel-project-built/index.html @@ -0,0 +1,8 @@ + + + + Parcel project test + + + + diff --git a/examples/parcel/parcel-project-built/package-lock.json b/examples/parcel/parcel-project-built/package-lock.json new file mode 100644 index 0000000000..49622858c5 --- /dev/null +++ b/examples/parcel/parcel-project-built/package-lock.json @@ -0,0 +1,4307 @@ +{ + "name": "neuroglancer-parcel-project-built", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "neuroglancer-parcel-project-built", + "version": "0.0.0", + "license": "Apache-2.0", + "dependencies": { + "neuroglancer": "file:../../../dist/package" + }, + "devDependencies": { + "@parcel/transformer-inline-string": "^2.11.0", + "parcel": "^2.11.0", + "parcel-namer-rewrite": "^2.10.3-rc.2" + } + }, + "../../../dist/package": { + "name": "neuroglancer", + "version": "2.39.0", + "license": "Apache-2.0", + "dependencies": { + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.1", + "pako": "^2.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "../../dist/module": { + "name": "neuroglancer", + "version": "0.0.0-beta.0", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/node": "^18.14.6", + "@types/pako": "^2.0.0", + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.5.4", + "numcodecs": "^0.3.1", + "pako": "^2.0.3", + "typescript": "^5.3.3" + }, + "engines": { + "node": ">=12" + } + }, + "../../dist/package": { + "name": "neuroglancer", + "version": "0.0.0-beta.0", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/node": "^20.11.14", + "@types/pako": "^2.0.3", + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.1", + "pako": "^2.1.0", + "typescript": "^5.3.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lezer/common": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz", + "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==", + "dev": true + }, + "node_modules/@lezer/lr": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.0.tgz", + "integrity": "sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==", + "dev": true, + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.8.5.tgz", + "integrity": "sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.8.5.tgz", + "integrity": "sha512-w/sLhN4T7MW1nB3R/U8WK5BgQLz904wh+/SmA2jD8NnF7BLLoUgflCNxOeSPOWp8geP6nP/+VjWzZVip7rZ1ug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.8.5.tgz", + "integrity": "sha512-c0TGMbm2M55pwTDIfkDLB6BpIsgxV4PjYck2HiOX+cy/JWiBXz32lYbarPqejKs9Flm7YVAKSILUducU9g2RVg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.8.5.tgz", + "integrity": "sha512-vtbZRHH5UDlL01TT5jB576Zox3+hdyogvpcbvVJlmU5PdL3c5V7cj1EODdh1CHPksRl+cws/58ugEHi8bcj4Ww==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.8.5.tgz", + "integrity": "sha512-Xkc8IUx9aEhP0zvgeKy7IQ3ReX2N8N1L0WPcQwnZweWmOuKfwpS3GRIYqLtK5za/w3E60zhFfNdS+3pBZPytqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.8.5.tgz", + "integrity": "sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@mischnic/json-sourcemap": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.1.tgz", + "integrity": "sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==", + "dev": true, + "dependencies": { + "@lezer/common": "^1.0.0", + "@lezer/lr": "^1.0.0", + "json5": "^2.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz", + "integrity": "sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz", + "integrity": "sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz", + "integrity": "sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz", + "integrity": "sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz", + "integrity": "sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz", + "integrity": "sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@parcel/bundler-default": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.11.0.tgz", + "integrity": "sha512-ZIs0865Lp871ZK83k5I9L4DeeE26muNMrHa7j8bvls6fKBJKAn8djrhfU4XOLyziU4aAOobcPwXU0+npWqs52g==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/graph": "3.1.0", + "@parcel/plugin": "2.11.0", + "@parcel/rust": "2.11.0", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/cache": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.11.0.tgz", + "integrity": "sha512-RSSkGNjO00lJPyftzaC9eaNVs4jMjPSAm0VJNWQ9JSm2n4A9BzQtTFAt1vhJOzzW1UsQvvBge9DdfkB7a2gIOw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.11.0", + "@parcel/logger": "2.11.0", + "@parcel/utils": "2.11.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@parcel/codeframe": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.11.0.tgz", + "integrity": "sha512-YHs9g/i5af/sd/JrWAojU9YFbKffcJ3Tx2EJaK0ME8OJsye91UaI/3lxSUYLmJG9e4WLNJtqci8V5FBMz//ZPg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/compressor-raw": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.11.0.tgz", + "integrity": "sha512-RArhBPRTCfz77soX2IECH09NUd76UBWujXiPRcXGPIHK+C3L1cRuzsNcA39QeSb3thz3b99JcozMJ1nkC2Bsgw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/config-default": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/config-default/-/config-default-2.11.0.tgz", + "integrity": "sha512-1e2+qcZkm5/0f4eI20p/DemcYiSxq9d/eyjpTXA7PulJaHbL1wonwUAuy3mvnAvDnLOJmAk/obDVgX1ZfxMGtg==", + "dev": true, + "dependencies": { + "@parcel/bundler-default": "2.11.0", + "@parcel/compressor-raw": "2.11.0", + "@parcel/namer-default": "2.11.0", + "@parcel/optimizer-css": "2.11.0", + "@parcel/optimizer-htmlnano": "2.11.0", + "@parcel/optimizer-image": "2.11.0", + "@parcel/optimizer-svgo": "2.11.0", + "@parcel/optimizer-swc": "2.11.0", + "@parcel/packager-css": "2.11.0", + "@parcel/packager-html": "2.11.0", + "@parcel/packager-js": "2.11.0", + "@parcel/packager-raw": "2.11.0", + "@parcel/packager-svg": "2.11.0", + "@parcel/packager-wasm": "2.11.0", + "@parcel/reporter-dev-server": "2.11.0", + "@parcel/resolver-default": "2.11.0", + "@parcel/runtime-browser-hmr": "2.11.0", + "@parcel/runtime-js": "2.11.0", + "@parcel/runtime-react-refresh": "2.11.0", + "@parcel/runtime-service-worker": "2.11.0", + "@parcel/transformer-babel": "2.11.0", + "@parcel/transformer-css": "2.11.0", + "@parcel/transformer-html": "2.11.0", + "@parcel/transformer-image": "2.11.0", + "@parcel/transformer-js": "2.11.0", + "@parcel/transformer-json": "2.11.0", + "@parcel/transformer-postcss": "2.11.0", + "@parcel/transformer-posthtml": "2.11.0", + "@parcel/transformer-raw": "2.11.0", + "@parcel/transformer-react-refresh-wrap": "2.11.0", + "@parcel/transformer-svg": "2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@parcel/core": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.11.0.tgz", + "integrity": "sha512-Npe0S6hVaqWEwRL+HI7gtOYOaoE5bJQZTgUDhsDoppWbau51jOlRYOZTXuvRK/jxXnze4/S1sdM24xBYAQ5qkw==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/cache": "2.11.0", + "@parcel/diagnostic": "2.11.0", + "@parcel/events": "2.11.0", + "@parcel/fs": "2.11.0", + "@parcel/graph": "3.1.0", + "@parcel/logger": "2.11.0", + "@parcel/package-manager": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/profiler": "2.11.0", + "@parcel/rust": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "@parcel/workers": "2.11.0", + "abortcontroller-polyfill": "^1.1.9", + "base-x": "^3.0.8", + "browserslist": "^4.6.6", + "clone": "^2.1.1", + "dotenv": "^7.0.0", + "dotenv-expand": "^5.1.0", + "json5": "^2.2.0", + "msgpackr": "^1.9.9", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/diagnostic": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.11.0.tgz", + "integrity": "sha512-4dJmOXVL5YGGQRRsQosQbSRONBcboB71mSwaeaEgz3pPdq9QXVPLACkGe/jTXSqa3OnAHu3g5vQLpE1g5xqBqw==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/events": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.11.0.tgz", + "integrity": "sha512-K6SOjOrQsz1GdNl2qKBktq7KJ3Q3yxK8WXdmQYo10wG39dr051xtMb38aqieTp4eVhL8Yaq2iJgGkdr11fuBnA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/fs": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.11.0.tgz", + "integrity": "sha512-zWckdnnovdrgdFX4QYuQV4bbKCsh6IYCkmwaB4yp47rhw1MP0lkBINLt4yFPHBxWXOpElCfxjL+z69c9xJQRBQ==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.11.0", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@parcel/graph": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-3.1.0.tgz", + "integrity": "sha512-d1dTW5C7A52HgDtoXlyvlET1ypSlmIxSIZOJ1xp3R9L9hgo3h1u3jHNyaoTe/WPkGVe2QnFxh0h+UibVJhu9vg==", + "dev": true, + "dependencies": { + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/logger": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.11.0.tgz", + "integrity": "sha512-HtMEdCq3LKnvv4T2CIskcqlf2gpBvHMm3pkeUFB/hc/7hW/hE1k6/HA2VOQvc0tBsaMpmEx7PCrfrH56usQSyA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/events": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/markdown-ansi": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.11.0.tgz", + "integrity": "sha512-YA60EWbXi6cLOIzcwRC2wijotPauOGQbUi0vSbu0O6/mjQ68kWCMGz0hwZjDRQcPypQVJEIvTgMymLbvumxwhg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/namer-default": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.11.0.tgz", + "integrity": "sha512-DEwBSKSClg4DA2xAWimYkw9bFi7MFb9TdT7/TYZStMTsfYHPWOyyjGR7aVr3Ra4wNb+XX6g4rR41yp3HD6KO7A==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/node-resolver-core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.2.0.tgz", + "integrity": "sha512-XJRSxCkNbGFWjfmwFdcQZ/qlzWZd35qLtvLz2va8euGL7M5OMEQOv7dsvEhl0R+CC2zcnfFzZwxk78q6ezs8AQ==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.11.0", + "@parcel/fs": "2.11.0", + "@parcel/rust": "2.11.0", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-css": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-css/-/optimizer-css-2.11.0.tgz", + "integrity": "sha512-bV97PRxshHV3dMwOpLRgcP1QNhrVWh6VVDfm2gmWULpvsjoykcPS6vrCFksY5CpQsSvNHqJBzQjWS8FubUI76w==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.11.0", + "browserslist": "^4.6.6", + "lightningcss": "^1.22.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-htmlnano": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.11.0.tgz", + "integrity": "sha512-c20pz4EFF5DNFmqYgptlIj49eT6xjGLkDTdHH3RRzxKovuSXWfYSPs3GED3ZsjVuQyjNQif+/MAk9547F7hrdQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "htmlnano": "^2.0.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "svgo": "^2.4.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@parcel/optimizer-image": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-image/-/optimizer-image-2.11.0.tgz", + "integrity": "sha512-jCaJww5QFG2GuNzYW8nlSW+Ea+Cv47TRnOPJNquFIajgfTLJ5ddsWbaNal0GQsL8yNiCBKWd1AV4W0RH9tG0Jg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/rust": "2.11.0", + "@parcel/utils": "2.11.0", + "@parcel/workers": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@parcel/optimizer-svgo": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-svgo/-/optimizer-svgo-2.11.0.tgz", + "integrity": "sha512-TQpvfBhjV2IsuFHXUolbDS6XWB3DDR2rYTlqlA8LMmuOY7jQd9Bnkl4JnapzWm/bRuzRlzdGjjVCPGL8iShFvA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0", + "svgo": "^2.4.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/@parcel/optimizer-svgo/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@parcel/optimizer-swc": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-swc/-/optimizer-swc-2.11.0.tgz", + "integrity": "sha512-ftf42F3JyZxJb6nnLlgNGyNQ273YOla4dFGH/tWC8iTwObHUpWe7cMbCGcrSJBvAlsLkZfLpFNAXFxUgxdKyHQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.11.0", + "@swc/core": "^1.3.36", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/package-manager": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.11.0.tgz", + "integrity": "sha512-QzdsrUYlAwIzb8by7WJjqYnbR1MoMKWbtE1MXUeYsZbFusV8B6pOH+lwqNJKS/BFtddZMRPYFueZS2N2fwzjig==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/fs": "2.11.0", + "@parcel/logger": "2.11.0", + "@parcel/node-resolver-core": "3.2.0", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "@parcel/workers": "2.11.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@parcel/packager-css": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-css/-/packager-css-2.11.0.tgz", + "integrity": "sha512-AyIxsp4eL8c22vp2oO2hSRnr3hSVNkARNZc9DG6uXxCc2Is5tUEX0I4PwxWnAx0EI44l+3zX/o414zT8yV9wwQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-html/-/packager-html-2.11.0.tgz", + "integrity": "sha512-ho5AQ70naTV8IqkKIbKtK+jsXQ5TJfFgtBvmJlyB3YydRMbIc+3g4G0xgIvf15V4uCMw9Md0Sv1W65nQXHPQoA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.11.0.tgz", + "integrity": "sha512-SxjCsd0xQfg5H73YtVJj9VOpr9s0rwMsSoeykjkatbkEla9NsZajsUkd/bfYf+/0WvEKOrB8oUBo15HkGOgKug==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/rust": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "globals": "^13.2.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-raw": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.11.0.tgz", + "integrity": "sha512-2/0JQ8DZrz7cVNXwD6OYoUUtSSnlr4dsz8ZkpFDKsBJhvMHtC78Sq+1EDixDGOMiUcalSEjNsoHtkpq9uNh+Xw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.11.0.tgz", + "integrity": "sha512-2wQBkzLwcaWFGWz8TP+bgsXgiueWPzrjKsWugWdDfq0FbXh8XVeR/599qnus3RFHZy4cH6L6yq/7zxcljtxK8A==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "posthtml": "^0.16.4" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-wasm": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-wasm/-/packager-wasm-2.11.0.tgz", + "integrity": "sha512-tTy4EbDXeeiZ0oB7L2FWaHSD1mbmYZP6R5HXqkvc5dECGUKPU5Jz6ek2C5AM+HfQdQLKXPQ/Xw3eJnI/AmctVg==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0" + }, + "engines": { + "node": ">=12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.11.0.tgz", + "integrity": "sha512-9npuKBlhnPn7oeUpLJGecceg16GkXbvzbr6MNSZiHhkx3IBeITHQXlZnp2zAjUOFreNsYOfifwEF2S4KsARfBQ==", + "dev": true, + "dependencies": { + "@parcel/types": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/profiler": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.11.0.tgz", + "integrity": "sha512-s10SS09prOdwnaAcjK8M5zO8o+zPJJW5oOqXPNdf6KH4NGD/ue7iOk2xM8QLw6ulSwxE7NDt++lyfW3AXgCZwg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/events": "2.11.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/reporter-cli/-/reporter-cli-2.11.0.tgz", + "integrity": "sha512-hY0iO0f+LifgJHDUIjGQJnxLFSkk2jlbfy+kIaft5oI3/IM+UljecfGO+14XH8mYlqRXXPsT09TJe8ZKQzp4ZQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "chalk": "^4.1.0", + "cli-progress": "^3.12.0", + "term-size": "^2.2.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.11.0.tgz", + "integrity": "sha512-T4ue1+oLFNdcd9maw8QWQuxzOS2kX2jOrSvYKwYd9oGnqiAr1rpiHYYKJhHng+PF5ybwWkj8dUJfGh2NoQysJA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/reporter-tracer/-/reporter-tracer-2.11.0.tgz", + "integrity": "sha512-33q4ftO26OPWHkUpEm0bzzSjW2kHEh6q/JFePwf8W6APTQVruj4mV46+Fh6rxX42ixs92K/QoiE0gYgWZQVDHA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0", + "chrome-trace-event": "^1.0.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.11.0.tgz", + "integrity": "sha512-suZNN2lE5W48LPTwAbG7gnj1IeubkCVEm0XspWXcXUtCzglimNJ8PVVBGx171o5CqDpdbGF3AqHjG9N3uOwXag==", + "dev": true, + "dependencies": { + "@parcel/node-resolver-core": "3.2.0", + "@parcel/plugin": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.11.0.tgz", + "integrity": "sha512-uVwNBtoLMrlPHLvRS05BVhLseduMOpZT36yiIjS0YSBJcC6/otI9AY7ZiDPYmrB5xTqM0R+D554JhPaJHCuocw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.11.0.tgz", + "integrity": "sha512-fH3nJoexINz7s4cDzp0Vjsx0k1pMYSa5ch38LbbNqCKTermy0pS0zZuvgfLfHFFP+AMRpFQenrF7h7N3bgDmHw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.11.0.tgz", + "integrity": "sha512-Kfnc7gLjhoephLMnjABrkIkzVfzPrpJlxiJFIleY2Fm57YhmCfKsEYxm3lHOutNaYl1VArW0LKClPH/VHG9vfQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0", + "react-error-overlay": "6.0.9", + "react-refresh": "^0.9.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.11.0.tgz", + "integrity": "sha512-c8MaSpSbXIKuN5sA/g4UsrsH1BtBZ6Em+eSxt9AYbdPtWrW+qwCioNVZj9lugBRUzDMjVfJz0yK59nS42hABvw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/rust": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.11.0.tgz", + "integrity": "sha512-UkLWdHOD8Md2YmJDPsqd3yIs9chhdl/ATfV/B/xdPKGmqtNouYpDCRlq+WxMt3mLoYgHEg9UwrWLTebo2rr2iQ==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/source-map": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz", + "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": "^12.18.3 || >=14" + } + }, + "node_modules/@parcel/transformer-babel": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-babel/-/transformer-babel-2.11.0.tgz", + "integrity": "sha512-WKGblnp7r426VG+cpeQzc6dj/30EoUaYwyl4OEaigQSJizyuPWTBWTz6FUw+ih1/sg37h+D1BIh9C2FsVzpzbw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.11.0", + "browserslist": "^4.6.6", + "json5": "^2.2.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-css/-/transformer-css-2.11.0.tgz", + "integrity": "sha512-nFmBulF/ErNoafO87JbVrBavjBMNwE/kahbCRVxc2Mvlphz4F4lBW4eDRS5l4xBqFJaNkHr9R55ehLBBilF4Jw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.11.0", + "browserslist": "^4.6.6", + "lightningcss": "^1.22.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-html": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-html/-/transformer-html-2.11.0.tgz", + "integrity": "sha512-90vp7mbvvfqPr9XIINpMcELtywj56f1bxfOkLQgWU1bm22H0FT3i5dqdac++2My0IGDvMwhAEjQfbn4pA579NQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/rust": "2.11.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^7.5.2", + "srcset": "4" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-image/-/transformer-image-2.11.0.tgz", + "integrity": "sha512-QiZj18UHf3lVFsi65Vz8YbS3ydx9Pe9x8ktMxE1oh9qpznN8lD7gE/Z9DxuTZB84EZ9pKytKwcv5WGXP25xIFg==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0", + "@parcel/workers": "2.11.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@parcel/transformer-inline-string": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-inline-string/-/transformer-inline-string-2.11.0.tgz", + "integrity": "sha512-yLLjVqS7/P/ySOOjwdl2mElNHmCtJK81+7mnoA2oLEsf4kTKlW3JnIvX5BqJj6Dy6Ek0V1M48E86T9U3fwzWzg==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-js": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.11.0.tgz", + "integrity": "sha512-G1sv0n8/fJqHqwUs0iVnVdmRY0Kh8kWaDkuWcU/GJBHMGhUnLXKdNwxX2Av9UdBL14bU1nTINfr9qOfnQotXWg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/rust": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.11.0", + "@parcel/workers": "2.11.0", + "@swc/helpers": "^0.5.0", + "browserslist": "^4.6.6", + "nullthrows": "^1.1.1", + "regenerator-runtime": "^0.13.7", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@parcel/transformer-json": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.11.0.tgz", + "integrity": "sha512-Wt/wgSBaRWmPL4gpvjkV0bCBRxFOtsuLNzsm8vYA5poxTFhuLY+AoyQ8S2+xXU4VxwBfdppfIr2Ny3SwGs8xbQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "json5": "^2.2.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-postcss": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-postcss/-/transformer-postcss-2.11.0.tgz", + "integrity": "sha512-Ugy8XHBaUptGotsvwzq7gPCvkCopTIqqZ0JZ40Jmy9slGms8wnx06pNHA1Be/RcJwkJ2TbSu+7ncZdgmP5x5GQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/rust": "2.11.0", + "@parcel/utils": "2.11.0", + "clone": "^2.1.1", + "nullthrows": "^1.1.1", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-posthtml": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-posthtml/-/transformer-posthtml-2.11.0.tgz", + "integrity": "sha512-dMK4p1RRAoIJEjK/Wz9GOLqwHqdD/VQDhMPk+6sUKp5zf2MhSohUstpp5gKsSZivCM3PS2f8k9rgroacJ/ReuA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-raw": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.11.0.tgz", + "integrity": "sha512-2ltp3TgS+cxEqSM1vk5gDtJrYx4KMuRRtbSgSvkdldyOgPhflnLU3/HRz72hXSNGqYOV0/JN0+ocsfPnqR00ug==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-react-refresh-wrap": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.11.0.tgz", + "integrity": "sha512-6pY0CdIgIpXC6XpsDWizf+zLgiuEsJ106HjWLwF7/R72BrvDhLPZ6jRu4UTrnd6bM89KahPw9fZZzjKoA5Efcw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0", + "react-refresh": "^0.9.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-svg": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-svg/-/transformer-svg-2.11.0.tgz", + "integrity": "sha512-GrTNi04OoQSXsyrB7FqQPeYREscEXFhIBPkyQ0q7WDG/yYynWljiA0kwITCtMjPfv2EDVks292dvM3EcnERRIA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/rust": "2.11.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/types": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.11.0.tgz", + "integrity": "sha512-lN5XlfV9b1s2rli8q1LqsLtu+D4ZwNI3sKmNcL/3tohSfQcF2EgF+MaiANGo9VzXOzoWFHt4dqWjO4OcdyC5tg==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.11.0", + "@parcel/diagnostic": "2.11.0", + "@parcel/fs": "2.11.0", + "@parcel/package-manager": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.11.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/utils": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.11.0.tgz", + "integrity": "sha512-AcL70cXlIyE7eQdvjQbYxegN5l+skqvlJllxTWg4YkIZe9p8Gmv74jLAeLWh5F+IGl5WRn0TSy9JhNJjIMQGwQ==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.11.0", + "@parcel/diagnostic": "2.11.0", + "@parcel/logger": "2.11.0", + "@parcel/markdown-ansi": "2.11.0", + "@parcel/rust": "2.11.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.0.tgz", + "integrity": "sha512-XJLGVL0DEclX5pcWa2N9SX1jCGTDd8l972biNooLFtjneuGqodupPQh6XseXIBBeVIMaaJ7bTcs3qGvXwsp4vg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.4.0", + "@parcel/watcher-darwin-arm64": "2.4.0", + "@parcel/watcher-darwin-x64": "2.4.0", + "@parcel/watcher-freebsd-x64": "2.4.0", + "@parcel/watcher-linux-arm-glibc": "2.4.0", + "@parcel/watcher-linux-arm64-glibc": "2.4.0", + "@parcel/watcher-linux-arm64-musl": "2.4.0", + "@parcel/watcher-linux-x64-glibc": "2.4.0", + "@parcel/watcher-linux-x64-musl": "2.4.0", + "@parcel/watcher-win32-arm64": "2.4.0", + "@parcel/watcher-win32-ia32": "2.4.0", + "@parcel/watcher-win32-x64": "2.4.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.0.tgz", + "integrity": "sha512-+fPtO/GsbYX1LJnCYCaDVT3EOBjvSFdQN9Mrzh9zWAOOfvidPWyScTrHIZHHfJBvlHzNA0Gy0U3NXFA/M7PHUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.0.tgz", + "integrity": "sha512-T/At5pansFuQ8VJLRx0C6C87cgfqIYhW2N/kBfLCUvDhCah0EnLLwaD/6MW3ux+rpgkpQAnMELOCTKlbwncwiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.0.tgz", + "integrity": "sha512-vZMv9jl+szz5YLsSqEGCMSllBl1gU1snfbRL5ysJU03MEa6gkVy9OMcvXV1j4g0++jHEcvzhs3Z3LpeEbVmY6Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.0.tgz", + "integrity": "sha512-dHTRMIplPDT1M0+BkXjtMN+qLtqq24sLDUhmU+UxxLP2TEY2k8GIoqIJiVrGWGomdWsy5IO27aDV1vWyQ6gfHA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.0.tgz", + "integrity": "sha512-9NQXD+qk46RwATNC3/UB7HWurscY18CnAPMTFcI9Y8CTbtm63/eex1SNt+BHFinEQuLBjaZwR2Lp+n7pmEJPpQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.0.tgz", + "integrity": "sha512-QuJTAQdsd7PFW9jNGaV9Pw+ZMWV9wKThEzzlY3Lhnnwy7iW23qtQFPql8iEaSFMCVI5StNNmONUopk+MFKpiKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.0.tgz", + "integrity": "sha512-oyN+uA9xcTDo/45bwsd6TFHa7Lc7hKujyMlvwrCLvSckvWogndCEoVYFNfZ6JJ2KNL/6fFiGPcbjp8jJmEh5Ng==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.0.tgz", + "integrity": "sha512-KphV8awJmxU3q52JQvJot0QMu07CIyEjV+2Tb2ZtbucEgqyRcxOBDMsqp1JNq5nuDXtcCC0uHQICeiEz38dPBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.0.tgz", + "integrity": "sha512-7jzcOonpXNWcSijPpKD5IbC6xC7yTibjJw9jviVzZostYLGxbz8LDJLUnLzLzhASPlPGgpeKLtFUMjAAzM+gSA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.0.tgz", + "integrity": "sha512-NOej2lqlq8bQNYhUMnOD0nwvNql8ToQF+1Zhi9ULZoG+XTtJ9hNnCFfyICxoZLXor4bBPTOnzs/aVVoefYnjIg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.0.tgz", + "integrity": "sha512-IO/nM+K2YD/iwjWAfHFMBPz4Zqn6qBDqZxY4j2n9s+4+OuTSRM/y/irksnuqcspom5DjkSeF9d0YbO+qpys+JA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.0.tgz", + "integrity": "sha512-pAUyUVjfFjWaf/pShmJpJmNxZhbMvJASUpdes9jL6bTEJ+gDxPRSpXTIemNyNsb9AtbiGXs9XduP1reThmd+dA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/workers": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.11.0.tgz", + "integrity": "sha512-wjybqdSy6Nk0N9iBGsFcp7739W2zvx0WGfVxPVShqhz46pIkPOiFF/iSn+kFu5EmMKTRWeUif42+a6rRZ7pCnQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/logger": "2.11.0", + "@parcel/profiler": "2.11.0", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@swc/core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.1.tgz", + "integrity": "sha512-3y+Y8js+e7BbM16iND+6Rcs3jdiL28q3iVtYsCviYSSpP2uUVKkp5sJnCY4pg8AaVvyN7CGQHO7gLEZQ5ByozQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.2", + "@swc/types": "^0.1.5" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.4.1", + "@swc/core-darwin-x64": "1.4.1", + "@swc/core-linux-arm-gnueabihf": "1.4.1", + "@swc/core-linux-arm64-gnu": "1.4.1", + "@swc/core-linux-arm64-musl": "1.4.1", + "@swc/core-linux-x64-gnu": "1.4.1", + "@swc/core-linux-x64-musl": "1.4.1", + "@swc/core-win32-arm64-msvc": "1.4.1", + "@swc/core-win32-ia32-msvc": "1.4.1", + "@swc/core-win32-x64-msvc": "1.4.1" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.1.tgz", + "integrity": "sha512-ePyfx0348UbR4DOAW24TedeJbafnzha8liXFGuQ4bdXtEVXhLfPngprrxKrAddCuv42F9aTxydlF6+adD3FBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.1.tgz", + "integrity": "sha512-eLf4JSe6VkCMdDowjM8XNC5rO+BrgfbluEzAVtKR8L2HacNYukieumN7EzpYCi0uF1BYwu1ku6tLyG2r0VcGxA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.1.tgz", + "integrity": "sha512-K8VtTLWMw+rkN/jDC9o/Q9SMmzdiHwYo2CfgkwVT29NsGccwmNhCQx6XoYiPKyKGIFKt4tdQnJHKUFzxUqQVtQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.1.tgz", + "integrity": "sha512-0e8p4g0Bfkt8lkiWgcdiENH3RzkcqKtpRXIVNGOmVc0OBkvc2tpm2WTx/eoCnes2HpTT4CTtR3Zljj4knQ4Fvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.1.tgz", + "integrity": "sha512-b/vWGQo2n7lZVUnSQ7NBq3Qrj85GrAPPiRbpqaIGwOytiFSk8VULFihbEUwDe0rXgY4LDm8z8wkgADZcLnmdUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.1.tgz", + "integrity": "sha512-AFMQlvkKEdNi1Vk2GFTxxJzbICttBsOQaXa98kFTeWTnFFIyiIj2w7Sk8XRTEJ/AjF8ia8JPKb1zddBWr9+bEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.1.tgz", + "integrity": "sha512-QX2MxIECX1gfvUVZY+jk528/oFkS9MAl76e3ZRvG2KC/aKlCQL0KSzcTSm13mOxkDKS30EaGRDRQWNukGpMeRg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.1.tgz", + "integrity": "sha512-OklkJYXXI/tntD2zaY8i3iZldpyDw5q+NAP3k9OlQ7wXXf37djRsHLV0NW4+ZNHBjE9xp2RsXJ0jlOJhfgGoFA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.1.tgz", + "integrity": "sha512-MBuc3/QfKX9FnLOU7iGN+6yHRTQaPQ9WskiC8s8JFiKQ+7I2p25tay2RplR9dIEEGgVAu6L7auv96LbNTh+FaA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.1.tgz", + "integrity": "sha512-lu4h4wFBb/bOK6N2MuZwg7TrEpwYXgpQf5R7ObNSXL65BwZ9BG8XRzD+dLJmALu8l5N08rP/TrpoKRoGT4WSxw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, + "node_modules/@swc/helpers": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", + "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@swc/types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", + "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "dev": true + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/abortcontroller-polyfill": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", + "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001587", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz", + "integrity": "sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cli-progress": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", + "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", + "dev": true, + "dependencies": { + "string-width": "^4.2.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", + "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.668", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.668.tgz", + "integrity": "sha512-ZOBocMYCehr9W31+GpMclR+KBaDZOoAEabLdhpZ8oU1JFDwIaFY0UDbpXVEUFc0BIP2O2Qn3rkfCjQmMR4T/bQ==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", + "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/htmlnano": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-2.1.0.tgz", + "integrity": "sha512-jVGRE0Ep9byMBKEu0Vxgl8dhXYOUk0iNQ2pjsG+BcRB0u0oDF5A9p/iBGMg/PGKYUyMD0OAGu8dVT5Lzj8S58g==", + "dev": true, + "dependencies": { + "cosmiconfig": "^8.0.0", + "posthtml": "^0.16.5", + "timsort": "^0.3.0" + }, + "peerDependencies": { + "cssnano": "^6.0.0", + "postcss": "^8.3.11", + "purgecss": "^5.0.0", + "relateurl": "^0.2.7", + "srcset": "4.0.0", + "svgo": "^3.0.2", + "terser": "^5.10.0", + "uncss": "^0.17.3" + }, + "peerDependenciesMeta": { + "cssnano": { + "optional": true + }, + "postcss": { + "optional": true + }, + "purgecss": { + "optional": true + }, + "relateurl": { + "optional": true + }, + "srcset": { + "optional": true + }, + "svgo": { + "optional": true + }, + "terser": { + "optional": true + }, + "uncss": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-json": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", + "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", + "dev": true + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.23.0.tgz", + "integrity": "sha512-SEArWKMHhqn/0QzOtclIwH5pXIYQOUEkF8DgICd/105O+GCgd7jxjNod/QPnBCSWvpRHQBGVz5fQ9uScby03zA==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.23.0", + "lightningcss-darwin-x64": "1.23.0", + "lightningcss-freebsd-x64": "1.23.0", + "lightningcss-linux-arm-gnueabihf": "1.23.0", + "lightningcss-linux-arm64-gnu": "1.23.0", + "lightningcss-linux-arm64-musl": "1.23.0", + "lightningcss-linux-x64-gnu": "1.23.0", + "lightningcss-linux-x64-musl": "1.23.0", + "lightningcss-win32-x64-msvc": "1.23.0" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.23.0.tgz", + "integrity": "sha512-kl4Pk3Q2lnE6AJ7Qaij47KNEfY2/UXRZBT/zqGA24B8qwkgllr/j7rclKOf1axcslNXvvUdztjo4Xqh39Yq1aA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.23.0.tgz", + "integrity": "sha512-KeRFCNoYfDdcolcFXvokVw+PXCapd2yHS1Diko1z1BhRz/nQuD5XyZmxjWdhmhN/zj5sH8YvWsp0/lPLVzqKpg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.23.0.tgz", + "integrity": "sha512-xhnhf0bWPuZxcqknvMDRFFo2TInrmQRWZGB0f6YoAsZX8Y+epfjHeeOIGCfAmgF0DgZxHwYc8mIR5tQU9/+ROA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.23.0.tgz", + "integrity": "sha512-fBamf/bULvmWft9uuX+bZske236pUZEoUlaHNBjnueaCTJ/xd8eXgb0cEc7S5o0Nn6kxlauMBnqJpF70Bgq3zg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.23.0.tgz", + "integrity": "sha512-RS7sY77yVLOmZD6xW2uEHByYHhQi5JYWmgVumYY85BfNoVI3DupXSlzbw+b45A9NnVKq45+oXkiN6ouMMtTwfg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.23.0.tgz", + "integrity": "sha512-cU00LGb6GUXCwof6ACgSMKo3q7XYbsyTj0WsKHLi1nw7pV0NCq8nFTn6ZRBYLoKiV8t+jWl0Hv8KkgymmK5L5g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.23.0.tgz", + "integrity": "sha512-q4jdx5+5NfB0/qMbXbOmuC6oo7caPnFghJbIAV90cXZqgV8Am3miZhC4p+sQVdacqxfd+3nrle4C8icR3p1AYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.23.0.tgz", + "integrity": "sha512-G9Ri3qpmF4qef2CV/80dADHKXRAQeQXpQTLx7AiQrBYQHqBjB75oxqj06FCIe5g4hNCqLPnM9fsO4CyiT1sFSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.23.0.tgz", + "integrity": "sha512-1rcBDJLU+obPPJM6qR5fgBUiCdZwZLafZM5f9kwjFLkb/UBNIzmae39uCSmh71nzPCTXZqHbvwu23OWnWEz+eg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/lmdb": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.8.5.tgz", + "integrity": "sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "msgpackr": "^1.9.5", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.1.1", + "ordered-binary": "^1.4.1", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "2.8.5", + "@lmdb/lmdb-darwin-x64": "2.8.5", + "@lmdb/lmdb-linux-arm": "2.8.5", + "@lmdb/lmdb-linux-arm64": "2.8.5", + "@lmdb/lmdb-linux-x64": "2.8.5", + "@lmdb/lmdb-win32-x64": "2.8.5" + } + }, + "node_modules/lmdb/node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/msgpackr": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.10.1.tgz", + "integrity": "sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ==", + "dev": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz", + "integrity": "sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.0.7" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.2", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2" + } + }, + "node_modules/msgpackr-extract/node_modules/node-gyp-build-optional-packages": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz", + "integrity": "sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==", + "dev": true, + "optional": true, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "optional": true, + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neuroglancer": { + "resolved": "../../../dist/package", + "link": true + }, + "node_modules/node-addon-api": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", + "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", + "dev": true, + "engines": { + "node": "^16 || ^18 || >= 20" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", + "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-gyp-build-optional-packages/node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "dev": true + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ordered-binary": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.1.tgz", + "integrity": "sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==", + "dev": true + }, + "node_modules/parcel": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/parcel/-/parcel-2.11.0.tgz", + "integrity": "sha512-H/RI1/DmuOkL8RuG/EpNPvtzrbF+7jA/R56ydEEm+lqFbYktKB4COR7JXdHkZXRgbSJyimrFB8d0r9+SaRnj0Q==", + "dev": true, + "dependencies": { + "@parcel/config-default": "2.11.0", + "@parcel/core": "2.11.0", + "@parcel/diagnostic": "2.11.0", + "@parcel/events": "2.11.0", + "@parcel/fs": "2.11.0", + "@parcel/logger": "2.11.0", + "@parcel/package-manager": "2.11.0", + "@parcel/reporter-cli": "2.11.0", + "@parcel/reporter-dev-server": "2.11.0", + "@parcel/reporter-tracer": "2.11.0", + "@parcel/utils": "2.11.0", + "chalk": "^4.1.0", + "commander": "^7.0.0", + "get-port": "^4.2.0" + }, + "bin": { + "parcel": "lib/bin.js" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/parcel-namer-rewrite": { + "version": "2.10.3-rc.2", + "resolved": "https://registry.npmjs.org/parcel-namer-rewrite/-/parcel-namer-rewrite-2.10.3-rc.2.tgz", + "integrity": "sha512-vn49fDbgQTjp+GX8hsa5LxQOkqo9o5uOTr86FbG2QrbZMo4ct1j/X2ZCe1LijLCgugVDebAHI6eooKlfAUirRQ==", + "dev": true, + "dependencies": { + "@parcel/logger": "^2.10.3", + "@parcel/namer-default": "^2.10.3", + "@parcel/package-manager": "^2.10.3", + "@parcel/plugin": "^2.10.3", + "@parcel/types": "^2.10.3", + "assert": "^2.0.0" + }, + "engines": { + "node": ">= 10.0.0", + "parcel": "^2.10.3" + } + }, + "node_modules/parcel/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "optional": true, + "peer": true, + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/posthtml": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", + "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", + "dev": true, + "dependencies": { + "posthtml-parser": "^0.11.0", + "posthtml-render": "^3.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/posthtml-parser": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.10.2.tgz", + "integrity": "sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==", + "dev": true, + "dependencies": { + "htmlparser2": "^7.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/posthtml-render": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", + "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", + "dev": true, + "dependencies": { + "is-json": "^2.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/posthtml/node_modules/posthtml-parser": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", + "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", + "dev": true, + "dependencies": { + "htmlparser2": "^7.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", + "dev": true + }, + "node_modules/react-refresh": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz", + "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svgo": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz", + "integrity": "sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/examples/parcel/parcel-project-built/package.json b/examples/parcel/parcel-project-built/package.json new file mode 100644 index 0000000000..e2036f032a --- /dev/null +++ b/examples/parcel/parcel-project-built/package.json @@ -0,0 +1,29 @@ +{ + "name": "neuroglancer-parcel-project-built", + "version": "0.0.0", + "private": true, + "description": "Test of a parcel-bundled project that depends on built Neuroglancer package.", + "scripts": { + "build": "parcel build --no-cache --public-url .", + "dev-server": "parcel serve --no-cache" + }, + "dependencies": { + "neuroglancer": "file:../../../dist/package" + }, + "license": "Apache-2.0", + "devDependencies": { + "@parcel/transformer-inline-string": "^2.11.0", + "parcel": "^2.11.0", + "parcel-namer-rewrite": "^2.10.3-rc.2" + }, + "type": "module", + "@parcel/resolver-default": { + "packageExports": true + }, + "parcel-namer-rewrite": { + "rules": { + "(.*).html": "$1.html" + } + }, + "source": "index.html" +} diff --git a/examples/parcel/parcel-project-built/src/index.js b/examples/parcel/parcel-project-built/src/index.js new file mode 100644 index 0000000000..571cbcda91 --- /dev/null +++ b/examples/parcel/parcel-project-built/src/index.js @@ -0,0 +1,3 @@ +import "neuroglancer"; +import { setupDefaultViewer } from "neuroglancer/ui/default_viewer_setup.js"; +setupDefaultViewer(); diff --git a/examples/parcel/parcel-project-built/svgo.config.json b/examples/parcel/parcel-project-built/svgo.config.json new file mode 100644 index 0000000000..e162ece04a --- /dev/null +++ b/examples/parcel/parcel-project-built/svgo.config.json @@ -0,0 +1,13 @@ +{ + "plugins": [ + { + "name": "preset-default", + "params": { + "overrides": { + "removeViewBox": false, + "convertShapeToPath": false + } + } + } + ] +} diff --git a/examples/parcel/parcel-project-source/.gitignore b/examples/parcel/parcel-project-source/.gitignore new file mode 100644 index 0000000000..41889b37d4 --- /dev/null +++ b/examples/parcel/parcel-project-source/.gitignore @@ -0,0 +1,3 @@ +/node_modules/ +/dist/ +/.parcel-cache/ diff --git a/examples/parcel/parcel-project-source/.parcelrc b/examples/parcel/parcel-project-source/.parcelrc new file mode 100644 index 0000000000..717fb35101 --- /dev/null +++ b/examples/parcel/parcel-project-source/.parcelrc @@ -0,0 +1,9 @@ +{ + extends: "@parcel/config-default", + // Needed to ensure stable names for auth redirect .html files. + namers: ["parcel-namer-rewrite"], + // Needed for embedded svg icons. + transformers: { + "*.svg": ["...", "@parcel/transformer-inline-string"], + }, +} diff --git a/examples/parcel/parcel-project-source/index.html b/examples/parcel/parcel-project-source/index.html new file mode 100644 index 0000000000..17e5273b9f --- /dev/null +++ b/examples/parcel/parcel-project-source/index.html @@ -0,0 +1,8 @@ + + + + Parcel project test + + + + diff --git a/examples/parcel/parcel-project-source/package-lock.json b/examples/parcel/parcel-project-source/package-lock.json new file mode 100644 index 0000000000..b735bb40a7 --- /dev/null +++ b/examples/parcel/parcel-project-source/package-lock.json @@ -0,0 +1,4383 @@ +{ + "name": "neuroglancer-parcel-project-source", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "neuroglancer-parcel-project-source", + "version": "0.0.0", + "license": "Apache-2.0", + "dependencies": { + "neuroglancer": "file:../../.." + }, + "devDependencies": { + "@parcel/transformer-inline-string": "^2.11.0", + "parcel": "^2.11.0", + "parcel-namer-rewrite": "^2.10.3-rc.2" + } + }, + "../..": { + "version": "0.0.0-beta.0", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/node": "^20.11.14", + "@types/pako": "^2.0.3", + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.1", + "pako": "^2.1.0", + "typescript": "^5.3.3" + }, + "devDependencies": { + "@craftamap/esbuild-plugin-html": "^0.6.1", + "@hyrious/esbuild-plugin-svgo": "^0.2.0", + "@parcel/transformer-inline-string": "^2.11.0", + "@rollup/pluginutils": "^5.1.0", + "@swc/cli": "^0.3.5", + "@swc/core": "^1.3.107", + "@types/lodash-es": "^4.17.12", + "@typescript-eslint/eslint-plugin": "^6.20.0", + "@typescript-eslint/parser": "^6.20.0", + "@vitest/browser": "^1.2.2", + "@vitest/ui": "^1.2.2", + "eslint": "^8.56.0", + "eslint-formatter-codeframe": "^7.32.1", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-interactive": "^10.8.0", + "eslint-plugin-import": "^2.29.1", + "parcel": "^2.11.0", + "prettier": "3.2.4", + "process": "^0.11.10", + "tsx": "^4.7.0", + "vite-plugin-checker": "^0.6.3", + "vite-plugin-environment": "^1.1.3", + "vite-tsconfig-paths": "^4.3.1", + "vitest": "^1.2.2", + "webdriverio": "^8.29.3" + }, + "engines": { + "node": ">=16" + } + }, + "../../..": { + "version": "2.39.0", + "license": "Apache-2.0", + "dependencies": { + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.1", + "pako": "^2.1.0" + }, + "devDependencies": { + "@rollup/pluginutils": "^5.1.0", + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/lodash-es": "^4.17.12", + "@types/node": "^20.11.14", + "@types/pako": "^2.0.3", + "@types/yargs": "^17.0.32", + "@typescript-eslint/eslint-plugin": "^6.20.0", + "@typescript-eslint/parser": "^6.20.0", + "@vitest/browser": "^1.2.2", + "@vitest/ui": "^1.2.2", + "esbuild": "^0.20.0", + "eslint": "^8.56.0", + "eslint-formatter-codeframe": "^7.32.1", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-interactive": "^10.8.0", + "eslint-plugin-import": "^2.29.1", + "glob": "^10.3.10", + "prettier": "3.2.4", + "tsx": "^4.7.0", + "typescript": "^5.3.3", + "vite": "^5.1.3", + "vite-plugin-checker": "^0.6.3", + "vitest": "^1.2.2", + "webdriverio": "^8.32.2" + }, + "engines": { + "node": ">=16" + } + }, + "../../dist/module": { + "name": "neuroglancer", + "version": "0.0.0-beta.0", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/node": "^18.14.6", + "@types/pako": "^2.0.0", + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.5.4", + "numcodecs": "^0.3.1", + "pako": "^2.0.3", + "typescript": "^5.3.3" + }, + "engines": { + "node": ">=12" + } + }, + "../../dist/package": { + "name": "neuroglancer", + "version": "0.0.0-beta.0", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/node": "^20.11.14", + "@types/pako": "^2.0.3", + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.1", + "pako": "^2.1.0", + "typescript": "^5.3.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lezer/common": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz", + "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==", + "dev": true + }, + "node_modules/@lezer/lr": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.0.tgz", + "integrity": "sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==", + "dev": true, + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.8.5.tgz", + "integrity": "sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.8.5.tgz", + "integrity": "sha512-w/sLhN4T7MW1nB3R/U8WK5BgQLz904wh+/SmA2jD8NnF7BLLoUgflCNxOeSPOWp8geP6nP/+VjWzZVip7rZ1ug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.8.5.tgz", + "integrity": "sha512-c0TGMbm2M55pwTDIfkDLB6BpIsgxV4PjYck2HiOX+cy/JWiBXz32lYbarPqejKs9Flm7YVAKSILUducU9g2RVg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.8.5.tgz", + "integrity": "sha512-vtbZRHH5UDlL01TT5jB576Zox3+hdyogvpcbvVJlmU5PdL3c5V7cj1EODdh1CHPksRl+cws/58ugEHi8bcj4Ww==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.8.5.tgz", + "integrity": "sha512-Xkc8IUx9aEhP0zvgeKy7IQ3ReX2N8N1L0WPcQwnZweWmOuKfwpS3GRIYqLtK5za/w3E60zhFfNdS+3pBZPytqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.8.5.tgz", + "integrity": "sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@mischnic/json-sourcemap": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.1.tgz", + "integrity": "sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==", + "dev": true, + "dependencies": { + "@lezer/common": "^1.0.0", + "@lezer/lr": "^1.0.0", + "json5": "^2.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz", + "integrity": "sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz", + "integrity": "sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz", + "integrity": "sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz", + "integrity": "sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz", + "integrity": "sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz", + "integrity": "sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@parcel/bundler-default": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.11.0.tgz", + "integrity": "sha512-ZIs0865Lp871ZK83k5I9L4DeeE26muNMrHa7j8bvls6fKBJKAn8djrhfU4XOLyziU4aAOobcPwXU0+npWqs52g==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/graph": "3.1.0", + "@parcel/plugin": "2.11.0", + "@parcel/rust": "2.11.0", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/cache": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.11.0.tgz", + "integrity": "sha512-RSSkGNjO00lJPyftzaC9eaNVs4jMjPSAm0VJNWQ9JSm2n4A9BzQtTFAt1vhJOzzW1UsQvvBge9DdfkB7a2gIOw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.11.0", + "@parcel/logger": "2.11.0", + "@parcel/utils": "2.11.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@parcel/codeframe": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.11.0.tgz", + "integrity": "sha512-YHs9g/i5af/sd/JrWAojU9YFbKffcJ3Tx2EJaK0ME8OJsye91UaI/3lxSUYLmJG9e4WLNJtqci8V5FBMz//ZPg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/compressor-raw": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.11.0.tgz", + "integrity": "sha512-RArhBPRTCfz77soX2IECH09NUd76UBWujXiPRcXGPIHK+C3L1cRuzsNcA39QeSb3thz3b99JcozMJ1nkC2Bsgw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/config-default": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/config-default/-/config-default-2.11.0.tgz", + "integrity": "sha512-1e2+qcZkm5/0f4eI20p/DemcYiSxq9d/eyjpTXA7PulJaHbL1wonwUAuy3mvnAvDnLOJmAk/obDVgX1ZfxMGtg==", + "dev": true, + "dependencies": { + "@parcel/bundler-default": "2.11.0", + "@parcel/compressor-raw": "2.11.0", + "@parcel/namer-default": "2.11.0", + "@parcel/optimizer-css": "2.11.0", + "@parcel/optimizer-htmlnano": "2.11.0", + "@parcel/optimizer-image": "2.11.0", + "@parcel/optimizer-svgo": "2.11.0", + "@parcel/optimizer-swc": "2.11.0", + "@parcel/packager-css": "2.11.0", + "@parcel/packager-html": "2.11.0", + "@parcel/packager-js": "2.11.0", + "@parcel/packager-raw": "2.11.0", + "@parcel/packager-svg": "2.11.0", + "@parcel/packager-wasm": "2.11.0", + "@parcel/reporter-dev-server": "2.11.0", + "@parcel/resolver-default": "2.11.0", + "@parcel/runtime-browser-hmr": "2.11.0", + "@parcel/runtime-js": "2.11.0", + "@parcel/runtime-react-refresh": "2.11.0", + "@parcel/runtime-service-worker": "2.11.0", + "@parcel/transformer-babel": "2.11.0", + "@parcel/transformer-css": "2.11.0", + "@parcel/transformer-html": "2.11.0", + "@parcel/transformer-image": "2.11.0", + "@parcel/transformer-js": "2.11.0", + "@parcel/transformer-json": "2.11.0", + "@parcel/transformer-postcss": "2.11.0", + "@parcel/transformer-posthtml": "2.11.0", + "@parcel/transformer-raw": "2.11.0", + "@parcel/transformer-react-refresh-wrap": "2.11.0", + "@parcel/transformer-svg": "2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@parcel/core": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.11.0.tgz", + "integrity": "sha512-Npe0S6hVaqWEwRL+HI7gtOYOaoE5bJQZTgUDhsDoppWbau51jOlRYOZTXuvRK/jxXnze4/S1sdM24xBYAQ5qkw==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/cache": "2.11.0", + "@parcel/diagnostic": "2.11.0", + "@parcel/events": "2.11.0", + "@parcel/fs": "2.11.0", + "@parcel/graph": "3.1.0", + "@parcel/logger": "2.11.0", + "@parcel/package-manager": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/profiler": "2.11.0", + "@parcel/rust": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "@parcel/workers": "2.11.0", + "abortcontroller-polyfill": "^1.1.9", + "base-x": "^3.0.8", + "browserslist": "^4.6.6", + "clone": "^2.1.1", + "dotenv": "^7.0.0", + "dotenv-expand": "^5.1.0", + "json5": "^2.2.0", + "msgpackr": "^1.9.9", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/diagnostic": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.11.0.tgz", + "integrity": "sha512-4dJmOXVL5YGGQRRsQosQbSRONBcboB71mSwaeaEgz3pPdq9QXVPLACkGe/jTXSqa3OnAHu3g5vQLpE1g5xqBqw==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/events": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.11.0.tgz", + "integrity": "sha512-K6SOjOrQsz1GdNl2qKBktq7KJ3Q3yxK8WXdmQYo10wG39dr051xtMb38aqieTp4eVhL8Yaq2iJgGkdr11fuBnA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/fs": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.11.0.tgz", + "integrity": "sha512-zWckdnnovdrgdFX4QYuQV4bbKCsh6IYCkmwaB4yp47rhw1MP0lkBINLt4yFPHBxWXOpElCfxjL+z69c9xJQRBQ==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.11.0", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@parcel/graph": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-3.1.0.tgz", + "integrity": "sha512-d1dTW5C7A52HgDtoXlyvlET1ypSlmIxSIZOJ1xp3R9L9hgo3h1u3jHNyaoTe/WPkGVe2QnFxh0h+UibVJhu9vg==", + "dev": true, + "dependencies": { + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/logger": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.11.0.tgz", + "integrity": "sha512-HtMEdCq3LKnvv4T2CIskcqlf2gpBvHMm3pkeUFB/hc/7hW/hE1k6/HA2VOQvc0tBsaMpmEx7PCrfrH56usQSyA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/events": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/markdown-ansi": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.11.0.tgz", + "integrity": "sha512-YA60EWbXi6cLOIzcwRC2wijotPauOGQbUi0vSbu0O6/mjQ68kWCMGz0hwZjDRQcPypQVJEIvTgMymLbvumxwhg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/namer-default": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.11.0.tgz", + "integrity": "sha512-DEwBSKSClg4DA2xAWimYkw9bFi7MFb9TdT7/TYZStMTsfYHPWOyyjGR7aVr3Ra4wNb+XX6g4rR41yp3HD6KO7A==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/node-resolver-core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.2.0.tgz", + "integrity": "sha512-XJRSxCkNbGFWjfmwFdcQZ/qlzWZd35qLtvLz2va8euGL7M5OMEQOv7dsvEhl0R+CC2zcnfFzZwxk78q6ezs8AQ==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.11.0", + "@parcel/fs": "2.11.0", + "@parcel/rust": "2.11.0", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-css": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-css/-/optimizer-css-2.11.0.tgz", + "integrity": "sha512-bV97PRxshHV3dMwOpLRgcP1QNhrVWh6VVDfm2gmWULpvsjoykcPS6vrCFksY5CpQsSvNHqJBzQjWS8FubUI76w==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.11.0", + "browserslist": "^4.6.6", + "lightningcss": "^1.22.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-htmlnano": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.11.0.tgz", + "integrity": "sha512-c20pz4EFF5DNFmqYgptlIj49eT6xjGLkDTdHH3RRzxKovuSXWfYSPs3GED3ZsjVuQyjNQif+/MAk9547F7hrdQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "htmlnano": "^2.0.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "svgo": "^2.4.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@parcel/optimizer-image": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-image/-/optimizer-image-2.11.0.tgz", + "integrity": "sha512-jCaJww5QFG2GuNzYW8nlSW+Ea+Cv47TRnOPJNquFIajgfTLJ5ddsWbaNal0GQsL8yNiCBKWd1AV4W0RH9tG0Jg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/rust": "2.11.0", + "@parcel/utils": "2.11.0", + "@parcel/workers": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@parcel/optimizer-svgo": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-svgo/-/optimizer-svgo-2.11.0.tgz", + "integrity": "sha512-TQpvfBhjV2IsuFHXUolbDS6XWB3DDR2rYTlqlA8LMmuOY7jQd9Bnkl4JnapzWm/bRuzRlzdGjjVCPGL8iShFvA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0", + "svgo": "^2.4.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/@parcel/optimizer-svgo/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@parcel/optimizer-swc": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-swc/-/optimizer-swc-2.11.0.tgz", + "integrity": "sha512-ftf42F3JyZxJb6nnLlgNGyNQ273YOla4dFGH/tWC8iTwObHUpWe7cMbCGcrSJBvAlsLkZfLpFNAXFxUgxdKyHQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.11.0", + "@swc/core": "^1.3.36", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/package-manager": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.11.0.tgz", + "integrity": "sha512-QzdsrUYlAwIzb8by7WJjqYnbR1MoMKWbtE1MXUeYsZbFusV8B6pOH+lwqNJKS/BFtddZMRPYFueZS2N2fwzjig==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/fs": "2.11.0", + "@parcel/logger": "2.11.0", + "@parcel/node-resolver-core": "3.2.0", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "@parcel/workers": "2.11.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@parcel/packager-css": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-css/-/packager-css-2.11.0.tgz", + "integrity": "sha512-AyIxsp4eL8c22vp2oO2hSRnr3hSVNkARNZc9DG6uXxCc2Is5tUEX0I4PwxWnAx0EI44l+3zX/o414zT8yV9wwQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-html/-/packager-html-2.11.0.tgz", + "integrity": "sha512-ho5AQ70naTV8IqkKIbKtK+jsXQ5TJfFgtBvmJlyB3YydRMbIc+3g4G0xgIvf15V4uCMw9Md0Sv1W65nQXHPQoA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.11.0.tgz", + "integrity": "sha512-SxjCsd0xQfg5H73YtVJj9VOpr9s0rwMsSoeykjkatbkEla9NsZajsUkd/bfYf+/0WvEKOrB8oUBo15HkGOgKug==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/rust": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "globals": "^13.2.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-raw": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.11.0.tgz", + "integrity": "sha512-2/0JQ8DZrz7cVNXwD6OYoUUtSSnlr4dsz8ZkpFDKsBJhvMHtC78Sq+1EDixDGOMiUcalSEjNsoHtkpq9uNh+Xw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.11.0.tgz", + "integrity": "sha512-2wQBkzLwcaWFGWz8TP+bgsXgiueWPzrjKsWugWdDfq0FbXh8XVeR/599qnus3RFHZy4cH6L6yq/7zxcljtxK8A==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "posthtml": "^0.16.4" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-wasm": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-wasm/-/packager-wasm-2.11.0.tgz", + "integrity": "sha512-tTy4EbDXeeiZ0oB7L2FWaHSD1mbmYZP6R5HXqkvc5dECGUKPU5Jz6ek2C5AM+HfQdQLKXPQ/Xw3eJnI/AmctVg==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0" + }, + "engines": { + "node": ">=12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.11.0.tgz", + "integrity": "sha512-9npuKBlhnPn7oeUpLJGecceg16GkXbvzbr6MNSZiHhkx3IBeITHQXlZnp2zAjUOFreNsYOfifwEF2S4KsARfBQ==", + "dev": true, + "dependencies": { + "@parcel/types": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/profiler": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.11.0.tgz", + "integrity": "sha512-s10SS09prOdwnaAcjK8M5zO8o+zPJJW5oOqXPNdf6KH4NGD/ue7iOk2xM8QLw6ulSwxE7NDt++lyfW3AXgCZwg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/events": "2.11.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/reporter-cli/-/reporter-cli-2.11.0.tgz", + "integrity": "sha512-hY0iO0f+LifgJHDUIjGQJnxLFSkk2jlbfy+kIaft5oI3/IM+UljecfGO+14XH8mYlqRXXPsT09TJe8ZKQzp4ZQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "chalk": "^4.1.0", + "cli-progress": "^3.12.0", + "term-size": "^2.2.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.11.0.tgz", + "integrity": "sha512-T4ue1+oLFNdcd9maw8QWQuxzOS2kX2jOrSvYKwYd9oGnqiAr1rpiHYYKJhHng+PF5ybwWkj8dUJfGh2NoQysJA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/reporter-tracer/-/reporter-tracer-2.11.0.tgz", + "integrity": "sha512-33q4ftO26OPWHkUpEm0bzzSjW2kHEh6q/JFePwf8W6APTQVruj4mV46+Fh6rxX42ixs92K/QoiE0gYgWZQVDHA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0", + "chrome-trace-event": "^1.0.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.11.0.tgz", + "integrity": "sha512-suZNN2lE5W48LPTwAbG7gnj1IeubkCVEm0XspWXcXUtCzglimNJ8PVVBGx171o5CqDpdbGF3AqHjG9N3uOwXag==", + "dev": true, + "dependencies": { + "@parcel/node-resolver-core": "3.2.0", + "@parcel/plugin": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.11.0.tgz", + "integrity": "sha512-uVwNBtoLMrlPHLvRS05BVhLseduMOpZT36yiIjS0YSBJcC6/otI9AY7ZiDPYmrB5xTqM0R+D554JhPaJHCuocw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.11.0.tgz", + "integrity": "sha512-fH3nJoexINz7s4cDzp0Vjsx0k1pMYSa5ch38LbbNqCKTermy0pS0zZuvgfLfHFFP+AMRpFQenrF7h7N3bgDmHw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.11.0.tgz", + "integrity": "sha512-Kfnc7gLjhoephLMnjABrkIkzVfzPrpJlxiJFIleY2Fm57YhmCfKsEYxm3lHOutNaYl1VArW0LKClPH/VHG9vfQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0", + "react-error-overlay": "6.0.9", + "react-refresh": "^0.9.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.11.0.tgz", + "integrity": "sha512-c8MaSpSbXIKuN5sA/g4UsrsH1BtBZ6Em+eSxt9AYbdPtWrW+qwCioNVZj9lugBRUzDMjVfJz0yK59nS42hABvw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/rust": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.11.0.tgz", + "integrity": "sha512-UkLWdHOD8Md2YmJDPsqd3yIs9chhdl/ATfV/B/xdPKGmqtNouYpDCRlq+WxMt3mLoYgHEg9UwrWLTebo2rr2iQ==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/source-map": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz", + "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": "^12.18.3 || >=14" + } + }, + "node_modules/@parcel/transformer-babel": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-babel/-/transformer-babel-2.11.0.tgz", + "integrity": "sha512-WKGblnp7r426VG+cpeQzc6dj/30EoUaYwyl4OEaigQSJizyuPWTBWTz6FUw+ih1/sg37h+D1BIh9C2FsVzpzbw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.11.0", + "browserslist": "^4.6.6", + "json5": "^2.2.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-css/-/transformer-css-2.11.0.tgz", + "integrity": "sha512-nFmBulF/ErNoafO87JbVrBavjBMNwE/kahbCRVxc2Mvlphz4F4lBW4eDRS5l4xBqFJaNkHr9R55ehLBBilF4Jw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.11.0", + "browserslist": "^4.6.6", + "lightningcss": "^1.22.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-html": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-html/-/transformer-html-2.11.0.tgz", + "integrity": "sha512-90vp7mbvvfqPr9XIINpMcELtywj56f1bxfOkLQgWU1bm22H0FT3i5dqdac++2My0IGDvMwhAEjQfbn4pA579NQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/rust": "2.11.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^7.5.2", + "srcset": "4" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-image/-/transformer-image-2.11.0.tgz", + "integrity": "sha512-QiZj18UHf3lVFsi65Vz8YbS3ydx9Pe9x8ktMxE1oh9qpznN8lD7gE/Z9DxuTZB84EZ9pKytKwcv5WGXP25xIFg==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0", + "@parcel/workers": "2.11.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@parcel/transformer-inline-string": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-inline-string/-/transformer-inline-string-2.11.0.tgz", + "integrity": "sha512-yLLjVqS7/P/ySOOjwdl2mElNHmCtJK81+7mnoA2oLEsf4kTKlW3JnIvX5BqJj6Dy6Ek0V1M48E86T9U3fwzWzg==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-js": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.11.0.tgz", + "integrity": "sha512-G1sv0n8/fJqHqwUs0iVnVdmRY0Kh8kWaDkuWcU/GJBHMGhUnLXKdNwxX2Av9UdBL14bU1nTINfr9qOfnQotXWg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/rust": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.11.0", + "@parcel/workers": "2.11.0", + "@swc/helpers": "^0.5.0", + "browserslist": "^4.6.6", + "nullthrows": "^1.1.1", + "regenerator-runtime": "^0.13.7", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@parcel/transformer-json": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.11.0.tgz", + "integrity": "sha512-Wt/wgSBaRWmPL4gpvjkV0bCBRxFOtsuLNzsm8vYA5poxTFhuLY+AoyQ8S2+xXU4VxwBfdppfIr2Ny3SwGs8xbQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "json5": "^2.2.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-postcss": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-postcss/-/transformer-postcss-2.11.0.tgz", + "integrity": "sha512-Ugy8XHBaUptGotsvwzq7gPCvkCopTIqqZ0JZ40Jmy9slGms8wnx06pNHA1Be/RcJwkJ2TbSu+7ncZdgmP5x5GQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/rust": "2.11.0", + "@parcel/utils": "2.11.0", + "clone": "^2.1.1", + "nullthrows": "^1.1.1", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-posthtml": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-posthtml/-/transformer-posthtml-2.11.0.tgz", + "integrity": "sha512-dMK4p1RRAoIJEjK/Wz9GOLqwHqdD/VQDhMPk+6sUKp5zf2MhSohUstpp5gKsSZivCM3PS2f8k9rgroacJ/ReuA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-raw": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.11.0.tgz", + "integrity": "sha512-2ltp3TgS+cxEqSM1vk5gDtJrYx4KMuRRtbSgSvkdldyOgPhflnLU3/HRz72hXSNGqYOV0/JN0+ocsfPnqR00ug==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-react-refresh-wrap": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.11.0.tgz", + "integrity": "sha512-6pY0CdIgIpXC6XpsDWizf+zLgiuEsJ106HjWLwF7/R72BrvDhLPZ6jRu4UTrnd6bM89KahPw9fZZzjKoA5Efcw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.11.0", + "@parcel/utils": "2.11.0", + "react-refresh": "^0.9.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-svg": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-svg/-/transformer-svg-2.11.0.tgz", + "integrity": "sha512-GrTNi04OoQSXsyrB7FqQPeYREscEXFhIBPkyQ0q7WDG/yYynWljiA0kwITCtMjPfv2EDVks292dvM3EcnERRIA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/plugin": "2.11.0", + "@parcel/rust": "2.11.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/types": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.11.0.tgz", + "integrity": "sha512-lN5XlfV9b1s2rli8q1LqsLtu+D4ZwNI3sKmNcL/3tohSfQcF2EgF+MaiANGo9VzXOzoWFHt4dqWjO4OcdyC5tg==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.11.0", + "@parcel/diagnostic": "2.11.0", + "@parcel/fs": "2.11.0", + "@parcel/package-manager": "2.11.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.11.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/utils": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.11.0.tgz", + "integrity": "sha512-AcL70cXlIyE7eQdvjQbYxegN5l+skqvlJllxTWg4YkIZe9p8Gmv74jLAeLWh5F+IGl5WRn0TSy9JhNJjIMQGwQ==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.11.0", + "@parcel/diagnostic": "2.11.0", + "@parcel/logger": "2.11.0", + "@parcel/markdown-ansi": "2.11.0", + "@parcel/rust": "2.11.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.0.tgz", + "integrity": "sha512-XJLGVL0DEclX5pcWa2N9SX1jCGTDd8l972biNooLFtjneuGqodupPQh6XseXIBBeVIMaaJ7bTcs3qGvXwsp4vg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.4.0", + "@parcel/watcher-darwin-arm64": "2.4.0", + "@parcel/watcher-darwin-x64": "2.4.0", + "@parcel/watcher-freebsd-x64": "2.4.0", + "@parcel/watcher-linux-arm-glibc": "2.4.0", + "@parcel/watcher-linux-arm64-glibc": "2.4.0", + "@parcel/watcher-linux-arm64-musl": "2.4.0", + "@parcel/watcher-linux-x64-glibc": "2.4.0", + "@parcel/watcher-linux-x64-musl": "2.4.0", + "@parcel/watcher-win32-arm64": "2.4.0", + "@parcel/watcher-win32-ia32": "2.4.0", + "@parcel/watcher-win32-x64": "2.4.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.0.tgz", + "integrity": "sha512-+fPtO/GsbYX1LJnCYCaDVT3EOBjvSFdQN9Mrzh9zWAOOfvidPWyScTrHIZHHfJBvlHzNA0Gy0U3NXFA/M7PHUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.0.tgz", + "integrity": "sha512-T/At5pansFuQ8VJLRx0C6C87cgfqIYhW2N/kBfLCUvDhCah0EnLLwaD/6MW3ux+rpgkpQAnMELOCTKlbwncwiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.0.tgz", + "integrity": "sha512-vZMv9jl+szz5YLsSqEGCMSllBl1gU1snfbRL5ysJU03MEa6gkVy9OMcvXV1j4g0++jHEcvzhs3Z3LpeEbVmY6Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.0.tgz", + "integrity": "sha512-dHTRMIplPDT1M0+BkXjtMN+qLtqq24sLDUhmU+UxxLP2TEY2k8GIoqIJiVrGWGomdWsy5IO27aDV1vWyQ6gfHA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.0.tgz", + "integrity": "sha512-9NQXD+qk46RwATNC3/UB7HWurscY18CnAPMTFcI9Y8CTbtm63/eex1SNt+BHFinEQuLBjaZwR2Lp+n7pmEJPpQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.0.tgz", + "integrity": "sha512-QuJTAQdsd7PFW9jNGaV9Pw+ZMWV9wKThEzzlY3Lhnnwy7iW23qtQFPql8iEaSFMCVI5StNNmONUopk+MFKpiKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.0.tgz", + "integrity": "sha512-oyN+uA9xcTDo/45bwsd6TFHa7Lc7hKujyMlvwrCLvSckvWogndCEoVYFNfZ6JJ2KNL/6fFiGPcbjp8jJmEh5Ng==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.0.tgz", + "integrity": "sha512-KphV8awJmxU3q52JQvJot0QMu07CIyEjV+2Tb2ZtbucEgqyRcxOBDMsqp1JNq5nuDXtcCC0uHQICeiEz38dPBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.0.tgz", + "integrity": "sha512-7jzcOonpXNWcSijPpKD5IbC6xC7yTibjJw9jviVzZostYLGxbz8LDJLUnLzLzhASPlPGgpeKLtFUMjAAzM+gSA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.0.tgz", + "integrity": "sha512-NOej2lqlq8bQNYhUMnOD0nwvNql8ToQF+1Zhi9ULZoG+XTtJ9hNnCFfyICxoZLXor4bBPTOnzs/aVVoefYnjIg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.0.tgz", + "integrity": "sha512-IO/nM+K2YD/iwjWAfHFMBPz4Zqn6qBDqZxY4j2n9s+4+OuTSRM/y/irksnuqcspom5DjkSeF9d0YbO+qpys+JA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.0.tgz", + "integrity": "sha512-pAUyUVjfFjWaf/pShmJpJmNxZhbMvJASUpdes9jL6bTEJ+gDxPRSpXTIemNyNsb9AtbiGXs9XduP1reThmd+dA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/workers": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.11.0.tgz", + "integrity": "sha512-wjybqdSy6Nk0N9iBGsFcp7739W2zvx0WGfVxPVShqhz46pIkPOiFF/iSn+kFu5EmMKTRWeUif42+a6rRZ7pCnQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/logger": "2.11.0", + "@parcel/profiler": "2.11.0", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@swc/core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.1.tgz", + "integrity": "sha512-3y+Y8js+e7BbM16iND+6Rcs3jdiL28q3iVtYsCviYSSpP2uUVKkp5sJnCY4pg8AaVvyN7CGQHO7gLEZQ5ByozQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.2", + "@swc/types": "^0.1.5" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.4.1", + "@swc/core-darwin-x64": "1.4.1", + "@swc/core-linux-arm-gnueabihf": "1.4.1", + "@swc/core-linux-arm64-gnu": "1.4.1", + "@swc/core-linux-arm64-musl": "1.4.1", + "@swc/core-linux-x64-gnu": "1.4.1", + "@swc/core-linux-x64-musl": "1.4.1", + "@swc/core-win32-arm64-msvc": "1.4.1", + "@swc/core-win32-ia32-msvc": "1.4.1", + "@swc/core-win32-x64-msvc": "1.4.1" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.1.tgz", + "integrity": "sha512-ePyfx0348UbR4DOAW24TedeJbafnzha8liXFGuQ4bdXtEVXhLfPngprrxKrAddCuv42F9aTxydlF6+adD3FBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.1.tgz", + "integrity": "sha512-eLf4JSe6VkCMdDowjM8XNC5rO+BrgfbluEzAVtKR8L2HacNYukieumN7EzpYCi0uF1BYwu1ku6tLyG2r0VcGxA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.1.tgz", + "integrity": "sha512-K8VtTLWMw+rkN/jDC9o/Q9SMmzdiHwYo2CfgkwVT29NsGccwmNhCQx6XoYiPKyKGIFKt4tdQnJHKUFzxUqQVtQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.1.tgz", + "integrity": "sha512-0e8p4g0Bfkt8lkiWgcdiENH3RzkcqKtpRXIVNGOmVc0OBkvc2tpm2WTx/eoCnes2HpTT4CTtR3Zljj4knQ4Fvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.1.tgz", + "integrity": "sha512-b/vWGQo2n7lZVUnSQ7NBq3Qrj85GrAPPiRbpqaIGwOytiFSk8VULFihbEUwDe0rXgY4LDm8z8wkgADZcLnmdUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.1.tgz", + "integrity": "sha512-AFMQlvkKEdNi1Vk2GFTxxJzbICttBsOQaXa98kFTeWTnFFIyiIj2w7Sk8XRTEJ/AjF8ia8JPKb1zddBWr9+bEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.1.tgz", + "integrity": "sha512-QX2MxIECX1gfvUVZY+jk528/oFkS9MAl76e3ZRvG2KC/aKlCQL0KSzcTSm13mOxkDKS30EaGRDRQWNukGpMeRg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.1.tgz", + "integrity": "sha512-OklkJYXXI/tntD2zaY8i3iZldpyDw5q+NAP3k9OlQ7wXXf37djRsHLV0NW4+ZNHBjE9xp2RsXJ0jlOJhfgGoFA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.1.tgz", + "integrity": "sha512-MBuc3/QfKX9FnLOU7iGN+6yHRTQaPQ9WskiC8s8JFiKQ+7I2p25tay2RplR9dIEEGgVAu6L7auv96LbNTh+FaA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.1.tgz", + "integrity": "sha512-lu4h4wFBb/bOK6N2MuZwg7TrEpwYXgpQf5R7ObNSXL65BwZ9BG8XRzD+dLJmALu8l5N08rP/TrpoKRoGT4WSxw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, + "node_modules/@swc/helpers": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", + "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@swc/types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", + "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "dev": true + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/abortcontroller-polyfill": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", + "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001587", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz", + "integrity": "sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cli-progress": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", + "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", + "dev": true, + "dependencies": { + "string-width": "^4.2.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", + "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.668", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.668.tgz", + "integrity": "sha512-ZOBocMYCehr9W31+GpMclR+KBaDZOoAEabLdhpZ8oU1JFDwIaFY0UDbpXVEUFc0BIP2O2Qn3rkfCjQmMR4T/bQ==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", + "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/htmlnano": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-2.1.0.tgz", + "integrity": "sha512-jVGRE0Ep9byMBKEu0Vxgl8dhXYOUk0iNQ2pjsG+BcRB0u0oDF5A9p/iBGMg/PGKYUyMD0OAGu8dVT5Lzj8S58g==", + "dev": true, + "dependencies": { + "cosmiconfig": "^8.0.0", + "posthtml": "^0.16.5", + "timsort": "^0.3.0" + }, + "peerDependencies": { + "cssnano": "^6.0.0", + "postcss": "^8.3.11", + "purgecss": "^5.0.0", + "relateurl": "^0.2.7", + "srcset": "4.0.0", + "svgo": "^3.0.2", + "terser": "^5.10.0", + "uncss": "^0.17.3" + }, + "peerDependenciesMeta": { + "cssnano": { + "optional": true + }, + "postcss": { + "optional": true + }, + "purgecss": { + "optional": true + }, + "relateurl": { + "optional": true + }, + "srcset": { + "optional": true + }, + "svgo": { + "optional": true + }, + "terser": { + "optional": true + }, + "uncss": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-json": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", + "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", + "dev": true + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.23.0.tgz", + "integrity": "sha512-SEArWKMHhqn/0QzOtclIwH5pXIYQOUEkF8DgICd/105O+GCgd7jxjNod/QPnBCSWvpRHQBGVz5fQ9uScby03zA==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.23.0", + "lightningcss-darwin-x64": "1.23.0", + "lightningcss-freebsd-x64": "1.23.0", + "lightningcss-linux-arm-gnueabihf": "1.23.0", + "lightningcss-linux-arm64-gnu": "1.23.0", + "lightningcss-linux-arm64-musl": "1.23.0", + "lightningcss-linux-x64-gnu": "1.23.0", + "lightningcss-linux-x64-musl": "1.23.0", + "lightningcss-win32-x64-msvc": "1.23.0" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.23.0.tgz", + "integrity": "sha512-kl4Pk3Q2lnE6AJ7Qaij47KNEfY2/UXRZBT/zqGA24B8qwkgllr/j7rclKOf1axcslNXvvUdztjo4Xqh39Yq1aA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.23.0.tgz", + "integrity": "sha512-KeRFCNoYfDdcolcFXvokVw+PXCapd2yHS1Diko1z1BhRz/nQuD5XyZmxjWdhmhN/zj5sH8YvWsp0/lPLVzqKpg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.23.0.tgz", + "integrity": "sha512-xhnhf0bWPuZxcqknvMDRFFo2TInrmQRWZGB0f6YoAsZX8Y+epfjHeeOIGCfAmgF0DgZxHwYc8mIR5tQU9/+ROA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.23.0.tgz", + "integrity": "sha512-fBamf/bULvmWft9uuX+bZske236pUZEoUlaHNBjnueaCTJ/xd8eXgb0cEc7S5o0Nn6kxlauMBnqJpF70Bgq3zg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.23.0.tgz", + "integrity": "sha512-RS7sY77yVLOmZD6xW2uEHByYHhQi5JYWmgVumYY85BfNoVI3DupXSlzbw+b45A9NnVKq45+oXkiN6ouMMtTwfg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.23.0.tgz", + "integrity": "sha512-cU00LGb6GUXCwof6ACgSMKo3q7XYbsyTj0WsKHLi1nw7pV0NCq8nFTn6ZRBYLoKiV8t+jWl0Hv8KkgymmK5L5g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.23.0.tgz", + "integrity": "sha512-q4jdx5+5NfB0/qMbXbOmuC6oo7caPnFghJbIAV90cXZqgV8Am3miZhC4p+sQVdacqxfd+3nrle4C8icR3p1AYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.23.0.tgz", + "integrity": "sha512-G9Ri3qpmF4qef2CV/80dADHKXRAQeQXpQTLx7AiQrBYQHqBjB75oxqj06FCIe5g4hNCqLPnM9fsO4CyiT1sFSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.23.0.tgz", + "integrity": "sha512-1rcBDJLU+obPPJM6qR5fgBUiCdZwZLafZM5f9kwjFLkb/UBNIzmae39uCSmh71nzPCTXZqHbvwu23OWnWEz+eg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/lmdb": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.8.5.tgz", + "integrity": "sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "msgpackr": "^1.9.5", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.1.1", + "ordered-binary": "^1.4.1", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "2.8.5", + "@lmdb/lmdb-darwin-x64": "2.8.5", + "@lmdb/lmdb-linux-arm": "2.8.5", + "@lmdb/lmdb-linux-arm64": "2.8.5", + "@lmdb/lmdb-linux-x64": "2.8.5", + "@lmdb/lmdb-win32-x64": "2.8.5" + } + }, + "node_modules/lmdb/node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/msgpackr": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.10.1.tgz", + "integrity": "sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ==", + "dev": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz", + "integrity": "sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.0.7" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.2", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2" + } + }, + "node_modules/msgpackr-extract/node_modules/node-gyp-build-optional-packages": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz", + "integrity": "sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==", + "dev": true, + "optional": true, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "optional": true, + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neuroglancer": { + "resolved": "../../..", + "link": true + }, + "node_modules/node-addon-api": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", + "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", + "dev": true, + "engines": { + "node": "^16 || ^18 || >= 20" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", + "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-gyp-build-optional-packages/node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "dev": true + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ordered-binary": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.1.tgz", + "integrity": "sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==", + "dev": true + }, + "node_modules/parcel": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/parcel/-/parcel-2.11.0.tgz", + "integrity": "sha512-H/RI1/DmuOkL8RuG/EpNPvtzrbF+7jA/R56ydEEm+lqFbYktKB4COR7JXdHkZXRgbSJyimrFB8d0r9+SaRnj0Q==", + "dev": true, + "dependencies": { + "@parcel/config-default": "2.11.0", + "@parcel/core": "2.11.0", + "@parcel/diagnostic": "2.11.0", + "@parcel/events": "2.11.0", + "@parcel/fs": "2.11.0", + "@parcel/logger": "2.11.0", + "@parcel/package-manager": "2.11.0", + "@parcel/reporter-cli": "2.11.0", + "@parcel/reporter-dev-server": "2.11.0", + "@parcel/reporter-tracer": "2.11.0", + "@parcel/utils": "2.11.0", + "chalk": "^4.1.0", + "commander": "^7.0.0", + "get-port": "^4.2.0" + }, + "bin": { + "parcel": "lib/bin.js" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/parcel-namer-rewrite": { + "version": "2.10.3-rc.2", + "resolved": "https://registry.npmjs.org/parcel-namer-rewrite/-/parcel-namer-rewrite-2.10.3-rc.2.tgz", + "integrity": "sha512-vn49fDbgQTjp+GX8hsa5LxQOkqo9o5uOTr86FbG2QrbZMo4ct1j/X2ZCe1LijLCgugVDebAHI6eooKlfAUirRQ==", + "dev": true, + "dependencies": { + "@parcel/logger": "^2.10.3", + "@parcel/namer-default": "^2.10.3", + "@parcel/package-manager": "^2.10.3", + "@parcel/plugin": "^2.10.3", + "@parcel/types": "^2.10.3", + "assert": "^2.0.0" + }, + "engines": { + "node": ">= 10.0.0", + "parcel": "^2.10.3" + } + }, + "node_modules/parcel/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "optional": true, + "peer": true, + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/posthtml": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", + "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", + "dev": true, + "dependencies": { + "posthtml-parser": "^0.11.0", + "posthtml-render": "^3.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/posthtml-parser": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.10.2.tgz", + "integrity": "sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==", + "dev": true, + "dependencies": { + "htmlparser2": "^7.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/posthtml-render": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", + "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", + "dev": true, + "dependencies": { + "is-json": "^2.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/posthtml/node_modules/posthtml-parser": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", + "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", + "dev": true, + "dependencies": { + "htmlparser2": "^7.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", + "dev": true + }, + "node_modules/react-refresh": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz", + "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svgo": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz", + "integrity": "sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/examples/parcel/parcel-project-source/package.json b/examples/parcel/parcel-project-source/package.json new file mode 100644 index 0000000000..d040c53788 --- /dev/null +++ b/examples/parcel/parcel-project-source/package.json @@ -0,0 +1,29 @@ +{ + "name": "neuroglancer-parcel-project-source", + "version": "0.0.0", + "private": true, + "description": "Test of a parcel-bundled project that depends on unbuilt (e.g. linked) Neuroglancer package.", + "scripts": { + "build": "parcel build --no-cache --public-url .", + "dev-server": "parcel serve --no-cache" + }, + "dependencies": { + "neuroglancer": "file:../../.." + }, + "license": "Apache-2.0", + "devDependencies": { + "@parcel/transformer-inline-string": "^2.11.0", + "parcel": "^2.11.0", + "parcel-namer-rewrite": "^2.10.3-rc.2" + }, + "type": "module", + "@parcel/resolver-default": { + "packageExports": true + }, + "parcel-namer-rewrite": { + "rules": { + "(.*).html": "$1.html" + } + }, + "source": "index.html" +} diff --git a/examples/parcel/parcel-project-source/src/index.js b/examples/parcel/parcel-project-source/src/index.js new file mode 100644 index 0000000000..571cbcda91 --- /dev/null +++ b/examples/parcel/parcel-project-source/src/index.js @@ -0,0 +1,3 @@ +import "neuroglancer"; +import { setupDefaultViewer } from "neuroglancer/ui/default_viewer_setup.js"; +setupDefaultViewer(); diff --git a/examples/parcel/parcel-project-source/svgo.config.json b/examples/parcel/parcel-project-source/svgo.config.json new file mode 100644 index 0000000000..e162ece04a --- /dev/null +++ b/examples/parcel/parcel-project-source/svgo.config.json @@ -0,0 +1,13 @@ +{ + "plugins": [ + { + "name": "preset-default", + "params": { + "overrides": { + "removeViewBox": false, + "convertShapeToPath": false + } + } + } + ] +} diff --git a/examples/parcel/parcel-project-source/tsconfig.json b/examples/parcel/parcel-project-source/tsconfig.json new file mode 100644 index 0000000000..095dffcd63 --- /dev/null +++ b/examples/parcel/parcel-project-source/tsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "experimentalDecorators": true, + }, +} diff --git a/examples/vite/vite-project-built/.gitignore b/examples/vite/vite-project-built/.gitignore new file mode 100644 index 0000000000..b0a5c349ca --- /dev/null +++ b/examples/vite/vite-project-built/.gitignore @@ -0,0 +1,2 @@ +/node_modules/ +/dist/ diff --git a/examples/vite/vite-project-built/index.html b/examples/vite/vite-project-built/index.html new file mode 100644 index 0000000000..ab6b22b544 --- /dev/null +++ b/examples/vite/vite-project-built/index.html @@ -0,0 +1,11 @@ + + + + Vite project test + + + diff --git a/examples/vite/vite-project-built/package-lock.json b/examples/vite/vite-project-built/package-lock.json new file mode 100644 index 0000000000..3a4eadfa45 --- /dev/null +++ b/examples/vite/vite-project-built/package-lock.json @@ -0,0 +1,994 @@ +{ + "name": "neuroglancer-vite-project-built", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "neuroglancer-vite-project-built", + "version": "0.0.0", + "license": "Apache-2.0", + "dependencies": { + "neuroglancer": "file:../../../dist/package" + }, + "devDependencies": { + "vite": "^5.0.12" + } + }, + "../../../dist/package": { + "name": "neuroglancer", + "version": "2.39.0", + "license": "Apache-2.0", + "dependencies": { + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.1", + "pako": "^2.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "../../dist/module": { + "name": "neuroglancer", + "version": "0.0.0-beta.0", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/node": "^18.14.6", + "@types/pako": "^2.0.0", + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.5.4", + "numcodecs": "^0.3.1", + "pako": "^2.0.3", + "typescript": "^5.3.3" + }, + "engines": { + "node": ">=12" + } + }, + "../../dist/package": { + "name": "neuroglancer", + "version": "0.0.0-beta.0", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/node": "^20.11.14", + "@types/pako": "^2.0.3", + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.1", + "pako": "^2.1.0", + "typescript": "^5.3.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", + "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", + "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", + "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", + "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", + "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", + "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", + "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", + "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", + "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", + "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", + "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", + "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", + "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.10.tgz", + "integrity": "sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neuroglancer": { + "resolved": "../../../dist/package", + "link": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", + "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.9.6", + "@rollup/rollup-android-arm64": "4.9.6", + "@rollup/rollup-darwin-arm64": "4.9.6", + "@rollup/rollup-darwin-x64": "4.9.6", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", + "@rollup/rollup-linux-arm64-gnu": "4.9.6", + "@rollup/rollup-linux-arm64-musl": "4.9.6", + "@rollup/rollup-linux-riscv64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-musl": "4.9.6", + "@rollup/rollup-win32-arm64-msvc": "4.9.6", + "@rollup/rollup-win32-ia32-msvc": "4.9.6", + "@rollup/rollup-win32-x64-msvc": "4.9.6", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/terser": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/vite": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", + "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.32", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + } + } +} diff --git a/examples/vite/vite-project-built/package.json b/examples/vite/vite-project-built/package.json new file mode 100644 index 0000000000..d389ed281a --- /dev/null +++ b/examples/vite/vite-project-built/package.json @@ -0,0 +1,18 @@ +{ + "name": "neuroglancer-vite-project-built", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "vite build", + "dev-server": "vite" + }, + "description": "Test of a vite-bundled project that depends on built Neuroglancer package.", + "dependencies": { + "neuroglancer": "file:../../../dist/package" + }, + "license": "Apache-2.0", + "devDependencies": { + "vite": "^5.0.12" + }, + "type": "module" +} diff --git a/examples/vite/vite-project-built/vite.config.ts b/examples/vite/vite-project-built/vite.config.ts new file mode 100644 index 0000000000..c74d6ec609 --- /dev/null +++ b/examples/vite/vite-project-built/vite.config.ts @@ -0,0 +1,26 @@ +import { defineConfig } from "vite"; + +export default defineConfig({ + // Use relative URLs to reference other files, in order to allow built assets + // to be served from any path. + base: "", + resolve: { + // Include only specific data sources. + conditions: [ + "neuroglancer/datasource:none_by_default", + "neuroglancer/datasource/precomputed:enabled", + ], + }, + worker: { + // Required due to use of dynamic imports in Neuroglancer. + format: "es", + }, + server: { + fs: { + // Allow serving files from parent neuroglancer project, due to the local + // path reference. This would not be needed for projects that depend on + // Neuroglancer normally. + allow: ["../../.."], + }, + }, +}); diff --git a/examples/vite/vite-project-source/.gitignore b/examples/vite/vite-project-source/.gitignore new file mode 100644 index 0000000000..b0a5c349ca --- /dev/null +++ b/examples/vite/vite-project-source/.gitignore @@ -0,0 +1,2 @@ +/node_modules/ +/dist/ diff --git a/examples/vite/vite-project-source/index.html b/examples/vite/vite-project-source/index.html new file mode 100644 index 0000000000..ab6b22b544 --- /dev/null +++ b/examples/vite/vite-project-source/index.html @@ -0,0 +1,11 @@ + + + + Vite project test + + + diff --git a/examples/vite/vite-project-source/package-lock.json b/examples/vite/vite-project-source/package-lock.json new file mode 100644 index 0000000000..13020f2176 --- /dev/null +++ b/examples/vite/vite-project-source/package-lock.json @@ -0,0 +1,1070 @@ +{ + "name": "neuroglancer-vite-project-source", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "neuroglancer-vite-project-source", + "version": "0.0.0", + "license": "Apache-2.0", + "dependencies": { + "neuroglancer": "file:../../.." + }, + "devDependencies": { + "vite": "^5.0.12" + } + }, + "../..": { + "version": "0.0.0-beta.0", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/node": "^20.11.14", + "@types/pako": "^2.0.3", + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.1", + "pako": "^2.1.0", + "typescript": "^5.3.3" + }, + "devDependencies": { + "@craftamap/esbuild-plugin-html": "^0.6.1", + "@hyrious/esbuild-plugin-svgo": "^0.2.0", + "@parcel/transformer-inline-string": "^2.11.0", + "@rollup/pluginutils": "^5.1.0", + "@swc/cli": "^0.3.5", + "@swc/core": "^1.3.107", + "@types/lodash-es": "^4.17.12", + "@typescript-eslint/eslint-plugin": "^6.20.0", + "@typescript-eslint/parser": "^6.20.0", + "@vitest/browser": "^1.2.2", + "@vitest/ui": "^1.2.2", + "eslint": "^8.56.0", + "eslint-formatter-codeframe": "^7.32.1", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-interactive": "^10.8.0", + "eslint-plugin-import": "^2.29.1", + "parcel": "^2.11.0", + "prettier": "3.2.4", + "process": "^0.11.10", + "tsx": "^4.7.0", + "vite-plugin-checker": "^0.6.3", + "vite-plugin-environment": "^1.1.3", + "vite-tsconfig-paths": "^4.3.1", + "vitest": "^1.2.2", + "webdriverio": "^8.29.3" + }, + "engines": { + "node": ">=16" + } + }, + "../../..": { + "version": "2.39.0", + "license": "Apache-2.0", + "dependencies": { + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.1", + "pako": "^2.1.0" + }, + "devDependencies": { + "@rollup/pluginutils": "^5.1.0", + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/lodash-es": "^4.17.12", + "@types/node": "^20.11.14", + "@types/pako": "^2.0.3", + "@types/yargs": "^17.0.32", + "@typescript-eslint/eslint-plugin": "^6.20.0", + "@typescript-eslint/parser": "^6.20.0", + "@vitest/browser": "^1.2.2", + "@vitest/ui": "^1.2.2", + "esbuild": "^0.20.0", + "eslint": "^8.56.0", + "eslint-formatter-codeframe": "^7.32.1", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-interactive": "^10.8.0", + "eslint-plugin-import": "^2.29.1", + "glob": "^10.3.10", + "prettier": "3.2.4", + "tsx": "^4.7.0", + "typescript": "^5.3.3", + "vite": "^5.1.3", + "vite-plugin-checker": "^0.6.3", + "vitest": "^1.2.2", + "webdriverio": "^8.32.2" + }, + "engines": { + "node": ">=16" + } + }, + "../../dist/module": { + "name": "neuroglancer", + "version": "0.0.0-beta.0", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/node": "^18.14.6", + "@types/pako": "^2.0.0", + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.5.4", + "numcodecs": "^0.3.1", + "pako": "^2.0.3", + "typescript": "^5.3.3" + }, + "engines": { + "node": ">=12" + } + }, + "../../dist/package": { + "name": "neuroglancer", + "version": "0.0.0-beta.0", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/node": "^20.11.14", + "@types/pako": "^2.0.3", + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.1", + "pako": "^2.1.0", + "typescript": "^5.3.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", + "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", + "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", + "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", + "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", + "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", + "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", + "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", + "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", + "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", + "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", + "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", + "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", + "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.10.tgz", + "integrity": "sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neuroglancer": { + "resolved": "../../..", + "link": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", + "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.9.6", + "@rollup/rollup-android-arm64": "4.9.6", + "@rollup/rollup-darwin-arm64": "4.9.6", + "@rollup/rollup-darwin-x64": "4.9.6", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", + "@rollup/rollup-linux-arm64-gnu": "4.9.6", + "@rollup/rollup-linux-arm64-musl": "4.9.6", + "@rollup/rollup-linux-riscv64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-musl": "4.9.6", + "@rollup/rollup-win32-arm64-msvc": "4.9.6", + "@rollup/rollup-win32-ia32-msvc": "4.9.6", + "@rollup/rollup-win32-x64-msvc": "4.9.6", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/terser": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/vite": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", + "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.32", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + } + } +} diff --git a/examples/vite/vite-project-source/package.json b/examples/vite/vite-project-source/package.json new file mode 100644 index 0000000000..94cdd47849 --- /dev/null +++ b/examples/vite/vite-project-source/package.json @@ -0,0 +1,18 @@ +{ + "name": "neuroglancer-vite-project-source", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "vite build", + "dev-server": "vite" + }, + "description": "Test of a vite-bundled project that depends on unbuilt (e.g. linked) Neuroglancer package.", + "dependencies": { + "neuroglancer": "file:../../.." + }, + "license": "Apache-2.0", + "devDependencies": { + "vite": "^5.0.12" + }, + "type": "module" +} diff --git a/examples/vite/vite-project-source/vite.config.ts b/examples/vite/vite-project-source/vite.config.ts new file mode 100644 index 0000000000..c74d6ec609 --- /dev/null +++ b/examples/vite/vite-project-source/vite.config.ts @@ -0,0 +1,26 @@ +import { defineConfig } from "vite"; + +export default defineConfig({ + // Use relative URLs to reference other files, in order to allow built assets + // to be served from any path. + base: "", + resolve: { + // Include only specific data sources. + conditions: [ + "neuroglancer/datasource:none_by_default", + "neuroglancer/datasource/precomputed:enabled", + ], + }, + worker: { + // Required due to use of dynamic imports in Neuroglancer. + format: "es", + }, + server: { + fs: { + // Allow serving files from parent neuroglancer project, due to the local + // path reference. This would not be needed for projects that depend on + // Neuroglancer normally. + allow: ["../../.."], + }, + }, +}); diff --git a/examples/webpack/webpack-project-built/.gitignore b/examples/webpack/webpack-project-built/.gitignore new file mode 100644 index 0000000000..b0a5c349ca --- /dev/null +++ b/examples/webpack/webpack-project-built/.gitignore @@ -0,0 +1,2 @@ +/node_modules/ +/dist/ diff --git a/examples/webpack/webpack-project-built/README.md b/examples/webpack/webpack-project-built/README.md new file mode 100644 index 0000000000..4d92187a2f --- /dev/null +++ b/examples/webpack/webpack-project-built/README.md @@ -0,0 +1 @@ +This demonstrates a dependent project that uses webpack for bundling. diff --git a/examples/webpack/webpack-project-built/package-lock.json b/examples/webpack/webpack-project-built/package-lock.json new file mode 100644 index 0000000000..a046979c2c --- /dev/null +++ b/examples/webpack/webpack-project-built/package-lock.json @@ -0,0 +1,4200 @@ +{ + "name": "neuroglancer-webpack-project-built", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "neuroglancer-webpack-project-built", + "version": "0.0.0", + "license": "Apache-2.0", + "dependencies": { + "css-loader": "^6.9.1", + "neuroglancer": "file:../../../dist/package", + "style-loader": "^3.3.4", + "svg-inline-loader": "^0.8.2" + }, + "devDependencies": { + "html-webpack-plugin": "^5.6.0", + "webpack": "^5.90.0", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1" + } + }, + "../../../dist/package": { + "name": "neuroglancer", + "version": "2.39.0", + "license": "Apache-2.0", + "dependencies": { + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.1", + "pako": "^2.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "../../dist/module": { + "name": "neuroglancer", + "version": "0.0.0-beta.0", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/node": "^18.14.6", + "@types/pako": "^2.0.0", + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.5.4", + "numcodecs": "^0.3.1", + "pako": "^2.0.3", + "typescript": "^5.3.3" + }, + "engines": { + "node": ">=12" + } + }, + "../../dist/package": { + "name": "neuroglancer", + "version": "0.0.0-beta.0", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/node": "^20.11.14", + "@types/pako": "^2.0.3", + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.1", + "pako": "^2.1.0", + "typescript": "^5.3.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", + "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.42", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.42.tgz", + "integrity": "sha512-ckM3jm2bf/MfB3+spLPWYPUH573plBFwpOhqQ2WottxYV85j1HQFlxmnTq57X1yHY9awZPig06hL/cLMgNWHIQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.10.tgz", + "integrity": "sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001581", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz", + "integrity": "sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.9.1.tgz", + "integrity": "sha512-OzABOh0+26JKFdMzlK6PY1u5Zx8+Ck7CVRlcGNZoY9qwJjdfu2VWFuprTIpPW+Av5TZTVViYWcFQaEEQURLknQ==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.649", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.649.tgz", + "integrity": "sha512-dq/owIaALxZGqWm5RXpKQ4baX6aDC19e2Z16c8SXYN+I71PyEKjbVqQUgm7kcuk8CRqljTKXbolo0XXDjxnh2w==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "dev": true, + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/neuroglancer": { + "resolved": "../../../dist/package", + "link": true + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", + "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", + "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-html-tokenizer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz", + "integrity": "sha512-Mc/gH3RvlKvB/gkp9XwgDKEWrSYyefIJPGG8Jk1suZms/rISdUuVEMx5O1WBnTWaScvxXDvGJrZQWblUmQHjkQ==" + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-inline-loader": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.2.tgz", + "integrity": "sha512-kbrcEh5n5JkypaSC152eGfGcnT4lkR0eSfvefaUJkLqgGjRQJyKDvvEE/CCv5aTSdfXuc+N98w16iAojhShI3g==", + "dependencies": { + "loader-utils": "^1.1.0", + "object-assign": "^4.0.1", + "simple-html-tokenizer": "^0.1.1" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.90.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.0.tgz", + "integrity": "sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/examples/webpack/webpack-project-built/package.json b/examples/webpack/webpack-project-built/package.json new file mode 100644 index 0000000000..fb50139796 --- /dev/null +++ b/examples/webpack/webpack-project-built/package.json @@ -0,0 +1,29 @@ +{ + "name": "neuroglancer-webpack-project-built", + "version": "0.0.0", + "private": true, + "description": "Test of a webpack-bundled project that depends on Neuroglancer.", + "scripts": { + "build": "webpack", + "dev-server": "webpack serve" + }, + "dependencies": { + "css-loader": "^6.9.1", + "neuroglancer": "file:../../../dist/package", + "style-loader": "^3.3.4", + "svg-inline-loader": "^0.8.2" + }, + "browserslist": [ + "last 2 Chrome versions", + "last 2 Firefox versions", + "last 2 Safari versions" + ], + "license": "Apache-2.0", + "devDependencies": { + "html-webpack-plugin": "^5.6.0", + "webpack": "^5.90.0", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1" + }, + "type": "module" +} diff --git a/examples/webpack/webpack-project-built/src/index.js b/examples/webpack/webpack-project-built/src/index.js new file mode 100644 index 0000000000..571cbcda91 --- /dev/null +++ b/examples/webpack/webpack-project-built/src/index.js @@ -0,0 +1,3 @@ +import "neuroglancer"; +import { setupDefaultViewer } from "neuroglancer/ui/default_viewer_setup.js"; +setupDefaultViewer(); diff --git a/examples/webpack/webpack-project-built/webpack.config.js b/examples/webpack/webpack-project-built/webpack.config.js new file mode 100644 index 0000000000..e202548bec --- /dev/null +++ b/examples/webpack/webpack-project-built/webpack.config.js @@ -0,0 +1,49 @@ +import HtmlWebpackPlugin from "html-webpack-plugin"; + +export default { + mode: "development", + performance: { + // Avoid unhelpful warnings due to large bundles. + maxAssetSize: 3 * 1024 * 1024, + maxEntrypointSize: 3 * 1024 * 1024, + }, + module: { + rules: [ + // Needed for .svg?raw imports used for embedding icons. + { + resourceQuery: /raw/, + type: "asset/source", + }, + // Needed for .html?url imports used for auth redirect pages for the + // brainmaps and bossDB data sources. Can be skipped if those data + // sources are excluded. + { + test: /\.html$/, + resourceQuery: /url/, + type: "asset/resource", + generator: { + // Filename must be preserved since exact redirect URLs must be allowlisted. + filename: "[name][ext]", + }, + }, + // Necessary to handle CSS files. + { + test: /\.css$/, + use: [{ loader: "style-loader" }, { loader: "css-loader" }], + }, + ], + }, + devServer: { + client: { + overlay: { + // Prevent intrusive notification spam. + runtimeErrors: false, + }, + }, + }, + plugins: [ + new HtmlWebpackPlugin({ + title: "Neuroglancer webpack test", + }), + ], +}; diff --git a/examples/webpack/webpack-project-source/.gitignore b/examples/webpack/webpack-project-source/.gitignore new file mode 100644 index 0000000000..b0a5c349ca --- /dev/null +++ b/examples/webpack/webpack-project-source/.gitignore @@ -0,0 +1,2 @@ +/node_modules/ +/dist/ diff --git a/examples/webpack/webpack-project-source/package-lock.json b/examples/webpack/webpack-project-source/package-lock.json new file mode 100644 index 0000000000..8c3e9cd017 --- /dev/null +++ b/examples/webpack/webpack-project-source/package-lock.json @@ -0,0 +1,4764 @@ +{ + "name": "neuroglancer-webpack-project-source", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "neuroglancer-webpack-project-source", + "version": "0.0.0", + "license": "Apache-2.0", + "dependencies": { + "css-loader": "^6.9.1", + "neuroglancer": "file:../../..", + "style-loader": "^3.3.4", + "svg-inline-loader": "^0.8.2" + }, + "devDependencies": { + "esbuild-loader": "^4.0.3", + "html-webpack-plugin": "^5.6.0", + "webpack": "^5.90.0", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1" + } + }, + "../..": { + "version": "0.0.0-beta.0", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/node": "^20.11.14", + "@types/pako": "^2.0.3", + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.1", + "pako": "^2.1.0", + "typescript": "^5.3.3" + }, + "devDependencies": { + "@craftamap/esbuild-plugin-html": "^0.6.1", + "@hyrious/esbuild-plugin-svgo": "^0.2.0", + "@parcel/transformer-inline-string": "^2.11.0", + "@rollup/pluginutils": "^5.1.0", + "@swc/cli": "^0.3.5", + "@swc/core": "^1.3.107", + "@types/lodash-es": "^4.17.12", + "@typescript-eslint/eslint-plugin": "^6.20.0", + "@typescript-eslint/parser": "^6.20.0", + "@vitest/browser": "^1.2.2", + "@vitest/ui": "^1.2.2", + "eslint": "^8.56.0", + "eslint-formatter-codeframe": "^7.32.1", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-interactive": "^10.8.0", + "eslint-plugin-import": "^2.29.1", + "parcel": "^2.11.0", + "prettier": "3.2.4", + "process": "^0.11.10", + "tsx": "^4.7.0", + "vite-plugin-checker": "^0.6.3", + "vite-plugin-environment": "^1.1.3", + "vite-tsconfig-paths": "^4.3.1", + "vitest": "^1.2.2", + "webdriverio": "^8.29.3" + }, + "engines": { + "node": ">=16" + } + }, + "../../..": { + "version": "2.39.0", + "license": "Apache-2.0", + "dependencies": { + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.1", + "pako": "^2.1.0" + }, + "devDependencies": { + "@rollup/pluginutils": "^5.1.0", + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/lodash-es": "^4.17.12", + "@types/node": "^20.11.14", + "@types/pako": "^2.0.3", + "@types/yargs": "^17.0.32", + "@typescript-eslint/eslint-plugin": "^6.20.0", + "@typescript-eslint/parser": "^6.20.0", + "@vitest/browser": "^1.2.2", + "@vitest/ui": "^1.2.2", + "esbuild": "^0.20.0", + "eslint": "^8.56.0", + "eslint-formatter-codeframe": "^7.32.1", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-interactive": "^10.8.0", + "eslint-plugin-import": "^2.29.1", + "glob": "^10.3.10", + "prettier": "3.2.4", + "tsx": "^4.7.0", + "typescript": "^5.3.3", + "vite": "^5.1.3", + "vite-plugin-checker": "^0.6.3", + "vitest": "^1.2.2", + "webdriverio": "^8.32.2" + }, + "engines": { + "node": ">=16" + } + }, + "../../dist/module": { + "name": "neuroglancer", + "version": "0.0.0-beta.0", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/node": "^18.14.6", + "@types/pako": "^2.0.0", + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.5.4", + "numcodecs": "^0.3.1", + "pako": "^2.0.3", + "typescript": "^5.3.3" + }, + "engines": { + "node": ">=12" + } + }, + "../../dist/package": { + "name": "neuroglancer", + "version": "0.0.0-beta.0", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/node": "^20.11.14", + "@types/pako": "^2.0.3", + "codemirror": "^5.61.1", + "gl-matrix": "3.1.0", + "glsl-editor": "^1.0.0", + "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.1", + "pako": "^2.1.0", + "typescript": "^5.3.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", + "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.42", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.42.tgz", + "integrity": "sha512-ckM3jm2bf/MfB3+spLPWYPUH573plBFwpOhqQ2WottxYV85j1HQFlxmnTq57X1yHY9awZPig06hL/cLMgNWHIQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.10.tgz", + "integrity": "sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001581", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz", + "integrity": "sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.9.1.tgz", + "integrity": "sha512-OzABOh0+26JKFdMzlK6PY1u5Zx8+Ck7CVRlcGNZoY9qwJjdfu2VWFuprTIpPW+Av5TZTVViYWcFQaEEQURLknQ==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.649", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.649.tgz", + "integrity": "sha512-dq/owIaALxZGqWm5RXpKQ4baX6aDC19e2Z16c8SXYN+I71PyEKjbVqQUgm7kcuk8CRqljTKXbolo0XXDjxnh2w==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/esbuild-loader": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-4.0.3.tgz", + "integrity": "sha512-YpaSRisj7TSg6maKKKG9OJGGm0BZ7EXeov8J8cXEYdugjlAJ0wL7aj2JactoQvPJ113v2Ar204pdJWrZsAQc8Q==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.0", + "get-tsconfig": "^4.7.0", + "loader-utils": "^2.0.4", + "webpack-sources": "^1.4.3" + }, + "funding": { + "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" + }, + "peerDependencies": { + "webpack": "^4.40.0 || ^5.0.0" + } + }, + "node_modules/esbuild-loader/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/esbuild-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/esbuild-loader/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "dev": true, + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/neuroglancer": { + "resolved": "../../..", + "link": true + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", + "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", + "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-html-tokenizer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz", + "integrity": "sha512-Mc/gH3RvlKvB/gkp9XwgDKEWrSYyefIJPGG8Jk1suZms/rISdUuVEMx5O1WBnTWaScvxXDvGJrZQWblUmQHjkQ==" + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-inline-loader": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.2.tgz", + "integrity": "sha512-kbrcEh5n5JkypaSC152eGfGcnT4lkR0eSfvefaUJkLqgGjRQJyKDvvEE/CCv5aTSdfXuc+N98w16iAojhShI3g==", + "dependencies": { + "loader-utils": "^1.1.0", + "object-assign": "^4.0.1", + "simple-html-tokenizer": "^0.1.1" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.90.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.0.tgz", + "integrity": "sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/examples/webpack/webpack-project-source/package.json b/examples/webpack/webpack-project-source/package.json new file mode 100644 index 0000000000..60f5db74b9 --- /dev/null +++ b/examples/webpack/webpack-project-source/package.json @@ -0,0 +1,30 @@ +{ + "name": "neuroglancer-webpack-project-source", + "version": "0.0.0", + "private": true, + "description": "Test of a vite project that depends on Neuroglancer.", + "scripts": { + "build": "webpack", + "dev-server": "webpack serve" + }, + "dependencies": { + "css-loader": "^6.9.1", + "neuroglancer": "file:../../..", + "style-loader": "^3.3.4", + "svg-inline-loader": "^0.8.2" + }, + "browserslist": [ + "last 2 Chrome versions", + "last 2 Firefox versions", + "last 2 Safari versions" + ], + "license": "Apache-2.0", + "devDependencies": { + "esbuild-loader": "^4.0.3", + "html-webpack-plugin": "^5.6.0", + "webpack": "^5.90.0", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1" + }, + "type": "module" +} diff --git a/examples/webpack/webpack-project-source/src/index.js b/examples/webpack/webpack-project-source/src/index.js new file mode 100644 index 0000000000..571cbcda91 --- /dev/null +++ b/examples/webpack/webpack-project-source/src/index.js @@ -0,0 +1,3 @@ +import "neuroglancer"; +import { setupDefaultViewer } from "neuroglancer/ui/default_viewer_setup.js"; +setupDefaultViewer(); diff --git a/examples/webpack/webpack-project-source/webpack.config.js b/examples/webpack/webpack-project-source/webpack.config.js new file mode 100644 index 0000000000..6182a29195 --- /dev/null +++ b/examples/webpack/webpack-project-source/webpack.config.js @@ -0,0 +1,59 @@ +import HtmlWebpackPlugin from "html-webpack-plugin"; + +export default { + mode: "development", + performance: { + // Avoid unhelpful warnings due to large bundles. + maxAssetSize: 3 * 1024 * 1024, + maxEntrypointSize: 3 * 1024 * 1024, + }, + module: { + rules: [ + // Needed to support Neuroglancer TypeScript sources when using + // Neuroglancer source package directly. + { + test: /\.tsx?$/, + loader: "esbuild-loader", + options: { + // Needed to ensure `import.meta.url` is available. + target: "es2020", + }, + }, + // Needed for .svg?raw imports used for embedding icons. + { + resourceQuery: /raw/, + type: "asset/source", + }, + // Needed for .html?url imports used for auth redirect pages for the + // brainmaps and bossDB data sources. Can be skipped if those data + // sources are excluded. + { + test: /\.html$/, + resourceQuery: /url/, + type: "asset/resource", + generator: { + // Filename must be preserved since exact redirect URLs must be allowlisted. + filename: "[name][ext]", + }, + }, + // Necessary to handle CSS files. + { + test: /\.css$/, + use: [{ loader: "style-loader" }, { loader: "css-loader" }], + }, + ], + }, + devServer: { + client: { + overlay: { + // Prevent intrusive notification spam. + runtimeErrors: false, + }, + }, + }, + plugins: [ + new HtmlWebpackPlugin({ + title: "Neuroglancer webpack test", + }), + ], +}; diff --git a/index.html b/index.html new file mode 100644 index 0000000000..4b2893aa51 --- /dev/null +++ b/index.html @@ -0,0 +1,7 @@ + + + + Neuroglancer + + + diff --git a/package-lock.json b/package-lock.json index e1319072ef..3e8c26ac21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,198 +1,174 @@ { "name": "neuroglancer", - "version": "0.0.0-beta.0", - "lockfileVersion": 2, + "version": "2.39.0", + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "neuroglancer", - "version": "0.0.0-beta.0", + "version": "2.39.0", "license": "Apache-2.0", "dependencies": { - "@types/codemirror": "5.60.15", - "@types/gl-matrix": "^2.4.5", - "@types/lodash": "^4.14.170", - "@types/node": "^18.14.6", - "@types/pako": "^2.0.0", - "@types/webpack-env": "^1.16.0", "codemirror": "^5.61.1", - "esbuild": "^0.19.11", "gl-matrix": "3.1.0", "glsl-editor": "^1.0.0", "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", - "lodash": "^4.17.21", - "nifti-reader-js": "^0.5.4", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", "numcodecs": "^0.3.1", - "pako": "^2.0.3", - "svg-inline-loader": "^0.8.2", - "typescript": "^5.3.3" + "pako": "^2.1.0" }, "devDependencies": { - "@biomejs/biome": "1.4.1", - "@types/jasmine": "^4.3.1", - "benchmark": "^2.1.4", - "chokidar": "^3.5.1", - "colors": "^1.4.0", - "connect": "^3.7.0", - "event-stream": "^4.0.1", - "faye-websocket": "^0.11.4", - "jasmine-core": "^4.5.0", - "karma": "^6.3.4", - "karma-benchmark": "^1.0.4", - "karma-benchmark-reporter": "^0.1.1", - "karma-chrome-launcher": "^3.1.0", - "karma-esbuild": "^2.3.0", - "karma-firefox-launcher": "^2.1.1", - "karma-jasmine": "^5.1.0", - "karma-mocha-reporter": "^2.2.5", - "karma-sourcemap-loader": "^0.4.0", - "morgan": "^1.10.0", - "nunjucks": "^3.2.3", - "prettier": "3.1.1", - "send": "^0.18.0", - "yargs": "^17.0.1" - }, + "@rollup/pluginutils": "^5.1.0", + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/lodash-es": "^4.17.12", + "@types/node": "^20.11.14", + "@types/pako": "^2.0.3", + "@types/yargs": "^17.0.32", + "@typescript-eslint/eslint-plugin": "^6.20.0", + "@typescript-eslint/parser": "^6.20.0", + "@vitest/browser": "^1.2.2", + "@vitest/ui": "^1.2.2", + "esbuild": "^0.20.0", + "eslint": "^8.56.0", + "eslint-formatter-codeframe": "^7.32.1", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-interactive": "^10.8.0", + "eslint-plugin-import": "^2.29.1", + "glob": "^10.3.10", + "prettier": "3.2.4", + "tsx": "^4.7.0", + "typescript": "^5.3.3", + "vite": "^5.1.3", + "vite-plugin-checker": "^0.6.3", + "vitest": "^1.2.2", + "webdriverio": "^8.32.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/@biomejs/biome": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.4.1.tgz", - "integrity": "sha512-JccVAwPbhi37pdxbAGmaOBjUTKEwEjWAhl7rKkVVuXHo4MLASXJ5HR8BTgrImi4/7rTBsGz1tgVD1Kwv1CHGRg==", + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, - "hasInstallScript": true, - "bin": { - "biome": "bin/biome" - }, - "engines": { - "node": ">=14.*" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/biome" - }, - "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "1.4.1", - "@biomejs/cli-darwin-x64": "1.4.1", - "@biomejs/cli-linux-arm64": "1.4.1", - "@biomejs/cli-linux-x64": "1.4.1", - "@biomejs/cli-win32-arm64": "1.4.1", - "@biomejs/cli-win32-x64": "1.4.1" + "dependencies": { + "@babel/highlight": "^7.10.4" } }, - "node_modules/@biomejs/cli-darwin-arm64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.4.1.tgz", - "integrity": "sha512-PZWy2Idndqux38p6AXSDQM2ldRAWi32bvb7bMbTN0ALzpWYMYnxd71ornatumSSJYoNhKmxzDLq+jct7nZJ79w==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=14.*" + "node": ">=6.9.0" } }, - "node_modules/@biomejs/cli-darwin-x64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.4.1.tgz", - "integrity": "sha512-soj3BWhnsM1M2JlzR09cibUzG1owJqetwj/Oo7yg0foijo9lNH9XWXZfJBYDKgW/6Fomn+CC2EcUS+hisQzt9g==", - "cpu": [ - "x64" - ], + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, "engines": { - "node": ">=14.*" + "node": ">=6.9.0" } }, - "node_modules/@biomejs/cli-linux-arm64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.4.1.tgz", - "integrity": "sha512-YIZqfJUg4F+fPsBTXxgD7EU2E5OAYbmYSl/snf4PevwfQCWE/omOFZv+NnIQmjYj9I7ParDgcJvanoA3/kO0JQ==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "color-convert": "^1.9.0" + }, "engines": { - "node": ">=14.*" + "node": ">=4" } }, - "node_modules/@biomejs/cli-linux-x64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.4.1.tgz", - "integrity": "sha512-9YOZw3qBd/KUj63A6Hn2zZgzGb2nbESM0qNmeMXgmqinVKM//uc4OgY5TuKITuGjMSvcVxxd4dX1IzYjV9qvNQ==", - "cpu": [ - "x64" - ], + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, "engines": { - "node": ">=14.*" + "node": ">=4" } }, - "node_modules/@biomejs/cli-win32-arm64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.4.1.tgz", - "integrity": "sha512-nWQbvkNKxYn/kCQ0yVF8kCaS3VzaGvtFSmItXiMknU4521LDjJ7tNWH12Gol+pIslrCbd4E1LhJa0a3ThRsBVg==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=14.*" + "node": ">=0.8.0" } }, - "node_modules/@biomejs/cli-win32-x64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.4.1.tgz", - "integrity": "sha512-88fR2CQxQ4YLs2BUDuywWYQpUKgU3A3sTezANFc/4LGKQFFLV2yX+F7QAdZVkMHfA+RD9Xg178HomM/6mnTNPA==", - "cpu": [ - "x64" - ], + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=14.*" + "node": ">=4" } }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, "engines": { - "node": ">=0.1.90" + "node": ">=4" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", - "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.0.tgz", + "integrity": "sha512-fGFDEctNh0CcSwsiRPxiaqX0P5rq+AqE0SRhYGZ4PX46Lg1FNR6oCxJghf8YgY0WQEgQuh3lErUFE4KxLeRmmw==", "cpu": [ "ppc64" ], + "dev": true, "optional": true, "os": [ "aix" @@ -202,12 +178,13 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", - "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.0.tgz", + "integrity": "sha512-3bMAfInvByLHfJwYPJRlpTeaQA75n8C/QKpEaiS4HrFWFiJlNI0vzq/zCjBrhAYcPyVPG7Eo9dMrcQXuqmNk5g==", "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "android" @@ -217,12 +194,13 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", - "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.0.tgz", + "integrity": "sha512-aVpnM4lURNkp0D3qPoAzSG92VXStYmoVPOgXveAUoQBWRSuQzt51yvSju29J6AHPmwY1BjH49uR29oyfH1ra8Q==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "android" @@ -232,12 +210,13 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", - "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.0.tgz", + "integrity": "sha512-uK7wAnlRvjkCPzh8jJ+QejFyrP8ObKuR5cBIsQZ+qbMunwR8sbd8krmMbxTLSrDhiPZaJYKQAU5Y3iMDcZPhyQ==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "android" @@ -247,12 +226,13 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", - "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.0.tgz", + "integrity": "sha512-AjEcivGAlPs3UAcJedMa9qYg9eSfU6FnGHJjT8s346HSKkrcWlYezGE8VaO2xKfvvlZkgAhyvl06OJOxiMgOYQ==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -262,12 +242,13 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", - "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.0.tgz", + "integrity": "sha512-bsgTPoyYDnPv8ER0HqnJggXK6RyFy4PH4rtsId0V7Efa90u2+EifxytE9pZnsDgExgkARy24WUQGv9irVbTvIw==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -277,12 +258,13 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", - "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.0.tgz", + "integrity": "sha512-kQ7jYdlKS335mpGbMW5tEe3IrQFIok9r84EM3PXB8qBFJPSc6dpWfrtsC/y1pyrz82xfUIn5ZrnSHQQsd6jebQ==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "freebsd" @@ -292,12 +274,13 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", - "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.0.tgz", + "integrity": "sha512-uG8B0WSepMRsBNVXAQcHf9+Ko/Tr+XqmK7Ptel9HVmnykupXdS4J7ovSQUIi0tQGIndhbqWLaIL/qO/cWhXKyQ==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "freebsd" @@ -307,12 +290,13 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", - "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.0.tgz", + "integrity": "sha512-2ezuhdiZw8vuHf1HKSf4TIk80naTbP9At7sOqZmdVwvvMyuoDiZB49YZKLsLOfKIr77+I40dWpHVeY5JHpIEIg==", "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "linux" @@ -322,12 +306,13 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", - "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.0.tgz", + "integrity": "sha512-uTtyYAP5veqi2z9b6Gr0NUoNv9F/rOzI8tOD5jKcCvRUn7T60Bb+42NDBCWNhMjkQzI0qqwXkQGo1SY41G52nw==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -337,12 +322,13 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", - "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.0.tgz", + "integrity": "sha512-c88wwtfs8tTffPaoJ+SQn3y+lKtgTzyjkD8NgsyCtCmtoIC8RDL7PrJU05an/e9VuAke6eJqGkoMhJK1RY6z4w==", "cpu": [ "ia32" ], + "dev": true, "optional": true, "os": [ "linux" @@ -352,12 +338,13 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", - "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.0.tgz", + "integrity": "sha512-lR2rr/128/6svngnVta6JN4gxSXle/yZEZL3o4XZ6esOqhyR4wsKyfu6qXAL04S4S5CgGfG+GYZnjFd4YiG3Aw==", "cpu": [ "loong64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -367,12 +354,13 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", - "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.0.tgz", + "integrity": "sha512-9Sycc+1uUsDnJCelDf6ZNqgZQoK1mJvFtqf2MUz4ujTxGhvCWw+4chYfDLPepMEvVL9PDwn6HrXad5yOrNzIsQ==", "cpu": [ "mips64el" ], + "dev": true, "optional": true, "os": [ "linux" @@ -382,12 +370,13 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", - "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.0.tgz", + "integrity": "sha512-CoWSaaAXOZd+CjbUTdXIJE/t7Oz+4g90A3VBCHLbfuc5yUQU/nFDLOzQsN0cdxgXd97lYW/psIIBdjzQIwTBGw==", "cpu": [ "ppc64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -397,12 +386,13 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", - "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.0.tgz", + "integrity": "sha512-mlb1hg/eYRJUpv8h/x+4ShgoNLL8wgZ64SUr26KwglTYnwAWjkhR2GpoKftDbPOCnodA9t4Y/b68H4J9XmmPzA==", "cpu": [ "riscv64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -412,12 +402,13 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", - "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.0.tgz", + "integrity": "sha512-fgf9ubb53xSnOBqyvWEY6ukBNRl1mVX1srPNu06B6mNsNK20JfH6xV6jECzrQ69/VMiTLvHMicQR/PgTOgqJUQ==", "cpu": [ "s390x" ], + "dev": true, "optional": true, "os": [ "linux" @@ -427,12 +418,13 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", - "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.0.tgz", + "integrity": "sha512-H9Eu6MGse++204XZcYsse1yFHmRXEWgadk2N58O/xd50P9EvFMLJTQLg+lB4E1cF2xhLZU5luSWtGTb0l9UeSg==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -442,12 +434,13 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", - "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.0.tgz", + "integrity": "sha512-lCT675rTN1v8Fo+RGrE5KjSnfY0x9Og4RN7t7lVrN3vMSjy34/+3na0q7RIfWDAj0e0rCh0OL+P88lu3Rt21MQ==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "netbsd" @@ -457,12 +450,13 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", - "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.0.tgz", + "integrity": "sha512-HKoUGXz/TOVXKQ+67NhxyHv+aDSZf44QpWLa3I1lLvAwGq8x1k0T+e2HHSRvxWhfJrFxaaqre1+YyzQ99KixoA==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "openbsd" @@ -472,12 +466,13 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", - "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.0.tgz", + "integrity": "sha512-GDwAqgHQm1mVoPppGsoq4WJwT3vhnz/2N62CzhvApFD1eJyTroob30FPpOZabN+FgCjhG+AgcZyOPIkR8dfD7g==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "sunos" @@ -487,12 +482,13 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", - "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.0.tgz", + "integrity": "sha512-0vYsP8aC4TvMlOQYozoksiaxjlvUcQrac+muDqj1Fxy6jh9l9CZJzj7zmh8JGfiV49cYLTorFLxg7593pGldwQ==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -502,12 +498,13 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", - "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.0.tgz", + "integrity": "sha512-p98u4rIgfh4gdpV00IqknBD5pC84LCub+4a3MO+zjqvU5MVXOc3hqR2UgT2jI2nh3h8s9EQxmOsVI3tyzv1iFg==", "cpu": [ "ia32" ], + "dev": true, "optional": true, "os": [ "win32" @@ -517,12 +514,13 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", - "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.0.tgz", + "integrity": "sha512-NgJnesu1RtWihtTtXGFMU5YSE6JyyHPMxCwBZK7a6/8d31GuSo9l0Ss7w1Jw5QnKUawG6UEehs883kcXf5fYwg==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -531,7109 +529,10800 @@ "node": ">=12" } }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true - }, - "node_modules/@types/codemirror": { - "version": "5.60.15", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.15.tgz", - "integrity": "sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, "dependencies": { - "@types/tern": "*" + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } }, - "node_modules/@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { - "@types/node": "*" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" - }, - "node_modules/@types/gl-matrix": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@types/gl-matrix/-/gl-matrix-2.4.5.tgz", - "integrity": "sha512-0L8Mq1+oaIW0oVzGUDbSW+HnTjCNb4CmoIQE5BkoHt/A7x20z0MJ1PnwfH3atty/vbWLGgvJwVu2Mz3SKFiEFw==" - }, - "node_modules/@types/jasmine": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.1.tgz", - "integrity": "sha512-Vu8l+UGcshYmV1VWwULgnV/2RDbBaO6i2Ptx7nd//oJPIZGhoI1YLST4VKagD2Pq/Bc2/7zvtvhM7F3p4SN7kQ==", - "dev": true - }, - "node_modules/@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" - }, - "node_modules/@types/node": { - "version": "18.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.6.tgz", - "integrity": "sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==" - }, - "node_modules/@types/pako": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.0.tgz", - "integrity": "sha512-10+iaz93qR5WYxTo+PMifD5TSxiOtdRaxBf7INGGXMQgTCu8Z/7GYWYFUOS3q/G0nE5boj1r4FEB+WSy7s5gbA==" - }, - "node_modules/@types/tern": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", - "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { - "@types/estree": "*" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@types/webpack-env": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz", - "integrity": "sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg==" - }, - "node_modules/a-sync-waterfall": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", - "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", - "dev": true - }, - "node_modules/abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==" - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.6" + "node": "*" } }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">=0.4.0" + "node": ">=10.10.0" } }, - "node_modules/acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "bin": { - "acorn": "bin/acorn" + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=0.4.0" + "node": "*" } }, - "node_modules/acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, "engines": { - "node": ">=0.4.0" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { - "color-convert": "^2.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">= 8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==" - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "dependencies": { - "safer-buffer": "~2.1.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "engines": { - "node": ">=0.8" + "node": ">= 8" } }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, "engines": { - "node": "*" + "node": ">= 8" } }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==" }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, "engines": { - "node": "^4.5.0 || >= 5.9" + "node": ">=14" } }, - "node_modules/basic-auth": { + "node_modules/@polka/url": { + "version": "1.0.0-next.24", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", + "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", + "dev": true + }, + "node_modules/@puppeteer/browsers": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.0.1.tgz", + "integrity": "sha512-IQj/rJY1MNfZ6Z2ERu+6S0LkIPBSXRGddgmvODqjm1afHy04aJIiWmoohuFtL78SPSlbjpIMuFVfhyqsR5Ng4A==", "dev": true, "dependencies": { - "safe-buffer": "5.1.2" + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.4.0", + "tar-fs": "3.0.5", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" }, "engines": { - "node": ">= 0.8" + "node": ">=18" } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, "dependencies": { - "tweetnacl": "^0.14.3" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/benchmark": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", - "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", + "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "lodash": "^4.17.4", - "platform": "^1.3.3" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "engines": { - "node": "*" - } + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", + "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", + "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", + "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", + "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", + "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", + "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", + "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", + "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", + "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", + "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", + "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", + "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", "dev": true, "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dev": true, "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "defer-to-connect": "^2.0.1" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=14.16" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true, - "dependencies": { - "ms": "2.0.0" + "optional": true, + "peer": true, + "engines": { + "node": ">= 6" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", "dev": true }, - "node_modules/body-parser/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/@types/codemirror": { + "version": "5.60.15", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.15.tgz", + "integrity": "sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==", "dev": true, "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" + "@types/tern": "*" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/gl-matrix": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@types/gl-matrix/-/gl-matrix-2.4.5.tgz", + "integrity": "sha512-0L8Mq1+oaIW0oVzGUDbSW+HnTjCNb4CmoIQE5BkoHt/A7x20z0MJ1PnwfH3atty/vbWLGgvJwVu2Mz3SKFiEFw==", + "dev": true + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", + "dev": true + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@types/lodash": "*" } }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/@types/node": { + "version": "20.11.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.14.tgz", + "integrity": "sha512-w3yWCcwULefjP9DmDDsgUskrMoOy5Z8MiwKHr1FvqGPtx7CvJzQvxD7eKpxNtklQxLruxSXWddyeRtyud0RcXQ==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" + "undici-types": "~5.26.4" } }, - "node_modules/brfs": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", - "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", + "node_modules/@types/pako": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.3.tgz", + "integrity": "sha512-bq0hMV9opAcrmE0Byyo0fY3Ew4tgOevJmQ9grUhpXQhYfyLJ1Kqg3P33JT5fdbT2AjeAjR51zqqVjAL/HMkx7Q==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, + "node_modules/@types/tern": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", + "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", + "dev": true, "dependencies": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - }, - "bin": { - "brfs": "bin/cmd.js" + "@types/estree": "*" } }, - "node_modules/brfs/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "node_modules/@types/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz", + "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "@types/node": "*" } }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "node_modules/buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", - "engines": { - "node": ">=0.4.0" + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "dev": true, - "engines": { - "node": ">= 0.8" + "optional": true, + "dependencies": { + "@types/node": "*" } }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.20.0.tgz", + "integrity": "sha512-fTwGQUnjhoYHeSF6m5pWNkzmDDdsKELYrOBxhjMrofPqCkoC2k3B2wvGHFxa1CTIqkEn88nlW1HVMztjo2K8Hg==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.20.0", + "@typescript-eslint/type-utils": "6.20.0", + "@typescript-eslint/utils": "6.20.0", + "@typescript-eslint/visitor-keys": "6.20.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/@typescript-eslint/parser": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.20.0.tgz", + "integrity": "sha512-bYerPDF/H5v6V76MdMYhjwmwgMA+jlPVqjSDq2cRqMi8bP5sR3Z+RLOiOMad3nsnmDVmn2gAFCyNgh/dIrfP/w==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "@typescript-eslint/scope-manager": "6.20.0", + "@typescript-eslint/types": "6.20.0", + "@typescript-eslint/typescript-estree": "6.20.0", + "@typescript-eslint/visitor-keys": "6.20.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 8.10.0" + "node": "^16.0.0 || >=18.0.0" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.20.0.tgz", + "integrity": "sha512-p4rvHQRDTI1tGGMDFQm+GtxP1ZHyAh64WANVoyEcNMpaTFn3ox/3CcgtIlELnRfKzSs/DwYlDccJEtr3O6qBvA==", "dev": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "@typescript-eslint/types": "6.20.0", + "@typescript-eslint/visitor-keys": "6.20.0" }, "engines": { - "node": ">=12" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/codemirror": { - "version": "5.65.12", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.12.tgz", - "integrity": "sha512-z2jlHBocElRnPYysN2HAuhXbO3DNB0bcSKmNz3hcWR2Js2Dkhc1bEOxG93Z3DeUrnm+qx56XOY5wQmbP5KY0sw==" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@typescript-eslint/type-utils": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.20.0.tgz", + "integrity": "sha512-qnSobiJQb1F5JjN0YDRPHruQTrX7ICsmltXhkV536mp4idGAYrIyr47zF/JmkJtEcAVnIz4gUYJ7gOZa6SmN4g==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "@typescript-eslint/typescript-estree": "6.20.0", + "@typescript-eslint/utils": "6.20.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": ">=7.0.0" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/@typescript-eslint/types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.20.0.tgz", + "integrity": "sha512-MM9mfZMAhiN4cOEcUOEx+0HmuaW3WBfukBZPCfwSqFnQy0grXYtngKCqpQN339X3RrwtzspWJrpbrupKYUSBXQ==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.20.0.tgz", + "integrity": "sha512-RnRya9q5m6YYSpBN7IzKu9FmLcYtErkDkc8/dKv81I9QiLLtVBHrjz+Ev/crAqgMNW2FCsoZF4g2QUylMnJz+g==", "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.20.0", + "@typescript-eslint/visitor-keys": "6.20.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, "engines": { - "node": ">=0.1.90" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/@typescript-eslint/utils": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.20.0.tgz", + "integrity": "sha512-/EKuw+kRu2vAqCoDwDCBtDRU6CTKbUmwwI7SH7AashZ+W+7o8eiyy6V2cdOqN49KsTcASWsC5QeghYuRDTyOOg==", + "dev": true, "dependencies": { - "delayed-stream": "~1.0.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.20.0", + "@typescript-eslint/types": "6.20.0", + "@typescript-eslint/typescript-estree": "6.20.0", + "semver": "^7.5.4" }, "engines": { - "node": ">= 0.8" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.20.0.tgz", + "integrity": "sha512-E8Cp98kRe4gKHjJD4NExXKz/zOJ1A2hhZc+IMVD6i7w4yjIvh6VyuRI0gRtxAsXtoC35uGMaQ9rjI2zJaXDEAw==", "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.20.0", + "eslint-visitor-keys": "^3.4.1" + }, "engines": { - "node": ">= 6" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], + "node_modules/@vitest/browser": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-1.2.2.tgz", + "integrity": "sha512-N8myxNVLbS9AbZ7B2cK33HTGYVzUTDArbMh3hLojOxaj7s7ZrBYYmzs0Q5J2wyDrOgs51p6OUrrzAIb1Z+Ck3A==", + "dev": true, "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "@vitest/utils": "1.2.2", + "magic-string": "^0.30.5", + "sirv": "^2.0.4" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "^1.0.0", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } } }, - "node_modules/condense-newlines": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", - "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==", + "node_modules/@vitest/expect": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.2.2.tgz", + "integrity": "sha512-3jpcdPAD7LwHUUiT2pZTj2U82I2Tcgg2oVPvKxhn6mDI2On6tfvPQTjAI4628GUGDZrCm4Zna9iQHm5cEexOAg==", + "dev": true, "dependencies": { - "extend-shallow": "^2.0.1", - "is-whitespace": "^0.3.0", - "kind-of": "^3.0.2" + "@vitest/spy": "1.2.2", + "@vitest/utils": "1.2.2", + "chai": "^4.3.10" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/condense-newlines/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "node_modules/@vitest/runner": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.2.2.tgz", + "integrity": "sha512-JctG7QZ4LSDXr5CsUweFgcpEvrcxOV1Gft7uHrvkQ+fsAVylmWQvnaAr/HDp3LAH1fztGMQZugIheTWjaGzYIg==", + "dev": true, "dependencies": { - "is-extendable": "^0.1.0" + "@vitest/utils": "1.2.2", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/condense-newlines/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/condense-newlines/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "node_modules/@vitest/snapshot": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.2.2.tgz", + "integrity": "sha512-SmGY4saEw1+bwE1th6S/cZmPxz/Q4JWsl7LvbQIky2tKE35US4gd0Mjzqfr84/4OD0tikGWaWdMja/nWL5NIPA==", "dev": true, "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" }, - "engines": { - "node": ">= 0.10.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@vitest/spy": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.2.2.tgz", + "integrity": "sha512-k9Gcahssw8d7X3pSLq3e3XEu/0L78mUkCjivUqCQeXJm9clfXR/Td8+AP+VC1O6fKPIDLcHDTAmBOINVuv6+7g==", "dev": true, "dependencies": { - "ms": "2.0.0" + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/@vitest/ui": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-1.2.2.tgz", + "integrity": "sha512-CG+5fa8lyoBr+9i+UZGS31Qw81v33QlD10uecHxN2CLJVN+jLnqx4pGzGvFFeJ7jSnUCT0AlbmVWY6fU6NJZmw==", + "dev": true, + "dependencies": { + "@vitest/utils": "1.2.2", + "fast-glob": "^3.3.2", + "fflate": "^0.8.1", + "flatted": "^3.2.9", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "sirv": "^2.0.4" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "^1.0.0" + } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/@vitest/utils": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.2.2.tgz", + "integrity": "sha512-WKITBHLsBHlpjnDQahr+XK6RE7MiAsgrIkr0pGhQ9ygoxBfUeG0lUG5iLlzqjmKSlBv3+j5EGsriBzh+C3Tq9g==", "dev": true, - "engines": { - "node": ">= 0.6" + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + "node_modules/@vitest/utils/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "node_modules/@wdio/config": { + "version": "8.32.2", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.32.2.tgz", + "integrity": "sha512-ubqe4X+TgcERzXKIpMfisquNxPZNtRU5uPeV7hvas++mD75QyNpmWHCtea2+TjoXKxlZd1MVrtZAwtmqMmyhPw==", "dev": true, + "dependencies": { + "@wdio/logger": "8.28.0", + "@wdio/types": "8.32.2", + "@wdio/utils": "8.32.2", + "decamelize": "^6.0.0", + "deepmerge-ts": "^5.0.0", + "glob": "^10.2.2", + "import-meta-resolve": "^4.0.0" + }, "engines": { - "node": ">= 0.6" + "node": "^16.13 || >=18" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "node_modules/@wdio/logger": { + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.28.0.tgz", + "integrity": "sha512-/s6zNCqwy1hoc+K4SJypis0Ud0dlJ+urOelJFO1x0G0rwDRWyFiUP6ijTaCcFxAm29jYEcEPWijl2xkVIHwOyA==", "dev": true, "dependencies": { - "object-assign": "^4", - "vary": "^1" + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 0.10" + "node": "^16.13 || >=18" } }, - "node_modules/cors/node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/@wdio/logger/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + "node_modules/@wdio/logger/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "node_modules/cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", + "node_modules/@wdio/logger/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { - "cssom": "0.3.x" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "node_modules/@wdio/protocols": { + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.32.0.tgz", + "integrity": "sha512-inLJRrtIGdTz/YPbcsvpSvPlYQFTVtF3OYBwAXhG2FiP1ZwE1CQNLP/xgRGye1ymdGCypGkexRqIx3KBGm801Q==", "dev": true }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "node_modules/@wdio/repl": { + "version": "8.24.12", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.24.12.tgz", + "integrity": "sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==", + "dev": true, "dependencies": { - "assert-plus": "^1.0.0" + "@types/node": "^20.1.0" }, "engines": { - "node": ">=0.10" + "node": "^16.13 || >=18" } }, - "node_modules/data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "node_modules/@wdio/types": { + "version": "8.32.2", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.32.2.tgz", + "integrity": "sha512-jq8LcBBQpBP9ZF5kECKEpXv8hN7irCGCjLFAN0Bd5ScRR6qu6MGWvwkDkau2sFPr0b++sKDCEaMzQlwrGFjZXg==", + "dev": true, "dependencies": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "@types/node": "^20.1.0" + }, + "engines": { + "node": "^16.13 || >=18" } }, - "node_modules/data-urls/node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "node_modules/@wdio/utils": { + "version": "8.32.2", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.32.2.tgz", + "integrity": "sha512-PJcP4d1Fr8Zp+YIfGN93G0fjDj/6J0I6Gf6p0IpJk8qKQpdFDm4gB+lc202iv2YkyC+oT6b4Ik2W9LzvpSKNoQ==", + "dev": true, "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "@puppeteer/browsers": "^1.6.0", + "@wdio/logger": "8.28.0", + "@wdio/types": "8.32.2", + "decamelize": "^6.0.0", + "deepmerge-ts": "^5.1.0", + "edgedriver": "^5.3.5", + "geckodriver": "^4.3.1", + "get-port": "^7.0.0", + "import-meta-resolve": "^4.0.0", + "locate-app": "^2.1.0", + "safaridriver": "^0.1.0", + "split2": "^4.2.0", + "wait-port": "^1.0.4" + }, + "engines": { + "node": "^16.13 || >=18" } }, - "node_modules/date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", "dev": true, + "optional": true, + "peer": true + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "engines": { - "node": ">=4.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" + "bin": { + "acorn": "bin/acorn" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { "node": ">=0.4.0" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, - "engines": { - "node": ">= 0.8" + "optional": true, + "peer": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, + "optional": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=0.4.0" } }, - "node_modules/di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true - }, - "node_modules/dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "dependencies": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dependencies": { - "webidl-conversions": "^4.0.2" + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.4.0" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" } }, - "node_modules/editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "bin": { - "editorconfig": "bin/editorconfig" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/editorconfig/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/editorconfig/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/element-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", - "integrity": "sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==" - }, - "node_modules/emoji-regex": { + "node_modules/ansi-align/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">= 4" + "node": ">=8" } }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=6" } }, - "node_modules/engine.io": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz", - "integrity": "sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==", + "node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", "dev": true, "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0" + "type-fest": "^1.0.2" }, "engines": { - "node": ">=10.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/engine.io-parser": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", - "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "node": ">=10" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } }, - "node_modules/esbuild": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", - "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" }, "engines": { - "node": ">=12" + "node": ">=8" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.11", - "@esbuild/android-arm": "0.19.11", - "@esbuild/android-arm64": "0.19.11", - "@esbuild/android-x64": "0.19.11", - "@esbuild/darwin-arm64": "0.19.11", - "@esbuild/darwin-x64": "0.19.11", - "@esbuild/freebsd-arm64": "0.19.11", - "@esbuild/freebsd-x64": "0.19.11", - "@esbuild/linux-arm": "0.19.11", - "@esbuild/linux-arm64": "0.19.11", - "@esbuild/linux-ia32": "0.19.11", - "@esbuild/linux-loong64": "0.19.11", - "@esbuild/linux-mips64el": "0.19.11", - "@esbuild/linux-ppc64": "0.19.11", - "@esbuild/linux-riscv64": "0.19.11", - "@esbuild/linux-s390x": "0.19.11", - "@esbuild/linux-x64": "0.19.11", - "@esbuild/netbsd-x64": "0.19.11", - "@esbuild/openbsd-x64": "0.19.11", - "@esbuild/sunos-x64": "0.19.11", - "@esbuild/win32-arm64": "0.19.11", - "@esbuild/win32-ia32": "0.19.11", - "@esbuild/win32-x64": "0.19.11" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "node": ">= 8" } }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "node_modules/archiver": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-6.0.1.tgz", + "integrity": "sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==", + "dev": true, "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "archiver-utils": "^4.0.1", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^5.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 12.0.0" } }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/archiver-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-4.0.1.tgz", + "integrity": "sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==", + "dev": true, "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "glob": "^8.0.0", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 12.0.0" } }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "node_modules/archiver-utils/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "node_modules/archiver-utils/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, "dependencies": { - "prelude-ls": "~1.1.2" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/archiver/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=4.0" + "node": ">= 6" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, - "engines": { - "node": ">= 0.6" + "dependencies": { + "dequal": "^2.0.3" } }, - "node_modules/event-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", - "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, "dependencies": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", - "engines": { - "node": ">=0.4.x" + "node_modules/array-equal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.2.tgz", + "integrity": "sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/falafel": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", - "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, "dependencies": { - "acorn": "^7.1.1", - "isarray": "^2.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" }, "engines": { - "node": ">=0.4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/falafel/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-json-stable-stringify": { + "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", "dev": true, "dependencies": { - "websocket-driver": ">=0.5.1" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fflate": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.1.tgz", - "integrity": "sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ==" - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { - "to-regex-range": "^5.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, "dependencies": { - "ms": "2.0.0" + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">=0.8" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, "engines": { "node": "*" } }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "tslib": "^2.0.1" }, "engines": { - "node": ">= 0.12" + "node": ">=4" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "engines": { - "node": ">=6 <7 || >=8" + "node": "*" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bare-events": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.0.tgz", + "integrity": "sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg==", + "dev": true, + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.1.5.tgz", + "integrity": "sha512-5t0nlecX+N2uJqdxe9d18A98cp2u9BETelbjKpiVgQqzzmVNFYWEAjQHqS+2Khgto1vcwhik9cXucaj5ve2WWA==", "dev": true, - "hasInstallScript": true, "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "dependencies": { + "bare-events": "^2.0.0", + "bare-os": "^2.0.0", + "bare-path": "^2.0.0", + "streamx": "^2.13.0" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "node_modules/bare-os": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.2.0.tgz", + "integrity": "sha512-hD0rOPfYWOMpVirTACt4/nK8mC55La12K5fY1ij8HAdfQakD62M+H4o4tpfKzVGLgRDTuk3vjA4GqGXXCeFbag==", + "dev": true, + "optional": true }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/bare-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.0.tgz", + "integrity": "sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==", "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" } }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-ftp": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.4.tgz", + "integrity": "sha512-8PzkB0arJFV4jJWSGOYR+OEic6aeKMu/osRhBULN6RY0ykby6LKhbmuQ5ublvaas5BOwboah5D87nrHyuh8PPA==", + "dev": true, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dependencies": { - "assert-plus": "^1.0.0" + "tweetnacl": "^0.14.3" } }, - "node_modules/gl-matrix": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.1.0.tgz", - "integrity": "sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==" + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "dev": true, + "engines": { + "node": ">=0.6" + } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" }, "engines": { "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/glsl-editor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glsl-editor/-/glsl-editor-1.0.0.tgz", - "integrity": "sha512-eku+MXM8P3lXU8yhGdChkKdqorNrGmG+21YT/veoxODbqPEleBXOwXV76L6T9dnXXjt9elY7z9ctxBAyTLtOqg==", + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, "dependencies": { - "brfs": "^1.2.0", - "codemirror": "^4.5.0", - "element-size": "^1.1.1", - "events": "^1.0.2", - "inherits": "^2.0.1", - "insert-css": "^0.2.0", - "through2": "^0.6.1", - "xtend": "^4.0.0" + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/glsl-editor/node_modules/codemirror": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-4.13.0.tgz", - "integrity": "sha512-+KOX1KjxkdzFJibjxg4u7r5uuLXG6M9cmVbio7x5qAyXcyT0Y437DPMP3AEmD1bGxoi+xFx21B84W0MfIuTfxQ==" - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "dev": true + }, + "node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "dev": true, "dependencies": { - "function-bind": "^1.1.1" + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" }, "engines": { - "node": ">= 0.4.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/boxen/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "engines": { - "node": ">= 0.4" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "whatwg-encoding": "^1.0.1" + "balanced-match": "^1.0.0" } }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "fill-range": "^7.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" + "node_modules/brfs": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", + "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", + "dependencies": { + "quote-stream": "^1.0.1", + "resolve": "^1.1.5", + "static-module": "^2.2.0", + "through2": "^2.0.0" + }, + "bin": { + "brfs": "bin/cmd.js" } }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true + "node_modules/brfs/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "node": "*" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, + "node_modules/buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", "engines": { - "node": ">=0.10.0" + "node": ">=0.4.0" } }, - "node_modules/ikonate": { - "version": "1.1.1", - "resolved": "git+ssh://git@github.com/mikolajdobrucki/ikonate.git#a86b4107c6ec717e7877f880a930d1ccf0b59d89", - "integrity": "sha512-npghn+yBsovOp2k50rtoqNxUG53BuysNA5m3BqF1qXwm397fiKKvtkzLgPMJJsd+nbXjrRHdsEyvHcLj20OOhg==", - "license": "MIT", - "dependencies": { - "jsdom": "11.10.0", - "pretty": "^2.0.0", - "xmldom": "^0.1.27" - } + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "dev": true, + "engines": { + "node": ">=0.10" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "dev": true, + "engines": { + "node": ">=0.2.0" + } }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/insert-css": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-0.2.0.tgz", - "integrity": "sha512-tXSEsS2BJfEdtBuKzqfbbOijbWQC+y0i5pGd4OXNBauhWZ5lLNs7nb03tyONVuvwu6RXyQqWwqoRJV3jKR7+ag==" + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "dev": true, + "engines": { + "node": ">=14.16" + } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", "dev": true, "dependencies": { - "binary-extensions": "^2.0.0" + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.16" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, "dependencies": { - "has": "^1.0.3" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "bin": { - "is-docker": "cli.js" - }, "engines": { - "node": ">=8" + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true, + "engines": { + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", "dev": true, + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "is-extglob": "^2.1.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, "engines": { - "node": ">=0.12.0" + "node": "*" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-whitespace": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", - "integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==", + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "is-docker": "^2.0.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "node_modules/chromium-bidi": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", + "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", + "dev": true, + "dependencies": { + "mitt": "3.0.0" + }, + "peerDependencies": { + "devtools-protocol": "*" + } }, - "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "dev": true, "engines": { - "node": ">= 8.0.0" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/gjtorikian/" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/jasmine-core": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz", - "integrity": "sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw==", - "dev": true - }, - "node_modules/js-beautify": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.7.tgz", - "integrity": "sha512-5SOX1KXPFKx+5f6ZrPsIPEY7NwKeQz47n3jm2i+XeHx9MoRsfQenlOP13FQhWvg8JRS0+XLO6XYUQ2GX+q+T9A==", + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, "dependencies": { - "config-chain": "^1.1.13", - "editorconfig": "^0.15.3", - "glob": "^8.0.3", - "nopt": "^6.0.0" - }, - "bin": { - "css-beautify": "js/bin/css-beautify.js", - "html-beautify": "js/bin/html-beautify.js", - "js-beautify": "js/bin/js-beautify.js" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/js-beautify/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/js-beautify/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=8" } }, - "node_modules/js-beautify/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + "node_modules/codemirror": { + "version": "5.65.16", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.16.tgz", + "integrity": "sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg==" }, - "node_modules/jsdom": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.10.0.tgz", - "integrity": "sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "abab": "^1.0.4", - "acorn": "^5.3.0", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": ">= 0.2.37 < 0.3.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.0", - "escodegen": "^1.9.0", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.2.0", - "nwmatcher": "^1.4.3", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.83.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.3", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.0", - "ws": "^4.0.0", - "xml-name-validator": "^3.0.0" - } - }, - "node_modules/jsdom/node_modules/acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "bin": { - "acorn": "bin/acorn" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.4.0" + "node": ">=7.0.0" } }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { - "minimist": "^1.2.0" + "delayed-stream": "~1.0.0" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">= 0.8" } }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "node_modules/comlink": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.1.tgz", + "integrity": "sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==", + "dev": true + }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": "^12.20.0 || >=14" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/compress-commons": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-5.0.1.tgz", + "integrity": "sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==", + "dev": true, "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "crc-32": "^1.2.0", + "crc32-stream": "^5.0.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">=0.6.0" + "node": ">= 12.0.0" } }, - "node_modules/karma": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz", - "integrity": "sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA==", + "node_modules/compress-commons/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.4.1", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "bin": { - "karma": "bin/karma" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">= 10" + "node": ">= 6" } }, - "node_modules/karma-benchmark": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/karma-benchmark/-/karma-benchmark-1.0.4.tgz", - "integrity": "sha512-e9YmWrX3xk7BSosBaL/7lg0ZKSOpwQySKlLb1xa2m5VbwMVFffS29QB9f2UCT7+aMCnJlNRWjcKym4Ch/60OsA==", - "dev": true, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==", "dependencies": { - "lodash": "4.17.15", - "platform": "1.3.5" + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" }, - "peerDependencies": { - "benchmark": "^2.1.4", - "karma": "^4.2.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/karma-benchmark-reporter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/karma-benchmark-reporter/-/karma-benchmark-reporter-0.1.1.tgz", - "integrity": "sha512-aMPKPqXgTLVKDfLUBRyo0j/aLaLGCHMHrKhSf0ku+/j7LJJ/fEthrGmTyDbPU7mP3+8QDfgcxmCA5Q/Zu+E9VA==", - "dev": true, - "peerDependencies": { - "karma": ">=0.9" + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, - "node_modules/karma-benchmark/node_modules/lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, - "node_modules/karma-benchmark/node_modules/platform": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", - "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==", - "dev": true + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, - "node_modules/karma-chrome-launcher": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", - "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "dev": true, - "dependencies": { - "which": "^1.2.1" + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" } }, - "node_modules/karma-chrome-launcher/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/crc32-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-5.0.0.tgz", + "integrity": "sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">= 12.0.0" } }, - "node_modules/karma-esbuild": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/karma-esbuild/-/karma-esbuild-2.3.0.tgz", - "integrity": "sha512-iW3DjSGohEEkufSDmXRPZP7CNP0ye+Xt8fBCcenLqPL2u8+VHZYwlzwYyfs60vjhdf1i04xekhzI7gu8as1CLg==", + "node_modules/crc32-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { - "chokidar": "^3.5.1", - "source-map": "0.6.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, - "peerDependencies": { - "esbuild": ">=0.17.0" + "engines": { + "node": ">= 6" } }, - "node_modules/karma-firefox-launcher": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.2.tgz", - "integrity": "sha512-VV9xDQU1QIboTrjtGVD4NCfzIH7n01ZXqy/qpBhnOeGVOkG5JYPEm8kuSd7psHE6WouZaQ9Ool92g8LFweSNMA==", + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", "dev": true, "dependencies": { - "is-wsl": "^2.2.0", - "which": "^2.0.1" + "node-fetch": "^2.6.12" } }, - "node_modules/karma-jasmine": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", - "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, "dependencies": { - "jasmine-core": "^4.1.0" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=12" + "node": "4.x || >=6.0.0" }, "peerDependencies": { - "karma": "^6.0.0" + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/karma-mocha-reporter": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz", - "integrity": "sha512-Hr6nhkIp0GIJJrvzY8JFeHpQZNseuIakGac4bpw8K1+5F0tLb6l7uvXRa8mt2Z+NVwYgCct4QAfp2R2QP6o00w==", + "node_modules/cross-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/cross-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/cross-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, "dependencies": { - "chalk": "^2.1.0", - "log-symbols": "^2.1.0", - "strip-ansi": "^4.0.0" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "peerDependencies": { - "karma": ">=0.13" + "engines": { + "node": ">= 8" } }, - "node_modules/karma-mocha-reporter/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "node_modules/css-shorthand-properties": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz", + "integrity": "sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==", + "dev": true + }, + "node_modules/css-value": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", + "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==", + "dev": true + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "cssom": "~0.3.6" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/karma-mocha-reporter/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true, + "optional": true, + "peer": true + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dependencies": { - "color-convert": "^1.9.0" + "assert-plus": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">=0.10" } }, - "node_modules/karma-mocha-reporter/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/karma-mocha-reporter/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/data-urls/node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "color-name": "1.1.3" + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" } }, - "node_modules/karma-mocha-reporter/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/karma-mocha-reporter/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, + "optional": true, + "peer": true, "engines": { - "node": ">=0.8.0" + "node": ">=12" } }, - "node_modules/karma-mocha-reporter/node_modules/has-flag": { + "node_modules/data-urls/node_modules/whatwg-mimetype": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "dev": true, + "optional": true, + "peer": true, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/karma-mocha-reporter/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "ansi-regex": "^3.0.0" + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/karma-mocha-reporter/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">=4" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/karma-sourcemap-loader": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.4.0.tgz", - "integrity": "sha512-xCRL3/pmhAYF3I6qOrcn0uhbQevitc2DERMPH82FMnG+4WReoGcGFZb1pURf2a5apyrOHRdvD+O6K7NljqKHyA==", + "node_modules/decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", "dev": true, - "dependencies": { - "graceful-fs": "^4.2.10" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/karma/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } + "optional": true, + "peer": true }, - "node_modules/karma/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "mimic-response": "^3.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/karma/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "deprecated": "use String.prototype.padStart()" - }, - "node_modules/loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "type-detect": "^4.0.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=6" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + "node_modules/deepmerge-ts": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz", + "integrity": "sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } }, - "node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "dependencies": { - "chalk": "^2.0.1" + "clone": "^1.0.2" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=0.8" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } }, - "node_modules/log-symbols/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=6" } }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "dev": true, + "optional": true, + "peer": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, "engines": { - "node": ">=4" + "node": ">=0.10" } }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/devtools-protocol": { + "version": "0.0.1261483", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1261483.tgz", + "integrity": "sha512-7vJvejpzA5DTfZVkr7a8sGpEAzEiAqcgmRTB0LSUrWeOicwL09lMQTzxHtFNVhJ1OOJkgYdH6Txvy9E5j3VOUQ==", + "dev": true + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/log4js": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.8.0.tgz", - "integrity": "sha512-g+V8gZyurIexrOvWQ+AcZsIvuK/lBnx2argejZxL4gVZ4Hq02kUYH6WZOnqxgBml+zzQZYdaEoTN84B6Hzm8Fg==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.5" + "path-type": "^4.0.0" }, "engines": { - "node": ">=8.0" + "node": ">=8" } }, - "node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/magic-string": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "vlq": "^0.2.2" + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", - "dev": true + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/edge-paths": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-3.0.5.tgz", + "integrity": "sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==", "dev": true, + "dependencies": { + "@types/which": "^2.0.1", + "which": "^2.0.2" + }, "engines": { - "node": ">= 0.6" + "node": ">=14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/shirshak55" } }, - "node_modules/merge-source-map": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", - "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==", + "node_modules/edgedriver": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-5.3.10.tgz", + "integrity": "sha512-RFSHYMNtcF1PjaGZCA2rdQQ8hSTLPZgcYgeY1V6dC+tR4NhZXwFAku+8hCbRYh7ZlwKKrTbVu9FwknjFddIuuw==", + "dev": true, + "hasInstallScript": true, "dependencies": { - "source-map": "^0.5.6" + "@wdio/logger": "^8.28.0", + "decamelize": "^6.0.0", + "edge-paths": "^3.0.5", + "node-fetch": "^3.3.2", + "unzipper": "^0.10.14", + "which": "^4.0.0" + }, + "bin": { + "edgedriver": "bin/edgedriver.js" } }, - "node_modules/merge-source-map/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "node_modules/edgedriver/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=16" } }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "node_modules/edgedriver/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, "bin": { - "mime": "cli.js" + "node-which": "bin/which.js" }, "engines": { - "node": ">=4.0.0" + "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/editorconfig": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", + "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, "engines": { - "node": ">= 0.6" + "node": ">=14" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/editorconfig/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", "dependencies": { - "mime-db": "1.52.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/element-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", + "integrity": "sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": "*" + "node": ">=10.13.0" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, "dependencies": { - "minimist": "^1.2.6" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">= 0.4" } }, - "node_modules/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "engines": { - "node": ">= 0.8.0" + "hasown": "^2.0.0" } }, - "node_modules/morgan/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "dependencies": { - "ms": "2.0.0" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/morgan/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/esbuild": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.0.tgz", + "integrity": "sha512-6iwE3Y2RVYCME1jLpBqq7LQWK3MW6vjV2bZy6gt/WrqkY+WE74Spyc0ThAOYpMtITvnjX09CrC6ym7A/m9mebA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.0", + "@esbuild/android-arm": "0.20.0", + "@esbuild/android-arm64": "0.20.0", + "@esbuild/android-x64": "0.20.0", + "@esbuild/darwin-arm64": "0.20.0", + "@esbuild/darwin-x64": "0.20.0", + "@esbuild/freebsd-arm64": "0.20.0", + "@esbuild/freebsd-x64": "0.20.0", + "@esbuild/linux-arm": "0.20.0", + "@esbuild/linux-arm64": "0.20.0", + "@esbuild/linux-ia32": "0.20.0", + "@esbuild/linux-loong64": "0.20.0", + "@esbuild/linux-mips64el": "0.20.0", + "@esbuild/linux-ppc64": "0.20.0", + "@esbuild/linux-riscv64": "0.20.0", + "@esbuild/linux-s390x": "0.20.0", + "@esbuild/linux-x64": "0.20.0", + "@esbuild/netbsd-x64": "0.20.0", + "@esbuild/openbsd-x64": "0.20.0", + "@esbuild/sunos-x64": "0.20.0", + "@esbuild/win32-arm64": "0.20.0", + "@esbuild/win32-ia32": "0.20.0", + "@esbuild/win32-x64": "0.20.0" + } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nifti-reader-js": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/nifti-reader-js/-/nifti-reader-js-0.5.4.tgz", - "integrity": "sha512-KnZMEw9Wd39x1eTTZQaF5Zjh7LbUeWcxfEj0v5VS/yTkV2y/YHrAnC6VJyf2FjrmsUOElDVjIoHGLMCkcnpiNg==", + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dependencies": { - "pako": "*" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dependencies": { - "abbrev": "^1.0.0" + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, "bin": { - "nopt": "bin/nopt.js" + "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/eslint-formatter-codeframe": { + "version": "7.32.1", + "resolved": "https://registry.npmjs.org/eslint-formatter-codeframe/-/eslint-formatter-codeframe-7.32.1.tgz", + "integrity": "sha512-DK/3Q3+zVKq/7PdSYiCxPrsDF8H/TRMK5n8Hziwr4IMkMy+XiKSwbpj25AdajS63I/B61Snetq4uVvX9fOLyAg==", "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "chalk": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/numcodecs": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/numcodecs/-/numcodecs-0.3.1.tgz", - "integrity": "sha512-ywIyGpJ+c6Ojktq9a8jsWSy12ZSUcW/W+I3jlH0q0zv9aR/ZiMsN7IrWaNq9YV2FRdLu6r/M6lp35jMA6fug/A==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, "dependencies": { - "fflate": "^0.8.0" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/nunjucks": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.3.tgz", - "integrity": "sha512-psb6xjLj47+fE76JdZwskvwG4MYsQKXUtMsPh6U0YMvmyjRtKRFcxnlXGWglNybtNTNVmGdp94K62/+NjF5FDQ==", + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", "dev": true, "dependencies": { - "a-sync-waterfall": "^1.0.0", - "asap": "^2.0.3", - "commander": "^5.1.0" + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-interactive": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/eslint-interactive/-/eslint-interactive-10.8.0.tgz", + "integrity": "sha512-bsMSr0NVyxoSbKbA3Rn8so5+A9q+Zu8xExiIM18umPjrqfBAN8WcJfsWvfc9Myfiqn2WwLDM9mRglbx+Hp+z3Q==", + "dev": true, + "dependencies": { + "boxen": "^7.0.2", + "chalk": "^5.0.1", + "comlink": "^4.3.1", + "enquirer": "^2.3.6", + "eslint-formatter-codeframe": "^7.32.1", + "estraverse": "^5.3.0", + "find-cache-dir": "^4.0.0", + "is-installed-globally": "^0.4.0", + "ora": "^6.1.2", + "strip-ansi": "^7.0.1", + "table": "^6.8.1", + "terminal-link": "^3.0.0", + "yargs": "^17.5.1" }, "bin": { - "nunjucks-precompile": "bin/precompile" + "eslint-interactive": "bin/eslint-interactive.js" }, "engines": { - "node": ">= 6.9.0" + "node": "^14.13.1 || >=16.0.0" }, "peerDependencies": { - "chokidar": "^3.3.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/nwmatcher": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", - "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==" - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "node_modules/eslint-interactive/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, "engines": { - "node": "*" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "node_modules/eslint-interactive/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "node_modules/eslint-interactive/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "ee-first": "1.1.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, "engines": { - "node": ">= 0.8" + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { - "wrappy": "1" + "ms": "^2.1.1" } }, - "node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } }, - "node_modules/parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "engines": { - "node": ">= 0.8" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "through": "~2.3" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, "engines": { - "node": ">=8.6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://opencollective.com/eslint" } }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", - "dev": true + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } }, - "node_modules/pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "node_modules/prettier": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", - "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" + "dependencies": { + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=14" + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/pretty": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", - "integrity": "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==", - "dependencies": { - "condense-newlines": "^0.2.1", - "extend-shallow": "^2.0.1", - "js-beautify": "^1.6.12" + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/pretty/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, "dependencies": { - "is-extendable": "^0.1.0" + "estraverse": "^5.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "node_modules/pretty/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "engines": { + "node": ">=0.4.x" + } }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "node_modules/execa/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "engines": { - "node": ">=0.9" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/execa/node_modules/npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "path-key": "^4.0.0" }, "engines": { - "node": ">=0.6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/quote-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", - "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==", + "node_modules/execa/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, "dependencies": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" + "mimic-fn": "^4.0.0" }, - "bin": { - "quote-stream": "bin/cmd.js" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/quote-stream/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "node_modules/execa/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" }, "engines": { - "node": ">= 0.8" + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" } }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "dependencies": { - "picomatch": "^2.2.1" + "pump": "^3.0.0" }, "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "node": ">=8" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "node_modules/falafel": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", + "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" + "acorn": "^7.1.1", + "isarray": "^2.0.1" }, "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" + "node": ">=0.4.0" } }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "node_modules/falafel/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=0.6" + "node": ">=0.4.0" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", "dev": true }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8.6.0" } }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "is-glob": "^4.0.1" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">= 6" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" + "node_modules/fastq": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", + "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, "dependencies": { - "ms": "2.0.0" + "pend": "~1.2.0" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", "dev": true, - "bin": { - "mime": "cli.js" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" }, "engines": { - "node": ">=4" + "node": "^12.20 || >= 14.13" } }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "node_modules/fflate": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.1.tgz", + "integrity": "sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ==" }, - "node_modules/send/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "dependencies": { - "ee-first": "1.1.1" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">= 0.8" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==" - }, - "node_modules/simple-html-tokenizer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz", - "integrity": "sha512-Mc/gH3RvlKvB/gkp9XwgDKEWrSYyefIJPGG8Jk1suZms/rISdUuVEMx5O1WBnTWaScvxXDvGJrZQWblUmQHjkQ==" - }, - "node_modules/socket.io": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", - "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.4.1", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { - "ws": "~8.11.0" + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/socket.io-adapter/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "dependencies": { + "is-callable": "^1.1.3" } }, - "node_modules/socket.io-parser": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", - "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", - "dev": true, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/source-map": { + "node_modules/forever-agent": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "through": "2" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": "*" + "node": ">= 6" } }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true, + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" + "fetch-blob": "^3.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=12.20.0" } }, - "node_modules/static-eval": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", - "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, "dependencies": { - "escodegen": "^1.11.1" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" } }, - "node_modules/static-module": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz", - "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==", - "dependencies": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/static-module/node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dependencies": { - "readable-stream": "^2.0.2" + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/static-module/node_modules/escodegen": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", - "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, "dependencies": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" }, "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "node": ">=0.6" } }, - "node_modules/static-module/node_modules/esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" + "node_modules/fstream/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/static-module/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "node_modules/fstream/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/static-module/node_modules/object-inspect": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz", - "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==" - }, - "node_modules/static-module/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/fstream/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.8.0" + "node": "*" } }, - "node_modules/static-module/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, - "node_modules/static-module/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/static-module/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, "dependencies": { - "prelude-ls": "~1.1.2" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", + "node_modules/geckodriver": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.3.2.tgz", + "integrity": "sha512-TNOoy+ULXJWI5XOq7CXD3PAD9TJa4NjMe7nKUXjlIsf+vezuaRsFgPwcgYdEem1K7106wabYsqr7Kqn51g0sJg==", "dev": true, + "hasInstallScript": true, "dependencies": { - "duplexer": "~0.1.1", - "through": "~2.3.4" + "@wdio/logger": "^8.28.0", + "decamelize": "^6.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "node-fetch": "^3.3.2", + "tar-fs": "^3.0.4", + "unzipper": "^0.10.14", + "which": "^4.0.0" + }, + "bin": { + "geckodriver": "bin/geckodriver.js" + }, + "engines": { + "node": "^16.13 || >=18 || >=20" } }, - "node_modules/streamroller": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", - "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "node_modules/geckodriver/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" + "debug": "^4.3.4" }, "engines": { - "node": ">=8.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" + "node": ">= 14" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/geckodriver/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=8" + "node": ">= 14" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/geckodriver/node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "agent-base": "^7.0.2", + "debug": "4" }, "engines": { - "node": ">=8" + "node": ">= 14" } }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/geckodriver/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=16" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" + "node_modules/geckodriver/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/svg-inline-loader": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.2.tgz", - "integrity": "sha512-kbrcEh5n5JkypaSC152eGfGcnT4lkR0eSfvefaUJkLqgGjRQJyKDvvEE/CCv5aTSdfXuc+N98w16iAojhShI3g==", - "dependencies": { - "loader-utils": "^1.1.0", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/svg-inline-loader/node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/through2/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "node_modules/get-port": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.0.0.tgz", + "integrity": "sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "dependencies": { - "rimraf": "^3.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "engines": { - "node": ">=8.17.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", "dev": true, "dependencies": { - "is-number": "^7.0.0" + "resolve-pkg-maps": "^1.0.0" }, - "engines": { - "node": ">=8.0" + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", "dev": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, "engines": { - "node": ">=0.6" + "node": ">= 14" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, + "node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, "engines": { - "node": ">=0.8" + "node": ">= 14" } }, - "node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dependencies": { - "punycode": "^2.1.0" + "assert-plus": "^1.0.0" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "node_modules/gl-matrix": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.1.0.tgz", + "integrity": "sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==" + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dependencies": { - "safe-buffer": "^5.0.1" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 0.6" + "node": ">=10.13.0" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" }, "engines": { - "node": ">=14.17" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ua-parser-js": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.34.tgz", - "integrity": "sha512-cJMeh/eOILyGu0ejgTKB95yKT3zOenSe9UGE3vj6WfiOwgGYnmATUsnDixMFvdU+rNMvWih83hrUP8VwhF9yXQ==", + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], "engines": { - "node": "*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, "engines": { - "node": ">= 4.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/glsl-editor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-editor/-/glsl-editor-1.0.0.tgz", + "integrity": "sha512-eku+MXM8P3lXU8yhGdChkKdqorNrGmG+21YT/veoxODbqPEleBXOwXV76L6T9dnXXjt9elY7z9ctxBAyTLtOqg==", "dependencies": { - "punycode": "^2.1.0" + "brfs": "^1.2.0", + "codemirror": "^4.5.0", + "element-size": "^1.1.1", + "events": "^1.0.2", + "inherits": "^2.0.1", + "insert-css": "^0.2.0", + "through2": "^0.6.1", + "xtend": "^4.0.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "node_modules/glsl-editor/node_modules/codemirror": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-4.13.0.tgz", + "integrity": "sha512-+KOX1KjxkdzFJibjxg4u7r5uuLXG6M9cmVbio7x5qAyXcyT0Y437DPMP3AEmD1bGxoi+xFx21B84W0MfIuTfxQ==" }, - "node_modules/utils-merge": { + "node_modules/gopd": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "engines": { - "node": ">= 0.4.0" + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "node_modules/got/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true }, - "node_modules/vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==" + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true }, - "node_modules/void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", - "dev": true, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", "dependencies": { - "browser-process-hrtime": "^1.0.0" + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "engines": { + "node": ">= 0.4.0" + } }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, "dependencies": { - "iconv-lite": "0.4.24" + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">= 8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "whatwg-encoding": "^1.0.5" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true }, - "node_modules/ws": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", - "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0" - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "node_modules/xmldom": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", - "deprecated": "Deprecated due to CVE-2021-21366 resolved in 0.5.0", + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, "engines": { - "node": ">=0.1" + "node": ">= 6" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, "engines": { - "node": ">=0.4" + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, "engines": { - "node": ">=10" + "node": ">=10.19.0" } }, - "node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - }, - "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=12" + "node": ">= 6" } }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "engines": { - "node": ">=12" - } - } - }, - "dependencies": { - "@biomejs/biome": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.4.1.tgz", - "integrity": "sha512-JccVAwPbhi37pdxbAGmaOBjUTKEwEjWAhl7rKkVVuXHo4MLASXJ5HR8BTgrImi4/7rTBsGz1tgVD1Kwv1CHGRg==", - "dev": true, - "requires": { - "@biomejs/cli-darwin-arm64": "1.4.1", - "@biomejs/cli-darwin-x64": "1.4.1", - "@biomejs/cli-linux-arm64": "1.4.1", - "@biomejs/cli-linux-x64": "1.4.1", - "@biomejs/cli-win32-arm64": "1.4.1", - "@biomejs/cli-win32-x64": "1.4.1" + "node": ">=16.17.0" } }, - "@biomejs/cli-darwin-arm64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.4.1.tgz", - "integrity": "sha512-PZWy2Idndqux38p6AXSDQM2ldRAWi32bvb7bMbTN0ALzpWYMYnxd71ornatumSSJYoNhKmxzDLq+jct7nZJ79w==", - "dev": true, - "optional": true + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } }, - "@biomejs/cli-darwin-x64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.4.1.tgz", - "integrity": "sha512-soj3BWhnsM1M2JlzR09cibUzG1owJqetwj/Oo7yg0foijo9lNH9XWXZfJBYDKgW/6Fomn+CC2EcUS+hisQzt9g==", + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true, - "optional": true + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "@biomejs/cli-linux-arm64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.4.1.tgz", - "integrity": "sha512-YIZqfJUg4F+fPsBTXxgD7EU2E5OAYbmYSl/snf4PevwfQCWE/omOFZv+NnIQmjYj9I7ParDgcJvanoA3/kO0JQ==", + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, - "optional": true + "engines": { + "node": ">= 4" + } }, - "@biomejs/cli-linux-x64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.4.1.tgz", - "integrity": "sha512-9YOZw3qBd/KUj63A6Hn2zZgzGb2nbESM0qNmeMXgmqinVKM//uc4OgY5TuKITuGjMSvcVxxd4dX1IzYjV9qvNQ==", - "dev": true, - "optional": true + "node_modules/ikonate": { + "version": "1.1.1", + "resolved": "git+ssh://git@github.com/mikolajdobrucki/ikonate.git#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "integrity": "sha512-npghn+yBsovOp2k50rtoqNxUG53BuysNA5m3BqF1qXwm397fiKKvtkzLgPMJJsd+nbXjrRHdsEyvHcLj20OOhg==", + "license": "MIT", + "dependencies": { + "jsdom": "11.10.0", + "pretty": "^2.0.0", + "xmldom": "^0.1.27" + } }, - "@biomejs/cli-win32-arm64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.4.1.tgz", - "integrity": "sha512-nWQbvkNKxYn/kCQ0yVF8kCaS3VzaGvtFSmItXiMknU4521LDjJ7tNWH12Gol+pIslrCbd4E1LhJa0a3ThRsBVg==", - "dev": true, - "optional": true - }, - "@biomejs/cli-win32-x64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.4.1.tgz", - "integrity": "sha512-88fR2CQxQ4YLs2BUDuywWYQpUKgU3A3sTezANFc/4LGKQFFLV2yX+F7QAdZVkMHfA+RD9Xg178HomM/6mnTNPA==", - "dev": true, - "optional": true - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true - }, - "@esbuild/aix-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", - "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", - "optional": true - }, - "@esbuild/android-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", - "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", - "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", - "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", - "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", - "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", - "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", - "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", - "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", - "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", - "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", - "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", - "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", - "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", - "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", - "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", - "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", - "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", - "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", - "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", - "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", - "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", - "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", - "optional": true - }, - "@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true - }, - "@types/codemirror": { - "version": "5.60.15", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.15.tgz", - "integrity": "sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==", - "requires": { - "@types/tern": "*" - } - }, - "@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" - }, - "@types/gl-matrix": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@types/gl-matrix/-/gl-matrix-2.4.5.tgz", - "integrity": "sha512-0L8Mq1+oaIW0oVzGUDbSW+HnTjCNb4CmoIQE5BkoHt/A7x20z0MJ1PnwfH3atty/vbWLGgvJwVu2Mz3SKFiEFw==" - }, - "@types/jasmine": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.1.tgz", - "integrity": "sha512-Vu8l+UGcshYmV1VWwULgnV/2RDbBaO6i2Ptx7nd//oJPIZGhoI1YLST4VKagD2Pq/Bc2/7zvtvhM7F3p4SN7kQ==", - "dev": true - }, - "@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" - }, - "@types/node": { - "version": "18.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.6.tgz", - "integrity": "sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==" - }, - "@types/pako": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.0.tgz", - "integrity": "sha512-10+iaz93qR5WYxTo+PMifD5TSxiOtdRaxBf7INGGXMQgTCu8Z/7GYWYFUOS3q/G0nE5boj1r4FEB+WSy7s5gbA==" - }, - "@types/tern": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", - "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", - "requires": { - "@types/estree": "*" - } - }, - "@types/webpack-env": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz", - "integrity": "sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg==" - }, - "a-sync-waterfall": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", - "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", - "dev": true - }, - "abab": { + "node_modules/ikonate/node_modules/abab": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==", + "deprecated": "Use your platform's native atob() and btoa() methods instead" }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "node_modules/ikonate/node_modules/acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - }, - "acorn-globals": { + "node_modules/ikonate/node_modules/acorn-globals": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "requires": { + "dependencies": { "acorn": "^6.0.1", "acorn-walk": "^6.0.1" + } + }, + "node_modules/ikonate/node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "bin": { + "acorn": "bin/acorn" }, - "dependencies": { - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" - } + "engines": { + "node": ">=0.4.0" } }, - "acorn-walk": { + "node_modules/ikonate/node_modules/acorn-walk": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "engines": { + "node": ">=0.4.0" } }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "node_modules/ikonate/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "node_modules/ikonate/node_modules/cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", + "dependencies": { + "cssom": "0.3.x" } }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==" + "node_modules/ikonate/node_modules/data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dependencies": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } }, - "asap": { + "node_modules/ikonate/node_modules/data-urls/node_modules/abab": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead" }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "requires": { - "safer-buffer": "~2.1.0" + "node_modules/ikonate/node_modules/data-urls/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" - }, - "async-limiter": { + "node_modules/ikonate/node_modules/domexception": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" - }, - "aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, - "basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "requires": { - "tweetnacl": "^0.14.3" + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "deprecated": "Use your platform's native DOMException instead", + "dependencies": { + "webidl-conversions": "^4.0.2" } }, - "benchmark": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", - "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==", - "dev": true, - "requires": { - "lodash": "^4.17.4", - "platform": "^1.3.3" + "node_modules/ikonate/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - } + "node_modules/ikonate/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/ikonate/node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dependencies": { + "whatwg-encoding": "^1.0.1" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" + "node_modules/ikonate/node_modules/jsdom": { + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.10.0.tgz", + "integrity": "sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==", + "dependencies": { + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwmatcher": "^1.4.3", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.0", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" } }, - "brfs": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", - "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", - "requires": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - }, + "node_modules/ikonate/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + "node_modules/ikonate/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } }, - "buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==" + "node_modules/ikonate/node_modules/parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" }, - "buffer-from": { + "node_modules/ikonate/node_modules/prelude-ls": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" } }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "node_modules/ikonate/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "node_modules/ikonate/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" } }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "node_modules/ikonate/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dependencies": { + "punycode": "^2.1.0" } }, - "codemirror": { - "version": "5.65.12", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.12.tgz", - "integrity": "sha512-z2jlHBocElRnPYysN2HAuhXbO3DNB0bcSKmNz3hcWR2Js2Dkhc1bEOxG93Z3DeUrnm+qx56XOY5wQmbP5KY0sw==" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" + "node_modules/ikonate/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true + "node_modules/ikonate/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" + "node_modules/ikonate/node_modules/whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "node_modules/ikonate/node_modules/ws": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" } }, - "condense-newlines": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", - "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==", - "requires": { - "extend-shallow": "^2.0.1", - "is-whitespace": "^0.3.0", - "kind-of": "^3.0.2" - }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "requires": { - "is-buffer": "^1.1.5" - } - } + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "node_modules/import-meta-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", + "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" } }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "node_modules/insert-css": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-0.2.0.tgz", + "integrity": "sha512-tXSEsS2BJfEdtBuKzqfbbOijbWQC+y0i5pGd4OXNBauhWZ5lLNs7nb03tyONVuvwu6RXyQqWwqoRJV3jKR7+ag==" }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "node_modules/internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - } + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" } }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + "node_modules/ip-address/node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true }, - "cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", - "requires": { - "cssom": "0.3.x" + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "requires": { - "assert-plus": "^1.0.0" + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "dependencies": { - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, - "requires": { - "ms": "2.1.2" + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "requires": { - "webidl-conversions": "^4.0.2" + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" } }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" } }, - "editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", - "requires": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" - }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "element-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", - "integrity": "sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "engine.io": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz", - "integrity": "sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==", - "dev": true, - "requires": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0" - }, - "dependencies": { - "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "requires": {} - } + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" } }, - "engine.io-parser": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", - "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", - "dev": true + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "esbuild": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", - "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", - "requires": { - "@esbuild/aix-ppc64": "0.19.11", - "@esbuild/android-arm": "0.19.11", - "@esbuild/android-arm64": "0.19.11", - "@esbuild/android-x64": "0.19.11", - "@esbuild/darwin-arm64": "0.19.11", - "@esbuild/darwin-x64": "0.19.11", - "@esbuild/freebsd-arm64": "0.19.11", - "@esbuild/freebsd-x64": "0.19.11", - "@esbuild/linux-arm": "0.19.11", - "@esbuild/linux-arm64": "0.19.11", - "@esbuild/linux-ia32": "0.19.11", - "@esbuild/linux-loong64": "0.19.11", - "@esbuild/linux-mips64el": "0.19.11", - "@esbuild/linux-ppc64": "0.19.11", - "@esbuild/linux-riscv64": "0.19.11", - "@esbuild/linux-s390x": "0.19.11", - "@esbuild/linux-x64": "0.19.11", - "@esbuild/netbsd-x64": "0.19.11", - "@esbuild/openbsd-x64": "0.19.11", - "@esbuild/sunos-x64": "0.19.11", - "@esbuild/win32-arm64": "0.19.11", - "@esbuild/win32-ia32": "0.19.11", - "@esbuild/win32-x64": "0.19.11" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "optional": true, + "peer": true }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, "dependencies": { - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "requires": { - "prelude-ls": "~1.1.2" - } - } + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "event-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", - "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==" + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, - "extsprintf": { + "node_modules/is-unicode-supported": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" - }, - "falafel": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", - "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", - "requires": { - "acorn": "^7.1.1", - "isarray": "^2.0.1" + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - } + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "node_modules/is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==", + "engines": { + "node": ">=0.10.0" + } }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "fflate": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.1.tgz", - "integrity": "sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ==" + "node_modules/js-beautify": { + "version": "1.14.11", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.11.tgz", + "integrity": "sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.3", + "glob": "^10.3.3", + "nopt": "^7.2.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "requires": { - "to-regex-range": "^5.0.1" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/jsdom": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-17.0.0.tgz", + "integrity": "sha512-MUq4XdqwtNurZDVeKScENMPHnkgmdIvMzZ1r1NSwHkDuaqI6BouPjr+17COo4/19oLNnmdpFDPOHVpgIZmZ+VA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.4.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.0", + "decimal.js": "^10.3.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^9.0.0", + "ws": "^8.0.0", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true } } }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", "dev": true }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "engines": { + "node": ">= 10.0.0" + } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "dependencies": { + "json-buffer": "3.0.1" } }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "requires": { - "assert-plus": "^1.0.0" + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "gl-matrix": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.1.0.tgz", - "integrity": "sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==" - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/ky": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", + "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" } }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "dev": true, - "requires": { - "is-glob": "^4.0.1" + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" } }, - "glsl-editor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glsl-editor/-/glsl-editor-1.0.0.tgz", - "integrity": "sha512-eku+MXM8P3lXU8yhGdChkKdqorNrGmG+21YT/veoxODbqPEleBXOwXV76L6T9dnXXjt9elY7z9ctxBAyTLtOqg==", - "requires": { - "brfs": "^1.2.0", - "codemirror": "^4.5.0", - "element-size": "^1.1.1", - "events": "^1.0.2", - "inherits": "^2.0.1", - "insert-css": "^0.2.0", - "through2": "^0.6.1", - "xtend": "^4.0.0" - }, + "node_modules/left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "deprecated": "use String.prototype.padStart()" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, "dependencies": { - "codemirror": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-4.13.0.tgz", - "integrity": "sha512-+KOX1KjxkdzFJibjxg4u7r5uuLXG6M9cmVbio7x5qAyXcyT0Y437DPMP3AEmD1bGxoi+xFx21B84W0MfIuTfxQ==" - } + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "node_modules/lightningcss": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.23.0.tgz", + "integrity": "sha512-SEArWKMHhqn/0QzOtclIwH5pXIYQOUEkF8DgICd/105O+GCgd7jxjNod/QPnBCSWvpRHQBGVz5fQ9uScby03zA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.23.0", + "lightningcss-darwin-x64": "1.23.0", + "lightningcss-freebsd-x64": "1.23.0", + "lightningcss-linux-arm-gnueabihf": "1.23.0", + "lightningcss-linux-arm64-gnu": "1.23.0", + "lightningcss-linux-arm64-musl": "1.23.0", + "lightningcss-linux-x64-gnu": "1.23.0", + "lightningcss-linux-x64-musl": "1.23.0", + "lightningcss-win32-x64-msvc": "1.23.0" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.23.0.tgz", + "integrity": "sha512-kl4Pk3Q2lnE6AJ7Qaij47KNEfY2/UXRZBT/zqGA24B8qwkgllr/j7rclKOf1axcslNXvvUdztjo4Xqh39Yq1aA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" + "node_modules/lightningcss-darwin-x64": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.23.0.tgz", + "integrity": "sha512-KeRFCNoYfDdcolcFXvokVw+PXCapd2yHS1Diko1z1BhRz/nQuD5XyZmxjWdhmhN/zj5sH8YvWsp0/lPLVzqKpg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "requires": { - "whatwg-encoding": "^1.0.1" + "node_modules/lightningcss-freebsd-x64": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.23.0.tgz", + "integrity": "sha512-xhnhf0bWPuZxcqknvMDRFFo2TInrmQRWZGB0f6YoAsZX8Y+epfjHeeOIGCfAmgF0DgZxHwYc8mIR5tQU9/+ROA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "dependencies": { - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.23.0.tgz", + "integrity": "sha512-fBamf/bULvmWft9uuX+bZske236pUZEoUlaHNBjnueaCTJ/xd8eXgb0cEc7S5o0Nn6kxlauMBnqJpF70Bgq3zg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.23.0.tgz", + "integrity": "sha512-RS7sY77yVLOmZD6xW2uEHByYHhQi5JYWmgVumYY85BfNoVI3DupXSlzbw+b45A9NnVKq45+oXkiN6ouMMtTwfg==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.23.0.tgz", + "integrity": "sha512-cU00LGb6GUXCwof6ACgSMKo3q7XYbsyTj0WsKHLi1nw7pV0NCq8nFTn6ZRBYLoKiV8t+jWl0Hv8KkgymmK5L5g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.23.0.tgz", + "integrity": "sha512-q4jdx5+5NfB0/qMbXbOmuC6oo7caPnFghJbIAV90cXZqgV8Am3miZhC4p+sQVdacqxfd+3nrle4C8icR3p1AYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "ikonate": { - "version": "git+ssh://git@github.com/mikolajdobrucki/ikonate.git#a86b4107c6ec717e7877f880a930d1ccf0b59d89", - "integrity": "sha512-npghn+yBsovOp2k50rtoqNxUG53BuysNA5m3BqF1qXwm397fiKKvtkzLgPMJJsd+nbXjrRHdsEyvHcLj20OOhg==", - "from": "ikonate@mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", - "requires": { - "jsdom": "11.10.0", - "pretty": "^2.0.0", - "xmldom": "^0.1.27" + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.23.0.tgz", + "integrity": "sha512-G9Ri3qpmF4qef2CV/80dADHKXRAQeQXpQTLx7AiQrBYQHqBjB75oxqj06FCIe5g4hNCqLPnM9fsO4CyiT1sFSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.23.0.tgz", + "integrity": "sha512-1rcBDJLU+obPPJM6qR5fgBUiCdZwZLafZM5f9kwjFLkb/UBNIzmae39uCSmh71nzPCTXZqHbvwu23OWnWEz+eg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", + "dev": true }, - "insert-css": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-0.2.0.tgz", - "integrity": "sha512-tXSEsS2BJfEdtBuKzqfbbOijbWQC+y0i5pGd4OXNBauhWZ5lLNs7nb03tyONVuvwu6RXyQqWwqoRJV3jKR7+ag==" + "node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dev": true, + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/locate-app": { + "version": "2.2.18", + "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.2.18.tgz", + "integrity": "sha512-F1W7AospcYxSSBh8b2Km34/0t9tpLolXxzIbjnsyWdv5YgM2S/xWs0FRubqOXcTptsgrPCMKMszb9o1v1YBYVQ==", "dev": true, - "requires": { - "binary-extensions": "^2.0.0" + "dependencies": { + "n12": "1.8.21", + "type-fest": "2.13.0", + "userhome": "1.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "node_modules/locate-app/node_modules/type-fest": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.13.0.tgz", + "integrity": "sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "requires": { - "has": "^1.0.3" + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", "dev": true }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "is-whitespace": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", - "integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==" + "node_modules/lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", + "dev": true }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", "dev": true, - "requires": { - "is-docker": "^2.0.0" + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "jasmine-core": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz", - "integrity": "sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw==", - "dev": true - }, - "js-beautify": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.7.tgz", - "integrity": "sha512-5SOX1KXPFKx+5f6ZrPsIPEY7NwKeQz47n3jm2i+XeHx9MoRsfQenlOP13FQhWvg8JRS0+XLO6XYUQ2GX+q+T9A==", - "requires": { - "config-chain": "^1.1.13", - "editorconfig": "^0.15.3", - "glob": "^8.0.3", - "nopt": "^6.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "requires": { - "brace-expansion": "^2.0.1" - } - } + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "jsdom": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.10.0.tgz", - "integrity": "sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==", - "requires": { - "abab": "^1.0.4", - "acorn": "^5.3.0", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": ">= 0.2.37 < 0.3.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.0", - "escodegen": "^1.9.0", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.2.0", - "nwmatcher": "^1.4.3", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.83.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.3", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.0", - "ws": "^4.0.0", - "xml-name-validator": "^3.0.0" + "node_modules/loglevel": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", + "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" - } + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" } }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "node_modules/loglevel-plugin-prefix": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", + "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", + "dev": true }, - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "requires": { - "minimist": "^1.2.0" + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" } }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true, - "requires": { - "graceful-fs": "^4.1.6" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "engines": { + "node": "14 || >=16.14" } }, - "karma": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz", - "integrity": "sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA==", + "node_modules/magic-string": { + "version": "0.30.6", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.6.tgz", + "integrity": "sha512-n62qCLbPjNjyo+owKtveQxZFZTBm+Ms6YoGD23Wew6Vw337PElFNifQpknPruVRQV57kVShPnLGo9vWxVhpPvA==", "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.4.1", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "dependencies": { - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" } }, - "karma-benchmark": { + "node_modules/merge-source-map": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/karma-benchmark/-/karma-benchmark-1.0.4.tgz", - "integrity": "sha512-e9YmWrX3xk7BSosBaL/7lg0ZKSOpwQySKlLb1xa2m5VbwMVFffS29QB9f2UCT7+aMCnJlNRWjcKym4Ch/60OsA==", - "dev": true, - "requires": { - "lodash": "4.17.15", - "platform": "1.3.5" - }, + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==", "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "platform": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", - "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==", - "dev": true - } + "source-map": "^0.5.6" } }, - "karma-benchmark-reporter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/karma-benchmark-reporter/-/karma-benchmark-reporter-0.1.1.tgz", - "integrity": "sha512-aMPKPqXgTLVKDfLUBRyo0j/aLaLGCHMHrKhSf0ku+/j7LJJ/fEthrGmTyDbPU7mP3+8QDfgcxmCA5Q/Zu+E9VA==", + "node_modules/merge-source-map/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "requires": {} + "engines": { + "node": ">= 8" + } }, - "karma-chrome-launcher": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", - "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, - "requires": { - "which": "^1.2.1" - }, "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "karma-esbuild": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/karma-esbuild/-/karma-esbuild-2.3.0.tgz", - "integrity": "sha512-iW3DjSGohEEkufSDmXRPZP7CNP0ye+Xt8fBCcenLqPL2u8+VHZYwlzwYyfs60vjhdf1i04xekhzI7gu8as1CLg==", - "dev": true, - "requires": { - "chokidar": "^3.5.1", - "source-map": "0.6.1" + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" } }, - "karma-firefox-launcher": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.2.tgz", - "integrity": "sha512-VV9xDQU1QIboTrjtGVD4NCfzIH7n01ZXqy/qpBhnOeGVOkG5JYPEm8kuSd7psHE6WouZaQ9Ool92g8LFweSNMA==", - "dev": true, - "requires": { - "is-wsl": "^2.2.0", - "which": "^2.0.1" + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "karma-jasmine": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", - "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "requires": { - "jasmine-core": "^4.1.0" + "engines": { + "node": ">=6" } }, - "karma-mocha-reporter": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz", - "integrity": "sha512-Hr6nhkIp0GIJJrvzY8JFeHpQZNseuIakGac4bpw8K1+5F0tLb6l7uvXRa8mt2Z+NVwYgCct4QAfp2R2QP6o00w==", + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true, - "requires": { - "chalk": "^2.1.0", - "log-symbols": "^2.1.0", - "strip-ansi": "^4.0.0" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "karma-sourcemap-loader": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.4.0.tgz", - "integrity": "sha512-xCRL3/pmhAYF3I6qOrcn0uhbQevitc2DERMPH82FMnG+4WReoGcGFZb1pURf2a5apyrOHRdvD+O6K7NljqKHyA==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.10" + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" - }, - "loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + "node_modules/mitt": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", + "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", + "dev": true }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, - "requires": { - "chalk": "^2.0.1" - }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "log4js": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.8.0.tgz", - "integrity": "sha512-g+V8gZyurIexrOvWQ+AcZsIvuK/lBnx2argejZxL4gVZ4Hq02kUYH6WZOnqxgBml+zzQZYdaEoTN84B6Hzm8Fg==", + "node_modules/mlly": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.5.0.tgz", + "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", "dev": true, - "requires": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.5" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.3.2" } }, - "magic-string": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", - "requires": { - "vlq": "^0.2.2" + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "engines": { + "node": ">=10" } }, - "map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", - "dev": true + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "node_modules/n12": { + "version": "1.8.21", + "resolved": "https://registry.npmjs.org/n12/-/n12-1.8.21.tgz", + "integrity": "sha512-4NVVx4jW9QhmGyI80v9tpK6S0ZP3pO8Z2X0YKE6whBLDz5MjOWmpQDVS5eh5dfXTn9t1sSFaw1HM8NB4KN6wwQ==", "dev": true }, - "merge-source-map": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", - "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==", - "requires": { - "source-map": "^0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true, - "requires": { - "brace-expansion": "^1.1.7" + "engines": { + "node": ">= 0.4.0" } }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" + "node_modules/nifti-reader-js": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/nifti-reader-js/-/nifti-reader-js-0.6.8.tgz", + "integrity": "sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==", + "dependencies": { + "fflate": "*" } }, - "morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "dev": true, - "requires": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + { + "type": "github", + "url": "https://paypal.me/jimmywarting" } + ], + "engines": { + "node": ">=10.5.0" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "nifti-reader-js": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/nifti-reader-js/-/nifti-reader-js-0.5.4.tgz", - "integrity": "sha512-KnZMEw9Wd39x1eTTZQaF5Zjh7LbUeWcxfEj0v5VS/yTkV2y/YHrAnC6VJyf2FjrmsUOElDVjIoHGLMCkcnpiNg==", - "requires": { - "pako": "*" + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, - "nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "requires": { - "abbrev": "^1.0.0" + "node_modules/nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "normalize-path": { + "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } }, - "numcodecs": { + "node_modules/numcodecs": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/numcodecs/-/numcodecs-0.3.1.tgz", "integrity": "sha512-ywIyGpJ+c6Ojktq9a8jsWSy12ZSUcW/W+I3jlH0q0zv9aR/ZiMsN7IrWaNq9YV2FRdLu6r/M6lp35jMA6fug/A==", - "requires": { + "dependencies": { "fflate": "^0.8.0" } }, - "nunjucks": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.3.tgz", - "integrity": "sha512-psb6xjLj47+fE76JdZwskvwG4MYsQKXUtMsPh6U0YMvmyjRtKRFcxnlXGWglNybtNTNVmGdp94K62/+NjF5FDQ==", - "dev": true, - "requires": { - "a-sync-waterfall": "^1.0.0", - "asap": "^2.0.3", - "commander": "^5.1.0" - } - }, - "nwmatcher": { + "node_modules/nwmatcher": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==" }, - "oauth-sign": { + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, - "requires": { - "ee-first": "1.1.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" } }, - "pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "path-is-absolute": { + "node_modules/object.groupby": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", "dev": true, - "requires": { - "through": "~2.3" + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" } }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", - "dev": true - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, - "prettier": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", - "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", - "dev": true - }, - "pretty": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", - "integrity": "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==", - "requires": { - "condense-newlines": "^0.2.1", - "extend-shallow": "^2.0.1", - "js-beautify": "^1.6.12" - }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" - } + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "requires": { - "side-channel": "^1.0.4" + "dependencies": { + "wrappy": "1" } }, - "quote-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", - "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==", - "requires": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "node_modules/ora": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.1.tgz", + "integrity": "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==", + "dev": true, + "dependencies": { + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "requires": { - "picomatch": "^2.2.1" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "node_modules/ora/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, - "dependencies": { - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" - } + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "requires": { - "lodash": "^4.17.19" + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "engines": { + "node": ">=12.20" } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "requires": { - "glob": "^7.1.3" + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "dev": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" } }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } }, - "shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" } }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==" + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" }, - "simple-html-tokenizer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz", - "integrity": "sha512-Mc/gH3RvlKvB/gkp9XwgDKEWrSYyefIJPGG8Jk1suZms/rISdUuVEMx5O1WBnTWaScvxXDvGJrZQWblUmQHjkQ==" - }, - "socket.io": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", - "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.4.1", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" - } - }, - "socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", - "dev": true, - "requires": { - "ws": "~8.11.0" - }, - "dependencies": { - "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "requires": {} - } + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "socket.io-parser": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", - "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true, - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - } + "optional": true, + "peer": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "split": { + "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, - "requires": { - "through": "2" + "engines": { + "node": ">=0.10.0" } }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" } }, - "static-eval": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", - "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", - "requires": { - "escodegen": "^1.11.1" - } + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "static-module": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz", - "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==", - "requires": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" - }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dependencies": { - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "requires": { - "readable-stream": "^2.0.2" - } - }, - "escodegen": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", - "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==" - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "object-inspect": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz", - "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==" - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "requires": { - "prelude-ls": "~1.1.2" - } - } + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true }, - "stealthy-require": { + "node_modules/pathval": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==" + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz", + "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", + "integrity": "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==", + "dependencies": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer-core": { + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", + "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", + "dev": true, + "dependencies": { + "@puppeteer/browsers": "1.4.6", + "chromium-bidi": "0.4.16", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1147663", + "ws": "8.13.0" + }, + "engines": { + "node": ">=16.3.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/puppeteer-core/node_modules/devtools-protocol": { + "version": "0.0.1147663", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", + "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", + "dev": true + }, + "node_modules/puppeteer-core/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/query-selector-shadow-dom": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz", + "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", + "dev": true + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/quote-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", + "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==", + "dependencies": { + "buffer-equal": "0.0.1", + "minimist": "^1.1.3", + "through2": "^2.0.0" + }, + "bin": { + "quote-stream": "bin/cmd.js" + } + }, + "node_modules/quote-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/resq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/resq/-/resq-1.11.0.tgz", + "integrity": "sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^2.0.1" + } + }, + "node_modules/resq/node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", + "dev": true + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rgb2hex": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz", + "integrity": "sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/rollup": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", + "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.9.6", + "@rollup/rollup-android-arm64": "4.9.6", + "@rollup/rollup-darwin-arm64": "4.9.6", + "@rollup/rollup-darwin-x64": "4.9.6", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", + "@rollup/rollup-linux-arm64-gnu": "4.9.6", + "@rollup/rollup-linux-arm64-musl": "4.9.6", + "@rollup/rollup-linux-riscv64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-musl": "4.9.6", + "@rollup/rollup-win32-arm64-msvc": "4.9.6", + "@rollup/rollup-win32-ia32-msvc": "4.9.6", + "@rollup/rollup-win32-x64-msvc": "4.9.6", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safaridriver": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/safaridriver/-/safaridriver-0.1.2.tgz", + "integrity": "sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==", + "dev": true + }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", + "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-error": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-11.0.3.tgz", + "integrity": "sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==", + "dev": true, + "dependencies": { + "type-fest": "^2.12.2" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.3.tgz", + "integrity": "sha512-vfuYK48HXCTFD03G/1/zkIls3Ebr2YNa4qU9gHDZdblHLiqhJrJGkY3+0Nx0JpN9qBhJbVObc1CNciT1bIZJxw==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/static-eval": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", + "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", + "dependencies": { + "escodegen": "^2.1.0" + } + }, + "node_modules/static-module": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz", + "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==", + "dependencies": { + "concat-stream": "~1.6.0", + "convert-source-map": "^1.5.1", + "duplexer2": "~0.1.4", + "escodegen": "~1.9.0", + "falafel": "^2.1.0", + "has": "^1.0.1", + "magic-string": "^0.22.4", + "merge-source-map": "1.0.4", + "object-inspect": "~1.4.0", + "quote-stream": "~1.0.2", + "readable-stream": "~2.3.3", + "shallow-copy": "~0.0.1", + "static-eval": "^2.0.0", + "through2": "~2.0.3" + } + }, + "node_modules/static-module/node_modules/escodegen": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", + "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", + "dependencies": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-module/node_modules/esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/static-module/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/static-module/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-module/node_modules/magic-string": { + "version": "0.22.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", + "dependencies": { + "vlq": "^0.2.2" + } + }, + "node_modules/static-module/node_modules/object-inspect": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz", + "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==" + }, + "node_modules/static-module/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-module/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-module/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/static-module/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "dev": true + }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/streamx": { + "version": "2.15.6", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.6.tgz", + "integrity": "sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", + "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", + "dev": true, + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/terminal-link": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-3.0.0.tgz", + "integrity": "sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^5.0.0", + "supports-hyperlinks": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "dev": true + }, + "node_modules/tinybench": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", + "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.2.tgz", + "integrity": "sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.0.tgz", + "integrity": "sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/tsx": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", + "integrity": "sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==", + "dev": true, + "dependencies": { + "esbuild": "~0.19.10", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz", + "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==", + "dev": true + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/userhome": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/userhome/-/userhome-1.0.0.tgz", + "integrity": "sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/vite": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.3.tgz", + "integrity": "sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.2.2.tgz", + "integrity": "sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-plugin-checker": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.6.3.tgz", + "integrity": "sha512-qey+tmrCIyw0DQZ2j4uxkgHkp919GySMkxRZbyA/xEvRPQzxTvuKqK8QUOJ/DBx6uq0YYssqP4aFt1HbWtx7aQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "ansi-escapes": "^4.3.0", + "chalk": "^4.1.1", + "chokidar": "^3.5.1", + "commander": "^8.0.0", + "fast-glob": "^3.2.7", + "fs-extra": "^11.1.0", + "lodash-es": "^4.17.21", + "npm-run-path": "^4.0.1", + "semver": "^7.5.0", + "strip-ansi": "^6.0.0", + "tiny-invariant": "^1.1.0", + "vscode-languageclient": "^7.0.0", + "vscode-languageserver": "^7.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-uri": "^3.0.2" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "eslint": ">=7", + "meow": "^9.0.0", + "optionator": "^0.9.1", + "stylelint": ">=13", + "typescript": "*", + "vite": ">=2.0.0", + "vls": "*", + "vti": "*", + "vue-tsc": ">=1.3.9" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "meow": { + "optional": true + }, + "optionator": { + "optional": true + }, + "stylelint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vls": { + "optional": true + }, + "vti": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker/node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/vite-plugin-checker/node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vite-plugin-checker/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-checker/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vite-plugin-checker/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/vite-plugin-checker/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/vite-plugin-checker/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/vite-plugin-checker/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/vite-plugin-checker/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/vite-plugin-checker/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vite-plugin-checker/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "duplexer": "~0.1.1", - "through": "~2.3.4" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "streamroller": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", - "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" } }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" } }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - } + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "svg-inline-loader": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.2.tgz", - "integrity": "sha512-kbrcEh5n5JkypaSC152eGfGcnT4lkR0eSfvefaUJkLqgGjRQJyKDvvEE/CCv5aTSdfXuc+N98w16iAojhShI3g==", - "requires": { - "loader-utils": "^1.1.0", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - } + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "node_modules/vite/node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/vitest": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.2.2.tgz", + "integrity": "sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==", + "dev": true, + "dependencies": { + "@vitest/expect": "1.2.2", + "@vitest/runner": "1.2.2", + "@vitest/snapshot": "1.2.2", + "@vitest/spy": "1.2.2", + "@vitest/utils": "1.2.2", + "acorn-walk": "^8.3.2", + "cac": "^6.7.14", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^1.3.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.2", + "vite": "^5.0.0", + "vite-node": "1.2.2", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "^1.0.0", + "@vitest/ui": "^1.0.0", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + "jsdom": { + "optional": true } } }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "node_modules/vitest/node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, - "requires": { - "rimraf": "^3.0.0" + "engines": { + "node": ">=0.4.0" } }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/vlq": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==" + }, + "node_modules/vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", "dev": true, - "requires": { - "is-number": "^7.0.0" + "engines": { + "node": ">=8.0.0 || >=10.0.0" } }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "node_modules/vscode-languageclient": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", + "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" + }, + "engines": { + "vscode": "^1.52.0" } }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "requires": { - "punycode": "^2.1.0" + "node_modules/vscode-languageclient/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "requires": { - "safe-buffer": "^5.0.1" + "node_modules/vscode-languageclient/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/vscode-languageserver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", + "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "dependencies": { + "vscode-languageserver-protocol": "3.16.0" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==" + "node_modules/vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dev": true, + "dependencies": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } }, - "ua-parser-js": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.34.tgz", - "integrity": "sha512-cJMeh/eOILyGu0ejgTKB95yKT3zOenSe9UGE3vj6WfiOwgGYnmATUsnDixMFvdU+rNMvWih83hrUP8VwhF9yXQ==", + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==", "dev": true }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", "dev": true }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", "dev": true }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { + "node_modules/w3c-hr-time": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - } + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" } }, - "vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==" + "node_modules/wait-port": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-1.1.0.tgz", + "integrity": "sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "commander": "^9.3.0", + "debug": "^4.3.4" + }, + "bin": { + "wait-port": "bin/wait-port.js" + }, + "engines": { + "node": ">=10" + } }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", - "dev": true + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "requires": { - "browser-process-hrtime": "^1.0.0" + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "engines": { + "node": ">= 8" } }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "node_modules/webdriver": { + "version": "8.32.2", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.32.2.tgz", + "integrity": "sha512-uyCT2QzCqoz+EsMLTApG5/+RvHJR9MVbdEnjMoxpJDt+IeZCG2Vy/Gq9oNgNQfpxrvZme/EY+PtBsltZi7BAyg==", + "dev": true, + "dependencies": { + "@types/node": "^20.1.0", + "@types/ws": "^8.5.3", + "@wdio/config": "8.32.2", + "@wdio/logger": "8.28.0", + "@wdio/protocols": "8.32.0", + "@wdio/types": "8.32.2", + "@wdio/utils": "8.32.2", + "deepmerge-ts": "^5.1.0", + "got": "^12.6.1", + "ky": "^0.33.0", + "ws": "^8.8.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/webdriverio": { + "version": "8.32.2", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.32.2.tgz", + "integrity": "sha512-Z0Wc/dHFfWGWJZpaQ8u910/LG0E9EIVTO7J5yjqWx2XtXz2LzQMxYwNRnvNLhY/1tI4y/cZxI6kFMWr8wD2TtA==", + "dev": true, + "dependencies": { + "@types/node": "^20.1.0", + "@wdio/config": "8.32.2", + "@wdio/logger": "8.28.0", + "@wdio/protocols": "8.32.0", + "@wdio/repl": "8.24.12", + "@wdio/types": "8.32.2", + "@wdio/utils": "8.32.2", + "archiver": "^6.0.0", + "aria-query": "^5.0.0", + "css-shorthand-properties": "^1.1.1", + "css-value": "^0.0.1", + "devtools-protocol": "^0.0.1261483", + "grapheme-splitter": "^1.0.2", + "import-meta-resolve": "^4.0.0", + "is-plain-obj": "^4.1.0", + "lodash.clonedeep": "^4.5.0", + "lodash.zip": "^4.2.0", + "minimatch": "^9.0.0", + "puppeteer-core": "^20.9.0", + "query-selector-shadow-dom": "^1.0.0", + "resq": "^1.9.1", + "rgb2hex": "0.2.5", + "serialize-error": "^11.0.1", + "webdriver": "8.32.2" + }, + "engines": { + "node": "^16.13 || >=18" + }, + "peerDependencies": { + "devtools": "^8.14.0" + }, + "peerDependenciesMeta": { + "devtools": { + "optional": true + } + } }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" + "optional": true, + "peer": true, + "engines": { + "node": ">=10.4" } }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "whatwg-encoding": { + "node_modules/whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "requires": { + "dependencies": { "iconv-lite": "0.4.24" } }, - "whatwg-mimetype": { + "node_modules/whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" }, - "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "node_modules/whatwg-url": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-9.1.0.tgz", + "integrity": "sha512-CQ0UcrPHyomtlOCot1TL77WyMIm/bCwrJ2D6AOKGwEczU9EpyoqAokfqrf/MioU9kHcMsmJZcg1egXix2KYEsA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=12" } }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dev": true, + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, - "wrap-ansi": { + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, - "ws": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", - "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0" + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "xml-name-validator": { + "node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" }, - "xmldom": { + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/xmldom": { "version": "0.1.31", "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", + "deprecated": "Deprecated due to CVE-2021-21366 resolved in 0.5.0", + "engines": { + "node": ">=0.1" + } }, - "xtend": { + "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } }, - "y18n": { + "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "requires": { + "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", @@ -7641,13 +11330,89 @@ "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zip-stream": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.1.tgz", + "integrity": "sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==", + "dev": true, + "dependencies": { + "archiver-utils": "^4.0.1", + "compress-commons": "^5.0.1", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/zip-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } } } } diff --git a/package.json b/package.json index c99d7fd403..61b2619d1c 100644 --- a/package.json +++ b/package.json @@ -2,84 +2,395 @@ "name": "neuroglancer", "description": "Visualization tool for 3-D volumetric data.", "license": "Apache-2.0", - "version": "0.0.0-beta.0", - "main": "dist/module/main_module.js", + "version": "2.39.0", "repository": { "type": "git", "url": "git+https://github.com/google/neuroglancer.git" }, "engines": { - "node": ">=12" + "node": ">=16" }, + "browserslist": [ + "last 2 Chrome versions", + "last 2 Firefox versions", + "last 2 Safari versions" + ], "scripts": { - "generate-code": "node ./config/generate_code.js", - "build-min": "node ./config/esbuild-cli.js --config=min", - "build": "node ./config/esbuild-cli.js --config=min", - "build:watch": "node ./config/esbuild-cli.js --config=dev --serve --watch", - "dev-server": "node ./config/esbuild-cli.js --config=dev --serve --watch", - "dev-server-python": "node ./config/esbuild-cli.js --config=python-dev --serve --watch", - "build-module": "node ./config/esbuild-cli.js --config=module", - "build-python": "node ./config/esbuild-cli.js --config=python-min", - "build-python-min": "node ./config/esbuild-cli.js --config=python-min", - "build-python-dev": "node ./config/esbuild-cli.js --config=python-dev", - "test": "karma start ./config/karma.conf.js --single-run", - "test:watch": "karma start ./config/karma.conf.js --no-single-run", - "benchmark": "karma start ./config/karma.benchmark.js --single-run", - "benchmark:watch": "karma start ./config/karma.benchmark.js --no-single-run", + "generate-code": "tsx ./config/generate_code.ts", + "update-conditions": "tsx ./build_tools/update-conditions.ts", + "prepare": "tsx ./build_tools/build-package.ts --inplace --if-not-toplevel", + "prepack": "tsx ./build_tools/build-package.ts --inplace", + "postpack": "tsx ./build_tools/postpack.ts", + "build-min": "tsx ./build_tools/cli.ts build", + "build": "tsx ./build_tools/cli.ts build", + "build:watch": "tsx ./build_tools/cli.ts build --watch", + "dev-server": "tsx ./build_tools/cli.ts serve", + "dev-server-python": "tsx ./build_tools/cli.ts --python serve", + "build-package": "tsx ./build_tools/build-package.ts", + "build-python": "tsx ./build_tools/cli.ts --python build", + "build-python:watch": "tsx ./build_tools/cli.ts --python build --watch", + "build-python-min": "tsx ./build_tools/cli.ts --python build", + "build-python-dev": "tsx ./build_tools/cli.ts --python --mode=development build", + "test": "vitest --run", + "test:watch": "vitest watch", + "benchmark": "vitest bench --run", + "benchmark:watch": "vitest bench", "prepublishOnly": "npm run test && npm run build-module", - "lint:check": "biome lint .", - "lint:fix": "biome lint . --apply", + "lint:check": "eslint .", + "lint:fix": "eslint . --fix", "format:check": "prettier --cache . -c", - "format:fix": "prettier --cache . -w", + "format:fix": "prettier --cache -w -l .", "typecheck": "tsc --noEmit" }, "devDependencies": { - "@biomejs/biome": "1.4.1", - "@types/jasmine": "^4.3.1", - "benchmark": "^2.1.4", - "chokidar": "^3.5.1", - "colors": "^1.4.0", - "connect": "^3.7.0", - "event-stream": "^4.0.1", - "faye-websocket": "^0.11.4", - "jasmine-core": "^4.5.0", - "karma": "^6.3.4", - "karma-benchmark": "^1.0.4", - "karma-benchmark-reporter": "^0.1.1", - "karma-chrome-launcher": "^3.1.0", - "karma-esbuild": "^2.3.0", - "karma-firefox-launcher": "^2.1.1", - "karma-jasmine": "^5.1.0", - "karma-mocha-reporter": "^2.2.5", - "karma-sourcemap-loader": "^0.4.0", - "morgan": "^1.10.0", - "nunjucks": "^3.2.3", - "prettier": "3.1.1", - "send": "^0.18.0", - "yargs": "^17.0.1" - }, - "dependencies": { + "@rollup/pluginutils": "^5.1.0", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", - "@types/lodash": "^4.14.170", - "@types/node": "^18.14.6", - "@types/pako": "^2.0.0", - "@types/webpack-env": "^1.16.0", + "@types/lodash-es": "^4.17.12", + "@types/node": "^20.11.14", + "@types/pako": "^2.0.3", + "@types/yargs": "^17.0.32", + "@typescript-eslint/eslint-plugin": "^6.20.0", + "@typescript-eslint/parser": "^6.20.0", + "@vitest/browser": "^1.2.2", + "@vitest/ui": "^1.2.2", + "esbuild": "^0.20.0", + "eslint": "^8.56.0", + "eslint-formatter-codeframe": "^7.32.1", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-interactive": "^10.8.0", + "eslint-plugin-import": "^2.29.1", + "glob": "^10.3.10", + "prettier": "3.2.4", + "tsx": "^4.7.0", + "typescript": "^5.3.3", + "vite": "^5.1.3", + "vite-plugin-checker": "^0.6.3", + "vitest": "^1.2.2", + "webdriverio": "^8.32.2" + }, + "dependencies": { "codemirror": "^5.61.1", - "esbuild": "^0.19.11", "gl-matrix": "3.1.0", "glsl-editor": "^1.0.0", "ikonate": "mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", - "lodash": "^4.17.21", - "nifti-reader-js": "^0.5.4", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", "numcodecs": "^0.3.1", - "pako": "^2.0.3", - "svg-inline-loader": "^0.8.2", - "typescript": "^5.3.3" + "pako": "^2.1.0" }, "overrides": { - "karma-benchmark": { - "karma": "$karma" + "@puppeteer/browsers": ">=2" + }, + "files": [ + "lib/**/*" + ], + "private": true, + "type": "module", + "exports": { + ".": "./src/main_module.ts", + "./*.js": "./src/*.ts", + "./*": "./src/*" + }, + "imports": { + "#src/third_party/jpgjs/jpg.js": "./src/third_party/jpgjs/jpg.js", + "#src/*.js": "./src/*.ts", + "#src/*": "./src/*", + "#testdata/*": "./testdata/*", + "#datasource/boss/backend": { + "neuroglancer/datasource/boss:enabled": "./src/datasource/boss/backend.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/boss:disabled": "./src/datasource/boss/backend.ts", + "default": "./src/datasource/boss/backend.ts" + }, + "#datasource/boss/async_computation": { + "neuroglancer/datasource/boss:enabled": "./src/datasource/boss/async_computation.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/boss:disabled": "./src/datasource/boss/async_computation.ts", + "default": "./src/datasource/boss/async_computation.ts" + }, + "#datasource/boss/register_default": { + "neuroglancer/datasource/boss:enabled": "./src/datasource/boss/register_default.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/boss:disabled": "./src/datasource/boss/register_default.ts", + "default": "./src/datasource/boss/register_default.ts" + }, + "#datasource/boss/register_credentials_provider": { + "neuroglancer/python": "./src/util/false.ts", + "neuroglancer/datasource/boss:enabled": "./src/datasource/boss/register_credentials_provider.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/boss:disabled": "./src/datasource/boss/register_credentials_provider.ts", + "default": "./src/datasource/boss/register_credentials_provider.ts" + }, + "#datasource/brainmaps/backend": { + "neuroglancer/datasource/brainmaps:enabled": "./src/datasource/brainmaps/backend.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/brainmaps:disabled": "./src/datasource/brainmaps/backend.ts", + "default": "./src/datasource/brainmaps/backend.ts" + }, + "#datasource/brainmaps/async_computation": { + "neuroglancer/datasource/brainmaps:enabled": "./src/datasource/brainmaps/async_computation.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/brainmaps:disabled": "./src/datasource/brainmaps/async_computation.ts", + "default": "./src/datasource/brainmaps/async_computation.ts" + }, + "#datasource/brainmaps/register_default": { + "neuroglancer/datasource/brainmaps:enabled": "./src/datasource/brainmaps/register_default.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/brainmaps:disabled": "./src/datasource/brainmaps/register_default.ts", + "default": "./src/datasource/brainmaps/register_default.ts" + }, + "#datasource/brainmaps/register_credentials_provider": { + "neuroglancer/python": "./src/util/false.ts", + "neuroglancer/datasource/brainmaps:enabled": "./src/datasource/brainmaps/register_credentials_provider.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/brainmaps:disabled": "./src/datasource/brainmaps/register_credentials_provider.ts", + "default": "./src/datasource/brainmaps/register_credentials_provider.ts" + }, + "#datasource/deepzoom/backend": { + "neuroglancer/datasource/deepzoom:enabled": "./src/datasource/deepzoom/backend.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/deepzoom:disabled": "./src/datasource/deepzoom/backend.ts", + "default": "./src/datasource/deepzoom/backend.ts" + }, + "#datasource/deepzoom/async_computation": { + "neuroglancer/datasource/deepzoom:enabled": "./src/datasource/deepzoom/async_computation.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/deepzoom:disabled": "./src/datasource/deepzoom/async_computation.ts", + "default": "./src/datasource/deepzoom/async_computation.ts" + }, + "#datasource/deepzoom/register_default": { + "neuroglancer/datasource/deepzoom:enabled": "./src/datasource/deepzoom/register_default.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/deepzoom:disabled": "./src/datasource/deepzoom/register_default.ts", + "default": "./src/datasource/deepzoom/register_default.ts" + }, + "#datasource/dvid/backend": { + "neuroglancer/datasource/dvid:enabled": "./src/datasource/dvid/backend.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/dvid:disabled": "./src/datasource/dvid/backend.ts", + "default": "./src/datasource/dvid/backend.ts" + }, + "#datasource/dvid/async_computation": { + "neuroglancer/datasource/dvid:enabled": "./src/datasource/dvid/async_computation.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/dvid:disabled": "./src/datasource/dvid/async_computation.ts", + "default": "./src/datasource/dvid/async_computation.ts" + }, + "#datasource/dvid/register_default": { + "neuroglancer/datasource/dvid:enabled": "./src/datasource/dvid/register_default.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/dvid:disabled": "./src/datasource/dvid/register_default.ts", + "default": "./src/datasource/dvid/register_default.ts" + }, + "#datasource/dvid/register_credentials_provider": { + "neuroglancer/python": "./src/util/false.ts", + "neuroglancer/datasource/dvid:enabled": "./src/datasource/dvid/register_credentials_provider.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/dvid:disabled": "./src/datasource/dvid/register_credentials_provider.ts", + "default": "./src/datasource/dvid/register_credentials_provider.ts" + }, + "#datasource/graphene/backend": { + "neuroglancer/datasource/graphene:enabled": "./src/datasource/graphene/backend.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/graphene:disabled": "./src/datasource/graphene/backend.ts", + "default": "./src/datasource/graphene/backend.ts" + }, + "#datasource/graphene/async_computation": { + "neuroglancer/datasource/graphene:enabled": "./src/datasource/graphene/async_computation.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/graphene:disabled": "./src/datasource/graphene/async_computation.ts", + "default": "./src/datasource/graphene/async_computation.ts" + }, + "#datasource/graphene/register_default": { + "neuroglancer/datasource/graphene:enabled": "./src/datasource/graphene/register_default.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/graphene:disabled": "./src/datasource/graphene/register_default.ts", + "default": "./src/datasource/graphene/register_default.ts" + }, + "#datasource/middleauth/register_credentials_provider": { + "neuroglancer/python": "./src/util/false.ts", + "neuroglancer/datasource/middleauth:enabled": "./src/datasource/middleauth/register_credentials_provider.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/middleauth:disabled": "./src/datasource/middleauth/register_credentials_provider.ts", + "default": "./src/datasource/middleauth/register_credentials_provider.ts" + }, + "#datasource/n5/backend": { + "neuroglancer/datasource/n5:enabled": "./src/datasource/n5/backend.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/n5:disabled": "./src/datasource/n5/backend.ts", + "default": "./src/datasource/n5/backend.ts" + }, + "#datasource/n5/async_computation": { + "neuroglancer/datasource/n5:enabled": "./src/datasource/n5/async_computation.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/n5:disabled": "./src/datasource/n5/async_computation.ts", + "default": "./src/datasource/n5/async_computation.ts" + }, + "#datasource/n5/register_default": { + "neuroglancer/datasource/n5:enabled": "./src/datasource/n5/register_default.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/n5:disabled": "./src/datasource/n5/register_default.ts", + "default": "./src/datasource/n5/register_default.ts" + }, + "#datasource/ngauth/register_credentials_provider": { + "neuroglancer/python": "./src/util/false.ts", + "neuroglancer/datasource/ngauth:enabled": "./src/datasource/ngauth/register_credentials_provider.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/ngauth:disabled": "./src/datasource/ngauth/register_credentials_provider.ts", + "default": "./src/datasource/ngauth/register_credentials_provider.ts" + }, + "#datasource/nggraph/backend": { + "neuroglancer/datasource/nggraph:enabled": "./src/datasource/nggraph/backend.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/nggraph:disabled": "./src/datasource/nggraph/backend.ts", + "default": "./src/datasource/nggraph/backend.ts" + }, + "#datasource/nggraph/register_default": { + "neuroglancer/datasource/nggraph:enabled": "./src/datasource/nggraph/register_default.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/nggraph:disabled": "./src/datasource/nggraph/register_default.ts", + "default": "./src/datasource/nggraph/register_default.ts" + }, + "#datasource/nifti/backend": { + "neuroglancer/datasource/nifti:enabled": "./src/datasource/nifti/backend.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/nifti:disabled": "./src/datasource/nifti/backend.ts", + "default": "./src/datasource/nifti/backend.ts" + }, + "#datasource/nifti/async_computation": { + "neuroglancer/datasource/nifti:enabled": "./src/datasource/nifti/async_computation.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/nifti:disabled": "./src/datasource/nifti/async_computation.ts", + "default": "./src/datasource/nifti/async_computation.ts" + }, + "#datasource/nifti/register_default": { + "neuroglancer/datasource/nifti:enabled": "./src/datasource/nifti/register_default.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/nifti:disabled": "./src/datasource/nifti/register_default.ts", + "default": "./src/datasource/nifti/register_default.ts" + }, + "#datasource/obj/backend": { + "neuroglancer/datasource/obj:enabled": "./src/datasource/obj/backend.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/obj:disabled": "./src/datasource/obj/backend.ts", + "default": "./src/datasource/obj/backend.ts" + }, + "#datasource/obj/async_computation": { + "neuroglancer/datasource/obj:enabled": "./src/datasource/obj/async_computation.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/obj:disabled": "./src/datasource/obj/async_computation.ts", + "default": "./src/datasource/obj/async_computation.ts" + }, + "#datasource/obj/register_default": { + "neuroglancer/datasource/obj:enabled": "./src/datasource/obj/register_default.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/obj:disabled": "./src/datasource/obj/register_default.ts", + "default": "./src/datasource/obj/register_default.ts" + }, + "#datasource/precomputed/backend": { + "neuroglancer/datasource/precomputed:enabled": "./src/datasource/precomputed/backend.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/precomputed:disabled": "./src/datasource/precomputed/backend.ts", + "default": "./src/datasource/precomputed/backend.ts" + }, + "#datasource/precomputed/async_computation": { + "neuroglancer/datasource/precomputed:enabled": "./src/datasource/precomputed/async_computation.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/precomputed:disabled": "./src/datasource/precomputed/async_computation.ts", + "default": "./src/datasource/precomputed/async_computation.ts" + }, + "#datasource/precomputed/register_default": { + "neuroglancer/datasource/precomputed:enabled": "./src/datasource/precomputed/register_default.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/precomputed:disabled": "./src/datasource/precomputed/register_default.ts", + "default": "./src/datasource/precomputed/register_default.ts" + }, + "#datasource/python/backend": { + "neuroglancer/python": "./src/datasource/python/backend.ts", + "default": "./src/util/false.ts" + }, + "#datasource/render/backend": { + "neuroglancer/datasource/render:enabled": "./src/datasource/render/backend.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/render:disabled": "./src/datasource/render/backend.ts", + "default": "./src/datasource/render/backend.ts" + }, + "#datasource/render/async_computation": { + "neuroglancer/datasource/render:enabled": "./src/datasource/render/async_computation.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/render:disabled": "./src/datasource/render/async_computation.ts", + "default": "./src/datasource/render/async_computation.ts" + }, + "#datasource/render/register_default": { + "neuroglancer/datasource/render:enabled": "./src/datasource/render/register_default.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/render:disabled": "./src/datasource/render/register_default.ts", + "default": "./src/datasource/render/register_default.ts" + }, + "#datasource/vtk/backend": { + "neuroglancer/datasource/vtk:enabled": "./src/datasource/vtk/backend.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/vtk:disabled": "./src/datasource/vtk/backend.ts", + "default": "./src/datasource/vtk/backend.ts" + }, + "#datasource/vtk/async_computation": { + "neuroglancer/datasource/vtk:enabled": "./src/datasource/vtk/async_computation.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/vtk:disabled": "./src/datasource/vtk/async_computation.ts", + "default": "./src/datasource/vtk/async_computation.ts" + }, + "#datasource/vtk/register_default": { + "neuroglancer/datasource/vtk:enabled": "./src/datasource/vtk/register_default.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/vtk:disabled": "./src/datasource/vtk/register_default.ts", + "default": "./src/datasource/vtk/register_default.ts" + }, + "#datasource/zarr/backend": { + "neuroglancer/datasource/zarr:enabled": "./src/datasource/zarr/backend.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/zarr:disabled": "./src/datasource/zarr/backend.ts", + "default": "./src/datasource/zarr/backend.ts" + }, + "#datasource/zarr/async_computation": { + "neuroglancer/datasource/zarr:enabled": "./src/datasource/zarr/async_computation.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/zarr:disabled": "./src/datasource/zarr/async_computation.ts", + "default": "./src/datasource/zarr/async_computation.ts" + }, + "#datasource/zarr/register_default": { + "neuroglancer/datasource/zarr:enabled": "./src/datasource/zarr/register_default.ts", + "neuroglancer/datasource:none_by_default": "./src/util/false.ts", + "neuroglancer/datasource/zarr:disabled": "./src/datasource/zarr/register_default.ts", + "default": "./src/datasource/zarr/register_default.ts" + }, + "#layer/annotation": { + "neuroglancer/layer/annotation:enabled": "./src/layer/annotation/index.ts", + "neuroglancer/layer:none_by_default": "./src/util/false.ts", + "default": "./src/layer/annotation/index.ts" + }, + "#layer/image": { + "neuroglancer/layer/image:enabled": "./src/layer/image/index.ts", + "neuroglancer/layer:none_by_default": "./src/util/false.ts", + "default": "./src/layer/image/index.ts" + }, + "#layer/segmentation": { + "neuroglancer/layer/segmentation:enabled": "./src/layer/segmentation/index.ts", + "neuroglancer/layer:none_by_default": "./src/util/false.ts", + "default": "./src/layer/segmentation/index.ts" + }, + "#layer/single_mesh": { + "neuroglancer/layer/single_mesh:enabled": "./src/layer/single_mesh/index.ts", + "neuroglancer/layer:none_by_default": "./src/util/false.ts", + "default": "./src/layer/single_mesh/index.ts" + }, + "#main": { + "neuroglancer/python": "./src/main_python.ts", + "default": "./src/main.ts" + }, + "#python_integration_build": { + "neuroglancer/python": "./src/util/true.ts", + "default": "./src/util/false.ts" } } } diff --git a/public/bossauth.html b/public/bossauth.html new file mode 100644 index 0000000000..ace524ef6d --- /dev/null +++ b/public/bossauth.html @@ -0,0 +1,23 @@ + + + + BOSS Auth Response Window + + + +

This page is a placeholder for Keycloak redirection.

+

+ + diff --git a/public/google_oauth2_redirect.html b/public/google_oauth2_redirect.html new file mode 100644 index 0000000000..d1a777d14b --- /dev/null +++ b/public/google_oauth2_redirect.html @@ -0,0 +1,21 @@ + + + + Google oauth redirect + + + +

Google authentication successful.

+

+ + diff --git a/python/neuroglancer/__init__.py b/python/neuroglancer/__init__.py index 5275b5c879..836bbebd1f 100644 --- a/python/neuroglancer/__init__.py +++ b/python/neuroglancer/__init__.py @@ -26,6 +26,7 @@ is_server_running, # noqa: F401 set_server_bind_address, # noqa: F401 set_static_content_source, # noqa: F401 + set_dev_server_content_source, # noqa: F401 stop, # noqa: F401 ) from .url_state import parse_url, to_json_dump, to_url # noqa: F401 diff --git a/python/neuroglancer/cli.py b/python/neuroglancer/cli.py index 74a5a4ab1e..716ab8a331 100644 --- a/python/neuroglancer/cli.py +++ b/python/neuroglancer/cli.py @@ -29,6 +29,11 @@ def add_server_arguments(ap): "--static-content-url", help="Obtain the Neuroglancer client code from the specified URL.", ) + g.add_argument( + "--static-content-dev-server", + action="store_true", + help="Build Neuroglancer client from source using dev server.", + ) g.add_argument( "--debug-server", action="store_true", @@ -74,7 +79,9 @@ def handle_server_arguments(args): if args.bind_address is not None or args.bind_port is not None: server.set_server_bind_address(args.bind_address, args.bind_port) - if args.static_content_url: + if args.static_content_dev_server: + server.set_dev_server_content_source() + elif args.static_content_url: server.set_static_content_source(url=args.static_content_url) if args.debug_server: server.debug = True diff --git a/python/neuroglancer/server.py b/python/neuroglancer/server.py index 2e9b69b998..c979838e87 100644 --- a/python/neuroglancer/server.py +++ b/python/neuroglancer/server.py @@ -16,7 +16,10 @@ import concurrent.futures import json import multiprocessing +import os +import re import socket +import subprocess import sys import threading import weakref @@ -42,7 +45,7 @@ MESH_PATH_REGEX = r"^/neuroglancer/mesh/(?P[^/]+)/(?P[0-9]+)$" STATIC_PATH_REGEX = ( - r"^/v/(?P[^/]+)/(?P(?:[a-zA-Z0-9_\-][a-zA-Z0-9_\-.]*)?)$" + r"^/v/(?P[^/]+)/(?P(?:[@a-zA-Z0-9_\-][@a-zA-Z0-9_\-./]*)?)$" ) ACTION_PATH_REGEX = r"^/action/(?P[^/]+)$" @@ -91,12 +94,14 @@ def _get_colab_server_url(port: int) -> str: class Server(async_util.BackgroundTornadoServer): - def __init__(self, bind_address="127.0.0.1", bind_port=0): + def __init__(self, bind_address="127.0.0.1", bind_port=0, token=None): super().__init__(daemon=True) self.viewers = weakref.WeakValueDictionary() self._bind_address = bind_address self._bind_port = bind_port - self.token = make_random_token() + if token is None: + token = make_random_token() + self.token = token self.executor = concurrent.futures.ThreadPoolExecutor( max_workers=multiprocessing.cpu_count() ) @@ -137,9 +142,6 @@ def log_function(handler): (CREDENTIALS_PATH_REGEX, CredentialsHandler, dict(server=self)), ], log_function=log_function, - # Set a large maximum message size to accommodate large screenshot - # messages. - websocket_max_message_size=100 * 1024 * 1024, ) self.http_server = tornado.httpserver.HTTPServer( app, @@ -194,7 +196,10 @@ def get(self, viewer_token, path): self.send_error(404) return try: - data, content_type = global_static_content_source.get(path) + query = self.request.query + if query: + query = f"?{query}" + data, content_type = global_static_content_source.get(path, query) except ValueError as e: self.send_error(404, message=e.args[0]) return @@ -499,16 +504,73 @@ def get_encoded_skeleton(skeletons, object_id): _global_server_lock = threading.Lock() +def _get_server_token(): + with _global_server_lock: + if global_server is not None: + return global_server.token + token = make_random_token() + global_server_args.update(token=token) + return token + + def set_static_content_source(*args, **kwargs): global global_static_content_source global_static_content_source = static.get_static_content_source(*args, **kwargs) +def set_dev_server_content_source(): + import nodejs + + static_content_url = None + root_dir = os.path.join(os.path.dirname(__file__), "..", "..") + build_process = nodejs.npm.Popen( + [ + "run", + "dev-server-python", + "--", + "--base", + f"/v/{_get_server_token()}/", + "--port=0", + ], + cwd=root_dir, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + encoding="utf-8", + ) + + try: + future = concurrent.futures.Future() + + def thread_func(f): + url = None + for line in f: + print(f"[dev-server] {line.rstrip()}") + if url is None: + m = re.search(r"http://[^\s]+", line) + if m is not None: + url = m.group(0) + future.set_result(url) + if url is None: + future.set_result(None) + + thread = threading.Thread(target=thread_func, args=(build_process.stdout,)) + thread.daemon = True + thread.start() + + static_content_url = future.result(timeout=10) + except: + build_process.terminate() + raise + + set_static_content_source(url=static_content_url) + + def set_server_bind_address(bind_address=None, bind_port=0): - global global_server_args if bind_address is None: bind_address = "127.0.0.1" - global_server_args = dict(bind_address=bind_address, bind_port=bind_port) + with _global_server_lock: + global_server_args.update(bind_address=bind_address, bind_port=bind_port) def is_server_running(): diff --git a/python/neuroglancer/static/.gitignore b/python/neuroglancer/static/.gitignore index 42cda13cf0..b051c6c57f 100644 --- a/python/neuroglancer/static/.gitignore +++ b/python/neuroglancer/static/.gitignore @@ -1,5 +1 @@ -*.js -*.js.map -*.css.map -*.css -*.html +client diff --git a/python/neuroglancer/static/__init__.py b/python/neuroglancer/static/__init__.py index 649ef35a93..c527dbb786 100644 --- a/python/neuroglancer/static/__init__.py +++ b/python/neuroglancer/static/__init__.py @@ -30,7 +30,7 @@ def guess_mime_type_from_path(path): class StaticContentSource: - def get(self, name): + def get(self, name, query): if name == "": name = "index.html" return self.get_content(name), guess_mime_type_from_path(name) @@ -41,9 +41,9 @@ def get_content(self, name): class ImportlibResourcesContentSource(StaticContentSource): def get_content(self, name): - if not re.match(r"^[a-z][a-z_\-\.]*\.(?:js|js\.map|css|html)$", name): + if not re.match(r"^[a-z][a-zA-Z0-9_\-\.]*\.(?:js|js\.map|css|html)$", name): raise ValueError("Invalid static resource name: %r" % name) - path = importlib.resources.files(__name__).joinpath(name) + path = importlib.resources.files(__name__).joinpath("client", name) if path.is_file(): return path.read_bytes() raise ValueError( @@ -58,13 +58,17 @@ class HttpSource(StaticContentSource): def __init__(self, url): self.url = url - def get_content(self, name): + def get(self, name, query): import requests + print("http", repr(name), repr(query)) + full_url = posixpath.join(self.url, name) - r = requests.get(full_url) + r = requests.get(full_url + query) if r.status_code >= 200 and r.status_code < 300: - return r.content + return r.content, ( + r.headers.get("content-type") or guess_mime_type_from_path(name) + ) raise ValueError(f"Failed to retrieve {full_url!r}: {r.reason}") diff --git a/python/neuroglancer/webdriver.py b/python/neuroglancer/webdriver.py index 1df8350971..ed93f73f75 100644 --- a/python/neuroglancer/webdriver.py +++ b/python/neuroglancer/webdriver.py @@ -30,10 +30,9 @@ class LogMessage(NamedTuple): LogListener = Callable[[LogMessage], None] -class Webdriver: +class WebdriverBase: def __init__( self, - viewer=None, headless=True, browser="chrome", window_size=(1920, 1080), @@ -42,11 +41,6 @@ def __init__( print_logs=True, extra_command_line_args: Optional[Sequence[str]] = None, ): - if viewer is None: - from .viewer import Viewer - - viewer = Viewer() - self.viewer = viewer self.headless = headless self.browser = browser self.window_size = window_size @@ -56,7 +50,6 @@ def __init__( list(extra_command_line_args) if extra_command_line_args else [] ) self.debug = debug - self._init_driver() self._log_listeners_lock = threading.Lock() self._log_listeners: dict[LogListener, None] = {} @@ -68,13 +61,14 @@ def __init__( ) self._closed = False + self._init_driver() def _init_chrome(self): import selenium.webdriver chrome_options = selenium.webdriver.ChromeOptions() if self.headless: - chrome_options.add_argument("--headless") + chrome_options.add_argument("--headless=new") chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) if self.docker: # https://www.intricatecloud.io/2019/05/running-webdriverio-tests-using-headless-chrome-inside-a-container/ @@ -93,6 +87,8 @@ def _init_firefox(self): import selenium.webdriver options = selenium.webdriver.FirefoxOptions() + if self.headless: + options.add_argument("--headless") options.arguments.extend(self.extra_command_line_args) self.driver = selenium.webdriver.Firefox( options=options, @@ -118,15 +114,30 @@ async def start_listening(listener): for listener in self._log_listeners: listener(message) + async def start_listening_for_exceptions(listener): + async for event in listener: + message = LogMessage( + message=event.exception_details.text, level="exception" + ) + with self._log_listeners_lock: + for listener in self._log_listeners: + listener(message) + async def run(): async with self.driver.bidi_connection() as connection: session, devtools = connection.session, connection.devtools await session.execute(devtools.page.enable()) await session.execute(devtools.runtime.enable()) listener = session.listen(devtools.runtime.ConsoleAPICalled) + exception_listener = session.listen( + devtools.runtime.ExceptionThrown + ) with trio.CancelScope() as cancel_scope: async with trio.open_nursery() as nursery: nursery.start_soon(start_listening, listener) + nursery.start_soon( + start_listening_for_exceptions, exception_listener + ) while True: await trio.sleep(2) if not driver.service.is_connectable(): @@ -138,8 +149,6 @@ async def run(): t.daemon = True t.start() - self.driver.get(self.viewer.get_viewer_url()) - def __enter__(self): return self @@ -178,16 +187,6 @@ def handle_message(msg): if not event.wait(timeout): raise TimeoutError - def sync(self): - """Wait until client is ready.""" - while True: - new_state = self.viewer.screenshot().viewer_state - # Ensure self.viewer.state has also been updated to the new state. - # The state sent in the screenshot reply can be newer. - if new_state == self.viewer.state: - return new_state - time.sleep(0.1) - def reload_browser(self): """Reloads the browser (useful if it crashes/becomes unresponsive).""" try: @@ -204,3 +203,27 @@ def action_chain(self): import selenium.webdriver return selenium.webdriver.common.action_chains.ActionChains(self.driver) + + +class Webdriver(WebdriverBase): + def __init__(self, viewer=None, **kwargs): + if viewer is None: + from .viewer import Viewer + + viewer = Viewer() + self.viewer = viewer + super().__init__(**kwargs) + + def _init_driver(self): + super()._init_driver() + self.driver.get(self.viewer.get_viewer_url()) + + def sync(self): + """Wait until client is ready.""" + while True: + new_state = self.viewer.screenshot().viewer_state + # Ensure self.viewer.state has also been updated to the new state. + # The state sent in the screenshot reply can be newer. + if new_state == self.viewer.state: + return new_state + time.sleep(0.1) diff --git a/python/tests/client_test.py b/python/tests/client_test.py new file mode 100644 index 0000000000..aceef501cc --- /dev/null +++ b/python/tests/client_test.py @@ -0,0 +1,300 @@ +"""Tests that screenshots of the example projects match neuroglancer itself. + +This validates that the example project configurations are correct. +""" + +import base64 +import concurrent.futures +import hashlib +import io +import json +import os +import pickle +import re +import signal +import subprocess +import sys +import threading +import time + +import filelock +import neuroglancer.static_file_server +import neuroglancer.webdriver +import numpy as np +import PIL.Image +import pytest +import pytest_html + +root_dir = os.path.join(os.path.dirname(__file__), "..", "..") +examples_dir = os.path.join(os.path.dirname(__file__), "..", "..", "examples") + + +def capture_screenshot_from_dev_server(webdriver, example_dir, test_fragment): + if sys.platform == "win32": + process_group_args = dict(creationflags=subprocess.CREATE_NEW_PROCESS_GROUP) + else: + # Technically, it would be better to use just a new process group rather + # than a new session, as we would like the subprocesses to still be + # considered part of the same session. However, the parcel dev server + # causes this test to hang when using a new process group rather than a + # new session. + process_group_args = dict(start_new_session=True) + p = subprocess.Popen( + ["npm", "run", "dev-server"], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + cwd=example_dir, + encoding="utf-8", + **process_group_args, + ) + + try: + future = concurrent.futures.Future() + + def thread_func(f): + url = None + for line in f: + print(f"[dev-server] {line.rstrip()}") + if url is None: + m = re.search(r"http://[^\s]+", line) + if m is not None: + url = m.group(0) + future.set_result(url) + if url is None: + future.set_result(None) + + thread = threading.Thread(target=thread_func, args=(p.stdout,)) + thread.start() + + print("waiting for url") + while True: + try: + url = future.result(timeout=1) + break + except TimeoutError: + continue + print(f"got url: {url}") + + assert url is not None + + return capture_screenshot(webdriver, url, test_fragment) + finally: + if sys.platform == "win32": + p.send_signal(signal.CTRL_BREAK_EVENT) + else: + os.killpg(os.getpgid(p.pid), signal.SIGTERM) + try: + p.wait(timeout=2) + except subprocess.TimeoutExpired: + p.kill() + p.wait() + + +def capture_screenshot_from_build( + webdriver, example_dir, test_fragment, output_dir=None +): + subprocess.run(["npm", "run", "build"], cwd=example_dir, check=True) + if output_dir is None: + output_dir = os.path.join(example_dir, "dist") + + with neuroglancer.static_file_server.StaticFileServer(output_dir) as url: + return capture_screenshot(webdriver, f"{url}/index.html", test_fragment) + + +def capture_screenshot(webdriver, url, test_fragment): + test_url = url + test_fragment + + original_window_handle = webdriver.driver.current_window_handle + # Use a separate tab for each capture. This avoids hitting the limit on + # number of WebAssembly memories due to the Chrome back/forward cache. + webdriver.driver.switch_to.new_window("tab") + try: + webdriver.driver.get(test_url) + print("Capturing screenshot") + while True: + if webdriver.driver.execute_script("return viewer.isReady();"): + break + time.sleep(0.1) + + # Wait for chunk statistics to update + time.sleep(0.5) + + return webdriver.driver.get_screenshot_as_png() + finally: + # Close previously-opened tab + webdriver.driver.close() + webdriver.driver.switch_to.window(original_window_handle) + + +TEST_FRAGMENT = "#!%7B%22dimensions%22:%7B%22x%22:%5B8e-9%2C%22m%22%5D%2C%22y%22:%5B8e-9%2C%22m%22%5D%2C%22z%22:%5B8e-9%2C%22m%22%5D%7D%2C%22position%22:%5B22316.904296875%2C21921.87890625%2C24029.763671875%5D%2C%22crossSectionScale%22:1%2C%22crossSectionDepth%22:-37.62185354999912%2C%22projectionOrientation%22:%5B-0.1470303237438202%2C0.5691322684288025%2C0.19562694430351257%2C0.7849844694137573%5D%2C%22projectionScale%22:118020.30607575581%2C%22layers%22:%5B%7B%22type%22:%22image%22%2C%22source%22:%22precomputed://gs://neuroglancer-janelia-flyem-hemibrain/emdata/clahe_yz/jpeg%22%2C%22tab%22:%22source%22%2C%22name%22:%22emdata%22%7D%2C%7B%22type%22:%22segmentation%22%2C%22source%22:%22precomputed://gs://neuroglancer-janelia-flyem-hemibrain/v1.0/segmentation%22%2C%22tab%22:%22segments%22%2C%22segments%22:%5B%221944507292%22%5D%2C%22name%22:%22segmentation%22%7D%5D%2C%22showSlices%22:false%2C%22selectedLayer%22:%7B%22layer%22:%22segmentation%22%7D%2C%22layout%22:%22xy-3d%22%7D" + + +@pytest.fixture(scope="session") +def expected_screenshot(request, webdriver_generic): + return get_xdist_session_value( + lambda: capture_screenshot_from_dev_server( + webdriver=webdriver_generic, + example_dir=root_dir, + test_fragment=TEST_FRAGMENT, + ), + request, + ) + + +EXAMPLE_DIRS = [ + f"examples/{bundler}/{bundler}-project-{package}" + for bundler in ["vite", "parcel", "webpack"] + for package in ["source", "built"] +] + + +# https://pytest-xdist.readthedocs.io/en/latest/how-to.html#making-session-scoped-fixtures-execute-only-once +def get_xdist_session_value(getter, request, *args, **kwargs): + print(request.node.name) + worker_id = request.getfixturevalue("worker_id") + if worker_id == "master": + # Not executing with multiple workers + return getter() + + root_tmp_dir = request.getfixturevalue("tmp_path_factory").getbasetemp().parent + temp_path = ( + root_tmp_dir + / hashlib.sha256( + json.dumps([request.fixturename, args, kwargs]).encode("utf-8") + ).hexdigest() + ) + with filelock.FileLock(str(temp_path) + ".lock"): + if temp_path.is_file(): + return pickle.loads(temp_path.read_bytes()) + data = getter() + temp_path.write_bytes(pickle.dumps(data)) + return data + + +@pytest.fixture(scope="session", params=EXAMPLE_DIRS) +def example_dir(request): + return request.param + + +@pytest.fixture(scope="session") +def built_package(request): + get_xdist_session_value( + lambda: subprocess.run( + ["npm", "run", "build-package"], cwd=root_dir, check=True + ), + request, + ) + + +@pytest.fixture(scope="session") +def installed_example_dir(request, example_dir): + get_xdist_session_value( + lambda: subprocess.run( + ["npm", "install", "--no-fund", "--no-audit"], + cwd=os.path.join(root_dir, example_dir), + check=True, + ), + request, + example_dir, + ) + + +def compare_screenshot(screenshot, expected_screenshot, extras, threshold=20): + # Avoid doing comparison within `assert` because pytest's built-in diffing + # is too slow. + actual = np.asarray(PIL.Image.open(io.BytesIO(screenshot))) + expected = np.asarray(PIL.Image.open(io.BytesIO(expected_screenshot))) + + absdiff = np.abs( + np.asarray(actual, dtype=np.int16) - np.asarray(expected, dtype=np.int16) + ) + + max_difference = np.max(absdiff) + + mask = np.max(absdiff, axis=2) > threshold + mask = mask[..., np.newaxis] * np.array([255, 255, 255, 255], dtype=np.uint8) + mismatch = np.any(mask) + + mask_image_buffer = io.BytesIO() + PIL.Image.fromarray(mask).save(mask_image_buffer, format="png") + mask_image_encoded = mask_image_buffer.getvalue() + + expected_b64 = base64.b64encode(expected_screenshot).decode("utf-8") + actual_b64 = base64.b64encode(screenshot).decode("utf-8") + mask_b64 = base64.b64encode(mask_image_encoded).decode("utf-8") + + extras.append( + pytest_html.extras.html( + f""" +
+ + + +
+ """ + ) + ) + extras.append( + pytest_html.extras.html( + f'' + ) + ) + + if mismatch: + pytest.fail(f"Screenshots don't match, max_difference={max_difference}") + + +def test_dev_server( + request, + built_package, + webdriver_generic, + example_dir, + installed_example_dir, + extras, +): + screenshot = capture_screenshot_from_dev_server( + webdriver=webdriver_generic, + example_dir=os.path.join(root_dir, example_dir), + test_fragment=TEST_FRAGMENT, + ) + + compare_screenshot( + screenshot, request.getfixturevalue("expected_screenshot"), extras + ) + + +def test_build( + request, + built_package, + webdriver_generic, + example_dir, + installed_example_dir, + extras, +): + screenshot = capture_screenshot_from_build( + webdriver=webdriver_generic, + example_dir=os.path.join(root_dir, example_dir), + test_fragment=TEST_FRAGMENT, + ) + + compare_screenshot( + screenshot, request.getfixturevalue("expected_screenshot"), extras + ) + + +def test_root_build( + request, + webdriver_generic, + extras, +): + screenshot = capture_screenshot_from_build( + webdriver=webdriver_generic, + example_dir=root_dir, + output_dir=os.path.join(root_dir, "dist", "min"), + test_fragment=TEST_FRAGMENT, + ) + + compare_screenshot( + screenshot, request.getfixturevalue("expected_screenshot"), extras + ) diff --git a/python/tests/conftest.py b/python/tests/conftest.py index 829c6edb8e..f415cfd08a 100644 --- a/python/tests/conftest.py +++ b/python/tests/conftest.py @@ -50,6 +50,12 @@ def pytest_addoption(parser): parser.addoption( "--static-content-url", default=None, help="URL to Neuroglancer Python client" ) + parser.addoption( + "--build-client", + action="store_true", + default=False, + help="Test using a client built from source automatically.", + ) parser.addoption( "--browser", choices=["chrome", "firefox"], @@ -72,9 +78,12 @@ def pytest_addoption(parser): def _webdriver_internal(request): if request.config.getoption("--skip-browser-tests"): pytest.skip("--skip-browser-tests") - static_content_url = request.config.getoption("--static-content-url") - if static_content_url is not None: - neuroglancer.set_static_content_source(url=static_content_url) + if request.config.getoption("--build-client"): + neuroglancer.set_dev_server_content_source() + else: + static_content_url = request.config.getoption("--static-content-url") + if static_content_url is not None: + neuroglancer.set_static_content_source(url=static_content_url) webdriver = neuroglancer.webdriver.Webdriver( headless=request.config.getoption("--headless"), docker=request.config.getoption("--webdriver-docker"), @@ -87,6 +96,20 @@ def _webdriver_internal(request): return webdriver +@pytest.fixture(scope="session") +def webdriver_generic(request): + if request.config.getoption("--skip-browser-tests"): + pytest.skip("--skip-browser-tests") + webdriver = neuroglancer.webdriver.WebdriverBase( + headless=request.config.getoption("--headless"), + docker=request.config.getoption("--webdriver-docker"), + debug=request.config.getoption("--debug-webdriver"), + browser=request.config.getoption("--browser"), + ) + atexit.register(webdriver.driver.close) + return webdriver + + # https://docs.pytest.org/en/latest/example/simple.html#making-test-result-information-available-in-fixtures @pytest.hookimpl(tryfirst=True, hookwrapper=True) def pytest_runtest_makereport(item, call): diff --git a/setup.py b/setup.py index 8100216052..19da1ccc35 100755 --- a/setup.py +++ b/setup.py @@ -327,6 +327,10 @@ def _no_guess_dev_version(version): "pytest>=6.1.2", "pytest-rerunfailures>=9.1.1", "pytest-timeout>=1.4.2", + "ansi2html", # required by pytest-html + "pytest-html", + "pytest-xdist", + "filelock", ], "test-browser": [ "selenium>=4", diff --git a/src/annotation/annotation_layer_state.ts b/src/annotation/annotation_layer_state.ts index 0df0b27ad0..c9da60d6b9 100644 --- a/src/annotation/annotation_layer_state.ts +++ b/src/annotation/annotation_layer_state.ts @@ -14,42 +14,44 @@ * limitations under the License. */ -import { +import type { MultiscaleAnnotationSource } from "#src/annotation/frontend_source.js"; +import type { AnnotationPropertySpec, AnnotationSource, - propertyTypeDataType, -} from "#/annotation"; -import { MultiscaleAnnotationSource } from "#/annotation/frontend_source"; -import { LayerDataSource } from "#/layer_data_source"; -import { +} from "#src/annotation/index.js"; +import { propertyTypeDataType } from "#src/annotation/index.js"; +import type { LayerDataSource } from "#src/layer/layer_data_source.js"; +import type { ChunkTransformParameters, - getChunkTransformParameters, RenderLayerTransformOrError, -} from "#/render_coordinate_transform"; -import { RenderLayerRole } from "#/renderlayer"; -import { SegmentationDisplayState } from "#/segmentation_display_state/frontend"; -import { TrackableBoolean } from "#/trackable_boolean"; +} from "#src/render_coordinate_transform.js"; +import { getChunkTransformParameters } from "#src/render_coordinate_transform.js"; +import { RenderLayerRole } from "#src/renderlayer.js"; +import type { SegmentationDisplayState } from "#src/segmentation_display_state/frontend.js"; +import { TrackableBoolean } from "#src/trackable_boolean.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; import { makeCachedLazyDerivedWatchableValue, registerNested, WatchableValue, - WatchableValueInterface, -} from "#/trackable_value"; -import { TrackableRGB } from "#/util/color"; -import { Owned, RefCounted } from "#/util/disposable"; -import { makeValueOrError, ValueOrError, valueOrThrow } from "#/util/error"; -import { vec3 } from "#/util/geom"; -import { WatchableMap } from "#/util/watchable_map"; +} from "#src/trackable_value.js"; +import { TrackableRGB } from "#src/util/color.js"; +import type { DataType } from "#src/util/data_type.js"; +import type { Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import type { ValueOrError } from "#src/util/error.js"; +import { makeValueOrError, valueOrThrow } from "#src/util/error.js"; +import { vec3 } from "#src/util/geom.js"; +import { WatchableMap } from "#src/util/watchable_map.js"; import { makeTrackableFragmentMain, makeWatchableShaderError, -} from "#/webgl/dynamic_shader"; +} from "#src/webgl/dynamic_shader.js"; import { getFallbackBuilderState, parseShaderUiControls, ShaderControlState, -} from "#/webgl/shader_ui_controls"; -import { DataType } from "../util/data_type"; +} from "#src/webgl/shader_ui_controls.js"; export class AnnotationHoverState extends WatchableValue< | { diff --git a/src/annotation/backend.ts b/src/annotation/backend.ts index 0bbda61033..7796788634 100644 --- a/src/annotation/backend.ts +++ b/src/annotation/backend.ts @@ -14,12 +14,7 @@ * limitations under the License. */ -import { - Annotation, - AnnotationId, - fixAnnotationAfterStructuredCloning, - SerializedAnnotations, -} from "#/annotation"; +import type { AnnotationGeometryChunkSpecification } from "#src/annotation/base.js"; import { ANNOTATION_COMMIT_UPDATE_RESULT_RPC_ID, ANNOTATION_COMMIT_UPDATE_RPC_ID, @@ -31,57 +26,60 @@ import { ANNOTATION_RENDER_LAYER_UPDATE_SEGMENTATION_RPC_ID, ANNOTATION_SPATIALLY_INDEXED_RENDER_LAYER_RPC_ID, ANNOTATION_SUBSET_GEOMETRY_CHUNK_SOURCE_RPC_ID, - AnnotationGeometryChunkSpecification, forEachVisibleAnnotationChunk, -} from "#/annotation/base"; +} from "#src/annotation/base.js"; +import type { + Annotation, + AnnotationId, + SerializedAnnotations, +} from "#src/annotation/index.js"; +import { fixAnnotationAfterStructuredCloning } from "#src/annotation/index.js"; +import type { ChunkManager } from "#src/chunk_manager/backend.js"; import { Chunk, - ChunkManager, ChunkRenderLayerBackend, ChunkSource, withChunkManager, -} from "#/chunk_manager/backend"; -import { ChunkPriorityTier, ChunkState } from "#/chunk_manager/base"; -import { - DisplayDimensionRenderInfo, - displayDimensionRenderInfosEqual, -} from "#/navigation_state"; -import { +} from "#src/chunk_manager/backend.js"; +import { ChunkPriorityTier, ChunkState } from "#src/chunk_manager/base.js"; +import type { DisplayDimensionRenderInfo } from "#src/navigation_state.js"; +import { displayDimensionRenderInfosEqual } from "#src/navigation_state.js"; +import type { RenderedViewBackend, - RenderLayerBackend, RenderLayerBackendAttachment, -} from "#/render_layer_backend"; -import { receiveVisibleSegmentsState } from "#/segmentation_display_state/backend"; +} from "#src/render_layer_backend.js"; +import { RenderLayerBackend } from "#src/render_layer_backend.js"; +import { receiveVisibleSegmentsState } from "#src/segmentation_display_state/backend.js"; +import type { VisibleSegmentsState } from "#src/segmentation_display_state/base.js"; import { forEachVisibleSegment, getObjectKey, onTemporaryVisibleSegmentsStateChanged, onVisibleSegmentsStateChanged, - VisibleSegmentsState, -} from "#/segmentation_display_state/base"; -import { SharedWatchableValue } from "#/shared_watchable_value"; +} from "#src/segmentation_display_state/base.js"; +import type { SharedWatchableValue } from "#src/shared_watchable_value.js"; import { deserializeTransformedSources, SCALE_PRIORITY_MULTIPLIER, SliceViewChunk, SliceViewChunkSourceBackend, -} from "#/sliceview/backend"; -import { TransformedSource } from "#/sliceview/base"; -import { registerNested, WatchableValue } from "#/trackable_value"; -import { CancellationToken } from "#/util/cancellation"; -import { Borrowed } from "#/util/disposable"; -import { Uint64 } from "#/util/uint64"; +} from "#src/sliceview/backend.js"; +import type { TransformedSource } from "#src/sliceview/base.js"; +import { registerNested, WatchableValue } from "#src/trackable_value.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import type { Uint64 } from "#src/util/uint64.js"; import { getBasePriority, getPriorityTier, withSharedVisibility, -} from "#/visibility_priority/backend"; +} from "#src/visibility_priority/backend.js"; +import type { RPC } from "#src/worker_rpc.js"; import { registerRPC, registerSharedObject, - RPC, SharedObjectCounterpart, -} from "#/worker_rpc"; +} from "#src/worker_rpc.js"; const ANNOTATION_METADATA_CHUNK_PRIORITY = 200; const ANNOTATION_SEGMENT_FILTERED_CHUNK_PRIORITY = 60; @@ -223,6 +221,7 @@ class AnnotationSubsetGeometryChunkSource extends ChunkSource { } } +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export interface AnnotationSource { // TODO(jbms): Move this declaration to class definition below and declare abstract once // TypeScript supports mixins with abstract classes. @@ -237,6 +236,7 @@ export interface AnnotationSource { ): Promise; } +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export class AnnotationSource extends SharedObjectCounterpart { references = new Set(); chunkManager: Borrowed; diff --git a/src/annotation/base.ts b/src/annotation/base.ts index 9d1478a71e..432776020a 100644 --- a/src/annotation/base.ts +++ b/src/annotation/base.ts @@ -14,15 +14,20 @@ * limitations under the License. */ -import { ProjectionParameters } from "#/projection_parameters"; -import { - forEachVisibleVolumetricChunk, +import type { ProjectionParameters } from "#src/projection_parameters.js"; +import type { MultiscaleVolumetricDataRenderLayer, SliceViewChunkSource, SliceViewChunkSpecification, TransformedSource, -} from "#/sliceview/base"; -import { getViewFrustrumVolume, mat3, mat3FromMat4, prod3 } from "#/util/geom"; +} from "#src/sliceview/base.js"; +import { forEachVisibleVolumetricChunk } from "#src/sliceview/base.js"; +import { + getViewFrustrumVolume, + mat3, + mat3FromMat4, + prod3, +} from "#src/util/geom.js"; export const ANNOTATION_METADATA_CHUNK_SOURCE_RPC_ID = "annotation.MetadataChunkSource"; diff --git a/src/annotation/bounding_box.ts b/src/annotation/bounding_box.ts index b252bb502a..60100918f9 100644 --- a/src/annotation/bounding_box.ts +++ b/src/annotation/bounding_box.ts @@ -18,42 +18,42 @@ * @file Support for rendering bounding box annotations. */ -import { AnnotationType, AxisAlignedBoundingBox } from "#/annotation"; -import { +import type { AxisAlignedBoundingBox } from "#src/annotation/index.js"; +import { AnnotationType } from "#src/annotation/index.js"; +import type { AnnotationRenderContext, - AnnotationRenderHelper, AnnotationShaderGetter, +} from "#src/annotation/type_handler.js"; +import { + AnnotationRenderHelper, registerAnnotationTypeRenderHandler, -} from "#/annotation/type_handler"; +} from "#src/annotation/type_handler.js"; import { defineBoundingBoxCrossSectionShader, setBoundingBoxCrossSectionShaderViewportPlane, vertexBasePositions, -} from "#/sliceview/bounding_box_shader_helper"; -import { SliceViewPanelRenderContext } from "#/sliceview/renderlayer"; -import { tile2dArray } from "#/util/array"; -import { getViewFrustrumWorldBounds, mat4 } from "#/util/geom"; -import { CORNERS_PER_BOX, EDGES_PER_BOX } from "#/webgl/bounding_box"; -import { Buffer } from "#/webgl/buffer"; +} from "#src/sliceview/bounding_box_shader_helper.js"; +import type { SliceViewPanelRenderContext } from "#src/sliceview/renderlayer.js"; +import { tile2dArray } from "#src/util/array.js"; +import { getViewFrustrumWorldBounds, mat4 } from "#src/util/geom.js"; +import { CORNERS_PER_BOX, EDGES_PER_BOX } from "#src/webgl/bounding_box.js"; +import { Buffer } from "#src/webgl/buffer.js"; import { defineCircleShader, drawCircles, initializeCircleShader, VERTICES_PER_CIRCLE, -} from "#/webgl/circles"; +} from "#src/webgl/circles.js"; import { defineLineShader, drawLines, initializeLineShader, VERTICES_PER_LINE, -} from "#/webgl/lines"; -import { - drawArraysInstanced, - ShaderBuilder, - ShaderProgram, -} from "#/webgl/shader"; -import { defineVectorArrayVertexShaderInput } from "#/webgl/shader_lib"; -import { defineVertexId, VertexIdHelper } from "#/webgl/vertex_id"; +} from "#src/webgl/lines.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; +import { drawArraysInstanced } from "#src/webgl/shader.js"; +import { defineVectorArrayVertexShaderInput } from "#src/webgl/shader_lib.js"; +import { defineVertexId, VertexIdHelper } from "#src/webgl/vertex_id.js"; const FULL_OBJECT_PICK_OFFSET = 0; const CORNERS_PICK_OFFSET = FULL_OBJECT_PICK_OFFSET + 1; diff --git a/src/annotation/ellipsoid.ts b/src/annotation/ellipsoid.ts index efd33d4810..26d778575f 100644 --- a/src/annotation/ellipsoid.ts +++ b/src/annotation/ellipsoid.ts @@ -18,27 +18,30 @@ * @file Support for rendering ellipsoid annotations. */ -import { AnnotationType, Ellipsoid } from "#/annotation"; -import { +import type { Ellipsoid } from "#src/annotation/index.js"; +import { AnnotationType } from "#src/annotation/index.js"; +import type { AnnotationRenderContext, - AnnotationRenderHelper, AnnotationShaderGetter, +} from "#src/annotation/type_handler.js"; +import { + AnnotationRenderHelper, registerAnnotationTypeRenderHandler, -} from "#/annotation/type_handler"; -import { PerspectiveViewRenderContext } from "#/perspective_view/render_layer"; -import { SliceViewPanelRenderContext } from "#/sliceview/renderlayer"; -import { mat3, mat4, vec3 } from "#/util/geom"; +} from "#src/annotation/type_handler.js"; +import type { PerspectiveViewRenderContext } from "#src/perspective_view/render_layer.js"; +import type { SliceViewPanelRenderContext } from "#src/sliceview/renderlayer.js"; +import { mat3, mat4, vec3 } from "#src/util/geom.js"; import { computeCenterOrientEllipseDebug, computeCrossSectionEllipseDebug, glsl_computeCenterOrientEllipse, glsl_computeCrossSectionEllipse, -} from "#/webgl/ellipse"; -import { drawQuads, glsl_getQuadVertexPosition } from "#/webgl/quad"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; -import { defineVectorArrayVertexShaderInput } from "#/webgl/shader_lib"; -import { SphereRenderHelper } from "#/webgl/spheres"; -import { defineVertexId, VertexIdHelper } from "#/webgl/vertex_id"; +} from "#src/webgl/ellipse.js"; +import { drawQuads, glsl_getQuadVertexPosition } from "#src/webgl/quad.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; +import { defineVectorArrayVertexShaderInput } from "#src/webgl/shader_lib.js"; +import { SphereRenderHelper } from "#src/webgl/spheres.js"; +import { defineVertexId, VertexIdHelper } from "#src/webgl/vertex_id.js"; const tempMat4 = mat4.create(); diff --git a/src/annotation/frontend_source.spec.ts b/src/annotation/frontend_source.browser_test.ts similarity index 95% rename from src/annotation/frontend_source.spec.ts rename to src/annotation/frontend_source.browser_test.ts index a3e5854fa1..082dcccc59 100644 --- a/src/annotation/frontend_source.spec.ts +++ b/src/annotation/frontend_source.browser_test.ts @@ -14,20 +14,23 @@ * limitations under the License. */ +import { describe, it, expect } from "vitest"; import { + deleteAnnotation, + makeTemporaryChunk, + updateAnnotation, +} from "#src/annotation/frontend_source.js"; +import type { Annotation, AnnotationId, AnnotationPropertySerializer, AnnotationPropertySpec, +} from "#src/annotation/index.js"; +import { AnnotationSerializer, AnnotationType, makeAnnotationPropertySerializers, -} from "#/annotation"; -import { - deleteAnnotation, - makeTemporaryChunk, - updateAnnotation, -} from "#/annotation/frontend_source"; +} from "#src/annotation/index.js"; class UpdateTester { annotations: Annotation[] = []; diff --git a/src/annotation/frontend_source.ts b/src/annotation/frontend_source.ts index 92165e79dd..1d6bc9423b 100644 --- a/src/annotation/frontend_source.ts +++ b/src/annotation/frontend_source.ts @@ -14,55 +14,61 @@ * limitations under the License. */ +import type { AnnotationGeometryChunkSpecification } from "#src/annotation/base.js"; import { + ANNOTATION_COMMIT_UPDATE_RESULT_RPC_ID, + ANNOTATION_COMMIT_UPDATE_RPC_ID, + ANNOTATION_GEOMETRY_CHUNK_SOURCE_RPC_ID, + ANNOTATION_METADATA_CHUNK_SOURCE_RPC_ID, + ANNOTATION_REFERENCE_ADD_RPC_ID, + ANNOTATION_REFERENCE_DELETE_RPC_ID, + ANNOTATION_SUBSET_GEOMETRY_CHUNK_SOURCE_RPC_ID, +} from "#src/annotation/base.js"; +import type { Annotation, AnnotationId, AnnotationPropertySerializer, AnnotationPropertySpec, - AnnotationReference, AnnotationSourceSignals, + SerializedAnnotations, +} from "#src/annotation/index.js"; +import { + AnnotationReference, AnnotationType, annotationTypeHandlers, annotationTypes, fixAnnotationAfterStructuredCloning, makeAnnotationId, makeAnnotationPropertySerializers, - SerializedAnnotations, -} from "#/annotation"; -import { - ANNOTATION_COMMIT_UPDATE_RESULT_RPC_ID, - ANNOTATION_COMMIT_UPDATE_RPC_ID, - ANNOTATION_GEOMETRY_CHUNK_SOURCE_RPC_ID, - ANNOTATION_METADATA_CHUNK_SOURCE_RPC_ID, - ANNOTATION_REFERENCE_ADD_RPC_ID, - ANNOTATION_REFERENCE_DELETE_RPC_ID, - ANNOTATION_SUBSET_GEOMETRY_CHUNK_SOURCE_RPC_ID, - AnnotationGeometryChunkSpecification, -} from "#/annotation/base"; -import { getAnnotationTypeRenderHandler } from "#/annotation/type_handler"; -import { Chunk, ChunkManager, ChunkSource } from "#/chunk_manager/frontend"; -import { getObjectKey } from "#/segmentation_display_state/base"; -import { SliceViewSourceOptions } from "#/sliceview/base"; -import { +} from "#src/annotation/index.js"; +import { getAnnotationTypeRenderHandler } from "#src/annotation/type_handler.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { Chunk, ChunkSource } from "#src/chunk_manager/frontend.js"; +import { getObjectKey } from "#src/segmentation_display_state/base.js"; +import type { SliceViewSourceOptions } from "#src/sliceview/base.js"; +import type { MultiscaleSliceViewChunkSource, - SliceViewChunk, - SliceViewChunkSource, SliceViewChunkSourceOptions, SliceViewSingleResolutionSource, -} from "#/sliceview/frontend"; -import { StatusMessage } from "#/status"; -import { Borrowed, Owned } from "#/util/disposable"; -import { ENDIANNESS, Endianness } from "#/util/endian"; -import * as matrix from "#/util/matrix"; -import { NullarySignal, Signal } from "#/util/signal"; -import { Buffer } from "#/webgl/buffer"; -import { GL } from "#/webgl/context"; +} from "#src/sliceview/frontend.js"; +import { + SliceViewChunk, + SliceViewChunkSource, +} from "#src/sliceview/frontend.js"; +import { StatusMessage } from "#src/status.js"; +import type { Borrowed, Owned } from "#src/util/disposable.js"; +import { ENDIANNESS, Endianness } from "#src/util/endian.js"; +import * as matrix from "#src/util/matrix.js"; +import type { Signal } from "#src/util/signal.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { Buffer } from "#src/webgl/buffer.js"; +import type { GL } from "#src/webgl/context.js"; +import type { RPC } from "#src/worker_rpc.js"; import { registerRPC, registerSharedObjectOwner, - RPC, SharedObject, -} from "#/worker_rpc"; +} from "#src/worker_rpc.js"; export interface AnnotationGeometryChunkSourceOptions extends SliceViewChunkSourceOptions { @@ -502,7 +508,7 @@ export class MultiscaleAnnotationSource MultiscaleSliceViewChunkSource, AnnotationSourceSignals { - OPTIONS: {}; + OPTIONS: object; key: any; metadataChunkSource = this.registerDisposer( new AnnotationMetadataChunkSource(this.chunkManager, this), @@ -858,7 +864,7 @@ export class MultiscaleAnnotationSource } } - static encodeOptions(_options: {}): { [key: string]: any } { + static encodeOptions(_options: object): { [key: string]: any } { return {}; } diff --git a/src/annotation/index.ts b/src/annotation/index.ts index d2bae42f64..f920d1a96d 100644 --- a/src/annotation/index.ts +++ b/src/annotation/index.ts @@ -18,12 +18,12 @@ * @file Basic annotation data structures. */ -import { +import type { BoundingBox, CoordinateSpaceTransform, WatchableCoordinateSpaceTransform, -} from "#/coordinate_transform"; -import { arraysEqual } from "#/util/array"; +} from "#src/coordinate_transform.js"; +import { arraysEqual } from "#src/util/array.js"; import { packColor, parseRGBAColorSpecification, @@ -31,10 +31,11 @@ import { serializeColor, unpackRGB, unpackRGBA, -} from "#/util/color"; -import { DataType } from "#/util/data_type"; -import { Borrowed, RefCounted } from "#/util/disposable"; -import { Endianness, ENDIANNESS } from "#/util/endian"; +} from "#src/util/color.js"; +import { DataType } from "#src/util/data_type.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { Endianness, ENDIANNESS } from "#src/util/endian.js"; import { expectArray, parseArray, @@ -49,11 +50,11 @@ import { verifyOptionalObjectProperty, verifyOptionalString, verifyString, -} from "#/util/json"; -import { parseDataTypeValue } from "#/util/lerp"; -import { getRandomHexString } from "#/util/random"; -import { NullarySignal, Signal } from "#/util/signal"; -import { Uint64 } from "#/util/uint64"; +} from "#src/util/json.js"; +import { parseDataTypeValue } from "#src/util/lerp.js"; +import { getRandomHexString } from "#src/util/random.js"; +import { NullarySignal, Signal } from "#src/util/signal.js"; +import { Uint64 } from "#src/util/uint64.js"; export type AnnotationId = string; diff --git a/src/annotation/line.ts b/src/annotation/line.ts index aa8b89fad4..053fd30e71 100644 --- a/src/annotation/line.ts +++ b/src/annotation/line.ts @@ -18,28 +18,31 @@ * @file Support for rendering line annotations. */ -import { AnnotationType, Line } from "#/annotation"; -import { +import type { Line } from "#src/annotation/index.js"; +import { AnnotationType } from "#src/annotation/index.js"; +import type { AnnotationRenderContext, - AnnotationRenderHelper, AnnotationShaderGetter, +} from "#src/annotation/type_handler.js"; +import { + AnnotationRenderHelper, registerAnnotationTypeRenderHandler, -} from "#/annotation/type_handler"; -import { projectPointToLineSegment } from "#/util/geom"; +} from "#src/annotation/type_handler.js"; +import { projectPointToLineSegment } from "#src/util/geom.js"; import { defineCircleShader, drawCircles, initializeCircleShader, VERTICES_PER_CIRCLE, -} from "#/webgl/circles"; +} from "#src/webgl/circles.js"; import { defineLineShader, drawLines, initializeLineShader, -} from "#/webgl/lines"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; -import { defineVectorArrayVertexShaderInput } from "#/webgl/shader_lib"; -import { defineVertexId, VertexIdHelper } from "#/webgl/vertex_id"; +} from "#src/webgl/lines.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; +import { defineVectorArrayVertexShaderInput } from "#src/webgl/shader_lib.js"; +import { defineVertexId, VertexIdHelper } from "#src/webgl/vertex_id.js"; const FULL_OBJECT_PICK_OFFSET = 0; const ENDPOINTS_PICK_OFFSET = FULL_OBJECT_PICK_OFFSET + 1; diff --git a/src/annotation/point.ts b/src/annotation/point.ts index 518dfa6d61..27b12f1491 100644 --- a/src/annotation/point.ts +++ b/src/annotation/point.ts @@ -18,26 +18,29 @@ * @file Support for rendering point annotations. */ -import { AnnotationType, Point } from "#/annotation"; -import { +import type { Point } from "#src/annotation/index.js"; +import { AnnotationType } from "#src/annotation/index.js"; +import type { AnnotationRenderContext, - AnnotationRenderHelper, AnnotationShaderGetter, +} from "#src/annotation/type_handler.js"; +import { + AnnotationRenderHelper, registerAnnotationTypeRenderHandler, -} from "#/annotation/type_handler"; +} from "#src/annotation/type_handler.js"; import { defineCircleShader, drawCircles, initializeCircleShader, -} from "#/webgl/circles"; +} from "#src/webgl/circles.js"; import { defineLineShader, drawLines, initializeLineShader, -} from "#/webgl/lines"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; -import { defineVectorArrayVertexShaderInput } from "#/webgl/shader_lib"; -import { defineVertexId, VertexIdHelper } from "#/webgl/vertex_id"; +} from "#src/webgl/lines.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; +import { defineVectorArrayVertexShaderInput } from "#src/webgl/shader_lib.js"; +import { defineVertexId, VertexIdHelper } from "#src/webgl/vertex_id.js"; class RenderHelper extends AnnotationRenderHelper { private defineShaderCommon(builder: ShaderBuilder) { diff --git a/src/annotation/renderlayer.ts b/src/annotation/renderlayer.ts index b5082c7d63..836fa8dd13 100644 --- a/src/annotation/renderlayer.ts +++ b/src/annotation/renderlayer.ts @@ -14,119 +14,130 @@ * limitations under the License. */ -import "#/annotation/bounding_box"; -import "#/annotation/line"; -import "#/annotation/point"; -import "#/annotation/ellipsoid"; +import "#src/annotation/bounding_box.js"; +import "#src/annotation/line.js"; +import "#src/annotation/point.js"; +import "#src/annotation/ellipsoid.js"; -import { - AnnotationBase, - AnnotationSerializer, - AnnotationSource, - annotationTypes, - formatAnnotationPropertyValue, - SerializedAnnotations, -} from "#/annotation"; -import { +import type { AnnotationLayerState, OptionalSegmentationDisplayState, -} from "#/annotation/annotation_layer_state"; +} from "#src/annotation/annotation_layer_state.js"; import { ANNOTATION_PERSPECTIVE_RENDER_LAYER_UPDATE_SOURCES_RPC_ID, ANNOTATION_RENDER_LAYER_RPC_ID, ANNOTATION_RENDER_LAYER_UPDATE_SEGMENTATION_RPC_ID, ANNOTATION_SPATIALLY_INDEXED_RENDER_LAYER_RPC_ID, forEachVisibleAnnotationChunk, -} from "#/annotation/base"; -import { +} from "#src/annotation/base.js"; +import type { AnnotationGeometryChunkSource, AnnotationGeometryData, +} from "#src/annotation/frontend_source.js"; +import { computeNumPickIds, MultiscaleAnnotationSource, -} from "#/annotation/frontend_source"; +} from "#src/annotation/frontend_source.js"; +import type { + AnnotationBase, + SerializedAnnotations, +} from "#src/annotation/index.js"; import { + AnnotationSerializer, + AnnotationSource, + annotationTypes, + formatAnnotationPropertyValue, +} from "#src/annotation/index.js"; +import type { AnnotationRenderContext, AnnotationRenderHelper, - getAnnotationTypeRenderHandler, -} from "#/annotation/type_handler"; -import { ChunkState, LayerChunkProgressInfo } from "#/chunk_manager/base"; -import { - ChunkManager, - ChunkRenderLayerFrontend, -} from "#/chunk_manager/frontend"; -import { +} from "#src/annotation/type_handler.js"; +import { getAnnotationTypeRenderHandler } from "#src/annotation/type_handler.js"; +import { ChunkState, LayerChunkProgressInfo } from "#src/chunk_manager/base.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { ChunkRenderLayerFrontend } from "#src/chunk_manager/frontend.js"; +import type { LayerView, MouseSelectionState, PickState, VisibleLayerInfo, -} from "#/layer"; -import { DisplayDimensionRenderInfo } from "#/navigation_state"; -import { PerspectivePanel } from "#/perspective_view/panel"; -import { +} from "#src/layer/index.js"; +import type { DisplayDimensionRenderInfo } from "#src/navigation_state.js"; +import type { PerspectivePanel } from "#src/perspective_view/panel.js"; +import type { PerspectiveViewReadyRenderContext, PerspectiveViewRenderContext, - PerspectiveViewRenderLayer, -} from "#/perspective_view/render_layer"; -import { +} from "#src/perspective_view/render_layer.js"; +import { PerspectiveViewRenderLayer } from "#src/perspective_view/render_layer.js"; +import type { ChunkDisplayTransformParameters, ChunkTransformParameters, + RenderLayerTransformOrError, +} from "#src/render_coordinate_transform.js"; +import { getChunkDisplayTransformParameters, getChunkPositionFromCombinedGlobalLocalPositions, getLayerDisplayDimensionMapping, - RenderLayerTransformOrError, -} from "#/render_coordinate_transform"; -import { RenderScaleHistogram } from "#/render_scale_statistics"; -import { +} from "#src/render_coordinate_transform.js"; +import type { RenderScaleHistogram } from "#src/render_scale_statistics.js"; +import type { ThreeDimensionalReadyRenderContext, VisibilityTrackedRenderLayer, -} from "#/renderlayer"; +} from "#src/renderlayer.js"; import { forEachVisibleSegment, getObjectKey, -} from "#/segmentation_display_state/base"; -import { sendVisibleSegmentsState } from "#/segmentation_display_state/frontend"; -import { SharedWatchableValue } from "#/shared_watchable_value"; -import { SliceViewProjectionParameters } from "#/sliceview/base"; +} from "#src/segmentation_display_state/base.js"; +import { sendVisibleSegmentsState } from "#src/segmentation_display_state/frontend.js"; +import { SharedWatchableValue } from "#src/shared_watchable_value.js"; +import type { SliceViewProjectionParameters } from "#src/sliceview/base.js"; +import type { FrontendTransformedSource } from "#src/sliceview/frontend.js"; import { - FrontendTransformedSource, getVolumetricTransformedSources, serializeAllTransformedSources, -} from "#/sliceview/frontend"; -import { +} from "#src/sliceview/frontend.js"; +import type { SliceViewPanelReadyRenderContext, SliceViewPanelRenderContext, - SliceViewPanelRenderLayer, SliceViewRenderLayer, -} from "#/sliceview/renderlayer"; +} from "#src/sliceview/renderlayer.js"; +import { SliceViewPanelRenderLayer } from "#src/sliceview/renderlayer.js"; import { crossSectionBoxWireFrameShader, projectionViewBoxWireFrameShader, -} from "#/sliceview/wire_frame"; +} from "#src/sliceview/wire_frame.js"; +import type { + NestedStateManager, + WatchableValueInterface, +} from "#src/trackable_value.js"; import { constantWatchableValue, makeCachedDerivedWatchableValue, - NestedStateManager, registerNested, registerNestedSync, - WatchableValueInterface, -} from "#/trackable_value"; -import { arraysEqual } from "#/util/array"; -import { Borrowed, Owned, RefCounted } from "#/util/disposable"; -import { Endianness, ENDIANNESS } from "#/util/endian"; -import { ValueOrError } from "#/util/error"; -import { mat4 } from "#/util/geom"; -import { MessageList, MessageSeverity } from "#/util/message_list"; -import { AnyConstructor, MixinConstructor } from "#/util/mixin"; -import { NullarySignal } from "#/util/signal"; -import { Uint64 } from "#/util/uint64"; -import { withSharedVisibility } from "#/visibility_priority/frontend"; -import { Buffer } from "#/webgl/buffer"; -import { - ParameterizedContextDependentShaderGetter, - parameterizedEmitterDependentShaderGetter, -} from "#/webgl/dynamic_shader"; -import { ShaderBuilder, ShaderModule, ShaderProgram } from "#/webgl/shader"; -import { registerSharedObjectOwner, SharedObject } from "#/worker_rpc"; +} from "#src/trackable_value.js"; +import { arraysEqual } from "#src/util/array.js"; +import type { Borrowed, Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { Endianness, ENDIANNESS } from "#src/util/endian.js"; +import type { ValueOrError } from "#src/util/error.js"; +import { mat4 } from "#src/util/geom.js"; +import type { MessageList } from "#src/util/message_list.js"; +import { MessageSeverity } from "#src/util/message_list.js"; +import type { AnyConstructor, MixinConstructor } from "#src/util/mixin.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { Uint64 } from "#src/util/uint64.js"; +import { withSharedVisibility } from "#src/visibility_priority/frontend.js"; +import { Buffer } from "#src/webgl/buffer.js"; +import type { ParameterizedContextDependentShaderGetter } from "#src/webgl/dynamic_shader.js"; +import { parameterizedEmitterDependentShaderGetter } from "#src/webgl/dynamic_shader.js"; +import type { + ShaderBuilder, + ShaderModule, + ShaderProgram, +} from "#src/webgl/shader.js"; +import type { SharedObject } from "#src/worker_rpc.js"; +import { registerSharedObjectOwner } from "#src/worker_rpc.js"; const tempMat = mat4.create(); diff --git a/src/annotation/selection.ts b/src/annotation/selection.ts index 69954e3495..911db8ada0 100644 --- a/src/annotation/selection.ts +++ b/src/annotation/selection.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { LayerManager, MouseSelectionState } from "#/layer"; +import type { LayerManager, MouseSelectionState } from "#src/layer/index.js"; export function getSelectedAnnotation( mouseState: MouseSelectionState, diff --git a/src/annotation/type_handler.ts b/src/annotation/type_handler.ts index f5d77111b0..4e6af18194 100644 --- a/src/annotation/type_handler.ts +++ b/src/annotation/type_handler.ts @@ -14,41 +14,48 @@ * limitations under the License. */ -import { +import type { Annotation, AnnotationPropertySpec, AnnotationType, +} from "#src/annotation/index.js"; +import { annotationTypeHandlers, getPropertyOffsets, propertyTypeDataType, -} from "#/annotation"; -import { AnnotationLayer } from "#/annotation/renderlayer"; -import { PerspectiveViewRenderContext } from "#/perspective_view/render_layer"; -import { ChunkDisplayTransformParameters } from "#/render_coordinate_transform"; -import { SliceViewPanelRenderContext } from "#/sliceview/renderlayer"; -import { WatchableValueInterface } from "#/trackable_value"; -import { RefCounted } from "#/util/disposable"; -import { mat4 } from "#/util/geom"; -import { Buffer } from "#/webgl/buffer"; -import { glsl_COLORMAPS } from "#/webgl/colormaps"; -import { GL } from "#/webgl/context"; -import { +} from "#src/annotation/index.js"; +import type { AnnotationLayer } from "#src/annotation/renderlayer.js"; +import type { PerspectiveViewRenderContext } from "#src/perspective_view/render_layer.js"; +import type { ChunkDisplayTransformParameters } from "#src/render_coordinate_transform.js"; +import type { SliceViewPanelRenderContext } from "#src/sliceview/renderlayer.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { RefCounted } from "#src/util/disposable.js"; +import type { mat4 } from "#src/util/geom.js"; +import type { Buffer } from "#src/webgl/buffer.js"; +import { glsl_COLORMAPS } from "#src/webgl/colormaps.js"; +import type { GL } from "#src/webgl/context.js"; +import type { ParameterizedContextDependentShaderGetter, + WatchableShaderError, +} from "#src/webgl/dynamic_shader.js"; +import { parameterizedEmitterDependentShaderGetter, shaderCodeWithLineDirective, - WatchableShaderError, -} from "#/webgl/dynamic_shader"; +} from "#src/webgl/dynamic_shader.js"; import { defineInvlerpShaderFunction, enableLerpShaderFunction, -} from "#/webgl/lerp"; -import { ShaderBuilder, ShaderModule, ShaderProgram } from "#/webgl/shader"; +} from "#src/webgl/lerp.js"; +import type { ShaderModule, ShaderProgram } from "#src/webgl/shader.js"; +import { ShaderBuilder } from "#src/webgl/shader.js"; +import type { + ShaderControlsBuilderState, + ShaderControlState, +} from "#src/webgl/shader_ui_controls.js"; import { addControlsToBuilder, setControlsInShader, - ShaderControlsBuilderState, - ShaderControlState, -} from "#/webgl/shader_ui_controls"; +} from "#src/webgl/shader_ui_controls.js"; const DEBUG_HISTOGRAMS = false; diff --git a/src/async_computation.bundle.js b/src/async_computation.bundle.js new file mode 100644 index 0000000000..25801ea045 --- /dev/null +++ b/src/async_computation.bundle.js @@ -0,0 +1,6 @@ +// Note: This file uses ".js" rather than ".ts" extension because we cannot rely +// on Node.js subpath imports to translate paths for Workers since those paths +// must be valid for use in `new URL` with multiple bundlers. +import "#src/async_computation/encode_compressed_segmentation.js"; +import "#src/datasource/enabled_async_computation_modules.js"; +import "#src/async_computation/handler.js"; diff --git a/src/async_computation/decode_blosc.ts b/src/async_computation/decode_blosc.ts index 4537602017..effe9a723f 100644 --- a/src/async_computation/decode_blosc.ts +++ b/src/async_computation/decode_blosc.ts @@ -14,13 +14,11 @@ * limitations under the License. */ -import { decodeBlosc } from "#/async_computation/decode_blosc_request"; -import { registerAsyncComputation } from "#/async_computation/handler"; +import { decodeBlosc } from "#src/async_computation/decode_blosc_request.js"; +import { registerAsyncComputation } from "#src/async_computation/handler.js"; registerAsyncComputation(decodeBlosc, async (data: Uint8Array) => { - const { default: Blosc } = await import( - /*webpackChunkName: "blosc" */ "numcodecs/blosc" - ); + const { default: Blosc } = await import("numcodecs/blosc"); const codec = Blosc.fromConfig({ id: "blosc" }); const result = await codec.decode(data); return { value: result, transfer: [result.buffer] }; diff --git a/src/async_computation/decode_blosc_request.ts b/src/async_computation/decode_blosc_request.ts index 235a57e70f..54f577b5da 100644 --- a/src/async_computation/decode_blosc_request.ts +++ b/src/async_computation/decode_blosc_request.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { asyncComputation } from "#/async_computation"; +import { asyncComputation } from "#src/async_computation/index.js"; export const decodeBlosc = asyncComputation<(data: Uint8Array) => Uint8Array>("decodeBlosc"); diff --git a/src/async_computation/decode_compresso.ts b/src/async_computation/decode_compresso.ts index 666162f299..377c345d07 100644 --- a/src/async_computation/decode_compresso.ts +++ b/src/async_computation/decode_compresso.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { decompressCompresso } from "#/sliceview/compresso"; -import { decodeCompresso } from "#/async_computation/decode_compresso_request"; -import { registerAsyncComputation } from "#/async_computation/handler"; +import { decodeCompresso } from "#src/async_computation/decode_compresso_request.js"; +import { registerAsyncComputation } from "#src/async_computation/handler.js"; +import { decompressCompresso } from "#src/sliceview/compresso/index.js"; registerAsyncComputation(decodeCompresso, async (data: Uint8Array) => { const result = await decompressCompresso(data); diff --git a/src/async_computation/decode_compresso_request.ts b/src/async_computation/decode_compresso_request.ts index 825a2d9f1a..3c36ad518b 100644 --- a/src/async_computation/decode_compresso_request.ts +++ b/src/async_computation/decode_compresso_request.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { asyncComputation } from "#/async_computation"; +import { asyncComputation } from "#src/async_computation/index.js"; export const decodeCompresso = asyncComputation<(data: Uint8Array) => Uint8Array>("decodeCompresso"); diff --git a/src/async_computation/decode_gzip.ts b/src/async_computation/decode_gzip.ts index 92ca037e04..f7ae456d7b 100644 --- a/src/async_computation/decode_gzip.ts +++ b/src/async_computation/decode_gzip.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { decodeGzip } from "#/async_computation/decode_gzip_request"; -import { registerAsyncComputation } from "#/async_computation/handler"; import pako from "pako"; +import { decodeGzip } from "#src/async_computation/decode_gzip_request.js"; +import { registerAsyncComputation } from "#src/async_computation/handler.js"; registerAsyncComputation(decodeGzip, async (data: Uint8Array) => { const result = pako.inflate(data); diff --git a/src/async_computation/decode_gzip_request.ts b/src/async_computation/decode_gzip_request.ts index d6d84ccb3c..91dddb6b85 100644 --- a/src/async_computation/decode_gzip_request.ts +++ b/src/async_computation/decode_gzip_request.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { asyncComputation } from "#/async_computation"; +import { asyncComputation } from "#src/async_computation/index.js"; export const decodeGzip = asyncComputation<(data: Uint8Array) => Uint8Array>("decodeGzip"); diff --git a/src/async_computation/decode_jpeg.ts b/src/async_computation/decode_jpeg.ts index f2efce08e4..d3f93ac1c8 100644 --- a/src/async_computation/decode_jpeg.ts +++ b/src/async_computation/decode_jpeg.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import { JpegDecoder } from "jpgjs"; -import { decodeJpeg } from "#/async_computation/decode_jpeg_request"; -import { registerAsyncComputation } from "#/async_computation/handler"; -import { transposeArray2d } from "#/util/array"; +import { decodeJpeg } from "#src/async_computation/decode_jpeg_request.js"; +import { registerAsyncComputation } from "#src/async_computation/handler.js"; +import { JpegDecoder } from "#src/third_party/jpgjs/jpg.js"; +import { transposeArray2d } from "#src/util/array.js"; registerAsyncComputation( decodeJpeg, diff --git a/src/async_computation/decode_jpeg_request.ts b/src/async_computation/decode_jpeg_request.ts index adebf436fd..1df020d753 100644 --- a/src/async_computation/decode_jpeg_request.ts +++ b/src/async_computation/decode_jpeg_request.ts @@ -13,8 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { asyncComputation } from "#/async_computation"; -import { DecodedImage } from "./decode_png_request"; +import type { DecodedImage } from "#src/async_computation/decode_png_request.js"; +import { asyncComputation } from "#src/async_computation/index.js"; export const decodeJpeg = asyncComputation< diff --git a/src/async_computation/decode_png.ts b/src/async_computation/decode_png.ts index 46180bc91e..bc64a2052e 100644 --- a/src/async_computation/decode_png.ts +++ b/src/async_computation/decode_png.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { decompressPng } from "#/sliceview/png"; -import { decodePng } from "#/async_computation/decode_png_request"; -import { registerAsyncComputation } from "#/async_computation/handler"; +import { decodePng } from "#src/async_computation/decode_png_request.js"; +import { registerAsyncComputation } from "#src/async_computation/handler.js"; +import { decompressPng } from "#src/sliceview/png/index.js"; registerAsyncComputation( decodePng, diff --git a/src/async_computation/decode_png_request.ts b/src/async_computation/decode_png_request.ts index 1839fe43ac..06d8001ba4 100644 --- a/src/async_computation/decode_png_request.ts +++ b/src/async_computation/decode_png_request.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { asyncComputation } from "#/async_computation"; +import { asyncComputation } from "#src/async_computation/index.js"; export interface DecodedImage { width: number; diff --git a/src/async_computation/decode_zstd.ts b/src/async_computation/decode_zstd.ts index 9ff0868fde..becdaf5901 100644 --- a/src/async_computation/decode_zstd.ts +++ b/src/async_computation/decode_zstd.ts @@ -14,13 +14,11 @@ * limitations under the License. */ -import { decodeZstd } from "#/async_computation/decode_zstd_request"; -import { registerAsyncComputation } from "#/async_computation/handler"; +import { decodeZstd } from "#src/async_computation/decode_zstd_request.js"; +import { registerAsyncComputation } from "#src/async_computation/handler.js"; registerAsyncComputation(decodeZstd, async (data: Uint8Array) => { - const { default: Zstd } = await import( - /*webpackChunkName: "zstd" */ "numcodecs/zstd" - ); + const { default: Zstd } = await import("numcodecs/zstd"); const codec = Zstd.fromConfig({ id: "blosc" }); const result = await codec.decode(data); return { value: result, transfer: [result.buffer] }; diff --git a/src/async_computation/decode_zstd_request.ts b/src/async_computation/decode_zstd_request.ts index 31e1135fe5..25c709d366 100644 --- a/src/async_computation/decode_zstd_request.ts +++ b/src/async_computation/decode_zstd_request.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { asyncComputation } from "#/async_computation"; +import { asyncComputation } from "#src/async_computation/index.js"; export const decodeZstd = asyncComputation<(data: Uint8Array) => Uint8Array>("decodeZstd"); diff --git a/src/async_computation/encode_compressed_segmentation.ts b/src/async_computation/encode_compressed_segmentation.ts index 89821805fe..276fefe43f 100644 --- a/src/async_computation/encode_compressed_segmentation.ts +++ b/src/async_computation/encode_compressed_segmentation.ts @@ -17,11 +17,11 @@ import { encodeCompressedSegmentationUint32, encodeCompressedSegmentationUint64, -} from "#/async_computation/encode_compressed_segmentation_request"; -import { registerAsyncComputation } from "#/async_computation/handler"; -import { encodeChannels as encodeChannelsUint32 } from "#/sliceview/compressed_segmentation/encode_uint32"; -import { encodeChannels as encodeChannelsUint64 } from "#/sliceview/compressed_segmentation/encode_uint64"; -import { Uint32ArrayBuilder } from "#/util/uint32array_builder"; +} from "#src/async_computation/encode_compressed_segmentation_request.js"; +import { registerAsyncComputation } from "#src/async_computation/handler.js"; +import { encodeChannels as encodeChannelsUint32 } from "#src/sliceview/compressed_segmentation/encode_uint32.js"; +import { encodeChannels as encodeChannelsUint64 } from "#src/sliceview/compressed_segmentation/encode_uint64.js"; +import { Uint32ArrayBuilder } from "#src/util/uint32array_builder.js"; const tempBuffer = new Uint32ArrayBuilder(20000); diff --git a/src/async_computation/encode_compressed_segmentation_request.ts b/src/async_computation/encode_compressed_segmentation_request.ts index 63cbbf8036..bab7e173d4 100644 --- a/src/async_computation/encode_compressed_segmentation_request.ts +++ b/src/async_computation/encode_compressed_segmentation_request.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { asyncComputation } from "#/async_computation"; +import { asyncComputation } from "#src/async_computation/index.js"; export const encodeCompressedSegmentationUint32 = asyncComputation< ( diff --git a/src/async_computation/handler.ts b/src/async_computation/handler.ts index b059877b1d..0b4b7a9647 100644 --- a/src/async_computation/handler.ts +++ b/src/async_computation/handler.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { AsyncComputationSpec } from "#/async_computation"; +import type { AsyncComputationSpec } from "#src/async_computation/index.js"; const handlers = new Map< string, diff --git a/src/async_computation/obj_mesh.ts b/src/async_computation/obj_mesh.ts index ae786705ce..be1d5e44c9 100644 --- a/src/async_computation/obj_mesh.ts +++ b/src/async_computation/obj_mesh.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import { registerAsyncComputation } from "#/async_computation/handler"; -import { parseOBJFromArrayBuffer } from "#/async_computation/obj_mesh_request"; -import { Float32ArrayBuilder } from "#/util/float32array_builder"; -import { maybeDecompressGzip } from "#/util/gzip"; -import { Uint32ArrayBuilder } from "#/util/uint32array_builder"; -import { SingleMesh } from "#/single_mesh/backend"; +import { registerAsyncComputation } from "#src/async_computation/handler.js"; +import { parseOBJFromArrayBuffer } from "#src/async_computation/obj_mesh_request.js"; +import type { SingleMesh } from "#src/single_mesh/backend.js"; +import { Float32ArrayBuilder } from "#src/util/float32array_builder.js"; +import { maybeDecompressGzip } from "#src/util/gzip.js"; +import { Uint32ArrayBuilder } from "#src/util/uint32array_builder.js"; registerAsyncComputation( parseOBJFromArrayBuffer, @@ -33,7 +33,7 @@ registerAsyncComputation( // Find vertices for (const match of text.matchAll( - /^v\s+([\-0-9\.eE]+)\s+([\-0-9\.eE]+)\s+([\-0-9\.eE]+)\s*$/gm, + /^v\s+([-0-9.eE]+)\s+([-0-9.eE]+)\s+([-0-9.eE]+)\s*$/gm, )) { vertexPositions.appendArray([ parseFloat(match[1]), diff --git a/src/async_computation/obj_mesh_request.ts b/src/async_computation/obj_mesh_request.ts index 56f596482c..5e9c9acf19 100644 --- a/src/async_computation/obj_mesh_request.ts +++ b/src/async_computation/obj_mesh_request.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { asyncComputation } from "#/async_computation"; -import { SingleMesh } from "#/single_mesh/backend"; +import { asyncComputation } from "#src/async_computation/index.js"; +import type { SingleMesh } from "#src/single_mesh/backend.js"; export const parseOBJFromArrayBuffer = asyncComputation< (buffer: ArrayBuffer) => { diff --git a/src/async_computation/request.ts b/src/async_computation/request.ts index 0a4756b409..ef159cabae 100644 --- a/src/async_computation/request.ts +++ b/src/async_computation/request.ts @@ -14,12 +14,11 @@ * limitations under the License. */ -import { AsyncComputationSpec } from "#/async_computation"; -import { CANCELED, CancellationToken } from "#/util/cancellation"; -import { WORKER_RPC_ID } from "#/worker_rpc"; -import { rpc } from "#/worker_rpc_context"; +import type { AsyncComputationSpec } from "#src/async_computation/index.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { CANCELED } from "#src/util/cancellation.js"; -const freeWorkers: (Worker | MessagePort)[] = []; +const freeWorkers: Worker[] = []; const pendingTasks = new Map< number, { msg: any; transfer: Transferable[] | undefined } @@ -39,7 +38,7 @@ const maxWorkers = : Math.min(12, navigator.hardwareConcurrency); let nextTaskId = 0; -function returnWorker(worker: Worker | MessagePort) { +function returnWorker(worker: Worker) { for (const [id, task] of pendingTasks) { pendingTasks.delete(id); worker.postMessage(task.msg, task.transfer as Transferable[]); @@ -48,21 +47,14 @@ function returnWorker(worker: Worker | MessagePort) { freeWorkers.push(worker); } -function getNewWorker(): Worker | MessagePort { - let port: Worker | MessagePort; - if (typeof Worker === "undefined") { - // On Safari, the `Worker` constructor is not available from workers. Instead, we request the - // main thread to create a worker. - const channel = new MessageChannel(); - port = channel.port2; - rpc.invoke( - WORKER_RPC_ID, - { port: channel.port1, path: "async_computation.bundle.js" }, - [channel.port1], - ); - } else { - port = new Worker("async_computation.bundle.js"); - } +function getNewWorker(): Worker { + // Note: For compatibility with multiple bundlers, a browser-compatible URL + // must be used with `new URL`, which means a Node.js subpath import like + // "#src/async_computation.bundle.js" cannot be used. + const port = new Worker( + new URL("../async_computation.bundle.js", import.meta.url), + { type: "module" }, + ); port.onmessage = (msg) => { const { id, value, error } = msg.data as { id: number; diff --git a/src/async_computation/vtk_mesh.ts b/src/async_computation/vtk_mesh.ts index 435910c56c..4031a6534e 100644 --- a/src/async_computation/vtk_mesh.ts +++ b/src/async_computation/vtk_mesh.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import { registerAsyncComputation } from "#/async_computation/handler"; -import { parseVTKFromArrayBuffer } from "#/async_computation/vtk_mesh_request"; -import { getTriangularMeshSize, parseVTK } from "#/datasource/vtk/parse"; -import { maybeDecompressGzip } from "#/util/gzip"; +import { registerAsyncComputation } from "#src/async_computation/handler.js"; +import { parseVTKFromArrayBuffer } from "#src/async_computation/vtk_mesh_request.js"; +import { getTriangularMeshSize, parseVTK } from "#src/datasource/vtk/parse.js"; +import { maybeDecompressGzip } from "#src/util/gzip.js"; registerAsyncComputation( parseVTKFromArrayBuffer, diff --git a/src/async_computation/vtk_mesh_request.ts b/src/async_computation/vtk_mesh_request.ts index 4769e0af27..015997a23c 100644 --- a/src/async_computation/vtk_mesh_request.ts +++ b/src/async_computation/vtk_mesh_request.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { asyncComputation } from "#/async_computation"; -import { TriangularMesh } from "#/datasource/vtk/parse"; +import { asyncComputation } from "#src/async_computation/index.js"; +import type { TriangularMesh } from "#src/datasource/vtk/parse.js"; export const parseVTKFromArrayBuffer = asyncComputation< (buffer: ArrayBuffer) => { diff --git a/src/axes_lines.ts b/src/axes_lines.ts index 5d0fe41d94..d281948665 100644 --- a/src/axes_lines.ts +++ b/src/axes_lines.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import { ProjectionParameters } from "#/projection_parameters"; -import { RefCounted } from "#/util/disposable"; -import { mat4 } from "#/util/geom"; -import { Buffer } from "#/webgl/buffer"; -import { GL } from "#/webgl/context"; -import { ShaderProgram } from "#/webgl/shader"; -import { trivialColorShader } from "#/webgl/trivial_shaders"; +import type { ProjectionParameters } from "#src/projection_parameters.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { mat4 } from "#src/util/geom.js"; +import { Buffer } from "#src/webgl/buffer.js"; +import type { GL } from "#src/webgl/context.js"; +import type { ShaderProgram } from "#src/webgl/shader.js"; +import { trivialColorShader } from "#src/webgl/trivial_shaders.js"; const tempMat = mat4.create(); diff --git a/src/chunk_manager/backend.ts b/src/chunk_manager/backend.ts index 7b438e5e24..4c6e7800bf 100644 --- a/src/chunk_manager/backend.ts +++ b/src/chunk_manager/backend.ts @@ -14,7 +14,11 @@ * limitations under the License. */ -import throttle from "lodash/throttle"; +import { throttle } from "lodash-es"; +import type { + ChunkSourceParametersConstructor, + LayerChunkProgressInfo, +} from "#src/chunk_manager/base.js"; import { CHUNK_LAYER_STATISTICS_RPC_ID, CHUNK_MANAGER_RPC_ID, @@ -23,40 +27,40 @@ import { ChunkDownloadStatistics, ChunkMemoryStatistics, ChunkPriorityTier, - ChunkSourceParametersConstructor, ChunkState, getChunkDownloadStatisticIndex, getChunkStateStatisticIndex, - LayerChunkProgressInfo, numChunkMemoryStatistics, numChunkStatistics, REQUEST_CHUNK_STATISTICS_RPC_ID, -} from "#/chunk_manager/base"; -import { SharedWatchableValue } from "#/shared_watchable_value"; -import { TypedArray } from "#/util/array"; -import { - CancellationToken, - CancellationTokenSource, -} from "#/util/cancellation"; -import { Borrowed, Disposable, RefCounted } from "#/util/disposable"; -import { LinkedListOperations } from "#/util/linked_list"; -import LinkedList0 from "#/util/linked_list.0"; -import LinkedList1 from "#/util/linked_list.1"; -import { StringMemoize } from "#/util/memoize"; -import { ComparisonFunction, PairingHeapOperations } from "#/util/pairing_heap"; -import PairingHeap0 from "#/util/pairing_heap.0"; -import PairingHeap1 from "#/util/pairing_heap.1"; -import { NullarySignal } from "#/util/signal"; +} from "#src/chunk_manager/base.js"; +import type { SharedWatchableValue } from "#src/shared_watchable_value.js"; +import type { TypedArray } from "#src/util/array.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { CancellationTokenSource } from "#src/util/cancellation.js"; +import type { Borrowed, Disposable } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import LinkedList0 from "#src/util/linked_list.0.js"; +import LinkedList1 from "#src/util/linked_list.1.js"; +import type { LinkedListOperations } from "#src/util/linked_list.js"; +import { StringMemoize } from "#src/util/memoize.js"; +import PairingHeap0 from "#src/util/pairing_heap.0.js"; +import PairingHeap1 from "#src/util/pairing_heap.1.js"; +import type { + ComparisonFunction, + PairingHeapOperations, +} from "#src/util/pairing_heap.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { RPC } from "#src/worker_rpc.js"; import { initializeSharedObjectCounterpart, registerPromiseRPC, registerRPC, registerSharedObject, registerSharedObjectOwner, - RPC, SharedObject, SharedObjectCounterpart, -} from "#/worker_rpc"; +} from "#src/worker_rpc.js"; const DEBUG_CHUNK_UPDATES = false; @@ -281,6 +285,7 @@ const numSourceQueueLevels = 2; * also have a frontend-part, as well as other chunk sources, such as the GenericFileSource, that * has only a backend part. */ +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export class ChunkSourceBase extends SharedObject { private listeners_ = new Map(); chunks: Map = new Map(); @@ -399,6 +404,7 @@ function updateChunkStatistics(chunk: Chunk, sign: number) { ] += sign * gpuMemoryBytes; } +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export interface ChunkSourceBase { /** * Begin downloading the specified the chunk. The returned promise should resolve when the diff --git a/src/chunk_manager/base.ts b/src/chunk_manager/base.ts index 80399c9472..81b3c912ab 100644 --- a/src/chunk_manager/base.ts +++ b/src/chunk_manager/base.ts @@ -43,11 +43,15 @@ export const numChunkStates = 8; export enum ChunkPriorityTier { FIRST_TIER = 0, + // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values FIRST_ORDERED_TIER = 0, + // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values VISIBLE = 0, PREFETCH = 1, + // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values LAST_ORDERED_TIER = 1, RECENT = 2, + // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values LAST_TIER = 2, } diff --git a/src/chunk_manager/frontend.ts b/src/chunk_manager/frontend.ts index db03f90788..bc85aea127 100644 --- a/src/chunk_manager/frontend.ts +++ b/src/chunk_manager/frontend.ts @@ -14,34 +14,36 @@ * limitations under the License. */ +import type { + ChunkSourceParametersConstructor, + LayerChunkProgressInfo, +} from "#src/chunk_manager/base.js"; import { CHUNK_LAYER_STATISTICS_RPC_ID, CHUNK_MANAGER_RPC_ID, CHUNK_QUEUE_MANAGER_RPC_ID, CHUNK_SOURCE_INVALIDATE_RPC_ID, - ChunkSourceParametersConstructor, ChunkState, - LayerChunkProgressInfo, REQUEST_CHUNK_STATISTICS_RPC_ID, -} from "#/chunk_manager/base"; -import { SharedWatchableValue } from "#/shared_watchable_value"; -import { TrackableBoolean } from "#/trackable_boolean"; -import { TrackableValue } from "#/trackable_value"; -import { CANCELED, CancellationToken } from "#/util/cancellation"; -import { Borrowed } from "#/util/disposable"; -import { stableStringify } from "#/util/json"; -import { StringMemoize } from "#/util/memoize"; -import { getObjectId } from "#/util/object_id"; -import { NullarySignal } from "#/util/signal"; -import { GL } from "#/webgl/context"; +} from "#src/chunk_manager/base.js"; +import { SharedWatchableValue } from "#src/shared_watchable_value.js"; +import { TrackableBoolean } from "#src/trackable_boolean.js"; +import { TrackableValue } from "#src/trackable_value.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { CANCELED } from "#src/util/cancellation.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { stableStringify } from "#src/util/json.js"; +import { StringMemoize } from "#src/util/memoize.js"; +import { getObjectId } from "#src/util/object_id.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { GL } from "#src/webgl/context.js"; +import type { RPC, RPCPromise } from "#src/worker_rpc.js"; import { registerPromiseRPC, registerRPC, registerSharedObjectOwner, - RPC, - RPCPromise, SharedObject, -} from "#/worker_rpc"; +} from "#src/worker_rpc.js"; const DEBUG_CHUNK_UPDATES = false; @@ -380,7 +382,7 @@ registerRPC(CHUNK_LAYER_STATISTICS_RPC_ID, function (x) { chunkManager.layerChunkStatisticsUpdated.dispatch(); }); -export type GettableChunkSource = SharedObject & { OPTIONS: {}; key: any }; +export type GettableChunkSource = SharedObject & { OPTIONS: object; key: any }; export interface ChunkSourceConstructor< T extends GettableChunkSource = GettableChunkSource, @@ -428,8 +430,9 @@ export interface ChunkRequesterState { (chunk: Chunk): void; } +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export class ChunkSource extends SharedObject { - OPTIONS: {}; + OPTIONS: object; chunks = new Map(); chunkRequesters: Map | undefined; @@ -443,7 +446,7 @@ export class ChunkSource extends SharedObject { constructor( public chunkManager: Borrowed, - _options: {} = {}, + _options: object = {}, ) { super(); } @@ -483,11 +486,12 @@ export class ChunkSource extends SharedObject { this.rpc!.invoke(CHUNK_SOURCE_INVALIDATE_RPC_ID, { id: this.rpcId }); } - static encodeOptions(_options: {}): { [key: string]: any } { + static encodeOptions(_options: object): { [key: string]: any } { return {}; } } +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export interface ChunkSource { key: any; } diff --git a/src/chunk_manager/generic_file_source.ts b/src/chunk_manager/generic_file_source.ts index c2bc1848b7..6a90579489 100644 --- a/src/chunk_manager/generic_file_source.ts +++ b/src/chunk_manager/generic_file_source.ts @@ -19,22 +19,21 @@ * Provides a simple way to request a file on the backend with priority integration. */ -import { Chunk, ChunkManager, ChunkSourceBase } from "#/chunk_manager/backend"; -import { ChunkPriorityTier, ChunkState } from "#/chunk_manager/base"; +import type { ChunkManager } from "#src/chunk_manager/backend.js"; +import { Chunk, ChunkSourceBase } from "#src/chunk_manager/backend.js"; +import { ChunkPriorityTier, ChunkState } from "#src/chunk_manager/base.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; import { CANCELED, - CancellationToken, makeCancelablePromise, MultipleConsumerCancellationTokenSource, -} from "#/util/cancellation"; -import { Borrowed, Owned } from "#/util/disposable"; -import { responseArrayBuffer } from "#/util/http_request"; -import { stableStringify } from "#/util/json"; -import { getObjectId } from "#/util/object_id"; -import { - cancellableFetchSpecialOk, - SpecialProtocolCredentialsProvider, -} from "#/util/special_protocol_request"; +} from "#src/util/cancellation.js"; +import type { Borrowed, Owned } from "#src/util/disposable.js"; +import { responseArrayBuffer } from "#src/util/http_request.js"; +import { stableStringify } from "#src/util/json.js"; +import { getObjectId } from "#src/util/object_id.js"; +import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; +import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; export type PriorityGetter = () => { priorityTier: ChunkPriorityTier; diff --git a/src/chunk_worker.bundle.js b/src/chunk_worker.bundle.js new file mode 100644 index 0000000000..159e988adc --- /dev/null +++ b/src/chunk_worker.bundle.js @@ -0,0 +1,11 @@ +// Note: This file uses ".js" rather than ".ts" extension because we cannot rely +// on Node.js subpath imports to translate paths for Workers since those paths +// must be valid for use in `new URL` with multiple bundlers. +import "#src/shared_watchable_value.js"; +import "#src/chunk_manager/backend.js"; +import "#src/sliceview/backend.js"; +import "#src/perspective_view/backend.js"; +import "#src/volume_rendering/backend.js"; +import "#src/annotation/backend.js"; +import "#src/datasource/enabled_backend_modules.js"; +import "#src/worker_rpc_context.js"; diff --git a/src/coordinate_transform.spec.ts b/src/coordinate_transform.spec.ts index 06a1ef1d18..fa60dbcc8e 100644 --- a/src/coordinate_transform.spec.ts +++ b/src/coordinate_transform.spec.ts @@ -14,6 +14,8 @@ * limitations under the License. */ +import { describe, it, expect } from "vitest"; +import type { TransformedBoundingBox } from "#src/coordinate_transform.js"; import { transformedBoundingBoxesEqual, CoordinateSpaceCombiner, @@ -23,11 +25,10 @@ import { makeCoordinateSpace, makeIdentityTransform, newDimensionId, - TransformedBoundingBox, WatchableCoordinateSpaceTransform, coordinateTransformSpecificationFromJson, -} from "#/coordinate_transform"; -import { WatchableValue } from "#/trackable_value"; +} from "#src/coordinate_transform.js"; +import { WatchableValue } from "#src/trackable_value.js"; describe("newDimensionId", () => { it("returns unique values", () => { @@ -75,11 +76,11 @@ describe("boundingBoxesEqual", () => { boxes.forEach((x, xIndex) => { boxes.forEach((y, yIndex) => { - expect(transformedBoundingBoxesEqual(x, y)).toBe( - x === y, + expect( + transformedBoundingBoxesEqual(x, y), `${xIndex}: ${JSON.stringify(x)}, ` + `${yIndex}: ${JSON.stringify(y)}`, - ); + ).toBe(x === y); }); }); }); @@ -147,7 +148,8 @@ describe("CoordinateSpaceCombiner", () => { emptyInvalidCoordinateSpace, combiner.combined.value, ), - ).toBeTruthy(combiner.combined.value); + JSON.stringify(combiner.combined.value), + ).toBeTruthy(); }); it("handle renames", () => { diff --git a/src/coordinate_transform.ts b/src/coordinate_transform.ts index e583e03356..99a9fdc07c 100644 --- a/src/coordinate_transform.ts +++ b/src/coordinate_transform.ts @@ -14,19 +14,20 @@ * limitations under the License. */ -import { WatchableValue, WatchableValueInterface } from "#/trackable_value"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { WatchableValue } from "#src/trackable_value.js"; +import type { TypedArray } from "#src/util/array.js"; import { arraysEqual, arraysEqualWithPredicate, getInsertPermutation, - TypedArray, -} from "#/util/array"; +} from "#src/util/array.js"; import { getDependentTransformInputDimensions, mat4, quat, vec3, -} from "#/util/geom"; +} from "#src/util/geom.js"; import { expectArray, parseArray, @@ -40,12 +41,16 @@ import { verifyOptionalObjectProperty, verifyString, verifyStringArray, -} from "#/util/json"; -import * as matrix from "#/util/matrix"; -import { scaleByExp10, supportedUnits, unitFromJson } from "#/util/si_units"; -import { NullarySignal } from "#/util/signal"; -import { Trackable } from "#/util/trackable"; -import * as vector from "#/util/vector"; +} from "#src/util/json.js"; +import * as matrix from "#src/util/matrix.js"; +import { + scaleByExp10, + supportedUnits, + unitFromJson, +} from "#src/util/si_units.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { Trackable } from "#src/util/trackable.js"; +import * as vector from "#src/util/vector.js"; export type DimensionId = number; diff --git a/src/credentials_provider/chunk_source_frontend.ts b/src/credentials_provider/chunk_source_frontend.ts index 391af42fc1..e0dfb35a36 100644 --- a/src/credentials_provider/chunk_source_frontend.ts +++ b/src/credentials_provider/chunk_source_frontend.ts @@ -18,15 +18,15 @@ * @file Facilities to simplify defining subclasses of ChunkSource that use a CredentialsProvider. */ -import { +import type { ChunkManager, ChunkSourceConstructor, GettableChunkSource, -} from "#/chunk_manager/frontend"; -import { MaybeOptionalCredentialsProvider } from "#/credentials_provider"; -import { SharedCredentialsProvider } from "#/credentials_provider/shared"; -import { getObjectId } from "#/util/object_id"; -import { RPC } from "#/worker_rpc"; +} from "#src/chunk_manager/frontend.js"; +import type { MaybeOptionalCredentialsProvider } from "#src/credentials_provider/index.js"; +import { SharedCredentialsProvider } from "#src/credentials_provider/shared.js"; +import { getObjectId } from "#src/util/object_id.js"; +import type { RPC } from "#src/worker_rpc.js"; /** * Returns a counterpart ref to be sent to the backend to retrieve a diff --git a/src/credentials_provider/default_manager.ts b/src/credentials_provider/default_manager.ts index 9f03e225dd..dea60b764c 100644 --- a/src/credentials_provider/default_manager.ts +++ b/src/credentials_provider/default_manager.ts @@ -18,7 +18,7 @@ * @file CredentialsManager for globally registering a CredentialsProvider */ -import { CachingMapBasedCredentialsManager } from "#/credentials_provider"; +import { CachingMapBasedCredentialsManager } from "#src/credentials_provider/index.js"; export const defaultCredentialsManager = new CachingMapBasedCredentialsManager(); diff --git a/src/credentials_provider/http_request.ts b/src/credentials_provider/http_request.ts index 35571a19ee..825dd5b705 100644 --- a/src/credentials_provider/http_request.ts +++ b/src/credentials_provider/http_request.ts @@ -14,21 +14,18 @@ * limitations under the License. */ -import { +import type { CredentialsProvider, CredentialsWithGeneration, -} from "#/credentials_provider"; -import { - CancellationToken, - throwIfCanceled, - uncancelableToken, -} from "#/util/cancellation"; +} from "#src/credentials_provider/index.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { throwIfCanceled, uncancelableToken } from "#src/util/cancellation.js"; +import type { ResponseTransform } from "#src/util/http_request.js"; import { cancellableFetchOk, HttpError, pickDelay, - ResponseTransform, -} from "#/util/http_request"; +} from "#src/util/http_request.js"; const maxCredentialsAttempts = 3; diff --git a/src/credentials_provider/index.ts b/src/credentials_provider/index.ts index 8a189df15b..c0aab02d6f 100644 --- a/src/credentials_provider/index.ts +++ b/src/credentials_provider/index.ts @@ -18,12 +18,11 @@ * @file Generic facility for providing authentication/authorization credentials. */ -import { - CancellationToken, - MultipleConsumerCancellationTokenSource, -} from "#/util/cancellation"; -import { Owned, RefCounted } from "#/util/disposable"; -import { StringMemoize } from "#/util/memoize"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { MultipleConsumerCancellationTokenSource } from "#src/util/cancellation.js"; +import type { Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { StringMemoize } from "#src/util/memoize.js"; /** * Wraps an arbitrary JSON credentials object with a generation number. diff --git a/src/credentials_provider/oauth2.ts b/src/credentials_provider/oauth2.ts index 50de906f18..444b5fd95a 100644 --- a/src/credentials_provider/oauth2.ts +++ b/src/credentials_provider/oauth2.ts @@ -14,10 +14,12 @@ * limitations under the License. */ -import { CredentialsProvider } from "#/credentials_provider"; -import { fetchWithCredentials } from "#/credentials_provider/http_request"; -import { CancellationToken, uncancelableToken } from "#/util/cancellation"; -import { cancellableFetchOk, ResponseTransform } from "#/util/http_request"; +import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; +import type { CredentialsProvider } from "#src/credentials_provider/index.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { uncancelableToken } from "#src/util/cancellation.js"; +import type { ResponseTransform } from "#src/util/http_request.js"; +import { cancellableFetchOk } from "#src/util/http_request.js"; /** * OAuth2 token diff --git a/src/credentials_provider/shared.ts b/src/credentials_provider/shared.ts index c3d2c2032d..60308ec9e6 100644 --- a/src/credentials_provider/shared.ts +++ b/src/credentials_provider/shared.ts @@ -18,23 +18,22 @@ * @file Permits a CredentialsProvider to be shared with another thread. */ +import type { + CredentialsProvider, + CredentialsWithGeneration, +} from "#src/credentials_provider/index.js"; import { CREDENTIALS_PROVIDER_RPC_ID, CREDENTIALS_PROVIDER_GET_RPC_ID, -} from "#/credentials_provider/shared_common"; -import { - CredentialsProvider, - CredentialsWithGeneration, -} from "#/credentials_provider"; -import { CancellationToken } from "#/util/cancellation"; -import { Owned } from "#/util/disposable"; +} from "#src/credentials_provider/shared_common.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import type { Owned } from "#src/util/disposable.js"; +import type { RPC, RPCPromise } from "#src/worker_rpc.js"; import { registerPromiseRPC, registerSharedObjectOwner, - RPC, - RPCPromise, SharedObject, -} from "#/worker_rpc"; +} from "#src/worker_rpc.js"; @registerSharedObjectOwner(CREDENTIALS_PROVIDER_RPC_ID) export class SharedCredentialsProvider diff --git a/src/credentials_provider/shared_counterpart.ts b/src/credentials_provider/shared_counterpart.ts index 6d11e9807b..7a9910977b 100644 --- a/src/credentials_provider/shared_counterpart.ts +++ b/src/credentials_provider/shared_counterpart.ts @@ -19,18 +19,21 @@ * another thread. */ -import { +import type { CredentialsProvider, CredentialsWithGeneration, - makeCachedCredentialsGetter, MaybeOptionalCredentialsProvider, -} from "#/credentials_provider"; +} from "#src/credentials_provider/index.js"; +import { makeCachedCredentialsGetter } from "#src/credentials_provider/index.js"; import { CREDENTIALS_PROVIDER_GET_RPC_ID, CREDENTIALS_PROVIDER_RPC_ID, -} from "#/credentials_provider/shared_common"; -import { CancellationToken } from "#/util/cancellation"; -import { registerSharedObject, SharedObjectCounterpart } from "#/worker_rpc"; +} from "#src/credentials_provider/shared_common.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { + registerSharedObject, + SharedObjectCounterpart, +} from "#src/worker_rpc.js"; @registerSharedObject(CREDENTIALS_PROVIDER_RPC_ID) export class SharedCredentialsProviderCounterpart diff --git a/src/data_panel_layout.ts b/src/data_panel_layout.ts index a478ad505c..e358468055 100644 --- a/src/data_panel_layout.ts +++ b/src/data_panel_layout.ts @@ -14,18 +14,19 @@ * limitations under the License. */ -import "#/data_panel_layout.css"; +import "#src/data_panel_layout.css"; -import debounce from "lodash/debounce"; -import { ChunkManager } from "#/chunk_manager/frontend"; -import { DisplayContext } from "#/display_context"; -import { +import { debounce } from "lodash-es"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import type { DisplayContext } from "#src/display_context.js"; +import type { LayerManager, MouseSelectionState, SelectedLayerState, TrackableDataSelectionState, -} from "#/layer"; -import * as L from "#/layout"; +} from "#src/layer/index.js"; +import * as L from "#src/layout.js"; +import type { TrackableZoomInterface } from "#src/navigation_state.js"; import { DisplayPose, LinkedOrientationState, @@ -34,38 +35,40 @@ import { LinkedZoomState, NavigationState, OrientationState, - TrackableZoomInterface, -} from "#/navigation_state"; -import { PerspectivePanel } from "#/perspective_view/panel"; -import { RenderedDataPanel } from "#/rendered_data_panel"; -import { RenderLayerRole } from "#/renderlayer"; -import { SliceView } from "#/sliceview/frontend"; -import { SliceViewerState, SliceViewPanel } from "#/sliceview/panel"; -import { TrackableBoolean } from "#/trackable_boolean"; -import { - TrackableValue, +} from "#src/navigation_state.js"; +import { PerspectivePanel } from "#src/perspective_view/panel.js"; +import type { RenderedDataPanel } from "#src/rendered_data_panel.js"; +import type { RenderLayerRole } from "#src/renderlayer.js"; +import { SliceView } from "#src/sliceview/frontend.js"; +import type { SliceViewerState } from "#src/sliceview/panel.js"; +import { SliceViewPanel } from "#src/sliceview/panel.js"; +import { TrackableBoolean } from "#src/trackable_boolean.js"; +import type { WatchableSet, WatchableValueInterface, -} from "#/trackable_value"; -import { TrackableRGB } from "#/util/color"; -import { Borrowed, Owned, RefCounted } from "#/util/disposable"; -import { removeChildren, removeFromParent } from "#/util/dom"; +} from "#src/trackable_value.js"; +import { TrackableValue } from "#src/trackable_value.js"; +import type { TrackableRGB } from "#src/util/color.js"; +import type { Borrowed, Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeChildren, removeFromParent } from "#src/util/dom.js"; import { EventActionMap, registerActionListener, -} from "#/util/event_action_map"; -import { quat } from "#/util/geom"; +} from "#src/util/event_action_map.js"; +import { quat } from "#src/util/geom.js"; import { verifyObject, verifyObjectProperty, verifyPositiveInt, -} from "#/util/json"; -import { NullarySignal } from "#/util/signal"; -import { optionallyRestoreFromJsonMember, Trackable } from "#/util/trackable"; -import { WatchableMap } from "#/util/watchable_map"; -import { VisibilityPrioritySpecification } from "#/viewer_state"; -import { DisplayDimensionsWidget } from "#/widget/display_dimensions_widget"; -import { ScaleBarOptions } from "#/widget/scale_bar"; +} from "#src/util/json.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { Trackable } from "#src/util/trackable.js"; +import { optionallyRestoreFromJsonMember } from "#src/util/trackable.js"; +import { WatchableMap } from "#src/util/watchable_map.js"; +import type { VisibilityPrioritySpecification } from "#src/viewer_state.js"; +import { DisplayDimensionsWidget } from "#src/widget/display_dimensions_widget.js"; +import type { ScaleBarOptions } from "#src/widget/scale_bar.js"; export interface SliceViewViewerState { chunkManager: ChunkManager; diff --git a/src/datasource/boss/api.ts b/src/datasource/boss/api.ts index 781c6b2339..71b3a3e88d 100644 --- a/src/datasource/boss/api.ts +++ b/src/datasource/boss/api.ts @@ -14,10 +14,12 @@ * limitations under the License. */ -import { CredentialsProvider } from "#/credentials_provider"; -import { fetchWithCredentials } from "#/credentials_provider/http_request"; -import { CancellationToken, uncancelableToken } from "#/util/cancellation"; -import { ResponseTransform, cancellableFetchOk } from "#/util/http_request"; +import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; +import type { CredentialsProvider } from "#src/credentials_provider/index.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { uncancelableToken } from "#src/util/cancellation.js"; +import type { ResponseTransform } from "#src/util/http_request.js"; +import { cancellableFetchOk } from "#src/util/http_request.js"; export type BossToken = string; diff --git a/src/datasource/boss/async_computation.ts b/src/datasource/boss/async_computation.ts new file mode 100644 index 0000000000..69e1442c3a --- /dev/null +++ b/src/datasource/boss/async_computation.ts @@ -0,0 +1,2 @@ +import "#src/async_computation/decode_jpeg.js"; +import "#src/async_computation/decode_gzip.js"; diff --git a/src/datasource/boss/backend.ts b/src/datasource/boss/backend.ts index f2fc4a9479..58d6cd40f6 100644 --- a/src/datasource/boss/backend.ts +++ b/src/datasource/boss/backend.ts @@ -14,30 +14,35 @@ * limitations under the License. */ -import { WithParameters } from "#/chunk_manager/backend"; -import { ChunkSourceParametersConstructor } from "#/chunk_manager/base"; -import { WithSharedCredentialsProviderCounterpart } from "#/credentials_provider/shared_counterpart"; -import { BossToken, fetchWithBossCredentials } from "#/datasource/boss/api"; +import { WithParameters } from "#src/chunk_manager/backend.js"; +import type { ChunkSourceParametersConstructor } from "#src/chunk_manager/base.js"; +import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; +import type { BossToken } from "#src/datasource/boss/api.js"; +import { fetchWithBossCredentials } from "#src/datasource/boss/api.js"; import { MeshSourceParameters, VolumeChunkSourceParameters, -} from "#/datasource/boss/base"; +} from "#src/datasource/boss/base.js"; +import type { FragmentChunk, ManifestChunk } from "#src/mesh/backend.js"; import { assignMeshFragmentData, decodeJsonManifestChunk, decodeTriangleVertexPositionsAndIndices, - FragmentChunk, - ManifestChunk, MeshSource, -} from "#/mesh/backend"; -import { ChunkDecoder } from "#/sliceview/backend_chunk_decoders"; -import { decodeBossNpzChunk } from "#/sliceview/backend_chunk_decoders/bossNpz"; -import { decodeJpegChunk } from "#/sliceview/backend_chunk_decoders/jpeg"; -import { VolumeChunk, VolumeChunkSource } from "#/sliceview/volume/backend"; -import { CancellationToken } from "#/util/cancellation"; -import { Endianness } from "#/util/endian"; -import { cancellableFetchOk, responseArrayBuffer } from "#/util/http_request"; -import { registerSharedObject, SharedObject } from "#/worker_rpc"; +} from "#src/mesh/backend.js"; +import { decodeBossNpzChunk } from "#src/sliceview/backend_chunk_decoders/bossNpz.js"; +import type { ChunkDecoder } from "#src/sliceview/backend_chunk_decoders/index.js"; +import { decodeJpegChunk } from "#src/sliceview/backend_chunk_decoders/jpeg.js"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { Endianness } from "#src/util/endian.js"; +import { + cancellableFetchOk, + responseArrayBuffer, +} from "#src/util/http_request.js"; +import type { SharedObject } from "#src/worker_rpc.js"; +import { registerSharedObject } from "#src/worker_rpc.js"; const chunkDecoders = new Map(); chunkDecoders.set("npz", decodeBossNpzChunk); diff --git a/src/datasource/boss/base.ts b/src/datasource/boss/base.ts index 555fd11e50..c74299a223 100644 --- a/src/datasource/boss/base.ts +++ b/src/datasource/boss/base.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { vec2 } from "#/util/geom"; +import type { vec2 } from "#src/util/geom.js"; export class BossSourceParameters { baseUrl: string; diff --git a/src/datasource/boss/credentials_provider.ts b/src/datasource/boss/credentials_provider.ts index 57ebca72c4..321899ce3f 100644 --- a/src/datasource/boss/credentials_provider.ts +++ b/src/datasource/boss/credentials_provider.ts @@ -22,16 +22,17 @@ import { CredentialsProvider, makeCredentialsGetter, -} from "#/credentials_provider"; -import { StatusMessage } from "#/status"; +} from "#src/credentials_provider/index.js"; +import redirectUrl from "#src/datasource/boss/bossauth.html?url"; +import { StatusMessage } from "#src/status.js"; import { CANCELED, CancellationTokenSource, uncancelableToken, -} from "#/util/cancellation"; -import { verifyObject, verifyString } from "#/util/json"; -import { getRandomHexString } from "#/util/random"; -import { Signal } from "#/util/signal"; +} from "#src/util/cancellation.js"; +import { verifyObject, verifyString } from "#src/util/json.js"; +import { getRandomHexString } from "#src/util/random.js"; +import { Signal } from "#src/util/signal.js"; export type BossToken = string; @@ -127,7 +128,10 @@ export function authenticateKeycloakOIDC( const url = handler.makeAuthRequestUrl({ state: state, clientId: options.clientId, - redirect_uri: new URL("bossauth.html", window.location.href).href, + redirect_uri: new URL(redirectUrl, import.meta.url).href.replace( + /\?.*$/, + "", + ), authServer: options.authServer, nonce: nonce, }); diff --git a/src/datasource/boss/frontend.ts b/src/datasource/boss/frontend.ts index 2b82b3d55a..88ad19db0f 100644 --- a/src/datasource/boss/frontend.ts +++ b/src/datasource/boss/frontend.ts @@ -19,52 +19,54 @@ * Support for The Boss (https://github.com/jhuapl-boss) web services. */ -import { makeDataBoundsBoundingBoxAnnotationSet } from "#/annotation"; -import { ChunkManager, WithParameters } from "#/chunk_manager/frontend"; +import { makeDataBoundsBoundingBoxAnnotationSet } from "#src/annotation/index.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { WithParameters } from "#src/chunk_manager/frontend.js"; import { makeCoordinateSpace, makeIdentityTransform, makeIdentityTransformedBoundingBox, -} from "#/coordinate_transform"; -import { +} from "#src/coordinate_transform.js"; +import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; +import type { CredentialsManager, CredentialsProvider, -} from "#/credentials_provider"; -import { WithCredentialsProvider } from "#/credentials_provider/chunk_source_frontend"; -import { - CompleteUrlOptions, - CompletionResult, - DataSource, - DataSourceProvider, - GetDataSourceOptions, -} from "#/datasource"; +} from "#src/credentials_provider/index.js"; +import type { BossToken } from "#src/datasource/boss/api.js"; import { - BossToken, credentialsKey, fetchWithBossCredentials, -} from "#/datasource/boss/api"; +} from "#src/datasource/boss/api.js"; import { MeshSourceParameters, VolumeChunkSourceParameters, -} from "#/datasource/boss/base"; -import { MeshSource } from "#/mesh/frontend"; +} from "#src/datasource/boss/base.js"; +import type { + CompleteUrlOptions, + CompletionResult, + DataSource, + GetDataSourceOptions, +} from "#src/datasource/index.js"; +import { DataSourceProvider } from "#src/datasource/index.js"; +import { MeshSource } from "#src/mesh/frontend.js"; +import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; +import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; import { DataType, makeDefaultVolumeChunkSpecifications, - VolumeSourceOptions, VolumeType, -} from "#/sliceview/volume/base"; +} from "#src/sliceview/volume/base.js"; import { MultiscaleVolumeChunkSource, VolumeChunkSource, -} from "#/sliceview/volume/frontend"; -import { transposeNestedArrays } from "#/util/array"; +} from "#src/sliceview/volume/frontend.js"; +import { transposeNestedArrays } from "#src/util/array.js"; import { applyCompletionOffset, getPrefixMatchesWithDescriptions, -} from "#/util/completion"; -import { vec2, vec3 } from "#/util/geom"; -import { responseJson } from "#/util/http_request"; +} from "#src/util/completion.js"; +import { vec2, vec3 } from "#src/util/geom.js"; +import { responseJson } from "#src/util/http_request.js"; import { parseArray, parseQueryStringParameters, @@ -79,8 +81,7 @@ import { verifyObjectProperty, verifyOptionalString, verifyString, -} from "#/util/json"; -import { SliceViewSingleResolutionSource } from "#/sliceview/frontend"; +} from "#src/util/json.js"; class BossVolumeChunkSource extends WithParameters( WithCredentialsProvider()(VolumeChunkSource), @@ -492,7 +493,7 @@ export class BossMultiscaleVolumeChunkSource extends MultiscaleVolumeChunkSource } } -const pathPattern = /^([^\/?]+)\/([^\/?]+)(?:\/([^\/?]+))?(?:\?(.*))?$/; +const pathPattern = /^([^/?]+)\/([^/?]+)(?:\/([^/?]+))?(?:\?(.*))?$/; export function getExperimentInfo( chunkManager: ChunkManager, @@ -732,7 +733,7 @@ export function getDataSource( ); } -const urlPattern = /^((?:http|https):\/\/[^\/?]+)\/(.*)$/; +const urlPattern = /^((?:http|https):\/\/[^/?]+)\/(.*)$/; export function getCollections( chunkManager: ChunkManager, @@ -810,7 +811,7 @@ export function collectionExperimentChannelCompleter( path: string, ): Promise { const channelMatch = path.match( - /^(?:([^\/]+)(?:\/?([^\/]*)(?:\/?([^\/]*)(?:\/?([^\/]*)?))?)?)?$/, + /^(?:([^/]+)(?:\/?([^/]*)(?:\/?([^/]*)(?:\/?([^/]*)?))?)?)?$/, ); if (channelMatch === null) { // URL has incorrect format, don't return any results. @@ -879,7 +880,7 @@ export function collectionExperimentChannelCompleter( } function getAuthServer(endpoint: string): string { - const baseHostName = endpoint.match(/^(?:https:\/\/[^.]+([^\/]+))/); + const baseHostName = endpoint.match(/^(?:https:\/\/[^.]+([^/]+))/); if (baseHostName === null) { throw new Error( `Unable to construct auth server hostname from base hostname ${endpoint}.`, diff --git a/src/datasource/boss/register_credentials_provider.ts b/src/datasource/boss/register_credentials_provider.ts index f0678fe717..fcdbe1eeac 100644 --- a/src/datasource/boss/register_credentials_provider.ts +++ b/src/datasource/boss/register_credentials_provider.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { defaultCredentialsManager } from "#/credentials_provider/default_manager"; -import { credentialsKey } from "#/datasource/boss/api"; -import { BossCredentialsProvider } from "#/datasource/boss/credentials_provider"; +import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { credentialsKey } from "#src/datasource/boss/api.js"; +import { BossCredentialsProvider } from "#src/datasource/boss/credentials_provider.js"; defaultCredentialsManager.register( credentialsKey, diff --git a/src/datasource/boss/register_default.ts b/src/datasource/boss/register_default.ts index a4a6f59f38..399f13a1a5 100644 --- a/src/datasource/boss/register_default.ts +++ b/src/datasource/boss/register_default.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { BossDataSource } from "#/datasource/boss/frontend"; -import { registerProvider } from "#/datasource/default_provider"; +import { BossDataSource } from "#src/datasource/boss/frontend.js"; +import { registerProvider } from "#src/datasource/default_provider.js"; registerProvider( "boss", diff --git a/src/datasource/brainmaps/api.ts b/src/datasource/brainmaps/api.ts index 4810d15d56..4809b30b57 100644 --- a/src/datasource/brainmaps/api.ts +++ b/src/datasource/brainmaps/api.ts @@ -14,13 +14,12 @@ * limitations under the License. */ -import { CredentialsProvider } from "#/credentials_provider"; -import { - fetchWithOAuth2Credentials, - OAuth2Credentials, -} from "#/credentials_provider/oauth2"; -import { CancellationToken, uncancelableToken } from "#/util/cancellation"; -import { responseArrayBuffer, responseJson } from "#/util/http_request"; +import type { CredentialsProvider } from "#src/credentials_provider/index.js"; +import type { OAuth2Credentials } from "#src/credentials_provider/oauth2.js"; +import { fetchWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { uncancelableToken } from "#src/util/cancellation.js"; +import { responseArrayBuffer, responseJson } from "#src/util/http_request.js"; export type { OAuth2Credentials }; diff --git a/src/datasource/brainmaps/async_computation.ts b/src/datasource/brainmaps/async_computation.ts new file mode 100644 index 0000000000..6ffe0e5ecb --- /dev/null +++ b/src/datasource/brainmaps/async_computation.ts @@ -0,0 +1 @@ +import "#src/async_computation/decode_jpeg.js"; diff --git a/src/datasource/brainmaps/backend.ts b/src/datasource/brainmaps/backend.ts index 201871e552..15f29e8a13 100644 --- a/src/datasource/brainmaps/backend.ts +++ b/src/datasource/brainmaps/backend.ts @@ -14,70 +14,74 @@ * limitations under the License. */ -import { - Annotation, - AnnotationId, - AnnotationSerializer, - AnnotationType, - makeAnnotationPropertySerializers, -} from "#/annotation"; -import { +import type { AnnotationGeometryChunk, + AnnotationMetadataChunk, + AnnotationSubsetGeometryChunk, +} from "#src/annotation/backend.js"; +import { AnnotationGeometryChunkSourceBackend, AnnotationGeometryData, - AnnotationMetadataChunk, AnnotationSource, - AnnotationSubsetGeometryChunk, -} from "#/annotation/backend"; -import { WithParameters } from "#/chunk_manager/backend"; -import { ChunkSourceParametersConstructor } from "#/chunk_manager/base"; -import { CredentialsProvider } from "#/credentials_provider"; -import { WithSharedCredentialsProviderCounterpart } from "#/credentials_provider/shared_counterpart"; +} from "#src/annotation/backend.js"; +import type { Annotation, AnnotationId } from "#src/annotation/index.js"; import { + AnnotationSerializer, + AnnotationType, + makeAnnotationPropertySerializers, +} from "#src/annotation/index.js"; +import { WithParameters } from "#src/chunk_manager/backend.js"; +import type { ChunkSourceParametersConstructor } from "#src/chunk_manager/base.js"; +import type { CredentialsProvider } from "#src/credentials_provider/index.js"; +import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; +import type { BatchMeshFragment, BatchMeshFragmentPayload, BrainmapsInstance, ChangeStackAwarePayload, OAuth2Credentials, - makeRequest, SkeletonPayload, SubvolumePayload, -} from "#/datasource/brainmaps/api"; +} from "#src/datasource/brainmaps/api.js"; +import { makeRequest } from "#src/datasource/brainmaps/api.js"; +import type { ChangeSpec } from "#src/datasource/brainmaps/base.js"; import { AnnotationSourceParameters, AnnotationSpatialIndexSourceParameters, - ChangeSpec, MeshSourceParameters, MultiscaleMeshSourceParameters, SkeletonSourceParameters, VolumeChunkEncoding, VolumeSourceParameters, -} from "#/datasource/brainmaps/base"; +} from "#src/datasource/brainmaps/base.js"; +import type { + FragmentChunk, + ManifestChunk, + MultiscaleFragmentChunk, + MultiscaleManifestChunk, +} from "#src/mesh/backend.js"; import { assignMeshFragmentData, assignMultiscaleMeshFragmentData, - FragmentChunk, generateHigherOctreeLevel, - ManifestChunk, MeshSource, - MultiscaleFragmentChunk, - MultiscaleManifestChunk, MultiscaleMeshSource, -} from "#/mesh/backend"; -import { VertexPositionFormat } from "#/mesh/base"; -import { MultiscaleMeshManifest } from "#/mesh/multiscale"; +} from "#src/mesh/backend.js"; +import { VertexPositionFormat } from "#src/mesh/base.js"; +import type { MultiscaleMeshManifest } from "#src/mesh/multiscale.js"; +import type { SkeletonChunk } from "#src/skeleton/backend.js"; import { decodeSkeletonVertexPositionsAndIndices, - SkeletonChunk, SkeletonSource, -} from "#/skeleton/backend"; -import { decodeCompressedSegmentationChunk } from "#/sliceview/backend_chunk_decoders/compressed_segmentation"; -import { decodeJpegChunk } from "#/sliceview/backend_chunk_decoders/jpeg"; -import { decodeRawChunk } from "#/sliceview/backend_chunk_decoders/raw"; -import { VolumeChunk, VolumeChunkSource } from "#/sliceview/volume/backend"; -import { CancellationToken } from "#/util/cancellation"; -import { convertEndian32, Endianness } from "#/util/endian"; -import { kInfinityVec, kZeroVec, vec3, vec3Key } from "#/util/geom"; +} from "#src/skeleton/backend.js"; +import { decodeCompressedSegmentationChunk } from "#src/sliceview/backend_chunk_decoders/compressed_segmentation.js"; +import { decodeJpegChunk } from "#src/sliceview/backend_chunk_decoders/jpeg.js"; +import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { convertEndian32, Endianness } from "#src/util/endian.js"; +import { kInfinityVec, kZeroVec, vec3, vec3Key } from "#src/util/geom.js"; import { parseArray, parseFixedLengthArray, @@ -86,17 +90,18 @@ import { verifyOptionalString, verifyString, verifyStringArray, -} from "#/util/json"; -import { defaultStringCompare } from "#/util/string"; -import { Uint64 } from "#/util/uint64"; -import * as vector from "#/util/vector"; +} from "#src/util/json.js"; +import { defaultStringCompare } from "#src/util/string.js"; +import { Uint64 } from "#src/util/uint64.js"; +import * as vector from "#src/util/vector.js"; import { decodeZIndexCompressed, encodeZIndexCompressed3d, getOctreeChildIndex, zorder3LessThan, -} from "#/util/zorder"; -import { registerSharedObject, SharedObject } from "#/worker_rpc"; +} from "#src/util/zorder.js"; +import type { SharedObject } from "#src/worker_rpc.js"; +import { registerSharedObject } from "#src/worker_rpc.js"; const CHUNK_DECODERS = new Map([ [VolumeChunkEncoding.RAW, decodeRawChunk], diff --git a/src/datasource/brainmaps/base.ts b/src/datasource/brainmaps/base.ts index e91ac025a4..3620a9d9cb 100644 --- a/src/datasource/brainmaps/base.ts +++ b/src/datasource/brainmaps/base.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { BrainmapsInstance } from "#/datasource/brainmaps/api"; -import { vec3 } from "#/util/geom"; +import type { BrainmapsInstance } from "#src/datasource/brainmaps/api.js"; +import type { vec3 } from "#src/util/geom.js"; export enum VolumeChunkEncoding { RAW = 0, diff --git a/src/datasource/brainmaps/credentials_provider.ts b/src/datasource/brainmaps/credentials_provider.ts index 102bc2981a..da9f801184 100644 --- a/src/datasource/brainmaps/credentials_provider.ts +++ b/src/datasource/brainmaps/credentials_provider.ts @@ -22,7 +22,7 @@ import { GoogleOAuth2CredentialsProvider, OPENID_SCOPE, EMAIL_SCOPE, -} from "#/util/google_oauth2"; +} from "#src/util/google_oauth2.js"; const BRAINMAPS_SCOPE = "https://www.googleapis.com/auth/brainmaps"; diff --git a/src/datasource/brainmaps/frontend.ts b/src/datasource/brainmaps/frontend.ts index d94b589426..b713dad7bd 100644 --- a/src/datasource/brainmaps/frontend.ts +++ b/src/datasource/brainmaps/frontend.ts @@ -14,77 +14,82 @@ * limitations under the License. */ -import { - AnnotationType, - makeDataBoundsBoundingBoxAnnotationSet, -} from "#/annotation"; import { AnnotationGeometryChunkSource, MultiscaleAnnotationSource, -} from "#/annotation/frontend_source"; -import { ChunkManager, WithParameters } from "#/chunk_manager/frontend"; +} from "#src/annotation/frontend_source.js"; import { + AnnotationType, + makeDataBoundsBoundingBoxAnnotationSet, +} from "#src/annotation/index.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { WithParameters } from "#src/chunk_manager/frontend.js"; +import type { BoundingBox, CoordinateSpace, +} from "#src/coordinate_transform.js"; +import { makeCoordinateSpace, makeIdentityTransform, makeIdentityTransformedBoundingBox, -} from "#/coordinate_transform"; -import { CredentialsProvider } from "#/credentials_provider"; -import { WithCredentialsProvider } from "#/credentials_provider/chunk_source_frontend"; -import { - CompleteUrlOptions, - DataSource, - DataSourceProvider, - GetDataSourceOptions, -} from "#/datasource"; -import { +} from "#src/coordinate_transform.js"; +import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; +import type { CredentialsProvider } from "#src/credentials_provider/index.js"; +import type { BrainmapsCredentialsProvider, BrainmapsInstance, - makeRequest, OAuth2Credentials, -} from "#/datasource/brainmaps/api"; +} from "#src/datasource/brainmaps/api.js"; +import { makeRequest } from "#src/datasource/brainmaps/api.js"; +import type { + ChangeSpec, + MultiscaleMeshInfo, + SingleMeshInfo, +} from "#src/datasource/brainmaps/base.js"; import { AnnotationSourceParameters, AnnotationSpatialIndexSourceParameters, - ChangeSpec, MeshSourceParameters, - MultiscaleMeshInfo, MultiscaleMeshSourceParameters, - SingleMeshInfo, SkeletonSourceParameters, VolumeChunkEncoding, VolumeSourceParameters, -} from "#/datasource/brainmaps/base"; -import { VertexPositionFormat } from "#/mesh/base"; -import { MeshSource, MultiscaleMeshSource } from "#/mesh/frontend"; -import { SkeletonSource } from "#/skeleton/frontend"; +} from "#src/datasource/brainmaps/base.js"; +import type { + CompleteUrlOptions, + DataSource, + GetDataSourceOptions, +} from "#src/datasource/index.js"; +import { DataSourceProvider } from "#src/datasource/index.js"; +import { VertexPositionFormat } from "#src/mesh/base.js"; +import { MeshSource, MultiscaleMeshSource } from "#src/mesh/frontend.js"; +import { SkeletonSource } from "#src/skeleton/frontend.js"; import { ChunkLayoutPreference, makeSliceViewChunkSpecification, -} from "#/sliceview/base"; -import { SliceViewSingleResolutionSource } from "#/sliceview/frontend"; +} from "#src/sliceview/base.js"; +import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; +import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; import { DataType, makeDefaultVolumeChunkSpecifications, - VolumeSourceOptions, VolumeType, -} from "#/sliceview/volume/base"; +} from "#src/sliceview/volume/base.js"; import { MultiscaleVolumeChunkSource as GenericMultiscaleVolumeChunkSource, VolumeChunkSource, -} from "#/sliceview/volume/frontend"; -import { StatusMessage } from "#/status"; -import { transposeNestedArrays } from "#/util/array"; +} from "#src/sliceview/volume/frontend.js"; +import { StatusMessage } from "#src/status.js"; +import { transposeNestedArrays } from "#src/util/array.js"; +import type { CompletionWithDescription } from "#src/util/completion.js"; import { applyCompletionOffset, completeQueryStringParametersFromTable, - CompletionWithDescription, getPrefixMatches, getPrefixMatchesWithDescriptions, -} from "#/util/completion"; -import { Borrowed, Owned } from "#/util/disposable"; -import { mat4, vec3 } from "#/util/geom"; +} from "#src/util/completion.js"; +import type { Borrowed, Owned } from "#src/util/disposable.js"; +import { mat4, vec3 } from "#src/util/geom.js"; import { parseArray, parseQueryStringParameters, @@ -100,9 +105,9 @@ import { verifyOptionalString, verifyPositiveInt, verifyString, -} from "#/util/json"; -import { getObjectId } from "#/util/object_id"; -import { defaultStringCompare } from "#/util/string"; +} from "#src/util/json.js"; +import { getObjectId } from "#src/util/object_id.js"; +import { defaultStringCompare } from "#src/util/string.js"; class BrainmapsVolumeChunkSource extends WithParameters( WithCredentialsProvider()(VolumeChunkSource), @@ -561,7 +566,7 @@ export function parseVolumeKey(key: string): { parameters: any; } { const match = key.match( - /^([^:?\/]+:[^:?\/]+:[^:?\/]+)(?::([^:?\/]+))?(?:\/([^?]+))?(?:\?(.*))?$/, + /^([^:?/]+:[^:?/]+:[^:?/]+)(?::([^:?/]+))?(?:\/([^?]+))?(?:\?(.*))?$/, ); if (match === null) { throw new Error(`Invalid Brain Maps volume key: ${JSON.stringify(key)}.`); @@ -1117,7 +1122,7 @@ export class BrainmapsDataSource extends DataSourceProvider { async completeUrl(options: CompleteUrlOptions) { const { providerUrl } = options; const m = providerUrl.match( - /^([^:\/?]*)(?::([^:\/?]*)(?::([^:\/?]*)(?::([^:\/?]*))?(?:\/([^?]*))?(?:\?(.*))?)?)?$/, + /^([^:/?]*)(?::([^:/?]*)(?::([^:/?]*)(?::([^:/?]*))?(?:\/([^?]*))?(?:\?(.*))?)?)?$/, ); if (m === null) throw null; const [, project, dataset, volume, changestack, meshName, query] = m; diff --git a/src/datasource/brainmaps/register_credentials_provider.ts b/src/datasource/brainmaps/register_credentials_provider.ts index a4aa7d99e1..4d3035b159 100644 --- a/src/datasource/brainmaps/register_credentials_provider.ts +++ b/src/datasource/brainmaps/register_credentials_provider.ts @@ -14,13 +14,16 @@ * limitations under the License. */ -import { defaultCredentialsManager } from "#/credentials_provider/default_manager"; -import { credentialsKey } from "#/datasource/brainmaps/api"; -import { BrainmapsCredentialsProvider } from "#/datasource/brainmaps/credentials_provider"; +import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { credentialsKey } from "#src/datasource/brainmaps/api.js"; +import { BrainmapsCredentialsProvider } from "#src/datasource/brainmaps/credentials_provider.js"; -declare let BRAINMAPS_CLIENT_ID: string; +// Specifies the Google Brainmaps API oauth2 client id to use. +declare const NEUROGLANCER_BRAINMAPS_CLIENT_ID: string | undefined; -defaultCredentialsManager.register( - credentialsKey, - () => new BrainmapsCredentialsProvider(BRAINMAPS_CLIENT_ID), -); +if (typeof NEUROGLANCER_BRAINMAPS_CLIENT_ID !== "undefined") { + defaultCredentialsManager.register( + credentialsKey, + () => new BrainmapsCredentialsProvider(NEUROGLANCER_BRAINMAPS_CLIENT_ID!), + ); +} diff --git a/src/datasource/brainmaps/register_default.ts b/src/datasource/brainmaps/register_default.ts index ebe1868266..03c94c992f 100644 --- a/src/datasource/brainmaps/register_default.ts +++ b/src/datasource/brainmaps/register_default.ts @@ -14,12 +14,13 @@ * limitations under the License. */ -import { BrainmapsInstance, credentialsKey } from "#/datasource/brainmaps/api"; +import type { BrainmapsInstance } from "#src/datasource/brainmaps/api.js"; +import { credentialsKey } from "#src/datasource/brainmaps/api.js"; import { BrainmapsDataSource, productionInstance, -} from "#/datasource/brainmaps/frontend"; -import { registerProvider } from "#/datasource/default_provider"; +} from "#src/datasource/brainmaps/frontend.js"; +import { registerProvider } from "#src/datasource/default_provider.js"; registerProvider( "brainmaps", @@ -30,7 +31,7 @@ registerProvider( ), ); -declare let NEUROGLANCER_BRAINMAPS_SERVERS: +declare const NEUROGLANCER_BRAINMAPS_SERVERS: | { [key: string]: BrainmapsInstance } | undefined; diff --git a/src/datasource/deepzoom/async_computation.ts b/src/datasource/deepzoom/async_computation.ts new file mode 100644 index 0000000000..eb3df6e542 --- /dev/null +++ b/src/datasource/deepzoom/async_computation.ts @@ -0,0 +1,2 @@ +import "#src/async_computation/decode_jpeg.js"; +import "#src/async_computation/decode_png.js"; diff --git a/src/datasource/deepzoom/backend.ts b/src/datasource/deepzoom/backend.ts index c2f70c35d1..8f7cd5e5ee 100644 --- a/src/datasource/deepzoom/backend.ts +++ b/src/datasource/deepzoom/backend.ts @@ -14,24 +14,26 @@ * limitations under the License. */ -import { WithParameters } from "#/chunk_manager/backend"; -import { WithSharedCredentialsProviderCounterpart } from "#/credentials_provider/shared_counterpart"; +import { decodeJpeg } from "#src/async_computation/decode_jpeg_request.js"; +import { decodePng } from "#src/async_computation/decode_png_request.js"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import { WithParameters } from "#src/chunk_manager/backend.js"; +import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; import { ImageTileEncoding, ImageTileSourceParameters, -} from "#/datasource/deepzoom/base"; -import { VolumeChunk, VolumeChunkSource } from "#/sliceview/volume/backend"; -import { CancellationToken } from "#/util/cancellation"; -import { isNotFoundError, responseArrayBuffer } from "#/util/http_request"; +} from "#src/datasource/deepzoom/base.js"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; +import { transposeArray2d } from "#src/util/array.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; import { - cancellableFetchSpecialOk, - SpecialProtocolCredentials, -} from "#/util/special_protocol_request"; -import { registerSharedObject } from "#/worker_rpc"; -import { decodeJpeg } from "#/async_computation/decode_jpeg_request"; -import { decodePng } from "#/async_computation/decode_png_request"; -import { requestAsyncComputation } from "#/async_computation/request"; -import { transposeArray2d } from "#/util/array"; + isNotFoundError, + responseArrayBuffer, +} from "#src/util/http_request.js"; +import type { SpecialProtocolCredentials } from "#src/util/special_protocol_request.js"; +import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; +import { registerSharedObject } from "#src/worker_rpc.js"; /* This is enough if support for these aren't needed: * - Firefox before 105 (OffscreenCanvas, 2022-09-20) diff --git a/src/datasource/deepzoom/frontend.ts b/src/datasource/deepzoom/frontend.ts index 437b48593a..d91f269dec 100644 --- a/src/datasource/deepzoom/frontend.ts +++ b/src/datasource/deepzoom/frontend.ts @@ -14,62 +14,67 @@ * limitations under the License. */ -import { makeDataBoundsBoundingBoxAnnotationSet } from "#/annotation"; -import { ChunkManager, WithParameters } from "#/chunk_manager/frontend"; -import { +import { makeDataBoundsBoundingBoxAnnotationSet } from "#src/annotation/index.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { WithParameters } from "#src/chunk_manager/frontend.js"; +import type { BoundingBox, CoordinateSpace, +} from "#src/coordinate_transform.js"; +import { makeCoordinateSpace, makeIdentityTransform, makeIdentityTransformedBoundingBox, -} from "#/coordinate_transform"; -import { WithCredentialsProvider } from "#/credentials_provider/chunk_source_frontend"; +} from "#src/coordinate_transform.js"; +import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; import { + ImageTileEncoding, + ImageTileSourceParameters, +} from "#src/datasource/deepzoom/base.js"; +import { responseText } from "#src/datasource/dvid/api.js"; +import type { CompleteUrlOptions, ConvertLegacyUrlOptions, DataSource, - DataSourceProvider, DataSubsourceEntry, GetDataSourceOptions, NormalizeUrlOptions, -} from "#/datasource"; -import { - ImageTileEncoding, - ImageTileSourceParameters, -} from "#/datasource/deepzoom/base"; -import { responseText } from "#/datasource/dvid/api"; +} from "#src/datasource/index.js"; +import { DataSourceProvider } from "#src/datasource/index.js"; import { parseProviderUrl, resolvePath, unparseProviderUrl, -} from "#/datasource/precomputed/frontend"; -import { SliceViewSingleResolutionSource } from "#/sliceview/frontend"; +} from "#src/datasource/precomputed/frontend.js"; +import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; +import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; import { makeDefaultVolumeChunkSpecifications, - VolumeSourceOptions, VolumeType, -} from "#/sliceview/volume/base"; +} from "#src/sliceview/volume/base.js"; import { MultiscaleVolumeChunkSource, VolumeChunkSource, -} from "#/sliceview/volume/frontend"; -import { transposeNestedArrays } from "#/util/array"; -import { DataType } from "#/util/data_type"; -import { completeHttpPath } from "#/util/http_path_completion"; +} from "#src/sliceview/volume/frontend.js"; +import { transposeNestedArrays } from "#src/util/array.js"; +import { DataType } from "#src/util/data_type.js"; +import { completeHttpPath } from "#src/util/http_path_completion.js"; import { verifyEnumString, verifyInt, verifyObject, verifyPositiveInt, verifyString, -} from "#/util/json"; -import { getObjectId } from "#/util/object_id"; +} from "#src/util/json.js"; +import { getObjectId } from "#src/util/object_id.js"; +import type { + SpecialProtocolCredentials, + SpecialProtocolCredentialsProvider, +} from "#src/util/special_protocol_request.js"; import { cancellableFetchSpecialOk, parseSpecialUrl, - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#/util/special_protocol_request"; +} from "#src/util/special_protocol_request.js"; /*export*/ class DeepzoomImageTileSource extends WithParameters( WithCredentialsProvider()(VolumeChunkSource), diff --git a/src/datasource/deepzoom/register_default.ts b/src/datasource/deepzoom/register_default.ts index 3b1be8b18d..eb9c8a387d 100644 --- a/src/datasource/deepzoom/register_default.ts +++ b/src/datasource/deepzoom/register_default.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { DeepzoomDataSource } from "#/datasource/deepzoom/frontend"; -import { registerProvider } from "#/datasource/default_provider"; +import { DeepzoomDataSource } from "#src/datasource/deepzoom/frontend.js"; +import { registerProvider } from "#src/datasource/default_provider.js"; registerProvider("deepzoom", () => new DeepzoomDataSource()); diff --git a/src/datasource/default_provider.ts b/src/datasource/default_provider.ts index 2542d2a1f7..bc72938543 100644 --- a/src/datasource/default_provider.ts +++ b/src/datasource/default_provider.ts @@ -18,9 +18,10 @@ * @file Facility for registering default data sources. */ -import { CredentialsManager } from "#/credentials_provider"; -import { DataSourceProvider, DataSourceProviderRegistry } from "#/datasource"; -import { Owned } from "#/util/disposable"; +import type { CredentialsManager } from "#src/credentials_provider/index.js"; +import type { DataSourceProvider } from "#src/datasource/index.js"; +import { DataSourceProviderRegistry } from "#src/datasource/index.js"; +import type { Owned } from "#src/util/disposable.js"; export interface ProviderOptions { credentialsManager: CredentialsManager; @@ -38,7 +39,11 @@ export function registerProvider(name: string, factory: ProviderFactory) { export function getDefaultDataSourceProvider(options: ProviderOptions) { const provider = new DataSourceProviderRegistry(options.credentialsManager); for (const [name, factory] of providerFactories) { - provider.register(name, factory(options)); + try { + provider.register(name, factory(options)); + } catch (e) { + console.warn(`Skipping ${name} data source: ${e}`); + } } return provider; } diff --git a/src/datasource/dvid/api.ts b/src/datasource/dvid/api.ts index 39ad517af7..731c2c2846 100644 --- a/src/datasource/dvid/api.ts +++ b/src/datasource/dvid/api.ts @@ -18,15 +18,16 @@ * limitations under the License. */ -import { CredentialsProvider } from "#/credentials_provider"; -import { fetchWithCredentials } from "#/credentials_provider/http_request"; -import { CancellationToken, uncancelableToken } from "#/util/cancellation"; +import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; +import type { CredentialsProvider } from "#src/credentials_provider/index.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { uncancelableToken } from "#src/util/cancellation.js"; +import type { ResponseTransform } from "#src/util/http_request.js"; import { cancellableFetchOk, responseArrayBuffer, responseJson, - ResponseTransform, -} from "#/util/http_request"; +} from "#src/util/http_request.js"; export interface DVIDToken { // If token is undefined, it indicates anonymous credentials that may be retried. diff --git a/src/datasource/dvid/async_computation.ts b/src/datasource/dvid/async_computation.ts new file mode 100644 index 0000000000..6ffe0e5ecb --- /dev/null +++ b/src/datasource/dvid/async_computation.ts @@ -0,0 +1 @@ +import "#src/async_computation/decode_jpeg.js"; diff --git a/src/datasource/dvid/backend.ts b/src/datasource/dvid/backend.ts index ae4ba4fb0f..94d8ca0311 100644 --- a/src/datasource/dvid/backend.ts +++ b/src/datasource/dvid/backend.ts @@ -14,36 +14,38 @@ * limitations under the License. */ -import { WithParameters } from "#/chunk_manager/backend"; +import { WithParameters } from "#src/chunk_manager/backend.js"; +import type { ChunkSourceParametersConstructor } from "#src/chunk_manager/base.js"; +import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; +import type { DVIDToken } from "#src/datasource/dvid/api.js"; +import { + DVIDInstance, + makeRequestWithCredentials, + appendQueryStringForDvid, +} from "#src/datasource/dvid/api.js"; import { MeshSourceParameters, SkeletonSourceParameters, VolumeChunkEncoding, VolumeChunkSourceParameters, -} from "#/datasource/dvid/base"; +} from "#src/datasource/dvid/base.js"; +import type { FragmentChunk, ManifestChunk } from "#src/mesh/backend.js"; import { assignMeshFragmentData, decodeTriangleVertexPositionsAndIndices, - FragmentChunk, - ManifestChunk, MeshSource, -} from "#/mesh/backend"; -import { SkeletonChunk, SkeletonSource } from "#/skeleton/backend"; -import { decodeSwcSkeletonChunk } from "#/skeleton/decode_swc_skeleton"; -import { decodeCompressedSegmentationChunk } from "#/sliceview/backend_chunk_decoders/compressed_segmentation"; -import { decodeJpegChunk } from "#/sliceview/backend_chunk_decoders/jpeg"; -import { VolumeChunk, VolumeChunkSource } from "#/sliceview/volume/backend"; -import { CancellationToken } from "#/util/cancellation"; -import { Endianness } from "#/util/endian"; -import { registerSharedObject, SharedObject } from "#/worker_rpc"; -import { ChunkSourceParametersConstructor } from "#/chunk_manager/base"; -import { WithSharedCredentialsProviderCounterpart } from "#/credentials_provider/shared_counterpart"; -import { - DVIDInstance, - DVIDToken, - makeRequestWithCredentials, - appendQueryStringForDvid, -} from "#/datasource/dvid/api"; +} from "#src/mesh/backend.js"; +import type { SkeletonChunk } from "#src/skeleton/backend.js"; +import { SkeletonSource } from "#src/skeleton/backend.js"; +import { decodeSwcSkeletonChunk } from "#src/skeleton/decode_swc_skeleton.js"; +import { decodeCompressedSegmentationChunk } from "#src/sliceview/backend_chunk_decoders/compressed_segmentation.js"; +import { decodeJpegChunk } from "#src/sliceview/backend_chunk_decoders/jpeg.js"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { Endianness } from "#src/util/endian.js"; +import type { SharedObject } from "#src/worker_rpc.js"; +import { registerSharedObject } from "#src/worker_rpc.js"; function DVIDSource< Parameters, diff --git a/src/datasource/dvid/credentials_provider.ts b/src/datasource/dvid/credentials_provider.ts index bc6650cf1e..24362dfa2b 100644 --- a/src/datasource/dvid/credentials_provider.ts +++ b/src/datasource/dvid/credentials_provider.ts @@ -22,15 +22,16 @@ import { AnonymousFirstCredentialsProvider, CredentialsProvider, makeCredentialsGetter, -} from "#/credentials_provider"; -import { StatusMessage } from "#/status"; +} from "#src/credentials_provider/index.js"; +import type { DVIDToken } from "#src/datasource/dvid/api.js"; +import { responseText } from "#src/datasource/dvid/api.js"; +import { StatusMessage } from "#src/status.js"; import { CANCELED, CancellationTokenSource, uncancelableToken, -} from "#/util/cancellation"; -import { cancellableFetchOk } from "#/util/http_request"; -import { DVIDToken, responseText } from "#/datasource/dvid/api"; +} from "#src/util/cancellation.js"; +import { cancellableFetchOk } from "#src/util/http_request.js"; async function getAuthToken( authServer: string, @@ -78,7 +79,7 @@ class BaseDVIDCredentialsProvider extends CredentialsProvider { status.element.appendChild(button); button.addEventListener("click", () => { // In the current DVID setup, https://flyemlogin. is expected for the login server - const match = authServer.match(/^[^\/]+\/\/[^\/\.]+\.([^\/]+)/); + const match = authServer.match(/^[^/]+\/\/[^/.]+\.([^/]+)/); if (match) { const loginServer = `https://flyemlogin.${match[1]}/login`; window.alert( diff --git a/src/datasource/dvid/frontend.ts b/src/datasource/dvid/frontend.ts index 09f2c814e3..9121f80821 100644 --- a/src/datasource/dvid/frontend.ts +++ b/src/datasource/dvid/frontend.ts @@ -19,58 +19,59 @@ * Support for DVID (https://github.com/janelia-flyem/dvid) servers. */ -import { makeDataBoundsBoundingBoxAnnotationSet } from "#/annotation"; -import { ChunkManager, WithParameters } from "#/chunk_manager/frontend"; +import { makeDataBoundsBoundingBoxAnnotationSet } from "#src/annotation/index.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { WithParameters } from "#src/chunk_manager/frontend.js"; +import type { BoundingBox } from "#src/coordinate_transform.js"; import { - BoundingBox, makeCoordinateSpace, makeIdentityTransform, makeIdentityTransformedBoundingBox, -} from "#/coordinate_transform"; -import { +} from "#src/coordinate_transform.js"; +import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; +import type { CredentialsManager, CredentialsProvider, -} from "#/credentials_provider"; -import { WithCredentialsProvider } from "#/credentials_provider/chunk_source_frontend"; -import { - CompleteUrlOptions, - CompletionResult, - DataSource, - DataSourceProvider, - GetDataSourceOptions, -} from "#/datasource"; +} from "#src/credentials_provider/index.js"; +import type { DVIDToken } from "#src/datasource/dvid/api.js"; import { credentialsKey, - DVIDToken, makeRequestWithCredentials, -} from "#/datasource/dvid/api"; +} from "#src/datasource/dvid/api.js"; +import type { DVIDSourceParameters } from "#src/datasource/dvid/base.js"; import { - DVIDSourceParameters, MeshSourceParameters, SkeletonSourceParameters, VolumeChunkEncoding, VolumeChunkSourceParameters, -} from "#/datasource/dvid/base"; -import { MeshSource } from "#/mesh/frontend"; -import { SkeletonSource } from "#/skeleton/frontend"; -import { SliceViewSingleResolutionSource } from "#/sliceview/frontend"; +} from "#src/datasource/dvid/base.js"; +import type { + CompleteUrlOptions, + CompletionResult, + DataSource, + GetDataSourceOptions, +} from "#src/datasource/index.js"; +import { DataSourceProvider } from "#src/datasource/index.js"; +import { MeshSource } from "#src/mesh/frontend.js"; +import { SkeletonSource } from "#src/skeleton/frontend.js"; +import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; +import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; import { DataType, makeDefaultVolumeChunkSpecifications, - VolumeSourceOptions, VolumeType, -} from "#/sliceview/volume/base"; +} from "#src/sliceview/volume/base.js"; import { MultiscaleVolumeChunkSource, VolumeChunkSource, -} from "#/sliceview/volume/frontend"; -import { StatusMessage } from "#/status"; -import { transposeNestedArrays } from "#/util/array"; +} from "#src/sliceview/volume/frontend.js"; +import { StatusMessage } from "#src/status.js"; +import { transposeNestedArrays } from "#src/util/array.js"; import { applyCompletionOffset, getPrefixMatchesWithDescriptions, -} from "#/util/completion"; -import { mat4, vec3 } from "#/util/geom"; +} from "#src/util/completion.js"; +import { mat4, vec3 } from "#src/util/geom.js"; import { parseArray, parseFixedLengthArray, @@ -83,7 +84,7 @@ import { verifyObjectProperty, verifyPositiveInt, verifyString, -} from "#/util/json"; +} from "#src/util/json.js"; const serverDataTypes = new Map(); serverDataTypes.set("uint8", DataType.UINT8); @@ -509,7 +510,7 @@ class DvidMultiscaleVolumeChunkSource extends MultiscaleVolumeChunkSource { } } -const urlPattern = /^((?:http|https):\/\/[^\/]+)\/([^\/]+)\/([^\/]+)(\?.*)?$/; +const urlPattern = /^((?:http|https):\/\/[^/]+)\/([^/]+)\/([^/]+)(\?.*)?$/; function getDefaultAuthServer(baseUrl: string) { if (baseUrl.startsWith("https")) { @@ -699,7 +700,7 @@ export function completeNodeAndInstance( serverInfo: ServerInfo, prefix: string, ): CompletionResult { - const match = prefix.match(/^(?:([^\/]+)(?:\/([^\/]*))?)?$/); + const match = prefix.match(/^(?:([^/]+)(?:\/([^/]*))?)?$/); if (match === null) { throw new Error("Invalid DVID URL syntax."); } @@ -726,7 +727,7 @@ export function completeNodeAndInstance( export async function completeUrl( options: CompleteUrlOptions, ): Promise { - const curUrlPattern = /^((?:http|https):\/\/[^\/]+)\/([^\?]*).*$/; + const curUrlPattern = /^((?:http|https):\/\/[^/]+)\/([^?]*).*$/; const url = options.providerUrl; const match = url.match(curUrlPattern); diff --git a/src/datasource/dvid/register_credentials_provider.ts b/src/datasource/dvid/register_credentials_provider.ts index c08c9b9f66..d14e3bb2e9 100644 --- a/src/datasource/dvid/register_credentials_provider.ts +++ b/src/datasource/dvid/register_credentials_provider.ts @@ -18,9 +18,9 @@ * limitations under the License. */ -import { defaultCredentialsManager } from "#/credentials_provider/default_manager"; -import { credentialsKey } from "#/datasource/dvid/api"; -import { DVIDCredentialsProvider } from "#/datasource/dvid/credentials_provider"; +import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { credentialsKey } from "#src/datasource/dvid/api.js"; +import { DVIDCredentialsProvider } from "#src/datasource/dvid/credentials_provider.js"; defaultCredentialsManager.register( credentialsKey, diff --git a/src/datasource/dvid/register_default.ts b/src/datasource/dvid/register_default.ts index 5b5ba260a9..ac96fb56f7 100644 --- a/src/datasource/dvid/register_default.ts +++ b/src/datasource/dvid/register_default.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { DVIDDataSource } from "#/datasource/dvid/frontend"; -import { registerProvider } from "#/datasource/default_provider"; +import { registerProvider } from "#src/datasource/default_provider.js"; +import { DVIDDataSource } from "#src/datasource/dvid/frontend.js"; registerProvider( "dvid", diff --git a/src/datasource/enabled_async_computation_modules.ts b/src/datasource/enabled_async_computation_modules.ts new file mode 100644 index 0000000000..94f0d6043b --- /dev/null +++ b/src/datasource/enabled_async_computation_modules.ts @@ -0,0 +1,13 @@ +// DO NOT EDIT: Generated by config/update_conditions.ts +import "#datasource/boss/async_computation"; +import "#datasource/brainmaps/async_computation"; +import "#datasource/deepzoom/async_computation"; +import "#datasource/dvid/async_computation"; +import "#datasource/graphene/async_computation"; +import "#datasource/n5/async_computation"; +import "#datasource/nifti/async_computation"; +import "#datasource/obj/async_computation"; +import "#datasource/precomputed/async_computation"; +import "#datasource/render/async_computation"; +import "#datasource/vtk/async_computation"; +import "#datasource/zarr/async_computation"; diff --git a/src/datasource/enabled_backend_modules.ts b/src/datasource/enabled_backend_modules.ts new file mode 100644 index 0000000000..926dea0f29 --- /dev/null +++ b/src/datasource/enabled_backend_modules.ts @@ -0,0 +1,15 @@ +// DO NOT EDIT: Generated by config/update_conditions.ts +import "#datasource/boss/backend"; +import "#datasource/brainmaps/backend"; +import "#datasource/deepzoom/backend"; +import "#datasource/dvid/backend"; +import "#datasource/graphene/backend"; +import "#datasource/n5/backend"; +import "#datasource/nggraph/backend"; +import "#datasource/nifti/backend"; +import "#datasource/obj/backend"; +import "#datasource/precomputed/backend"; +import "#datasource/python/backend"; +import "#datasource/render/backend"; +import "#datasource/vtk/backend"; +import "#datasource/zarr/backend"; diff --git a/src/datasource/enabled_frontend_modules.ts b/src/datasource/enabled_frontend_modules.ts new file mode 100644 index 0000000000..96b934b7b7 --- /dev/null +++ b/src/datasource/enabled_frontend_modules.ts @@ -0,0 +1,19 @@ +// DO NOT EDIT: Generated by config/update_conditions.ts +import "#datasource/boss/register_default"; +import "#datasource/boss/register_credentials_provider"; +import "#datasource/brainmaps/register_default"; +import "#datasource/brainmaps/register_credentials_provider"; +import "#datasource/deepzoom/register_default"; +import "#datasource/dvid/register_default"; +import "#datasource/dvid/register_credentials_provider"; +import "#datasource/graphene/register_default"; +import "#datasource/middleauth/register_credentials_provider"; +import "#datasource/n5/register_default"; +import "#datasource/ngauth/register_credentials_provider"; +import "#datasource/nggraph/register_default"; +import "#datasource/nifti/register_default"; +import "#datasource/obj/register_default"; +import "#datasource/precomputed/register_default"; +import "#datasource/render/register_default"; +import "#datasource/vtk/register_default"; +import "#datasource/zarr/register_default"; diff --git a/src/datasource/graphene/async_computation.ts b/src/datasource/graphene/async_computation.ts new file mode 100644 index 0000000000..69e1442c3a --- /dev/null +++ b/src/datasource/graphene/async_computation.ts @@ -0,0 +1,2 @@ +import "#src/async_computation/decode_jpeg.js"; +import "#src/async_computation/decode_gzip.js"; diff --git a/src/datasource/graphene/backend.ts b/src/datasource/graphene/backend.ts index e2e04dc595..b49783b22d 100644 --- a/src/datasource/graphene/backend.ts +++ b/src/datasource/graphene/backend.ts @@ -14,73 +14,69 @@ * limitations under the License. */ -import { WithParameters } from "#/chunk_manager/backend"; -import { WithSharedCredentialsProviderCounterpart } from "#/credentials_provider/shared_counterpart"; +import { debounce } from "lodash-es"; import { - assignMeshFragmentData, - FragmentChunk, - ManifestChunk, - MeshSource, -} from "#/mesh/backend"; + WithParameters, + withChunkManager, + Chunk, + ChunkSource, +} from "#src/chunk_manager/backend.js"; +import { ChunkPriorityTier, ChunkState } from "#src/chunk_manager/base.js"; +import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; +import type { ChunkedGraphChunkSpecification } from "#src/datasource/graphene/base.js"; import { getGrapheneFragmentKey, GRAPHENE_MESH_NEW_SEGMENT_RPC_ID, responseIdentity, -} from "#/datasource/graphene/base"; -import { CancellationToken } from "#/util/cancellation"; -import { responseArrayBuffer, responseJson } from "#/util/http_request"; -import { - cancellableFetchSpecialOk, - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#/util/special_protocol_request"; -import { Uint64 } from "#/util/uint64"; -import { registerSharedObject } from "#/worker_rpc"; -import { ChunkedGraphSourceParameters, MeshSourceParameters, -} from "#/datasource/graphene/base"; -import { decodeManifestChunk } from "#/datasource/precomputed/backend"; -import { fetchSpecialHttpByteRange } from "#/util/byte_range_http_requests"; -import debounce from "lodash/debounce"; -import { withChunkManager, Chunk, ChunkSource } from "#/chunk_manager/backend"; -import { ChunkPriorityTier, ChunkState } from "#/chunk_manager/base"; -import { - TransformedSource, - forEachPlaneIntersectingVolumetricChunk, - getNormalizedChunkLayout, - SliceViewProjectionParameters, -} from "#/sliceview/base"; -import { CHUNKED_GRAPH_LAYER_RPC_ID, - ChunkedGraphChunkSpecification, CHUNKED_GRAPH_RENDER_LAYER_UPDATE_SOURCES_RPC_ID, RENDER_RATIO_LIMIT, -} from "#/datasource/graphene/base"; -import { Uint64Set } from "#/uint64_set"; -import { vec3, vec3Key } from "#/util/geom"; -import { registerRPC, RPC } from "#/worker_rpc"; - + isBaseSegmentId, +} from "#src/datasource/graphene/base.js"; +import { decodeManifestChunk } from "#src/datasource/precomputed/backend.js"; +import type { FragmentChunk, ManifestChunk } from "#src/mesh/backend.js"; +import { assignMeshFragmentData, MeshSource } from "#src/mesh/backend.js"; +import { decodeDraco } from "#src/mesh/draco/index.js"; +import type { DisplayDimensionRenderInfo } from "#src/navigation_state.js"; +import type { + RenderedViewBackend, + RenderLayerBackendAttachment, +} from "#src/render_layer_backend.js"; +import { RenderLayerBackend } from "#src/render_layer_backend.js"; +import { withSegmentationLayerBackendState } from "#src/segmentation_display_state/backend.js"; +import { forEachVisibleSegment } from "#src/segmentation_display_state/base.js"; +import type { SharedWatchableValue } from "#src/shared_watchable_value.js"; +import type { SliceViewChunkSourceBackend } from "#src/sliceview/backend.js"; +import { deserializeTransformedSources } from "#src/sliceview/backend.js"; +import type { + TransformedSource, + SliceViewProjectionParameters, +} from "#src/sliceview/base.js"; import { - deserializeTransformedSources, - SliceViewChunkSourceBackend, -} from "#/sliceview/backend"; + forEachPlaneIntersectingVolumetricChunk, + getNormalizedChunkLayout, +} from "#src/sliceview/base.js"; +import { computeChunkBounds } from "#src/sliceview/volume/backend.js"; +import { Uint64Set } from "#src/uint64_set.js"; +import { fetchSpecialHttpByteRange } from "#src/util/byte_range_http_requests.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { vec3, vec3Key } from "#src/util/geom.js"; +import { responseArrayBuffer, responseJson } from "#src/util/http_request.js"; +import type { + SpecialProtocolCredentials, + SpecialProtocolCredentialsProvider, +} from "#src/util/special_protocol_request.js"; +import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; +import { Uint64 } from "#src/util/uint64.js"; import { getBasePriority, getPriorityTier, withSharedVisibility, -} from "#/visibility_priority/backend"; -import { isBaseSegmentId } from "#/datasource/graphene/base"; -import { withSegmentationLayerBackendState } from "#/segmentation_display_state/backend"; -import { - RenderedViewBackend, - RenderLayerBackend, - RenderLayerBackendAttachment, -} from "#/render_layer_backend"; -import { SharedWatchableValue } from "#/shared_watchable_value"; -import { DisplayDimensionRenderInfo } from "#/navigation_state"; -import { forEachVisibleSegment } from "#/segmentation_display_state/base"; -import { computeChunkBounds } from "#/sliceview/volume/backend"; +} from "#src/visibility_priority/backend.js"; +import type { RPC } from "#src/worker_rpc.js"; +import { registerSharedObject, registerRPC } from "#src/worker_rpc.js"; function getVerifiedFragmentPromise( credentialsProvider: SpecialProtocolCredentialsProvider, @@ -139,8 +135,7 @@ async function decodeDracoFragmentChunk( chunk: FragmentChunk, response: ArrayBuffer, ) { - const m = await import(/* webpackChunkName: "draco" */ "#/mesh/draco"); - const rawMesh = await m.decodeDraco(new Uint8Array(response)); + const rawMesh = await decodeDraco(new Uint8Array(response)); assignMeshFragmentData(chunk, rawMesh); } diff --git a/src/datasource/graphene/base.ts b/src/datasource/graphene/base.ts index 46a73f284e..52048f98db 100644 --- a/src/datasource/graphene/base.ts +++ b/src/datasource/graphene/base.ts @@ -14,17 +14,19 @@ * limitations under the License. */ -import { mat4 } from "#/util/geom"; -import { ShardingParameters } from "#/datasource/precomputed/base"; -import { +import type { ShardingParameters } from "#src/datasource/precomputed/base.js"; +import type { ChunkLayoutOptions, - makeSliceViewChunkSpecification, SliceViewChunkSource, SliceViewChunkSpecification, SliceViewChunkSpecificationBaseOptions, SliceViewChunkSpecificationOptions, -} from "#/sliceview/base"; -import { DataType } from "#/sliceview/base"; + DataType, +} from "#src/sliceview/base.js"; +import { makeSliceViewChunkSpecification } from "#src/sliceview/base.js"; +import type { mat4 } from "#src/util/geom.js"; + +import { Uint64 } from "#src/util/uint64.js"; export const PYCG_APP_VERSION = 1; export const GRAPHENE_MESH_NEW_SEGMENT_RPC_ID = "GrapheneMeshSource:NewSegment"; @@ -66,8 +68,6 @@ export class MultiscaleMeshMetadata { sharding: Array | undefined; } -import { Uint64 } from "#/util/uint64"; - export const responseIdentity = async (x: any) => x; export function isBaseSegmentId(segmentId: Uint64, nBitsForLayerId: number) { diff --git a/src/datasource/graphene/frontend.ts b/src/datasource/graphene/frontend.ts index 0632948ec7..211007803f 100644 --- a/src/datasource/graphene/frontend.ts +++ b/src/datasource/graphene/frontend.ts @@ -14,136 +14,157 @@ * limitations under the License. */ -import "./graphene.css"; - +import "#src/datasource/graphene/graphene.css"; import { + AnnotationDisplayState, + AnnotationLayerState, +} from "#src/annotation/annotation_layer_state.js"; +import type { AnnotationReference, - AnnotationType, Line, - LocalAnnotationSource, - makeDataBoundsBoundingBoxAnnotationSet, Point, -} from "#/annotation"; +} from "#src/annotation/index.js"; import { - AnnotationDisplayState, - AnnotationLayerState, -} from "#/annotation/annotation_layer_state"; -import { LayerChunkProgressInfo } from "#/chunk_manager/base"; -import { ChunkManager, WithParameters } from "#/chunk_manager/frontend"; -import { makeIdentityTransform } from "#/coordinate_transform"; -import { CredentialsManager } from "#/credentials_provider"; -import { WithCredentialsProvider } from "#/credentials_provider/chunk_source_frontend"; -import { - DataSource, - DataSubsourceEntry, - GetDataSourceOptions, - RedirectError, -} from "#/datasource"; + AnnotationType, + LocalAnnotationSource, + makeDataBoundsBoundingBoxAnnotationSet, +} from "#src/annotation/index.js"; +import { LayerChunkProgressInfo } from "#src/chunk_manager/base.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { WithParameters } from "#src/chunk_manager/frontend.js"; +import { makeIdentityTransform } from "#src/coordinate_transform.js"; +import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; +import type { CredentialsManager } from "#src/credentials_provider/index.js"; +import type { + ChunkedGraphChunkSource as ChunkedGraphChunkSourceInterface, + ChunkedGraphChunkSpecification, + MultiscaleMeshMetadata, +} from "#src/datasource/graphene/base.js"; import { CHUNKED_GRAPH_LAYER_RPC_ID, CHUNKED_GRAPH_RENDER_LAYER_UPDATE_SOURCES_RPC_ID, - ChunkedGraphChunkSource as ChunkedGraphChunkSourceInterface, - ChunkedGraphChunkSpecification, ChunkedGraphSourceParameters, getGrapheneFragmentKey, GRAPHENE_MESH_NEW_SEGMENT_RPC_ID, isBaseSegmentId, makeChunkedGraphChunkSpecification, MeshSourceParameters, - MultiscaleMeshMetadata, PYCG_APP_VERSION, responseIdentity, -} from "#/datasource/graphene/base"; +} from "#src/datasource/graphene/base.js"; +import type { + DataSource, + DataSubsourceEntry, + GetDataSourceOptions, +} from "#src/datasource/index.js"; +import { RedirectError } from "#src/datasource/index.js"; +import type { ShardingParameters } from "#src/datasource/precomputed/base.js"; import { DataEncoding, ShardingHashFunction, - ShardingParameters, -} from "#/datasource/precomputed/base"; +} from "#src/datasource/precomputed/base.js"; +import type { MultiscaleVolumeInfo } from "#src/datasource/precomputed/frontend.js"; import { getSegmentPropertyMap, - MultiscaleVolumeInfo, parseMultiscaleVolumeInfo, parseProviderUrl, PrecomputedDataSource, PrecomputedMultiscaleVolumeChunkSource, resolvePath, -} from "#/datasource/precomputed/frontend"; -import { LayerView, MouseSelectionState, VisibleLayerInfo } from "#/layer"; -import { - LoadedDataSubsource, - LoadedLayerDataSource, -} from "#/layer_data_source"; -import { MeshSource } from "#/mesh/frontend"; -import { DisplayDimensionRenderInfo } from "#/navigation_state"; -import { +} from "#src/datasource/precomputed/frontend.js"; +import type { + LayerView, + MouseSelectionState, + VisibleLayerInfo, +} from "#src/layer/index.js"; +import type { LoadedDataSubsource } from "#src/layer/layer_data_source.js"; +import { LoadedLayerDataSource } from "#src/layer/layer_data_source.js"; +import { SegmentationUserLayer } from "#src/layer/segmentation/index.js"; +import { MeshSource } from "#src/mesh/frontend.js"; +import type { DisplayDimensionRenderInfo } from "#src/navigation_state.js"; +import type { ChunkTransformParameters, + RenderLayerTransformOrError, +} from "#src/render_coordinate_transform.js"; +import { getChunkPositionFromCombinedGlobalLocalPositions, getChunkTransformParameters, - RenderLayerTransformOrError, -} from "#/render_coordinate_transform"; -import { RenderLayer, RenderLayerRole } from "#/renderlayer"; +} from "#src/render_coordinate_transform.js"; +import type { RenderLayer } from "#src/renderlayer.js"; +import { RenderLayerRole } from "#src/renderlayer.js"; +import type { + SegmentationDisplayState3D, + Uint64MapEntry, +} from "#src/segmentation_display_state/frontend.js"; import { augmentSegmentId, resetTemporaryVisibleSegmentsState, - SegmentationDisplayState3D, SegmentationLayerSharedObject, SegmentWidgetFactory, - Uint64MapEntry, -} from "#/segmentation_display_state/frontend"; -import { VisibleSegmentEquivalencePolicy } from "#/segmentation_graph/segment_id"; -import { +} from "#src/segmentation_display_state/frontend.js"; +import { VisibleSegmentEquivalencePolicy } from "#src/segmentation_graph/segment_id.js"; +import type { ComputedSplit, - SegmentationGraphSource, - SegmentationGraphSourceConnection, SegmentationGraphSourceTab, -} from "#/segmentation_graph/source"; -import { SegmentationUserLayer } from "#/segmentation_user_layer"; -import { SharedWatchableValue } from "#/shared_watchable_value"; +} from "#src/segmentation_graph/source.js"; import { + SegmentationGraphSource, + SegmentationGraphSourceConnection, +} from "#src/segmentation_graph/source.js"; +import { SharedWatchableValue } from "#src/shared_watchable_value.js"; +import type { FrontendTransformedSource, + SliceViewSingleResolutionSource, +} from "#src/sliceview/frontend.js"; +import { getVolumetricTransformedSources, serializeAllTransformedSources, SliceViewChunkSource, - SliceViewSingleResolutionSource, -} from "#/sliceview/frontend"; -import { - SliceViewPanelRenderLayer, - SliceViewRenderLayer, -} from "#/sliceview/renderlayer"; -import { StatusMessage } from "#/status"; +} from "#src/sliceview/frontend.js"; +import type { SliceViewRenderLayer } from "#src/sliceview/renderlayer.js"; +import { SliceViewPanelRenderLayer } from "#src/sliceview/renderlayer.js"; +import { StatusMessage } from "#src/status.js"; import { TrackableBoolean, TrackableBooleanCheckbox, -} from "#/trackable_boolean"; +} from "#src/trackable_boolean.js"; +import type { + NestedStateManager, + WatchableValueInterface, +} from "#src/trackable_value.js"; import { makeCachedLazyDerivedWatchableValue, - NestedStateManager, registerNested, TrackableValue, WatchableSet, WatchableValue, - WatchableValueInterface, -} from "#/trackable_value"; +} from "#src/trackable_value.js"; import { AnnotationLayerView, MergedAnnotationStates, PlaceLineTool, -} from "#/ui/annotations"; +} from "#src/ui/annotations.js"; +import type { ToolActivation } from "#src/ui/tool.js"; import { LayerTool, makeToolActivationStatusMessageWithHeader, makeToolButton, registerLegacyTool, registerTool, - ToolActivation, -} from "#/ui/tool"; -import { Uint64Set } from "#/uint64_set"; -import { packColor } from "#/util/color"; -import { Owned, RefCounted } from "#/util/disposable"; -import { makeValueOrError, ValueOrError, valueOrThrow } from "#/util/error"; -import { EventActionMap } from "#/util/event_action_map"; -import { mat4, vec3, vec4 } from "#/util/geom"; -import { HttpError, isNotFoundError, responseJson } from "#/util/http_request"; +} from "#src/ui/tool.js"; +import type { Uint64Set } from "#src/uint64_set.js"; +import { packColor } from "#src/util/color.js"; +import type { Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import type { ValueOrError } from "#src/util/error.js"; +import { makeValueOrError, valueOrThrow } from "#src/util/error.js"; +import { EventActionMap } from "#src/util/event_action_map.js"; +import { mat4, vec3, vec4 } from "#src/util/geom.js"; +import { + HttpError, + isNotFoundError, + responseJson, +} from "#src/util/http_request.js"; import { parseArray, parseFixedLengthArray, @@ -160,20 +181,22 @@ import { verifyOptionalString, verifyPositiveInt, verifyString, -} from "#/util/json"; -import { getObjectId } from "#/util/object_id"; -import { NullarySignal } from "#/util/signal"; +} from "#src/util/json.js"; +import { getObjectId } from "#src/util/object_id.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { + SpecialProtocolCredentials, + SpecialProtocolCredentialsProvider, +} from "#src/util/special_protocol_request.js"; import { cancellableFetchSpecialOk, parseSpecialUrl, - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#/util/special_protocol_request"; -import { Trackable } from "#/util/trackable"; -import { Uint64 } from "#/util/uint64"; -import { makeDeleteButton } from "#/widget/delete_button"; -import { DependentViewContext } from "#/widget/dependent_view_widget"; -import { makeIcon } from "#/widget/icon"; +} from "#src/util/special_protocol_request.js"; +import type { Trackable } from "#src/util/trackable.js"; +import { Uint64 } from "#src/util/uint64.js"; +import { makeDeleteButton } from "#src/widget/delete_button.js"; +import type { DependentViewContext } from "#src/widget/dependent_view_widget.js"; +import { makeIcon } from "#src/widget/icon.js"; function vec4FromVec3(vec: vec3, alpha = 0) { const res = vec4.clone([...vec]); @@ -211,7 +234,7 @@ class AppInfo { // .../1.0/... is the legacy link style // .../table/... is the current, version agnostic link style (for retrieving the info file) const linkStyle = - /^(https?:\/\/[.\w:\-\/]+)\/segmentation\/(?:1\.0|table)\/([^\/]+)\/?$/; + /^(https?:\/\/[.\w:\-/]+)\/segmentation\/(?:1\.0|table)\/([^/]+)\/?$/; const match = infoUrl.match(linkStyle); if (match === null) { throw Error(`Graph URL invalid: ${infoUrl}`); diff --git a/src/datasource/graphene/register_default.ts b/src/datasource/graphene/register_default.ts index fe7500dca6..e256a146fb 100644 --- a/src/datasource/graphene/register_default.ts +++ b/src/datasource/graphene/register_default.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { GrapheneDataSource } from "#/datasource/graphene/frontend"; -import { registerProvider } from "#/datasource/default_provider"; +import { registerProvider } from "#src/datasource/default_provider.js"; +import { GrapheneDataSource } from "#src/datasource/graphene/frontend.js"; registerProvider("graphene", () => new GrapheneDataSource()); diff --git a/src/datasource/index.ts b/src/datasource/index.ts index fcb0b31ab5..e1cc361c05 100644 --- a/src/datasource/index.ts +++ b/src/datasource/index.ts @@ -14,35 +14,41 @@ * limitations under the License. */ -import { AnnotationSource } from "#/annotation"; -import { MultiscaleAnnotationSource } from "#/annotation/frontend_source"; -import { ChunkManager } from "#/chunk_manager/frontend"; -import { +import type { MultiscaleAnnotationSource } from "#src/annotation/frontend_source.js"; +import type { AnnotationSource } from "#src/annotation/index.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import type { CoordinateSpace, CoordinateSpaceTransform, CoordinateTransformSpecification, +} from "#src/coordinate_transform.js"; +import { emptyValidCoordinateSpace, makeCoordinateSpace, makeIdentityTransform, -} from "#/coordinate_transform"; -import { CredentialsManager } from "#/credentials_provider"; -import { MeshSource, MultiscaleMeshSource } from "#/mesh/frontend"; -import { SegmentPropertyMap } from "#/segmentation_display_state/property_map"; -import { SegmentationGraphSource } from "#/segmentation_graph/source"; -import { SingleMeshSource } from "#/single_mesh/frontend"; -import { SkeletonSource } from "#/skeleton/frontend"; -import { MultiscaleVolumeChunkSource } from "#/sliceview/volume/frontend"; -import { WatchableValueInterface } from "#/trackable_value"; -import { CancellationToken, uncancelableToken } from "#/util/cancellation"; -import { - applyCompletionOffset, +} from "#src/coordinate_transform.js"; +import type { CredentialsManager } from "#src/credentials_provider/index.js"; +import type { MeshSource, MultiscaleMeshSource } from "#src/mesh/frontend.js"; +import type { SegmentPropertyMap } from "#src/segmentation_display_state/property_map.js"; +import type { SegmentationGraphSource } from "#src/segmentation_graph/source.js"; +import type { SingleMeshSource } from "#src/single_mesh/frontend.js"; +import type { SkeletonSource } from "#src/skeleton/frontend.js"; +import type { MultiscaleVolumeChunkSource } from "#src/sliceview/volume/frontend.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { uncancelableToken } from "#src/util/cancellation.js"; +import type { BasicCompletionResult, CompletionWithDescription, +} from "#src/util/completion.js"; +import { + applyCompletionOffset, getPrefixMatchesWithDescriptions, -} from "#/util/completion"; -import { Owned, RefCounted } from "#/util/disposable"; -import { createIdentity } from "#/util/matrix"; -import { Trackable } from "#/util/trackable"; +} from "#src/util/completion.js"; +import type { Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { createIdentity } from "#src/util/matrix.js"; +import type { Trackable } from "#src/util/trackable.js"; export type CompletionResult = BasicCompletionResult; @@ -194,6 +200,7 @@ export interface DataSource { state?: Trackable; } +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export interface DataSourceProvider { /** * Returns a suggested layer name for the given volume source. @@ -228,6 +235,7 @@ export function makeEmptyDataSourceSpecification(): DataSourceSpecification { }; } +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export abstract class DataSourceProvider extends RefCounted { abstract description?: string; diff --git a/src/datasource/middleauth/credentials_provider.ts b/src/datasource/middleauth/credentials_provider.ts index b7a94b0a97..cd70ed9d6f 100644 --- a/src/datasource/middleauth/credentials_provider.ts +++ b/src/datasource/middleauth/credentials_provider.ts @@ -14,19 +14,21 @@ * limitations under the License. */ -import { +import type { CredentialsManager, - CredentialsProvider, CredentialsWithGeneration, +} from "#src/credentials_provider/index.js"; +import { + CredentialsProvider, makeCredentialsGetter, -} from "#/credentials_provider"; -import { StatusMessage } from "#/status"; +} from "#src/credentials_provider/index.js"; +import { StatusMessage } from "#src/status.js"; import { verifyObject, verifyObjectProperty, verifyString, verifyStringArray, -} from "#/util/json"; +} from "#src/util/json.js"; export type MiddleAuthToken = { tokenType: string; diff --git a/src/datasource/middleauth/register_credentials_provider.ts b/src/datasource/middleauth/register_credentials_provider.ts index 1da247d66a..90f6a3b634 100644 --- a/src/datasource/middleauth/register_credentials_provider.ts +++ b/src/datasource/middleauth/register_credentials_provider.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import { defaultCredentialsManager } from "#/credentials_provider/default_manager"; +import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import type { CredentialsManager } from "#src/credentials_provider/index.js"; import { MiddleAuthCredentialsProvider, MiddleAuthAppCredentialsProvider, -} from "#/datasource/middleauth/credentials_provider"; -import { CredentialsManager } from "#/credentials_provider"; +} from "#src/datasource/middleauth/credentials_provider.js"; defaultCredentialsManager.register( "middleauth", diff --git a/src/datasource/n5/async_computation.ts b/src/datasource/n5/async_computation.ts new file mode 100644 index 0000000000..df029623c4 --- /dev/null +++ b/src/datasource/n5/async_computation.ts @@ -0,0 +1,3 @@ +import "#src/async_computation/decode_gzip.js"; +import "#src/async_computation/decode_blosc.js"; +import "#src/async_computation/decode_zstd.js"; diff --git a/src/datasource/n5/backend.ts b/src/datasource/n5/backend.ts index c6a198d87c..4f51ce2c69 100644 --- a/src/datasource/n5/backend.ts +++ b/src/datasource/n5/backend.ts @@ -14,26 +14,28 @@ * limitations under the License. */ -import { decodeBlosc } from "#/async_computation/decode_blosc_request"; -import { decodeZstd } from "#/async_computation/decode_zstd_request"; -import { decodeGzip } from "#/async_computation/decode_gzip_request"; -import { requestAsyncComputation } from "#/async_computation/request"; -import { WithParameters } from "#/chunk_manager/backend"; -import { WithSharedCredentialsProviderCounterpart } from "#/credentials_provider/shared_counterpart"; +import { decodeBlosc } from "#src/async_computation/decode_blosc_request.js"; +import { decodeGzip } from "#src/async_computation/decode_gzip_request.js"; +import { decodeZstd } from "#src/async_computation/decode_zstd_request.js"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import { WithParameters } from "#src/chunk_manager/backend.js"; +import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; import { VolumeChunkEncoding, VolumeChunkSourceParameters, -} from "#/datasource/n5/base"; -import { decodeRawChunk } from "#/sliceview/backend_chunk_decoders/raw"; -import { VolumeChunk, VolumeChunkSource } from "#/sliceview/volume/backend"; -import { CancellationToken } from "#/util/cancellation"; -import { Endianness } from "#/util/endian"; -import { isNotFoundError, responseArrayBuffer } from "#/util/http_request"; +} from "#src/datasource/n5/base.js"; +import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { Endianness } from "#src/util/endian.js"; import { - cancellableFetchSpecialOk, - SpecialProtocolCredentials, -} from "#/util/special_protocol_request"; -import { registerSharedObject } from "#/worker_rpc"; + isNotFoundError, + responseArrayBuffer, +} from "#src/util/http_request.js"; +import type { SpecialProtocolCredentials } from "#src/util/special_protocol_request.js"; +import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; +import { registerSharedObject } from "#src/worker_rpc.js"; async function decodeChunk( chunk: VolumeChunk, diff --git a/src/datasource/n5/frontend.ts b/src/datasource/n5/frontend.ts index 10fda6178b..ed4299a528 100644 --- a/src/datasource/n5/frontend.ts +++ b/src/datasource/n5/frontend.ts @@ -23,40 +23,47 @@ * https://github.com/bigdataviewer/bigdataviewer-core/blob/master/BDV%20N5%20format.md */ -import { makeDataBoundsBoundingBoxAnnotationSet } from "#/annotation"; -import { ChunkManager, WithParameters } from "#/chunk_manager/frontend"; -import { +import { makeDataBoundsBoundingBoxAnnotationSet } from "#src/annotation/index.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { WithParameters } from "#src/chunk_manager/frontend.js"; +import type { CoordinateArray, CoordinateSpace, +} from "#src/coordinate_transform.js"; +import { makeCoordinateSpace, makeIdentityTransform, -} from "#/coordinate_transform"; -import { WithCredentialsProvider } from "#/credentials_provider/chunk_source_frontend"; -import { +} from "#src/coordinate_transform.js"; +import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; +import type { CompleteUrlOptions, DataSource, - DataSourceProvider, GetDataSourceOptions, -} from "#/datasource"; +} from "#src/datasource/index.js"; +import { DataSourceProvider } from "#src/datasource/index.js"; import { VolumeChunkEncoding, VolumeChunkSourceParameters, -} from "#/datasource/n5/base"; -import { SliceViewSingleResolutionSource } from "#/sliceview/frontend"; +} from "#src/datasource/n5/base.js"; +import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; +import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; import { DataType, makeDefaultVolumeChunkSpecifications, - VolumeSourceOptions, VolumeType, -} from "#/sliceview/volume/base"; +} from "#src/sliceview/volume/base.js"; import { MultiscaleVolumeChunkSource as GenericMultiscaleVolumeChunkSource, VolumeChunkSource, -} from "#/sliceview/volume/frontend"; -import { transposeNestedArrays } from "#/util/array"; -import { Borrowed } from "#/util/disposable"; -import { completeHttpPath } from "#/util/http_path_completion"; -import { isNotFoundError, parseUrl, responseJson } from "#/util/http_request"; +} from "#src/sliceview/volume/frontend.js"; +import { transposeNestedArrays } from "#src/util/array.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { completeHttpPath } from "#src/util/http_path_completion.js"; +import { + isNotFoundError, + parseUrl, + responseJson, +} from "#src/util/http_request.js"; import { expectArray, parseArray, @@ -69,16 +76,18 @@ import { verifyPositiveInt, verifyString, verifyStringArray, -} from "#/util/json"; -import { createHomogeneousScaleMatrix } from "#/util/matrix"; -import { getObjectId } from "#/util/object_id"; -import { scaleByExp10, unitFromJson } from "#/util/si_units"; +} from "#src/util/json.js"; +import { createHomogeneousScaleMatrix } from "#src/util/matrix.js"; +import { getObjectId } from "#src/util/object_id.js"; +import { scaleByExp10, unitFromJson } from "#src/util/si_units.js"; +import type { + SpecialProtocolCredentials, + SpecialProtocolCredentialsProvider, +} from "#src/util/special_protocol_request.js"; import { cancellableFetchSpecialOk, parseSpecialUrl, - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#/util/special_protocol_request"; +} from "#src/util/special_protocol_request.js"; class N5VolumeChunkSource extends WithParameters( WithCredentialsProvider()(VolumeChunkSource), diff --git a/src/datasource/n5/register_default.ts b/src/datasource/n5/register_default.ts index 23c30b4046..dddddbb211 100644 --- a/src/datasource/n5/register_default.ts +++ b/src/datasource/n5/register_default.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { registerProvider } from "#/datasource/default_provider"; -import { N5DataSource } from "#/datasource/n5/frontend"; +import { registerProvider } from "#src/datasource/default_provider.js"; +import { N5DataSource } from "#src/datasource/n5/frontend.js"; registerProvider("n5", () => new N5DataSource()); diff --git a/src/datasource/ngauth/credentials_provider.ts b/src/datasource/ngauth/credentials_provider.ts index 698dc373fc..2d3affd68c 100644 --- a/src/datasource/ngauth/credentials_provider.ts +++ b/src/datasource/ngauth/credentials_provider.ts @@ -14,15 +14,19 @@ * limitations under the License. */ +import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; import { CredentialsProvider, makeCredentialsGetter, -} from "#/credentials_provider"; -import { fetchWithCredentials } from "#/credentials_provider/http_request"; -import { OAuth2Credentials } from "#/credentials_provider/oauth2"; -import { StatusMessage } from "#/status"; -import { HttpError, responseJson } from "#/util/http_request"; -import { verifyObject, verifyObjectProperty, verifyString } from "#/util/json"; +} from "#src/credentials_provider/index.js"; +import type { OAuth2Credentials } from "#src/credentials_provider/oauth2.js"; +import { StatusMessage } from "#src/status.js"; +import { HttpError, responseJson } from "#src/util/http_request.js"; +import { + verifyObject, + verifyObjectProperty, + verifyString, +} from "#src/util/json.js"; function makeOriginError(serverUrl: string): Error { return new Error( diff --git a/src/datasource/ngauth/register_credentials_provider.ts b/src/datasource/ngauth/register_credentials_provider.ts index d07c8228e6..d500e1ee54 100644 --- a/src/datasource/ngauth/register_credentials_provider.ts +++ b/src/datasource/ngauth/register_credentials_provider.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import { CredentialsManager } from "#/credentials_provider"; -import { defaultCredentialsManager } from "#/credentials_provider/default_manager"; +import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import type { CredentialsManager } from "#src/credentials_provider/index.js"; import { NgauthCredentialsProvider, NgauthGcsCredentialsProvider, -} from "#/datasource/ngauth/credentials_provider"; +} from "#src/datasource/ngauth/credentials_provider.js"; defaultCredentialsManager.register( "ngauth", diff --git a/src/datasource/nggraph/credentials_provider.ts b/src/datasource/nggraph/credentials_provider.ts index 6437ec4703..a2281e1988 100644 --- a/src/datasource/nggraph/credentials_provider.ts +++ b/src/datasource/nggraph/credentials_provider.ts @@ -17,9 +17,9 @@ import { CredentialsProvider, makeCredentialsGetter, -} from "#/credentials_provider"; -import { StatusMessage } from "#/status"; -import { HttpError } from "#/util/http_request"; +} from "#src/credentials_provider/index.js"; +import { StatusMessage } from "#src/status.js"; +import { HttpError } from "#src/util/http_request.js"; function makeOriginError(serverUrl: string): Error { return new Error( diff --git a/src/datasource/nggraph/frontend.ts b/src/datasource/nggraph/frontend.ts index 995e5e7cd8..056baf4bc4 100644 --- a/src/datasource/nggraph/frontend.ts +++ b/src/datasource/nggraph/frontend.ts @@ -14,43 +14,42 @@ * limitations under the License. */ -import debounce from "lodash/debounce"; -import { ChunkManager } from "#/chunk_manager/frontend"; +import { debounce } from "lodash-es"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; import { CredentialsProvider, makeCredentialsGetter, -} from "#/credentials_provider"; -import { fetchWithCredentials } from "#/credentials_provider/http_request"; -import { +} from "#src/credentials_provider/index.js"; +import type { CompleteUrlOptions, CompletionResult, DataSource, - DataSourceProvider, DataSubsourceEntry, GetDataSourceOptions, -} from "#/datasource"; -import { - Credentials, - NggraphCredentialsProvider, -} from "#/datasource/nggraph/credentials_provider"; -import { VisibleSegmentsState } from "#/segmentation_display_state/base"; +} from "#src/datasource/index.js"; +import { DataSourceProvider } from "#src/datasource/index.js"; +import type { Credentials } from "#src/datasource/nggraph/credentials_provider.js"; +import { NggraphCredentialsProvider } from "#src/datasource/nggraph/credentials_provider.js"; +import type { SegmentationUserLayer } from "#src/layer/segmentation/index.js"; +import type { VisibleSegmentsState } from "#src/segmentation_display_state/base.js"; import { isBaseSegmentId, UNKNOWN_NEW_SEGMENT_ID, VisibleSegmentEquivalencePolicy, -} from "#/segmentation_graph/segment_id"; +} from "#src/segmentation_graph/segment_id.js"; +import type { ComputedSplit } from "#src/segmentation_graph/source.js"; import { - ComputedSplit, SegmentationGraphSource, SegmentationGraphSourceConnection, -} from "#/segmentation_graph/source"; -import { SegmentationUserLayer } from "#/segmentation_user_layer"; -import { StatusMessage } from "#/status"; -import { Uint64Set } from "#/uint64_set"; -import { CancellationToken, uncancelableToken } from "#/util/cancellation"; -import { getPrefixMatchesWithDescriptions } from "#/util/completion"; -import { DisjointUint64Sets } from "#/util/disjoint_sets"; -import { responseJson } from "#/util/http_request"; +} from "#src/segmentation_graph/source.js"; +import { StatusMessage } from "#src/status.js"; +import type { Uint64Set } from "#src/uint64_set.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { uncancelableToken } from "#src/util/cancellation.js"; +import { getPrefixMatchesWithDescriptions } from "#src/util/completion.js"; +import { DisjointUint64Sets } from "#src/util/disjoint_sets.js"; +import { responseJson } from "#src/util/http_request.js"; import { parseArray, verifyFiniteFloat, @@ -59,8 +58,8 @@ import { verifyObjectProperty, verifyString, verifyStringArray, -} from "#/util/json"; -import { Uint64 } from "#/util/uint64"; +} from "#src/util/json.js"; +import { Uint64 } from "#src/util/uint64.js"; const urlPattern = "^(https?://[^/]+)/(.*)$"; diff --git a/src/datasource/nggraph/register_default.ts b/src/datasource/nggraph/register_default.ts index b480a65180..82c0754698 100644 --- a/src/datasource/nggraph/register_default.ts +++ b/src/datasource/nggraph/register_default.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { NggraphDataSource } from "#/datasource/nggraph/frontend"; -import { registerProvider } from "#/datasource/default_provider"; +import { registerProvider } from "#src/datasource/default_provider.js"; +import { NggraphDataSource } from "#src/datasource/nggraph/frontend.js"; registerProvider("nggraph", () => new NggraphDataSource()); diff --git a/src/datasource/nifti/async_computation.ts b/src/datasource/nifti/async_computation.ts new file mode 100644 index 0000000000..9f856a9efa --- /dev/null +++ b/src/datasource/nifti/async_computation.ts @@ -0,0 +1 @@ +import "#src/async_computation/decode_gzip.js"; diff --git a/src/datasource/nifti/backend.ts b/src/datasource/nifti/backend.ts index 2f6032f998..e3670324e8 100644 --- a/src/datasource/nifti/backend.ts +++ b/src/datasource/nifti/backend.ts @@ -14,53 +14,43 @@ * limitations under the License. */ -import { decodeGzip } from "#/async_computation/decode_gzip_request"; -import { requestAsyncComputation } from "#/async_computation/request"; -import { ChunkManager, WithParameters } from "#/chunk_manager/backend"; -import { ChunkPriorityTier } from "#/chunk_manager/base"; -import { - GenericSharedDataSource, - PriorityGetter, -} from "#/chunk_manager/generic_file_source"; -import { - SharedCredentialsProviderCounterpart, - WithSharedCredentialsProviderCounterpart, -} from "#/credentials_provider/shared_counterpart"; +import type { NIFTI2 } from "nifti-reader-js"; +import { isCompressed, NIFTI1, readHeader, readImage } from "nifti-reader-js"; +import { decodeGzip } from "#src/async_computation/decode_gzip_request.js"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import type { ChunkManager } from "#src/chunk_manager/backend.js"; +import { WithParameters } from "#src/chunk_manager/backend.js"; +import { ChunkPriorityTier } from "#src/chunk_manager/base.js"; +import type { PriorityGetter } from "#src/chunk_manager/generic_file_source.js"; +import { GenericSharedDataSource } from "#src/chunk_manager/generic_file_source.js"; +import type { SharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; +import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; +import type { NiftiVolumeInfo } from "#src/datasource/nifti/base.js"; import { GET_NIFTI_VOLUME_INFO_RPC_ID, - NiftiVolumeInfo, VolumeSourceParameters, -} from "#/datasource/nifti/base"; -import { decodeRawChunk } from "#/sliceview/backend_chunk_decoders/raw"; -import { VolumeChunk, VolumeChunkSource } from "#/sliceview/volume/backend"; -import { DataType } from "#/sliceview/volume/base"; -import { CancellationToken } from "#/util/cancellation"; -import { Borrowed } from "#/util/disposable"; -import { Endianness } from "#/util/endian"; +} from "#src/datasource/nifti/base.js"; +import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; +import { DataType } from "#src/sliceview/volume/base.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { Endianness } from "#src/util/endian.js"; import { kOneVec, mat4, quat, translationRotationScaleZReflectionToMat4, vec3, -} from "#/util/geom"; -import * as matrix from "#/util/matrix"; -import { +} from "#src/util/geom.js"; +import * as matrix from "#src/util/matrix.js"; +import type { SpecialProtocolCredentials, SpecialProtocolCredentialsProvider, -} from "#/util/special_protocol_request"; -import { - registerPromiseRPC, - registerSharedObject, - RPCPromise, -} from "#/worker_rpc"; -import { - isCompressed, - NIFTI1, - NIFTI2, - readHeader, - readImage, -} from "nifti-reader-js"; +} from "#src/util/special_protocol_request.js"; +import type { RPCPromise } from "#src/worker_rpc.js"; +import { registerPromiseRPC, registerSharedObject } from "#src/worker_rpc.js"; export class NiftiFileData { uncompressedData: ArrayBuffer; diff --git a/src/datasource/nifti/base.ts b/src/datasource/nifti/base.ts index b9c31a7984..831a0b2023 100644 --- a/src/datasource/nifti/base.ts +++ b/src/datasource/nifti/base.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { DataType } from "#/sliceview/volume/base"; +import type { DataType } from "#src/sliceview/volume/base.js"; export const GET_NIFTI_VOLUME_INFO_RPC_ID = "nifti/getNiftiVolumeInfo"; diff --git a/src/datasource/nifti/frontend.ts b/src/datasource/nifti/frontend.ts index 7dc5ebc129..c61ebdbfb7 100644 --- a/src/datasource/nifti/frontend.ts +++ b/src/datasource/nifti/frontend.ts @@ -19,45 +19,47 @@ * volumes. */ -import { makeDataBoundsBoundingBoxAnnotationSet } from "#/annotation"; -import { ChunkManager, WithParameters } from "#/chunk_manager/frontend"; +import { makeDataBoundsBoundingBoxAnnotationSet } from "#src/annotation/index.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { WithParameters } from "#src/chunk_manager/frontend.js"; import { makeCoordinateSpace, makeIdentityTransformedBoundingBox, -} from "#/coordinate_transform"; -import { CredentialsManager } from "#/credentials_provider"; +} from "#src/coordinate_transform.js"; import { getCredentialsProviderCounterpart, WithCredentialsProvider, -} from "#/credentials_provider/chunk_source_frontend"; -import { +} from "#src/credentials_provider/chunk_source_frontend.js"; +import type { CredentialsManager } from "#src/credentials_provider/index.js"; +import type { CompleteUrlOptions, DataSource, - DataSourceProvider, GetDataSourceOptions, -} from "#/datasource"; +} from "#src/datasource/index.js"; +import { DataSourceProvider } from "#src/datasource/index.js"; +import type { NiftiVolumeInfo } from "#src/datasource/nifti/base.js"; import { GET_NIFTI_VOLUME_INFO_RPC_ID, - NiftiVolumeInfo, VolumeSourceParameters, -} from "#/datasource/nifti/base"; +} from "#src/datasource/nifti/base.js"; +import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; import { makeVolumeChunkSpecificationWithDefaultCompression, - VolumeSourceOptions, VolumeType, -} from "#/sliceview/volume/base"; +} from "#src/sliceview/volume/base.js"; import { MultiscaleVolumeChunkSource, VolumeChunkSource, -} from "#/sliceview/volume/frontend"; -import { CancellationToken, uncancelableToken } from "#/util/cancellation"; -import { completeHttpPath } from "#/util/http_path_completion"; -import * as matrix from "#/util/matrix"; -import { - parseSpecialUrl, +} from "#src/sliceview/volume/frontend.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { uncancelableToken } from "#src/util/cancellation.js"; +import { completeHttpPath } from "#src/util/http_path_completion.js"; +import * as matrix from "#src/util/matrix.js"; +import type { SpecialProtocolCredentials, SpecialProtocolCredentialsProvider, -} from "#/util/special_protocol_request"; +} from "#src/util/special_protocol_request.js"; +import { parseSpecialUrl } from "#src/util/special_protocol_request.js"; class NiftiVolumeChunkSource extends WithParameters( WithCredentialsProvider()(VolumeChunkSource), diff --git a/src/datasource/nifti/register_default.ts b/src/datasource/nifti/register_default.ts index 5e552e3d95..cdf9a6c4ee 100644 --- a/src/datasource/nifti/register_default.ts +++ b/src/datasource/nifti/register_default.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { NiftiDataSource } from "#/datasource/nifti/frontend"; -import { registerProvider } from "#/datasource/default_provider"; +import { registerProvider } from "#src/datasource/default_provider.js"; +import { NiftiDataSource } from "#src/datasource/nifti/frontend.js"; registerProvider("nifti", () => new NiftiDataSource()); diff --git a/src/datasource/obj/async_computation.ts b/src/datasource/obj/async_computation.ts new file mode 100644 index 0000000000..27fc5d829d --- /dev/null +++ b/src/datasource/obj/async_computation.ts @@ -0,0 +1 @@ +import "#src/async_computation/obj_mesh.js"; diff --git a/src/datasource/obj/backend.ts b/src/datasource/obj/backend.ts index 70b178cd9c..0cbb36b33a 100644 --- a/src/datasource/obj/backend.ts +++ b/src/datasource/obj/backend.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import { parseOBJFromArrayBuffer } from "#/async_computation/obj_mesh_request"; -import { requestAsyncComputation } from "#/async_computation/request"; -import { GenericSharedDataSource } from "#/chunk_manager/generic_file_source"; -import { registerSingleMeshFactory } from "#/single_mesh/backend"; -import { CancellationToken } from "#/util/cancellation"; +import { parseOBJFromArrayBuffer } from "#src/async_computation/obj_mesh_request.js"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import { GenericSharedDataSource } from "#src/chunk_manager/generic_file_source.js"; +import { registerSingleMeshFactory } from "#src/single_mesh/backend.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; /** * This needs to be a global function, because it identifies the instance of GenericSharedDataSource diff --git a/src/datasource/obj/frontend.ts b/src/datasource/obj/frontend.ts index 7a15f39629..a5a6e09500 100644 --- a/src/datasource/obj/frontend.ts +++ b/src/datasource/obj/frontend.ts @@ -17,15 +17,15 @@ import { makeCoordinateSpace, makeIdentityTransform, -} from "#/coordinate_transform"; -import { +} from "#src/coordinate_transform.js"; +import type { CompleteUrlOptions, DataSource, - DataSourceProvider, GetDataSourceOptions, -} from "#/datasource"; -import { getSingleMeshSource } from "#/single_mesh/frontend"; -import { completeHttpPath } from "#/util/http_path_completion"; +} from "#src/datasource/index.js"; +import { DataSourceProvider } from "#src/datasource/index.js"; +import { getSingleMeshSource } from "#src/single_mesh/frontend.js"; +import { completeHttpPath } from "#src/util/http_path_completion.js"; export class ObjDataSource extends DataSourceProvider { get description() { diff --git a/src/datasource/obj/register_default.ts b/src/datasource/obj/register_default.ts index 80729610ca..7f846e4743 100644 --- a/src/datasource/obj/register_default.ts +++ b/src/datasource/obj/register_default.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { registerProvider } from "#/datasource/default_provider"; -import { ObjDataSource } from "#/datasource/obj/frontend"; +import { registerProvider } from "#src/datasource/default_provider.js"; +import { ObjDataSource } from "#src/datasource/obj/frontend.js"; registerProvider("obj", () => new ObjDataSource()); diff --git a/src/datasource/precomputed/async_computation.ts b/src/datasource/precomputed/async_computation.ts new file mode 100644 index 0000000000..afd324330e --- /dev/null +++ b/src/datasource/precomputed/async_computation.ts @@ -0,0 +1,4 @@ +import "#src/async_computation/decode_jpeg.js"; +import "#src/async_computation/decode_gzip.js"; +import "#src/async_computation/decode_compresso.js"; +import "#src/async_computation/decode_png.js"; diff --git a/src/datasource/precomputed/backend.ts b/src/datasource/precomputed/backend.ts index 39e6efd449..3178907329 100644 --- a/src/datasource/precomputed/backend.ts +++ b/src/datasource/precomputed/backend.ts @@ -14,25 +14,29 @@ * limitations under the License. */ +import type { + AnnotationGeometryChunk, + AnnotationMetadataChunk, + AnnotationSubsetGeometryChunk, +} from "#src/annotation/backend.js"; +import { + AnnotationGeometryData, + AnnotationSource, + AnnotationGeometryChunkSourceBackend, +} from "#src/annotation/backend.js"; +import type { Annotation } from "#src/annotation/index.js"; import { - Annotation, AnnotationPropertySerializer, annotationTypeHandlers, annotationTypes, -} from "#/annotation"; -import { - AnnotationGeometryChunk, - AnnotationGeometryData, - AnnotationMetadataChunk, - AnnotationSource, - AnnotationSubsetGeometryChunk, -} from "#/annotation/backend"; -import { AnnotationGeometryChunkSourceBackend } from "#/annotation/backend"; -import { decodeGzip } from "#/async_computation/decode_gzip_request"; -import { requestAsyncComputation } from "#/async_computation/request"; -import { Chunk, ChunkManager, WithParameters } from "#/chunk_manager/backend"; -import { GenericSharedDataSource } from "#/chunk_manager/generic_file_source"; -import { WithSharedCredentialsProviderCounterpart } from "#/credentials_provider/shared_counterpart"; +} from "#src/annotation/index.js"; +import { decodeGzip } from "#src/async_computation/decode_gzip_request.js"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import type { Chunk, ChunkManager } from "#src/chunk_manager/backend.js"; +import { WithParameters } from "#src/chunk_manager/backend.js"; +import { GenericSharedDataSource } from "#src/chunk_manager/generic_file_source.js"; +import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; +import type { ShardingParameters } from "#src/datasource/precomputed/base.js"; import { AnnotationSourceParameters, AnnotationSpatialIndexSourceParameters, @@ -41,60 +45,64 @@ import { MeshSourceParameters, MultiscaleMeshSourceParameters, ShardingHashFunction, - ShardingParameters, SkeletonSourceParameters, VolumeChunkEncoding, VolumeChunkSourceParameters, -} from "#/datasource/precomputed/base"; +} from "#src/datasource/precomputed/base.js"; +import type { + FragmentChunk, + ManifestChunk, + MultiscaleFragmentChunk, + MultiscaleManifestChunk, +} from "#src/mesh/backend.js"; import { assignMeshFragmentData, assignMultiscaleMeshFragmentData, computeOctreeChildOffsets, decodeJsonManifestChunk, decodeTriangleVertexPositionsAndIndices, - FragmentChunk, generateHigherOctreeLevel, - ManifestChunk, MeshSource, - MultiscaleFragmentChunk, - MultiscaleManifestChunk, MultiscaleMeshSource, -} from "#/mesh/backend"; -import { IndexedSegmentPropertySourceBackend } from "#/segmentation_display_state/backend"; -import { SkeletonChunk, SkeletonSource } from "#/skeleton/backend"; -import { decodeSkeletonChunk } from "#/skeleton/decode_precomputed_skeleton"; -import { ChunkDecoder } from "#/sliceview/backend_chunk_decoders"; -import { decodeCompressedSegmentationChunk } from "#/sliceview/backend_chunk_decoders/compressed_segmentation"; -import { decodeCompressoChunk } from "#/sliceview/backend_chunk_decoders/compresso"; -import { decodeJpegChunk } from "#/sliceview/backend_chunk_decoders/jpeg"; -import { decodePngChunk } from "#/sliceview/backend_chunk_decoders/png"; -import { decodeRawChunk } from "#/sliceview/backend_chunk_decoders/raw"; -import { VolumeChunk, VolumeChunkSource } from "#/sliceview/volume/backend"; -import { fetchSpecialHttpByteRange } from "#/util/byte_range_http_requests"; -import { CancellationToken } from "#/util/cancellation"; -import { Borrowed } from "#/util/disposable"; -import { convertEndian32, Endianness } from "#/util/endian"; -import { vec3 } from "#/util/geom"; -import { murmurHash3_x86_128Hash64Bits } from "#/util/hash"; +} from "#src/mesh/backend.js"; +import { decodeDracoPartitioned } from "#src/mesh/draco/index.js"; +import { IndexedSegmentPropertySourceBackend } from "#src/segmentation_display_state/backend.js"; +import type { SkeletonChunk } from "#src/skeleton/backend.js"; +import { SkeletonSource } from "#src/skeleton/backend.js"; +import { decodeSkeletonChunk } from "#src/skeleton/decode_precomputed_skeleton.js"; +import { decodeCompressedSegmentationChunk } from "#src/sliceview/backend_chunk_decoders/compressed_segmentation.js"; +import { decodeCompressoChunk } from "#src/sliceview/backend_chunk_decoders/compresso.js"; +import type { ChunkDecoder } from "#src/sliceview/backend_chunk_decoders/index.js"; +import { decodeJpegChunk } from "#src/sliceview/backend_chunk_decoders/jpeg.js"; +import { decodePngChunk } from "#src/sliceview/backend_chunk_decoders/png.js"; +import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; +import { fetchSpecialHttpByteRange } from "#src/util/byte_range_http_requests.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { convertEndian32, Endianness } from "#src/util/endian.js"; +import { vec3 } from "#src/util/geom.js"; +import { murmurHash3_x86_128Hash64Bits } from "#src/util/hash.js"; import { isNotFoundError, responseArrayBuffer, responseJson, -} from "#/util/http_request"; -import { stableStringify } from "#/util/json"; -import { getObjectId } from "#/util/object_id"; -import { - cancellableFetchSpecialOk, +} from "#src/util/http_request.js"; +import { stableStringify } from "#src/util/json.js"; +import { getObjectId } from "#src/util/object_id.js"; +import type { SpecialProtocolCredentials, SpecialProtocolCredentialsProvider, -} from "#/util/special_protocol_request"; -import { Uint64 } from "#/util/uint64"; +} from "#src/util/special_protocol_request.js"; +import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; +import { Uint64 } from "#src/util/uint64.js"; import { encodeZIndexCompressed, encodeZIndexCompressed3d, zorder3LessThan, -} from "#/util/zorder"; -import { registerSharedObject } from "#/worker_rpc"; +} from "#src/util/zorder.js"; +import { registerSharedObject } from "#src/worker_rpc.js"; // Set to true to validate the multiscale index. const DEBUG_MULTISCALE_INDEX = false; @@ -750,8 +758,7 @@ async function decodeMultiscaleFragmentChunk( const { lod } = chunk; const source = chunk.manifestChunk! .source! as PrecomputedMultiscaleMeshSource; - const m = await import(/* webpackChunkName: "draco" */ "#/mesh/draco"); - const rawMesh = await m.decodeDracoPartitioned( + const rawMesh = await decodeDracoPartitioned( new Uint8Array(response), source.parameters.metadata.vertexQuantizationBits, lod !== 0, diff --git a/src/datasource/precomputed/base.ts b/src/datasource/precomputed/base.ts index 530e77298d..c3414e5e9a 100644 --- a/src/datasource/precomputed/base.ts +++ b/src/datasource/precomputed/base.ts @@ -14,9 +14,12 @@ * limitations under the License. */ -import { AnnotationPropertySpec, AnnotationType } from "#/annotation"; -import { VertexAttributeInfo } from "#/skeleton/base"; -import { mat4 } from "#/util/geom"; +import type { + AnnotationPropertySpec, + AnnotationType, +} from "#src/annotation/index.js"; +import type { VertexAttributeInfo } from "#src/skeleton/base.js"; +import type { mat4 } from "#src/util/geom.js"; export enum VolumeChunkEncoding { RAW = 0, diff --git a/src/datasource/precomputed/frontend.ts b/src/datasource/precomputed/frontend.ts index bfb446fa3f..3ee7808d4b 100644 --- a/src/datasource/precomputed/frontend.ts +++ b/src/datasource/precomputed/frontend.ts @@ -14,80 +14,86 @@ * limitations under the License. */ -import { - AnnotationType, - makeDataBoundsBoundingBoxAnnotationSet, - parseAnnotationPropertySpecs, -} from "#/annotation"; -import { AnnotationGeometryChunkSpecification } from "#/annotation/base"; +import type { AnnotationGeometryChunkSpecification } from "#src/annotation/base.js"; import { AnnotationGeometryChunkSource, MultiscaleAnnotationSource, -} from "#/annotation/frontend_source"; -import { ChunkManager, WithParameters } from "#/chunk_manager/frontend"; +} from "#src/annotation/frontend_source.js"; import { + AnnotationType, + makeDataBoundsBoundingBoxAnnotationSet, + parseAnnotationPropertySpecs, +} from "#src/annotation/index.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { WithParameters } from "#src/chunk_manager/frontend.js"; +import type { BoundingBox, CoordinateSpace, +} from "#src/coordinate_transform.js"; +import { coordinateSpaceFromJson, emptyValidCoordinateSpace, makeCoordinateSpace, makeIdentityTransform, makeIdentityTransformedBoundingBox, -} from "#/coordinate_transform"; -import { WithCredentialsProvider } from "#/credentials_provider/chunk_source_frontend"; -import { +} from "#src/coordinate_transform.js"; +import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; +import type { CompleteUrlOptions, ConvertLegacyUrlOptions, DataSource, - DataSourceProvider, DataSubsourceEntry, GetDataSourceOptions, NormalizeUrlOptions, - RedirectError, -} from "#/datasource"; +} from "#src/datasource/index.js"; +import { DataSourceProvider, RedirectError } from "#src/datasource/index.js"; +import type { + MultiscaleMeshMetadata, + ShardingParameters, + SkeletonMetadata, +} from "#src/datasource/precomputed/base.js"; import { AnnotationSourceParameters, AnnotationSpatialIndexSourceParameters, DataEncoding, IndexedSegmentPropertySourceParameters, MeshSourceParameters, - MultiscaleMeshMetadata, MultiscaleMeshSourceParameters, ShardingHashFunction, - ShardingParameters, - SkeletonMetadata, SkeletonSourceParameters, VolumeChunkEncoding, VolumeChunkSourceParameters, -} from "#/datasource/precomputed/base"; -import { VertexPositionFormat } from "#/mesh/base"; -import { MeshSource, MultiscaleMeshSource } from "#/mesh/frontend"; -import { - IndexedSegmentPropertySource, +} from "#src/datasource/precomputed/base.js"; +import { VertexPositionFormat } from "#src/mesh/base.js"; +import { MeshSource, MultiscaleMeshSource } from "#src/mesh/frontend.js"; +import type { InlineSegmentProperty, InlineSegmentPropertyMap, +} from "#src/segmentation_display_state/property_map.js"; +import { + IndexedSegmentPropertySource, normalizeInlineSegmentPropertyMap, SegmentPropertyMap, -} from "#/segmentation_display_state/property_map"; -import { VertexAttributeInfo } from "#/skeleton/base"; -import { SkeletonSource } from "#/skeleton/frontend"; -import { makeSliceViewChunkSpecification } from "#/sliceview/base"; -import { SliceViewSingleResolutionSource } from "#/sliceview/frontend"; +} from "#src/segmentation_display_state/property_map.js"; +import type { VertexAttributeInfo } from "#src/skeleton/base.js"; +import { SkeletonSource } from "#src/skeleton/frontend.js"; +import { makeSliceViewChunkSpecification } from "#src/sliceview/base.js"; +import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; +import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; import { makeDefaultVolumeChunkSpecifications, - VolumeSourceOptions, VolumeType, -} from "#/sliceview/volume/base"; +} from "#src/sliceview/volume/base.js"; import { MultiscaleVolumeChunkSource, VolumeChunkSource, -} from "#/sliceview/volume/frontend"; -import { transposeNestedArrays } from "#/util/array"; -import { DATA_TYPE_ARRAY_CONSTRUCTOR, DataType } from "#/util/data_type"; -import { Borrowed } from "#/util/disposable"; -import { mat4, vec3 } from "#/util/geom"; -import { completeHttpPath } from "#/util/http_path_completion"; -import { isNotFoundError, responseJson } from "#/util/http_request"; +} from "#src/sliceview/volume/frontend.js"; +import { transposeNestedArrays } from "#src/util/array.js"; +import { DATA_TYPE_ARRAY_CONSTRUCTOR, DataType } from "#src/util/data_type.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { mat4, vec3 } from "#src/util/geom.js"; +import { completeHttpPath } from "#src/util/http_path_completion.js"; +import { isNotFoundError, responseJson } from "#src/util/http_request.js"; import { parseArray, parseFixedLengthArray, @@ -105,16 +111,18 @@ import { verifyString, verifyStringArray, verifyOptionalBoolean, -} from "#/util/json"; -import * as matrix from "#/util/matrix"; -import { getObjectId } from "#/util/object_id"; +} from "#src/util/json.js"; +import * as matrix from "#src/util/matrix.js"; +import { getObjectId } from "#src/util/object_id.js"; +import type { + SpecialProtocolCredentials, + SpecialProtocolCredentialsProvider, +} from "#src/util/special_protocol_request.js"; import { cancellableFetchSpecialOk, parseSpecialUrl, - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#/util/special_protocol_request"; -import { Uint64 } from "#/util/uint64"; +} from "#src/util/special_protocol_request.js"; +import { Uint64 } from "#src/util/uint64.js"; export class PrecomputedVolumeChunkSource extends WithParameters( WithCredentialsProvider()(VolumeChunkSource), diff --git a/src/datasource/precomputed/register_default.ts b/src/datasource/precomputed/register_default.ts index 525b8252b4..ae5ed2d680 100644 --- a/src/datasource/precomputed/register_default.ts +++ b/src/datasource/precomputed/register_default.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { PrecomputedDataSource } from "#/datasource/precomputed/frontend"; -import { registerProvider } from "#/datasource/default_provider"; +import { registerProvider } from "#src/datasource/default_provider.js"; +import { PrecomputedDataSource } from "#src/datasource/precomputed/frontend.js"; registerProvider("precomputed", () => new PrecomputedDataSource()); diff --git a/src/datasource/python/backend.ts b/src/datasource/python/backend.ts index 1d1b30a002..134ef939bc 100644 --- a/src/datasource/python/backend.ts +++ b/src/datasource/python/backend.ts @@ -14,31 +14,37 @@ * limitations under the License. */ -import { WithParameters } from "#/chunk_manager/backend"; +import { WithParameters } from "#src/chunk_manager/backend.js"; import { MeshSourceParameters, SkeletonSourceParameters, VolumeChunkEncoding, VolumeChunkSourceParameters, -} from "#/datasource/python/base"; +} from "#src/datasource/python/base.js"; import { assignMeshFragmentData, decodeTriangleVertexPositionsAndIndices, FragmentChunk, ManifestChunk, MeshSource, -} from "#/mesh/backend"; -import { SkeletonChunk, SkeletonSource } from "#/skeleton/backend"; -import { decodeSkeletonChunk } from "#/skeleton/decode_precomputed_skeleton"; -import { ChunkDecoder } from "#/sliceview/backend_chunk_decoders"; -import { decodeJpegChunk } from "#/sliceview/backend_chunk_decoders/jpeg"; -import { decodeNdstoreNpzChunk } from "#/sliceview/backend_chunk_decoders/ndstoreNpz"; -import { decodeRawChunk } from "#/sliceview/backend_chunk_decoders/raw"; -import { VolumeChunk, VolumeChunkSource } from "#/sliceview/volume/backend"; -import { CancellationToken } from "#/util/cancellation"; -import { Endianness } from "#/util/endian"; -import { cancellableFetchOk, responseArrayBuffer } from "#/util/http_request"; -import { registerSharedObject } from "#/worker_rpc"; +} from "#src/mesh/backend.js"; +import { SkeletonChunk, SkeletonSource } from "#src/skeleton/backend.js"; +import { decodeSkeletonChunk } from "#src/skeleton/decode_precomputed_skeleton.js"; +import { ChunkDecoder } from "#src/sliceview/backend_chunk_decoders/index.js"; +import { decodeJpegChunk } from "#src/sliceview/backend_chunk_decoders/jpeg.js"; +import { decodeNdstoreNpzChunk } from "#src/sliceview/backend_chunk_decoders/ndstoreNpz.js"; +import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; +import { + VolumeChunk, + VolumeChunkSource, +} from "#src/sliceview/volume/backend.js"; +import { CancellationToken } from "#src/util/cancellation.js"; +import { Endianness } from "#src/util/endian.js"; +import { + cancellableFetchOk, + responseArrayBuffer, +} from "#src/util/http_request.js"; +import { registerSharedObject } from "#src/worker_rpc.js"; const chunkDecoders = new Map(); chunkDecoders.set(VolumeChunkEncoding.NPZ, decodeNdstoreNpzChunk); @@ -69,7 +75,7 @@ export class PythonVolumeChunkSource extends WithParameters( } } const response = await cancellableFetchOk( - path, + new URL(path, parameters.baseUrl).href, {}, responseArrayBuffer, cancellationToken, @@ -112,7 +118,7 @@ export class PythonMeshSource extends WithParameters( chunk.manifestChunk!.objectId }`; return cancellableFetchOk( - requestPath, + new URL(requestPath, parameters.baseUrl).href, {}, responseArrayBuffer, cancellationToken, @@ -129,7 +135,7 @@ export class PythonSkeletonSource extends WithParameters( const { parameters } = this; const requestPath = `../../neuroglancer/skeleton/${parameters.key}/${chunk.objectId}`; return cancellableFetchOk( - requestPath, + new URL(requestPath, parameters.baseUrl).href, {}, responseArrayBuffer, cancellationToken, diff --git a/src/datasource/python/base.ts b/src/datasource/python/base.ts index b972a79e04..3294333a9e 100644 --- a/src/datasource/python/base.ts +++ b/src/datasource/python/base.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { VertexAttributeInfo } from "#/skeleton/base"; +import { VertexAttributeInfo } from "#src/skeleton/base.js"; export enum VolumeChunkEncoding { JPEG = 0, @@ -23,6 +23,7 @@ export enum VolumeChunkEncoding { } export class PythonSourceParameters { + baseUrl: string; key: string; } diff --git a/src/datasource/python/frontend.spec.ts b/src/datasource/python/frontend.browser_test.ts similarity index 90% rename from src/datasource/python/frontend.spec.ts rename to src/datasource/python/frontend.browser_test.ts index 719acb25e2..cb1f3f42b7 100644 --- a/src/datasource/python/frontend.spec.ts +++ b/src/datasource/python/frontend.browser_test.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { computeNearIsotropicDownsamplingLevels } from "#/datasource/python/frontend"; +import { describe, it, expect } from "vitest"; +import { computeNearIsotropicDownsamplingLevels } from "#src/datasource/python/frontend.js"; describe("computeNearIsotropicDownsamplingLevels", () => { it("works for simple examples", () => { diff --git a/src/datasource/python/frontend.ts b/src/datasource/python/frontend.ts index c49edb1f5f..73e6b4943b 100644 --- a/src/datasource/python/frontend.ts +++ b/src/datasource/python/frontend.ts @@ -19,54 +19,54 @@ * Support for Python integration. */ -import { makeDataBoundsBoundingBoxAnnotationSet } from "#/annotation"; +import { makeDataBoundsBoundingBoxAnnotationSet } from "#src/annotation/index.js"; import { ChunkManager, ChunkSource, ChunkSourceConstructor, GettableChunkSource, WithParameters, -} from "#/chunk_manager/frontend"; +} from "#src/chunk_manager/frontend.js"; import { CoordinateSpace, coordinateSpaceFromJson, makeCoordinateSpace, makeIdentityTransform, makeIdentityTransformedBoundingBox, -} from "#/coordinate_transform"; +} from "#src/coordinate_transform.js"; import { DataSource, DataSourceProvider, GetDataSourceOptions, -} from "#/datasource"; +} from "#src/datasource/index.js"; import { MeshSourceParameters, PythonSourceParameters, SkeletonSourceParameters, VolumeChunkEncoding, VolumeChunkSourceParameters, -} from "#/datasource/python/base"; -import { MeshSource } from "#/mesh/frontend"; -import { VertexAttributeInfo } from "#/skeleton/base"; -import { SkeletonSource } from "#/skeleton/frontend"; +} from "#src/datasource/python/base.js"; +import { MeshSource } from "#src/mesh/frontend.js"; +import { VertexAttributeInfo } from "#src/skeleton/base.js"; +import { SkeletonSource } from "#src/skeleton/frontend.js"; import { ChunkLayoutPreference, DataType, DEFAULT_MAX_VOXELS_PER_CHUNK_LOG2, -} from "#/sliceview/base"; -import { SliceViewSingleResolutionSource } from "#/sliceview/frontend"; +} from "#src/sliceview/base.js"; +import { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; import { makeDefaultVolumeChunkSpecifications, VolumeSourceOptions, VolumeType, -} from "#/sliceview/volume/base"; +} from "#src/sliceview/volume/base.js"; import { MultiscaleVolumeChunkSource, VolumeChunkSource, -} from "#/sliceview/volume/frontend"; -import { transposeNestedArrays } from "#/util/array"; -import { Borrowed, Owned } from "#/util/disposable"; -import { fetchOk } from "#/util/http_request"; +} from "#src/sliceview/volume/frontend.js"; +import { transposeNestedArrays } from "#src/util/array.js"; +import { Borrowed, Owned } from "#src/util/disposable.js"; +import { fetchOk } from "#src/util/http_request.js"; import { parseFixedLengthArray, verifyEnumString, @@ -77,10 +77,10 @@ import { verifyObjectProperty, verifyOptionalObjectProperty, verifyPositiveInt, -} from "#/util/json"; -import * as matrix from "#/util/matrix"; -import { getObjectId } from "#/util/object_id"; -import * as vector from "#/util/vector"; +} from "#src/util/json.js"; +import * as matrix from "#src/util/matrix.js"; +import { getObjectId } from "#src/util/object_id.js"; +import * as vector from "#src/util/vector.js"; interface PythonChunkSource extends ChunkSource { dataSource: PythonDataSource; @@ -375,6 +375,7 @@ export class PythonMultiscaleVolumeChunkSource extends MultiscaleVolumeChunkSour dataSource: this.dataSource, generation: this.generation, parameters: { + baseUrl: window.location.href, key: this.key, scaleKey: downsampleFactors.join(), encoding: encoding, @@ -439,6 +440,7 @@ export class PythonMultiscaleVolumeChunkSource extends MultiscaleVolumeChunkSour dataSource: this.dataSource, generation: this.generation, parameters: { + baseUrl: window.location.href, key: this.key, vertexAttributes: skeletonVertexAttributes, }, @@ -448,6 +450,7 @@ export class PythonMultiscaleVolumeChunkSource extends MultiscaleVolumeChunkSour dataSource: this.dataSource, generation: this.generation, parameters: { + baseUrl: window.location.href, key: this.key, }, }); @@ -481,7 +484,9 @@ function getVolumeDataSource( { type: "python:VolumeDataSource", key }, async () => { const response = await ( - await fetchOk(`../../neuroglancer/info/${key}`) + await fetchOk( + new URL(`../../neuroglancer/info/${key}`, window.location.href).href, + ) ).json(); const volume = new PythonMultiscaleVolumeChunkSource( dataSourceProvider, @@ -526,6 +531,7 @@ function getVolumeDataSource( dataSource: dataSourceProvider, generation: volume.generation, parameters: { + baseUrl: window.location.href, key: key, }, }), @@ -546,7 +552,12 @@ function getSkeletonDataSource( { type: "python:SkeletonDataSource", key }, async () => { const response = await ( - await fetchOk(`../../neuroglancer/skeletoninfo/${key}`) + await fetchOk( + new URL( + `../../neuroglancer/skeletoninfo/${key}`, + window.location.href, + ).href, + ) ).json(); const { baseModelSpace, subsourceToModelTransform } = parseCoordinateSpaceAndVoxelOffset(response); @@ -562,6 +573,7 @@ function getSkeletonDataSource( dataSource: dataSourceProvider, generation, parameters: { + baseUrl: window.location.href, key, vertexAttributes, }, diff --git a/src/datasource/render/async_computation.ts b/src/datasource/render/async_computation.ts new file mode 100644 index 0000000000..6ffe0e5ecb --- /dev/null +++ b/src/datasource/render/async_computation.ts @@ -0,0 +1 @@ +import "#src/async_computation/decode_jpeg.js"; diff --git a/src/datasource/render/backend.ts b/src/datasource/render/backend.ts index ff6b80f98c..2a41d29363 100644 --- a/src/datasource/render/backend.ts +++ b/src/datasource/render/backend.ts @@ -14,19 +14,23 @@ * limitations under the License. */ -import { decodeJpeg } from "#/async_computation/decode_jpeg_request"; -import { requestAsyncComputation } from "#/async_computation/request"; -import { WithParameters } from "#/chunk_manager/backend"; -import { TileChunkSourceParameters } from "#/datasource/render/base"; -import { ChunkDecoder } from "#/sliceview/backend_chunk_decoders"; -import { postProcessRawData } from "#/sliceview/backend_chunk_decoders/postprocess"; -import { decodeRawChunk } from "#/sliceview/backend_chunk_decoders/raw"; -import { VolumeChunk, VolumeChunkSource } from "#/sliceview/volume/backend"; -import { CancellationToken } from "#/util/cancellation"; -import { Endianness } from "#/util/endian"; -import { vec3 } from "#/util/geom"; -import { cancellableFetchOk, responseArrayBuffer } from "#/util/http_request"; -import { registerSharedObject } from "#/worker_rpc"; +import { decodeJpeg } from "#src/async_computation/decode_jpeg_request.js"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import { WithParameters } from "#src/chunk_manager/backend.js"; +import { TileChunkSourceParameters } from "#src/datasource/render/base.js"; +import type { ChunkDecoder } from "#src/sliceview/backend_chunk_decoders/index.js"; +import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; +import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { Endianness } from "#src/util/endian.js"; +import { vec3 } from "#src/util/geom.js"; +import { + cancellableFetchOk, + responseArrayBuffer, +} from "#src/util/http_request.js"; +import { registerSharedObject } from "#src/worker_rpc.js"; const chunkDecoders = new Map(); chunkDecoders.set( diff --git a/src/datasource/render/frontend.ts b/src/datasource/render/frontend.ts index 22283dfbde..66370a7154 100644 --- a/src/datasource/render/frontend.ts +++ b/src/datasource/render/frontend.ts @@ -19,39 +19,40 @@ * Support for Render (https://github.com/saalfeldlab/render) servers. */ -import { makeDataBoundsBoundingBoxAnnotationSet } from "#/annotation"; -import { ChunkManager, WithParameters } from "#/chunk_manager/frontend"; +import { makeDataBoundsBoundingBoxAnnotationSet } from "#src/annotation/index.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { WithParameters } from "#src/chunk_manager/frontend.js"; import { makeCoordinateSpace, makeIdentityTransform, makeIdentityTransformedBoundingBox, -} from "#/coordinate_transform"; -import { +} from "#src/coordinate_transform.js"; +import type { CompleteUrlOptions, CompletionResult, DataSource, - DataSourceProvider, GetDataSourceOptions, -} from "#/datasource"; -import { TileChunkSourceParameters } from "#/datasource/render/base"; -import { SliceViewSingleResolutionSource } from "#/sliceview/frontend"; +} from "#src/datasource/index.js"; +import { DataSourceProvider } from "#src/datasource/index.js"; +import { TileChunkSourceParameters } from "#src/datasource/render/base.js"; +import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; +import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; import { DataType, makeVolumeChunkSpecification, - VolumeSourceOptions, VolumeType, -} from "#/sliceview/volume/base"; +} from "#src/sliceview/volume/base.js"; import { MultiscaleVolumeChunkSource, VolumeChunkSource, -} from "#/sliceview/volume/frontend"; -import { transposeNestedArrays } from "#/util/array"; +} from "#src/sliceview/volume/frontend.js"; +import { transposeNestedArrays } from "#src/util/array.js"; import { applyCompletionOffset, getPrefixMatchesWithDescriptions, -} from "#/util/completion"; -import { mat4, vec3 } from "#/util/geom"; -import { fetchOk } from "#/util/http_request"; +} from "#src/util/completion.js"; +import { mat4, vec3 } from "#src/util/geom.js"; +import { fetchOk } from "#src/util/http_request.js"; import { parseArray, parseQueryStringParameters, @@ -62,7 +63,7 @@ import { verifyOptionalInt, verifyOptionalString, verifyString, -} from "#/util/json"; +} from "#src/util/json.js"; const VALID_ENCODINGS = new Set(["jpg", "raw16"]); @@ -515,8 +516,8 @@ export function getOwnerInfo( } const pathPattern = - /^([^\/?]+)(?:\/([^\/?]+))?(?:\/([^\/?]+))(?:\/([^\/?]*))?(?:\?(.*))?$/; -const urlPattern = /^((?:(?:(?:http|https):\/\/[^,\/]+)[^\/?]))\/(.*)$/; + /^([^/?]+)(?:\/([^/?]+))?(?:\/([^/?]+))(?:\/([^/?]*))?(?:\?(.*))?$/; +const urlPattern = /^((?:(?:(?:http|https):\/\/[^,/]+)[^/?]))\/(.*)$/; function getVolume(chunkManager: ChunkManager, datasourcePath: string) { let hostname: string; @@ -600,7 +601,7 @@ export async function stackAndProjectCompleter( path: string, ): Promise { const stackMatch = path.match( - /^(?:([^\/]+)(?:\/([^\/]*))?(?:\/([^\/]*))?(\/.*?)?)?$/, + /^(?:([^/]+)(?:\/([^/]*))?(?:\/([^/]*))?(\/.*?)?)?$/, ); if (stackMatch === null) { // URL has incorrect format, don't return any results. diff --git a/src/datasource/render/register_default.ts b/src/datasource/render/register_default.ts index dc2e88d6d1..ae5a9241a0 100644 --- a/src/datasource/render/register_default.ts +++ b/src/datasource/render/register_default.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { registerProvider } from "#/datasource/default_provider"; -import { RenderDataSource } from "#/datasource/render/frontend"; +import { registerProvider } from "#src/datasource/default_provider.js"; +import { RenderDataSource } from "#src/datasource/render/frontend.js"; registerProvider("render", () => new RenderDataSource()); diff --git a/src/datasource/state_share.ts b/src/datasource/state_share.ts index 5cafdbf2f1..9535ba2c66 100644 --- a/src/datasource/state_share.ts +++ b/src/datasource/state_share.ts @@ -1,13 +1,13 @@ -import { RefCounted } from "#/util/disposable"; -import { defaultCredentialsManager } from "#/credentials_provider/default_manager"; -import { StatusMessage } from "#/status"; -import { responseJson } from "#/util/http_request"; +import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { StatusMessage } from "#src/status.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { responseJson } from "#src/util/http_request.js"; import { cancellableFetchSpecialOk, parseSpecialUrl, -} from "#/util/special_protocol_request"; -import { Viewer } from "#/viewer"; -import { makeIcon } from "#/widget/icon"; +} from "#src/util/special_protocol_request.js"; +import type { Viewer } from "#src/viewer.js"; +import { makeIcon } from "#src/widget/icon.js"; type StateServer = { url: string; diff --git a/src/datasource/vtk/async_computation.ts b/src/datasource/vtk/async_computation.ts new file mode 100644 index 0000000000..cf3ffa1111 --- /dev/null +++ b/src/datasource/vtk/async_computation.ts @@ -0,0 +1 @@ +import "#src/async_computation/vtk_mesh.js"; diff --git a/src/datasource/vtk/backend.ts b/src/datasource/vtk/backend.ts index 4e76ab41a4..d58fd46af6 100644 --- a/src/datasource/vtk/backend.ts +++ b/src/datasource/vtk/backend.ts @@ -14,12 +14,13 @@ * limitations under the License. */ -import { requestAsyncComputation } from "#/async_computation/request"; -import { parseVTKFromArrayBuffer } from "#/async_computation/vtk_mesh_request"; -import { GenericSharedDataSource } from "#/chunk_manager/generic_file_source"; -import { registerSingleMeshFactory, SingleMesh } from "#/single_mesh/backend"; -import { CancellationToken } from "#/util/cancellation"; -import { DataType } from "#/util/data_type"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import { parseVTKFromArrayBuffer } from "#src/async_computation/vtk_mesh_request.js"; +import { GenericSharedDataSource } from "#src/chunk_manager/generic_file_source.js"; +import type { SingleMesh } from "#src/single_mesh/backend.js"; +import { registerSingleMeshFactory } from "#src/single_mesh/backend.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { DataType } from "#src/util/data_type.js"; /** * This needs to be a global function, because it identifies the instance of GenericSharedDataSource diff --git a/src/datasource/vtk/frontend.ts b/src/datasource/vtk/frontend.ts index 12a82fb2c8..086dbf54fb 100644 --- a/src/datasource/vtk/frontend.ts +++ b/src/datasource/vtk/frontend.ts @@ -17,15 +17,15 @@ import { makeCoordinateSpace, makeIdentityTransform, -} from "#/coordinate_transform"; -import { +} from "#src/coordinate_transform.js"; +import type { CompleteUrlOptions, DataSource, - DataSourceProvider, GetDataSourceOptions, -} from "#/datasource"; -import { getSingleMeshSource } from "#/single_mesh/frontend"; -import { completeHttpPath } from "#/util/http_path_completion"; +} from "#src/datasource/index.js"; +import { DataSourceProvider } from "#src/datasource/index.js"; +import { getSingleMeshSource } from "#src/single_mesh/frontend.js"; +import { completeHttpPath } from "#src/util/http_path_completion.js"; export class VtkDataSource extends DataSourceProvider { get description() { diff --git a/src/datasource/vtk/register_default.ts b/src/datasource/vtk/register_default.ts index 17bbf48770..3c3b4e571f 100644 --- a/src/datasource/vtk/register_default.ts +++ b/src/datasource/vtk/register_default.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { registerProvider } from "#/datasource/default_provider"; -import { VtkDataSource } from "#/datasource/vtk/frontend"; +import { registerProvider } from "#src/datasource/default_provider.js"; +import { VtkDataSource } from "#src/datasource/vtk/frontend.js"; registerProvider("vtk", () => new VtkDataSource()); diff --git a/src/datasource/zarr/async_computation.ts b/src/datasource/zarr/async_computation.ts new file mode 100644 index 0000000000..df029623c4 --- /dev/null +++ b/src/datasource/zarr/async_computation.ts @@ -0,0 +1,3 @@ +import "#src/async_computation/decode_gzip.js"; +import "#src/async_computation/decode_blosc.js"; +import "#src/async_computation/decode_zstd.js"; diff --git a/src/datasource/zarr/backend.ts b/src/datasource/zarr/backend.ts index 1ef7fc8d2b..66e23bea90 100644 --- a/src/datasource/zarr/backend.ts +++ b/src/datasource/zarr/backend.ts @@ -14,25 +14,29 @@ * limitations under the License. */ -import "#/datasource/zarr/codec/blosc/decode"; -import "#/datasource/zarr/codec/zstd/decode"; -import "#/datasource/zarr/codec/bytes/decode"; -import "#/datasource/zarr/codec/crc32c/decode"; -import "#/datasource/zarr/codec/gzip/decode"; -import "#/datasource/zarr/codec/sharding_indexed/decode"; -import "#/datasource/zarr/codec/transpose/decode"; +import "#src/datasource/zarr/codec/blosc/decode.js"; +import "#src/datasource/zarr/codec/zstd/decode.js"; +import "#src/datasource/zarr/codec/bytes/decode.js"; +import "#src/datasource/zarr/codec/crc32c/decode.js"; -import { WithParameters } from "#/chunk_manager/backend"; -import { WithSharedCredentialsProviderCounterpart } from "#/credentials_provider/shared_counterpart"; -import { VolumeChunkSourceParameters } from "#/datasource/zarr/base"; -import { applySharding, decodeArray } from "#/datasource/zarr/codec/decode"; -import { ChunkKeyEncoding } from "#/datasource/zarr/metadata"; -import { getSpecialProtocolKvStore } from "#/kvstore/special"; -import { postProcessRawData } from "#/sliceview/backend_chunk_decoders/postprocess"; -import { VolumeChunk, VolumeChunkSource } from "#/sliceview/volume/backend"; -import { CancellationToken } from "#/util/cancellation"; -import { SpecialProtocolCredentials } from "#/util/special_protocol_request"; -import { registerSharedObject } from "#/worker_rpc"; +import { WithParameters } from "#src/chunk_manager/backend.js"; +import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; +import { VolumeChunkSourceParameters } from "#src/datasource/zarr/base.js"; +import { + applySharding, + decodeArray, +} from "#src/datasource/zarr/codec/decode.js"; +import "#src/datasource/zarr/codec/gzip/decode.js"; +import "#src/datasource/zarr/codec/sharding_indexed/decode.js"; +import "#src/datasource/zarr/codec/transpose/decode.js"; +import { ChunkKeyEncoding } from "#src/datasource/zarr/metadata/index.js"; +import { getSpecialProtocolKvStore } from "#src/kvstore/special/index.js"; +import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import type { SpecialProtocolCredentials } from "#src/util/special_protocol_request.js"; +import { registerSharedObject } from "#src/worker_rpc.js"; @registerSharedObject() export class ZarrVolumeChunkSource extends WithParameters( diff --git a/src/datasource/zarr/base.ts b/src/datasource/zarr/base.ts index 68151390ad..daacf2dcd9 100644 --- a/src/datasource/zarr/base.ts +++ b/src/datasource/zarr/base.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { ArrayMetadata } from "#/datasource/zarr/metadata"; +import type { ArrayMetadata } from "#src/datasource/zarr/metadata/index.js"; export class VolumeChunkSourceParameters { url: string; diff --git a/src/datasource/zarr/codec/blosc/decode.ts b/src/datasource/zarr/codec/blosc/decode.ts index fc8fbef333..f7d125f1df 100644 --- a/src/datasource/zarr/codec/blosc/decode.ts +++ b/src/datasource/zarr/codec/blosc/decode.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import { decodeBlosc } from "#/async_computation/decode_blosc_request"; -import { requestAsyncComputation } from "#/async_computation/request"; -import { CodecKind } from "#/datasource/zarr/codec"; -import type { Configuration } from "#/datasource/zarr/codec/blosc/resolve"; -import { registerCodec } from "#/datasource/zarr/codec/decode"; -import { CancellationToken } from "#/util/cancellation"; +import { decodeBlosc } from "#src/async_computation/decode_blosc_request.js"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import type { Configuration } from "#src/datasource/zarr/codec/blosc/resolve.js"; +import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; +import { CodecKind } from "#src/datasource/zarr/codec/index.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; registerCodec({ name: "blosc", diff --git a/src/datasource/zarr/codec/blosc/resolve.ts b/src/datasource/zarr/codec/blosc/resolve.ts index a31962e8e1..c7de346e4b 100644 --- a/src/datasource/zarr/codec/blosc/resolve.ts +++ b/src/datasource/zarr/codec/blosc/resolve.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import { CodecKind } from "#/datasource/zarr/codec"; -import { registerCodec } from "#/datasource/zarr/codec/resolve"; -import { verifyObject } from "#/util/json"; +import { CodecKind } from "#src/datasource/zarr/codec/index.js"; +import { registerCodec } from "#src/datasource/zarr/codec/resolve.js"; +import { verifyObject } from "#src/util/json.js"; -export type Configuration = {}; +export type Configuration = object; registerCodec({ name: "blosc", diff --git a/src/datasource/zarr/codec/bytes/decode.ts b/src/datasource/zarr/codec/bytes/decode.ts index 893ffa8e7b..53ae1eda0a 100644 --- a/src/datasource/zarr/codec/bytes/decode.ts +++ b/src/datasource/zarr/codec/bytes/decode.ts @@ -14,12 +14,13 @@ * limitations under the License. */ -import { CodecArrayInfo, CodecKind } from "#/datasource/zarr/codec"; -import type { Configuration } from "#/datasource/zarr/codec/bytes/resolve"; -import { registerCodec } from "#/datasource/zarr/codec/decode"; -import { CancellationToken } from "#/util/cancellation"; -import { DATA_TYPE_BYTES, makeDataTypeArrayView } from "#/util/data_type"; -import { convertEndian } from "#/util/endian"; +import type { Configuration } from "#src/datasource/zarr/codec/bytes/resolve.js"; +import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; +import type { CodecArrayInfo } from "#src/datasource/zarr/codec/index.js"; +import { CodecKind } from "#src/datasource/zarr/codec/index.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { DATA_TYPE_BYTES, makeDataTypeArrayView } from "#src/util/data_type.js"; +import { convertEndian } from "#src/util/endian.js"; registerCodec({ name: "bytes", diff --git a/src/datasource/zarr/codec/bytes/resolve.ts b/src/datasource/zarr/codec/bytes/resolve.ts index 95fc00659b..f80d3e8f45 100644 --- a/src/datasource/zarr/codec/bytes/resolve.ts +++ b/src/datasource/zarr/codec/bytes/resolve.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import { +import type { CodecArrayInfo, CodecArrayLayoutInfo, - CodecKind, -} from "#/datasource/zarr/codec"; -import { registerCodec } from "#/datasource/zarr/codec/resolve"; -import { DATA_TYPE_BYTES } from "#/util/data_type"; -import { ENDIANNESS, Endianness } from "#/util/endian"; -import { verifyObject, verifyObjectProperty } from "#/util/json"; +} from "#src/datasource/zarr/codec/index.js"; +import { CodecKind } from "#src/datasource/zarr/codec/index.js"; +import { registerCodec } from "#src/datasource/zarr/codec/resolve.js"; +import { DATA_TYPE_BYTES } from "#src/util/data_type.js"; +import { ENDIANNESS, Endianness } from "#src/util/endian.js"; +import { verifyObject, verifyObjectProperty } from "#src/util/json.js"; export interface Configuration { endian: Endianness; diff --git a/src/datasource/zarr/codec/crc32c/decode.ts b/src/datasource/zarr/codec/crc32c/decode.ts index 03bae598fa..569b2b477c 100644 --- a/src/datasource/zarr/codec/crc32c/decode.ts +++ b/src/datasource/zarr/codec/crc32c/decode.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import { CodecKind } from "#/datasource/zarr/codec"; -import type { Configuration } from "#/datasource/zarr/codec/crc32c/resolve"; -import { registerCodec } from "#/datasource/zarr/codec/decode"; -import { CancellationToken } from "#/util/cancellation"; +import type { Configuration } from "#src/datasource/zarr/codec/crc32c/resolve.js"; +import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; +import { CodecKind } from "#src/datasource/zarr/codec/index.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; const checksumSize = 4; diff --git a/src/datasource/zarr/codec/crc32c/resolve.ts b/src/datasource/zarr/codec/crc32c/resolve.ts index 976e6d449c..0203660794 100644 --- a/src/datasource/zarr/codec/crc32c/resolve.ts +++ b/src/datasource/zarr/codec/crc32c/resolve.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import { CodecKind } from "#/datasource/zarr/codec"; -import { registerCodec } from "#/datasource/zarr/codec/resolve"; +import { CodecKind } from "#src/datasource/zarr/codec/index.js"; +import { registerCodec } from "#src/datasource/zarr/codec/resolve.js"; -export type Configuration = {}; +export type Configuration = object; registerCodec({ name: "crc32c", diff --git a/src/datasource/zarr/codec/decode.ts b/src/datasource/zarr/codec/decode.ts index 79890b3f30..bd5c5f49a7 100644 --- a/src/datasource/zarr/codec/decode.ts +++ b/src/datasource/zarr/codec/decode.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import { ChunkManager } from "#/chunk_manager/backend"; -import { +import type { ChunkManager } from "#src/chunk_manager/backend.js"; +import type { CodecArrayInfo, CodecChainSpec, - CodecKind, -} from "#/datasource/zarr/codec"; -import { ReadableKvStore } from "#/kvstore"; -import { CancellationToken } from "#/util/cancellation"; -import { RefCounted } from "#/util/disposable"; +} from "#src/datasource/zarr/codec/index.js"; +import { CodecKind } from "#src/datasource/zarr/codec/index.js"; +import type { ReadableKvStore } from "#src/kvstore/index.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import type { RefCounted } from "#src/util/disposable.js"; export interface Codec { name: string; diff --git a/src/datasource/zarr/codec/gzip/decode.ts b/src/datasource/zarr/codec/gzip/decode.ts index bcb79c7332..3be3ef77e9 100644 --- a/src/datasource/zarr/codec/gzip/decode.ts +++ b/src/datasource/zarr/codec/gzip/decode.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import { decodeGzip } from "#/async_computation/decode_gzip_request"; -import { requestAsyncComputation } from "#/async_computation/request"; -import { CodecKind } from "#/datasource/zarr/codec"; -import { registerCodec } from "#/datasource/zarr/codec/decode"; -import type { Configuration } from "#/datasource/zarr/codec/gzip/resolve"; -import { CancellationToken } from "#/util/cancellation"; +import { decodeGzip } from "#src/async_computation/decode_gzip_request.js"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; +import type { Configuration } from "#src/datasource/zarr/codec/gzip/resolve.js"; +import { CodecKind } from "#src/datasource/zarr/codec/index.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; registerCodec({ name: "gzip", diff --git a/src/datasource/zarr/codec/gzip/resolve.ts b/src/datasource/zarr/codec/gzip/resolve.ts index aabd4ec67c..eec56f4c64 100644 --- a/src/datasource/zarr/codec/gzip/resolve.ts +++ b/src/datasource/zarr/codec/gzip/resolve.ts @@ -14,9 +14,13 @@ * limitations under the License. */ -import { CodecKind } from "#/datasource/zarr/codec"; -import { registerCodec } from "#/datasource/zarr/codec/resolve"; -import { verifyInt, verifyObject, verifyObjectProperty } from "#/util/json"; +import { CodecKind } from "#src/datasource/zarr/codec/index.js"; +import { registerCodec } from "#src/datasource/zarr/codec/resolve.js"; +import { + verifyInt, + verifyObject, + verifyObjectProperty, +} from "#src/util/json.js"; export interface Configuration { level: number; diff --git a/src/datasource/zarr/codec/index.ts b/src/datasource/zarr/codec/index.ts index 4def8f9c87..bb99f48ebb 100644 --- a/src/datasource/zarr/codec/index.ts +++ b/src/datasource/zarr/codec/index.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { DataType } from "#/util/data_type"; +import type { DataType } from "#src/util/data_type.js"; export enum CodecKind { arrayToArray = 0, diff --git a/src/datasource/zarr/codec/resolve.ts b/src/datasource/zarr/codec/resolve.ts index d407164867..52405a79b5 100644 --- a/src/datasource/zarr/codec/resolve.ts +++ b/src/datasource/zarr/codec/resolve.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import { +import type { CodecArrayInfo, CodecArrayLayoutInfo, CodecChainSpec, - CodecKind, CodecSpec, ShardingInfo, -} from "#/datasource/zarr/codec"; -import { parseNameAndConfiguration } from "#/datasource/zarr/metadata/parse"; -import { parseArray } from "#/util/json"; +} from "#src/datasource/zarr/codec/index.js"; +import { CodecKind } from "#src/datasource/zarr/codec/index.js"; +import { parseNameAndConfiguration } from "#src/datasource/zarr/metadata/parse_util.js"; +import { parseArray } from "#src/util/json.js"; function getCodecResolver(obj: unknown): { resolver: CodecResolver; diff --git a/src/datasource/zarr/codec/sharding_indexed/decode.ts b/src/datasource/zarr/codec/sharding_indexed/decode.ts index d47c623803..1c7a97ba0b 100644 --- a/src/datasource/zarr/codec/sharding_indexed/decode.ts +++ b/src/datasource/zarr/codec/sharding_indexed/decode.ts @@ -14,23 +14,26 @@ * limitations under the License. */ -import { ChunkManager } from "#/chunk_manager/backend"; -import { SimpleAsyncCache } from "#/chunk_manager/generic_file_source"; -import { CodecKind } from "#/datasource/zarr/codec"; -import { decodeArray, registerCodec } from "#/datasource/zarr/codec/decode"; -import { - Configuration, - ShardIndexLocation, -} from "#/datasource/zarr/codec/sharding_indexed/resolve"; +import type { ChunkManager } from "#src/chunk_manager/backend.js"; +import { SimpleAsyncCache } from "#src/chunk_manager/generic_file_source.js"; import { + decodeArray, + registerCodec, +} from "#src/datasource/zarr/codec/decode.js"; +import { CodecKind } from "#src/datasource/zarr/codec/index.js"; +import type { Configuration } from "#src/datasource/zarr/codec/sharding_indexed/resolve.js"; +import { ShardIndexLocation } from "#src/datasource/zarr/codec/sharding_indexed/resolve.js"; +import type { ByteRangeRequest, - composeByteRangeRequest, ReadableKvStore, ReadOptions, ReadResponse, -} from "#/kvstore"; -import { CancellationToken, uncancelableToken } from "#/util/cancellation"; -import { Owned, RefCounted } from "#/util/disposable"; +} from "#src/kvstore/index.js"; +import { composeByteRangeRequest } from "#src/kvstore/index.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { uncancelableToken } from "#src/util/cancellation.js"; +import type { Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; type ShardIndex = BigUint64Array | undefined; diff --git a/src/datasource/zarr/codec/sharding_indexed/resolve.ts b/src/datasource/zarr/codec/sharding_indexed/resolve.ts index 7b0f59c699..58fd2212d5 100644 --- a/src/datasource/zarr/codec/sharding_indexed/resolve.ts +++ b/src/datasource/zarr/codec/sharding_indexed/resolve.ts @@ -14,24 +14,24 @@ * limitations under the License. */ -import { +import type { CodecArrayInfo, CodecArrayLayoutInfo, CodecChainSpec, - CodecKind, -} from "#/datasource/zarr/codec"; +} from "#src/datasource/zarr/codec/index.js"; +import { CodecKind } from "#src/datasource/zarr/codec/index.js"; import { parseCodecChainSpec, registerCodec, -} from "#/datasource/zarr/codec/resolve"; -import { parseChunkShape } from "#/datasource/zarr/metadata/parse"; -import { DataType } from "#/util/data_type"; +} from "#src/datasource/zarr/codec/resolve.js"; +import { parseChunkShape } from "#src/datasource/zarr/metadata/parse.js"; +import { DataType } from "#src/util/data_type.js"; import { verifyEnumString, verifyObject, verifyObjectProperty, verifyOptionalObjectProperty, -} from "#/util/json"; +} from "#src/util/json.js"; export enum ShardIndexLocation { START, diff --git a/src/datasource/zarr/codec/transpose/decode.ts b/src/datasource/zarr/codec/transpose/decode.ts index 33eb402c3f..a08d4a36e8 100644 --- a/src/datasource/zarr/codec/transpose/decode.ts +++ b/src/datasource/zarr/codec/transpose/decode.ts @@ -14,10 +14,11 @@ * limitations under the License. */ -import { CodecArrayInfo, CodecKind } from "#/datasource/zarr/codec"; -import { registerCodec } from "#/datasource/zarr/codec/decode"; -import type { Configuration } from "#/datasource/zarr/codec/transpose/resolve"; -import { CancellationToken } from "#/util/cancellation"; +import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; +import type { CodecArrayInfo } from "#src/datasource/zarr/codec/index.js"; +import { CodecKind } from "#src/datasource/zarr/codec/index.js"; +import type { Configuration } from "#src/datasource/zarr/codec/transpose/resolve.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; registerCodec({ name: "transpose", diff --git a/src/datasource/zarr/codec/transpose/resolve.ts b/src/datasource/zarr/codec/transpose/resolve.ts index afc7270922..a4b27777cd 100644 --- a/src/datasource/zarr/codec/transpose/resolve.ts +++ b/src/datasource/zarr/codec/transpose/resolve.ts @@ -14,17 +14,17 @@ * limitations under the License. */ -import { +import type { CodecArrayInfo, CodecArrayLayoutInfo, - CodecKind, -} from "#/datasource/zarr/codec"; -import { registerCodec } from "#/datasource/zarr/codec/resolve"; +} from "#src/datasource/zarr/codec/index.js"; +import { CodecKind } from "#src/datasource/zarr/codec/index.js"; +import { registerCodec } from "#src/datasource/zarr/codec/resolve.js"; import { parseFixedLengthArray, verifyObject, verifyObjectProperty, -} from "#/util/json"; +} from "#src/util/json.js"; export interface Configuration { encodedToDecoded: number[]; diff --git a/src/datasource/zarr/codec/zstd/decode.ts b/src/datasource/zarr/codec/zstd/decode.ts index 3f047c0ccd..f29aef6dbd 100644 --- a/src/datasource/zarr/codec/zstd/decode.ts +++ b/src/datasource/zarr/codec/zstd/decode.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import { decodeZstd } from "#/async_computation/decode_zstd_request"; -import { requestAsyncComputation } from "#/async_computation/request"; -import { CodecKind } from "#/datasource/zarr/codec"; -import { registerCodec } from "#/datasource/zarr/codec/decode"; -import type { Configuration } from "#/datasource/zarr/codec/zstd/resolve"; -import { CancellationToken } from "#/util/cancellation"; +import { decodeZstd } from "#src/async_computation/decode_zstd_request.js"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; +import { CodecKind } from "#src/datasource/zarr/codec/index.js"; +import type { Configuration } from "#src/datasource/zarr/codec/zstd/resolve.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; registerCodec({ name: "zstd", diff --git a/src/datasource/zarr/codec/zstd/resolve.ts b/src/datasource/zarr/codec/zstd/resolve.ts index f2b025f5d2..2d06865a47 100644 --- a/src/datasource/zarr/codec/zstd/resolve.ts +++ b/src/datasource/zarr/codec/zstd/resolve.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import { CodecKind } from "#/datasource/zarr/codec"; -import { registerCodec } from "#/datasource/zarr/codec/resolve"; -import { verifyObject } from "#/util/json"; +import { CodecKind } from "#src/datasource/zarr/codec/index.js"; +import { registerCodec } from "#src/datasource/zarr/codec/resolve.js"; +import { verifyObject } from "#src/util/json.js"; -export type Configuration = {}; +export type Configuration = object; registerCodec({ name: "zstd", diff --git a/src/datasource/zarr/frontend.ts b/src/datasource/zarr/frontend.ts index 2b1f39097a..d27f478097 100644 --- a/src/datasource/zarr/frontend.ts +++ b/src/datasource/zarr/frontend.ts @@ -14,75 +14,79 @@ * limitations under the License. */ -import "#/datasource/zarr/codec/blosc/resolve"; -import "#/datasource/zarr/codec/zstd/resolve"; -import "#/datasource/zarr/codec/bytes/resolve"; -import "#/datasource/zarr/codec/crc32c/resolve"; -import "#/datasource/zarr/codec/gzip/resolve"; -import "#/datasource/zarr/codec/sharding_indexed/resolve"; -import "#/datasource/zarr/codec/transpose/resolve"; +import "#src/datasource/zarr/codec/blosc/resolve.js"; +import "#src/datasource/zarr/codec/zstd/resolve.js"; -import { makeDataBoundsBoundingBoxAnnotationSet } from "#/annotation"; -import { ChunkManager, WithParameters } from "#/chunk_manager/frontend"; +import { makeDataBoundsBoundingBoxAnnotationSet } from "#src/annotation/index.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { WithParameters } from "#src/chunk_manager/frontend.js"; +import type { CoordinateSpace } from "#src/coordinate_transform.js"; import { - CoordinateSpace, makeCoordinateSpace, makeIdentityTransform, makeIdentityTransformedBoundingBox, -} from "#/coordinate_transform"; -import { WithCredentialsProvider } from "#/credentials_provider/chunk_source_frontend"; -import { +} from "#src/coordinate_transform.js"; +import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; +import type { CompleteUrlOptions, DataSource, - DataSourceProvider, GetDataSourceOptions, -} from "#/datasource"; -import { VolumeChunkSourceParameters } from "#/datasource/zarr/base"; -import { +} from "#src/datasource/index.js"; +import { DataSourceProvider } from "#src/datasource/index.js"; +import { VolumeChunkSourceParameters } from "#src/datasource/zarr/base.js"; +import "#src/datasource/zarr/codec/bytes/resolve.js"; +import "#src/datasource/zarr/codec/crc32c/resolve.js"; +import "#src/datasource/zarr/codec/gzip/resolve.js"; +import "#src/datasource/zarr/codec/sharding_indexed/resolve.js"; +import "#src/datasource/zarr/codec/transpose/resolve.js"; +import type { ArrayMetadata, DimensionSeparator, Metadata, NodeType, -} from "#/datasource/zarr/metadata"; +} from "#src/datasource/zarr/metadata/index.js"; import { parseDimensionSeparator, parseDimensionUnit, parseV2Metadata, parseV3Metadata, -} from "#/datasource/zarr/metadata/parse"; -import { OmeMultiscaleMetadata, parseOmeMetadata } from "#/datasource/zarr/ome"; -import { SliceViewSingleResolutionSource } from "#/sliceview/frontend"; +} from "#src/datasource/zarr/metadata/parse.js"; +import type { OmeMultiscaleMetadata } from "#src/datasource/zarr/ome.js"; +import { parseOmeMetadata } from "#src/datasource/zarr/ome.js"; +import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; +import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; import { DataType, makeDefaultVolumeChunkSpecifications, - VolumeSourceOptions, VolumeType, -} from "#/sliceview/volume/base"; +} from "#src/sliceview/volume/base.js"; import { MultiscaleVolumeChunkSource as GenericMultiscaleVolumeChunkSource, VolumeChunkSource, -} from "#/sliceview/volume/frontend"; -import { transposeNestedArrays } from "#/util/array"; +} from "#src/sliceview/volume/frontend.js"; +import { transposeNestedArrays } from "#src/util/array.js"; import { applyCompletionOffset, completeQueryStringParametersFromTable, -} from "#/util/completion"; -import { Borrowed } from "#/util/disposable"; -import { completeHttpPath } from "#/util/http_path_completion"; -import { isNotFoundError, responseJson } from "#/util/http_request"; +} from "#src/util/completion.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { completeHttpPath } from "#src/util/http_path_completion.js"; +import { isNotFoundError, responseJson } from "#src/util/http_request.js"; import { parseQueryStringParameters, verifyObject, verifyOptionalObjectProperty, -} from "#/util/json"; -import * as matrix from "#/util/matrix"; -import { getObjectId } from "#/util/object_id"; +} from "#src/util/json.js"; +import * as matrix from "#src/util/matrix.js"; +import { getObjectId } from "#src/util/object_id.js"; +import type { + SpecialProtocolCredentials, + SpecialProtocolCredentialsProvider, +} from "#src/util/special_protocol_request.js"; import { cancellableFetchSpecialOk, parseSpecialUrl, - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#/util/special_protocol_request"; +} from "#src/util/special_protocol_request.js"; class ZarrVolumeChunkSource extends WithParameters( WithCredentialsProvider()(VolumeChunkSource), diff --git a/src/datasource/zarr/metadata/index.ts b/src/datasource/zarr/metadata/index.ts index 0572048437..207fb1a2fb 100644 --- a/src/datasource/zarr/metadata/index.ts +++ b/src/datasource/zarr/metadata/index.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { CodecChainSpec } from "#/datasource/zarr/codec"; -import { DataType } from "#/util/data_type"; -import { Uint64 } from "#/util/uint64"; +import type { CodecChainSpec } from "#src/datasource/zarr/codec/index.js"; +import type { DataType } from "#src/util/data_type.js"; +import type { Uint64 } from "#src/util/uint64.js"; export enum ChunkKeyEncoding { DEFAULT = 0, diff --git a/src/datasource/zarr/metadata/parse.ts b/src/datasource/zarr/metadata/parse.ts index 4f5177fd19..af158972b5 100644 --- a/src/datasource/zarr/metadata/parse.ts +++ b/src/datasource/zarr/metadata/parse.ts @@ -14,16 +14,17 @@ * limitations under the License. */ -import { parseCodecChainSpec } from "#/datasource/zarr/codec/resolve"; -import { +import { parseCodecChainSpec } from "#src/datasource/zarr/codec/resolve.js"; +import type { ArrayMetadata, - ChunkKeyEncoding, DimensionSeparator, Metadata, NodeType, -} from "#/datasource/zarr/metadata"; -import { DATA_TYPE_BYTES, DataType } from "#/util/data_type"; -import { Endianness } from "#/util/endian"; +} from "#src/datasource/zarr/metadata/index.js"; +import { ChunkKeyEncoding } from "#src/datasource/zarr/metadata/index.js"; +import { parseNameAndConfiguration } from "#src/datasource/zarr/metadata/parse_util.js"; +import { DATA_TYPE_BYTES, DataType } from "#src/util/data_type.js"; +import { Endianness } from "#src/util/endian.js"; import { parseArray, parseFixedLengthArray, @@ -35,9 +36,9 @@ import { verifyOptionalFixedLengthArrayOfStringOrNull, verifyOptionalObjectProperty, verifyString, -} from "#/util/json"; -import { parseNumpyDtype } from "#/util/numpy_dtype"; -import { allSiPrefixes } from "#/util/si_units"; +} from "#src/util/json.js"; +import { parseNumpyDtype } from "#src/util/numpy_dtype.js"; +import { allSiPrefixes } from "#src/util/si_units.js"; function parseShape(obj: unknown): number[] { return parseArray(obj, (x) => { @@ -76,6 +77,7 @@ const UNITS = new Map([ ["foot", { unit: "m", scale: 0.3048 }], ["inch", { unit: "m", scale: 0.0254 }], ["mile", { unit: "m", scale: 1609.34 }], + // eslint-disable-next-line @typescript-eslint/no-loss-of-precision ["parsec", { unit: "m", scale: 3.0856775814913673e16 }], ["yard", { unit: "m", scale: 0.9144 }], ["minute", { unit: "s", scale: 60 }], @@ -165,26 +167,6 @@ function parseFillValue(dataType: DataType, value: unknown) { } } -export function parseNameAndConfiguration( - obj: unknown, - parseName: (name: string) => Name, - parseConfiguration: (configuration: unknown, name: Name) => Configuration, -): { name: Name; configuration: Configuration } { - verifyObject(obj); - const name = verifyObjectProperty(obj, "name", (value) => - parseName(verifyString(value)), - ); - const configuration = verifyObjectProperty(obj, "configuration", (value) => { - if (value === undefined) { - value = {}; - } else { - verifyObject(value); - } - return parseConfiguration(value, name); - }); - return { name, configuration }; -} - export function parseV3Metadata( obj: unknown, expectedNodeType: NodeType | undefined, diff --git a/src/datasource/zarr/metadata/parse_util.ts b/src/datasource/zarr/metadata/parse_util.ts new file mode 100644 index 0000000000..5fd5c2e724 --- /dev/null +++ b/src/datasource/zarr/metadata/parse_util.ts @@ -0,0 +1,41 @@ +/** + * @license + * Copyright 2023 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + verifyObject, + verifyObjectProperty, + verifyString, +} from "#src/util/json.js"; + +export function parseNameAndConfiguration( + obj: unknown, + parseName: (name: string) => Name, + parseConfiguration: (configuration: unknown, name: Name) => Configuration, +): { name: Name; configuration: Configuration } { + verifyObject(obj); + const name = verifyObjectProperty(obj, "name", (value) => + parseName(verifyString(value)), + ); + const configuration = verifyObjectProperty(obj, "configuration", (value) => { + if (value === undefined) { + value = {}; + } else { + verifyObject(value); + } + return parseConfiguration(value, name); + }); + return { name, configuration }; +} diff --git a/src/datasource/zarr/ome.ts b/src/datasource/zarr/ome.ts index 832d5c2aa4..91a2455aed 100644 --- a/src/datasource/zarr/ome.ts +++ b/src/datasource/zarr/ome.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { CoordinateSpace, makeCoordinateSpace } from "#/coordinate_transform"; +import type { CoordinateSpace } from "#src/coordinate_transform.js"; +import { makeCoordinateSpace } from "#src/coordinate_transform.js"; import { parseArray, parseFixedLengthArray, @@ -24,9 +25,9 @@ import { verifyObjectProperty, verifyOptionalObjectProperty, verifyString, -} from "#/util/json"; -import * as matrix from "#/util/matrix"; -import { allSiPrefixes } from "#/util/si_units"; +} from "#src/util/json.js"; +import * as matrix from "#src/util/matrix.js"; +import { allSiPrefixes } from "#src/util/si_units.js"; export interface OmeMultiscaleScale { url: string; @@ -45,6 +46,7 @@ const OME_UNITS = new Map([ ["foot", { unit: "m", scale: 0.3048 }], ["inch", { unit: "m", scale: 0.0254 }], ["mile", { unit: "m", scale: 1609.34 }], + // eslint-disable-next-line @typescript-eslint/no-loss-of-precision ["parsec", { unit: "m", scale: 3.0856775814913673e16 }], ["yard", { unit: "m", scale: 0.9144 }], ["minute", { unit: "s", scale: 60 }], diff --git a/src/datasource/zarr/register_default.ts b/src/datasource/zarr/register_default.ts index ecdc5b8449..7046d2bc82 100644 --- a/src/datasource/zarr/register_default.ts +++ b/src/datasource/zarr/register_default.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { registerProvider } from "#/datasource/default_provider"; -import { ZarrDataSource } from "#/datasource/zarr/frontend"; +import { registerProvider } from "#src/datasource/default_provider.js"; +import { ZarrDataSource } from "#src/datasource/zarr/frontend.js"; registerProvider("zarr", () => new ZarrDataSource()); registerProvider("zarr2", () => new ZarrDataSource(2)); diff --git a/src/display_context.ts b/src/display_context.ts index 25a98f2262..aeab87facf 100644 --- a/src/display_context.ts +++ b/src/display_context.ts @@ -14,15 +14,17 @@ * limitations under the License. */ -import { FrameNumberCounter } from "#/chunk_manager/frontend"; -import { TrackableValue } from "#/trackable_value"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { Borrowed, RefCounted } from "#/util/disposable"; -import { mat4 } from "#/util/geom"; -import { parseFixedLengthArray, verifyFloat01 } from "#/util/json"; -import { NullarySignal } from "#/util/signal"; -import { WatchableVisibilityPriority } from "#/visibility_priority/frontend"; -import { GL, initializeWebGL } from "#/webgl/context"; +import type { FrameNumberCounter } from "#src/chunk_manager/frontend.js"; +import { TrackableValue } from "#src/trackable_value.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import type { mat4 } from "#src/util/geom.js"; +import { parseFixedLengthArray, verifyFloat01 } from "#src/util/json.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; +import type { GL } from "#src/webgl/context.js"; +import { initializeWebGL } from "#src/webgl/context.js"; export class RenderViewport { // Width of visible portion of panel in canvas pixels. diff --git a/src/gpu_hash/hash_table.benchmark.ts b/src/gpu_hash/hash_table.benchmark.ts index 0e71f22439..3e778fffa4 100644 --- a/src/gpu_hash/hash_table.benchmark.ts +++ b/src/gpu_hash/hash_table.benchmark.ts @@ -14,17 +14,18 @@ * limitations under the License. */ -import { HashSetUint64 } from "#/gpu_hash/hash_table"; -import { getRandomValues } from "#/util/random"; -import { Uint64 } from "#/util/uint64"; +import { describe, bench } from "vitest"; +import { HashSetUint64 } from "#src/gpu_hash/hash_table.js"; +import { getRandomValues } from "#src/util/random.js"; +import { Uint64 } from "#src/util/uint64.js"; -suite("gpu_hash/hash_table", () => { +describe("gpu_hash/hash_table", () => { const ht = new HashSetUint64(); const numValues = 100; const values = new Uint32Array(numValues * 2); const temp = new Uint64(); getRandomValues(values); - benchmark("insert", () => { + bench("insert", () => { ht.clear(); for (let i = 0, length = values.length; i < length; i += 2) { temp.low = values[i]; diff --git a/src/gpu_hash/hash_table.spec.ts b/src/gpu_hash/hash_table.spec.ts index cadd9e950b..f567615437 100644 --- a/src/gpu_hash/hash_table.spec.ts +++ b/src/gpu_hash/hash_table.spec.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import { HashMapUint64, HashSetUint64 } from "#/gpu_hash/hash_table"; -import { Uint64 } from "#/util/uint64"; +import { describe, it, expect } from "vitest"; +import { HashMapUint64, HashSetUint64 } from "#src/gpu_hash/hash_table.js"; +import { Uint64 } from "#src/util/uint64.js"; describe("gpu_hash/hash_table", () => { it("HashSetUint64", () => { @@ -26,22 +27,21 @@ describe("gpu_hash/hash_table", () => { const htValues = new Set(); for (const v of ht.unsafeKeys()) { const s = v.toString(); - expect(htValues.has(s)).toBe( + expect(htValues.has(s), `Duplicate key in hash table: ${s}`).toBe( false, - `Duplicate key in hash table: ${s}`, ); - expect(set.has(s)).toBe(true, `Unexpected key ${s} in hash table`); + expect(set.has(s), `Unexpected key ${s} in hash table`).toBe(true); htValues.add(s); } for (const s of set) { - expect(htValues.has(s)).toBe(true, `Hash table is missing key ${s}`); + expect(htValues.has(s), `Hash table is missing key ${s}`).toBe(true); } } function compareViaHas() { for (const s of set) { const k = Uint64.parseString(s); - expect(ht.has(k)).toBe(true, `Hash table is missing key ${s}`); + expect(ht.has(k), `Hash table is missing key ${s}`).toBe(true); } } @@ -54,10 +54,10 @@ describe("gpu_hash/hash_table", () => { function testInsert(k: Uint64) { const s = "" + k; set.add(s); - expect(ht.has(k)).toBe( - false, + expect( + ht.has(k), `Unexpected positive has result for ${[k.low, k.high]}`, - ); + ).toBe(false); ht.add(k); compare(); } @@ -90,19 +90,18 @@ describe("gpu_hash/hash_table", () => { const htValues = new Map(); for (const [key, value] of ht) { const s = key.toString(); - expect(htValues.has(s)).toBe( + expect(htValues.has(s), `Duplicate key in hash table: ${s}`).toBe( false, - `Duplicate key in hash table: ${s}`, ); - expect(map.has(s)).toBe(true, `Unexpected key ${s} in hash table`); + expect(map.has(s), `Unexpected key ${s} in hash table`).toBe(true); htValues.set(s, value.clone()); } for (const [s, value] of map) { const v = htValues.get(s); - expect(v !== undefined && Uint64.equal(v, value)).toBe( - true, + expect( + v !== undefined && Uint64.equal(v, value), `Hash table maps ${s} -> ${v} rather than -> ${value}`, - ); + ).toBe(true); } } @@ -111,11 +110,11 @@ describe("gpu_hash/hash_table", () => { for (const [s, expectedValue] of map) { const key = Uint64.parseString(s); const has = ht.get(key, value); - expect(has && Uint64.equal(value, expectedValue)).toBe( - true, + expect( + has && Uint64.equal(value, expectedValue), `Hash table maps ${key} -> ${has ? value : undefined} ` + `rather than -> ${expectedValue}`, - ); + ).toBe(true); } } @@ -128,7 +127,7 @@ describe("gpu_hash/hash_table", () => { function testInsert(k: Uint64, v: Uint64) { const s = "" + k; map.set(s, v); - expect(ht.has(k)).toBe(false, `Unexpected positive has result for ${s}`); + expect(ht.has(k), `Unexpected positive has result for ${s}`).toBe(false); ht.set(k, v); compare(); } diff --git a/src/gpu_hash/hash_table.ts b/src/gpu_hash/hash_table.ts index 91119e2684..e80c41f536 100644 --- a/src/gpu_hash/hash_table.ts +++ b/src/gpu_hash/hash_table.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { hashCombine } from "#/gpu_hash/hash_function"; -import { getRandomValues } from "#/util/random"; -import { Uint64 } from "#/util/uint64"; +import { hashCombine } from "#src/gpu_hash/hash_function.js"; +import { getRandomValues } from "#src/util/random.js"; +import { Uint64 } from "#src/util/uint64.js"; export const NUM_ALTERNATIVES = 3; diff --git a/src/gpu_hash/shader.spec.ts b/src/gpu_hash/shader.browser_test.ts similarity index 86% rename from src/gpu_hash/shader.spec.ts rename to src/gpu_hash/shader.browser_test.ts index cc41f5b1d5..d1fcfa826b 100644 --- a/src/gpu_hash/shader.spec.ts +++ b/src/gpu_hash/shader.browser_test.ts @@ -14,17 +14,18 @@ * limitations under the License. */ -import { hashCombine } from "#/gpu_hash/hash_function"; -import { HashMapUint64, HashSetUint64 } from "#/gpu_hash/hash_table"; +import { describe, it, expect } from "vitest"; +import { hashCombine } from "#src/gpu_hash/hash_function.js"; +import { HashMapUint64, HashSetUint64 } from "#src/gpu_hash/hash_table.js"; import { GPUHashTable, HashMapShaderManager, HashSetShaderManager, -} from "#/gpu_hash/shader"; -import { DataType } from "#/util/data_type"; -import { getRandomUint32 } from "#/util/random"; -import { Uint64 } from "#/util/uint64"; -import { fragmentShaderTest } from "#/webgl/shader_testing"; +} from "#src/gpu_hash/shader.js"; +import { DataType } from "#src/util/data_type.js"; +import { getRandomUint32 } from "#src/util/random.js"; +import { Uint64 } from "#src/util/uint64.js"; +import { fragmentShaderTest } from "#src/webgl/shader_testing.js"; const COUNT = 100; @@ -116,15 +117,15 @@ describe("gpu_hash.shader", () => { return tester.values.outputValue; } testValues.forEach((x, i) => { - expect(hashTable.has(x)).toBe(true, `cpu: i = ${i}, x = ${x}`); - expect(checkPresent(x)).toBe( - true, + expect(hashTable.has(x), `cpu: i = ${i}, x = ${x}`).toBe(true); + expect( + checkPresent(x), `gpu: i = ${i}, x = ${x}, index = ${hashTable.indexOf(x)}`, - ); + ).toBe(true); }); notPresentValues.forEach((x, i) => { - expect(hashTable.has(x)).toBe(false, `cpu: i = ${i}, x = ${x}`); - expect(checkPresent(x)).toBe(false, `gpu: i = ${i}, x = ${x}`); + expect(hashTable.has(x), `cpu: i = ${i}, x = ${x}`).toBe(false); + expect(checkPresent(x), `gpu: i = ${i}, x = ${x}`).toBe(false); }); }, ); @@ -171,16 +172,15 @@ describe("gpu_hash.shader", () => { const expectedValue = new Uint64(); const expectedHas = hashTable.get(x, expectedValue); const has = values.isPresent; - expect(has).toBe(expectedHas, `x=${x}`); + expect(has, `x=${x}`).toBe(expectedHas); if (has) { - expect(values.outputValue.toString()).toBe( + expect(values.outputValue.toString(), `x=${x}`).toBe( expectedValue.toString(), - `x=${x}`, ); } } testValues.forEach((x, i) => { - expect(hashTable.has(x)).toBe(true, `cpu: i = ${i}, x = ${x}`); + expect(hashTable.has(x), `cpu: i = ${i}, x = ${x}`).toBe(true); checkPresent(x); }); notPresentValues.forEach((x) => { diff --git a/src/gpu_hash/shader.ts b/src/gpu_hash/shader.ts index edfb8faab9..39dbd75681 100644 --- a/src/gpu_hash/shader.ts +++ b/src/gpu_hash/shader.ts @@ -14,18 +14,19 @@ * limitations under the License. */ -import { HashTableBase, NUM_ALTERNATIVES } from "#/gpu_hash/hash_table"; -import { DataType } from "#/util/data_type"; -import { RefCounted } from "#/util/disposable"; -import { GL } from "#/webgl/context"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; -import { glsl_equalUint64, glsl_uint64 } from "#/webgl/shader_lib"; +import type { HashTableBase } from "#src/gpu_hash/hash_table.js"; +import { NUM_ALTERNATIVES } from "#src/gpu_hash/hash_table.js"; +import { DataType } from "#src/util/data_type.js"; +import { RefCounted } from "#src/util/disposable.js"; +import type { GL } from "#src/webgl/context.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; +import { glsl_equalUint64, glsl_uint64 } from "#src/webgl/shader_lib.js"; import { computeTextureFormat, OneDimensionalTextureAccessHelper, setOneDimensionalTextureData, TextureFormat, -} from "#/webgl/texture_access"; +} from "#src/webgl/texture_access.js"; // MumurHash, excluding the final mixing steps. export const glsl_hashCombine = [ diff --git a/src/help/input_event_bindings.ts b/src/help/input_event_bindings.ts index 75a7d524b6..afffa16700 100644 --- a/src/help/input_event_bindings.ts +++ b/src/help/input_event_bindings.ts @@ -14,20 +14,21 @@ * limitations under the License. */ -import "./input_event_bindings.css"; - -import { LayerManager, UserLayer } from "#/layer"; -import { SidePanel, SidePanelManager } from "#/ui/side_panel"; +import "#src/help/input_event_bindings.css"; +import type { LayerManager } from "#src/layer/index.js"; +import { UserLayer } from "#src/layer/index.js"; +import type { SidePanelManager } from "#src/ui/side_panel.js"; +import { SidePanel } from "#src/ui/side_panel.js"; +import type { SidePanelLocation } from "#src/ui/side_panel_location.js"; import { DEFAULT_SIDE_PANEL_LOCATION, - SidePanelLocation, TrackableSidePanelLocation, -} from "#/ui/side_panel_location"; -import { GlobalToolBinder } from "#/ui/tool"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { removeChildren } from "#/util/dom"; -import { EventActionMap } from "#/util/event_action_map"; -import { emptyToUndefined } from "#/util/json"; +} from "#src/ui/side_panel_location.js"; +import type { GlobalToolBinder } from "#src/ui/tool.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import { removeChildren } from "#src/util/dom.js"; +import type { EventActionMap } from "#src/util/event_action_map.js"; +import { emptyToUndefined } from "#src/util/json.js"; declare let NEUROGLANCER_BUILD_INFO: | { tag: string; url?: string; timestamp?: string } diff --git a/src/kvstore/index.ts b/src/kvstore/index.ts index 805908f8fe..68a3c663b5 100644 --- a/src/kvstore/index.ts +++ b/src/kvstore/index.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { CancellationToken } from "#/util/cancellation"; +import type { CancellationToken } from "#src/util/cancellation.js"; export interface ByteRange { offset: number; diff --git a/src/kvstore/special/index.ts b/src/kvstore/special/index.ts index 6e537ede73..d3fc9e9a98 100644 --- a/src/kvstore/special/index.ts +++ b/src/kvstore/special/index.ts @@ -14,20 +14,18 @@ * limitations under the License. */ -import { +import type { ByteRange, ByteRangeRequest, - composeByteRangeRequest, ReadableKvStore, ReadOptions, ReadResponse, -} from "#/kvstore"; -import { uncancelableToken } from "#/util/cancellation"; -import { HttpError, isNotFoundError } from "#/util/http_request"; -import { - cancellableFetchSpecialOk, - SpecialProtocolCredentialsProvider, -} from "#/util/special_protocol_request"; +} from "#src/kvstore/index.js"; +import { composeByteRangeRequest } from "#src/kvstore/index.js"; +import { uncancelableToken } from "#src/util/cancellation.js"; +import { HttpError, isNotFoundError } from "#src/util/http_request.js"; +import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; +import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; function getRangeHeader( request: ByteRangeRequest | undefined, diff --git a/src/annotation/user_layer.ts b/src/layer/annotation/index.ts similarity index 90% rename from src/annotation/user_layer.ts rename to src/layer/annotation/index.ts index edc9c1fc5e..35c1a4e430 100644 --- a/src/annotation/user_layer.ts +++ b/src/layer/annotation/index.ts @@ -14,56 +14,47 @@ * limitations under the License. */ -import "./user_layer.css"; +import "#src/layer/annotation/style.css"; +import type { AnnotationDisplayState } from "#src/annotation/annotation_layer_state.js"; +import { AnnotationLayerState } from "#src/annotation/annotation_layer_state.js"; +import { MultiscaleAnnotationSource } from "#src/annotation/frontend_source.js"; +import type { AnnotationPropertySpec } from "#src/annotation/index.js"; import { - AnnotationPropertySpec, annotationPropertySpecsToJson, AnnotationType, LocalAnnotationSource, parseAnnotationPropertySpecs, -} from "#/annotation"; +} from "#src/annotation/index.js"; +import type { CoordinateTransformSpecification } from "#src/coordinate_transform.js"; +import { makeCoordinateSpace } from "#src/coordinate_transform.js"; +import type { DataSourceSpecification } from "#src/datasource/index.js"; +import { localAnnotationsUrl, LocalDataSource } from "#src/datasource/index.js"; +import type { LayerManager, ManagedUserLayer } from "#src/layer/index.js"; import { - AnnotationDisplayState, - AnnotationLayerState, -} from "#/annotation/annotation_layer_state"; -import { MultiscaleAnnotationSource } from "#/annotation/frontend_source"; -import { - CoordinateTransformSpecification, - makeCoordinateSpace, -} from "#/coordinate_transform"; -import { - DataSourceSpecification, - localAnnotationsUrl, - LocalDataSource, -} from "#/datasource"; -import { - LayerManager, LayerReference, - ManagedUserLayer, registerLayerType, registerLayerTypeDetector, UserLayer, -} from "#/layer"; -import { LoadedDataSubsource } from "#/layer_data_source"; -import { Overlay } from "#/overlay"; -import { getWatchableRenderLayerTransform } from "#/render_coordinate_transform"; -import { RenderLayerRole } from "#/renderlayer"; -import { SegmentationDisplayState } from "#/segmentation_display_state/frontend"; -import { SegmentationUserLayer } from "#/segmentation_user_layer"; -import { - TrackableBoolean, - TrackableBooleanCheckbox, -} from "#/trackable_boolean"; -import { makeCachedLazyDerivedWatchableValue } from "#/trackable_value"; -import { +} from "#src/layer/index.js"; +import type { LoadedDataSubsource } from "#src/layer/layer_data_source.js"; +import { SegmentationUserLayer } from "#src/layer/segmentation/index.js"; +import { Overlay } from "#src/overlay.js"; +import { getWatchableRenderLayerTransform } from "#src/render_coordinate_transform.js"; +import { RenderLayerRole } from "#src/renderlayer.js"; +import type { SegmentationDisplayState } from "#src/segmentation_display_state/frontend.js"; +import type { TrackableBoolean } from "#src/trackable_boolean.js"; +import { TrackableBooleanCheckbox } from "#src/trackable_boolean.js"; +import { makeCachedLazyDerivedWatchableValue } from "#src/trackable_value.js"; +import type { AnnotationLayerView, MergedAnnotationStates, - UserLayerWithAnnotationsMixin, -} from "#/ui/annotations"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { Borrowed, Owned, RefCounted } from "#/util/disposable"; -import { updateChildren } from "#/util/dom"; +} from "#src/ui/annotations.js"; +import { UserLayerWithAnnotationsMixin } from "#src/ui/annotations.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import type { Borrowed, Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { updateChildren } from "#src/util/dom.js"; import { parseArray, parseFixedLengthArray, @@ -74,19 +65,19 @@ import { verifyOptionalObjectProperty, verifyString, verifyStringArray, -} from "#/util/json"; -import { NullarySignal } from "#/util/signal"; -import { DependentViewWidget } from "#/widget/dependent_view_widget"; -import { makeHelpButton } from "#/widget/help_button"; -import { LayerReferenceWidget } from "#/widget/layer_reference"; -import { makeMaximizeButton } from "#/widget/maximize_button"; -import { RenderScaleWidget } from "#/widget/render_scale_widget"; -import { ShaderCodeWidget } from "#/widget/shader_code_widget"; +} from "#src/util/json.js"; +import { NullarySignal } from "#src/util/signal.js"; +import { DependentViewWidget } from "#src/widget/dependent_view_widget.js"; +import { makeHelpButton } from "#src/widget/help_button.js"; +import { LayerReferenceWidget } from "#src/widget/layer_reference.js"; +import { makeMaximizeButton } from "#src/widget/maximize_button.js"; +import { RenderScaleWidget } from "#src/widget/render_scale_widget.js"; +import { ShaderCodeWidget } from "#src/widget/shader_code_widget.js"; import { registerLayerShaderControlsTool, ShaderControls, -} from "#/widget/shader_controls"; -import { Tab } from "#/widget/tab_view"; +} from "#src/widget/shader_controls.js"; +import { Tab } from "#src/widget/tab_view.js"; const POINTS_JSON_KEY = "points"; const ANNOTATIONS_JSON_KEY = "annotations"; @@ -559,7 +550,9 @@ export class AnnotationUserLayer extends Base { )); try { localAnnotations.restoreState(this.localAnnotationsJson); - } catch {} + } catch { + // Ignore errors from malformed local annotations. + } refCounted.registerDisposer(() => { localAnnotations.dispose(); this.localAnnotations = undefined; @@ -574,7 +567,9 @@ export class AnnotationUserLayer extends Base { this.localAnnotations, this.pointAnnotationsJson, ); - } catch {} + } catch { + // Ignore errors from malformed point annotations. + } this.pointAnnotationsJson = undefined; this.localAnnotationsJson = undefined; const state = new AnnotationLayerState({ diff --git a/src/annotation/user_layer.css b/src/layer/annotation/style.css similarity index 100% rename from src/annotation/user_layer.css rename to src/layer/annotation/style.css diff --git a/src/layer/enabled_frontend_modules.ts b/src/layer/enabled_frontend_modules.ts new file mode 100644 index 0000000000..d192997999 --- /dev/null +++ b/src/layer/enabled_frontend_modules.ts @@ -0,0 +1,5 @@ +// DO NOT EDIT: Generated by config/update_conditions.ts +import "#layer/annotation"; +import "#layer/image"; +import "#layer/segmentation"; +import "#layer/single_mesh"; diff --git a/src/image_user_layer.ts b/src/layer/image/index.ts similarity index 87% rename from src/image_user_layer.ts rename to src/layer/image/index.ts index 8e4237a4e0..7cfa125b13 100644 --- a/src/image_user_layer.ts +++ b/src/layer/image/index.ts @@ -14,91 +14,91 @@ * limitations under the License. */ -import "./image_user_layer.css"; +import "#src/layer/image/style.css"; +import type { CoordinateSpace } from "#src/coordinate_transform.js"; import { - CoordinateSpace, CoordinateSpaceCombiner, isChannelDimension, isLocalDimension, TrackableCoordinateSpace, -} from "#/coordinate_transform"; -import { +} from "#src/coordinate_transform.js"; +import type { ManagedUserLayer, + UserLayerSelectionState, +} from "#src/layer/index.js"; +import { registerLayerType, registerLayerTypeDetector, registerVolumeLayerType, UserLayer, - UserLayerSelectionState, -} from "#/layer"; -import { LoadedDataSubsource } from "#/layer_data_source"; -import { Overlay } from "#/overlay"; -import { getChannelSpace } from "#/render_coordinate_transform"; +} from "#src/layer/index.js"; +import type { LoadedDataSubsource } from "#src/layer/layer_data_source.js"; +import { Overlay } from "#src/overlay.js"; +import { getChannelSpace } from "#src/render_coordinate_transform.js"; import { RenderScaleHistogram, trackableRenderScaleTarget, -} from "#/render_scale_statistics"; -import { DataType, VolumeType } from "#/sliceview/volume/base"; -import { MultiscaleVolumeChunkSource } from "#/sliceview/volume/frontend"; +} from "#src/render_scale_statistics.js"; +import { DataType, VolumeType } from "#src/sliceview/volume/base.js"; +import { MultiscaleVolumeChunkSource } from "#src/sliceview/volume/frontend.js"; import { defineImageLayerShader, getTrackableFragmentMain, ImageRenderLayer, -} from "#/sliceview/volume/image_renderlayer"; -import { trackableAlphaValue } from "#/trackable_alpha"; -import { trackableBlendModeValue } from "#/trackable_blend"; -import { TrackableBoolean } from "#/trackable_boolean"; +} from "#src/sliceview/volume/image_renderlayer.js"; +import { trackableAlphaValue } from "#src/trackable_alpha.js"; +import { trackableBlendModeValue } from "#src/trackable_blend.js"; +import { TrackableBoolean } from "#src/trackable_boolean.js"; +import { trackableFiniteFloat } from "#src/trackable_finite_float.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; import { makeCachedDerivedWatchableValue, makeCachedLazyDerivedWatchableValue, registerNested, WatchableValue, - WatchableValueInterface, -} from "#/trackable_value"; -import { UserLayerWithAnnotationsMixin } from "#/ui/annotations"; -import { setClipboard } from "#/util/clipboard"; -import { Borrowed } from "#/util/disposable"; -import { makeValueOrError } from "#/util/error"; -import { verifyOptionalObjectProperty } from "#/util/json"; +} from "#src/trackable_value.js"; +import { UserLayerWithAnnotationsMixin } from "#src/ui/annotations.js"; +import { setClipboard } from "#src/util/clipboard.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { makeValueOrError } from "#src/util/error.js"; +import { verifyOptionalObjectProperty } from "#src/util/json.js"; import { getVolumeRenderingDepthSamplesBoundsLogScale, VOLUME_RENDERING_DEPTH_SAMPLES_DEFAULT_VALUE, VolumeRenderingRenderLayer, -} from "#/volume_rendering/volume_render_layer"; -import { - makeWatchableShaderError, - ParameterizedShaderGetterResult, -} from "#/webgl/dynamic_shader"; +} from "#src/volume_rendering/volume_render_layer.js"; +import type { ParameterizedShaderGetterResult } from "#src/webgl/dynamic_shader.js"; +import { makeWatchableShaderError } from "#src/webgl/dynamic_shader.js"; +import type { ShaderControlsBuilderState } from "#src/webgl/shader_ui_controls.js"; import { setControlsInShader, - ShaderControlsBuilderState, ShaderControlState, -} from "#/webgl/shader_ui_controls"; -import { ChannelDimensionsWidget } from "#/widget/channel_dimensions_widget"; -import { makeCopyButton } from "#/widget/copy_button"; -import { DependentViewContext } from "#/widget/dependent_view_widget"; -import { makeHelpButton } from "#/widget/help_button"; +} from "#src/webgl/shader_ui_controls.js"; +import { ChannelDimensionsWidget } from "#src/widget/channel_dimensions_widget.js"; +import { makeCopyButton } from "#src/widget/copy_button.js"; +import type { DependentViewContext } from "#src/widget/dependent_view_widget.js"; +import { makeHelpButton } from "#src/widget/help_button.js"; +import type { LayerControlDefinition } from "#src/widget/layer_control.js"; import { addLayerControlToOptionsTab, - LayerControlDefinition, registerLayerControl, -} from "#/widget/layer_control"; -import { checkboxLayerControl } from "#/widget/layer_control_checkbox"; -import { enumLayerControl } from "#/widget/layer_control_enum"; -import { rangeLayerControl } from "#/widget/layer_control_range"; -import { makeMaximizeButton } from "#/widget/maximize_button"; +} from "#src/widget/layer_control.js"; +import { checkboxLayerControl } from "#src/widget/layer_control_checkbox.js"; +import { enumLayerControl } from "#src/widget/layer_control_enum.js"; +import { rangeLayerControl } from "#src/widget/layer_control_range.js"; +import { makeMaximizeButton } from "#src/widget/maximize_button.js"; import { renderScaleLayerControl, VolumeRenderingRenderScaleWidget, -} from "#/widget/render_scale_widget"; -import { ShaderCodeWidget } from "#/widget/shader_code_widget"; +} from "#src/widget/render_scale_widget.js"; +import { ShaderCodeWidget } from "#src/widget/shader_code_widget.js"; +import type { LegendShaderOptions } from "#src/widget/shader_controls.js"; import { - LegendShaderOptions, registerLayerShaderControlsTool, ShaderControls, -} from "#/widget/shader_controls"; -import { Tab } from "#/widget/tab_view"; -import { trackableFiniteFloat } from "#/trackable_finite_float"; +} from "#src/widget/shader_controls.js"; +import { Tab } from "#src/widget/tab_view.js"; const OPACITY_JSON_KEY = "opacity"; const BLEND_JSON_KEY = "blend"; diff --git a/src/image_user_layer.css b/src/layer/image/style.css similarity index 100% rename from src/image_user_layer.css rename to src/layer/image/style.css diff --git a/src/layer.ts b/src/layer/index.ts similarity index 96% rename from src/layer.ts rename to src/layer/index.ts index eff6313825..ff3f7d8d29 100644 --- a/src/layer.ts +++ b/src/layer/index.ts @@ -14,82 +14,76 @@ * limitations under the License. */ -import debounce from "lodash/debounce"; -import throttle from "lodash/throttle"; -import { AnnotationType } from "#/annotation"; -import { AnnotationLayerState } from "#/annotation/annotation_layer_state"; -import { ChunkManager } from "#/chunk_manager/frontend"; -import { +import { debounce, throttle } from "lodash-es"; +import type { AnnotationLayerState } from "#src/annotation/annotation_layer_state.js"; +import type { AnnotationType } from "#src/annotation/index.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import type { CoordinateSpace, - CoordinateSpaceCombiner, CoordinateTransformSpecification, +} from "#src/coordinate_transform.js"; +import { + CoordinateSpaceCombiner, coordinateTransformSpecificationFromLegacyJson, emptyInvalidCoordinateSpace, isGlobalDimension, isLocalDimension, isLocalOrChannelDimension, TrackableCoordinateSpace, -} from "#/coordinate_transform"; -import { +} from "#src/coordinate_transform.js"; +import type { DataSourceProviderRegistry, DataSourceSpecification, DataSubsource, - makeEmptyDataSourceSpecification, -} from "#/datasource"; -import { DisplayContext, RenderedPanel } from "#/display_context"; +} from "#src/datasource/index.js"; +import { makeEmptyDataSourceSpecification } from "#src/datasource/index.js"; +import type { DisplayContext, RenderedPanel } from "#src/display_context.js"; +import type { LoadedDataSubsource } from "#src/layer/layer_data_source.js"; import { LayerDataSource, layerDataSourceSpecificationFromJson, - LoadedDataSubsource, -} from "#/layer_data_source"; +} from "#src/layer/layer_data_source.js"; +import type { + DisplayDimensions, + WatchableDisplayDimensionRenderInfo, +} from "#src/navigation_state.js"; import { CoordinateSpacePlaybackVelocity, - DisplayDimensions, PlaybackManager, Position, - WatchableDisplayDimensionRenderInfo, -} from "#/navigation_state"; -import { RenderLayerTransform } from "#/render_coordinate_transform"; +} from "#src/navigation_state.js"; +import type { RenderLayerTransform } from "#src/render_coordinate_transform.js"; import { RENDERED_VIEW_ADD_LAYER_RPC_ID, RENDERED_VIEW_REMOVE_LAYER_RPC_ID, -} from "#/render_layer_common"; -import { +} from "#src/render_layer_common.js"; +import type { RenderLayer, RenderLayerRole, VisibilityTrackedRenderLayer, -} from "#/renderlayer"; -import { VolumeType } from "#/sliceview/volume/base"; -import { StatusMessage } from "#/status"; -import { TrackableBoolean } from "#/trackable_boolean"; -import { - registerNested, +} from "#src/renderlayer.js"; +import type { VolumeType } from "#src/sliceview/volume/base.js"; +import { StatusMessage } from "#src/status.js"; +import { TrackableBoolean } from "#src/trackable_boolean.js"; +import type { TrackableValueInterface, WatchableSet, - WatchableValue, WatchableValueInterface, -} from "#/trackable_value"; -import { LayerDataSourcesTab } from "#/ui/layer_data_sources_tab"; +} from "#src/trackable_value.js"; +import { registerNested, WatchableValue } from "#src/trackable_value.js"; import { SELECTED_LAYER_SIDE_PANEL_DEFAULT_LOCATION, UserLayerSidePanelsState, -} from "#/ui/layer_side_panel_state"; +} from "#src/ui/layer_side_panel_state.js"; import { DEFAULT_SIDE_PANEL_LOCATION, TrackableSidePanelLocation, -} from "#/ui/side_panel_location"; -import { - GlobalToolBinder, - LocalToolBinder, - SelectedLegacyTool, -} from "#/ui/tool"; -import { gatherUpdate } from "#/util/array"; -import { - Borrowed, - invokeDisposers, - Owned, - RefCounted, -} from "#/util/disposable"; +} from "#src/ui/side_panel_location.js"; +import type { GlobalToolBinder } from "#src/ui/tool.js"; +import { LocalToolBinder, SelectedLegacyTool } from "#src/ui/tool.js"; +import { gatherUpdate } from "#src/util/array.js"; +import type { Borrowed, Owned } from "#src/util/disposable.js"; +import { invokeDisposers, RefCounted } from "#src/util/disposable.js"; import { emptyToUndefined, parseArray, @@ -102,22 +96,23 @@ import { verifyOptionalObjectProperty, verifyOptionalString, verifyString, -} from "#/util/json"; -import { MessageList } from "#/util/message_list"; -import { AnyConstructor } from "#/util/mixin"; -import { NullarySignal } from "#/util/signal"; +} from "#src/util/json.js"; +import { MessageList } from "#src/util/message_list.js"; +import type { AnyConstructor } from "#src/util/mixin.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { SignalBindingUpdater } from "#src/util/signal_binding_updater.js"; import { addSignalBinding, removeSignalBinding, - SignalBindingUpdater, -} from "#/util/signal_binding_updater"; -import { Trackable } from "#/util/trackable"; -import { Uint64 } from "#/util/uint64"; -import { kEmptyFloat32Vec } from "#/util/vector"; -import { WatchableVisibilityPriority } from "#/visibility_priority/frontend"; -import { DependentViewContext } from "#/widget/dependent_view_widget"; -import { TabSpecification } from "#/widget/tab_view"; -import { RPC } from "#/worker_rpc"; +} from "#src/util/signal_binding_updater.js"; +import type { Trackable } from "#src/util/trackable.js"; +import { Uint64 } from "#src/util/uint64.js"; +import { kEmptyFloat32Vec } from "#src/util/vector.js"; +import type { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; +import type { DependentViewContext } from "#src/widget/dependent_view_widget.js"; +import type { Tab } from "#src/widget/tab_view.js"; +import { TabSpecification } from "#src/widget/tab_view.js"; +import type { RPC } from "#src/worker_rpc.js"; const TOOL_JSON_KEY = "tool"; const TOOL_BINDINGS_JSON_KEY = "toolBindings"; @@ -156,6 +151,15 @@ export class LayerActionContext { } } +export interface UserLayerTab { + id: string; + label: string; + order: number; + getter: (layer: UserLayer) => Tab; +} + +export const USER_LAYER_TABS: UserLayerTab[] = []; + export class UserLayer extends RefCounted { get localPosition() { return this.managedLayer.localPosition; @@ -370,11 +374,13 @@ export class UserLayer extends RefCounted { this.dataSourcesChanged.add(this.specificationChanged.dispatch); this.dataSourcesChanged.add(() => this.updateDataSubsourceActivations()); this.messages.changed.add(this.layersChanged.dispatch); - this.tabs.add("source", { - label: "Source", - order: -100, - getter: () => new LayerDataSourcesTab(this), - }); + for (const tab of USER_LAYER_TABS) { + this.tabs.add(tab.id, { + label: tab.label, + order: tab.order, + getter: () => tab.getter(this), + }); + } } canAddDataSource() { diff --git a/src/layer_data_source.ts b/src/layer/layer_data_source.ts similarity index 93% rename from src/layer_data_source.ts rename to src/layer/layer_data_source.ts index 5ab97f6249..41cbacdd5d 100644 --- a/src/layer_data_source.ts +++ b/src/layer/layer_data_source.ts @@ -14,29 +14,32 @@ * limitations under the License. */ -import { +import type { CoordinateSpace, CoordinateTransformSpecification, +} from "#src/coordinate_transform.js"; +import { coordinateTransformSpecificationFromJson, coordinateTransformSpecificationToJson, makeCoordinateSpace, makeIdentityTransform, WatchableCoordinateSpaceTransform, -} from "#/coordinate_transform"; -import { +} from "#src/coordinate_transform.js"; +import type { DataSource, DataSourceSpecification, DataSubsourceEntry, DataSubsourceSpecification, - makeEmptyDataSourceSpecification, -} from "#/datasource"; -import { UserLayer } from "#/layer"; -import { getWatchableRenderLayerTransform } from "#/render_coordinate_transform"; -import { RenderLayer } from "#/renderlayer"; -import { WatchableValueInterface } from "#/trackable_value"; -import { arraysEqual } from "#/util/array"; -import { CancellationTokenSource } from "#/util/cancellation"; -import { Borrowed, disposableOnce, Owned, RefCounted } from "#/util/disposable"; +} from "#src/datasource/index.js"; +import { makeEmptyDataSourceSpecification } from "#src/datasource/index.js"; +import type { UserLayer } from "#src/layer/index.js"; +import { getWatchableRenderLayerTransform } from "#src/render_coordinate_transform.js"; +import type { RenderLayer } from "#src/renderlayer.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { arraysEqual } from "#src/util/array.js"; +import { CancellationTokenSource } from "#src/util/cancellation.js"; +import type { Borrowed, Owned } from "#src/util/disposable.js"; +import { disposableOnce, RefCounted } from "#src/util/disposable.js"; import { verifyBoolean, verifyObject, @@ -44,10 +47,10 @@ import { verifyObjectProperty, verifyOptionalObjectProperty, verifyString, -} from "#/util/json"; -import * as matrix from "#/util/matrix"; -import { MessageList, MessageSeverity } from "#/util/message_list"; -import { NullarySignal } from "#/util/signal"; +} from "#src/util/json.js"; +import * as matrix from "#src/util/matrix.js"; +import { MessageList, MessageSeverity } from "#src/util/message_list.js"; +import { NullarySignal } from "#src/util/signal.js"; export function parseDataSubsourceSpecificationFromJson( json: unknown, diff --git a/src/segmentation_user_layer.ts b/src/layer/segmentation/index.ts similarity index 77% rename from src/segmentation_user_layer.ts rename to src/layer/segmentation/index.ts index 436dc7fb75..4d7cd240e9 100644 --- a/src/segmentation_user_layer.ts +++ b/src/layer/segmentation/index.ts @@ -14,80 +14,83 @@ * limitations under the License. */ -import "#/segmentation_user_layer.css"; +import "#src/layer/segmentation/style.css"; +import type { CoordinateTransformSpecification } from "#src/coordinate_transform.js"; +import { emptyValidCoordinateSpace } from "#src/coordinate_transform.js"; +import type { DataSourceSpecification } from "#src/datasource/index.js"; import { - CoordinateTransformSpecification, - emptyValidCoordinateSpace, -} from "#/coordinate_transform"; -import { - DataSourceSpecification, LocalDataSource, localEquivalencesUrl, -} from "#/datasource"; +} from "#src/datasource/index.js"; +import type { LayerActionContext, ManagedUserLayer } from "#src/layer/index.js"; import { - LayerActionContext, LinkedLayerGroup, - ManagedUserLayer, registerLayerType, registerLayerTypeDetector, registerVolumeLayerType, UserLayer, -} from "#/layer"; -import { - layerDataSourceSpecificationFromJson, - LoadedDataSubsource, -} from "#/layer_data_source"; +} from "#src/layer/index.js"; +import type { LoadedDataSubsource } from "#src/layer/layer_data_source.js"; +import { layerDataSourceSpecificationFromJson } from "#src/layer/layer_data_source.js"; +import * as json_keys from "#src/layer/segmentation/json_keys.js"; +import { registerLayerControls } from "#src/layer/segmentation/layer_controls.js"; import { MeshLayer, MeshSource, MultiscaleMeshLayer, MultiscaleMeshSource, -} from "#/mesh/frontend"; -import { RenderLayerTransform } from "#/render_coordinate_transform"; +} from "#src/mesh/frontend.js"; +import type { RenderLayerTransform } from "#src/render_coordinate_transform.js"; import { RenderScaleHistogram, trackableRenderScaleTarget, -} from "#/render_scale_statistics"; -import { SegmentColorHash } from "#/segment_color"; +} from "#src/render_scale_statistics.js"; +import { SegmentColorHash } from "#src/segment_color.js"; +import type { + SegmentationColorGroupState, + SegmentationDisplayState, + SegmentationGroupState, +} from "#src/segmentation_display_state/frontend.js"; import { augmentSegmentId, bindSegmentListWidth, makeSegmentWidget, maybeAugmentSegmentId, registerCallbackWhenSegmentationDisplayStateChanged, - SegmentationColorGroupState, - SegmentationDisplayState, - SegmentationGroupState, SegmentSelectionState, Uint64MapEntry, -} from "#/segmentation_display_state/frontend"; -import { - getPreprocessedSegmentPropertyMap, +} from "#src/segmentation_display_state/frontend.js"; +import type { PreprocessedSegmentPropertyMap, SegmentPropertyMap, -} from "#/segmentation_display_state/property_map"; -import { LocalSegmentationGraphSource } from "#/segmentation_graph/local"; -import { VisibleSegmentEquivalencePolicy } from "#/segmentation_graph/segment_id"; -import { +} from "#src/segmentation_display_state/property_map.js"; +import { getPreprocessedSegmentPropertyMap } from "#src/segmentation_display_state/property_map.js"; +import { LocalSegmentationGraphSource } from "#src/segmentation_graph/local.js"; +import { VisibleSegmentEquivalencePolicy } from "#src/segmentation_graph/segment_id.js"; +import type { SegmentationGraphSource, SegmentationGraphSourceConnection, - SegmentationGraphSourceTab, -} from "#/segmentation_graph/source"; -import { SharedDisjointUint64Sets } from "#/shared_disjoint_sets"; -import { SharedWatchableValue } from "#/shared_watchable_value"; +} from "#src/segmentation_graph/source.js"; +import { SegmentationGraphSourceTab } from "#src/segmentation_graph/source.js"; +import { SharedDisjointUint64Sets } from "#src/shared_disjoint_sets.js"; +import { SharedWatchableValue } from "#src/shared_watchable_value.js"; import { PerspectiveViewSkeletonLayer, SkeletonLayer, SkeletonRenderingOptions, SliceViewPanelSkeletonLayer, -} from "#/skeleton/frontend"; -import { DataType, VolumeType } from "#/sliceview/volume/base"; -import { MultiscaleVolumeChunkSource } from "#/sliceview/volume/frontend"; -import { SegmentationRenderLayer } from "#/sliceview/volume/segmentation_renderlayer"; -import { StatusMessage } from "#/status"; -import { trackableAlphaValue } from "#/trackable_alpha"; -import { TrackableBoolean } from "#/trackable_boolean"; +} from "#src/skeleton/frontend.js"; +import { DataType, VolumeType } from "#src/sliceview/volume/base.js"; +import { MultiscaleVolumeChunkSource } from "#src/sliceview/volume/frontend.js"; +import { SegmentationRenderLayer } from "#src/sliceview/volume/segmentation_renderlayer.js"; +import { StatusMessage } from "#src/status.js"; +import { trackableAlphaValue } from "#src/trackable_alpha.js"; +import { TrackableBoolean } from "#src/trackable_boolean.js"; +import type { + TrackableValueInterface, + WatchableValueInterface, +} from "#src/trackable_value.js"; import { IndirectTrackableValue, IndirectWatchableValue, @@ -95,79 +98,38 @@ import { makeCachedLazyDerivedWatchableValue, registerNestedSync, TrackableValue, - TrackableValueInterface, WatchableValue, - WatchableValueInterface, -} from "#/trackable_value"; -import { UserLayerWithAnnotationsMixin } from "#/ui/annotations"; -import { SegmentDisplayTab } from "#/ui/segment_list"; -import { registerSegmentSelectTools } from "#/ui/segment_select_tools"; -import { registerSegmentSplitMergeTools } from "#/ui/segment_split_merge_tools"; -import { DisplayOptionsTab } from "#/ui/segmentation_display_options_tab"; -import { Uint64Map } from "#/uint64_map"; -import { Uint64OrderedSet } from "#/uint64_ordered_set"; -import { Uint64Set } from "#/uint64_set"; +} from "#src/trackable_value.js"; +import { UserLayerWithAnnotationsMixin } from "#src/ui/annotations.js"; +import { SegmentDisplayTab } from "#src/ui/segment_list.js"; +import { registerSegmentSelectTools } from "#src/ui/segment_select_tools.js"; +import { registerSegmentSplitMergeTools } from "#src/ui/segment_split_merge_tools.js"; +import { DisplayOptionsTab } from "#src/ui/segmentation_display_options_tab.js"; +import { Uint64Map } from "#src/uint64_map.js"; +import { Uint64OrderedSet } from "#src/uint64_ordered_set.js"; +import { Uint64Set } from "#src/uint64_set.js"; import { packColor, parseRGBColorSpecification, serializeColor, TrackableOptionalRGB, unpackRGB, -} from "#/util/color"; -import { Borrowed, Owned, RefCounted } from "#/util/disposable"; -import { vec3, vec4 } from "#/util/geom"; +} from "#src/util/color.js"; +import type { Borrowed, Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import type { vec3, vec4 } from "#src/util/geom.js"; import { parseArray, verifyFiniteNonNegativeFloat, verifyObjectAsMap, verifyOptionalObjectProperty, verifyString, -} from "#/util/json"; -import { Signal } from "#/util/signal"; -import { Uint64 } from "#/util/uint64"; -import { makeWatchableShaderError } from "#/webgl/dynamic_shader"; -import { DependentViewContext } from "#/widget/dependent_view_widget"; -import { - LayerControlDefinition, - registerLayerControl, -} from "#/widget/layer_control"; -import { checkboxLayerControl } from "#/widget/layer_control_checkbox"; -import { enumLayerControl } from "#/widget/layer_control_enum"; -import { rangeLayerControl } from "#/widget/layer_control_range"; -import { renderScaleLayerControl } from "#/widget/render_scale_widget"; -import { - colorSeedLayerControl, - fixedColorLayerControl, -} from "#/widget/segmentation_color_mode"; -import { registerLayerShaderControlsTool } from "#/widget/shader_controls"; - -const SELECTED_ALPHA_JSON_KEY = "selectedAlpha"; -const NOT_SELECTED_ALPHA_JSON_KEY = "notSelectedAlpha"; -const OBJECT_ALPHA_JSON_KEY = "objectAlpha"; -const SATURATION_JSON_KEY = "saturation"; -const HOVER_HIGHLIGHT_JSON_KEY = "hoverHighlight"; -const HIDE_SEGMENT_ZERO_JSON_KEY = "hideSegmentZero"; -const BASE_SEGMENT_COLORING_JSON_KEY = "baseSegmentColoring"; -const IGNORE_NULL_VISIBLE_SET_JSON_KEY = "ignoreNullVisibleSet"; -const MESH_JSON_KEY = "mesh"; -const SKELETONS_JSON_KEY = "skeletons"; -const SEGMENTS_JSON_KEY = "segments"; -const EQUIVALENCES_JSON_KEY = "equivalences"; -const COLOR_SEED_JSON_KEY = "colorSeed"; -const SEGMENT_STATED_COLORS_JSON_KEY = "segmentColors"; -const MESH_RENDER_SCALE_JSON_KEY = "meshRenderScale"; -const CROSS_SECTION_RENDER_SCALE_JSON_KEY = "crossSectionRenderScale"; -const SKELETON_RENDERING_JSON_KEY = "skeletonRendering"; -const SKELETON_SHADER_JSON_KEY = "skeletonShader"; -const SEGMENT_QUERY_JSON_KEY = "segmentQuery"; -const MESH_SILHOUETTE_RENDERING_JSON_KEY = "meshSilhouetteRendering"; -const LINKED_SEGMENTATION_GROUP_JSON_KEY = "linkedSegmentationGroup"; -const LINKED_SEGMENTATION_COLOR_GROUP_JSON_KEY = "linkedSegmentationColorGroup"; -const SEGMENT_DEFAULT_COLOR_JSON_KEY = "segmentDefaultColor"; -const ANCHOR_SEGMENT_JSON_KEY = "anchorSegment"; - -export const SKELETON_RENDERING_SHADER_CONTROL_TOOL_ID = - "skeletonShaderControl"; +} from "#src/util/json.js"; +import { Signal } from "#src/util/signal.js"; +import { Uint64 } from "#src/util/uint64.js"; +import { makeWatchableShaderError } from "#src/webgl/dynamic_shader.js"; +import type { DependentViewContext } from "#src/widget/dependent_view_widget.js"; +import { registerLayerShaderControlsTool } from "#src/widget/shader_controls.js"; export class SegmentationUserLayerGroupState extends RefCounted @@ -204,12 +166,12 @@ export class SegmentationUserLayerGroupState restoreState(specification: unknown) { verifyOptionalObjectProperty( specification, - HIDE_SEGMENT_ZERO_JSON_KEY, + json_keys.HIDE_SEGMENT_ZERO_JSON_KEY, (value) => this.hideSegmentZero.restoreState(value), ); verifyOptionalObjectProperty( specification, - EQUIVALENCES_JSON_KEY, + json_keys.EQUIVALENCES_JSON_KEY, (value) => { this.localGraph.restoreState(value); }, @@ -217,7 +179,7 @@ export class SegmentationUserLayerGroupState verifyOptionalObjectProperty( specification, - SEGMENTS_JSON_KEY, + json_keys.SEGMENTS_JSON_KEY, (segmentsValue) => { const { segmentEquivalences, selectedSegments, visibleSegments } = this; parseArray(segmentsValue, (value) => { @@ -237,30 +199,30 @@ export class SegmentationUserLayerGroupState ); verifyOptionalObjectProperty( specification, - SEGMENT_QUERY_JSON_KEY, + json_keys.SEGMENT_QUERY_JSON_KEY, (value) => this.segmentQuery.restoreState(value), ); } toJSON() { const x: any = {}; - x[HIDE_SEGMENT_ZERO_JSON_KEY] = this.hideSegmentZero.toJSON(); + x[json_keys.HIDE_SEGMENT_ZERO_JSON_KEY] = this.hideSegmentZero.toJSON(); const { selectedSegments, visibleSegments } = this; if (selectedSegments.size > 0) { - x[SEGMENTS_JSON_KEY] = [...selectedSegments].map((segment) => { + x[json_keys.SEGMENTS_JSON_KEY] = [...selectedSegments].map((segment) => { if (visibleSegments.has(segment)) { return segment.toString(); } return "!" + segment.toString(); }); } else { - x[SEGMENTS_JSON_KEY] = []; + x[json_keys.SEGMENTS_JSON_KEY] = []; } const { segmentEquivalences } = this; if (this.localSegmentEquivalences && segmentEquivalences.size > 0) { - x[EQUIVALENCES_JSON_KEY] = segmentEquivalences.toJSON(); + x[json_keys.EQUIVALENCES_JSON_KEY] = segmentEquivalences.toJSON(); } - x[SEGMENT_QUERY_JSON_KEY] = this.segmentQuery.toJSON(); + x[json_keys.SEGMENT_QUERY_JSON_KEY] = this.segmentQuery.toJSON(); return x; } @@ -334,17 +296,19 @@ export class SegmentationUserLayerColorGroupState } restoreState(specification: unknown) { - verifyOptionalObjectProperty(specification, COLOR_SEED_JSON_KEY, (value) => - this.segmentColorHash.restoreState(value), + verifyOptionalObjectProperty( + specification, + json_keys.COLOR_SEED_JSON_KEY, + (value) => this.segmentColorHash.restoreState(value), ); verifyOptionalObjectProperty( specification, - SEGMENT_DEFAULT_COLOR_JSON_KEY, + json_keys.SEGMENT_DEFAULT_COLOR_JSON_KEY, (value) => this.segmentDefaultColor.restoreState(value), ); verifyOptionalObjectProperty( specification, - SEGMENT_STATED_COLORS_JSON_KEY, + json_keys.SEGMENT_STATED_COLORS_JSON_KEY, (y) => { const result = verifyObjectAsMap(y, (x) => parseRGBColorSpecification(String(x)), @@ -360,11 +324,12 @@ export class SegmentationUserLayerColorGroupState toJSON() { const x: any = {}; - x[COLOR_SEED_JSON_KEY] = this.segmentColorHash.toJSON(); - x[SEGMENT_DEFAULT_COLOR_JSON_KEY] = this.segmentDefaultColor.toJSON(); + x[json_keys.COLOR_SEED_JSON_KEY] = this.segmentColorHash.toJSON(); + x[json_keys.SEGMENT_DEFAULT_COLOR_JSON_KEY] = + this.segmentDefaultColor.toJSON(); const { segmentStatedColors } = this; if (segmentStatedColors.size > 0) { - const j: any = (x[SEGMENT_STATED_COLORS_JSON_KEY] = {}); + const j: any = (x[json_keys.SEGMENT_STATED_COLORS_JSON_KEY] = {}); for (const [key, value] of segmentStatedColors.unsafeEntries()) { j[key.toString()] = serializeColor(unpackRGB(value.low)); } @@ -908,12 +873,12 @@ export class SegmentationUserLayer extends Base { ); const meshPath = verifyOptionalObjectProperty( layerSpec, - MESH_JSON_KEY, + json_keys.MESH_JSON_KEY, (x) => (x === null ? null : verifyString(x)), ); const skeletonsPath = verifyOptionalObjectProperty( layerSpec, - SKELETONS_JSON_KEY, + json_keys.SKELETONS_JSON_KEY, (x) => (x === null ? null : verifyString(x)), ); if (meshPath !== undefined || skeletonsPath !== undefined) { @@ -946,7 +911,7 @@ export class SegmentationUserLayer extends Base { ); } if ( - layerSpec[EQUIVALENCES_JSON_KEY] !== undefined && + layerSpec[json_keys.EQUIVALENCES_JSON_KEY] !== undefined && explicitSpecs.find((spec) => spec.url === localEquivalencesUrl) === undefined ) { @@ -968,48 +933,50 @@ export class SegmentationUserLayer extends Base { restoreState(specification: any) { super.restoreState(specification); this.displayState.selectedAlpha.restoreState( - specification[SELECTED_ALPHA_JSON_KEY], + specification[json_keys.SELECTED_ALPHA_JSON_KEY], ); this.displayState.saturation.restoreState( - specification[SATURATION_JSON_KEY], + specification[json_keys.SATURATION_JSON_KEY], ); this.displayState.notSelectedAlpha.restoreState( - specification[NOT_SELECTED_ALPHA_JSON_KEY], + specification[json_keys.NOT_SELECTED_ALPHA_JSON_KEY], ); this.displayState.hoverHighlight.restoreState( - specification[HOVER_HIGHLIGHT_JSON_KEY], + specification[json_keys.HOVER_HIGHLIGHT_JSON_KEY], ); this.displayState.objectAlpha.restoreState( - specification[OBJECT_ALPHA_JSON_KEY], + specification[json_keys.OBJECT_ALPHA_JSON_KEY], ); this.displayState.baseSegmentColoring.restoreState( - specification[BASE_SEGMENT_COLORING_JSON_KEY], + specification[json_keys.BASE_SEGMENT_COLORING_JSON_KEY], ); this.displayState.silhouetteRendering.restoreState( - specification[MESH_SILHOUETTE_RENDERING_JSON_KEY], + specification[json_keys.MESH_SILHOUETTE_RENDERING_JSON_KEY], ); this.displayState.ignoreNullVisibleSet.restoreState( - specification[IGNORE_NULL_VISIBLE_SET_JSON_KEY], + specification[json_keys.IGNORE_NULL_VISIBLE_SET_JSON_KEY], ); const { skeletonRenderingOptions } = this.displayState; skeletonRenderingOptions.restoreState( - specification[SKELETON_RENDERING_JSON_KEY], + specification[json_keys.SKELETON_RENDERING_JSON_KEY], ); - const skeletonShader = specification[SKELETON_SHADER_JSON_KEY]; + const skeletonShader = specification[json_keys.SKELETON_SHADER_JSON_KEY]; if (skeletonShader !== undefined) { skeletonRenderingOptions.shader.restoreState(skeletonShader); } this.displayState.renderScaleTarget.restoreState( - specification[MESH_RENDER_SCALE_JSON_KEY], + specification[json_keys.MESH_RENDER_SCALE_JSON_KEY], + ); + this.anchorSegment.restoreState( + specification[json_keys.ANCHOR_SEGMENT_JSON_KEY], ); - this.anchorSegment.restoreState(specification[ANCHOR_SEGMENT_JSON_KEY]); this.sliceViewRenderScaleTarget.restoreState( - specification[CROSS_SECTION_RENDER_SCALE_JSON_KEY], + specification[json_keys.CROSS_SECTION_RENDER_SCALE_JSON_KEY], ); const linkedSegmentationGroupName = verifyOptionalObjectProperty( specification, - LINKED_SEGMENTATION_GROUP_JSON_KEY, + json_keys.LINKED_SEGMENTATION_GROUP_JSON_KEY, verifyString, ); if (linkedSegmentationGroupName !== undefined) { @@ -1019,7 +986,7 @@ export class SegmentationUserLayer extends Base { } const linkedSegmentationColorGroupName = verifyOptionalObjectProperty( specification, - LINKED_SEGMENTATION_COLOR_GROUP_JSON_KEY, + json_keys.LINKED_SEGMENTATION_COLOR_GROUP_JSON_KEY, (x) => (x === false ? undefined : verifyString(x)), linkedSegmentationGroupName, ); @@ -1036,37 +1003,40 @@ export class SegmentationUserLayer extends Base { toJSON() { const x = super.toJSON(); - x[SELECTED_ALPHA_JSON_KEY] = this.displayState.selectedAlpha.toJSON(); - x[NOT_SELECTED_ALPHA_JSON_KEY] = + x[json_keys.SELECTED_ALPHA_JSON_KEY] = + this.displayState.selectedAlpha.toJSON(); + x[json_keys.NOT_SELECTED_ALPHA_JSON_KEY] = this.displayState.notSelectedAlpha.toJSON(); - x[SATURATION_JSON_KEY] = this.displayState.saturation.toJSON(); - x[OBJECT_ALPHA_JSON_KEY] = this.displayState.objectAlpha.toJSON(); - x[HOVER_HIGHLIGHT_JSON_KEY] = this.displayState.hoverHighlight.toJSON(); - x[BASE_SEGMENT_COLORING_JSON_KEY] = + x[json_keys.SATURATION_JSON_KEY] = this.displayState.saturation.toJSON(); + x[json_keys.OBJECT_ALPHA_JSON_KEY] = this.displayState.objectAlpha.toJSON(); + x[json_keys.HOVER_HIGHLIGHT_JSON_KEY] = + this.displayState.hoverHighlight.toJSON(); + x[json_keys.BASE_SEGMENT_COLORING_JSON_KEY] = this.displayState.baseSegmentColoring.toJSON(); - x[IGNORE_NULL_VISIBLE_SET_JSON_KEY] = + x[json_keys.IGNORE_NULL_VISIBLE_SET_JSON_KEY] = this.displayState.ignoreNullVisibleSet.toJSON(); - x[MESH_SILHOUETTE_RENDERING_JSON_KEY] = + x[json_keys.MESH_SILHOUETTE_RENDERING_JSON_KEY] = this.displayState.silhouetteRendering.toJSON(); - x[ANCHOR_SEGMENT_JSON_KEY] = this.anchorSegment.toJSON(); - x[SKELETON_RENDERING_JSON_KEY] = + x[json_keys.ANCHOR_SEGMENT_JSON_KEY] = this.anchorSegment.toJSON(); + x[json_keys.SKELETON_RENDERING_JSON_KEY] = this.displayState.skeletonRenderingOptions.toJSON(); - x[MESH_RENDER_SCALE_JSON_KEY] = + x[json_keys.MESH_RENDER_SCALE_JSON_KEY] = this.displayState.renderScaleTarget.toJSON(); - x[CROSS_SECTION_RENDER_SCALE_JSON_KEY] = + x[json_keys.CROSS_SECTION_RENDER_SCALE_JSON_KEY] = this.sliceViewRenderScaleTarget.toJSON(); const { linkedSegmentationGroup, linkedSegmentationColorGroup } = this.displayState; - x[LINKED_SEGMENTATION_GROUP_JSON_KEY] = linkedSegmentationGroup.toJSON(); + x[json_keys.LINKED_SEGMENTATION_GROUP_JSON_KEY] = + linkedSegmentationGroup.toJSON(); if ( linkedSegmentationColorGroup.root.value !== linkedSegmentationGroup.root.value ) { - x[LINKED_SEGMENTATION_COLOR_GROUP_JSON_KEY] = + x[json_keys.LINKED_SEGMENTATION_COLOR_GROUP_JSON_KEY] = linkedSegmentationColorGroup.toJSON() ?? false; } - x[EQUIVALENCES_JSON_KEY] = + x[json_keys.EQUIVALENCES_JSON_KEY] = this.displayState.originalSegmentationGroupState.localGraph.toJSON(); if (linkedSegmentationGroup.root.value === this) { Object.assign(x, this.displayState.segmentationGroupState.value.toJSON()); @@ -1278,147 +1248,7 @@ export class SegmentationUserLayer extends Base { static supportsPickOption = true; } -const maxSilhouettePower = 10; - -function getViewSpecificSkeletonRenderingControl( - viewName: "2d" | "3d", -): LayerControlDefinition[] { - return [ - { - label: `Skeleton mode (${viewName})`, - toolJson: `${SKELETON_RENDERING_JSON_KEY}.mode${viewName}`, - isValid: (layer) => layer.hasSkeletonsLayer, - ...enumLayerControl( - (layer) => - layer.displayState.skeletonRenderingOptions[ - `params${viewName}` as const - ].mode, - ), - }, - { - label: `Line width (${viewName})`, - toolJson: `${SKELETON_RENDERING_JSON_KEY}.lineWidth${viewName}`, - isValid: (layer) => layer.hasSkeletonsLayer, - toolDescription: `Skeleton line width (${viewName})`, - title: `Skeleton line width (${viewName})`, - ...rangeLayerControl((layer) => ({ - value: - layer.displayState.skeletonRenderingOptions[ - `params${viewName}` as const - ].lineWidth, - options: { min: 1, max: 40, step: 1 }, - })), - }, - ]; -} - -export const LAYER_CONTROLS: LayerControlDefinition[] = [ - { - label: "Color seed", - title: "Color segments based on a hash of their id", - toolJson: COLOR_SEED_JSON_KEY, - ...colorSeedLayerControl(), - }, - { - label: "Fixed color", - title: - "Use a fixed color for all segments without an explicitly-specified color", - toolJson: SEGMENT_DEFAULT_COLOR_JSON_KEY, - ...fixedColorLayerControl(), - }, - { - label: "Saturation", - toolJson: SATURATION_JSON_KEY, - title: "Saturation of segment colors", - ...rangeLayerControl((layer) => ({ value: layer.displayState.saturation })), - }, - { - label: "Opacity (on)", - toolJson: SELECTED_ALPHA_JSON_KEY, - isValid: (layer) => layer.has2dLayer, - title: "Opacity in cross-section views of segments that are selected", - ...rangeLayerControl((layer) => ({ - value: layer.displayState.selectedAlpha, - })), - }, - { - label: "Opacity (off)", - toolJson: NOT_SELECTED_ALPHA_JSON_KEY, - isValid: (layer) => layer.has2dLayer, - title: "Opacity in cross-section views of segments that are not selected", - ...rangeLayerControl((layer) => ({ - value: layer.displayState.notSelectedAlpha, - })), - }, - { - label: "Resolution (slice)", - toolJson: CROSS_SECTION_RENDER_SCALE_JSON_KEY, - isValid: (layer) => layer.has2dLayer, - ...renderScaleLayerControl((layer) => ({ - histogram: layer.sliceViewRenderScaleHistogram, - target: layer.sliceViewRenderScaleTarget, - })), - }, - { - label: "Resolution (mesh)", - toolJson: MESH_RENDER_SCALE_JSON_KEY, - isValid: (layer) => layer.has3dLayer, - ...renderScaleLayerControl((layer) => ({ - histogram: layer.displayState.renderScaleHistogram, - target: layer.displayState.renderScaleTarget, - })), - }, - { - label: "Opacity (3d)", - toolJson: OBJECT_ALPHA_JSON_KEY, - isValid: (layer) => layer.has3dLayer, - title: "Opacity of meshes and skeletons", - ...rangeLayerControl((layer) => ({ - value: layer.displayState.objectAlpha, - })), - }, - { - label: "Silhouette (3d)", - toolJson: MESH_SILHOUETTE_RENDERING_JSON_KEY, - isValid: (layer) => layer.has3dLayer, - title: - "Set to a non-zero value to increase transparency of object faces perpendicular to view direction", - ...rangeLayerControl((layer) => ({ - value: layer.displayState.silhouetteRendering, - options: { min: 0, max: maxSilhouettePower, step: 0.1 }, - })), - }, - { - label: "Hide segment ID 0", - toolJson: HIDE_SEGMENT_ZERO_JSON_KEY, - title: "Disallow selection and display of segment id 0", - ...checkboxLayerControl((layer) => layer.displayState.hideSegmentZero), - }, - { - label: "Base segment coloring", - toolJson: BASE_SEGMENT_COLORING_JSON_KEY, - title: "Color base segments individually", - ...checkboxLayerControl((layer) => layer.displayState.baseSegmentColoring), - }, - { - label: "Show all by default", - title: "Show all segments if none are selected", - toolJson: IGNORE_NULL_VISIBLE_SET_JSON_KEY, - ...checkboxLayerControl((layer) => layer.displayState.ignoreNullVisibleSet), - }, - { - label: "Highlight on hover", - toolJson: HOVER_HIGHLIGHT_JSON_KEY, - title: "Highlight the segment under the mouse pointer", - ...checkboxLayerControl((layer) => layer.displayState.hoverHighlight), - }, - ...getViewSpecificSkeletonRenderingControl("2d"), - ...getViewSpecificSkeletonRenderingControl("3d"), -]; - -for (const control of LAYER_CONTROLS) { - registerLayerControl(SegmentationUserLayer, control); -} +registerLayerControls(SegmentationUserLayer); registerLayerType(SegmentationUserLayer); registerVolumeLayerType(VolumeType.SEGMENTATION, SegmentationUserLayer); @@ -1435,8 +1265,8 @@ registerLayerShaderControlsTool( shaderControlState: layer.displayState.skeletonRenderingOptions.shaderControlState, }), - SKELETON_RENDERING_SHADER_CONTROL_TOOL_ID, + json_keys.SKELETON_RENDERING_SHADER_CONTROL_TOOL_ID, ); -registerSegmentSplitMergeTools(); -registerSegmentSelectTools(); +registerSegmentSplitMergeTools(SegmentationUserLayer); +registerSegmentSelectTools(SegmentationUserLayer); diff --git a/src/layer/segmentation/json_keys.ts b/src/layer/segmentation/json_keys.ts new file mode 100644 index 0000000000..96417a61ca --- /dev/null +++ b/src/layer/segmentation/json_keys.ts @@ -0,0 +1,27 @@ +export const SELECTED_ALPHA_JSON_KEY = "selectedAlpha"; +export const NOT_SELECTED_ALPHA_JSON_KEY = "notSelectedAlpha"; +export const OBJECT_ALPHA_JSON_KEY = "objectAlpha"; +export const SATURATION_JSON_KEY = "saturation"; +export const HOVER_HIGHLIGHT_JSON_KEY = "hoverHighlight"; +export const HIDE_SEGMENT_ZERO_JSON_KEY = "hideSegmentZero"; +export const BASE_SEGMENT_COLORING_JSON_KEY = "baseSegmentColoring"; +export const IGNORE_NULL_VISIBLE_SET_JSON_KEY = "ignoreNullVisibleSet"; +export const MESH_JSON_KEY = "mesh"; +export const SKELETONS_JSON_KEY = "skeletons"; +export const SEGMENTS_JSON_KEY = "segments"; +export const EQUIVALENCES_JSON_KEY = "equivalences"; +export const COLOR_SEED_JSON_KEY = "colorSeed"; +export const SEGMENT_STATED_COLORS_JSON_KEY = "segmentColors"; +export const MESH_RENDER_SCALE_JSON_KEY = "meshRenderScale"; +export const CROSS_SECTION_RENDER_SCALE_JSON_KEY = "crossSectionRenderScale"; +export const SKELETON_RENDERING_JSON_KEY = "skeletonRendering"; +export const SKELETON_SHADER_JSON_KEY = "skeletonShader"; +export const SEGMENT_QUERY_JSON_KEY = "segmentQuery"; +export const MESH_SILHOUETTE_RENDERING_JSON_KEY = "meshSilhouetteRendering"; +export const LINKED_SEGMENTATION_GROUP_JSON_KEY = "linkedSegmentationGroup"; +export const LINKED_SEGMENTATION_COLOR_GROUP_JSON_KEY = + "linkedSegmentationColorGroup"; +export const SEGMENT_DEFAULT_COLOR_JSON_KEY = "segmentDefaultColor"; +export const ANCHOR_SEGMENT_JSON_KEY = "anchorSegment"; +export const SKELETON_RENDERING_SHADER_CONTROL_TOOL_ID = + "skeletonShaderControl"; diff --git a/src/layer/segmentation/layer_controls.ts b/src/layer/segmentation/layer_controls.ts new file mode 100644 index 0000000000..8bcc268fa2 --- /dev/null +++ b/src/layer/segmentation/layer_controls.ts @@ -0,0 +1,156 @@ +import type { SegmentationUserLayer } from "#src/layer/segmentation/index.js"; +import * as json_keys from "#src/layer/segmentation/json_keys.js"; +import type { LayerControlDefinition } from "#src/widget/layer_control.js"; +import { registerLayerControl } from "#src/widget/layer_control.js"; +import { checkboxLayerControl } from "#src/widget/layer_control_checkbox.js"; +import { enumLayerControl } from "#src/widget/layer_control_enum.js"; +import { rangeLayerControl } from "#src/widget/layer_control_range.js"; +import { renderScaleLayerControl } from "#src/widget/render_scale_widget.js"; +import { + colorSeedLayerControl, + fixedColorLayerControl, +} from "#src/widget/segmentation_color_mode.js"; + +export const LAYER_CONTROLS: LayerControlDefinition[] = [ + { + label: "Color seed", + title: "Color segments based on a hash of their id", + toolJson: json_keys.COLOR_SEED_JSON_KEY, + ...colorSeedLayerControl(), + }, + { + label: "Fixed color", + title: + "Use a fixed color for all segments without an explicitly-specified color", + toolJson: json_keys.SEGMENT_DEFAULT_COLOR_JSON_KEY, + ...fixedColorLayerControl(), + }, + { + label: "Saturation", + toolJson: json_keys.SATURATION_JSON_KEY, + title: "Saturation of segment colors", + ...rangeLayerControl((layer) => ({ value: layer.displayState.saturation })), + }, + { + label: "Opacity (on)", + toolJson: json_keys.SELECTED_ALPHA_JSON_KEY, + isValid: (layer) => layer.has2dLayer, + title: "Opacity in cross-section views of segments that are selected", + ...rangeLayerControl((layer) => ({ + value: layer.displayState.selectedAlpha, + })), + }, + { + label: "Opacity (off)", + toolJson: json_keys.NOT_SELECTED_ALPHA_JSON_KEY, + isValid: (layer) => layer.has2dLayer, + title: "Opacity in cross-section views of segments that are not selected", + ...rangeLayerControl((layer) => ({ + value: layer.displayState.notSelectedAlpha, + })), + }, + { + label: "Resolution (slice)", + toolJson: json_keys.CROSS_SECTION_RENDER_SCALE_JSON_KEY, + isValid: (layer) => layer.has2dLayer, + ...renderScaleLayerControl((layer) => ({ + histogram: layer.sliceViewRenderScaleHistogram, + target: layer.sliceViewRenderScaleTarget, + })), + }, + { + label: "Resolution (mesh)", + toolJson: json_keys.MESH_RENDER_SCALE_JSON_KEY, + isValid: (layer) => layer.has3dLayer, + ...renderScaleLayerControl((layer) => ({ + histogram: layer.displayState.renderScaleHistogram, + target: layer.displayState.renderScaleTarget, + })), + }, + { + label: "Opacity (3d)", + toolJson: json_keys.OBJECT_ALPHA_JSON_KEY, + isValid: (layer) => layer.has3dLayer, + title: "Opacity of meshes and skeletons", + ...rangeLayerControl((layer) => ({ + value: layer.displayState.objectAlpha, + })), + }, + { + label: "Silhouette (3d)", + toolJson: json_keys.MESH_SILHOUETTE_RENDERING_JSON_KEY, + isValid: (layer) => layer.has3dLayer, + title: + "Set to a non-zero value to increase transparency of object faces perpendicular to view direction", + ...rangeLayerControl((layer) => ({ + value: layer.displayState.silhouetteRendering, + options: { min: 0, max: maxSilhouettePower, step: 0.1 }, + })), + }, + { + label: "Hide segment ID 0", + toolJson: json_keys.HIDE_SEGMENT_ZERO_JSON_KEY, + title: "Disallow selection and display of segment id 0", + ...checkboxLayerControl((layer) => layer.displayState.hideSegmentZero), + }, + { + label: "Base segment coloring", + toolJson: json_keys.BASE_SEGMENT_COLORING_JSON_KEY, + title: "Color base segments individually", + ...checkboxLayerControl((layer) => layer.displayState.baseSegmentColoring), + }, + { + label: "Show all by default", + title: "Show all segments if none are selected", + toolJson: json_keys.IGNORE_NULL_VISIBLE_SET_JSON_KEY, + ...checkboxLayerControl((layer) => layer.displayState.ignoreNullVisibleSet), + }, + { + label: "Highlight on hover", + toolJson: json_keys.HOVER_HIGHLIGHT_JSON_KEY, + title: "Highlight the segment under the mouse pointer", + ...checkboxLayerControl((layer) => layer.displayState.hoverHighlight), + }, + ...getViewSpecificSkeletonRenderingControl("2d"), + ...getViewSpecificSkeletonRenderingControl("3d"), +]; + +const maxSilhouettePower = 10; + +function getViewSpecificSkeletonRenderingControl( + viewName: "2d" | "3d", +): LayerControlDefinition[] { + return [ + { + label: `Skeleton mode (${viewName})`, + toolJson: `${json_keys.SKELETON_RENDERING_JSON_KEY}.mode${viewName}`, + isValid: (layer) => layer.hasSkeletonsLayer, + ...enumLayerControl( + (layer) => + layer.displayState.skeletonRenderingOptions[ + `params${viewName}` as const + ].mode, + ), + }, + { + label: `Line width (${viewName})`, + toolJson: `${json_keys.SKELETON_RENDERING_JSON_KEY}.lineWidth${viewName}`, + isValid: (layer) => layer.hasSkeletonsLayer, + toolDescription: `Skeleton line width (${viewName})`, + title: `Skeleton line width (${viewName})`, + ...rangeLayerControl((layer) => ({ + value: + layer.displayState.skeletonRenderingOptions[ + `params${viewName}` as const + ].lineWidth, + options: { min: 1, max: 40, step: 1 }, + })), + }, + ]; +} + +export function registerLayerControls(layerType: typeof SegmentationUserLayer) { + for (const control of LAYER_CONTROLS) { + registerLayerControl(layerType, control); + } +} diff --git a/src/segmentation_user_layer.css b/src/layer/segmentation/style.css similarity index 100% rename from src/segmentation_user_layer.css rename to src/layer/segmentation/style.css diff --git a/src/single_mesh_user_layer.ts b/src/layer/single_mesh/index.ts similarity index 89% rename from src/single_mesh_user_layer.ts rename to src/layer/single_mesh/index.ts index ef50916c0c..6e2b686943 100644 --- a/src/single_mesh_user_layer.ts +++ b/src/layer/single_mesh/index.ts @@ -14,34 +14,36 @@ * limitations under the License. */ -import "./single_mesh_user_layer.css"; +import "#src/layer/single_mesh/style.css"; +import type { ManagedUserLayer } from "#src/layer/index.js"; import { - ManagedUserLayer, registerLayerType, registerLayerTypeDetector, UserLayer, -} from "#/layer"; -import { LoadedDataSubsource } from "#/layer_data_source"; -import { Overlay } from "#/overlay"; -import { VertexAttributeInfo } from "#/single_mesh/base"; +} from "#src/layer/index.js"; +import type { LoadedDataSubsource } from "#src/layer/layer_data_source.js"; +import { Overlay } from "#src/overlay.js"; +import type { VertexAttributeInfo } from "#src/single_mesh/base.js"; import { getShaderAttributeType, pickAttributeNames, SingleMeshDisplayState, SingleMeshLayer, -} from "#/single_mesh/frontend"; -import { WatchableValue, WatchableValueInterface } from "#/trackable_value"; -import { Borrowed, RefCounted } from "#/util/disposable"; -import { removeChildren, removeFromParent } from "#/util/dom"; -import { makeHelpButton } from "#/widget/help_button"; -import { makeMaximizeButton } from "#/widget/maximize_button"; -import { ShaderCodeWidget } from "#/widget/shader_code_widget"; +} from "#src/single_mesh/frontend.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { WatchableValue } from "#src/trackable_value.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeChildren, removeFromParent } from "#src/util/dom.js"; +import { makeHelpButton } from "#src/widget/help_button.js"; +import { makeMaximizeButton } from "#src/widget/maximize_button.js"; +import { ShaderCodeWidget } from "#src/widget/shader_code_widget.js"; import { registerLayerShaderControlsTool, ShaderControls, -} from "#/widget/shader_controls"; -import { Tab } from "#/widget/tab_view"; +} from "#src/widget/shader_controls.js"; +import { Tab } from "#src/widget/tab_view.js"; const SHADER_JSON_KEY = "shader"; const SHADER_CONTROLS_JSON_KEY = "shaderControls"; diff --git a/src/single_mesh_user_layer.css b/src/layer/single_mesh/style.css similarity index 100% rename from src/single_mesh_user_layer.css rename to src/layer/single_mesh/style.css diff --git a/src/layer_group_viewer.ts b/src/layer_group_viewer.ts index c213f8ff1b..d195785245 100644 --- a/src/layer_group_viewer.ts +++ b/src/layer_group_viewer.ts @@ -18,22 +18,24 @@ * @file Viewer for a group of layers. */ -import "./layer_group_viewer.css"; - -import debounce from "lodash/debounce"; -import { - DataPanelLayoutContainer, - InputEventBindings as DataPanelInputEventBindings, -} from "#/data_panel_layout"; -import { DisplayContext } from "#/display_context"; -import { +import "#src/layer_group_viewer.css"; +import { debounce } from "lodash-es"; +import type { InputEventBindings as DataPanelInputEventBindings } from "#src/data_panel_layout.js"; +import { DataPanelLayoutContainer } from "#src/data_panel_layout.js"; +import type { DisplayContext } from "#src/display_context.js"; +import type { LayerListSpecification, - LayerSubsetSpecification, MouseSelectionState, SelectedLayerState, -} from "#/layer"; -import { +} from "#src/layer/index.js"; +import { LayerSubsetSpecification } from "#src/layer/index.js"; +import type { CoordinateSpacePlaybackVelocity, + TrackableCrossSectionZoom, + TrackableNavigationLink, + TrackableProjectionZoom, +} from "#src/navigation_state.js"; +import { DisplayPose, LinkedCoordinateSpacePlaybackVelocity, LinkedDepthRange, @@ -46,43 +48,41 @@ import { NavigationLinkType, NavigationState, PlaybackManager, - TrackableCrossSectionZoom, - TrackableNavigationLink, - TrackableProjectionZoom, WatchableDisplayDimensionRenderInfo, -} from "#/navigation_state"; -import { RenderLayerRole } from "#/renderlayer"; -import { TrackableBoolean } from "#/trackable_boolean"; -import { - registerNested, +} from "#src/navigation_state.js"; +import type { RenderLayerRole } from "#src/renderlayer.js"; +import { TrackableBoolean } from "#src/trackable_boolean.js"; +import type { WatchableSet, WatchableValueInterface, -} from "#/trackable_value"; -import { ContextMenu } from "#/ui/context_menu"; -import { popDragStatus, pushDragStatus } from "#/ui/drag_and_drop"; -import { LayerBar } from "#/ui/layer_bar"; +} from "#src/trackable_value.js"; +import { registerNested } from "#src/trackable_value.js"; +import { ContextMenu } from "#src/ui/context_menu.js"; +import { popDragStatus, pushDragStatus } from "#src/ui/drag_and_drop.js"; +import { LayerBar } from "#src/ui/layer_bar.js"; import { endLayerDrag, getDropEffectFromModifiers, startLayerDrag, -} from "#/ui/layer_drag_and_drop"; -import { setupPositionDropHandlers } from "#/ui/position_drag_and_drop"; -import { LocalToolBinder } from "#/ui/tool"; -import { AutomaticallyFocusedElement } from "#/util/automatic_focus"; -import { TrackableRGB } from "#/util/color"; -import { Borrowed, Owned, RefCounted } from "#/util/disposable"; -import { removeChildren } from "#/util/dom"; +} from "#src/ui/layer_drag_and_drop.js"; +import { setupPositionDropHandlers } from "#src/ui/position_drag_and_drop.js"; +import { LocalToolBinder } from "#src/ui/tool.js"; +import { AutomaticallyFocusedElement } from "#src/util/automatic_focus.js"; +import type { TrackableRGB } from "#src/util/color.js"; +import type { Borrowed, Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeChildren } from "#src/util/dom.js"; import { dispatchEventAction, registerActionListener, -} from "#/util/event_action_map"; +} from "#src/util/event_action_map.js"; import { CompoundTrackable, optionallyRestoreFromJsonMember, -} from "#/util/trackable"; -import { WatchableVisibilityPriority } from "#/visibility_priority/frontend"; -import { EnumSelectWidget } from "#/widget/enum_widget"; -import { TrackableScaleBarOptions } from "#/widget/scale_bar"; +} from "#src/util/trackable.js"; +import type { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; +import { EnumSelectWidget } from "#src/widget/enum_widget.js"; +import type { TrackableScaleBarOptions } from "#src/widget/scale_bar.js"; declare let NEUROGLANCER_SHOW_LAYER_BAR_EXTRA_BUTTONS: boolean | undefined; diff --git a/src/layer_groups_layout.ts b/src/layer_groups_layout.ts index 16d54831f7..8cde729c62 100644 --- a/src/layer_groups_layout.ts +++ b/src/layer_groups_layout.ts @@ -18,29 +18,31 @@ * @file Facilities for laying out multiple LayerGroupViewer instances. */ -import "./layer_groups_layout.css"; +import "#src/layer_groups_layout.css"; -import debounce from "lodash/debounce"; -import { LayerListSpecification, LayerSubsetSpecification } from "#/layer"; +import { debounce } from "lodash-es"; +import type { LayerListSpecification } from "#src/layer/index.js"; +import { LayerSubsetSpecification } from "#src/layer/index.js"; import { getViewerDropEffect, hasViewerDrag, LayerGroupViewer, viewerDragType, -} from "#/layer_group_viewer"; -import { TrackableValue } from "#/trackable_value"; -import { popDragStatus, pushDragStatus } from "#/ui/drag_and_drop"; +} from "#src/layer_group_viewer.js"; +import { TrackableValue } from "#src/trackable_value.js"; +import { popDragStatus, pushDragStatus } from "#src/ui/drag_and_drop.js"; +import type { DropLayers } from "#src/ui/layer_drag_and_drop.js"; import { - DropLayers, endLayerDrag, getDropLayers, getLayerDragInfo, updateLayerDropEffect, -} from "#/ui/layer_drag_and_drop"; -import { SIZE_FOR_DIRECTION } from "#/ui/side_panel"; -import { Borrowed, RefCounted } from "#/util/disposable"; -import { removeFromParent } from "#/util/dom"; -import { getDropEffect, setDropEffect } from "#/util/drag_and_drop"; +} from "#src/ui/layer_drag_and_drop.js"; +import { SIZE_FOR_DIRECTION } from "#src/ui/side_panel.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeFromParent } from "#src/util/dom.js"; +import { getDropEffect, setDropEffect } from "#src/util/drag_and_drop.js"; import { parseArray, verifyFinitePositiveFloat, @@ -48,11 +50,11 @@ import { verifyObjectProperty, verifyOptionalObjectProperty, verifyString, -} from "#/util/json"; -import { startRelativeMouseDrag } from "#/util/mouse_drag"; -import { NullarySignal } from "#/util/signal"; -import { Trackable } from "#/util/trackable"; -import { Viewer } from "#/viewer"; +} from "#src/util/json.js"; +import { startRelativeMouseDrag } from "#src/util/mouse_drag.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { Trackable } from "#src/util/trackable.js"; +import type { Viewer } from "#src/viewer.js"; interface LayoutComponent extends RefCounted { element: HTMLElement; diff --git a/src/layout.ts b/src/layout.ts index 44ab4f1d32..6c78e8c2bb 100644 --- a/src/layout.ts +++ b/src/layout.ts @@ -24,14 +24,14 @@ export function withFlex(value: any, handler: Handler) { handler(element); }; } -export function withStyle(style: {}, handler: Handler) { +export function withStyle(style: object, handler: Handler) { return (element: HTMLElement) => { Object.assign(element.style, style); handler(element); }; } -export function withAttributes(attributes: {}, handler: Handler) { +export function withAttributes(attributes: object, handler: Handler) { return (element: HTMLElement) => { Object.assign(element, attributes); handler(element); diff --git a/src/main.bundle.js b/src/main.bundle.js new file mode 100644 index 0000000000..617f992b08 --- /dev/null +++ b/src/main.bundle.js @@ -0,0 +1,3 @@ +import "#src/layer/enabled_frontend_modules.js"; +import "#src/datasource/enabled_frontend_modules.js"; +import "#main"; diff --git a/src/main.ts b/src/main.ts index 973fc03468..8a06431aed 100644 --- a/src/main.ts +++ b/src/main.ts @@ -17,8 +17,7 @@ /** * @file Main entry point for default neuroglancer viewer. */ -import { setupDefaultViewer } from "#/ui/default_viewer_setup"; +import { setupDefaultViewer } from "#src/ui/default_viewer_setup.js"; +import "#src/util/google_tag_manager.js"; -window.addEventListener("DOMContentLoaded", () => { - setupDefaultViewer(); -}); +setupDefaultViewer(); diff --git a/src/main_module.ts b/src/main_module.ts index 57cd5fd0ee..b232673900 100644 --- a/src/main_module.ts +++ b/src/main_module.ts @@ -1,75 +1,2 @@ -import { - bindDefaultCopyHandler, - bindDefaultPasteHandler, -} from "#/ui/default_clipboard_handling"; -import { setDefaultInputEventBindings } from "#/ui/default_input_event_bindings"; -import { makeMinimalViewer } from "#/ui/minimal_viewer"; -// import {UrlHashBinding} from '#/ui/url_hash_binding'; - -import "#/datasource/dvid/register_credentials_provider"; -import "#/datasource/dvid/register_default"; -import "#/datasource/brainmaps/register_default"; -import "#/datasource/precomputed/register_default"; -import "#/segmentation_user_layer"; -import "#/image_user_layer"; - -import { defaultCredentialsManager } from "#/credentials_provider/default_manager"; -import { credentialsKey } from "#/datasource/brainmaps/api"; -import { BrainmapsCredentialsProvider } from "#/datasource/brainmaps/credentials_provider"; - -/** - * Sets up the default neuroglancer viewer. - */ -// TODO: options here could enable or disable datasources. - -// TODO: need to check for webGL2 support -// const gl = document.createElement('canvas').getContext('webgl2'); -// if (!gl) { -// console.log('your browser/OS/drivers do not support WebGL2'); -// } else { -// console.log('webgl2 works!'); -// } - -export function setupDefaultViewer(options: { - brainMapsClientId: string | undefined; - target: HTMLElement | undefined; - bundleRoot: string | undefined; -}) { - // register_brainmaps - if (options.brainMapsClientId) { - const clientId: string = options.brainMapsClientId; - defaultCredentialsManager.register( - credentialsKey, - () => new BrainmapsCredentialsProvider(clientId), - ); - } - - const viewer = makeMinimalViewer( - { bundleRoot: options.bundleRoot }, - options.target, - ); - setDefaultInputEventBindings(viewer.inputEventBindings); - - /* const hashBinding = viewer.registerDisposer(new UrlHashBinding(viewer.state)); - viewer.registerDisposer(hashBinding.parseError.changed.add(() => { - const {value} = hashBinding.parseError; - if (value !== undefined) { - const status = new StatusMessage(); - status.setErrorMessage(`Error parsing state: ${value.message}`); - console.log('Error parsing state', value); - } - hashBinding.parseError; - })); - hashBinding.updateFromUrlHash(); */ - - bindDefaultCopyHandler(viewer); - bindDefaultPasteHandler(viewer); - - return viewer; -} - -export default class Neuroglancer { - version() { - return "0.0.1"; - } -} +import "#src/layer/enabled_frontend_modules.js"; +import "#src/datasource/enabled_frontend_modules.js"; diff --git a/src/main_python.ts b/src/main_python.ts index 52dd168ee5..fe48559c69 100644 --- a/src/main_python.ts +++ b/src/main_python.ts @@ -19,34 +19,36 @@ * Sets up the Python-integrated neuroglancer viewer. */ -import debounce from "lodash/debounce"; -import { CachingCredentialsManager } from "#/credentials_provider"; -import { getDefaultDataSourceProvider } from "#/datasource/default_provider"; -import { PythonDataSource } from "#/datasource/python/frontend"; +import { debounce } from "lodash-es"; +import { CachingCredentialsManager } from "#src/credentials_provider/index.js"; +import { getDefaultDataSourceProvider } from "#src/datasource/default_provider.js"; +import { PythonDataSource } from "#src/datasource/python/frontend.js"; import { Client, ClientStateReceiver, ClientStateSynchronizer, -} from "#/python_integration/api"; -import { PythonCredentialsManager } from "#/python_integration/credentials_provider"; -import { TrackableBasedEventActionMap } from "#/python_integration/event_action_map"; -import { PrefetchManager } from "#/python_integration/prefetch"; -import { RemoteActionHandler } from "#/python_integration/remote_actions"; -import { TrackableBasedStatusMessages } from "#/python_integration/remote_status_messages"; -import { ScreenshotHandler } from "#/python_integration/screenshots"; -import { VolumeRequestHandler } from "#/python_integration/volume"; -import { TrackableValue } from "#/trackable_value"; +} from "#src/python_integration/api.js"; +import { PythonCredentialsManager } from "#src/python_integration/credentials_provider.js"; +import { TrackableBasedEventActionMap } from "#src/python_integration/event_action_map.js"; +import { PrefetchManager } from "#src/python_integration/prefetch.js"; +import { RemoteActionHandler } from "#src/python_integration/remote_actions.js"; +import { TrackableBasedStatusMessages } from "#src/python_integration/remote_status_messages.js"; +import { ScreenshotHandler } from "#src/python_integration/screenshots.js"; +import { VolumeRequestHandler } from "#src/python_integration/volume.js"; +import { TrackableValue } from "#src/trackable_value.js"; import { bindDefaultCopyHandler, bindDefaultPasteHandler, -} from "#/ui/default_clipboard_handling"; -import { setDefaultInputEventBindings } from "#/ui/default_input_event_bindings"; -import { makeDefaultViewer } from "#/ui/default_viewer"; -import { bindTitle } from "#/ui/title"; -import { UrlHashBinding } from "#/ui/url_hash_binding"; -import { parseFixedLengthArray, verifyInt } from "#/util/json"; -import { CompoundTrackable, Trackable } from "#/util/trackable"; -import { InputEventBindings, VIEWER_UI_CONFIG_OPTIONS } from "#/viewer"; +} from "#src/ui/default_clipboard_handling.js"; +import { setDefaultInputEventBindings } from "#src/ui/default_input_event_bindings.js"; +import { makeDefaultViewer } from "#src/ui/default_viewer.js"; +import { bindTitle } from "#src/ui/title.js"; +import { UrlHashBinding } from "#src/ui/url_hash_binding.js"; +import { parseFixedLengthArray, verifyInt } from "#src/util/json.js"; +import type { Trackable } from "#src/util/trackable.js"; +import { CompoundTrackable } from "#src/util/trackable.js"; +import type { InputEventBindings } from "#src/viewer.js"; +import { VIEWER_UI_CONFIG_OPTIONS } from "#src/viewer.js"; function makeTrackableBasedEventActionMaps( inputEventBindings: InputEventBindings, diff --git a/src/mesh/backend.ts b/src/mesh/backend.ts index 9aabff8af2..ca5f313915 100644 --- a/src/mesh/backend.ts +++ b/src/mesh/backend.ts @@ -14,49 +14,55 @@ * limitations under the License. */ -import { Chunk, ChunkSource, withChunkManager } from "#/chunk_manager/backend"; -import { ChunkPriorityTier, ChunkState } from "#/chunk_manager/base"; import { + Chunk, + ChunkSource, + withChunkManager, +} from "#src/chunk_manager/backend.js"; +import { ChunkPriorityTier, ChunkState } from "#src/chunk_manager/base.js"; +import type { EncodedMeshData, EncodedVertexPositions, + MeshVertexIndices, + MultiscaleFragmentFormat, +} from "#src/mesh/base.js"; +import { FRAGMENT_SOURCE_RPC_ID, MESH_LAYER_RPC_ID, - MeshVertexIndices, MULTISCALE_FRAGMENT_SOURCE_RPC_ID, MULTISCALE_MESH_LAYER_RPC_ID, - MultiscaleFragmentFormat, VertexPositionFormat, -} from "#/mesh/base"; -import { - getDesiredMultiscaleMeshChunks, - MultiscaleMeshManifest, -} from "#/mesh/multiscale"; -import { computeTriangleStrips } from "#/mesh/triangle_strips"; +} from "#src/mesh/base.js"; +import type { MultiscaleMeshManifest } from "#src/mesh/multiscale.js"; +import { getDesiredMultiscaleMeshChunks } from "#src/mesh/multiscale.js"; +import { computeTriangleStrips } from "#src/mesh/triangle_strips.js"; +import type { PerspectiveViewBackend } from "#src/perspective_view/backend.js"; +import { PerspectiveViewRenderLayerBackend } from "#src/perspective_view/backend.js"; +import { get3dModelToDisplaySpaceMatrix } from "#src/render_coordinate_transform.js"; +import type { RenderLayerBackendAttachment } from "#src/render_layer_backend.js"; +import { withSegmentationLayerBackendState } from "#src/segmentation_display_state/backend.js"; import { - PerspectiveViewBackend, - PerspectiveViewRenderLayerBackend, -} from "#/perspective_view/backend"; -import { get3dModelToDisplaySpaceMatrix } from "#/render_coordinate_transform"; -import { RenderLayerBackendAttachment } from "#/render_layer_backend"; -import { withSegmentationLayerBackendState } from "#/segmentation_display_state/backend"; -import { getObjectKey } from "#/segmentation_display_state/base"; -import { forEachVisibleSegment } from "#/segmentation_display_state/base"; -import { CancellationToken } from "#/util/cancellation"; -import { convertEndian32, Endianness } from "#/util/endian"; -import { getFrustrumPlanes, mat4, vec3 } from "#/util/geom"; + getObjectKey, + forEachVisibleSegment, +} from "#src/segmentation_display_state/base.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import type { Endianness } from "#src/util/endian.js"; +import { convertEndian32 } from "#src/util/endian.js"; +import { getFrustrumPlanes, mat4, vec3 } from "#src/util/geom.js"; import { verifyObject, verifyObjectProperty, verifyStringArray, -} from "#/util/json"; -import { Uint64 } from "#/util/uint64"; -import { zorder3LessThan } from "#/util/zorder"; +} from "#src/util/json.js"; +import { Uint64 } from "#src/util/uint64.js"; +import { zorder3LessThan } from "#src/util/zorder.js"; import { getBasePriority, getPriorityTier, -} from "#/visibility_priority/backend"; -import { withSharedVisibility } from "#/visibility_priority/backend"; -import { registerSharedObject, RPC } from "#/worker_rpc"; + withSharedVisibility, +} from "#src/visibility_priority/backend.js"; +import type { RPC } from "#src/worker_rpc.js"; +import { registerSharedObject } from "#src/worker_rpc.js"; const MESH_OBJECT_MANIFEST_CHUNK_PRIORITY = 100; const MESH_OBJECT_FRAGMENT_CHUNK_PRIORITY = 50; @@ -360,6 +366,7 @@ export function decodeTriangleVertexPositionsAndIndices( ); } +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export interface MeshSource { // TODO(jbms): Move this declaration to class definition below and declare abstract once // TypeScript supports mixins with abstract classes. @@ -369,6 +376,7 @@ export interface MeshSource { ): Promise; } +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export class MeshSource extends ChunkSource { fragmentSource: FragmentSource; @@ -556,6 +564,7 @@ export class MultiscaleFragmentChunk extends Chunk { } } +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export interface MultiscaleMeshSource { // TODO(jbms): Move this declaration to class definition below and declare abstract once // TypeScript supports mixins with abstract classes. @@ -565,6 +574,7 @@ export interface MultiscaleMeshSource { ): Promise; } +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export class MultiscaleMeshSource extends ChunkSource { fragmentSource: MultiscaleFragmentSource; format: MultiscaleFragmentFormat; diff --git a/src/mesh/draco/index.ts b/src/mesh/draco/index.ts index 79cbd3fda7..b0d086b82a 100644 --- a/src/mesh/draco/index.ts +++ b/src/mesh/draco/index.ts @@ -14,14 +14,12 @@ * limitations under the License. */ -import { RawPartitionedMeshData, RawMeshData } from "#/mesh/backend"; - -import dracoWasmUrl from "./neuroglancer_draco.wasm"; +import type { RawPartitionedMeshData, RawMeshData } from "#src/mesh/backend.js"; let decodeResult: RawPartitionedMeshData | Error | undefined = undefined; let numPartitions = 0; -let wasmModule: WebAssembly.WebAssemblyInstantiatedSource | undefined; +let wasmModule: WebAssembly.Instance | undefined; const libraryEnv = { emscripten_notify_memory_growth: (memoryIndex: number) => { @@ -35,7 +33,7 @@ const libraryEnv = { subchunkOffsetsPointer: number, ) => { const numIndices = numFaces * 3; - const memory = wasmModule!.instance.exports.memory as WebAssembly.Memory; + const memory = wasmModule!.exports.memory as WebAssembly.Memory; const indices = new Uint32Array( memory.buffer, indicesPointer, @@ -63,13 +61,16 @@ const libraryEnv = { }, }; const dracoModulePromise = (async () => { - const response = await fetch(dracoWasmUrl); - const wasmCode = await response.arrayBuffer(); - const m = (wasmModule = await WebAssembly.instantiate(wasmCode, { - env: libraryEnv, - wasi_snapshot_preview1: libraryEnv, - })); - (m.instance.exports._initialize as Function)(); + const m = (wasmModule = ( + await WebAssembly.instantiateStreaming( + fetch(new URL("./neuroglancer_draco.wasm", import.meta.url)), + { + env: libraryEnv, + wasi_snapshot_preview1: libraryEnv, + }, + ) + ).instance); + (m.exports._initialize as Function)(); return m; })(); @@ -79,13 +80,11 @@ export async function decodeDracoPartitioned( partition: boolean, ): Promise { const m = await dracoModulePromise; - const offset = (m.instance.exports.malloc as Function)(buffer.byteLength); - const heap = new Uint8Array( - (m.instance.exports.memory as WebAssembly.Memory).buffer, - ); + const offset = (m.exports.malloc as Function)(buffer.byteLength); + const heap = new Uint8Array((m.exports.memory as WebAssembly.Memory).buffer); heap.set(buffer, offset); numPartitions = partition ? 8 : 1; - const code = (m.instance.exports.neuroglancer_draco_decode as Function)( + const code = (m.exports.neuroglancer_draco_decode as Function)( offset, buffer.byteLength, partition, @@ -103,12 +102,10 @@ export async function decodeDracoPartitioned( export async function decodeDraco(buffer: Uint8Array): Promise { const m = await dracoModulePromise; - const offset = (m.instance.exports.malloc as Function)(buffer.byteLength); - const heap = new Uint8Array( - (m.instance.exports.memory as WebAssembly.Memory).buffer, - ); + const offset = (m.exports.malloc as Function)(buffer.byteLength); + const heap = new Uint8Array((m.exports.memory as WebAssembly.Memory).buffer); heap.set(buffer, offset); - const code = (m.instance.exports.neuroglancer_draco_decode as Function)( + const code = (m.exports.neuroglancer_draco_decode as Function)( offset, buffer.byteLength, false, diff --git a/src/mesh/frontend.ts b/src/mesh/frontend.ts index 18ff98189c..1661535802 100644 --- a/src/mesh/frontend.ts +++ b/src/mesh/frontend.ts @@ -14,49 +14,49 @@ * limitations under the License. */ -import { ChunkState } from "#/chunk_manager/base"; -import { Chunk, ChunkManager, ChunkSource } from "#/chunk_manager/frontend"; -import { VisibleLayerInfo } from "#/layer"; -import { +import { ChunkState } from "#src/chunk_manager/base.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { Chunk, ChunkSource } from "#src/chunk_manager/frontend.js"; +import type { VisibleLayerInfo } from "#src/layer/index.js"; +import type { EncodedMeshData, + MultiscaleFragmentFormat, +} from "#src/mesh/base.js"; +import { FRAGMENT_SOURCE_RPC_ID, MESH_LAYER_RPC_ID, MULTISCALE_FRAGMENT_SOURCE_RPC_ID, MULTISCALE_MESH_LAYER_RPC_ID, - MultiscaleFragmentFormat, VertexPositionFormat, -} from "#/mesh/base"; +} from "#src/mesh/base.js"; +import type { MultiscaleMeshManifest } from "#src/mesh/multiscale.js"; import { getMultiscaleChunksToDraw, getMultiscaleFragmentKey, - MultiscaleMeshManifest, validateOctree, -} from "#/mesh/multiscale"; -import { PerspectivePanel } from "#/perspective_view/panel"; -import { +} from "#src/mesh/multiscale.js"; +import type { PerspectivePanel } from "#src/perspective_view/panel.js"; +import type { PerspectiveViewReadyRenderContext, PerspectiveViewRenderContext, - PerspectiveViewRenderLayer, -} from "#/perspective_view/render_layer"; -import { - ThreeDimensionalRenderLayerAttachmentState, - update3dRenderLayerAttachment, -} from "#/renderlayer"; +} from "#src/perspective_view/render_layer.js"; +import { PerspectiveViewRenderLayer } from "#src/perspective_view/render_layer.js"; +import type { ThreeDimensionalRenderLayerAttachmentState } from "#src/renderlayer.js"; +import { update3dRenderLayerAttachment } from "#src/renderlayer.js"; import { forEachVisibleSegment, getObjectKey, -} from "#/segmentation_display_state/base"; +} from "#src/segmentation_display_state/base.js"; +import type { SegmentationDisplayState3D } from "#src/segmentation_display_state/frontend.js"; import { forEachVisibleSegmentToDraw, registerRedrawWhenSegmentationDisplayState3DChanged, - SegmentationDisplayState3D, SegmentationLayerSharedObject, -} from "#/segmentation_display_state/frontend"; -import { - makeCachedDerivedWatchableValue, - WatchableValueInterface, -} from "#/trackable_value"; -import { Borrowed, RefCounted } from "#/util/disposable"; +} from "#src/segmentation_display_state/frontend.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { makeCachedDerivedWatchableValue } from "#src/trackable_value.js"; +import type { Borrowed, RefCounted } from "#src/util/disposable.js"; +import type { vec4 } from "#src/util/geom.js"; import { getFrustrumPlanes, mat3, @@ -64,15 +64,15 @@ import { mat4, scaleMat3Output, vec3, - vec4, -} from "#/util/geom"; -import * as matrix from "#/util/matrix"; -import { Uint64 } from "#/util/uint64"; -import { Buffer } from "#/webgl/buffer"; -import { GL } from "#/webgl/context"; -import { parameterizedEmitterDependentShaderGetter } from "#/webgl/dynamic_shader"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; -import { registerSharedObjectOwner, RPC } from "#/worker_rpc"; +} from "#src/util/geom.js"; +import * as matrix from "#src/util/matrix.js"; +import type { Uint64 } from "#src/util/uint64.js"; +import { Buffer } from "#src/webgl/buffer.js"; +import type { GL } from "#src/webgl/context.js"; +import { parameterizedEmitterDependentShaderGetter } from "#src/webgl/dynamic_shader.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; +import type { RPC } from "#src/worker_rpc.js"; +import { registerSharedObjectOwner } from "#src/worker_rpc.js"; const tempMat4 = mat4.create(); const tempMat3 = mat3.create(); @@ -616,7 +616,7 @@ export class FragmentChunk extends Chunk { } } -export type MeshSourceOptions = {}; +export type MeshSourceOptions = object; export class MeshSource extends ChunkSource { fragmentSource = this.registerDisposer( diff --git a/src/mesh/multiscale.spec.ts b/src/mesh/multiscale.spec.ts index 7c5aa7139b..68f1ce87c9 100644 --- a/src/mesh/multiscale.spec.ts +++ b/src/mesh/multiscale.spec.ts @@ -14,12 +14,13 @@ * limitations under the License. */ +import { describe, it, expect } from "vitest"; +import type { MultiscaleMeshManifest } from "#src/mesh/multiscale.js"; import { getDesiredMultiscaleMeshChunks, getMultiscaleChunksToDraw, - MultiscaleMeshManifest, -} from "#/mesh/multiscale"; -import { getFrustrumPlanes, mat4, vec3 } from "#/util/geom"; +} from "#src/mesh/multiscale.js"; +import { getFrustrumPlanes, mat4, vec3 } from "#src/util/geom.js"; interface MultiscaleChunkResult { lod: number; diff --git a/src/mesh/multiscale.ts b/src/mesh/multiscale.ts index af676ff919..5abe046f4b 100644 --- a/src/mesh/multiscale.ts +++ b/src/mesh/multiscale.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import { isAABBVisible, mat4, vec3 } from "#/util/geom"; -import { getOctreeChildIndex } from "#/util/zorder"; +import type { mat4, vec3 } from "#src/util/geom.js"; +import { isAABBVisible } from "#src/util/geom.js"; +import { getOctreeChildIndex } from "#src/util/zorder.js"; const DEBUG_CHUNKS_TO_DRAW = false; diff --git a/src/mesh/triangle_strips.spec.ts b/src/mesh/triangle_strips.spec.ts index 8cb72acb4f..000535fc88 100644 --- a/src/mesh/triangle_strips.spec.ts +++ b/src/mesh/triangle_strips.spec.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { describe, it, expect } from "vitest"; import { computeTriangleStrips, getBaseIndex, @@ -22,7 +23,7 @@ import { vertexAIndex, vertexBIndex, vertexCIndex, -} from "#/mesh/triangle_strips"; +} from "#src/mesh/triangle_strips.js"; describe("triangle_strips", () => { describe("getBaseIndex", () => { diff --git a/src/mesh/triangle_strips.ts b/src/mesh/triangle_strips.ts index 09a72d83d0..299ea8774b 100644 --- a/src/mesh/triangle_strips.ts +++ b/src/mesh/triangle_strips.ts @@ -20,8 +20,8 @@ * http://www.codercorner.com/Strips.htm */ -import { hashCombine } from "#/gpu_hash/hash_function"; -import { MeshVertexIndices } from "#/mesh/base"; +import { hashCombine } from "#src/gpu_hash/hash_function.js"; +import type { MeshVertexIndices } from "#src/mesh/base.js"; const DEBUG_TIMING = false; diff --git a/src/navigation_state.ts b/src/navigation_state.ts index 3ab71df6b5..e129dd9512 100644 --- a/src/navigation_state.ts +++ b/src/navigation_state.ts @@ -14,19 +14,22 @@ * limitations under the License. */ -import { - clampAndRoundCoordinateToVoxelCenter, +import type { CoordinateSpace, DimensionId, +} from "#src/coordinate_transform.js"; +import { + clampAndRoundCoordinateToVoxelCenter, dimensionNamesFromJson, emptyInvalidCoordinateSpace, getBoundingBoxCenter, getCenterBound, -} from "#/coordinate_transform"; -import { WatchableValueInterface } from "#/trackable_value"; -import { arraysEqual } from "#/util/array"; -import { Borrowed, Owned, RefCounted } from "#/util/disposable"; -import { mat3, mat4, quat, vec3 } from "#/util/geom"; +} from "#src/coordinate_transform.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { arraysEqual } from "#src/util/array.js"; +import type { Borrowed, Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { mat3, mat4, quat, vec3 } from "#src/util/geom.js"; import { parseArray, parseFiniteVec, @@ -37,11 +40,12 @@ import { verifyObject, verifyObjectProperty, verifyOptionalObjectProperty, -} from "#/util/json"; -import { NullarySignal } from "#/util/signal"; -import { optionallyRestoreFromJsonMember, Trackable } from "#/util/trackable"; -import { TrackableEnum } from "#/util/trackable_enum"; -import * as vector from "#/util/vector"; +} from "#src/util/json.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { Trackable } from "#src/util/trackable.js"; +import { optionallyRestoreFromJsonMember } from "#src/util/trackable.js"; +import { TrackableEnum } from "#src/util/trackable_enum.js"; +import * as vector from "#src/util/vector.js"; export enum NavigationLinkType { LINKED = 0, diff --git a/src/object_picking.ts b/src/object_picking.ts index 5fe67088e7..c2a3dfe38a 100644 --- a/src/object_picking.ts +++ b/src/object_picking.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { MouseSelectionState } from "#/layer"; -import { RenderLayer } from "#/renderlayer"; -import { Uint64 } from "#/util/uint64"; +import type { MouseSelectionState } from "#src/layer/index.js"; +import type { RenderLayer } from "#src/renderlayer.js"; +import type { Uint64 } from "#src/util/uint64.js"; const DEBUG_PICKING = false; diff --git a/src/overlay.ts b/src/overlay.ts index ace1c31a2e..3703e05e2e 100644 --- a/src/overlay.ts +++ b/src/overlay.ts @@ -14,14 +14,16 @@ * limitations under the License. */ -import { AutomaticallyFocusedElement } from "#/util/automatic_focus"; -import { RefCounted } from "#/util/disposable"; -import { EventActionMap, KeyboardEventBinder } from "#/util/keyboard_bindings"; +import { AutomaticallyFocusedElement } from "#src/util/automatic_focus.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { + EventActionMap, + KeyboardEventBinder, +} from "#src/util/keyboard_bindings.js"; +import "#src/overlay.css"; export const overlayKeyboardHandlerPriority = 100; -import "./overlay.css"; - export let overlaysOpen = 0; export const defaultEventMap = EventActionMap.fromObject({ diff --git a/src/perspective_view/backend.ts b/src/perspective_view/backend.ts index 8454deae68..2ab18fd623 100644 --- a/src/perspective_view/backend.ts +++ b/src/perspective_view/backend.ts @@ -19,18 +19,16 @@ * PerspectiveViewRenderLayer to set chunk priorities based on the state of the perspective panel. */ -import { PERSPECTIVE_VIEW_RPC_ID } from "#/perspective_view/base"; -import { ProjectionParameters } from "#/projection_parameters"; -import { - RenderedViewBackend, - RenderLayerBackend, -} from "#/render_layer_backend"; -import { SharedWatchableValue } from "#/shared_watchable_value"; +import { PERSPECTIVE_VIEW_RPC_ID } from "#src/perspective_view/base.js"; +import type { ProjectionParameters } from "#src/projection_parameters.js"; +import type { RenderedViewBackend } from "#src/render_layer_backend.js"; +import { RenderLayerBackend } from "#src/render_layer_backend.js"; +import type { SharedWatchableValue } from "#src/shared_watchable_value.js"; +import type { RPC } from "#src/worker_rpc.js"; import { registerSharedObject, - RPC, SharedObjectCounterpart, -} from "#/worker_rpc"; +} from "#src/worker_rpc.js"; @registerSharedObject(PERSPECTIVE_VIEW_RPC_ID) export class PerspectiveViewBackend diff --git a/src/perspective_view/panel.ts b/src/perspective_view/panel.ts index 0157f53e85..cb6cafce4a 100644 --- a/src/perspective_view/panel.ts +++ b/src/perspective_view/panel.ts @@ -14,66 +14,70 @@ * limitations under the License. */ -import "#/noselect.css"; -import "./panel.css"; - -import { AxesLineHelper, computeAxisLineMatrix } from "#/axes_lines"; -import { - applyRenderViewportToProjectionMatrix, - DisplayContext, -} from "#/display_context"; -import { - makeRenderedPanelVisibleLayerTracker, - VisibleRenderLayerTracker, -} from "#/layer"; -import { PERSPECTIVE_VIEW_RPC_ID } from "#/perspective_view/base"; -import { +import "#src/noselect.css"; +import "#src/perspective_view/panel.css"; + +import type { PerspectiveViewAnnotationLayer } from "#src/annotation/renderlayer.js"; +import { AxesLineHelper, computeAxisLineMatrix } from "#src/axes_lines.js"; +import type { DisplayContext } from "#src/display_context.js"; +import { applyRenderViewportToProjectionMatrix } from "#src/display_context.js"; +import type { VisibleRenderLayerTracker } from "#src/layer/index.js"; +import { makeRenderedPanelVisibleLayerTracker } from "#src/layer/index.js"; +import { PERSPECTIVE_VIEW_RPC_ID } from "#src/perspective_view/base.js"; +import type { PerspectiveViewReadyRenderContext, PerspectiveViewRenderContext, - PerspectiveViewRenderLayer, -} from "#/perspective_view/render_layer"; -import { - ProjectionParameters, - updateProjectionParametersFromInverseViewAndProjection, -} from "#/projection_parameters"; +} from "#src/perspective_view/render_layer.js"; +import { PerspectiveViewRenderLayer } from "#src/perspective_view/render_layer.js"; +import type { ProjectionParameters } from "#src/projection_parameters.js"; +import { updateProjectionParametersFromInverseViewAndProjection } from "#src/projection_parameters.js"; +import type { + FramePickingData, + RenderedDataViewerState, +} from "#src/rendered_data_panel.js"; import { clearOutOfBoundsPickData, - FramePickingData, pickDiameter, pickOffsetSequence, pickRadius, RenderedDataPanel, - RenderedDataViewerState, -} from "#/rendered_data_panel"; +} from "#src/rendered_data_panel.js"; import { DerivedProjectionParameters, SharedProjectionParameters, -} from "#/renderlayer"; -import { SliceView, SliceViewRenderHelper } from "#/sliceview/frontend"; -import { - TrackableBoolean, - TrackableBooleanCheckbox, -} from "#/trackable_boolean"; -import { TrackableValue, WatchableValueInterface } from "#/trackable_value"; -import { TrackableRGB } from "#/util/color"; -import { Owned } from "#/util/disposable"; -import { ActionEvent, registerActionListener } from "#/util/event_action_map"; -import { kAxes, kZeroVec4, mat4, vec3, vec4 } from "#/util/geom"; -import { startRelativeMouseDrag } from "#/util/mouse_drag"; -import { TouchRotateInfo, TouchTranslateInfo } from "#/util/touch_bindings"; -import { WatchableMap } from "#/util/watchable_map"; -import { withSharedVisibility } from "#/visibility_priority/frontend"; +} from "#src/renderlayer.js"; +import type { SliceView } from "#src/sliceview/frontend.js"; +import { SliceViewRenderHelper } from "#src/sliceview/frontend.js"; +import type { TrackableBoolean } from "#src/trackable_boolean.js"; +import { TrackableBooleanCheckbox } from "#src/trackable_boolean.js"; +import type { + TrackableValue, + WatchableValueInterface, +} from "#src/trackable_value.js"; +import type { TrackableRGB } from "#src/util/color.js"; +import type { Owned } from "#src/util/disposable.js"; +import type { ActionEvent } from "#src/util/event_action_map.js"; +import { registerActionListener } from "#src/util/event_action_map.js"; +import { kAxes, kZeroVec4, mat4, vec3, vec4 } from "#src/util/geom.js"; +import { startRelativeMouseDrag } from "#src/util/mouse_drag.js"; +import type { + TouchRotateInfo, + TouchTranslateInfo, +} from "#src/util/touch_bindings.js"; +import { WatchableMap } from "#src/util/watchable_map.js"; +import { withSharedVisibility } from "#src/visibility_priority/frontend.js"; import { DepthStencilRenderbuffer, FramebufferConfiguration, makeTextureBuffers, OffscreenCopyHelper, TextureBuffer, -} from "#/webgl/offscreen"; -import { ShaderBuilder } from "#/webgl/shader"; -import { MultipleScaleBarTextures, ScaleBarOptions } from "#/widget/scale_bar"; -import { RPC, SharedObject } from "#/worker_rpc"; -import { PerspectiveViewAnnotationLayer } from "#/annotation/renderlayer"; +} from "#src/webgl/offscreen.js"; +import type { ShaderBuilder } from "#src/webgl/shader.js"; +import type { ScaleBarOptions } from "#src/widget/scale_bar.js"; +import { MultipleScaleBarTextures } from "#src/widget/scale_bar.js"; +import type { RPC } from "#src/worker_rpc.js"; +import { SharedObject } from "#src/worker_rpc.js"; export interface PerspectiveViewerState extends RenderedDataViewerState { wireFrame: WatchableValueInterface; diff --git a/src/perspective_view/render_layer.ts b/src/perspective_view/render_layer.ts index 9b6a3b67ad..99c758a6c9 100644 --- a/src/perspective_view/render_layer.ts +++ b/src/perspective_view/render_layer.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import { VisibleLayerInfo } from "#/layer"; -import { PerspectivePanel } from "#/perspective_view/panel"; -import { +import type { VisibleLayerInfo } from "#src/layer/index.js"; +import type { PerspectivePanel } from "#src/perspective_view/panel.js"; +import type { ThreeDimensionalReadyRenderContext, ThreeDimensionalRenderContext, - VisibilityTrackedRenderLayer, -} from "#/renderlayer"; -import { vec3 } from "#/util/geom"; -import { ShaderModule } from "#/webgl/shader"; -import { SharedObject } from "#/worker_rpc"; +} from "#src/renderlayer.js"; +import { VisibilityTrackedRenderLayer } from "#src/renderlayer.js"; +import type { vec3 } from "#src/util/geom.js"; +import type { ShaderModule } from "#src/webgl/shader.js"; +import type { SharedObject } from "#src/worker_rpc.js"; export type PerspectiveViewReadyRenderContext = ThreeDimensionalReadyRenderContext; @@ -57,6 +57,7 @@ export interface PerspectiveViewRenderContext depthBufferTexture?: WebGLTexture | null; } +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export class PerspectiveViewRenderLayer< AttachmentState = unknown, > extends VisibilityTrackedRenderLayer { @@ -83,6 +84,7 @@ export class PerspectiveViewRenderLayer< } } +// eslint-disable-next-line @typescript-eslint/no-unused-vars export interface PerspectiveViewRenderLayer { isTransparent: boolean | undefined; isAnnotation: boolean | undefined; diff --git a/src/projection_parameters.ts b/src/projection_parameters.ts index 7ca2223bed..9b7a61830c 100644 --- a/src/projection_parameters.ts +++ b/src/projection_parameters.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import { RenderViewport, renderViewportsEqual } from "#/display_context"; -import { DisplayDimensionRenderInfo } from "#/navigation_state"; -import { arraysEqual } from "#/util/array"; -import { mat4 } from "#/util/geom"; -import { kEmptyFloat32Vec } from "#/util/vector"; +import { RenderViewport, renderViewportsEqual } from "#src/display_context.js"; +import type { DisplayDimensionRenderInfo } from "#src/navigation_state.js"; +import { arraysEqual } from "#src/util/array.js"; +import { mat4 } from "#src/util/geom.js"; +import { kEmptyFloat32Vec } from "#src/util/vector.js"; export class ProjectionParameters extends RenderViewport { displayDimensionRenderInfo: DisplayDimensionRenderInfo; diff --git a/src/python_integration/api.ts b/src/python_integration/api.ts index a9dd2b3750..fa28d27e7c 100644 --- a/src/python_integration/api.ts +++ b/src/python_integration/api.ts @@ -14,18 +14,18 @@ * limitations under the License. */ -import debounce from "lodash/debounce"; -import throttle from "lodash/throttle"; -import { StatusMessage } from "#/status"; -import { RefCounted } from "#/util/disposable"; -import { HttpError } from "#/util/http_request"; -import { getRandomHexString } from "#/util/random"; -import { getCachedJson, Trackable } from "#/util/trackable"; +import { debounce, throttle } from "lodash-es"; +import { StatusMessage } from "#src/status.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { HttpError } from "#src/util/http_request.js"; +import { getRandomHexString } from "#src/util/random.js"; +import type { Trackable } from "#src/util/trackable.js"; +import { getCachedJson } from "#src/util/trackable.js"; const DEBUG = false; function getServerUrls() { - const match = window.location.pathname.match(/^(.*)\/v\/([^\/]+)/); + const match = window.location.pathname.match(/^(.*)\/v\/([^/]+)/); if (match === null) { throw new Error("Failed to determine token from URL."); } diff --git a/src/python_integration/credentials_provider.ts b/src/python_integration/credentials_provider.ts index 954b6e0822..478bf12739 100644 --- a/src/python_integration/credentials_provider.ts +++ b/src/python_integration/credentials_provider.ts @@ -18,22 +18,24 @@ * @file Implementation of a CredentialsProvider based on an input and output TrackableValue. */ +import type { + CredentialsManager, + CredentialsWithGeneration, +} from "#src/credentials_provider/index.js"; import { AnonymousFirstCredentialsProvider, - CredentialsManager, CredentialsProvider, - CredentialsWithGeneration, makeCachedCredentialsGetter, -} from "#/credentials_provider"; -import { Client } from "#/python_integration/api"; -import { fetchOk } from "#/util/http_request"; +} from "#src/credentials_provider/index.js"; +import type { Client } from "#src/python_integration/api.js"; +import { fetchOk } from "#src/util/http_request.js"; import { stableStringify, verifyInt, verifyObject, verifyObjectProperty, -} from "#/util/json"; -import { Memoize } from "#/util/memoize"; +} from "#src/util/json.js"; +import { Memoize } from "#src/util/memoize.js"; class PythonCredentialsProvider< Credentials, diff --git a/src/python_integration/event_action_map.ts b/src/python_integration/event_action_map.ts index d0db80f940..545aeb8aa2 100644 --- a/src/python_integration/event_action_map.ts +++ b/src/python_integration/event_action_map.ts @@ -18,10 +18,10 @@ * @file Facility for updating an EventActionMap based on a JSON representation. */ -import { verifyObject, verifyString } from "#/util/json"; -import { NullarySignal } from "#/util/signal"; -import { Trackable } from "#/util/trackable"; -import { EventActionMap } from "#/util/event_action_map"; +import { EventActionMap } from "#src/util/event_action_map.js"; +import { verifyObject, verifyString } from "#src/util/json.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { Trackable } from "#src/util/trackable.js"; export class TrackableBasedEventActionMap implements Trackable { eventActionMap = new EventActionMap(); diff --git a/src/python_integration/prefetch.ts b/src/python_integration/prefetch.ts index 1cf9403266..c75d7caf12 100644 --- a/src/python_integration/prefetch.ts +++ b/src/python_integration/prefetch.ts @@ -19,19 +19,24 @@ * Python-initiated prefetch support. */ -import debounce from "lodash/debounce"; -import { DataSourceProviderRegistry } from "#/datasource"; -import { DisplayContext } from "#/display_context"; -import { Borrowed, Owned, RefCounted } from "#/util/disposable"; +import { debounce } from "lodash-es"; +import type { DataSourceProviderRegistry } from "#src/datasource/index.js"; +import type { DisplayContext } from "#src/display_context.js"; +import type { Borrowed, Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; import { parseArray, verifyInt, verifyObject, verifyObjectProperty, -} from "#/util/json"; -import { NullarySignal } from "#/util/signal"; -import { DataManagementContext, Viewer, ViewerUIConfiguration } from "#/viewer"; -import { WatchableVisibilityPriority } from "#/visibility_priority/frontend"; +} from "#src/util/json.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { + DataManagementContext, + ViewerUIConfiguration, +} from "#src/viewer.js"; +import { Viewer } from "#src/viewer.js"; +import { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; export class PrefetchManager extends RefCounted { prefetchStates = new Map(); diff --git a/src/python_integration/remote_actions.ts b/src/python_integration/remote_actions.ts index 795b30de3d..274ae9b9d6 100644 --- a/src/python_integration/remote_actions.ts +++ b/src/python_integration/remote_actions.ts @@ -18,14 +18,14 @@ * @file Facility for remote action handling. */ -import debounce from "lodash/debounce"; -import { TrackableValue } from "#/trackable_value"; -import { RefCounted } from "#/util/disposable"; -import { registerActionListener } from "#/util/event_action_map"; -import { verifyStringArray } from "#/util/json"; -import { Signal } from "#/util/signal"; -import { getCachedJson } from "#/util/trackable"; -import { Viewer } from "#/viewer"; +import { debounce } from "lodash-es"; +import { TrackableValue } from "#src/trackable_value.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { registerActionListener } from "#src/util/event_action_map.js"; +import { verifyStringArray } from "#src/util/json.js"; +import { Signal } from "#src/util/signal.js"; +import { getCachedJson } from "#src/util/trackable.js"; +import type { Viewer } from "#src/viewer.js"; export class RemoteActionHandler extends RefCounted { actionSet = new TrackableValue( diff --git a/src/python_integration/remote_status_messages.ts b/src/python_integration/remote_status_messages.ts index 58ab01cf9e..1208e1a9a2 100644 --- a/src/python_integration/remote_status_messages.ts +++ b/src/python_integration/remote_status_messages.ts @@ -18,11 +18,11 @@ * @file Facility for displaying remote status messages. */ -import debounce from "lodash/debounce"; -import { StatusMessage } from "#/status"; -import { NullarySignal } from "#/util/signal"; -import { RefCounted } from "#/util/disposable"; -import { verifyObject, verifyString } from "#/util/json"; +import { debounce } from "lodash-es"; +import { StatusMessage } from "#src/status.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { verifyObject, verifyString } from "#src/util/json.js"; +import { NullarySignal } from "#src/util/signal.js"; export class TrackableBasedStatusMessages extends RefCounted { existingMessages = new Map(); diff --git a/src/python_integration/screenshots.ts b/src/python_integration/screenshots.ts index 61da9ef1ca..ca5b394978 100644 --- a/src/python_integration/screenshots.ts +++ b/src/python_integration/screenshots.ts @@ -14,22 +14,21 @@ * limitations under the License. */ -import debounce from "lodash/debounce"; -import throttle from "lodash/throttle"; -import { numChunkStatistics } from "#/chunk_manager/base"; -import { TrackableValue } from "#/trackable_value"; +import { debounce, throttle } from "lodash-es"; +import { numChunkStatistics } from "#src/chunk_manager/base.js"; +import { TrackableValue } from "#src/trackable_value.js"; import { columnSpecifications, getChunkSourceIdentifier, getFormattedNames, -} from "#/ui/statistics"; -import { toBase64 } from "#/util/base64"; -import { RefCounted } from "#/util/disposable"; -import { convertEndian32, Endianness } from "#/util/endian"; -import { verifyOptionalString } from "#/util/json"; -import { Signal } from "#/util/signal"; -import { getCachedJson } from "#/util/trackable"; -import { Viewer } from "#/viewer"; +} from "#src/ui/statistics.js"; +import { toBase64 } from "#src/util/base64.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { convertEndian32, Endianness } from "#src/util/endian.js"; +import { verifyOptionalString } from "#src/util/json.js"; +import { Signal } from "#src/util/signal.js"; +import { getCachedJson } from "#src/util/trackable.js"; +import type { Viewer } from "#src/viewer.js"; export class ScreenshotHandler extends RefCounted { sendScreenshotRequested = new Signal<(state: any) => void>(); @@ -115,20 +114,6 @@ export class ScreenshotHandler extends RefCounted { ); } - private isReady() { - const { viewer } = this; - viewer.chunkQueueManager.flushPendingChunkUpdates(); - if (!viewer.display.isReady()) { - return false; - } - for (const layer of viewer.layerManager.managedLayers) { - if (!layer.isReady()) { - return false; - } - } - return true; - } - private async maybeSendScreenshot() { const requestState = this.requestState.value; const { previousRequest } = this; @@ -139,7 +124,7 @@ export class ScreenshotHandler extends RefCounted { return; } const { viewer } = this; - if (!this.isReady()) { + if (!viewer.isReady()) { this.wasAlreadyVisible = false; this.throttledSendStatistics(requestState); return; diff --git a/src/python_integration/volume.ts b/src/python_integration/volume.ts index 032ad66fce..8820099eda 100644 --- a/src/python_integration/volume.ts +++ b/src/python_integration/volume.ts @@ -14,34 +14,30 @@ * limitations under the License. */ -import debounce from "lodash/debounce"; +import { debounce } from "lodash-es"; +import type { CoordinateSpace } from "#src/coordinate_transform.js"; import { - CoordinateSpace, coordinateSpaceFromJson, coordinateSpacesEqual, coordinateSpaceToJson, makeCoordinateSpace, -} from "#/coordinate_transform"; -import { ImageUserLayer } from "#/image_user_layer"; -import { UserLayer } from "#/layer"; -import { RenderLayerTransform } from "#/render_coordinate_transform"; -import { SegmentationUserLayer } from "#/segmentation_user_layer"; -import { SliceViewSingleResolutionSource } from "#/sliceview/frontend"; -import { - getFillValueArray, - UncompressedVolumeChunk, -} from "#/sliceview/uncompressed_chunk_format"; -import { VolumeChunkSource } from "#/sliceview/volume/frontend"; -import { SliceViewVolumeRenderLayer } from "#/sliceview/volume/renderlayer"; -import { TrackableValue } from "#/trackable_value"; -import { arraysEqual } from "#/util/array"; -import { - CancellationToken, - CancellationTokenSource, -} from "#/util/cancellation"; -import { DataType } from "#/util/data_type"; -import { RefCounted } from "#/util/disposable"; -import { valueOrThrow } from "#/util/error"; +} from "#src/coordinate_transform.js"; +import { ImageUserLayer } from "#src/layer/image/index.js"; +import type { UserLayer } from "#src/layer/index.js"; +import { SegmentationUserLayer } from "#src/layer/segmentation/index.js"; +import type { RenderLayerTransform } from "#src/render_coordinate_transform.js"; +import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; +import type { UncompressedVolumeChunk } from "#src/sliceview/uncompressed_chunk_format.js"; +import { getFillValueArray } from "#src/sliceview/uncompressed_chunk_format.js"; +import type { VolumeChunkSource } from "#src/sliceview/volume/frontend.js"; +import { SliceViewVolumeRenderLayer } from "#src/sliceview/volume/renderlayer.js"; +import { TrackableValue } from "#src/trackable_value.js"; +import { arraysEqual } from "#src/util/array.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { CancellationTokenSource } from "#src/util/cancellation.js"; +import { DataType } from "#src/util/data_type.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { valueOrThrow } from "#src/util/error.js"; import { parseArray, parseFixedLengthArray, @@ -52,11 +48,11 @@ import { verifyObjectProperty, verifyOptionalObjectProperty, verifyString, -} from "#/util/json"; -import * as matrix from "#/util/matrix"; -import { MessageSeverity } from "#/util/message_list"; -import { Signal } from "#/util/signal"; -import { Viewer } from "#/viewer"; +} from "#src/util/json.js"; +import * as matrix from "#src/util/matrix.js"; +import { MessageSeverity } from "#src/util/message_list.js"; +import { Signal } from "#src/util/signal.js"; +import type { Viewer } from "#src/viewer.js"; enum RequestKind { VOLUME_CHUNK = 0, @@ -451,7 +447,7 @@ export class VolumeRequestHandler extends RefCounted { ) { throw new Error(`Invalid layer type: ${userLayer!.type}`); } - const renderLayers = userLayer.renderLayers.filter( + const renderLayers = userLayer!.renderLayers.filter( (renderLayer) => renderLayer instanceof SliceViewVolumeRenderLayer, ) as SliceViewVolumeRenderLayer[]; if (renderLayers.length !== 1) { @@ -463,7 +459,7 @@ export class VolumeRequestHandler extends RefCounted { const renderLayer = renderLayers[0]; const transform = valueOrThrow(renderLayer.transform.value); const renderLayerCoordinateSpace = getDefaultCoordinateSpace( - userLayer, + userLayer!, renderLayer, ); const { multiscaleSource } = renderLayer; diff --git a/src/render_coordinate_transform.ts b/src/render_coordinate_transform.ts index 6365564ca4..36e31a7829 100644 --- a/src/render_coordinate_transform.ts +++ b/src/render_coordinate_transform.ts @@ -14,26 +14,30 @@ * limitations under the License. */ -import { +import type { CoordinateSpace, CoordinateSpaceTransform, +} from "#src/coordinate_transform.js"; +import { emptyValidCoordinateSpace, homogeneousTransformSubmatrix, -} from "#/coordinate_transform"; -import { DisplayDimensionRenderInfo } from "#/navigation_state"; -import { +} from "#src/coordinate_transform.js"; +import type { DisplayDimensionRenderInfo } from "#src/navigation_state.js"; +import type { CachedWatchableValue, + WatchableValueInterface, +} from "#src/trackable_value.js"; +import { constantWatchableValue, makeCachedDerivedWatchableValue, - WatchableValueInterface, -} from "#/trackable_value"; -import { arraysEqual, scatterUpdate } from "#/util/array"; -import { ValueOrError } from "#/util/error"; -import { mat4, vec3 } from "#/util/geom"; -import { getDependentTransformInputDimensions } from "#/util/geom"; -import * as matrix from "#/util/matrix"; -import * as vector from "#/util/vector"; -import { prod } from "#/util/vector"; +} from "#src/trackable_value.js"; +import { arraysEqual, scatterUpdate } from "#src/util/array.js"; +import type { ValueOrError } from "#src/util/error.js"; +import type { vec3 } from "#src/util/geom.js"; +import { mat4, getDependentTransformInputDimensions } from "#src/util/geom.js"; +import * as matrix from "#src/util/matrix.js"; +import * as vector from "#src/util/vector.js"; +import { prod } from "#src/util/vector.js"; /** * Specifies coordinate transform information for a RenderLayer. diff --git a/src/render_layer_backend.ts b/src/render_layer_backend.ts index af44080a1a..751bf91774 100644 --- a/src/render_layer_backend.ts +++ b/src/render_layer_backend.ts @@ -14,26 +14,26 @@ * limitations under the License. */ -import { ChunkRenderLayerBackend } from "#/chunk_manager/backend"; -import { ProjectionParameters } from "#/projection_parameters"; +import { ChunkRenderLayerBackend } from "#src/chunk_manager/backend.js"; +import type { ProjectionParameters } from "#src/projection_parameters.js"; import { PROJECTION_PARAMETERS_CHANGED_RPC_METHOD_ID, PROJECTION_PARAMETERS_RPC_ID, RENDERED_VIEW_ADD_LAYER_RPC_ID, RENDERED_VIEW_REMOVE_LAYER_RPC_ID, -} from "#/render_layer_common"; -import { +} from "#src/render_layer_common.js"; +import type { WatchableValueChangeInterface, WatchableValueInterface, -} from "#/trackable_value"; -import { RefCounted } from "#/util/disposable"; -import { Signal } from "#/util/signal"; +} from "#src/trackable_value.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { Signal } from "#src/util/signal.js"; +import type { RPC } from "#src/worker_rpc.js"; import { registerRPC, registerSharedObject, - RPC, SharedObjectCounterpart, -} from "#/worker_rpc"; +} from "#src/worker_rpc.js"; export interface RenderedViewBackend { visibility: WatchableValueInterface; diff --git a/src/render_scale_statistics.ts b/src/render_scale_statistics.ts index 48aaa6b11b..703e2c655f 100644 --- a/src/render_scale_statistics.ts +++ b/src/render_scale_statistics.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import { TrackableValue } from "#/trackable_value"; -import { makeVerifyNumberInInterval } from "#/util/json"; -import { NullarySignal } from "#/util/signal"; -import { VisibilityPriorityAggregator } from "#/visibility_priority/frontend"; +import { TrackableValue } from "#src/trackable_value.js"; +import { makeVerifyNumberInInterval } from "#src/util/json.js"; +import { NullarySignal } from "#src/util/signal.js"; +import { VisibilityPriorityAggregator } from "#src/visibility_priority/frontend.js"; export const numRenderScaleHistogramBins = 40; export const renderScaleHistogramBinSize = 0.5; diff --git a/src/rendered_data_panel.ts b/src/rendered_data_panel.ts index 0c0f812fba..c62b6ec6f5 100644 --- a/src/rendered_data_panel.ts +++ b/src/rendered_data_panel.ts @@ -14,37 +14,38 @@ * limitations under the License. */ -import "#/rendered_data_panel.css"; -import "#/noselect.css"; - -import { Annotation } from "#/annotation"; -import { getAnnotationTypeRenderHandler } from "#/annotation/type_handler"; -import { DisplayContext, RenderedPanel } from "#/display_context"; -import { NavigationState } from "#/navigation_state"; -import { PickIDManager } from "#/object_picking"; +import "#src/rendered_data_panel.css"; +import "#src/noselect.css"; + +import type { Annotation } from "#src/annotation/index.js"; +import { getAnnotationTypeRenderHandler } from "#src/annotation/type_handler.js"; +import type { DisplayContext } from "#src/display_context.js"; +import { RenderedPanel } from "#src/display_context.js"; +import type { NavigationState } from "#src/navigation_state.js"; +import { PickIDManager } from "#src/object_picking.js"; import { displayToLayerCoordinates, layerToDisplayCoordinates, -} from "#/render_coordinate_transform"; -import { AutomaticallyFocusedElement } from "#/util/automatic_focus"; -import { Borrowed } from "#/util/disposable"; -import { +} from "#src/render_coordinate_transform.js"; +import { AutomaticallyFocusedElement } from "#src/util/automatic_focus.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import type { ActionEvent, EventActionMap, - registerActionListener, -} from "#/util/event_action_map"; -import { AXES_NAMES, kAxes, mat4, vec2, vec3 } from "#/util/geom"; -import { KeyboardEventBinder } from "#/util/keyboard_bindings"; -import * as matrix from "#/util/matrix"; -import { MouseEventBinder } from "#/util/mouse_bindings"; -import { startRelativeMouseDrag } from "#/util/mouse_drag"; -import { - TouchEventBinder, +} from "#src/util/event_action_map.js"; +import { registerActionListener } from "#src/util/event_action_map.js"; +import { AXES_NAMES, kAxes, mat4, vec2, vec3 } from "#src/util/geom.js"; +import { KeyboardEventBinder } from "#src/util/keyboard_bindings.js"; +import * as matrix from "#src/util/matrix.js"; +import { MouseEventBinder } from "#src/util/mouse_bindings.js"; +import { startRelativeMouseDrag } from "#src/util/mouse_drag.js"; +import type { TouchPinchInfo, TouchTranslateInfo, -} from "#/util/touch_bindings"; -import { getWheelZoomAmount } from "#/util/wheel_zoom"; -import { ViewerState } from "#/viewer_state"; +} from "#src/util/touch_bindings.js"; +import { TouchEventBinder } from "#src/util/touch_bindings.js"; +import { getWheelZoomAmount } from "#src/util/wheel_zoom.js"; +import type { ViewerState } from "#src/viewer_state.js"; declare let NEUROGLANCER_SHOW_OBJECT_SELECTION_TOOLTIP: boolean | undefined; diff --git a/src/renderlayer.ts b/src/renderlayer.ts index 841d57d33b..c874fac970 100644 --- a/src/renderlayer.ts +++ b/src/renderlayer.ts @@ -14,41 +14,42 @@ * limitations under the License. */ -import debounce from "lodash/debounce"; -import { LayerChunkProgressInfo } from "#/chunk_manager/base"; -import { RenderViewport, renderViewportsEqual } from "#/display_context"; -import { +import { debounce } from "lodash-es"; +import { LayerChunkProgressInfo } from "#src/chunk_manager/base.js"; +import { RenderViewport, renderViewportsEqual } from "#src/display_context.js"; +import type { LayerView, MouseSelectionState, PickState, UserLayer, VisibleLayerInfo, -} from "#/layer"; -import { +} from "#src/layer/index.js"; +import type { DisplayDimensionRenderInfo, NavigationState, -} from "#/navigation_state"; -import { PickIDManager } from "#/object_picking"; +} from "#src/navigation_state.js"; +import type { PickIDManager } from "#src/object_picking.js"; import { ProjectionParameters, projectionParametersEqual, -} from "#/projection_parameters"; -import { - get3dModelToDisplaySpaceMatrix, - RenderLayerTransformOrError, -} from "#/render_coordinate_transform"; +} from "#src/projection_parameters.js"; +import type { RenderLayerTransformOrError } from "#src/render_coordinate_transform.js"; +import { get3dModelToDisplaySpaceMatrix } from "#src/render_coordinate_transform.js"; import { PROJECTION_PARAMETERS_CHANGED_RPC_METHOD_ID, PROJECTION_PARAMETERS_RPC_ID, -} from "#/render_layer_common"; -import { WatchableSet, WatchableValueChangeInterface } from "#/trackable_value"; -import { Borrowed, RefCounted } from "#/util/disposable"; -import { mat4 } from "#/util/geom"; -import { MessageList, MessageSeverity } from "#/util/message_list"; -import { NullarySignal, Signal } from "#/util/signal"; -import { Uint64 } from "#/util/uint64"; -import { VisibilityPriorityAggregator } from "#/visibility_priority/frontend"; -import { registerSharedObjectOwner, RPC, SharedObject } from "#/worker_rpc"; +} from "#src/render_layer_common.js"; +import type { WatchableValueChangeInterface } from "#src/trackable_value.js"; +import { WatchableSet } from "#src/trackable_value.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { mat4 } from "#src/util/geom.js"; +import { MessageList, MessageSeverity } from "#src/util/message_list.js"; +import { NullarySignal, Signal } from "#src/util/signal.js"; +import type { Uint64 } from "#src/util/uint64.js"; +import { VisibilityPriorityAggregator } from "#src/visibility_priority/frontend.js"; +import type { RPC } from "#src/worker_rpc.js"; +import { registerSharedObjectOwner, SharedObject } from "#src/worker_rpc.js"; export enum RenderLayerRole { DATA = 0, diff --git a/src/segment_color.spec.ts b/src/segment_color.browser_test.ts similarity index 86% rename from src/segment_color.spec.ts rename to src/segment_color.browser_test.ts index 91603d090f..e8e34eff81 100644 --- a/src/segment_color.spec.ts +++ b/src/segment_color.browser_test.ts @@ -14,10 +14,14 @@ * limitations under the License. */ -import { SegmentColorHash, SegmentColorShaderManager } from "#/segment_color"; -import { DataType } from "#/util/data_type"; -import { Uint64 } from "#/util/uint64"; -import { fragmentShaderTest } from "#/webgl/shader_testing"; +import { describe, it, expect } from "vitest"; +import { + SegmentColorHash, + SegmentColorShaderManager, +} from "#src/segment_color.js"; +import { DataType } from "#src/util/data_type.js"; +import { Uint64 } from "#src/util/uint64.js"; +import { fragmentShaderTest } from "#src/webgl/shader_testing.js"; describe("segment_color", () => { it("the JavaScript implementation matches the WebGL shader implementation", () => { diff --git a/src/segment_color.ts b/src/segment_color.ts index 7db2ff39ce..d7d5db0ba5 100644 --- a/src/segment_color.ts +++ b/src/segment_color.ts @@ -14,21 +14,21 @@ * limitations under the License. */ -import { hashCombine } from "#/gpu_hash/hash_function"; +import { hashCombine } from "#src/gpu_hash/hash_function.js"; +import type { HashTableBase } from "#src/gpu_hash/hash_table.js"; +import type { GPUHashTable } from "#src/gpu_hash/shader.js"; import { glsl_hashCombine, HashMapShaderManager, - GPUHashTable, -} from "#/gpu_hash/shader"; -import { HashTableBase } from "#/gpu_hash/hash_table"; -import { hsvToRgb } from "#/util/colorspace"; -import { NullarySignal } from "#/util/signal"; -import { Uint64 } from "#/util/uint64"; -import { GL } from "#/webgl/context"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; -import { glsl_hsvToRgb, glsl_uint64 } from "#/webgl/shader_lib"; -import { getRandomUint32 } from "./util/random"; -import { Trackable } from "./util/trackable"; +} from "#src/gpu_hash/shader.js"; +import { hsvToRgb } from "#src/util/colorspace.js"; +import { getRandomUint32 } from "#src/util/random.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { Trackable } from "#src/util/trackable.js"; +import type { Uint64 } from "#src/util/uint64.js"; +import type { GL } from "#src/webgl/context.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; +import { glsl_hsvToRgb, glsl_uint64 } from "#src/webgl/shader_lib.js"; const NUM_COMPONENTS = 2; diff --git a/src/segmentation_display_state/backend.ts b/src/segmentation_display_state/backend.ts index 031104ccd6..b3f99edd9b 100644 --- a/src/segmentation_display_state/backend.ts +++ b/src/segmentation_display_state/backend.ts @@ -15,25 +15,28 @@ */ // Import to register the shared object types. -import "#/shared_disjoint_sets"; -import "#/uint64_set"; -import "#/uint64_map"; +import "#src/shared_disjoint_sets.js"; +import "#src/uint64_map.js"; +import "#src/uint64_set.js"; -import { ChunkRequester, ChunkSource } from "#/chunk_manager/backend"; -import { RenderLayerTransformOrError } from "#/render_coordinate_transform"; -import { +import type { ChunkRequester } from "#src/chunk_manager/backend.js"; +import { ChunkSource } from "#src/chunk_manager/backend.js"; +import type { RenderLayerTransformOrError } from "#src/render_coordinate_transform.js"; +import type { IndexedSegmentProperty, + VisibleSegmentsState, +} from "#src/segmentation_display_state/base.js"; +import { onTemporaryVisibleSegmentsStateChanged, onVisibleSegmentsStateChanged, - VisibleSegmentsState, VISIBLE_SEGMENTS_STATE_PROPERTIES, -} from "#/segmentation_display_state/base"; -import { SharedDisjointUint64Sets } from "#/shared_disjoint_sets"; -import { SharedWatchableValue } from "#/shared_watchable_value"; -import { Uint64Set } from "#/uint64_set"; -import { AnyConstructor } from "#/util/mixin"; -import { RPC } from "#/worker_rpc"; -import { Uint64OrderedSet } from "#/uint64_ordered_set"; +} from "#src/segmentation_display_state/base.js"; +import type { SharedDisjointUint64Sets } from "#src/shared_disjoint_sets.js"; +import type { SharedWatchableValue } from "#src/shared_watchable_value.js"; +import type { Uint64OrderedSet } from "#src/uint64_ordered_set.js"; +import type { Uint64Set } from "#src/uint64_set.js"; +import type { AnyConstructor } from "#src/util/mixin.js"; +import type { RPC } from "#src/worker_rpc.js"; export function receiveVisibleSegmentsState( rpc: RPC, diff --git a/src/segmentation_display_state/base.ts b/src/segmentation_display_state/base.ts index 3f988cc762..6b09716531 100644 --- a/src/segmentation_display_state/base.ts +++ b/src/segmentation_display_state/base.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import { VisibleSegmentEquivalencePolicy } from "#/segmentation_graph/segment_id"; -import { SharedDisjointUint64Sets } from "#/shared_disjoint_sets"; -import { SharedWatchableValue } from "#/shared_watchable_value"; -import { Uint64OrderedSet } from "#/uint64_ordered_set"; -import { Uint64Set } from "#/uint64_set"; -import { RefCounted } from "#/util/disposable"; -import { Uint64 } from "#/util/uint64"; +import { VisibleSegmentEquivalencePolicy } from "#src/segmentation_graph/segment_id.js"; +import type { SharedDisjointUint64Sets } from "#src/shared_disjoint_sets.js"; +import type { SharedWatchableValue } from "#src/shared_watchable_value.js"; +import type { Uint64OrderedSet } from "#src/uint64_ordered_set.js"; +import type { Uint64Set } from "#src/uint64_set.js"; +import type { RefCounted } from "#src/util/disposable.js"; +import type { Uint64 } from "#src/util/uint64.js"; export interface VisibleSegmentsState { visibleSegments: Uint64Set; diff --git a/src/segmentation_display_state/frontend.ts b/src/segmentation_display_state/frontend.ts index 9dce0ae580..df36d12496 100644 --- a/src/segmentation_display_state/frontend.ts +++ b/src/segmentation_display_state/frontend.ts @@ -14,52 +14,51 @@ * limitations under the License. */ -import { LayerChunkProgressInfo } from "#/chunk_manager/base"; -import { - ChunkManager, - ChunkRenderLayerFrontend, -} from "#/chunk_manager/frontend"; -import { LayerSelectedValues } from "#/layer"; -import { PickIDManager } from "#/object_picking"; -import { WatchableRenderLayerTransform } from "#/render_coordinate_transform"; -import { RenderScaleHistogram } from "#/render_scale_statistics"; -import { RenderLayer } from "#/renderlayer"; -import { getCssColor, SegmentColorHash } from "#/segment_color"; +import type { LayerChunkProgressInfo } from "#src/chunk_manager/base.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { ChunkRenderLayerFrontend } from "#src/chunk_manager/frontend.js"; +import type { LayerSelectedValues } from "#src/layer/index.js"; +import type { SegmentationUserLayer } from "#src/layer/segmentation/index.js"; +import type { PickIDManager } from "#src/object_picking.js"; +import type { WatchableRenderLayerTransform } from "#src/render_coordinate_transform.js"; +import type { RenderScaleHistogram } from "#src/render_scale_statistics.js"; +import type { RenderLayer } from "#src/renderlayer.js"; +import type { SegmentColorHash } from "#src/segment_color.js"; +import { getCssColor } from "#src/segment_color.js"; +import type { VisibleSegmentsState } from "#src/segmentation_display_state/base.js"; import { forEachVisibleSegment, onTemporaryVisibleSegmentsStateChanged, onVisibleSegmentsStateChanged, VISIBLE_SEGMENTS_STATE_PROPERTIES, - VisibleSegmentsState, -} from "#/segmentation_display_state/base"; -import { +} from "#src/segmentation_display_state/base.js"; +import type { InlineSegmentNumericalProperty, InlineSegmentProperty, PreprocessedSegmentPropertyMap, -} from "#/segmentation_display_state/property_map"; -import { SegmentationUserLayer } from "#/segmentation_user_layer"; -import { SharedWatchableValue } from "#/shared_watchable_value"; -import { TrackableAlphaValue } from "#/trackable_alpha"; -import { - observeWatchable, - registerNestedSync, +} from "#src/segmentation_display_state/property_map.js"; +import { SharedWatchableValue } from "#src/shared_watchable_value.js"; +import type { TrackableAlphaValue } from "#src/trackable_alpha.js"; +import type { TrackableValue, WatchableValueInterface, -} from "#/trackable_value"; -import { isWithinSelectionPanel } from "#/ui/selection_details"; -import { Uint64Map } from "#/uint64_map"; -import { setClipboard } from "#/util/clipboard"; -import { useWhiteBackground } from "#/util/color"; -import { RefCounted } from "#/util/disposable"; -import { measureElementClone } from "#/util/dom"; -import { kOneVec, vec3, vec4 } from "#/util/geom"; -import { NullarySignal } from "#/util/signal"; -import { Uint64 } from "#/util/uint64"; -import { withSharedVisibility } from "#/visibility_priority/frontend"; -import { makeCopyButton } from "#/widget/copy_button"; -import { makeEyeButton } from "#/widget/eye_button"; -import { makeFilterButton } from "#/widget/filter_button"; -import { makeStarButton } from "#/widget/star_button"; +} from "#src/trackable_value.js"; +import { observeWatchable, registerNestedSync } from "#src/trackable_value.js"; +import { isWithinSelectionPanel } from "#src/ui/selection_details.js"; +import type { Uint64Map } from "#src/uint64_map.js"; +import { setClipboard } from "#src/util/clipboard.js"; +import { useWhiteBackground } from "#src/util/color.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { measureElementClone } from "#src/util/dom.js"; +import type { vec3 } from "#src/util/geom.js"; +import { kOneVec, vec4 } from "#src/util/geom.js"; +import { NullarySignal } from "#src/util/signal.js"; +import { Uint64 } from "#src/util/uint64.js"; +import { withSharedVisibility } from "#src/visibility_priority/frontend.js"; +import { makeCopyButton } from "#src/widget/copy_button.js"; +import { makeEyeButton } from "#src/widget/eye_button.js"; +import { makeFilterButton } from "#src/widget/filter_button.js"; +import { makeStarButton } from "#src/widget/star_button.js"; export class Uint64MapEntry { constructor( diff --git a/src/segmentation_display_state/property_map.spec.ts b/src/segmentation_display_state/property_map.spec.ts index 78c23ce34e..fbce7ba0c7 100644 --- a/src/segmentation_display_state/property_map.spec.ts +++ b/src/segmentation_display_state/property_map.spec.ts @@ -14,12 +14,13 @@ * limitations under the License. */ +import { describe, it, expect } from "vitest"; import { mergeSegmentPropertyMaps, PreprocessedSegmentPropertyMap, SegmentPropertyMap, -} from "#/segmentation_display_state/property_map"; -import { Uint64 } from "#/util/uint64"; +} from "#src/segmentation_display_state/property_map.js"; +import { Uint64 } from "#src/util/uint64.js"; describe("PreprocessedSegmentPropertyMap", () => { it("handles lookups correctly", () => { diff --git a/src/segmentation_display_state/property_map.ts b/src/segmentation_display_state/property_map.ts index 698ae7b635..acb5131ca8 100644 --- a/src/segmentation_display_state/property_map.ts +++ b/src/segmentation_display_state/property_map.ts @@ -14,30 +14,31 @@ * limitations under the License. */ -import { ChunkManager, ChunkSource } from "#/chunk_manager/frontend"; -import { IndexedSegmentProperty } from "#/segmentation_display_state/base"; -import { Uint64OrderedSet } from "#/uint64_ordered_set"; -import { Uint64Set } from "#/uint64_set"; -import { - mergeSequences, +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { ChunkSource } from "#src/chunk_manager/frontend.js"; +import type { IndexedSegmentProperty } from "#src/segmentation_display_state/base.js"; +import type { Uint64OrderedSet } from "#src/uint64_ordered_set.js"; +import type { Uint64Set } from "#src/uint64_set.js"; +import type { TypedArray, TypedArrayConstructor, WritableArrayLike, -} from "#/util/array"; -import { DataType } from "#/util/data_type"; -import { Borrowed } from "#/util/disposable"; -import { murmurHash3_x86_32Hash64Bits } from "#/util/hash"; +} from "#src/util/array.js"; +import { mergeSequences } from "#src/util/array.js"; +import { DataType } from "#src/util/data_type.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { murmurHash3_x86_32Hash64Bits } from "#src/util/hash.js"; +import type { DataTypeInterval } from "#src/util/lerp.js"; import { clampToInterval, dataTypeCompare, - DataTypeInterval, dataTypeIntervalEqual, dataTypeValueNextAfter, parseDataTypeValue, -} from "#/util/lerp"; -import { getObjectId } from "#/util/object_id"; -import { defaultStringCompare } from "#/util/string"; -import { Uint64 } from "#/util/uint64"; +} from "#src/util/lerp.js"; +import { getObjectId } from "#src/util/object_id.js"; +import { defaultStringCompare } from "#src/util/string.js"; +import { Uint64 } from "#src/util/uint64.js"; export type InlineSegmentProperty = | InlineSegmentStringProperty @@ -1247,7 +1248,7 @@ export function forEachQueryResultSegmentId( } const { indices } = queryResult; if (indices !== undefined) { - const { ids } = db?.segmentPropertyMap.inlineProperties!; + const { ids } = db!.segmentPropertyMap.inlineProperties!; for (let i = 0, count = indices.length; i < count; ++i) { const propIndex = indices[i]; tempUint64.low = ids[propIndex * 2]; @@ -1271,7 +1272,7 @@ export function* forEachQueryResultSegmentIdGenerator( } const { indices } = queryResult; if (indices !== undefined) { - const { ids } = db?.segmentPropertyMap.inlineProperties!; + const { ids } = db!.segmentPropertyMap.inlineProperties!; for (let i = 0, count = indices.length; i < count; ++i) { const propIndex = indices[i]; if (safe) { diff --git a/src/segmentation_graph/local.spec.ts b/src/segmentation_graph/local.spec.ts index 21e3fb29c7..cf9508c64b 100644 --- a/src/segmentation_graph/local.spec.ts +++ b/src/segmentation_graph/local.spec.ts @@ -14,17 +14,18 @@ * limitations under the License. */ -import { Uint64 } from "#/util/uint64"; -import { LocalSegmentationGraphSource } from "#/segmentation_graph/local"; +import { describe, it, expect } from "vitest"; -beforeEach(() => { - jasmine.addCustomEqualityTester((a, b) => { - if (a instanceof Uint64 && b instanceof Uint64) { - return Uint64.equal(a, b); - } - return undefined; - }); -}); +import { LocalSegmentationGraphSource } from "#src/segmentation_graph/local.js"; +import { Uint64 } from "#src/util/uint64.js"; + +function uint64Tester(a: unknown, b: unknown): boolean | undefined { + if (a instanceof Uint64 && b instanceof Uint64) { + return Uint64.equal(a, b); + } + return undefined; +} +expect.addEqualityTesters([uint64Tester]); const u64 = (x: string | number) => Uint64.parseString(x.toString()); diff --git a/src/segmentation_graph/local.ts b/src/segmentation_graph/local.ts index ed5f013686..8164c6ce78 100644 --- a/src/segmentation_graph/local.ts +++ b/src/segmentation_graph/local.ts @@ -14,20 +14,20 @@ * limitations under the License. */ -import debounce from "lodash/debounce"; -import { VisibleSegmentEquivalencePolicy } from "#/segmentation_graph/segment_id"; +import { debounce } from "lodash-es"; +import type { SegmentationUserLayer } from "#src/layer/segmentation/index.js"; +import { VisibleSegmentEquivalencePolicy } from "#src/segmentation_graph/segment_id.js"; +import type { ComputedSplit } from "#src/segmentation_graph/source.js"; import { - ComputedSplit, SegmentationGraphSource, SegmentationGraphSourceConnection, -} from "#/segmentation_graph/source"; -import { SegmentationUserLayer } from "#/segmentation_user_layer"; -import { SharedDisjointUint64Sets } from "#/shared_disjoint_sets"; -import { Uint64Set } from "#/uint64_set"; -import { DisjointUint64Sets } from "#/util/disjoint_sets"; -import { parseArray } from "#/util/json"; -import { Signal } from "#/util/signal"; -import { Uint64 } from "#/util/uint64"; +} from "#src/segmentation_graph/source.js"; +import { SharedDisjointUint64Sets } from "#src/shared_disjoint_sets.js"; +import type { Uint64Set } from "#src/uint64_set.js"; +import { DisjointUint64Sets } from "#src/util/disjoint_sets.js"; +import { parseArray } from "#src/util/json.js"; +import { Signal } from "#src/util/signal.js"; +import { Uint64 } from "#src/util/uint64.js"; export class LocalSegmentationGraphSource extends SegmentationGraphSource { spanningTreeEdges = new Map>(); diff --git a/src/segmentation_graph/segment_id.ts b/src/segmentation_graph/segment_id.ts index 4f922a2a23..5f3e55bc57 100644 --- a/src/segmentation_graph/segment_id.ts +++ b/src/segmentation_graph/segment_id.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Uint64 } from "#/util/uint64"; +import { Uint64 } from "#src/util/uint64.js"; export enum VisibleSegmentEquivalencePolicy { MIN_REPRESENTATIVE = 0, // defafult, representative elmement is the minimum element in equivalence set diff --git a/src/segmentation_graph/source.ts b/src/segmentation_graph/source.ts index 83264e6f3d..ab8d6a1742 100644 --- a/src/segmentation_graph/source.ts +++ b/src/segmentation_graph/source.ts @@ -14,20 +14,19 @@ * limitations under the License. */ -import { ChunkManager } from "#/chunk_manager/frontend"; -import { RenderLayer } from "#/renderlayer"; -import { VisibleSegmentsState } from "#/segmentation_display_state/base"; -import { SegmentationDisplayState3D } from "#/segmentation_display_state/frontend"; -import { VisibleSegmentEquivalencePolicy } from "#/segmentation_graph/segment_id"; -import { SegmentationUserLayer } from "#/segmentation_user_layer"; -import { WatchableValueInterface } from "#/trackable_value"; -import { Disposer, Owned, RefCounted } from "#/util/disposable"; -import { Uint64 } from "#/util/uint64"; -import { - DependentViewContext, - DependentViewWidget, -} from "#/widget/dependent_view_widget"; -import { Tab } from "#/widget/tab_view"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import type { SegmentationUserLayer } from "#src/layer/segmentation/index.js"; +import type { RenderLayer } from "#src/renderlayer.js"; +import type { VisibleSegmentsState } from "#src/segmentation_display_state/base.js"; +import type { SegmentationDisplayState3D } from "#src/segmentation_display_state/frontend.js"; +import type { VisibleSegmentEquivalencePolicy } from "#src/segmentation_graph/segment_id.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import type { Disposer, Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { Uint64 } from "#src/util/uint64.js"; +import type { DependentViewContext } from "#src/widget/dependent_view_widget.js"; +import { DependentViewWidget } from "#src/widget/dependent_view_widget.js"; +import { Tab } from "#src/widget/tab_view.js"; export class SegmentationGraphSourceTab extends Tab { constructor(public layer: SegmentationUserLayer) { diff --git a/src/shared_disjoint_sets.ts b/src/shared_disjoint_sets.ts index f3f18ab8b4..2f1d9b20dc 100644 --- a/src/shared_disjoint_sets.ts +++ b/src/shared_disjoint_sets.ts @@ -14,18 +14,18 @@ * limitations under the License. */ -import { VisibleSegmentEquivalencePolicy } from "#/segmentation_graph/segment_id"; -import { WatchableValueInterface } from "#/trackable_value"; -import { DisjointUint64Sets } from "#/util/disjoint_sets"; -import { parseArray } from "#/util/json"; -import { NullarySignal } from "#/util/signal"; -import { Uint64 } from "#/util/uint64"; +import type { VisibleSegmentEquivalencePolicy } from "#src/segmentation_graph/segment_id.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { DisjointUint64Sets } from "#src/util/disjoint_sets.js"; +import { parseArray } from "#src/util/json.js"; +import { NullarySignal } from "#src/util/signal.js"; +import { Uint64 } from "#src/util/uint64.js"; +import type { RPC } from "#src/worker_rpc.js"; import { registerRPC, registerSharedObject, - RPC, SharedObjectCounterpart, -} from "#/worker_rpc"; +} from "#src/worker_rpc.js"; const RPC_TYPE_ID = "DisjointUint64Sets"; const ADD_METHOD_ID = "DisjointUint64Sets.add"; diff --git a/src/shared_watchable_value.ts b/src/shared_watchable_value.ts index 8ae6b75119..521af6d87d 100644 --- a/src/shared_watchable_value.ts +++ b/src/shared_watchable_value.ts @@ -18,13 +18,14 @@ * @file Facility for sharing arbitrary values that support structural cloning between threads. */ -import { WatchableValue, WatchableValueInterface } from "#/trackable_value"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { WatchableValue } from "#src/trackable_value.js"; +import type { RPC } from "#src/worker_rpc.js"; import { registerRPC, registerSharedObject, - RPC, SharedObjectCounterpart, -} from "#/worker_rpc"; +} from "#src/worker_rpc.js"; const CHANGED_RPC_METHOD_ID = "SharedWatchableValue.changed"; diff --git a/src/single_mesh/backend.ts b/src/single_mesh/backend.ts index c8e7b82b5d..0ad2650529 100644 --- a/src/single_mesh/backend.ts +++ b/src/single_mesh/backend.ts @@ -14,47 +14,48 @@ * limitations under the License. */ +import type { ChunkManager } from "#src/chunk_manager/backend.js"; import { Chunk, - ChunkManager, ChunkSource, withChunkManager, WithParameters, -} from "#/chunk_manager/backend"; -import { ChunkPriorityTier } from "#/chunk_manager/base"; -import { PriorityGetter } from "#/chunk_manager/generic_file_source"; -import { - SharedCredentialsProviderCounterpart, - WithSharedCredentialsProviderCounterpart, -} from "#/credentials_provider/shared_counterpart"; -import { computeVertexNormals } from "#/mesh/backend"; +} from "#src/chunk_manager/backend.js"; +import { ChunkPriorityTier } from "#src/chunk_manager/base.js"; +import type { PriorityGetter } from "#src/chunk_manager/generic_file_source.js"; +import type { SharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; +import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; +import { computeVertexNormals } from "#src/mesh/backend.js"; +import type { + SingleMeshData, + SingleMeshInfo, + SingleMeshSourceParameters, + VertexAttributeInfo, +} from "#src/single_mesh/base.js"; import { GET_SINGLE_MESH_INFO_RPC_ID, SINGLE_MESH_CHUNK_KEY, SINGLE_MESH_LAYER_RPC_ID, - SingleMeshData, - SingleMeshInfo, - SingleMeshSourceParameters, SingleMeshSourceParametersWithInfo, - VertexAttributeInfo, -} from "#/single_mesh/base"; -import { TypedArray } from "#/util/array"; -import { CancellationToken } from "#/util/cancellation"; -import { stableStringify } from "#/util/json"; -import { SpecialProtocolCredentials } from "#/util/special_protocol_request"; -import { SpecialProtocolCredentialsProvider } from "#/util/special_protocol_request"; +} from "#src/single_mesh/base.js"; +import type { TypedArray } from "#src/util/array.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { stableStringify } from "#src/util/json.js"; +import type { + SpecialProtocolCredentials, + SpecialProtocolCredentialsProvider, +} from "#src/util/special_protocol_request.js"; import { getBasePriority, getPriorityTier, withSharedVisibility, -} from "#/visibility_priority/backend"; +} from "#src/visibility_priority/backend.js"; +import type { RPC, RPCPromise } from "#src/worker_rpc.js"; import { registerPromiseRPC, registerSharedObject, - RPC, - RPCPromise, SharedObjectCounterpart, -} from "#/worker_rpc"; +} from "#src/worker_rpc.js"; const SINGLE_MESH_CHUNK_PRIORITY = 50; diff --git a/src/single_mesh/base.ts b/src/single_mesh/base.ts index c8b01f716f..30c499c758 100644 --- a/src/single_mesh/base.ts +++ b/src/single_mesh/base.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { DataType } from "#/util/data_type"; +import type { DataType } from "#src/util/data_type.js"; export const SINGLE_MESH_LAYER_RPC_ID = "single_mesh/SingleMeshLayer"; export const GET_SINGLE_MESH_INFO_RPC_ID = "single_mesh/getSingleMeshInfo"; diff --git a/src/single_mesh/frontend.spec.ts b/src/single_mesh/frontend.browser_test.ts similarity index 84% rename from src/single_mesh/frontend.spec.ts rename to src/single_mesh/frontend.browser_test.ts index 587a7feabb..d1b87a3dde 100644 --- a/src/single_mesh/frontend.spec.ts +++ b/src/single_mesh/frontend.browser_test.ts @@ -14,16 +14,17 @@ * limitations under the License. */ -import { VertexAttributeInfo } from "#/single_mesh/base"; +import { describe, it, expect } from "vitest"; +import type { VertexAttributeInfo } from "#src/single_mesh/base.js"; import { getAttributeTextureFormats, SingleMeshShaderManager, VertexChunkData, -} from "#/single_mesh/frontend"; -import { fragmentShaderTest } from "#/webgl/shader_testing"; +} from "#src/single_mesh/frontend.js"; +import { fragmentShaderTest } from "#src/webgl/shader_testing.js"; describe("single_mesh/frontend", () => { - it("attributes", () => { + describe("attributes", () => { const attributeNames = ["attrA", "attrB", "attrC"]; const attributeInfo: VertexAttributeInfo[] = []; @@ -84,14 +85,10 @@ describe("single_mesh/frontend", () => { const pos = [values.posX, values.posY, values.posZ]; const norm = [values.normX, values.normY, values.normZ]; for (let i = 0; i < 3; ++i) { - expect(pos[i]).toEqual( - vertexData.vertexPositions[index * 3 + i], - `vertexPositions: index=${index}, i=${i}`, - ); - expect(norm[i]).toEqual( - vertexData.vertexNormals[index * 3 + i], - `vertexNormals: index=${index}, i=${i}`, - ); + it(`index=${index}, i=${i}`, () => { + expect(pos[i]).toEqual(vertexData.vertexPositions[index * 3 + i]); + expect(norm[i]).toEqual(vertexData.vertexNormals[index * 3 + i]); + }); } } }, diff --git a/src/single_mesh/frontend.ts b/src/single_mesh/frontend.ts index 64ad3d74cb..233f1f69d1 100644 --- a/src/single_mesh/frontend.ts +++ b/src/single_mesh/frontend.ts @@ -14,85 +14,82 @@ * limitations under the License. */ -import { ChunkState } from "#/chunk_manager/base"; +import { ChunkState } from "#src/chunk_manager/base.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; import { Chunk, - ChunkManager, ChunkSource, WithParameters, -} from "#/chunk_manager/frontend"; -import { CredentialsManager } from "#/credentials_provider"; +} from "#src/chunk_manager/frontend.js"; import { getCredentialsProviderCounterpart, WithCredentialsProvider, -} from "#/credentials_provider/chunk_source_frontend"; -import { PickState, VisibleLayerInfo } from "#/layer"; -import { PerspectivePanel } from "#/perspective_view/panel"; -import { - PerspectiveViewRenderContext, - PerspectiveViewRenderLayer, -} from "#/perspective_view/render_layer"; -import { WatchableRenderLayerTransform } from "#/render_coordinate_transform"; -import { - ThreeDimensionalRenderLayerAttachmentState, - update3dRenderLayerAttachment, -} from "#/renderlayer"; +} from "#src/credentials_provider/chunk_source_frontend.js"; +import type { CredentialsManager } from "#src/credentials_provider/index.js"; +import type { PickState, VisibleLayerInfo } from "#src/layer/index.js"; +import type { PerspectivePanel } from "#src/perspective_view/panel.js"; +import type { PerspectiveViewRenderContext } from "#src/perspective_view/render_layer.js"; +import { PerspectiveViewRenderLayer } from "#src/perspective_view/render_layer.js"; +import type { WatchableRenderLayerTransform } from "#src/render_coordinate_transform.js"; +import type { ThreeDimensionalRenderLayerAttachmentState } from "#src/renderlayer.js"; +import { update3dRenderLayerAttachment } from "#src/renderlayer.js"; +import type { + SingleMeshInfo, + VertexAttributeInfo, +} from "#src/single_mesh/base.js"; import { GET_SINGLE_MESH_INFO_RPC_ID, SINGLE_MESH_CHUNK_KEY, SINGLE_MESH_LAYER_RPC_ID, - SingleMeshInfo, SingleMeshSourceParametersWithInfo, - VertexAttributeInfo, -} from "#/single_mesh/base"; -import { WatchableValue } from "#/trackable_value"; -import { DataType } from "#/util/data_type"; -import { mat4, vec3 } from "#/util/geom"; -import { - parseSpecialUrl, - SpecialProtocolCredentials, -} from "#/util/special_protocol_request"; -import { withSharedVisibility } from "#/visibility_priority/frontend"; -import { Buffer } from "#/webgl/buffer"; -import { glsl_COLORMAPS } from "#/webgl/colormaps"; -import { GL } from "#/webgl/context"; +} from "#src/single_mesh/base.js"; +import { WatchableValue } from "#src/trackable_value.js"; +import { DataType } from "#src/util/data_type.js"; +import type { mat4 } from "#src/util/geom.js"; +import { vec3 } from "#src/util/geom.js"; +import type { SpecialProtocolCredentials } from "#src/util/special_protocol_request.js"; +import { parseSpecialUrl } from "#src/util/special_protocol_request.js"; +import { withSharedVisibility } from "#src/visibility_priority/frontend.js"; +import type { Buffer } from "#src/webgl/buffer.js"; +import { glsl_COLORMAPS } from "#src/webgl/colormaps.js"; +import type { GL } from "#src/webgl/context.js"; import { makeTrackableFragmentMain, makeWatchableShaderError, parameterizedEmitterDependentShaderGetter, shaderCodeWithLineDirective, -} from "#/webgl/dynamic_shader"; +} from "#src/webgl/dynamic_shader.js"; +import type { CountingBuffer } from "#src/webgl/index_emulation.js"; import { - CountingBuffer, countingBufferShaderModule, disableCountingBuffer, getCountingBuffer, IndexBufferAttributeHelper, makeIndexBuffer, -} from "#/webgl/index_emulation"; -import { +} from "#src/webgl/index_emulation.js"; +import type { ShaderBuilder, ShaderModule, ShaderProgram, ShaderSamplerType, -} from "#/webgl/shader"; -import { getShaderType } from "#/webgl/shader_lib"; +} from "#src/webgl/shader.js"; +import { getShaderType } from "#src/webgl/shader_lib.js"; +import type { ShaderControlsBuilderState } from "#src/webgl/shader_ui_controls.js"; import { addControlsToBuilder, getFallbackBuilderState, parseShaderUiControls, setControlsInShader, - ShaderControlsBuilderState, ShaderControlState, -} from "#/webgl/shader_ui_controls"; +} from "#src/webgl/shader_ui_controls.js"; import { computeTextureFormat, getSamplerPrefixForDataType, OneDimensionalTextureAccessHelper, setOneDimensionalTextureData, TextureFormat, -} from "#/webgl/texture_access"; -import { SharedObject } from "#/worker_rpc"; +} from "#src/webgl/texture_access.js"; +import { SharedObject } from "#src/worker_rpc.js"; const DEFAULT_FRAGMENT_MAIN = `void main() { emitGray(); diff --git a/src/skeleton/backend.ts b/src/skeleton/backend.ts index 67d067f8b4..cae8989b4d 100644 --- a/src/skeleton/backend.ts +++ b/src/skeleton/backend.ts @@ -19,24 +19,25 @@ import { ChunkRenderLayerBackend, ChunkSource, withChunkManager, -} from "#/chunk_manager/backend"; -import { ChunkState } from "#/chunk_manager/base"; -import { decodeVertexPositionsAndIndices } from "#/mesh/backend"; -import { withSegmentationLayerBackendState } from "#/segmentation_display_state/backend"; +} from "#src/chunk_manager/backend.js"; +import { ChunkState } from "#src/chunk_manager/base.js"; +import { decodeVertexPositionsAndIndices } from "#src/mesh/backend.js"; +import { withSegmentationLayerBackendState } from "#src/segmentation_display_state/backend.js"; import { forEachVisibleSegment, getObjectKey, -} from "#/segmentation_display_state/base"; -import { SKELETON_LAYER_RPC_ID } from "#/skeleton/base"; -import { TypedArray } from "#/util/array"; -import { Endianness } from "#/util/endian"; -import { Uint64 } from "#/util/uint64"; +} from "#src/segmentation_display_state/base.js"; +import { SKELETON_LAYER_RPC_ID } from "#src/skeleton/base.js"; +import type { TypedArray } from "#src/util/array.js"; +import type { Endianness } from "#src/util/endian.js"; +import { Uint64 } from "#src/util/uint64.js"; import { getBasePriority, getPriorityTier, -} from "#/visibility_priority/backend"; -import { withSharedVisibility } from "#/visibility_priority/backend"; -import { registerSharedObject, RPC } from "#/worker_rpc"; + withSharedVisibility, +} from "#src/visibility_priority/backend.js"; +import type { RPC } from "#src/worker_rpc.js"; +import { registerSharedObject } from "#src/worker_rpc.js"; const SKELETON_CHUNK_PRIORITY = 60; diff --git a/src/skeleton/base.ts b/src/skeleton/base.ts index 9703859be3..0809326658 100644 --- a/src/skeleton/base.ts +++ b/src/skeleton/base.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { DataType } from "#/util/data_type"; +import type { DataType } from "#src/util/data_type.js"; export const SKELETON_LAYER_RPC_ID = "skeleton/SkeletonLayer"; diff --git a/src/skeleton/decode_precomputed_skeleton.ts b/src/skeleton/decode_precomputed_skeleton.ts index 4a0cd968e6..034939642f 100644 --- a/src/skeleton/decode_precomputed_skeleton.ts +++ b/src/skeleton/decode_precomputed_skeleton.ts @@ -14,13 +14,15 @@ * limitations under the License. */ +import type { SkeletonChunk } from "#src/skeleton/backend.js"; +import { decodeSkeletonVertexPositionsAndIndices } from "#src/skeleton/backend.js"; +import type { VertexAttributeInfo } from "#src/skeleton/base.js"; +import { DATA_TYPE_BYTES } from "#src/util/data_type.js"; import { - decodeSkeletonVertexPositionsAndIndices, - SkeletonChunk, -} from "#/skeleton/backend"; -import { VertexAttributeInfo } from "#/skeleton/base"; -import { DATA_TYPE_BYTES } from "#/util/data_type"; -import { convertEndian16, convertEndian32, Endianness } from "#/util/endian"; + convertEndian16, + convertEndian32, + Endianness, +} from "#src/util/endian.js"; export function decodeSkeletonChunk( chunk: SkeletonChunk, diff --git a/src/skeleton/decode_swc_skeleton.spec.ts b/src/skeleton/decode_swc_skeleton.spec.ts index 742fdaaafd..09e2483b41 100644 --- a/src/skeleton/decode_swc_skeleton.spec.ts +++ b/src/skeleton/decode_swc_skeleton.spec.ts @@ -1,5 +1,6 @@ -import { SkeletonChunk } from "#/skeleton/backend"; -import { decodeSwcSkeletonChunk } from "#/skeleton/decode_swc_skeleton"; +import { describe, it, expect } from "vitest"; +import { SkeletonChunk } from "#src/skeleton/backend.js"; +import { decodeSwcSkeletonChunk } from "#src/skeleton/decode_swc_skeleton.js"; const swcStr = "# Generated by NeuTu (https://github.com/janelia-flyem/NeuTu)\n\ diff --git a/src/skeleton/decode_swc_skeleton.ts b/src/skeleton/decode_swc_skeleton.ts index a67c17c8c5..ccb8a083c0 100644 --- a/src/skeleton/decode_swc_skeleton.ts +++ b/src/skeleton/decode_swc_skeleton.ts @@ -18,7 +18,7 @@ * limitations under the License. */ -import { SkeletonChunk } from "#/skeleton/backend"; +import type { SkeletonChunk } from "#src/skeleton/backend.js"; export function decodeSwcSkeletonChunk(chunk: SkeletonChunk, swcStr: string) { const swcObjects: Array = parseSwc(swcStr); @@ -71,7 +71,7 @@ export function decodeSwcSkeletonChunk(chunk: SkeletonChunk, swcStr: string) { */ function parseSwc(swcStr: string) { const swcInputAr = swcStr.split("\n"); - const swcObjectsAr: Array = new Array(); + const swcObjectsAr: Array = []; const float = "-?\\d*(?:\\.\\d+)?"; const pattern = new RegExp( "^[ \\t]*(" + diff --git a/src/skeleton/frontend.ts b/src/skeleton/frontend.ts index 307b4c7b2d..dc84c40b73 100644 --- a/src/skeleton/frontend.ts +++ b/src/skeleton/frontend.ts @@ -14,83 +14,83 @@ * limitations under the License. */ -import { ChunkState, LayerChunkProgressInfo } from "#/chunk_manager/base"; -import { Chunk, ChunkManager, ChunkSource } from "#/chunk_manager/frontend"; -import { LayerView, VisibleLayerInfo } from "#/layer"; -import { PerspectivePanel } from "#/perspective_view/panel"; -import { - PerspectiveViewRenderContext, - PerspectiveViewRenderLayer, -} from "#/perspective_view/render_layer"; -import { +import { ChunkState, LayerChunkProgressInfo } from "#src/chunk_manager/base.js"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { Chunk, ChunkSource } from "#src/chunk_manager/frontend.js"; +import type { LayerView, VisibleLayerInfo } from "#src/layer/index.js"; +import type { PerspectivePanel } from "#src/perspective_view/panel.js"; +import type { PerspectiveViewRenderContext } from "#src/perspective_view/render_layer.js"; +import { PerspectiveViewRenderLayer } from "#src/perspective_view/render_layer.js"; +import type { RenderLayer, ThreeDimensionalRenderLayerAttachmentState, - update3dRenderLayerAttachment, -} from "#/renderlayer"; +} from "#src/renderlayer.js"; +import { update3dRenderLayerAttachment } from "#src/renderlayer.js"; import { forEachVisibleSegment, getObjectKey, -} from "#/segmentation_display_state/base"; +} from "#src/segmentation_display_state/base.js"; +import type { SegmentationDisplayState3D } from "#src/segmentation_display_state/frontend.js"; import { forEachVisibleSegmentToDraw, registerRedrawWhenSegmentationDisplayState3DChanged, - SegmentationDisplayState3D, SegmentationLayerSharedObject, -} from "#/segmentation_display_state/frontend"; -import { SKELETON_LAYER_RPC_ID, VertexAttributeInfo } from "#/skeleton/base"; -import { SliceViewPanel } from "#/sliceview/panel"; -import { - SliceViewPanelRenderContext, - SliceViewPanelRenderLayer, -} from "#/sliceview/renderlayer"; -import { TrackableValue, WatchableValue } from "#/trackable_value"; -import { DataType } from "#/util/data_type"; -import { RefCounted } from "#/util/disposable"; -import { mat4, vec3 } from "#/util/geom"; -import { verifyFinitePositiveFloat } from "#/util/json"; -import { NullarySignal } from "#/util/signal"; -import { CompoundTrackable, Trackable } from "#/util/trackable"; -import { TrackableEnum } from "#/util/trackable_enum"; -import { Buffer } from "#/webgl/buffer"; +} from "#src/segmentation_display_state/frontend.js"; +import type { VertexAttributeInfo } from "#src/skeleton/base.js"; +import { SKELETON_LAYER_RPC_ID } from "#src/skeleton/base.js"; +import type { SliceViewPanel } from "#src/sliceview/panel.js"; +import type { SliceViewPanelRenderContext } from "#src/sliceview/renderlayer.js"; +import { SliceViewPanelRenderLayer } from "#src/sliceview/renderlayer.js"; +import { TrackableValue, WatchableValue } from "#src/trackable_value.js"; +import { DataType } from "#src/util/data_type.js"; +import { RefCounted } from "#src/util/disposable.js"; +import type { vec3 } from "#src/util/geom.js"; +import { mat4 } from "#src/util/geom.js"; +import { verifyFinitePositiveFloat } from "#src/util/json.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { Trackable } from "#src/util/trackable.js"; +import { CompoundTrackable } from "#src/util/trackable.js"; +import { TrackableEnum } from "#src/util/trackable_enum.js"; +import { Buffer } from "#src/webgl/buffer.js"; import { defineCircleShader, drawCircles, initializeCircleShader, -} from "#/webgl/circles"; -import { glsl_COLORMAPS } from "#/webgl/colormaps"; -import { GL } from "#/webgl/context"; +} from "#src/webgl/circles.js"; +import { glsl_COLORMAPS } from "#src/webgl/colormaps.js"; +import type { GL } from "#src/webgl/context.js"; +import type { WatchableShaderError } from "#src/webgl/dynamic_shader.js"; import { makeTrackableFragmentMain, parameterizedEmitterDependentShaderGetter, shaderCodeWithLineDirective, - WatchableShaderError, -} from "#/webgl/dynamic_shader"; +} from "#src/webgl/dynamic_shader.js"; import { defineLineShader, drawLines, initializeLineShader, -} from "#/webgl/lines"; -import { +} from "#src/webgl/lines.js"; +import type { ShaderBuilder, ShaderProgram, ShaderSamplerType, -} from "#/webgl/shader"; +} from "#src/webgl/shader.js"; +import type { ShaderControlsBuilderState } from "#src/webgl/shader_ui_controls.js"; import { addControlsToBuilder, getFallbackBuilderState, parseShaderUiControls, setControlsInShader, - ShaderControlsBuilderState, ShaderControlState, -} from "#/webgl/shader_ui_controls"; +} from "#src/webgl/shader_ui_controls.js"; import { computeTextureFormat, getSamplerPrefixForDataType, OneDimensionalTextureAccessHelper, setOneDimensionalTextureData, TextureFormat, -} from "#/webgl/texture_access"; -import { defineVertexId, VertexIdHelper } from "#/webgl/vertex_id"; +} from "#src/webgl/texture_access.js"; +import { defineVertexId, VertexIdHelper } from "#src/webgl/vertex_id.js"; const tempMat2 = mat4.create(); @@ -848,7 +848,7 @@ function getAttributeTextureFormats( return attributeTextureFormats; } -export type SkeletonSourceOptions = {}; +export type SkeletonSourceOptions = object; export class SkeletonSource extends ChunkSource { private attributeTextureFormats_?: TextureFormat[]; diff --git a/src/sliceview/backend.ts b/src/sliceview/backend.ts index c742490b70..5b301288b7 100644 --- a/src/sliceview/backend.ts +++ b/src/sliceview/backend.ts @@ -14,53 +14,57 @@ * limitations under the License. */ -import "#/render_layer_backend"; +import "#src/render_layer_backend.js"; -import { - Chunk, +import type { ChunkConstructor, ChunkRenderLayerBackend, +} from "#src/chunk_manager/backend.js"; +import { + Chunk, ChunkSource, getNextMarkGeneration, withChunkManager, -} from "#/chunk_manager/backend"; -import { ChunkPriorityTier, ChunkState } from "#/chunk_manager/base"; -import { SharedWatchableValue } from "#/shared_watchable_value"; +} from "#src/chunk_manager/backend.js"; +import { ChunkPriorityTier, ChunkState } from "#src/chunk_manager/base.js"; +import type { SharedWatchableValue } from "#src/shared_watchable_value.js"; +import type { + MultiscaleVolumetricDataRenderLayer, + SliceViewChunkSource as SliceViewChunkSourceInterface, + SliceViewChunkSpecification, + SliceViewRenderLayer as SliceViewRenderLayerInterface, + TransformedSource, +} from "#src/sliceview/base.js"; import { filterVisibleSources, forEachPlaneIntersectingVolumetricChunk, getNormalizedChunkLayout, - MultiscaleVolumetricDataRenderLayer, SLICEVIEW_ADD_VISIBLE_LAYER_RPC_ID, SLICEVIEW_REMOVE_VISIBLE_LAYER_RPC_ID, SLICEVIEW_RENDERLAYER_RPC_ID, SLICEVIEW_REQUEST_CHUNK_RPC_ID, SLICEVIEW_RPC_ID, SliceViewBase, - SliceViewChunkSource as SliceViewChunkSourceInterface, - SliceViewChunkSpecification, - SliceViewRenderLayer as SliceViewRenderLayerInterface, - TransformedSource, -} from "#/sliceview/base"; -import { ChunkLayout } from "#/sliceview/chunk_layout"; -import { WatchableValueInterface } from "#/trackable_value"; -import { CANCELED, CancellationToken } from "#/util/cancellation"; -import { erf } from "#/util/erf"; -import { vec3, vec3Key } from "#/util/geom"; -import { VelocityEstimator } from "#/util/velocity_estimation"; +} from "#src/sliceview/base.js"; +import { ChunkLayout } from "#src/sliceview/chunk_layout.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { CANCELED } from "#src/util/cancellation.js"; +import { erf } from "#src/util/erf.js"; +import { vec3, vec3Key } from "#src/util/geom.js"; +import { VelocityEstimator } from "#src/util/velocity_estimation.js"; import { getBasePriority, getPriorityTier, withSharedVisibility, -} from "#/visibility_priority/backend"; +} from "#src/visibility_priority/backend.js"; +import type { RPC, RPCPromise } from "#src/worker_rpc.js"; import { registerPromiseRPC, registerRPC, registerSharedObject, - RPC, - RPCPromise, SharedObjectCounterpart, -} from "#/worker_rpc"; +} from "#src/worker_rpc.js"; export const BASE_PRIORITY = -1e12; export const SCALE_PRIORITY_MULTIPLIER = 1e9; @@ -218,8 +222,6 @@ export class SliceViewBackend extends SliceViewIntermediateBase { j = jumpOffset; continue; } - if (!Number.isFinite(newPriority)) { - } chunkManager.requestChunk( chunk, ChunkPriorityTier.PREFETCH, @@ -366,6 +368,7 @@ export class SliceViewChunk extends Chunk { } export interface SliceViewChunkSourceBackend< + // eslint-disable-next-line @typescript-eslint/no-unused-vars Spec extends SliceViewChunkSpecification = SliceViewChunkSpecification, ChunkType extends SliceViewChunk = SliceViewChunk, > { @@ -376,6 +379,7 @@ export interface SliceViewChunkSourceBackend< chunkConstructor: ChunkConstructor; } +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export class SliceViewChunkSourceBackend< Spec extends SliceViewChunkSpecification = SliceViewChunkSpecification, ChunkType extends SliceViewChunk = SliceViewChunk, diff --git a/src/sliceview/backend_chunk_decoders/bossNpz.ts b/src/sliceview/backend_chunk_decoders/bossNpz.ts index 3eb31a632d..2ee975c7b7 100644 --- a/src/sliceview/backend_chunk_decoders/bossNpz.ts +++ b/src/sliceview/backend_chunk_decoders/bossNpz.ts @@ -22,14 +22,14 @@ * (each corresponding to a different variable) in NPY binary format. */ -import { decodeGzip } from "#/async_computation/decode_gzip_request"; -import { requestAsyncComputation } from "#/async_computation/request"; -import { postProcessRawData } from "#/sliceview/backend_chunk_decoders/postprocess"; -import { DataType } from "#/sliceview/base"; -import { VolumeChunk } from "#/sliceview/volume/backend"; -import { CancellationToken } from "#/util/cancellation"; -import { vec3Key } from "#/util/geom"; -import { parseNpy } from "#/util/npy"; +import { decodeGzip } from "#src/async_computation/decode_gzip_request.js"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; +import { DataType } from "#src/sliceview/base.js"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { vec3Key } from "#src/util/geom.js"; +import { parseNpy } from "#src/util/npy.js"; export async function decodeBossNpzChunk( chunk: VolumeChunk, diff --git a/src/sliceview/backend_chunk_decoders/compressed_segmentation.ts b/src/sliceview/backend_chunk_decoders/compressed_segmentation.ts index 158ae9c630..e9e387456e 100644 --- a/src/sliceview/backend_chunk_decoders/compressed_segmentation.ts +++ b/src/sliceview/backend_chunk_decoders/compressed_segmentation.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { VolumeChunk } from "#/sliceview/volume/backend"; -import { CancellationToken } from "#/util/cancellation"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; export async function decodeCompressedSegmentationChunk( chunk: VolumeChunk, diff --git a/src/sliceview/backend_chunk_decoders/compresso.ts b/src/sliceview/backend_chunk_decoders/compresso.ts index 9efa8e5897..b35548a3a6 100644 --- a/src/sliceview/backend_chunk_decoders/compresso.ts +++ b/src/sliceview/backend_chunk_decoders/compresso.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import { TypedArray } from "#/util/array"; -import { decodeRawChunk } from "#/sliceview/backend_chunk_decoders/raw"; -import { VolumeChunk } from "#/sliceview/volume/backend"; -import { CancellationToken } from "#/util/cancellation"; -import { decodeCompresso } from "#/async_computation/decode_compresso_request"; -import { requestAsyncComputation } from "#/async_computation/request"; +import { decodeCompresso } from "#src/async_computation/decode_compresso_request.js"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import type { TypedArray } from "#src/util/array.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; export async function decodeCompressoChunk( chunk: VolumeChunk, diff --git a/src/sliceview/backend_chunk_decoders/index.ts b/src/sliceview/backend_chunk_decoders/index.ts index dd2b5ce3cf..04e3d8dd31 100644 --- a/src/sliceview/backend_chunk_decoders/index.ts +++ b/src/sliceview/backend_chunk_decoders/index.ts @@ -19,8 +19,8 @@ * in various formats. */ -import { VolumeChunk } from "#/sliceview/volume/backend"; -import { CancellationToken } from "#/util/cancellation"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; export type ChunkDecoder = ( chunk: VolumeChunk, cancellationToken: CancellationToken, diff --git a/src/sliceview/backend_chunk_decoders/jpeg.ts b/src/sliceview/backend_chunk_decoders/jpeg.ts index d773f2a595..9b814eebe7 100644 --- a/src/sliceview/backend_chunk_decoders/jpeg.ts +++ b/src/sliceview/backend_chunk_decoders/jpeg.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import { postProcessRawData } from "#/sliceview/backend_chunk_decoders/postprocess"; -import { VolumeChunk } from "#/sliceview/volume/backend"; -import { CancellationToken } from "#/util/cancellation"; -import { decodeJpeg } from "#/async_computation/decode_jpeg_request"; -import { requestAsyncComputation } from "#/async_computation/request"; +import { decodeJpeg } from "#src/async_computation/decode_jpeg_request.js"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; export async function decodeJpegChunk( chunk: VolumeChunk, diff --git a/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts b/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts index c63e54fb93..6f7164d628 100644 --- a/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts +++ b/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts @@ -22,14 +22,14 @@ * (each corresponding to a different variable) in NPY binary format. */ -import { decodeGzip } from "#/async_computation/decode_gzip_request"; -import { requestAsyncComputation } from "#/async_computation/request"; -import { postProcessRawData } from "#/sliceview/backend_chunk_decoders/postprocess"; -import { DataType } from "#/sliceview/base"; -import { VolumeChunk } from "#/sliceview/volume/backend"; -import { arraysEqual } from "#/util/array"; -import { CancellationToken } from "#/util/cancellation"; -import { parseNpy } from "#/util/npy"; +import { decodeGzip } from "#src/async_computation/decode_gzip_request.js"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; +import { DataType } from "#src/sliceview/base.js"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import { arraysEqual } from "#src/util/array.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { parseNpy } from "#src/util/npy.js"; export async function decodeNdstoreNpzChunk( chunk: VolumeChunk, diff --git a/src/sliceview/backend_chunk_decoders/png.ts b/src/sliceview/backend_chunk_decoders/png.ts index 10c187e41c..82b9cc8fa8 100644 --- a/src/sliceview/backend_chunk_decoders/png.ts +++ b/src/sliceview/backend_chunk_decoders/png.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import { DATA_TYPE_BYTES } from "#/util/data_type"; -import { decodeRawChunk } from "#/sliceview/backend_chunk_decoders/raw"; -import { VolumeChunk } from "#/sliceview/volume/backend"; -import { CancellationToken } from "#/util/cancellation"; -import { decodePng } from "#/async_computation/decode_png_request"; -import { requestAsyncComputation } from "#/async_computation/request"; +import { decodePng } from "#src/async_computation/decode_png_request.js"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { DATA_TYPE_BYTES } from "#src/util/data_type.js"; export async function decodePngChunk( chunk: VolumeChunk, diff --git a/src/sliceview/backend_chunk_decoders/postprocess.ts b/src/sliceview/backend_chunk_decoders/postprocess.ts index 0d4fbf6d6b..69efafaca2 100644 --- a/src/sliceview/backend_chunk_decoders/postprocess.ts +++ b/src/sliceview/backend_chunk_decoders/postprocess.ts @@ -21,11 +21,11 @@ import { encodeCompressedSegmentationUint32, encodeCompressedSegmentationUint64, -} from "#/async_computation/encode_compressed_segmentation_request"; -import { requestAsyncComputation } from "#/async_computation/request"; -import { DataType } from "#/sliceview/base"; -import { VolumeChunk } from "#/sliceview/volume/backend"; -import { CancellationToken } from "#/util/cancellation"; +} from "#src/async_computation/encode_compressed_segmentation_request.js"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import { DataType } from "#src/sliceview/base.js"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; export async function postProcessRawData( chunk: VolumeChunk, diff --git a/src/sliceview/backend_chunk_decoders/raw.ts b/src/sliceview/backend_chunk_decoders/raw.ts index 21ec268f1c..96426f6b98 100644 --- a/src/sliceview/backend_chunk_decoders/raw.ts +++ b/src/sliceview/backend_chunk_decoders/raw.ts @@ -14,12 +14,13 @@ * limitations under the License. */ -import { postProcessRawData } from "#/sliceview/backend_chunk_decoders/postprocess"; -import { VolumeChunk } from "#/sliceview/volume/backend"; -import { CancellationToken } from "#/util/cancellation"; -import { DATA_TYPE_BYTES, makeDataTypeArrayView } from "#/util/data_type"; -import { convertEndian, Endianness, ENDIANNESS } from "#/util/endian"; -import * as vector from "#/util/vector"; +import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; +import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { DATA_TYPE_BYTES, makeDataTypeArrayView } from "#src/util/data_type.js"; +import type { Endianness } from "#src/util/endian.js"; +import { convertEndian, ENDIANNESS } from "#src/util/endian.js"; +import * as vector from "#src/util/vector.js"; export async function decodeRawChunk( chunk: VolumeChunk, diff --git a/src/sliceview/base.spec.ts b/src/sliceview/base.spec.ts index d0adc3c647..9bec5c3011 100644 --- a/src/sliceview/base.spec.ts +++ b/src/sliceview/base.spec.ts @@ -14,12 +14,13 @@ * limitations under the License. */ +import { describe, it, expect } from "vitest"; import { estimateSliceAreaPerChunk, getNearIsotropicBlockSize, -} from "#/sliceview/base"; -import { ChunkLayout } from "#/sliceview/chunk_layout"; -import { mat4, vec3 } from "#/util/geom"; +} from "#src/sliceview/base.js"; +import { ChunkLayout } from "#src/sliceview/chunk_layout.js"; +import { mat4, vec3 } from "#src/util/geom.js"; describe("sliceview/base", () => { it("getNearIsotropicBlockSize", () => { diff --git a/src/sliceview/base.ts b/src/sliceview/base.ts index 847057bded..e1e24ae88f 100644 --- a/src/sliceview/base.ts +++ b/src/sliceview/base.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import { DisplayDimensionRenderInfo } from "#/navigation_state"; -import { ProjectionParameters } from "#/projection_parameters"; -import { getChunkPositionFromCombinedGlobalLocalPositions } from "#/render_coordinate_transform"; -import { ChunkLayout } from "#/sliceview/chunk_layout"; -import { +import type { DisplayDimensionRenderInfo } from "#src/navigation_state.js"; +import { ProjectionParameters } from "#src/projection_parameters.js"; +import { getChunkPositionFromCombinedGlobalLocalPositions } from "#src/render_coordinate_transform.js"; +import { ChunkLayout } from "#src/sliceview/chunk_layout.js"; +import type { WatchableValueChangeInterface, WatchableValueInterface, -} from "#/trackable_value"; -import { DATA_TYPE_BYTES, DataType } from "#/util/data_type"; -import { Disposable } from "#/util/disposable"; +} from "#src/trackable_value.js"; +import { DATA_TYPE_BYTES, DataType } from "#src/util/data_type.js"; +import type { Disposable } from "#src/util/disposable.js"; import { getFrustrumPlanes, getViewFrustrumDepthRange, @@ -31,10 +31,10 @@ import { isAABBVisible, mat4, vec3, -} from "#/util/geom"; -import * as matrix from "#/util/matrix"; -import * as vector from "#/util/vector"; -import { SharedObject } from "#/worker_rpc"; +} from "#src/util/geom.js"; +import * as matrix from "#src/util/matrix.js"; +import * as vector from "#src/util/vector.js"; +import { SharedObject } from "#src/worker_rpc.js"; export { DATA_TYPE_BYTES, DataType }; diff --git a/src/sliceview/bounding_box_shader_helper.ts b/src/sliceview/bounding_box_shader_helper.ts index 2edfce9842..f7b77480df 100644 --- a/src/sliceview/bounding_box_shader_helper.ts +++ b/src/sliceview/bounding_box_shader_helper.ts @@ -29,13 +29,13 @@ * */ +import type { mat4 } from "#src/util/geom.js"; import { - mat4, transformVectorByMat4Transpose, vec3, vec3Key, -} from "#/util/geom"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; +} from "#src/util/geom.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; const tempVec3 = vec3.create(); const tempVec3b = vec3.create(); diff --git a/src/sliceview/chunk_format_handlers.ts b/src/sliceview/chunk_format_handlers.ts index 202bbddf4e..d9fa08fdb7 100644 --- a/src/sliceview/chunk_format_handlers.ts +++ b/src/sliceview/chunk_format_handlers.ts @@ -14,5 +14,5 @@ * limitations under the License. */ -import "#/sliceview/uncompressed_chunk_format"; -import "#/sliceview/compressed_segmentation/chunk_format"; +import "#src/sliceview/uncompressed_chunk_format.js"; +import "#src/sliceview/compressed_segmentation/chunk_format.js"; diff --git a/src/sliceview/chunk_format_testing.ts b/src/sliceview/chunk_format_testing.ts index be562848f5..611aa6437f 100644 --- a/src/sliceview/chunk_format_testing.ts +++ b/src/sliceview/chunk_format_testing.ts @@ -14,20 +14,19 @@ * limitations under the License. */ -import { SingleTextureChunkFormat } from "#/sliceview/single_texture_chunk_format"; -import { defineChunkDataShaderAccess } from "#/sliceview/volume/frontend"; -import { getFortranOrderStrides } from "#/util/array"; -import { TypedArray } from "#/util/array"; -import { DataType } from "#/util/data_type"; -import { Disposable } from "#/util/disposable"; -import { vec3, vec3Key } from "#/util/geom"; -import { Uint64 } from "#/util/uint64"; -import { GL } from "#/webgl/context"; -import { textureTargetForSamplerType } from "#/webgl/shader"; -import { - fragmentShaderTest, - FragmentShaderTestOutputs, -} from "#/webgl/shader_testing"; +import { describe, it, expect } from "vitest"; +import type { SingleTextureChunkFormat } from "#src/sliceview/single_texture_chunk_format.js"; +import { defineChunkDataShaderAccess } from "#src/sliceview/volume/frontend.js"; +import type { TypedArray } from "#src/util/array.js"; +import { getFortranOrderStrides } from "#src/util/array.js"; +import { DataType } from "#src/util/data_type.js"; +import type { Disposable } from "#src/util/disposable.js"; +import { vec3, vec3Key } from "#src/util/geom.js"; +import type { Uint64 } from "#src/util/uint64.js"; +import type { GL } from "#src/webgl/context.js"; +import { textureTargetForSamplerType } from "#src/webgl/shader.js"; +import type { FragmentShaderTestOutputs } from "#src/webgl/shader_testing.js"; +import { fragmentShaderTest } from "#src/webgl/shader_testing.js"; export function chunkFormatTest( dataType: DataType, @@ -44,7 +43,7 @@ export function chunkFormatTest( for (let channelIndex = 0; channelIndex < numChannels; ++channelIndex) { outputs[`output${channelIndex}`] = dataType; } - it( + describe( `volumeSize = ${volumeSize.join()}, numChannels = ${volumeSize[3]}, ` + `dataType = ${DataType[dataType]}`, () => { @@ -117,26 +116,28 @@ output${channel} = getDataValue(${channel}); const values = tester.values; for (let channel = 0; channel < numChannels; ++channel) { const curOffset = offset + channel * strides[3]; - const msg = + it( `volumeSize = ${vec3Key(volumeSize)}, ` + - `positionInChunk = ${vec3Key(positionInChunk)}, ` + - `channel = ${channel}, offset = ${curOffset}`; - switch (dataType) { - case DataType.UINT64: { - const result = values[`output${channel}`] as Uint64; - expect(result.low).toBe(rawData[curOffset * 2], `${msg} (low)`); - expect(result.high).toEqual( - rawData[curOffset * 2 + 1], - `${msg} (high)`, - ); - break; - } - default: { - const result = values[`output${channel}`]; - expect(result).toBe(rawData[curOffset], msg); - break; - } - } + `positionInChunk = ${vec3Key(positionInChunk)}, ` + + `channel = ${channel}, offset = ${curOffset}`, + () => { + switch (dataType) { + case DataType.UINT64: { + const result = values[`output${channel}`] as Uint64; + expect([result.low, result.high]).toEqual([ + rawData[curOffset * 2], + rawData[curOffset * 2 + 1], + ]); + break; + } + default: { + const result = values[`output${channel}`]; + expect(result).toBe(rawData[curOffset]); + break; + } + } + }, + ); } } checkPosition(vec3.fromValues(0, 0, 0)); diff --git a/src/sliceview/chunk_layout.ts b/src/sliceview/chunk_layout.ts index 2999a8eb8f..1a7dc3dc1f 100644 --- a/src/sliceview/chunk_layout.ts +++ b/src/sliceview/chunk_layout.ts @@ -19,8 +19,8 @@ import { transformVectorByMat4, transformVectorByMat4Transpose, vec3, -} from "#/util/geom"; -import * as matrix from "#/util/matrix"; +} from "#src/util/geom.js"; +import * as matrix from "#src/util/matrix.js"; export class ChunkLayout { /** diff --git a/src/sliceview/compressed_segmentation/chunk_format.spec.ts b/src/sliceview/compressed_segmentation/chunk_format.browser_test.ts similarity index 84% rename from src/sliceview/compressed_segmentation/chunk_format.spec.ts rename to src/sliceview/compressed_segmentation/chunk_format.browser_test.ts index bd8549b04d..e9853ac86a 100644 --- a/src/sliceview/compressed_segmentation/chunk_format.spec.ts +++ b/src/sliceview/compressed_segmentation/chunk_format.browser_test.ts @@ -14,15 +14,16 @@ * limitations under the License. */ -import { chunkFormatTest } from "#/sliceview/chunk_format_testing"; -import { ChunkFormat } from "#/sliceview/compressed_segmentation/chunk_format"; -import { encodeChannels as encodeChannelsUint32 } from "#/sliceview/compressed_segmentation/encode_uint32"; -import { encodeChannels as encodeChannelsUint64 } from "#/sliceview/compressed_segmentation/encode_uint64"; -import { makeRandomUint64Array } from "#/sliceview/compressed_segmentation/test_util"; -import { DataType } from "#/util/data_type"; -import { prod4, vec3, vec3Key } from "#/util/geom"; -import { getRandomValues } from "#/util/random"; -import { Uint32ArrayBuilder } from "#/util/uint32array_builder"; +import { describe } from "vitest"; +import { chunkFormatTest } from "#src/sliceview/chunk_format_testing.js"; +import { ChunkFormat } from "#src/sliceview/compressed_segmentation/chunk_format.js"; +import { encodeChannels as encodeChannelsUint32 } from "#src/sliceview/compressed_segmentation/encode_uint32.js"; +import { encodeChannels as encodeChannelsUint64 } from "#src/sliceview/compressed_segmentation/encode_uint64.js"; +import { makeRandomUint64Array } from "#src/sliceview/compressed_segmentation/test_util.js"; +import { DataType } from "#src/util/data_type.js"; +import { prod4, vec3, vec3Key } from "#src/util/geom.js"; +import { getRandomValues } from "#src/util/random.js"; +import { Uint32ArrayBuilder } from "#src/util/uint32array_builder.js"; describe("sliceview/compressed_segmentation/chunk_format", () => { describe("data access", () => { diff --git a/src/sliceview/compressed_segmentation/chunk_format.ts b/src/sliceview/compressed_segmentation/chunk_format.ts index b288a991f2..d8e86f39ba 100644 --- a/src/sliceview/compressed_segmentation/chunk_format.ts +++ b/src/sliceview/compressed_segmentation/chunk_format.ts @@ -14,40 +14,41 @@ * limitations under the License. */ -import { readSingleChannelValue as readSingleChannelValueUint32 } from "#/sliceview/compressed_segmentation/decode_uint32"; -import { readSingleChannelValue as readSingleChannelValueUint64 } from "#/sliceview/compressed_segmentation/decode_uint64"; +import { readSingleChannelValue as readSingleChannelValueUint32 } from "#src/sliceview/compressed_segmentation/decode_uint32.js"; +import { readSingleChannelValue as readSingleChannelValueUint64 } from "#src/sliceview/compressed_segmentation/decode_uint64.js"; import { SingleTextureChunkFormat, SingleTextureVolumeChunk, -} from "#/sliceview/single_texture_chunk_format"; -import { DataType, VolumeChunkSpecification } from "#/sliceview/volume/base"; -import { +} from "#src/sliceview/single_texture_chunk_format.js"; +import type { VolumeChunkSpecification } from "#src/sliceview/volume/base.js"; +import { DataType } from "#src/sliceview/volume/base.js"; +import type { ChunkFormatHandler, - registerChunkFormatHandler, VolumeChunkSource, -} from "#/sliceview/volume/frontend"; -import { RefCounted } from "#/util/disposable"; -import { vec3, vec3Key } from "#/util/geom"; -import { Uint64 } from "#/util/uint64"; -import { GL } from "#/webgl/context"; -import { +} from "#src/sliceview/volume/frontend.js"; +import { registerChunkFormatHandler } from "#src/sliceview/volume/frontend.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { vec3, vec3Key } from "#src/util/geom.js"; +import { Uint64 } from "#src/util/uint64.js"; +import type { GL } from "#src/webgl/context.js"; +import type { ShaderBuilder, ShaderProgram, ShaderSamplerType, - textureTargetForSamplerType, -} from "#/webgl/shader"; +} from "#src/webgl/shader.js"; +import { textureTargetForSamplerType } from "#src/webgl/shader.js"; import { getShaderType, glsl_getFortranOrderIndex, glsl_uint32, glsl_uint64, -} from "#/webgl/shader_lib"; +} from "#src/webgl/shader_lib.js"; import { computeTextureFormat, OneDimensionalTextureAccessHelper, setOneDimensionalTextureData, TextureFormat, -} from "#/webgl/texture_access"; +} from "#src/webgl/texture_access.js"; class TextureLayout extends RefCounted { subchunkGridSize: vec3; diff --git a/src/sliceview/compressed_segmentation/decode_uint32.ts b/src/sliceview/compressed_segmentation/decode_uint32.ts index d50e531f18..8fa21d13b5 100644 --- a/src/sliceview/compressed_segmentation/decode_uint32.ts +++ b/src/sliceview/compressed_segmentation/decode_uint32.ts @@ -21,7 +21,7 @@ * Support for decompressing uint64 segment label chunks. */ -import { decodeValueOffset } from "#/sliceview/compressed_segmentation/decode_common"; +import { decodeValueOffset } from "#src/sliceview/compressed_segmentation/decode_common.js"; /** * Reads the single value at the specified dataPosition in a single-channel compressed segmentation. diff --git a/src/sliceview/compressed_segmentation/decode_uint64.ts b/src/sliceview/compressed_segmentation/decode_uint64.ts index 787edc72dc..76a4b32e6b 100644 --- a/src/sliceview/compressed_segmentation/decode_uint64.ts +++ b/src/sliceview/compressed_segmentation/decode_uint64.ts @@ -21,9 +21,9 @@ * Support for decompressing uint64 segment label chunks. */ -import { decodeValueOffset } from "#/sliceview/compressed_segmentation/decode_common"; +import { decodeValueOffset } from "#src/sliceview/compressed_segmentation/decode_common.js"; -import { Uint64 } from "#/util/uint64"; +import type { Uint64 } from "#src/util/uint64.js"; /** * Reads the single value at the specified dataPosition in a single-channel compressed segmentation. diff --git a/src/sliceview/compressed_segmentation/encode.benchmark.ts b/src/sliceview/compressed_segmentation/encode.benchmark.ts index 3230605562..53168a72f9 100644 --- a/src/sliceview/compressed_segmentation/encode.benchmark.ts +++ b/src/sliceview/compressed_segmentation/encode.benchmark.ts @@ -14,35 +14,35 @@ * limitations under the License. */ -import { encodeChannels as encodeChannelsUint32 } from "#/sliceview/compressed_segmentation/encode_uint32"; -import { encodeChannels as encodeChannelsUint64 } from "#/sliceview/compressed_segmentation/encode_uint64"; -import { makeRandomUint64Array } from "#/sliceview/compressed_segmentation/test_util"; -import { prod4, vec3Key } from "#/util/geom"; -import { Uint32ArrayBuilder } from "#/util/uint32array_builder"; +import { describe, bench } from "vitest"; +import { encodeChannels as encodeChannelsUint32 } from "#src/sliceview/compressed_segmentation/encode_uint32.js"; +import { encodeChannels as encodeChannelsUint64 } from "#src/sliceview/compressed_segmentation/encode_uint64.js"; +import { makeRandomUint64Array } from "#src/sliceview/compressed_segmentation/test_util.js"; +import { prod4, vec3Key } from "#src/util/geom.js"; +import { Uint32ArrayBuilder } from "#src/util/uint32array_builder.js"; +import exampleChunkDataUint8Array from "#testdata/64x64x64-raw-uint64-segmentation.dat?binary"; -const exampleChunkData64 = new Uint32Array( - require("neuroglancer-testdata/64x64x64-raw-uint64-segmentation.dat").buffer, -); +const exampleChunkData64 = new Uint32Array(exampleChunkDataUint8Array.buffer); const exampleChunkData32 = exampleChunkData64.filter((_element, index) => { return index % 2 === 0; }); -suite("64x64x64 example", () => { +describe("64x64x64 example", () => { const blockSize = [8, 8, 8]; const output = new Uint32ArrayBuilder(1000000); const volumeSize = [64, 64, 64, 1]; - benchmark("encode_uint64", () => { + bench("encode_uint64", () => { output.clear(); encodeChannelsUint64(output, blockSize, exampleChunkData64, volumeSize); }); - benchmark("encode_uint32", () => { + bench("encode_uint32", () => { output.clear(); encodeChannelsUint32(output, blockSize, exampleChunkData32, volumeSize); }); }); -suite("compressed_segmentation", () => { +describe("compressed_segmentation", () => { const blockSize = [8, 8, 8]; const output = new Uint32ArrayBuilder(1000000); for (const volumeSize of [ @@ -52,7 +52,7 @@ suite("compressed_segmentation", () => { ]) { const numPossibleValues = 15; const input = makeRandomUint64Array(prod4(volumeSize), numPossibleValues); - benchmark(`encode_uint64 ${vec3Key(volumeSize)}`, () => { + bench(`encode_uint64 ${vec3Key(volumeSize)}`, () => { output.clear(); encodeChannelsUint64(output, blockSize, input, volumeSize); }); diff --git a/src/sliceview/compressed_segmentation/encode_common.ts b/src/sliceview/compressed_segmentation/encode_common.ts index 169de46f99..4cc5bcc3f9 100644 --- a/src/sliceview/compressed_segmentation/encode_common.ts +++ b/src/sliceview/compressed_segmentation/encode_common.ts @@ -16,7 +16,7 @@ * limitations under the License. */ -import { Uint32ArrayBuilder } from "#/util/uint32array_builder"; +import type { Uint32ArrayBuilder } from "#src/util/uint32array_builder.js"; export const BLOCK_HEADER_SIZE = 2; diff --git a/src/sliceview/compressed_segmentation/encode_uint32.spec.ts b/src/sliceview/compressed_segmentation/encode_uint32.spec.ts index bf5a68d205..6d4634c59a 100644 --- a/src/sliceview/compressed_segmentation/encode_uint32.spec.ts +++ b/src/sliceview/compressed_segmentation/encode_uint32.spec.ts @@ -14,19 +14,20 @@ * limitations under the License. */ +import { describe, it, expect } from "vitest"; import { decodeChannel, decodeChannels, -} from "#/sliceview/compressed_segmentation/decode_uint32"; +} from "#src/sliceview/compressed_segmentation/decode_uint32.js"; import { encodeBlock, encodeChannel, encodeChannels, newCache, -} from "#/sliceview/compressed_segmentation/encode_uint32"; -import { makeRandomUint32Array } from "#/sliceview/compressed_segmentation/test_util"; -import { prod3, prod4, vec3, vec3Key } from "#/util/geom"; -import { Uint32ArrayBuilder } from "#/util/uint32array_builder"; +} from "#src/sliceview/compressed_segmentation/encode_uint32.js"; +import { makeRandomUint32Array } from "#src/sliceview/compressed_segmentation/test_util.js"; +import { prod3, prod4, vec3, vec3Key } from "#src/util/geom.js"; +import { Uint32ArrayBuilder } from "#src/util/uint32array_builder.js"; describe("compressed_segmentation uint32", () => { describe("encodeBlock", () => { diff --git a/src/sliceview/compressed_segmentation/encode_uint32.ts b/src/sliceview/compressed_segmentation/encode_uint32.ts index 3f3921bbdf..e5d62e588c 100644 --- a/src/sliceview/compressed_segmentation/encode_uint32.ts +++ b/src/sliceview/compressed_segmentation/encode_uint32.ts @@ -25,11 +25,11 @@ import { encodeChannel as encodeChannelCommon, encodeChannels as encodeChannelsCommon, writeBlock, -} from "#/sliceview/compressed_segmentation/encode_common"; -import { getFortranOrderStrides } from "#/util/array"; -import { Uint32ArrayBuilder } from "#/util/uint32array_builder"; +} from "#src/sliceview/compressed_segmentation/encode_common.js"; +import { getFortranOrderStrides } from "#src/util/array.js"; +import type { Uint32ArrayBuilder } from "#src/util/uint32array_builder.js"; -export { newCache } from "#/sliceview/compressed_segmentation/encode_common"; +export { newCache } from "#src/sliceview/compressed_segmentation/encode_common.js"; let tempEncodingBuffer: Uint32Array; let tempValuesBuffer1: Uint32Array; diff --git a/src/sliceview/compressed_segmentation/encode_uint64.spec.ts b/src/sliceview/compressed_segmentation/encode_uint64.spec.ts index b4899d6052..4366f7b339 100644 --- a/src/sliceview/compressed_segmentation/encode_uint64.spec.ts +++ b/src/sliceview/compressed_segmentation/encode_uint64.spec.ts @@ -14,19 +14,20 @@ * limitations under the License. */ +import { describe, it, expect } from "vitest"; import { decodeChannel, decodeChannels, -} from "#/sliceview/compressed_segmentation/decode_uint64"; +} from "#src/sliceview/compressed_segmentation/decode_uint64.js"; import { encodeBlock, encodeChannel, encodeChannels, newCache, -} from "#/sliceview/compressed_segmentation/encode_uint64"; -import { makeRandomUint64Array } from "#/sliceview/compressed_segmentation/test_util"; -import { prod3, prod4 } from "#/util/geom"; -import { Uint32ArrayBuilder } from "#/util/uint32array_builder"; +} from "#src/sliceview/compressed_segmentation/encode_uint64.js"; +import { makeRandomUint64Array } from "#src/sliceview/compressed_segmentation/test_util.js"; +import { prod3, prod4 } from "#src/util/geom.js"; +import { Uint32ArrayBuilder } from "#src/util/uint32array_builder.js"; describe("compressed_segmentation uint64", () => { describe("encodeBlock", () => { diff --git a/src/sliceview/compressed_segmentation/encode_uint64.ts b/src/sliceview/compressed_segmentation/encode_uint64.ts index 180b1ce5b8..b40fd5c84b 100644 --- a/src/sliceview/compressed_segmentation/encode_uint64.ts +++ b/src/sliceview/compressed_segmentation/encode_uint64.ts @@ -25,11 +25,11 @@ import { encodeChannel as encodeChannelCommon, encodeChannels as encodeChannelsCommon, writeBlock, -} from "#/sliceview/compressed_segmentation/encode_common"; -import { getFortranOrderStrides } from "#/util/array"; -import { Uint32ArrayBuilder } from "#/util/uint32array_builder"; +} from "#src/sliceview/compressed_segmentation/encode_common.js"; +import { getFortranOrderStrides } from "#src/util/array.js"; +import type { Uint32ArrayBuilder } from "#src/util/uint32array_builder.js"; -export { newCache } from "#/sliceview/compressed_segmentation/encode_common"; +export { newCache } from "#src/sliceview/compressed_segmentation/encode_common.js"; let tempEncodingBuffer: Uint32Array; let tempValuesBuffer1: Uint32Array; diff --git a/src/sliceview/compresso/index.ts b/src/sliceview/compresso/index.ts index 64a8705e0e..c33a4224cf 100644 --- a/src/sliceview/compresso/index.ts +++ b/src/sliceview/compresso/index.ts @@ -14,8 +14,6 @@ * limitations under the License. */ -import compressoWasmDataUrl from "./compresso.wasm"; - const libraryEnv = { emscripten_notify_memory_growth: () => {}, proc_exit: (code: number) => { @@ -24,13 +22,16 @@ const libraryEnv = { }; const compressoModulePromise = (async () => { - const response = await fetch(compressoWasmDataUrl); - const wasmCode = await response.arrayBuffer(); - const m = await WebAssembly.instantiate(wasmCode, { - env: libraryEnv, - wasi_snapshot_preview1: libraryEnv, - }); - (m.instance.exports._initialize as Function)(); + const m = ( + await WebAssembly.instantiateStreaming( + fetch(new URL("./compresso.wasm", import.meta.url)), + { + env: libraryEnv, + wasi_snapshot_preview1: libraryEnv, + }, + ) + ).instance; + (m.exports._initialize as Function)(); return m; })(); @@ -80,14 +81,12 @@ export async function decompressCompresso( // heap must be referenced after creating bufPtr because // memory growth can detatch the buffer. - const imagePtr = (m.instance.exports.malloc as Function)(nbytes); - const bufPtr = (m.instance.exports.malloc as Function)(buffer.byteLength); - const heap = new Uint8Array( - (m.instance.exports.memory as WebAssembly.Memory).buffer, - ); + const imagePtr = (m.exports.malloc as Function)(nbytes); + const bufPtr = (m.exports.malloc as Function)(buffer.byteLength); + const heap = new Uint8Array((m.exports.memory as WebAssembly.Memory).buffer); heap.set(buffer, bufPtr); - const code = (m.instance.exports.compresso_decompress as Function)( + const code = (m.exports.compresso_decompress as Function)( bufPtr, buffer.byteLength, imagePtr, @@ -104,7 +103,7 @@ export async function decompressCompresso( // because memory growth during decompress could have detached // the buffer. const image = new Uint8Array( - (m.instance.exports.memory as WebAssembly.Memory).buffer, + (m.exports.memory as WebAssembly.Memory).buffer, imagePtr, voxels * dataWidth, ); @@ -112,7 +111,7 @@ export async function decompressCompresso( // and we can free the emscripten buffer return image.slice(0); } finally { - (m.instance.exports.free as Function)(bufPtr); - (m.instance.exports.free as Function)(imagePtr); + (m.exports.free as Function)(bufPtr); + (m.exports.free as Function)(imagePtr); } } diff --git a/src/sliceview/frontend.ts b/src/sliceview/frontend.ts index ef7694ed1b..7218c8b4b5 100644 --- a/src/sliceview/frontend.ts +++ b/src/sliceview/frontend.ts @@ -14,33 +14,41 @@ * limitations under the License. */ -import debounce from "lodash/debounce"; -import { ChunkState } from "#/chunk_manager/base"; -import { - Chunk, +import { debounce } from "lodash-es"; +import { ChunkState } from "#src/chunk_manager/base.js"; +import type { ChunkManager, ChunkRequesterState, - ChunkSource, -} from "#/chunk_manager/frontend"; -import { applyRenderViewportToProjectionMatrix } from "#/display_context"; -import { LayerManager } from "#/layer"; -import { +} from "#src/chunk_manager/frontend.js"; +import { Chunk, ChunkSource } from "#src/chunk_manager/frontend.js"; +import { applyRenderViewportToProjectionMatrix } from "#src/display_context.js"; +import type { LayerManager } from "#src/layer/index.js"; +import type { DisplayDimensionRenderInfo, NavigationState, -} from "#/navigation_state"; -import { updateProjectionParametersFromInverseViewAndProjection } from "#/projection_parameters"; -import { +} from "#src/navigation_state.js"; +import { updateProjectionParametersFromInverseViewAndProjection } from "#src/projection_parameters.js"; +import type { ChunkDisplayTransformParameters, ChunkTransformParameters, + RenderLayerTransformOrError, +} from "#src/render_coordinate_transform.js"; +import { getChunkDisplayTransformParameters, getChunkTransformParameters, getLayerDisplayDimensionMapping, - RenderLayerTransformOrError, -} from "#/render_coordinate_transform"; +} from "#src/render_coordinate_transform.js"; import { DerivedProjectionParameters, SharedProjectionParameters, -} from "#/renderlayer"; +} from "#src/renderlayer.js"; +import type { + SliceViewChunkSource as SliceViewChunkSourceInterface, + SliceViewChunkSpecification, + SliceViewSourceOptions, + TransformedSource, + VisibleLayerSources, +} from "#src/sliceview/base.js"; import { forEachPlaneIntersectingVolumetricChunk, getNormalizedChunkLayout, @@ -49,43 +57,35 @@ import { SLICEVIEW_REQUEST_CHUNK_RPC_ID, SLICEVIEW_RPC_ID, SliceViewBase, - SliceViewChunkSource as SliceViewChunkSourceInterface, - SliceViewChunkSpecification, SliceViewProjectionParameters, - SliceViewSourceOptions, - TransformedSource, - VisibleLayerSources, -} from "#/sliceview/base"; -import { ChunkLayout } from "#/sliceview/chunk_layout"; -import { SliceViewRenderLayer } from "#/sliceview/renderlayer"; -import { WatchableValueInterface } from "#/trackable_value"; -import { CancellationToken, uncancelableToken } from "#/util/cancellation"; -import { - Borrowed, - Disposer, - invokeDisposers, - Owned, - RefCounted, -} from "#/util/disposable"; -import { kOneVec, kZeroVec4, mat4, vec3, vec4 } from "#/util/geom"; -import { MessageList, MessageSeverity } from "#/util/message_list"; -import { getObjectId } from "#/util/object_id"; -import { NullarySignal } from "#/util/signal"; -import { withSharedVisibility } from "#/visibility_priority/frontend"; -import { GL } from "#/webgl/context"; -import { - HistogramSpecifications, - TextureHistogramGenerator, -} from "#/webgl/empirical_cdf"; +} from "#src/sliceview/base.js"; +import { ChunkLayout } from "#src/sliceview/chunk_layout.js"; +import { SliceViewRenderLayer } from "#src/sliceview/renderlayer.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { uncancelableToken } from "#src/util/cancellation.js"; +import type { Borrowed, Disposer, Owned } from "#src/util/disposable.js"; +import { invokeDisposers, RefCounted } from "#src/util/disposable.js"; +import type { vec4 } from "#src/util/geom.js"; +import { kOneVec, kZeroVec4, mat4, vec3 } from "#src/util/geom.js"; +import { MessageList, MessageSeverity } from "#src/util/message_list.js"; +import { getObjectId } from "#src/util/object_id.js"; +import { NullarySignal } from "#src/util/signal.js"; +import { withSharedVisibility } from "#src/visibility_priority/frontend.js"; +import type { GL } from "#src/webgl/context.js"; +import type { HistogramSpecifications } from "#src/webgl/empirical_cdf.js"; +import { TextureHistogramGenerator } from "#src/webgl/empirical_cdf.js"; +import type { TextureBuffer } from "#src/webgl/offscreen.js"; import { DepthTextureBuffer, FramebufferConfiguration, makeTextureBuffers, - TextureBuffer, -} from "#/webgl/offscreen"; -import { ShaderBuilder, ShaderModule, ShaderProgram } from "#/webgl/shader"; -import { getSquareCornersBuffer } from "#/webgl/square_corners_buffer"; -import { registerSharedObjectOwner, RPC } from "#/worker_rpc"; +} from "#src/webgl/offscreen.js"; +import type { ShaderModule, ShaderProgram } from "#src/webgl/shader.js"; +import { ShaderBuilder } from "#src/webgl/shader.js"; +import { getSquareCornersBuffer } from "#src/webgl/square_corners_buffer.js"; +import type { RPC } from "#src/worker_rpc.js"; +import { registerSharedObjectOwner } from "#src/worker_rpc.js"; export type GenericChunkKey = string; @@ -596,6 +596,7 @@ export interface SliceViewChunkSourceOptions< spec: Spec; } +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export abstract class SliceViewChunkSource< Spec extends SliceViewChunkSpecification = SliceViewChunkSpecification, ChunkType extends SliceViewChunk = SliceViewChunk, @@ -690,6 +691,7 @@ export abstract class SliceViewChunkSource< } } +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export interface SliceViewChunkSource { // TODO(jbms): Move this declaration to the class definition above and declare abstract once // TypeScript supports mixins with abstact classes. diff --git a/src/sliceview/panel.ts b/src/sliceview/panel.ts index 02840b90d6..d44aa0143a 100644 --- a/src/sliceview/panel.ts +++ b/src/sliceview/panel.ts @@ -14,32 +14,34 @@ * limitations under the License. */ -import { AxesLineHelper, computeAxisLineMatrix } from "#/axes_lines"; -import { DisplayContext } from "#/display_context"; -import { - makeRenderedPanelVisibleLayerTracker, - VisibleRenderLayerTracker, -} from "#/layer"; -import { PickIDManager } from "#/object_picking"; +import { AxesLineHelper, computeAxisLineMatrix } from "#src/axes_lines.js"; +import type { DisplayContext } from "#src/display_context.js"; +import type { VisibleRenderLayerTracker } from "#src/layer/index.js"; +import { makeRenderedPanelVisibleLayerTracker } from "#src/layer/index.js"; +import { PickIDManager } from "#src/object_picking.js"; +import type { + FramePickingData, + RenderedDataViewerState, +} from "#src/rendered_data_panel.js"; import { clearOutOfBoundsPickData, - FramePickingData, pickDiameter, pickOffsetSequence, pickRadius, RenderedDataPanel, - RenderedDataViewerState, -} from "#/rendered_data_panel"; -import { SliceView, SliceViewRenderHelper } from "#/sliceview/frontend"; -import { +} from "#src/rendered_data_panel.js"; +import type { SliceView } from "#src/sliceview/frontend.js"; +import { SliceViewRenderHelper } from "#src/sliceview/frontend.js"; +import type { SliceViewPanelReadyRenderContext, SliceViewPanelRenderContext, - SliceViewPanelRenderLayer, -} from "#/sliceview/renderlayer"; -import { TrackableBoolean } from "#/trackable_boolean"; -import { TrackableRGB } from "#/util/color"; -import { Borrowed, Owned } from "#/util/disposable"; -import { ActionEvent, registerActionListener } from "#/util/event_action_map"; +} from "#src/sliceview/renderlayer.js"; +import { SliceViewPanelRenderLayer } from "#src/sliceview/renderlayer.js"; +import type { TrackableBoolean } from "#src/trackable_boolean.js"; +import type { TrackableRGB } from "#src/util/color.js"; +import type { Borrowed, Owned } from "#src/util/disposable.js"; +import type { ActionEvent } from "#src/util/event_action_map.js"; +import { registerActionListener } from "#src/util/event_action_map.js"; import { disableZProjection, identityMat4, @@ -47,19 +49,17 @@ import { mat4, vec3, vec4, -} from "#/util/geom"; -import { startRelativeMouseDrag } from "#/util/mouse_drag"; -import { TouchRotateInfo } from "#/util/touch_bindings"; +} from "#src/util/geom.js"; +import { startRelativeMouseDrag } from "#src/util/mouse_drag.js"; +import type { TouchRotateInfo } from "#src/util/touch_bindings.js"; import { FramebufferConfiguration, OffscreenCopyHelper, TextureBuffer, -} from "#/webgl/offscreen"; -import { ShaderBuilder } from "#/webgl/shader"; -import { - MultipleScaleBarTextures, - TrackableScaleBarOptions, -} from "#/widget/scale_bar"; +} from "#src/webgl/offscreen.js"; +import type { ShaderBuilder } from "#src/webgl/shader.js"; +import type { TrackableScaleBarOptions } from "#src/widget/scale_bar.js"; +import { MultipleScaleBarTextures } from "#src/widget/scale_bar.js"; export interface SliceViewerState extends RenderedDataViewerState { showScaleBar: TrackableBoolean; diff --git a/src/sliceview/png/index.ts b/src/sliceview/png/index.ts index 7e59fc3ba1..020640c25a 100644 --- a/src/sliceview/png/index.ts +++ b/src/sliceview/png/index.ts @@ -14,8 +14,7 @@ * limitations under the License. */ -import { DecodedImage } from "#/async_computation/decode_png_request"; -import pngWasmDataUrl from "./libpng.wasm"; +import type { DecodedImage } from "#src/async_computation/decode_png_request.js"; const libraryEnv = { emscripten_notify_memory_growth: () => {}, @@ -25,13 +24,16 @@ const libraryEnv = { }; const pngModulePromise = (async () => { - const response = await fetch(pngWasmDataUrl); - const wasmCode = await response.arrayBuffer(); - const m = await WebAssembly.instantiate(wasmCode, { - env: libraryEnv, - wasi_snapshot_preview1: libraryEnv, - }); - (m.instance.exports._initialize as Function)(); + const m = ( + await WebAssembly.instantiateStreaming( + fetch(new URL("./libpng.wasm", import.meta.url)), + { + env: libraryEnv, + wasi_snapshot_preview1: libraryEnv, + }, + ) + ).instance; + (m.exports._initialize as Function)(); return m; })(); @@ -199,14 +201,12 @@ export async function decompressPng( // heap must be referenced after creating bufPtr and imagePtr because // memory growth can detatch the buffer. - const bufPtr = (m.instance.exports.malloc as Function)(buffer.byteLength); - const imagePtr = (m.instance.exports.malloc as Function)(nbytes); - const heap = new Uint8Array( - (m.instance.exports.memory as WebAssembly.Memory).buffer, - ); + const bufPtr = (m.exports.malloc as Function)(buffer.byteLength); + const imagePtr = (m.exports.malloc as Function)(nbytes); + const heap = new Uint8Array((m.exports.memory as WebAssembly.Memory).buffer); heap.set(buffer, bufPtr); - const code = (m.instance.exports.png_decompress as Function)( + const code = (m.exports.png_decompress as Function)( bufPtr, buffer.byteLength, imagePtr, @@ -223,7 +223,7 @@ export async function decompressPng( // because memory growth during decompress could have detached // the buffer. const image = new Uint8Array( - (m.instance.exports.memory as WebAssembly.Memory).buffer, + (m.exports.memory as WebAssembly.Memory).buffer, imagePtr, nbytes, ); @@ -236,7 +236,7 @@ export async function decompressPng( uint8Array: image.slice(0), }; } finally { - (m.instance.exports.free as Function)(bufPtr); - (m.instance.exports.free as Function)(imagePtr); + (m.exports.free as Function)(bufPtr); + (m.exports.free as Function)(imagePtr); } } diff --git a/src/sliceview/renderlayer.ts b/src/sliceview/renderlayer.ts index 5cf0a0c03d..e9e7046bf4 100644 --- a/src/sliceview/renderlayer.ts +++ b/src/sliceview/renderlayer.ts @@ -14,51 +14,45 @@ * limitations under the License. */ -import { - ChunkManager, - ChunkRenderLayerFrontend, -} from "#/chunk_manager/frontend"; -import { CoordinateSpace } from "#/coordinate_transform"; -import { VisibleLayerInfo } from "#/layer"; -import { +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import { ChunkRenderLayerFrontend } from "#src/chunk_manager/frontend.js"; +import type { CoordinateSpace } from "#src/coordinate_transform.js"; +import type { VisibleLayerInfo } from "#src/layer/index.js"; +import type { ChunkTransformParameters, RenderLayerTransformOrError, -} from "#/render_coordinate_transform"; -import { - RenderScaleHistogram, - trackableRenderScaleTarget, -} from "#/render_scale_statistics"; -import { - RenderLayer, +} from "#src/render_coordinate_transform.js"; +import type { RenderScaleHistogram } from "#src/render_scale_statistics.js"; +import { trackableRenderScaleTarget } from "#src/render_scale_statistics.js"; +import type { ThreeDimensionalReadyRenderContext, ThreeDimensionalRenderContext, - VisibilityTrackedRenderLayer, -} from "#/renderlayer"; -import { SharedWatchableValue } from "#/shared_watchable_value"; -import { - filterVisibleSources, - SLICEVIEW_RENDERLAYER_RPC_ID, +} from "#src/renderlayer.js"; +import { RenderLayer, VisibilityTrackedRenderLayer } from "#src/renderlayer.js"; +import { SharedWatchableValue } from "#src/shared_watchable_value.js"; +import type { SliceViewBase, SliceViewProjectionParameters, SliceViewSourceOptions, TransformedSource, -} from "#/sliceview/base"; +} from "#src/sliceview/base.js"; import { + filterVisibleSources, + SLICEVIEW_RENDERLAYER_RPC_ID, +} from "#src/sliceview/base.js"; +import type { MultiscaleSliceViewChunkSource, SliceView, SliceViewChunkSource, SliceViewSingleResolutionSource, -} from "#/sliceview/frontend"; -import { SliceViewPanel } from "#/sliceview/panel"; -import { - constantWatchableValue, - WatchableValueInterface, -} from "#/trackable_value"; -import { Borrowed } from "#/util/disposable"; -import { HistogramSpecifications } from "#/webgl/empirical_cdf"; -import { ShaderModule } from "#/webgl/shader"; -import { RpcId } from "#/worker_rpc"; -import { SharedObject } from "#/worker_rpc"; +} from "#src/sliceview/frontend.js"; +import type { SliceViewPanel } from "#src/sliceview/panel.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { constantWatchableValue } from "#src/trackable_value.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { HistogramSpecifications } from "#src/webgl/empirical_cdf.js"; +import type { ShaderModule } from "#src/webgl/shader.js"; +import type { RpcId, SharedObject } from "#src/worker_rpc.js"; export interface SliceViewRenderLayerOptions { /** diff --git a/src/sliceview/single_texture_chunk_format.ts b/src/sliceview/single_texture_chunk_format.ts index 09c6904c42..4fe03f2737 100644 --- a/src/sliceview/single_texture_chunk_format.ts +++ b/src/sliceview/single_texture_chunk_format.ts @@ -14,18 +14,22 @@ * limitations under the License. */ -import { VolumeChunk, VolumeChunkSource } from "#/sliceview/volume/frontend"; -import { ChunkFormat } from "#/sliceview/volume/frontend"; -import { TypedArray } from "#/util/array"; -import { DataType } from "#/util/data_type"; -import { Disposable, RefCounted } from "#/util/disposable"; -import { GL } from "#/webgl/context"; -import { +import type { + VolumeChunkSource, + ChunkFormat, +} from "#src/sliceview/volume/frontend.js"; +import { VolumeChunk } from "#src/sliceview/volume/frontend.js"; +import type { TypedArray } from "#src/util/array.js"; +import type { DataType } from "#src/util/data_type.js"; +import type { Disposable } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import type { GL } from "#src/webgl/context.js"; +import type { ShaderBuilder, ShaderProgram, ShaderSamplerType, - textureTargetForSamplerType, -} from "#/webgl/shader"; +} from "#src/webgl/shader.js"; +import { textureTargetForSamplerType } from "#src/webgl/shader.js"; const textureUnitSymbol = Symbol("SingleTextureVolumeChunk.textureUnit"); const textureLayoutSymbol = Symbol("SingleTextureVolumeChunk.textureLayout"); diff --git a/src/sliceview/uncompressed_chunk_format.spec.ts b/src/sliceview/uncompressed_chunk_format.browser_test.ts similarity index 85% rename from src/sliceview/uncompressed_chunk_format.spec.ts rename to src/sliceview/uncompressed_chunk_format.browser_test.ts index 861e1c90a1..2ee2ade407 100644 --- a/src/sliceview/uncompressed_chunk_format.spec.ts +++ b/src/sliceview/uncompressed_chunk_format.browser_test.ts @@ -14,12 +14,13 @@ * limitations under the License. */ -import { chunkFormatTest } from "#/sliceview/chunk_format_testing"; -import { ChunkFormat } from "#/sliceview/uncompressed_chunk_format"; -import { TypedArray, TypedArrayConstructor } from "#/util/array"; -import { DataType } from "#/util/data_type"; -import { prod4 } from "#/util/geom"; -import { getRandomValues } from "#/util/random"; +import { describe } from "vitest"; +import { chunkFormatTest } from "#src/sliceview/chunk_format_testing.js"; +import { ChunkFormat } from "#src/sliceview/uncompressed_chunk_format.js"; +import type { TypedArray, TypedArrayConstructor } from "#src/util/array.js"; +import { DataType } from "#src/util/data_type.js"; +import { prod4 } from "#src/util/geom.js"; +import { getRandomValues } from "#src/util/random.js"; function fillSequential(array: TypedArray) { const length = array.length; diff --git a/src/sliceview/uncompressed_chunk_format.ts b/src/sliceview/uncompressed_chunk_format.ts index 992705c863..836bd22012 100644 --- a/src/sliceview/uncompressed_chunk_format.ts +++ b/src/sliceview/uncompressed_chunk_format.ts @@ -17,36 +17,37 @@ import { SingleTextureChunkFormat, SingleTextureVolumeChunk, -} from "#/sliceview/single_texture_chunk_format"; -import { DataType, VolumeChunkSpecification } from "#/sliceview/volume/base"; -import { +} from "#src/sliceview/single_texture_chunk_format.js"; +import type { VolumeChunkSpecification } from "#src/sliceview/volume/base.js"; +import { DataType } from "#src/sliceview/volume/base.js"; +import type { ChunkFormatHandler, - registerChunkFormatHandler, VolumeChunkSource, -} from "#/sliceview/volume/frontend"; -import { TypedArray, TypedArrayConstructor } from "#/util/array"; +} from "#src/sliceview/volume/frontend.js"; +import { registerChunkFormatHandler } from "#src/sliceview/volume/frontend.js"; +import type { TypedArray, TypedArrayConstructor } from "#src/util/array.js"; import { DATA_TYPE_ARRAY_CONSTRUCTOR, DATA_TYPE_JAVASCRIPT_ELEMENTS_PER_ARRAY_ELEMENT, -} from "#/util/data_type"; -import { RefCounted } from "#/util/disposable"; -import { Uint64 } from "#/util/uint64"; -import { GL } from "#/webgl/context"; -import { +} from "#src/util/data_type.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { Uint64 } from "#src/util/uint64.js"; +import type { GL } from "#src/webgl/context.js"; +import type { ShaderBuilder, ShaderProgram, ShaderSamplerPrefix, ShaderSamplerType, - textureTargetForSamplerType, -} from "#/webgl/shader"; -import { getShaderType } from "#/webgl/shader_lib"; +} from "#src/webgl/shader.js"; +import { textureTargetForSamplerType } from "#src/webgl/shader.js"; +import { getShaderType } from "#src/webgl/shader_lib.js"; +import type { TextureFormat } from "#src/webgl/texture_access.js"; import { computeTextureFormat, setThreeDimensionalTextureData, setTwoDimensionalTextureData, TextureAccessHelper, - TextureFormat, -} from "#/webgl/texture_access"; +} from "#src/webgl/texture_access.js"; class TextureLayout extends RefCounted { strides: Uint32Array; diff --git a/src/sliceview/volume/backend.ts b/src/sliceview/volume/backend.ts index 0c0512da54..5fe4b79d01 100644 --- a/src/sliceview/volume/backend.ts +++ b/src/sliceview/volume/backend.ts @@ -14,19 +14,22 @@ * limitations under the License. */ +import type { Chunk } from "#src/chunk_manager/backend.js"; import { SliceViewChunk, SliceViewChunkSourceBackend, -} from "#/sliceview/backend"; -import { +} from "#src/sliceview/backend.js"; +import type { + DataType, + SliceViewChunkSpecification, +} from "#src/sliceview/base.js"; +import type { VolumeChunkSource as VolumeChunkSourceInterface, VolumeChunkSpecification, -} from "#/sliceview/volume/base"; -import { vec3 } from "#/util/geom"; -import * as vector from "#/util/vector"; -import { RPC } from "#/worker_rpc"; -import { Chunk } from "#/chunk_manager/backend"; -import { DataType, SliceViewChunkSpecification } from "#/sliceview/base"; +} from "#src/sliceview/volume/base.js"; +import type { vec3 } from "#src/util/geom.js"; +import * as vector from "#src/util/vector.js"; +import type { RPC } from "#src/worker_rpc.js"; export class VolumeChunk extends SliceViewChunk { source: VolumeChunkSource | null = null; diff --git a/src/sliceview/volume/base.ts b/src/sliceview/volume/base.ts index 791f5d3bd4..a81019c56f 100644 --- a/src/sliceview/volume/base.ts +++ b/src/sliceview/volume/base.ts @@ -14,22 +14,25 @@ * limitations under the License. */ -import { +import type { ChunkLayoutOptions, - getChunkDataSizes, - getNearIsotropicBlockSize, - makeSliceViewChunkSpecification, SliceViewChunkSource, SliceViewChunkSpecification, SliceViewChunkSpecificationBaseOptions, SliceViewChunkSpecificationOptions, SliceViewSourceOptions, -} from "#/sliceview/base"; -import { DATA_TYPE_BYTES, DataType } from "#/util/data_type"; -import { getDependentTransformInputDimensions, vec3 } from "#/util/geom"; -import * as matrix from "#/util/matrix"; -import { Uint64 } from "#/util/uint64"; -import * as vector from "#/util/vector"; +} from "#src/sliceview/base.js"; +import { + getChunkDataSizes, + getNearIsotropicBlockSize, + makeSliceViewChunkSpecification, +} from "#src/sliceview/base.js"; +import { DATA_TYPE_BYTES, DataType } from "#src/util/data_type.js"; +import type { vec3 } from "#src/util/geom.js"; +import { getDependentTransformInputDimensions } from "#src/util/geom.js"; +import * as matrix from "#src/util/matrix.js"; +import { Uint64 } from "#src/util/uint64.js"; +import * as vector from "#src/util/vector.js"; export { DATA_TYPE_BYTES, DataType }; diff --git a/src/sliceview/volume/frontend.ts b/src/sliceview/volume/frontend.ts index ac3bbaac8c..d2427b905b 100644 --- a/src/sliceview/volume/frontend.ts +++ b/src/sliceview/volume/frontend.ts @@ -14,24 +14,27 @@ * limitations under the License. */ -import { ChunkManager } from "#/chunk_manager/frontend"; -import { ChunkChannelAccessParameters } from "#/render_coordinate_transform"; -import { DataType, SliceViewChunkSpecification } from "#/sliceview/base"; +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import type { ChunkChannelAccessParameters } from "#src/render_coordinate_transform.js"; +import type { + DataType, + SliceViewChunkSpecification, +} from "#src/sliceview/base.js"; import { MultiscaleSliceViewChunkSource, SliceViewChunk, SliceViewChunkSource, -} from "#/sliceview/frontend"; -import { +} from "#src/sliceview/frontend.js"; +import type { VolumeChunkSource as VolumeChunkSourceInterface, VolumeChunkSpecification, VolumeSourceOptions, VolumeType, -} from "#/sliceview/volume/base"; -import { Disposable } from "#/util/disposable"; -import { GL } from "#/webgl/context"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; -import { getShaderType, glsl_mixLinear } from "#/webgl/shader_lib"; +} from "#src/sliceview/volume/base.js"; +import type { Disposable } from "#src/util/disposable.js"; +import type { GL } from "#src/webgl/context.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; +import { getShaderType, glsl_mixLinear } from "#src/webgl/shader_lib.js"; export type VolumeChunkKey = string; diff --git a/src/sliceview/volume/image_renderlayer.ts b/src/sliceview/volume/image_renderlayer.ts index e3e36f39ee..ee278e2c27 100644 --- a/src/sliceview/volume/image_renderlayer.ts +++ b/src/sliceview/volume/image_renderlayer.ts @@ -14,34 +14,31 @@ * limitations under the License. */ -import { SliceView } from "#/sliceview/frontend"; -import { MultiscaleVolumeChunkSource } from "#/sliceview/volume/frontend"; -import { - RenderLayerBaseOptions, - SliceViewVolumeRenderLayer, -} from "#/sliceview/volume/renderlayer"; -import { TrackableAlphaValue } from "#/trackable_alpha"; -import { - BLEND_FUNCTIONS, - BLEND_MODES, - TrackableBlendModeValue, -} from "#/trackable_blend"; -import { WatchableValue } from "#/trackable_value"; -import { glsl_COLORMAPS } from "#/webgl/colormaps"; +import type { SliceView } from "#src/sliceview/frontend.js"; +import type { MultiscaleVolumeChunkSource } from "#src/sliceview/volume/frontend.js"; +import type { RenderLayerBaseOptions } from "#src/sliceview/volume/renderlayer.js"; +import { SliceViewVolumeRenderLayer } from "#src/sliceview/volume/renderlayer.js"; +import type { TrackableAlphaValue } from "#src/trackable_alpha.js"; +import type { TrackableBlendModeValue } from "#src/trackable_blend.js"; +import { BLEND_FUNCTIONS, BLEND_MODES } from "#src/trackable_blend.js"; +import { WatchableValue } from "#src/trackable_value.js"; +import { glsl_COLORMAPS } from "#src/webgl/colormaps.js"; +import type { WatchableShaderError } from "#src/webgl/dynamic_shader.js"; import { makeTrackableFragmentMain, shaderCodeWithLineDirective, - WatchableShaderError, -} from "#/webgl/dynamic_shader"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; +} from "#src/webgl/dynamic_shader.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; +import type { + ShaderControlsBuilderState, + ShaderControlState, +} from "#src/webgl/shader_ui_controls.js"; import { addControlsToBuilder, getFallbackBuilderState, parseShaderUiControls, setControlsInShader, - ShaderControlsBuilderState, - ShaderControlState, -} from "#/webgl/shader_ui_controls"; +} from "#src/webgl/shader_ui_controls.js"; const DEFAULT_FRAGMENT_MAIN = `#uicontrol invlerp normalized void main() { diff --git a/src/sliceview/volume/renderlayer.ts b/src/sliceview/volume/renderlayer.ts index 55419a627d..2a8fa2de02 100644 --- a/src/sliceview/volume/renderlayer.ts +++ b/src/sliceview/volume/renderlayer.ts @@ -14,61 +14,64 @@ * limitations under the License. */ -import { ChunkState } from "#/chunk_manager/base"; -import { - CoordinateSpace, - emptyInvalidCoordinateSpace, -} from "#/coordinate_transform"; -import { ProjectionParameters } from "#/projection_parameters"; -import { getChunkPositionFromCombinedGlobalLocalPositions } from "#/render_coordinate_transform"; -import { getNormalizedChunkLayout } from "#/sliceview/base"; +import { ChunkState } from "#src/chunk_manager/base.js"; +import type { CoordinateSpace } from "#src/coordinate_transform.js"; +import { emptyInvalidCoordinateSpace } from "#src/coordinate_transform.js"; +import type { ProjectionParameters } from "#src/projection_parameters.js"; +import { getChunkPositionFromCombinedGlobalLocalPositions } from "#src/render_coordinate_transform.js"; +import { getNormalizedChunkLayout } from "#src/sliceview/base.js"; import { computeVertexPositionDebug, defineBoundingBoxCrossSectionShader, setBoundingBoxCrossSectionShaderViewportPlane, -} from "#/sliceview/bounding_box_shader_helper"; -import { ChunkLayout } from "#/sliceview/chunk_layout"; -import { FrontendTransformedSource, SliceView } from "#/sliceview/frontend"; -import { +} from "#src/sliceview/bounding_box_shader_helper.js"; +import type { ChunkLayout } from "#src/sliceview/chunk_layout.js"; +import type { + FrontendTransformedSource, + SliceView, +} from "#src/sliceview/frontend.js"; +import type { SliceViewRenderContext, - SliceViewRenderLayer, SliceViewRenderLayerOptions, -} from "#/sliceview/renderlayer"; -import { VolumeSourceOptions } from "#/sliceview/volume/base"; -import { +} from "#src/sliceview/renderlayer.js"; +import { SliceViewRenderLayer } from "#src/sliceview/renderlayer.js"; +import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; +import type { ChunkFormat, - defineChunkDataShaderAccess, MultiscaleVolumeChunkSource, VolumeChunkSource, -} from "#/sliceview/volume/frontend"; +} from "#src/sliceview/volume/frontend.js"; +import { defineChunkDataShaderAccess } from "#src/sliceview/volume/frontend.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; import { constantWatchableValue, makeCachedDerivedWatchableValue, - WatchableValueInterface, -} from "#/trackable_value"; -import { mat4, vec3 } from "#/util/geom"; -import { getObjectId } from "#/util/object_id"; -import { GL } from "#/webgl/context"; -import { - makeWatchableShaderError, +} from "#src/trackable_value.js"; +import { mat4, vec3 } from "#src/util/geom.js"; +import { getObjectId } from "#src/util/object_id.js"; +import type { GL } from "#src/webgl/context.js"; +import type { ParameterizedContextDependentShaderGetter, - parameterizedContextDependentShaderGetter, ParameterizedShaderGetterResult, WatchableShaderError, -} from "#/webgl/dynamic_shader"; -import { HistogramChannelSpecification } from "#/webgl/empirical_cdf"; +} from "#src/webgl/dynamic_shader.js"; +import { + makeWatchableShaderError, + parameterizedContextDependentShaderGetter, +} from "#src/webgl/dynamic_shader.js"; +import type { HistogramChannelSpecification } from "#src/webgl/empirical_cdf.js"; import { defineInvlerpShaderFunction, enableLerpShaderFunction, -} from "#/webgl/lerp"; +} from "#src/webgl/lerp.js"; import { defineLineShader, drawLines, initializeLineShader, VERTICES_PER_LINE, -} from "#/webgl/lines"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; -import { defineVertexId, VertexIdHelper } from "#/webgl/vertex_id"; +} from "#src/webgl/lines.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; +import { defineVertexId, VertexIdHelper } from "#src/webgl/vertex_id.js"; const DEBUG_VERTICES = false; diff --git a/src/sliceview/volume/segmentation_renderlayer.ts b/src/sliceview/volume/segmentation_renderlayer.ts index 1e24ec5a4e..df09948c83 100644 --- a/src/sliceview/volume/segmentation_renderlayer.ts +++ b/src/sliceview/volume/segmentation_renderlayer.ts @@ -14,42 +14,38 @@ * limitations under the License. */ -import { HashMapUint64 } from "#/gpu_hash/hash_table"; +import { HashMapUint64 } from "#src/gpu_hash/hash_table.js"; import { GPUHashTable, HashMapShaderManager, HashSetShaderManager, -} from "#/gpu_hash/shader"; +} from "#src/gpu_hash/shader.js"; import { SegmentColorShaderManager, SegmentStatedColorShaderManager, -} from "#/segment_color"; -import { getVisibleSegments } from "#/segmentation_display_state/base"; -import { - registerRedrawWhenSegmentationDisplayStateChanged, - SegmentationDisplayState, -} from "#/segmentation_display_state/frontend"; -import { SliceViewSourceOptions } from "#/sliceview/base"; -import { +} from "#src/segment_color.js"; +import { getVisibleSegments } from "#src/segmentation_display_state/base.js"; +import type { SegmentationDisplayState } from "#src/segmentation_display_state/frontend.js"; +import { registerRedrawWhenSegmentationDisplayStateChanged } from "#src/segmentation_display_state/frontend.js"; +import type { SliceViewSourceOptions } from "#src/sliceview/base.js"; +import type { SliceView, SliceViewSingleResolutionSource, -} from "#/sliceview/frontend"; -import { +} from "#src/sliceview/frontend.js"; +import type { MultiscaleVolumeChunkSource, VolumeChunkSource, -} from "#/sliceview/volume/frontend"; -import { - RenderLayerBaseOptions, - SliceViewVolumeRenderLayer, -} from "#/sliceview/volume/renderlayer"; +} from "#src/sliceview/volume/frontend.js"; +import type { RenderLayerBaseOptions } from "#src/sliceview/volume/renderlayer.js"; +import { SliceViewVolumeRenderLayer } from "#src/sliceview/volume/renderlayer.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; import { AggregateWatchableValue, makeCachedDerivedWatchableValue, - WatchableValueInterface, -} from "#/trackable_value"; -import { DisjointUint64Sets } from "#/util/disjoint_sets"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; -import { Uint64Map } from "#/uint64_map"; +} from "#src/trackable_value.js"; +import type { Uint64Map } from "#src/uint64_map.js"; +import type { DisjointUint64Sets } from "#src/util/disjoint_sets.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; export class EquivalencesHashMap { generation = Number.NaN; diff --git a/src/sliceview/wire_frame.ts b/src/sliceview/wire_frame.ts index b01f0d593c..c66d938e22 100644 --- a/src/sliceview/wire_frame.ts +++ b/src/sliceview/wire_frame.ts @@ -14,24 +14,24 @@ * limitations under the License. */ -import { ProjectionParameters } from "#/projection_parameters"; -import { +import type { ProjectionParameters } from "#src/projection_parameters.js"; +import type { SliceViewProjectionParameters, TransformedSource, -} from "#/sliceview/base"; +} from "#src/sliceview/base.js"; import { defineBoundingBoxCrossSectionShader, setBoundingBoxCrossSectionShaderViewportPlane, -} from "#/sliceview/bounding_box_shader_helper"; -import { mat4, vec3 } from "#/util/geom"; -import { EDGES_PER_BOX } from "#/webgl/bounding_box"; +} from "#src/sliceview/bounding_box_shader_helper.js"; +import { mat4, vec3 } from "#src/util/geom.js"; +import { EDGES_PER_BOX } from "#src/webgl/bounding_box.js"; import { defineLineShader, drawLines, initializeLineShader, VERTICES_PER_LINE, -} from "#/webgl/lines"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; +} from "#src/webgl/lines.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; const tempMat4 = mat4.create(); const tempVec3 = vec3.create(); diff --git a/src/status.ts b/src/status.ts index 6ea7f076b1..8aaf9058a8 100644 --- a/src/status.ts +++ b/src/status.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import "./status.css"; +import "#src/status.css"; let statusContainer: HTMLElement | null = null; diff --git a/third_party/jpgjs/README b/src/third_party/jpgjs/README similarity index 100% rename from third_party/jpgjs/README rename to src/third_party/jpgjs/README diff --git a/typings/karma-benchmark.d.ts b/src/third_party/jpgjs/jpg.d.ts similarity index 72% rename from typings/karma-benchmark.d.ts rename to src/third_party/jpgjs/jpg.d.ts index fdc7cd23f4..91d6ec452a 100644 --- a/typings/karma-benchmark.d.ts +++ b/src/third_party/jpgjs/jpg.d.ts @@ -15,7 +15,13 @@ */ /** - * Typings for karma-benchmark. + * Basic typings for jpgjs package. */ -declare function suite(name: string, f: () => void): void; -declare function benchmark(name: string, f: () => void): void; + +export class JpegDecoder { + width: number; + height: number; + numComponents: number; + parse(data: Uint8Array): void; + getData(width: number, height: number, forceRGBOutput?: boolean): Uint8Array; +} diff --git a/src/third_party/jpgjs/jpg.js b/src/third_party/jpgjs/jpg.js new file mode 100644 index 0000000000..5ab288429a --- /dev/null +++ b/src/third_party/jpgjs/jpg.js @@ -0,0 +1,5255 @@ +/** + * @license + * Copyright 2015 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +function loadURLasArrayBuffer(path, callback) { + if (path.indexOf("data:") === 0) { + var offset = path.indexOf("base64,") + 7; + var data = atob(path.substring(offset)); + var arr = new Uint8Array(data.length); + for (var i = data.length - 1; i >= 0; i--) { + arr[i] = data.charCodeAt(i); + } + callback(arr.buffer); + return; + } + var xhr = new XMLHttpRequest(); + xhr.open("GET", path, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function () { + callback(xhr.response); + }; + xhr.send(null); +} + +var JpegImage = (function jpegImage() { + function JpegImage() { + this._src = null; + this._parser = new PDFJS.JpegImage(); + this.onload = null; + } + JpegImage.prototype = { + get src() { + return this._src; + }, + set src(value) { + this.load(value); + }, + get width() { + return this._parser.width; + }, + get height() { + return this._parser.height; + }, + load: function load(path) { + this._src = path; + loadURLasArrayBuffer( + path, + function (buffer) { + this.parse(new Uint8Array(buffer)); + if (this.onload) { + this.onload(); + } + }.bind(this), + ); + }, + parse: function (data) { + this._parser.parse(data); + }, + getData: function (width, height) { + return this._parser.getData(width, height, false); + }, + copyToImageData: function copyToImageData(imageData) { + if (this._parser.numComponents === 2 || this._parser.numComponents > 4) { + throw new Error("Unsupported amount of components"); + } + var width = imageData.width, + height = imageData.height; + var imageDataBytes = width * height * 4; + var imageDataArray = imageData.data; + var i, j; + if (this._parser.numComponents === 1) { + var values = this._parser.getData(width, height, false); + for (i = 0, j = 0; i < imageDataBytes; ) { + var value = values[j++]; + imageDataArray[i++] = value; + imageDataArray[i++] = value; + imageDataArray[i++] = value; + imageDataArray[i++] = 255; + } + return; + } + var rgb = this._parser.getData(width, height, true); + for (i = 0, j = 0; i < imageDataBytes; ) { + imageDataArray[i++] = rgb[j++]; + imageDataArray[i++] = rgb[j++]; + imageDataArray[i++] = rgb[j++]; + imageDataArray[i++] = 255; + } + }, + }; + return JpegImage; +})(); + +var PDFJS; + +(function (PDFJS) { + "use strict"; + var JpegImage = (function jpegImage() { + var dctZigZag = new Uint8Array([ + 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, + 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, + 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, + 60, 61, 54, 47, 55, 62, 63, + ]); + var dctCos1 = 4017; + var dctSin1 = 799; + var dctCos3 = 3406; + var dctSin3 = 2276; + var dctCos6 = 1567; + var dctSin6 = 3784; + var dctSqrt2 = 5793; + var dctSqrt1d2 = 2896; + function constructor() {} + function buildHuffmanTable(codeLengths, values) { + var k = 0, + code = [], + i, + j, + length = 16; + while (length > 0 && !codeLengths[length - 1]) { + length--; + } + code.push({ + children: [], + index: 0, + }); + var p = code[0], + q; + for (i = 0; i < length; i++) { + for (j = 0; j < codeLengths[i]; j++) { + p = code.pop(); + p.children[p.index] = values[k]; + while (p.index > 0) { + p = code.pop(); + } + p.index++; + code.push(p); + while (code.length <= i) { + code.push( + (q = { + children: [], + index: 0, + }), + ); + p.children[p.index] = q.children; + p = q; + } + k++; + } + if (i + 1 < length) { + code.push( + (q = { + children: [], + index: 0, + }), + ); + p.children[p.index] = q.children; + p = q; + } + } + return code[0].children; + } + function getBlockBufferOffset(component, row, col) { + return 64 * ((component.blocksPerLine + 1) * row + col); + } + function decodeScan( + data, + offset, + frame, + components, + resetInterval, + spectralStart, + spectralEnd, + successivePrev, + successive, + ) { + var precision = frame.precision; + var samplesPerLine = frame.samplesPerLine; + var scanLines = frame.scanLines; + var mcusPerLine = frame.mcusPerLine; + var progressive = frame.progressive; + var maxH = frame.maxH, + maxV = frame.maxV; + var startOffset = offset, + bitsData = 0, + bitsCount = 0; + function readBit() { + if (bitsCount > 0) { + bitsCount--; + return (bitsData >> bitsCount) & 1; + } + bitsData = data[offset++]; + if (bitsData === 255) { + var nextByte = data[offset++]; + if (nextByte) { + throw ( + "unexpected marker: " + ((bitsData << 8) | nextByte).toString(16) + ); + } + } + bitsCount = 7; + return bitsData >>> 7; + } + function decodeHuffman(tree) { + var node = tree; + while (true) { + node = node[readBit()]; + if (typeof node === "number") { + return node; + } + if (typeof node !== "object") { + throw "invalid huffman sequence"; + } + } + } + function receive(length) { + var n = 0; + while (length > 0) { + n = (n << 1) | readBit(); + length--; + } + return n; + } + function receiveAndExtend(length) { + if (length === 1) { + return readBit() === 1 ? 1 : -1; + } + var n = receive(length); + if (n >= 1 << (length - 1)) { + return n; + } + return n + (-1 << length) + 1; + } + function decodeBaseline(component, offset) { + var t = decodeHuffman(component.huffmanTableDC); + var diff = t === 0 ? 0 : receiveAndExtend(t); + component.blockData[offset] = component.pred += diff; + var k = 1; + while (k < 64) { + var rs = decodeHuffman(component.huffmanTableAC); + var s = rs & 15, + r = rs >> 4; + if (s === 0) { + if (r < 15) { + break; + } + k += 16; + continue; + } + k += r; + var z = dctZigZag[k]; + component.blockData[offset + z] = receiveAndExtend(s); + k++; + } + } + function decodeDCFirst(component, offset) { + var t = decodeHuffman(component.huffmanTableDC); + var diff = t === 0 ? 0 : receiveAndExtend(t) << successive; + component.blockData[offset] = component.pred += diff; + } + function decodeDCSuccessive(component, offset) { + component.blockData[offset] |= readBit() << successive; + } + var eobrun = 0; + function decodeACFirst(component, offset) { + if (eobrun > 0) { + eobrun--; + return; + } + var k = spectralStart, + e = spectralEnd; + while (k <= e) { + var rs = decodeHuffman(component.huffmanTableAC); + var s = rs & 15, + r = rs >> 4; + if (s === 0) { + if (r < 15) { + eobrun = receive(r) + (1 << r) - 1; + break; + } + k += 16; + continue; + } + k += r; + var z = dctZigZag[k]; + component.blockData[offset + z] = + receiveAndExtend(s) * (1 << successive); + k++; + } + } + var successiveACState = 0, + successiveACNextValue; + function decodeACSuccessive(component, offset) { + var k = spectralStart; + var e = spectralEnd; + var r = 0; + var s; + var rs; + while (k <= e) { + var z = dctZigZag[k]; + switch (successiveACState) { + case 0: + rs = decodeHuffman(component.huffmanTableAC); + s = rs & 15; + r = rs >> 4; + if (s === 0) { + if (r < 15) { + eobrun = receive(r) + (1 << r); + successiveACState = 4; + } else { + r = 16; + successiveACState = 1; + } + } else { + if (s !== 1) { + throw "invalid ACn encoding"; + } + successiveACNextValue = receiveAndExtend(s); + successiveACState = r ? 2 : 3; + } + continue; + + case 1: + case 2: + if (component.blockData[offset + z]) { + component.blockData[offset + z] += readBit() << successive; + } else { + r--; + if (r === 0) { + successiveACState = successiveACState === 2 ? 3 : 0; + } + } + break; + + case 3: + if (component.blockData[offset + z]) { + component.blockData[offset + z] += readBit() << successive; + } else { + component.blockData[offset + z] = + successiveACNextValue << successive; + successiveACState = 0; + } + break; + + case 4: + if (component.blockData[offset + z]) { + component.blockData[offset + z] += readBit() << successive; + } + break; + } + k++; + } + if (successiveACState === 4) { + eobrun--; + if (eobrun === 0) { + successiveACState = 0; + } + } + } + function decodeMcu(component, decode, mcu, row, col) { + var mcuRow = (mcu / mcusPerLine) | 0; + var mcuCol = mcu % mcusPerLine; + var blockRow = mcuRow * component.v + row; + var blockCol = mcuCol * component.h + col; + var offset = getBlockBufferOffset(component, blockRow, blockCol); + decode(component, offset); + } + function decodeBlock(component, decode, mcu) { + var blockRow = (mcu / component.blocksPerLine) | 0; + var blockCol = mcu % component.blocksPerLine; + var offset = getBlockBufferOffset(component, blockRow, blockCol); + decode(component, offset); + } + var componentsLength = components.length; + var component, i, j, k, n; + var decodeFn; + if (progressive) { + if (spectralStart === 0) { + decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; + } else { + decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; + } + } else { + decodeFn = decodeBaseline; + } + var mcu = 0, + marker; + var mcuExpected; + if (componentsLength === 1) { + mcuExpected = + components[0].blocksPerLine * components[0].blocksPerColumn; + } else { + mcuExpected = mcusPerLine * frame.mcusPerColumn; + } + if (!resetInterval) { + resetInterval = mcuExpected; + } + var h, v; + while (mcu < mcuExpected) { + for (i = 0; i < componentsLength; i++) { + components[i].pred = 0; + } + eobrun = 0; + if (componentsLength === 1) { + component = components[0]; + for (n = 0; n < resetInterval; n++) { + decodeBlock(component, decodeFn, mcu); + mcu++; + } + } else { + for (n = 0; n < resetInterval; n++) { + for (i = 0; i < componentsLength; i++) { + component = components[i]; + h = component.h; + v = component.v; + for (j = 0; j < v; j++) { + for (k = 0; k < h; k++) { + decodeMcu(component, decodeFn, mcu, j, k); + } + } + } + mcu++; + } + } + bitsCount = 0; + marker = (data[offset] << 8) | data[offset + 1]; + if (marker <= 65280) { + throw "marker was not found"; + } + if (marker >= 65488 && marker <= 65495) { + offset += 2; + } else { + break; + } + } + return offset - startOffset; + } + function quantizeAndInverse(component, blockBufferOffset, p) { + var qt = component.quantizationTable, + blockData = component.blockData; + var v0, v1, v2, v3, v4, v5, v6, v7; + var p0, p1, p2, p3, p4, p5, p6, p7; + var t; + for (var row = 0; row < 64; row += 8) { + p0 = blockData[blockBufferOffset + row]; + p1 = blockData[blockBufferOffset + row + 1]; + p2 = blockData[blockBufferOffset + row + 2]; + p3 = blockData[blockBufferOffset + row + 3]; + p4 = blockData[blockBufferOffset + row + 4]; + p5 = blockData[blockBufferOffset + row + 5]; + p6 = blockData[blockBufferOffset + row + 6]; + p7 = blockData[blockBufferOffset + row + 7]; + p0 *= qt[row]; + if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { + t = (dctSqrt2 * p0 + 512) >> 10; + p[row] = t; + p[row + 1] = t; + p[row + 2] = t; + p[row + 3] = t; + p[row + 4] = t; + p[row + 5] = t; + p[row + 6] = t; + p[row + 7] = t; + continue; + } + p1 *= qt[row + 1]; + p2 *= qt[row + 2]; + p3 *= qt[row + 3]; + p4 *= qt[row + 4]; + p5 *= qt[row + 5]; + p6 *= qt[row + 6]; + p7 *= qt[row + 7]; + v0 = (dctSqrt2 * p0 + 128) >> 8; + v1 = (dctSqrt2 * p4 + 128) >> 8; + v2 = p2; + v3 = p6; + v4 = (dctSqrt1d2 * (p1 - p7) + 128) >> 8; + v7 = (dctSqrt1d2 * (p1 + p7) + 128) >> 8; + v5 = p3 << 4; + v6 = p5 << 4; + v0 = (v0 + v1 + 1) >> 1; + v1 = v0 - v1; + t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8; + v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8; + v3 = t; + v4 = (v4 + v6 + 1) >> 1; + v6 = v4 - v6; + v7 = (v7 + v5 + 1) >> 1; + v5 = v7 - v5; + v0 = (v0 + v3 + 1) >> 1; + v3 = v0 - v3; + v1 = (v1 + v2 + 1) >> 1; + v2 = v1 - v2; + t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; + v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; + v7 = t; + t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; + v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; + v6 = t; + p[row] = v0 + v7; + p[row + 7] = v0 - v7; + p[row + 1] = v1 + v6; + p[row + 6] = v1 - v6; + p[row + 2] = v2 + v5; + p[row + 5] = v2 - v5; + p[row + 3] = v3 + v4; + p[row + 4] = v3 - v4; + } + for (var col = 0; col < 8; ++col) { + p0 = p[col]; + p1 = p[col + 8]; + p2 = p[col + 16]; + p3 = p[col + 24]; + p4 = p[col + 32]; + p5 = p[col + 40]; + p6 = p[col + 48]; + p7 = p[col + 56]; + if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { + t = (dctSqrt2 * p0 + 8192) >> 14; + t = t < -2040 ? 0 : t >= 2024 ? 255 : (t + 2056) >> 4; + blockData[blockBufferOffset + col] = t; + blockData[blockBufferOffset + col + 8] = t; + blockData[blockBufferOffset + col + 16] = t; + blockData[blockBufferOffset + col + 24] = t; + blockData[blockBufferOffset + col + 32] = t; + blockData[blockBufferOffset + col + 40] = t; + blockData[blockBufferOffset + col + 48] = t; + blockData[blockBufferOffset + col + 56] = t; + continue; + } + v0 = (dctSqrt2 * p0 + 2048) >> 12; + v1 = (dctSqrt2 * p4 + 2048) >> 12; + v2 = p2; + v3 = p6; + v4 = (dctSqrt1d2 * (p1 - p7) + 2048) >> 12; + v7 = (dctSqrt1d2 * (p1 + p7) + 2048) >> 12; + v5 = p3; + v6 = p5; + v0 = ((v0 + v1 + 1) >> 1) + 4112; + v1 = v0 - v1; + t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12; + v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12; + v3 = t; + v4 = (v4 + v6 + 1) >> 1; + v6 = v4 - v6; + v7 = (v7 + v5 + 1) >> 1; + v5 = v7 - v5; + v0 = (v0 + v3 + 1) >> 1; + v3 = v0 - v3; + v1 = (v1 + v2 + 1) >> 1; + v2 = v1 - v2; + t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; + v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; + v7 = t; + t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; + v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; + v6 = t; + p0 = v0 + v7; + p7 = v0 - v7; + p1 = v1 + v6; + p6 = v1 - v6; + p2 = v2 + v5; + p5 = v2 - v5; + p3 = v3 + v4; + p4 = v3 - v4; + p0 = p0 < 16 ? 0 : p0 >= 4080 ? 255 : p0 >> 4; + p1 = p1 < 16 ? 0 : p1 >= 4080 ? 255 : p1 >> 4; + p2 = p2 < 16 ? 0 : p2 >= 4080 ? 255 : p2 >> 4; + p3 = p3 < 16 ? 0 : p3 >= 4080 ? 255 : p3 >> 4; + p4 = p4 < 16 ? 0 : p4 >= 4080 ? 255 : p4 >> 4; + p5 = p5 < 16 ? 0 : p5 >= 4080 ? 255 : p5 >> 4; + p6 = p6 < 16 ? 0 : p6 >= 4080 ? 255 : p6 >> 4; + p7 = p7 < 16 ? 0 : p7 >= 4080 ? 255 : p7 >> 4; + blockData[blockBufferOffset + col] = p0; + blockData[blockBufferOffset + col + 8] = p1; + blockData[blockBufferOffset + col + 16] = p2; + blockData[blockBufferOffset + col + 24] = p3; + blockData[blockBufferOffset + col + 32] = p4; + blockData[blockBufferOffset + col + 40] = p5; + blockData[blockBufferOffset + col + 48] = p6; + blockData[blockBufferOffset + col + 56] = p7; + } + } + function buildComponentData(frame, component) { + var blocksPerLine = component.blocksPerLine; + var blocksPerColumn = component.blocksPerColumn; + var computationBuffer = new Int16Array(64); + for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) { + for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) { + var offset = getBlockBufferOffset(component, blockRow, blockCol); + quantizeAndInverse(component, offset, computationBuffer); + } + } + return component.blockData; + } + function clamp0to255(a) { + return a <= 0 ? 0 : a >= 255 ? 255 : a; + } + constructor.prototype = { + parse: function parse(data) { + function readUint16() { + var value = (data[offset] << 8) | data[offset + 1]; + offset += 2; + return value; + } + function readDataBlock() { + var length = readUint16(); + var array = data.subarray(offset, offset + length - 2); + offset += array.length; + return array; + } + function prepareComponents(frame) { + var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH); + var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV); + for (var i = 0; i < frame.components.length; i++) { + component = frame.components[i]; + var blocksPerLine = Math.ceil( + (Math.ceil(frame.samplesPerLine / 8) * component.h) / frame.maxH, + ); + var blocksPerColumn = Math.ceil( + (Math.ceil(frame.scanLines / 8) * component.v) / frame.maxV, + ); + var blocksPerLineForMcu = mcusPerLine * component.h; + var blocksPerColumnForMcu = mcusPerColumn * component.v; + var blocksBufferSize = + 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1); + component.blockData = new Int16Array(blocksBufferSize); + component.blocksPerLine = blocksPerLine; + component.blocksPerColumn = blocksPerColumn; + } + frame.mcusPerLine = mcusPerLine; + frame.mcusPerColumn = mcusPerColumn; + } + var offset = 0, + length = data.length; + var jfif = null; + var adobe = null; + var pixels = null; + var frame, resetInterval; + var quantizationTables = []; + var huffmanTablesAC = [], + huffmanTablesDC = []; + var fileMarker = readUint16(); + if (fileMarker !== 65496) { + throw "SOI not found"; + } + fileMarker = readUint16(); + while (fileMarker !== 65497) { + var i, j, l; + switch (fileMarker) { + case 65504: + case 65505: + case 65506: + case 65507: + case 65508: + case 65509: + case 65510: + case 65511: + case 65512: + case 65513: + case 65514: + case 65515: + case 65516: + case 65517: + case 65518: + case 65519: + case 65534: + var appData = readDataBlock(); + if (fileMarker === 65504) { + if ( + appData[0] === 74 && + appData[1] === 70 && + appData[2] === 73 && + appData[3] === 70 && + appData[4] === 0 + ) { + jfif = { + version: { + major: appData[5], + minor: appData[6], + }, + densityUnits: appData[7], + xDensity: (appData[8] << 8) | appData[9], + yDensity: (appData[10] << 8) | appData[11], + thumbWidth: appData[12], + thumbHeight: appData[13], + thumbData: appData.subarray( + 14, + 14 + 3 * appData[12] * appData[13], + ), + }; + } + } + if (fileMarker === 65518) { + if ( + appData[0] === 65 && + appData[1] === 100 && + appData[2] === 111 && + appData[3] === 98 && + appData[4] === 101 && + appData[5] === 0 + ) { + adobe = { + version: appData[6], + flags0: (appData[7] << 8) | appData[8], + flags1: (appData[9] << 8) | appData[10], + transformCode: appData[11], + }; + } + } + break; + + case 65499: + var quantizationTablesLength = readUint16(); + var quantizationTablesEnd = quantizationTablesLength + offset - 2; + var z; + while (offset < quantizationTablesEnd) { + var quantizationTableSpec = data[offset++]; + var tableData = new Uint16Array(64); + if (quantizationTableSpec >> 4 === 0) { + for (j = 0; j < 64; j++) { + z = dctZigZag[j]; + tableData[z] = data[offset++]; + } + } else if (quantizationTableSpec >> 4 === 1) { + for (j = 0; j < 64; j++) { + z = dctZigZag[j]; + tableData[z] = readUint16(); + } + } else { + throw "DQT: invalid table spec"; + } + quantizationTables[quantizationTableSpec & 15] = tableData; + } + break; + + case 65472: + case 65473: + case 65474: + if (frame) { + throw "Only single frame JPEGs supported"; + } + readUint16(); + frame = {}; + frame.extended = fileMarker === 65473; + frame.progressive = fileMarker === 65474; + frame.precision = data[offset++]; + frame.scanLines = readUint16(); + frame.samplesPerLine = readUint16(); + frame.components = []; + frame.componentIds = {}; + var componentsCount = data[offset++], + componentId; + var maxH = 0, + maxV = 0; + for (i = 0; i < componentsCount; i++) { + componentId = data[offset]; + var h = data[offset + 1] >> 4; + var v = data[offset + 1] & 15; + if (maxH < h) { + maxH = h; + } + if (maxV < v) { + maxV = v; + } + var qId = data[offset + 2]; + l = frame.components.push({ + h: h, + v: v, + quantizationTable: quantizationTables[qId], + }); + frame.componentIds[componentId] = l - 1; + offset += 3; + } + frame.maxH = maxH; + frame.maxV = maxV; + prepareComponents(frame); + break; + + case 65476: + var huffmanLength = readUint16(); + for (i = 2; i < huffmanLength; ) { + var huffmanTableSpec = data[offset++]; + var codeLengths = new Uint8Array(16); + var codeLengthSum = 0; + for (j = 0; j < 16; j++, offset++) { + codeLengthSum += codeLengths[j] = data[offset]; + } + var huffmanValues = new Uint8Array(codeLengthSum); + for (j = 0; j < codeLengthSum; j++, offset++) { + huffmanValues[j] = data[offset]; + } + i += 17 + codeLengthSum; + (huffmanTableSpec >> 4 === 0 + ? huffmanTablesDC + : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable( + codeLengths, + huffmanValues, + ); + } + break; + + case 65501: + readUint16(); + resetInterval = readUint16(); + break; + + case 65498: + var scanLength = readUint16(); + var selectorsCount = data[offset++]; + var components = [], + component; + for (i = 0; i < selectorsCount; i++) { + var componentIndex = frame.componentIds[data[offset++]]; + component = frame.components[componentIndex]; + var tableSpec = data[offset++]; + component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; + component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; + components.push(component); + } + var spectralStart = data[offset++]; + var spectralEnd = data[offset++]; + var successiveApproximation = data[offset++]; + var processed = decodeScan( + data, + offset, + frame, + components, + resetInterval, + spectralStart, + spectralEnd, + successiveApproximation >> 4, + successiveApproximation & 15, + ); + offset += processed; + break; + + case 65535: + if (data[offset] !== 255) { + offset--; + } + break; + + default: + if ( + data[offset - 3] === 255 && + data[offset - 2] >= 192 && + data[offset - 2] <= 254 + ) { + offset -= 3; + break; + } + throw "unknown JPEG marker " + fileMarker.toString(16); + } + fileMarker = readUint16(); + } + this.width = frame.samplesPerLine; + this.height = frame.scanLines; + this.jfif = jfif; + this.adobe = adobe; + this.components = []; + for (i = 0; i < frame.components.length; i++) { + component = frame.components[i]; + this.components.push({ + output: buildComponentData(frame, component), + scaleX: component.h / frame.maxH, + scaleY: component.v / frame.maxV, + blocksPerLine: component.blocksPerLine, + blocksPerColumn: component.blocksPerColumn, + }); + } + this.numComponents = this.components.length; + }, + _getLinearizedBlockData: function getLinearizedBlockData(width, height) { + var scaleX = this.width / width, + scaleY = this.height / height; + var component, componentScaleX, componentScaleY, blocksPerScanline; + var x, y, i, j, k; + var index; + var offset = 0; + var output; + var numComponents = this.components.length; + var dataLength = width * height * numComponents; + var data = new Uint8Array(dataLength); + var xScaleBlockOffset = new Uint32Array(width); + var mask3LSB = 4294967288; + for (i = 0; i < numComponents; i++) { + component = this.components[i]; + componentScaleX = component.scaleX * scaleX; + componentScaleY = component.scaleY * scaleY; + offset = i; + output = component.output; + blocksPerScanline = (component.blocksPerLine + 1) << 3; + for (x = 0; x < width; x++) { + j = 0 | (x * componentScaleX); + xScaleBlockOffset[x] = ((j & mask3LSB) << 3) | (j & 7); + } + for (y = 0; y < height; y++) { + j = 0 | (y * componentScaleY); + index = (blocksPerScanline * (j & mask3LSB)) | ((j & 7) << 3); + for (x = 0; x < width; x++) { + data[offset] = output[index + xScaleBlockOffset[x]]; + offset += numComponents; + } + } + } + var transform = this.decodeTransform; + if (transform) { + for (i = 0; i < dataLength; ) { + for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) { + data[i] = ((data[i] * transform[k]) >> 8) + transform[k + 1]; + } + } + } + return data; + }, + _isColorConversionNeeded: function isColorConversionNeeded() { + if (this.adobe && this.adobe.transformCode) { + return true; + } else if (this.numComponents === 3) { + return true; + } else { + return false; + } + }, + _convertYccToRgb: function convertYccToRgb(data) { + var Y, Cb, Cr; + for (var i = 0, length = data.length; i < length; i += 3) { + Y = data[i]; + Cb = data[i + 1]; + Cr = data[i + 2]; + data[i] = clamp0to255(Y - 179.456 + 1.402 * Cr); + data[i + 1] = clamp0to255(Y + 135.459 - 0.344 * Cb - 0.714 * Cr); + data[i + 2] = clamp0to255(Y - 226.816 + 1.772 * Cb); + } + return data; + }, + _convertYcckToRgb: function convertYcckToRgb(data) { + var Y, Cb, Cr, k; + var offset = 0; + for (var i = 0, length = data.length; i < length; i += 4) { + Y = data[i]; + Cb = data[i + 1]; + Cr = data[i + 2]; + k = data[i + 3]; + var r = + -122.67195406894 + + Cb * + (-660635669420364e-19 * Cb + + 0.000437130475926232 * Cr - + 54080610064599e-18 * Y + + 0.00048449797120281 * k - + 0.154362151871126) + + Cr * + (-0.000957964378445773 * Cr + + 0.000817076911346625 * Y - + 0.00477271405408747 * k + + 1.53380253221734) + + Y * + (0.000961250184130688 * Y - + 0.00266257332283933 * k + + 0.48357088451265) + + k * (-0.000336197177618394 * k + 0.484791561490776); + var g = + 107.268039397724 + + Cb * + (219927104525741e-19 * Cb - + 0.000640992018297945 * Cr + + 0.000659397001245577 * Y + + 0.000426105652938837 * k - + 0.176491792462875) + + Cr * + (-0.000778269941513683 * Cr + + 0.00130872261408275 * Y + + 0.000770482631801132 * k - + 0.151051492775562) + + Y * + (0.00126935368114843 * Y - + 0.00265090189010898 * k + + 0.25802910206845) + + k * (-0.000318913117588328 * k - 0.213742400323665); + var b = + -20.810012546947 + + Cb * + (-0.000570115196973677 * Cb - + 263409051004589e-19 * Cr + + 0.0020741088115012 * Y - + 0.00288260236853442 * k + + 0.814272968359295) + + Cr * + (-153496057440975e-19 * Cr - + 0.000132689043961446 * Y + + 0.000560833691242812 * k - + 0.195152027534049) + + Y * + (0.00174418132927582 * Y - + 0.00255243321439347 * k + + 0.116935020465145) + + k * (-0.000343531996510555 * k + 0.24165260232407); + data[offset++] = clamp0to255(r); + data[offset++] = clamp0to255(g); + data[offset++] = clamp0to255(b); + } + return data; + }, + _convertYcckToCmyk: function convertYcckToCmyk(data) { + var Y, Cb, Cr; + for (var i = 0, length = data.length; i < length; i += 4) { + Y = data[i]; + Cb = data[i + 1]; + Cr = data[i + 2]; + data[i] = clamp0to255(434.456 - Y - 1.402 * Cr); + data[i + 1] = clamp0to255(119.541 - Y + 0.344 * Cb + 0.714 * Cr); + data[i + 2] = clamp0to255(481.816 - Y - 1.772 * Cb); + } + return data; + }, + _convertCmykToRgb: function convertCmykToRgb(data) { + var c, m, y, k; + var offset = 0; + var min = -255 * 255 * 255; + var scale = 1 / 255 / 255; + for (var i = 0, length = data.length; i < length; i += 4) { + c = data[i]; + m = data[i + 1]; + y = data[i + 2]; + k = data[i + 3]; + var r = + c * + (-4.387332384609988 * c + + 54.48615194189176 * m + + 18.82290502165302 * y + + 212.25662451639585 * k - + 72734.4411664936) + + m * + (1.7149763477362134 * m - + 5.6096736904047315 * y - + 17.873870861415444 * k - + 1401.7366389350734) + + y * + (-2.5217340131683033 * y - + 21.248923337353073 * k + + 4465.541406466231) - + k * (21.86122147463605 * k + 48317.86113160301); + var g = + c * + (8.841041422036149 * c + + 60.118027045597366 * m + + 6.871425592049007 * y + + 31.159100130055922 * k - + 20220.756542821975) + + m * + (-15.310361306967817 * m + + 17.575251261109482 * y + + 131.35250912493976 * k - + 48691.05921601825) + + y * + (4.444339102852739 * y + + 9.8632861493405 * k - + 6341.191035517494) - + k * (20.737325471181034 * k + 47890.15695978492); + var b = + c * + (0.8842522430003296 * c + + 8.078677503112928 * m + + 30.89978309703729 * y - + 0.23883238689178934 * k - + 3616.812083916688) + + m * + (10.49593273432072 * m + + 63.02378494754052 * y + + 50.606957656360734 * k - + 28620.90484698408) + + y * + (0.03296041114873217 * y + + 115.60384449646641 * k - + 49363.43385999684) - + k * (22.33816807309886 * k + 45932.16563550634); + data[offset++] = r >= 0 ? 255 : r <= min ? 0 : (255 + r * scale) | 0; + data[offset++] = g >= 0 ? 255 : g <= min ? 0 : (255 + g * scale) | 0; + data[offset++] = b >= 0 ? 255 : b <= min ? 0 : (255 + b * scale) | 0; + } + return data; + }, + getData: function getData(width, height, forceRGBoutput) { + if (this.numComponents > 4) { + throw "Unsupported color mode"; + } + var data = this._getLinearizedBlockData(width, height); + if (this.numComponents === 3) { + return this._convertYccToRgb(data); + } else if (this.numComponents === 4) { + if (this._isColorConversionNeeded()) { + if (forceRGBoutput) { + return this._convertYcckToRgb(data); + } else { + return this._convertYcckToCmyk(data); + } + } else if (forceRGBoutput) { + return this._convertCmykToRgb(data); + } + } + return data; + }, + }; + return constructor; + })(); + ("use strict"); + var ArithmeticDecoder = (function ArithmeticDecoderClosure() { + var QeTable = [ + { + qe: 22017, + nmps: 1, + nlps: 1, + switchFlag: 1, + }, + { + qe: 13313, + nmps: 2, + nlps: 6, + switchFlag: 0, + }, + { + qe: 6145, + nmps: 3, + nlps: 9, + switchFlag: 0, + }, + { + qe: 2753, + nmps: 4, + nlps: 12, + switchFlag: 0, + }, + { + qe: 1313, + nmps: 5, + nlps: 29, + switchFlag: 0, + }, + { + qe: 545, + nmps: 38, + nlps: 33, + switchFlag: 0, + }, + { + qe: 22017, + nmps: 7, + nlps: 6, + switchFlag: 1, + }, + { + qe: 21505, + nmps: 8, + nlps: 14, + switchFlag: 0, + }, + { + qe: 18433, + nmps: 9, + nlps: 14, + switchFlag: 0, + }, + { + qe: 14337, + nmps: 10, + nlps: 14, + switchFlag: 0, + }, + { + qe: 12289, + nmps: 11, + nlps: 17, + switchFlag: 0, + }, + { + qe: 9217, + nmps: 12, + nlps: 18, + switchFlag: 0, + }, + { + qe: 7169, + nmps: 13, + nlps: 20, + switchFlag: 0, + }, + { + qe: 5633, + nmps: 29, + nlps: 21, + switchFlag: 0, + }, + { + qe: 22017, + nmps: 15, + nlps: 14, + switchFlag: 1, + }, + { + qe: 21505, + nmps: 16, + nlps: 14, + switchFlag: 0, + }, + { + qe: 20737, + nmps: 17, + nlps: 15, + switchFlag: 0, + }, + { + qe: 18433, + nmps: 18, + nlps: 16, + switchFlag: 0, + }, + { + qe: 14337, + nmps: 19, + nlps: 17, + switchFlag: 0, + }, + { + qe: 13313, + nmps: 20, + nlps: 18, + switchFlag: 0, + }, + { + qe: 12289, + nmps: 21, + nlps: 19, + switchFlag: 0, + }, + { + qe: 10241, + nmps: 22, + nlps: 19, + switchFlag: 0, + }, + { + qe: 9217, + nmps: 23, + nlps: 20, + switchFlag: 0, + }, + { + qe: 8705, + nmps: 24, + nlps: 21, + switchFlag: 0, + }, + { + qe: 7169, + nmps: 25, + nlps: 22, + switchFlag: 0, + }, + { + qe: 6145, + nmps: 26, + nlps: 23, + switchFlag: 0, + }, + { + qe: 5633, + nmps: 27, + nlps: 24, + switchFlag: 0, + }, + { + qe: 5121, + nmps: 28, + nlps: 25, + switchFlag: 0, + }, + { + qe: 4609, + nmps: 29, + nlps: 26, + switchFlag: 0, + }, + { + qe: 4353, + nmps: 30, + nlps: 27, + switchFlag: 0, + }, + { + qe: 2753, + nmps: 31, + nlps: 28, + switchFlag: 0, + }, + { + qe: 2497, + nmps: 32, + nlps: 29, + switchFlag: 0, + }, + { + qe: 2209, + nmps: 33, + nlps: 30, + switchFlag: 0, + }, + { + qe: 1313, + nmps: 34, + nlps: 31, + switchFlag: 0, + }, + { + qe: 1089, + nmps: 35, + nlps: 32, + switchFlag: 0, + }, + { + qe: 673, + nmps: 36, + nlps: 33, + switchFlag: 0, + }, + { + qe: 545, + nmps: 37, + nlps: 34, + switchFlag: 0, + }, + { + qe: 321, + nmps: 38, + nlps: 35, + switchFlag: 0, + }, + { + qe: 273, + nmps: 39, + nlps: 36, + switchFlag: 0, + }, + { + qe: 133, + nmps: 40, + nlps: 37, + switchFlag: 0, + }, + { + qe: 73, + nmps: 41, + nlps: 38, + switchFlag: 0, + }, + { + qe: 37, + nmps: 42, + nlps: 39, + switchFlag: 0, + }, + { + qe: 21, + nmps: 43, + nlps: 40, + switchFlag: 0, + }, + { + qe: 9, + nmps: 44, + nlps: 41, + switchFlag: 0, + }, + { + qe: 5, + nmps: 45, + nlps: 42, + switchFlag: 0, + }, + { + qe: 1, + nmps: 45, + nlps: 43, + switchFlag: 0, + }, + { + qe: 22017, + nmps: 46, + nlps: 46, + switchFlag: 0, + }, + ]; + function ArithmeticDecoder(data, start, end) { + this.data = data; + this.bp = start; + this.dataEnd = end; + this.chigh = data[start]; + this.clow = 0; + this.byteIn(); + this.chigh = ((this.chigh << 7) & 65535) | ((this.clow >> 9) & 127); + this.clow = (this.clow << 7) & 65535; + this.ct -= 7; + this.a = 32768; + } + ArithmeticDecoder.prototype = { + byteIn: function ArithmeticDecoder_byteIn() { + var data = this.data; + var bp = this.bp; + if (data[bp] === 255) { + var b1 = data[bp + 1]; + if (b1 > 143) { + this.clow += 65280; + this.ct = 8; + } else { + bp++; + this.clow += data[bp] << 9; + this.ct = 7; + this.bp = bp; + } + } else { + bp++; + this.clow += bp < this.dataEnd ? data[bp] << 8 : 65280; + this.ct = 8; + this.bp = bp; + } + if (this.clow > 65535) { + this.chigh += this.clow >> 16; + this.clow &= 65535; + } + }, + readBit: function ArithmeticDecoder_readBit(contexts, pos) { + var cx_index = contexts[pos] >> 1, + cx_mps = contexts[pos] & 1; + var qeTableIcx = QeTable[cx_index]; + var qeIcx = qeTableIcx.qe; + var d; + var a = this.a - qeIcx; + if (this.chigh < qeIcx) { + if (a < qeIcx) { + a = qeIcx; + d = cx_mps; + cx_index = qeTableIcx.nmps; + } else { + a = qeIcx; + d = 1 ^ cx_mps; + if (qeTableIcx.switchFlag === 1) { + cx_mps = d; + } + cx_index = qeTableIcx.nlps; + } + } else { + this.chigh -= qeIcx; + if ((a & 32768) !== 0) { + this.a = a; + return cx_mps; + } + if (a < qeIcx) { + d = 1 ^ cx_mps; + if (qeTableIcx.switchFlag === 1) { + cx_mps = d; + } + cx_index = qeTableIcx.nlps; + } else { + d = cx_mps; + cx_index = qeTableIcx.nmps; + } + } + do { + if (this.ct === 0) { + this.byteIn(); + } + a <<= 1; + this.chigh = ((this.chigh << 1) & 65535) | ((this.clow >> 15) & 1); + this.clow = (this.clow << 1) & 65535; + this.ct--; + } while ((a & 32768) === 0); + this.a = a; + contexts[pos] = (cx_index << 1) | cx_mps; + return d; + }, + }; + return ArithmeticDecoder; + })(); + ("use strict"); + var JpxImage = (function JpxImageClosure() { + var SubbandsGainLog2 = { + LL: 0, + LH: 1, + HL: 1, + HH: 2, + }; + function JpxImage() { + this.failOnCorruptedImage = false; + } + JpxImage.prototype = { + parse: function JpxImage_parse(data) { + var head = readUint16(data, 0); + if (head === 65359) { + this.parseCodestream(data, 0, data.length); + return; + } + var position = 0, + length = data.length; + while (position < length) { + var headerSize = 8; + var lbox = readUint32(data, position); + var tbox = readUint32(data, position + 4); + position += headerSize; + if (lbox === 1) { + lbox = + readUint32(data, position) * 4294967296 + + readUint32(data, position + 4); + position += 8; + headerSize += 8; + } + if (lbox === 0) { + lbox = length - position + headerSize; + } + if (lbox < headerSize) { + throw new Error("JPX Error: Invalid box field size"); + } + var dataLength = lbox - headerSize; + var jumpDataLength = true; + switch (tbox) { + case 1785737832: + jumpDataLength = false; + break; + + case 1668246642: + var method = data[position]; + var precedence = data[position + 1]; + var approximation = data[position + 2]; + if (method === 1) { + var colorspace = readUint32(data, position + 3); + switch (colorspace) { + case 16: + case 17: + case 18: + break; + + default: + warn("Unknown colorspace " + colorspace); + break; + } + } else if (method === 2) { + info("ICC profile not supported"); + } + break; + + case 1785737827: + this.parseCodestream(data, position, position + dataLength); + break; + + case 1783636e3: + if (218793738 !== readUint32(data, position)) { + warn("Invalid JP2 signature"); + } + break; + + case 1783634458: + case 1718909296: + case 1920099697: + case 1919251232: + case 1768449138: + break; + + default: + var headerType = String.fromCharCode( + (tbox >> 24) & 255, + (tbox >> 16) & 255, + (tbox >> 8) & 255, + tbox & 255, + ); + warn("Unsupported header type " + tbox + " (" + headerType + ")"); + break; + } + if (jumpDataLength) { + position += dataLength; + } + } + }, + parseImageProperties: function JpxImage_parseImageProperties(stream) { + var newByte = stream.getByte(); + while (newByte >= 0) { + var oldByte = newByte; + newByte = stream.getByte(); + var code = (oldByte << 8) | newByte; + if (code === 65361) { + stream.skip(4); + var Xsiz = stream.getInt32() >>> 0; + var Ysiz = stream.getInt32() >>> 0; + var XOsiz = stream.getInt32() >>> 0; + var YOsiz = stream.getInt32() >>> 0; + stream.skip(16); + var Csiz = stream.getUint16(); + this.width = Xsiz - XOsiz; + this.height = Ysiz - YOsiz; + this.componentsCount = Csiz; + this.bitsPerComponent = 8; + return; + } + } + throw new Error("JPX Error: No size marker found in JPX stream"); + }, + parseCodestream: function JpxImage_parseCodestream(data, start, end) { + var context = {}; + try { + var doNotRecover = false; + var position = start; + while (position + 1 < end) { + var code = readUint16(data, position); + position += 2; + var length = 0, + j, + sqcd, + spqcds, + spqcdSize, + scalarExpounded, + tile; + switch (code) { + case 65359: + context.mainHeader = true; + break; + + case 65497: + break; + + case 65361: + length = readUint16(data, position); + var siz = {}; + siz.Xsiz = readUint32(data, position + 4); + siz.Ysiz = readUint32(data, position + 8); + siz.XOsiz = readUint32(data, position + 12); + siz.YOsiz = readUint32(data, position + 16); + siz.XTsiz = readUint32(data, position + 20); + siz.YTsiz = readUint32(data, position + 24); + siz.XTOsiz = readUint32(data, position + 28); + siz.YTOsiz = readUint32(data, position + 32); + var componentsCount = readUint16(data, position + 36); + siz.Csiz = componentsCount; + var components = []; + j = position + 38; + for (var i = 0; i < componentsCount; i++) { + var component = { + precision: (data[j] & 127) + 1, + isSigned: !!(data[j] & 128), + XRsiz: data[j + 1], + YRsiz: data[j + 1], + }; + calculateComponentDimensions(component, siz); + components.push(component); + } + context.SIZ = siz; + context.components = components; + calculateTileGrids(context, components); + context.QCC = []; + context.COC = []; + break; + + case 65372: + length = readUint16(data, position); + var qcd = {}; + j = position + 2; + sqcd = data[j++]; + switch (sqcd & 31) { + case 0: + spqcdSize = 8; + scalarExpounded = true; + break; + + case 1: + spqcdSize = 16; + scalarExpounded = false; + break; + + case 2: + spqcdSize = 16; + scalarExpounded = true; + break; + + default: + throw new Error("JPX Error: Invalid SQcd value " + sqcd); + } + qcd.noQuantization = spqcdSize === 8; + qcd.scalarExpounded = scalarExpounded; + qcd.guardBits = sqcd >> 5; + spqcds = []; + while (j < length + position) { + var spqcd = {}; + if (spqcdSize === 8) { + spqcd.epsilon = data[j++] >> 3; + spqcd.mu = 0; + } else { + spqcd.epsilon = data[j] >> 3; + spqcd.mu = ((data[j] & 7) << 8) | data[j + 1]; + j += 2; + } + spqcds.push(spqcd); + } + qcd.SPqcds = spqcds; + if (context.mainHeader) { + context.QCD = qcd; + } else { + context.currentTile.QCD = qcd; + context.currentTile.QCC = []; + } + break; + + case 65373: + length = readUint16(data, position); + var qcc = {}; + j = position + 2; + var cqcc; + if (context.SIZ.Csiz < 257) { + cqcc = data[j++]; + } else { + cqcc = readUint16(data, j); + j += 2; + } + sqcd = data[j++]; + switch (sqcd & 31) { + case 0: + spqcdSize = 8; + scalarExpounded = true; + break; + + case 1: + spqcdSize = 16; + scalarExpounded = false; + break; + + case 2: + spqcdSize = 16; + scalarExpounded = true; + break; + + default: + throw new Error("JPX Error: Invalid SQcd value " + sqcd); + } + qcc.noQuantization = spqcdSize === 8; + qcc.scalarExpounded = scalarExpounded; + qcc.guardBits = sqcd >> 5; + spqcds = []; + while (j < length + position) { + spqcd = {}; + if (spqcdSize === 8) { + spqcd.epsilon = data[j++] >> 3; + spqcd.mu = 0; + } else { + spqcd.epsilon = data[j] >> 3; + spqcd.mu = ((data[j] & 7) << 8) | data[j + 1]; + j += 2; + } + spqcds.push(spqcd); + } + qcc.SPqcds = spqcds; + if (context.mainHeader) { + context.QCC[cqcc] = qcc; + } else { + context.currentTile.QCC[cqcc] = qcc; + } + break; + + case 65362: + length = readUint16(data, position); + var cod = {}; + j = position + 2; + var scod = data[j++]; + cod.entropyCoderWithCustomPrecincts = !!(scod & 1); + cod.sopMarkerUsed = !!(scod & 2); + cod.ephMarkerUsed = !!(scod & 4); + cod.progressionOrder = data[j++]; + cod.layersCount = readUint16(data, j); + j += 2; + cod.multipleComponentTransform = data[j++]; + cod.decompositionLevelsCount = data[j++]; + cod.xcb = (data[j++] & 15) + 2; + cod.ycb = (data[j++] & 15) + 2; + var blockStyle = data[j++]; + cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1); + cod.resetContextProbabilities = !!(blockStyle & 2); + cod.terminationOnEachCodingPass = !!(blockStyle & 4); + cod.verticalyStripe = !!(blockStyle & 8); + cod.predictableTermination = !!(blockStyle & 16); + cod.segmentationSymbolUsed = !!(blockStyle & 32); + cod.reversibleTransformation = data[j++]; + if (cod.entropyCoderWithCustomPrecincts) { + var precinctsSizes = []; + while (j < length + position) { + var precinctsSize = data[j++]; + precinctsSizes.push({ + PPx: precinctsSize & 15, + PPy: precinctsSize >> 4, + }); + } + cod.precinctsSizes = precinctsSizes; + } + var unsupported = []; + if (cod.selectiveArithmeticCodingBypass) { + unsupported.push("selectiveArithmeticCodingBypass"); + } + if (cod.resetContextProbabilities) { + unsupported.push("resetContextProbabilities"); + } + if (cod.terminationOnEachCodingPass) { + unsupported.push("terminationOnEachCodingPass"); + } + if (cod.verticalyStripe) { + unsupported.push("verticalyStripe"); + } + if (cod.predictableTermination) { + unsupported.push("predictableTermination"); + } + if (unsupported.length > 0) { + doNotRecover = true; + throw new Error( + "JPX Error: Unsupported COD options (" + + unsupported.join(", ") + + ")", + ); + } + if (context.mainHeader) { + context.COD = cod; + } else { + context.currentTile.COD = cod; + context.currentTile.COC = []; + } + break; + + case 65424: + length = readUint16(data, position); + tile = {}; + tile.index = readUint16(data, position + 2); + tile.length = readUint32(data, position + 4); + tile.dataEnd = tile.length + position - 2; + tile.partIndex = data[position + 8]; + tile.partsCount = data[position + 9]; + context.mainHeader = false; + if (tile.partIndex === 0) { + tile.COD = context.COD; + tile.COC = context.COC.slice(0); + tile.QCD = context.QCD; + tile.QCC = context.QCC.slice(0); + } + context.currentTile = tile; + break; + + case 65427: + tile = context.currentTile; + if (tile.partIndex === 0) { + initializeTile(context, tile.index); + buildPackets(context); + } + length = tile.dataEnd - position; + parseTilePackets(context, data, position, length); + break; + + case 65365: + case 65367: + case 65368: + case 65380: + length = readUint16(data, position); + break; + + case 65363: + throw new Error( + "JPX Error: Codestream code 0xFF53 (COC) is " + + "not implemented", + ); + + default: + throw new Error( + "JPX Error: Unknown codestream code: " + code.toString(16), + ); + } + position += length; + } + } catch (e) { + if (doNotRecover || this.failOnCorruptedImage) { + throw e; + } else { + warn("Trying to recover from " + e.message); + } + } + this.tiles = transformComponents(context); + this.width = context.SIZ.Xsiz - context.SIZ.XOsiz; + this.height = context.SIZ.Ysiz - context.SIZ.YOsiz; + this.componentsCount = context.SIZ.Csiz; + }, + }; + function calculateComponentDimensions(component, siz) { + component.x0 = Math.ceil(siz.XOsiz / component.XRsiz); + component.x1 = Math.ceil(siz.Xsiz / component.XRsiz); + component.y0 = Math.ceil(siz.YOsiz / component.YRsiz); + component.y1 = Math.ceil(siz.Ysiz / component.YRsiz); + component.width = component.x1 - component.x0; + component.height = component.y1 - component.y0; + } + function calculateTileGrids(context, components) { + var siz = context.SIZ; + var tile, + tiles = []; + var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz); + var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz); + for (var q = 0; q < numYtiles; q++) { + for (var p = 0; p < numXtiles; p++) { + tile = {}; + tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz); + tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz); + tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz); + tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz); + tile.width = tile.tx1 - tile.tx0; + tile.height = tile.ty1 - tile.ty0; + tile.components = []; + tiles.push(tile); + } + } + context.tiles = tiles; + var componentsCount = siz.Csiz; + for (var i = 0, ii = componentsCount; i < ii; i++) { + var component = components[i]; + for (var j = 0, jj = tiles.length; j < jj; j++) { + var tileComponent = {}; + tile = tiles[j]; + tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz); + tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz); + tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz); + tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz); + tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0; + tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0; + tile.components[i] = tileComponent; + } + } + } + function getBlocksDimensions(context, component, r) { + var codOrCoc = component.codingStyleParameters; + var result = {}; + if (!codOrCoc.entropyCoderWithCustomPrecincts) { + result.PPx = 15; + result.PPy = 15; + } else { + result.PPx = codOrCoc.precinctsSizes[r].PPx; + result.PPy = codOrCoc.precinctsSizes[r].PPy; + } + result.xcb_ = + r > 0 + ? Math.min(codOrCoc.xcb, result.PPx - 1) + : Math.min(codOrCoc.xcb, result.PPx); + result.ycb_ = + r > 0 + ? Math.min(codOrCoc.ycb, result.PPy - 1) + : Math.min(codOrCoc.ycb, result.PPy); + return result; + } + function buildPrecincts(context, resolution, dimensions) { + var precinctWidth = 1 << dimensions.PPx; + var precinctHeight = 1 << dimensions.PPy; + var isZeroRes = resolution.resLevel === 0; + var precinctWidthInSubband = 1 << (dimensions.PPx + (isZeroRes ? 0 : -1)); + var precinctHeightInSubband = + 1 << (dimensions.PPy + (isZeroRes ? 0 : -1)); + var numprecinctswide = + resolution.trx1 > resolution.trx0 + ? Math.ceil(resolution.trx1 / precinctWidth) - + Math.floor(resolution.trx0 / precinctWidth) + : 0; + var numprecinctshigh = + resolution.try1 > resolution.try0 + ? Math.ceil(resolution.try1 / precinctHeight) - + Math.floor(resolution.try0 / precinctHeight) + : 0; + var numprecincts = numprecinctswide * numprecinctshigh; + resolution.precinctParameters = { + precinctWidth: precinctWidth, + precinctHeight: precinctHeight, + numprecinctswide: numprecinctswide, + numprecinctshigh: numprecinctshigh, + numprecincts: numprecincts, + precinctWidthInSubband: precinctWidthInSubband, + precinctHeightInSubband: precinctHeightInSubband, + }; + } + function buildCodeblocks(context, subband, dimensions) { + var xcb_ = dimensions.xcb_; + var ycb_ = dimensions.ycb_; + var codeblockWidth = 1 << xcb_; + var codeblockHeight = 1 << ycb_; + var cbx0 = subband.tbx0 >> xcb_; + var cby0 = subband.tby0 >> ycb_; + var cbx1 = (subband.tbx1 + codeblockWidth - 1) >> xcb_; + var cby1 = (subband.tby1 + codeblockHeight - 1) >> ycb_; + var precinctParameters = subband.resolution.precinctParameters; + var codeblocks = []; + var precincts = []; + var i, j, codeblock, precinctNumber; + for (j = cby0; j < cby1; j++) { + for (i = cbx0; i < cbx1; i++) { + codeblock = { + cbx: i, + cby: j, + tbx0: codeblockWidth * i, + tby0: codeblockHeight * j, + tbx1: codeblockWidth * (i + 1), + tby1: codeblockHeight * (j + 1), + }; + codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0); + codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0); + codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1); + codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1); + var pi = Math.floor( + (codeblock.tbx0_ - subband.tbx0) / + precinctParameters.precinctWidthInSubband, + ); + var pj = Math.floor( + (codeblock.tby0_ - subband.tby0) / + precinctParameters.precinctHeightInSubband, + ); + precinctNumber = pi + pj * precinctParameters.numprecinctswide; + codeblock.precinctNumber = precinctNumber; + codeblock.subbandType = subband.type; + codeblock.Lblock = 3; + if ( + codeblock.tbx1_ <= codeblock.tbx0_ || + codeblock.tby1_ <= codeblock.tby0_ + ) { + continue; + } + codeblocks.push(codeblock); + var precinct = precincts[precinctNumber]; + if (precinct !== undefined) { + if (i < precinct.cbxMin) { + precinct.cbxMin = i; + } else if (i > precinct.cbxMax) { + precinct.cbxMax = i; + } + if (j < precinct.cbyMin) { + precinct.cbxMin = j; + } else if (j > precinct.cbyMax) { + precinct.cbyMax = j; + } + } else { + precincts[precinctNumber] = precinct = { + cbxMin: i, + cbyMin: j, + cbxMax: i, + cbyMax: j, + }; + } + codeblock.precinct = precinct; + } + } + subband.codeblockParameters = { + codeblockWidth: xcb_, + codeblockHeight: ycb_, + numcodeblockwide: cbx1 - cbx0 + 1, + numcodeblockhigh: cby1 - cby0 + 1, + }; + subband.codeblocks = codeblocks; + subband.precincts = precincts; + } + function createPacket(resolution, precinctNumber, layerNumber) { + var precinctCodeblocks = []; + var subbands = resolution.subbands; + for (var i = 0, ii = subbands.length; i < ii; i++) { + var subband = subbands[i]; + var codeblocks = subband.codeblocks; + for (var j = 0, jj = codeblocks.length; j < jj; j++) { + var codeblock = codeblocks[j]; + if (codeblock.precinctNumber !== precinctNumber) { + continue; + } + precinctCodeblocks.push(codeblock); + } + } + return { + layerNumber: layerNumber, + codeblocks: precinctCodeblocks, + }; + } + function LayerResolutionComponentPositionIterator(context) { + var siz = context.SIZ; + var tileIndex = context.currentTile.index; + var tile = context.tiles[tileIndex]; + var layersCount = tile.codingStyleDefaultParameters.layersCount; + var componentsCount = siz.Csiz; + var maxDecompositionLevelsCount = 0; + for (var q = 0; q < componentsCount; q++) { + maxDecompositionLevelsCount = Math.max( + maxDecompositionLevelsCount, + tile.components[q].codingStyleParameters.decompositionLevelsCount, + ); + } + var l = 0, + r = 0, + i = 0, + k = 0; + this.nextPacket = function JpxImage_nextPacket() { + for (; l < layersCount; l++) { + for (; r <= maxDecompositionLevelsCount; r++) { + for (; i < componentsCount; i++) { + var component = tile.components[i]; + if ( + r > component.codingStyleParameters.decompositionLevelsCount + ) { + continue; + } + var resolution = component.resolutions[r]; + var numprecincts = resolution.precinctParameters.numprecincts; + for (; k < numprecincts; ) { + var packet = createPacket(resolution, k, l); + k++; + return packet; + } + k = 0; + } + i = 0; + } + r = 0; + } + throw new Error("JPX Error: Out of packets"); + }; + } + function ResolutionLayerComponentPositionIterator(context) { + var siz = context.SIZ; + var tileIndex = context.currentTile.index; + var tile = context.tiles[tileIndex]; + var layersCount = tile.codingStyleDefaultParameters.layersCount; + var componentsCount = siz.Csiz; + var maxDecompositionLevelsCount = 0; + for (var q = 0; q < componentsCount; q++) { + maxDecompositionLevelsCount = Math.max( + maxDecompositionLevelsCount, + tile.components[q].codingStyleParameters.decompositionLevelsCount, + ); + } + var r = 0, + l = 0, + i = 0, + k = 0; + this.nextPacket = function JpxImage_nextPacket() { + for (; r <= maxDecompositionLevelsCount; r++) { + for (; l < layersCount; l++) { + for (; i < componentsCount; i++) { + var component = tile.components[i]; + if ( + r > component.codingStyleParameters.decompositionLevelsCount + ) { + continue; + } + var resolution = component.resolutions[r]; + var numprecincts = resolution.precinctParameters.numprecincts; + for (; k < numprecincts; ) { + var packet = createPacket(resolution, k, l); + k++; + return packet; + } + k = 0; + } + i = 0; + } + l = 0; + } + throw new Error("JPX Error: Out of packets"); + }; + } + function ResolutionPositionComponentLayerIterator(context) { + var siz = context.SIZ; + var tileIndex = context.currentTile.index; + var tile = context.tiles[tileIndex]; + var layersCount = tile.codingStyleDefaultParameters.layersCount; + var componentsCount = siz.Csiz; + var l, r, c, p; + var maxDecompositionLevelsCount = 0; + for (c = 0; c < componentsCount; c++) { + var component = tile.components[c]; + maxDecompositionLevelsCount = Math.max( + maxDecompositionLevelsCount, + component.codingStyleParameters.decompositionLevelsCount, + ); + } + var maxNumPrecinctsInLevel = new Int32Array( + maxDecompositionLevelsCount + 1, + ); + for (r = 0; r <= maxDecompositionLevelsCount; ++r) { + var maxNumPrecincts = 0; + for (c = 0; c < componentsCount; ++c) { + var resolutions = tile.components[c].resolutions; + if (r < resolutions.length) { + maxNumPrecincts = Math.max( + maxNumPrecincts, + resolutions[r].precinctParameters.numprecincts, + ); + } + } + maxNumPrecinctsInLevel[r] = maxNumPrecincts; + } + l = 0; + r = 0; + c = 0; + p = 0; + this.nextPacket = function JpxImage_nextPacket() { + for (; r <= maxDecompositionLevelsCount; r++) { + for (; p < maxNumPrecinctsInLevel[r]; p++) { + for (; c < componentsCount; c++) { + var component = tile.components[c]; + if ( + r > component.codingStyleParameters.decompositionLevelsCount + ) { + continue; + } + var resolution = component.resolutions[r]; + var numprecincts = resolution.precinctParameters.numprecincts; + if (p >= numprecincts) { + continue; + } + for (; l < layersCount; ) { + var packet = createPacket(resolution, p, l); + l++; + return packet; + } + l = 0; + } + c = 0; + } + p = 0; + } + throw new Error("JPX Error: Out of packets"); + }; + } + function PositionComponentResolutionLayerIterator(context) { + var siz = context.SIZ; + var tileIndex = context.currentTile.index; + var tile = context.tiles[tileIndex]; + var layersCount = tile.codingStyleDefaultParameters.layersCount; + var componentsCount = siz.Csiz; + var precinctsSizes = getPrecinctSizesInImageScale(tile); + var precinctsIterationSizes = precinctsSizes; + var l = 0, + r = 0, + c = 0, + px = 0, + py = 0; + this.nextPacket = function JpxImage_nextPacket() { + for (; py < precinctsIterationSizes.maxNumHigh; py++) { + for (; px < precinctsIterationSizes.maxNumWide; px++) { + for (; c < componentsCount; c++) { + var component = tile.components[c]; + var decompositionLevelsCount = + component.codingStyleParameters.decompositionLevelsCount; + for (; r <= decompositionLevelsCount; r++) { + var resolution = component.resolutions[r]; + var sizeInImageScale = + precinctsSizes.components[c].resolutions[r]; + var k = getPrecinctIndexIfExist( + px, + py, + sizeInImageScale, + precinctsIterationSizes, + resolution, + ); + if (k === null) { + continue; + } + for (; l < layersCount; ) { + var packet = createPacket(resolution, k, l); + l++; + return packet; + } + l = 0; + } + r = 0; + } + c = 0; + } + px = 0; + } + throw new Error("JPX Error: Out of packets"); + }; + } + function ComponentPositionResolutionLayerIterator(context) { + var siz = context.SIZ; + var tileIndex = context.currentTile.index; + var tile = context.tiles[tileIndex]; + var layersCount = tile.codingStyleDefaultParameters.layersCount; + var componentsCount = siz.Csiz; + var precinctsSizes = getPrecinctSizesInImageScale(tile); + var l = 0, + r = 0, + c = 0, + px = 0, + py = 0; + this.nextPacket = function JpxImage_nextPacket() { + for (; c < componentsCount; ++c) { + var component = tile.components[c]; + var precinctsIterationSizes = precinctsSizes.components[c]; + var decompositionLevelsCount = + component.codingStyleParameters.decompositionLevelsCount; + for (; py < precinctsIterationSizes.maxNumHigh; py++) { + for (; px < precinctsIterationSizes.maxNumWide; px++) { + for (; r <= decompositionLevelsCount; r++) { + var resolution = component.resolutions[r]; + var sizeInImageScale = precinctsIterationSizes.resolutions[r]; + var k = getPrecinctIndexIfExist( + px, + py, + sizeInImageScale, + precinctsIterationSizes, + resolution, + ); + if (k === null) { + continue; + } + for (; l < layersCount; ) { + var packet = createPacket(resolution, k, l); + l++; + return packet; + } + l = 0; + } + r = 0; + } + px = 0; + } + py = 0; + } + throw new Error("JPX Error: Out of packets"); + }; + } + function getPrecinctIndexIfExist( + pxIndex, + pyIndex, + sizeInImageScale, + precinctIterationSizes, + resolution, + ) { + var posX = pxIndex * precinctIterationSizes.minWidth; + var posY = pyIndex * precinctIterationSizes.minHeight; + if ( + posX % sizeInImageScale.width !== 0 || + posY % sizeInImageScale.height !== 0 + ) { + return null; + } + var startPrecinctRowIndex = + (posY / sizeInImageScale.width) * + resolution.precinctParameters.numprecinctswide; + return posX / sizeInImageScale.height + startPrecinctRowIndex; + } + function getPrecinctSizesInImageScale(tile) { + var componentsCount = tile.components.length; + var minWidth = Number.MAX_VALUE; + var minHeight = Number.MAX_VALUE; + var maxNumWide = 0; + var maxNumHigh = 0; + var sizePerComponent = new Array(componentsCount); + for (var c = 0; c < componentsCount; c++) { + var component = tile.components[c]; + var decompositionLevelsCount = + component.codingStyleParameters.decompositionLevelsCount; + var sizePerResolution = new Array(decompositionLevelsCount + 1); + var minWidthCurrentComponent = Number.MAX_VALUE; + var minHeightCurrentComponent = Number.MAX_VALUE; + var maxNumWideCurrentComponent = 0; + var maxNumHighCurrentComponent = 0; + var scale = 1; + for (var r = decompositionLevelsCount; r >= 0; --r) { + var resolution = component.resolutions[r]; + var widthCurrentResolution = + scale * resolution.precinctParameters.precinctWidth; + var heightCurrentResolution = + scale * resolution.precinctParameters.precinctHeight; + minWidthCurrentComponent = Math.min( + minWidthCurrentComponent, + widthCurrentResolution, + ); + minHeightCurrentComponent = Math.min( + minHeightCurrentComponent, + heightCurrentResolution, + ); + maxNumWideCurrentComponent = Math.max( + maxNumWideCurrentComponent, + resolution.precinctParameters.numprecinctswide, + ); + maxNumHighCurrentComponent = Math.max( + maxNumHighCurrentComponent, + resolution.precinctParameters.numprecinctshigh, + ); + sizePerResolution[r] = { + width: widthCurrentResolution, + height: heightCurrentResolution, + }; + scale <<= 1; + } + minWidth = Math.min(minWidth, minWidthCurrentComponent); + minHeight = Math.min(minHeight, minHeightCurrentComponent); + maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent); + maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent); + sizePerComponent[c] = { + resolutions: sizePerResolution, + minWidth: minWidthCurrentComponent, + minHeight: minHeightCurrentComponent, + maxNumWide: maxNumWideCurrentComponent, + maxNumHigh: maxNumHighCurrentComponent, + }; + } + return { + components: sizePerComponent, + minWidth: minWidth, + minHeight: minHeight, + maxNumWide: maxNumWide, + maxNumHigh: maxNumHigh, + }; + } + function buildPackets(context) { + var siz = context.SIZ; + var tileIndex = context.currentTile.index; + var tile = context.tiles[tileIndex]; + var componentsCount = siz.Csiz; + for (var c = 0; c < componentsCount; c++) { + var component = tile.components[c]; + var decompositionLevelsCount = + component.codingStyleParameters.decompositionLevelsCount; + var resolutions = []; + var subbands = []; + for (var r = 0; r <= decompositionLevelsCount; r++) { + var blocksDimensions = getBlocksDimensions(context, component, r); + var resolution = {}; + var scale = 1 << (decompositionLevelsCount - r); + resolution.trx0 = Math.ceil(component.tcx0 / scale); + resolution.try0 = Math.ceil(component.tcy0 / scale); + resolution.trx1 = Math.ceil(component.tcx1 / scale); + resolution.try1 = Math.ceil(component.tcy1 / scale); + resolution.resLevel = r; + buildPrecincts(context, resolution, blocksDimensions); + resolutions.push(resolution); + var subband; + if (r === 0) { + subband = {}; + subband.type = "LL"; + subband.tbx0 = Math.ceil(component.tcx0 / scale); + subband.tby0 = Math.ceil(component.tcy0 / scale); + subband.tbx1 = Math.ceil(component.tcx1 / scale); + subband.tby1 = Math.ceil(component.tcy1 / scale); + subband.resolution = resolution; + buildCodeblocks(context, subband, blocksDimensions); + subbands.push(subband); + resolution.subbands = [subband]; + } else { + var bscale = 1 << (decompositionLevelsCount - r + 1); + var resolutionSubbands = []; + subband = {}; + subband.type = "HL"; + subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); + subband.tby0 = Math.ceil(component.tcy0 / bscale); + subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); + subband.tby1 = Math.ceil(component.tcy1 / bscale); + subband.resolution = resolution; + buildCodeblocks(context, subband, blocksDimensions); + subbands.push(subband); + resolutionSubbands.push(subband); + subband = {}; + subband.type = "LH"; + subband.tbx0 = Math.ceil(component.tcx0 / bscale); + subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); + subband.tbx1 = Math.ceil(component.tcx1 / bscale); + subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); + subband.resolution = resolution; + buildCodeblocks(context, subband, blocksDimensions); + subbands.push(subband); + resolutionSubbands.push(subband); + subband = {}; + subband.type = "HH"; + subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); + subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); + subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); + subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); + subband.resolution = resolution; + buildCodeblocks(context, subband, blocksDimensions); + subbands.push(subband); + resolutionSubbands.push(subband); + resolution.subbands = resolutionSubbands; + } + } + component.resolutions = resolutions; + component.subbands = subbands; + } + var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder; + switch (progressionOrder) { + case 0: + tile.packetsIterator = new LayerResolutionComponentPositionIterator( + context, + ); + break; + + case 1: + tile.packetsIterator = new ResolutionLayerComponentPositionIterator( + context, + ); + break; + + case 2: + tile.packetsIterator = new ResolutionPositionComponentLayerIterator( + context, + ); + break; + + case 3: + tile.packetsIterator = new PositionComponentResolutionLayerIterator( + context, + ); + break; + + case 4: + tile.packetsIterator = new ComponentPositionResolutionLayerIterator( + context, + ); + break; + + default: + throw new Error( + "JPX Error: Unsupported progression order " + progressionOrder, + ); + } + } + function parseTilePackets(context, data, offset, dataLength) { + var position = 0; + var buffer, + bufferSize = 0, + skipNextBit = false; + function readBits(count) { + while (bufferSize < count) { + var b = data[offset + position]; + position++; + if (skipNextBit) { + buffer = (buffer << 7) | b; + bufferSize += 7; + skipNextBit = false; + } else { + buffer = (buffer << 8) | b; + bufferSize += 8; + } + if (b === 255) { + skipNextBit = true; + } + } + bufferSize -= count; + return (buffer >>> bufferSize) & ((1 << count) - 1); + } + function skipMarkerIfEqual(value) { + if ( + data[offset + position - 1] === 255 && + data[offset + position] === value + ) { + skipBytes(1); + return true; + } else if ( + data[offset + position] === 255 && + data[offset + position + 1] === value + ) { + skipBytes(2); + return true; + } + return false; + } + function skipBytes(count) { + position += count; + } + function alignToByte() { + bufferSize = 0; + if (skipNextBit) { + position++; + skipNextBit = false; + } + } + function readCodingpasses() { + if (readBits(1) === 0) { + return 1; + } + if (readBits(1) === 0) { + return 2; + } + var value = readBits(2); + if (value < 3) { + return value + 3; + } + value = readBits(5); + if (value < 31) { + return value + 6; + } + value = readBits(7); + return value + 37; + } + var tileIndex = context.currentTile.index; + var tile = context.tiles[tileIndex]; + var sopMarkerUsed = context.COD.sopMarkerUsed; + var ephMarkerUsed = context.COD.ephMarkerUsed; + var packetsIterator = tile.packetsIterator; + while (position < dataLength) { + alignToByte(); + if (sopMarkerUsed && skipMarkerIfEqual(145)) { + skipBytes(4); + } + var packet = packetsIterator.nextPacket(); + if (!readBits(1)) { + continue; + } + var layerNumber = packet.layerNumber; + var queue = [], + codeblock; + for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) { + codeblock = packet.codeblocks[i]; + var precinct = codeblock.precinct; + var codeblockColumn = codeblock.cbx - precinct.cbxMin; + var codeblockRow = codeblock.cby - precinct.cbyMin; + var codeblockIncluded = false; + var firstTimeInclusion = false; + var valueReady; + if (codeblock["included"] !== undefined) { + codeblockIncluded = !!readBits(1); + } else { + precinct = codeblock.precinct; + var inclusionTree, zeroBitPlanesTree; + if (precinct["inclusionTree"] !== undefined) { + inclusionTree = precinct.inclusionTree; + } else { + var width = precinct.cbxMax - precinct.cbxMin + 1; + var height = precinct.cbyMax - precinct.cbyMin + 1; + inclusionTree = new InclusionTree(width, height, layerNumber); + zeroBitPlanesTree = new TagTree(width, height); + precinct.inclusionTree = inclusionTree; + precinct.zeroBitPlanesTree = zeroBitPlanesTree; + } + if ( + inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber) + ) { + while (true) { + if (readBits(1)) { + valueReady = !inclusionTree.nextLevel(); + if (valueReady) { + codeblock.included = true; + codeblockIncluded = firstTimeInclusion = true; + break; + } + } else { + inclusionTree.incrementValue(layerNumber); + break; + } + } + } + } + if (!codeblockIncluded) { + continue; + } + if (firstTimeInclusion) { + zeroBitPlanesTree = precinct.zeroBitPlanesTree; + zeroBitPlanesTree.reset(codeblockColumn, codeblockRow); + while (true) { + if (readBits(1)) { + valueReady = !zeroBitPlanesTree.nextLevel(); + if (valueReady) { + break; + } + } else { + zeroBitPlanesTree.incrementValue(); + } + } + codeblock.zeroBitPlanes = zeroBitPlanesTree.value; + } + var codingpasses = readCodingpasses(); + while (readBits(1)) { + codeblock.Lblock++; + } + var codingpassesLog2 = log2(codingpasses); + var bits = + (codingpasses < 1 << codingpassesLog2 + ? codingpassesLog2 - 1 + : codingpassesLog2) + codeblock.Lblock; + var codedDataLength = readBits(bits); + queue.push({ + codeblock: codeblock, + codingpasses: codingpasses, + dataLength: codedDataLength, + }); + } + alignToByte(); + if (ephMarkerUsed) { + skipMarkerIfEqual(146); + } + while (queue.length > 0) { + var packetItem = queue.shift(); + codeblock = packetItem.codeblock; + if (codeblock["data"] === undefined) { + codeblock.data = []; + } + codeblock.data.push({ + data: data, + start: offset + position, + end: offset + position + packetItem.dataLength, + codingpasses: packetItem.codingpasses, + }); + position += packetItem.dataLength; + } + } + return position; + } + function copyCoefficients( + coefficients, + levelWidth, + levelHeight, + subband, + delta, + mb, + reversible, + segmentationSymbolUsed, + ) { + var x0 = subband.tbx0; + var y0 = subband.tby0; + var width = subband.tbx1 - subband.tbx0; + var codeblocks = subband.codeblocks; + var right = subband.type.charAt(0) === "H" ? 1 : 0; + var bottom = subband.type.charAt(1) === "H" ? levelWidth : 0; + for (var i = 0, ii = codeblocks.length; i < ii; ++i) { + var codeblock = codeblocks[i]; + var blockWidth = codeblock.tbx1_ - codeblock.tbx0_; + var blockHeight = codeblock.tby1_ - codeblock.tby0_; + if (blockWidth === 0 || blockHeight === 0) { + continue; + } + if (codeblock["data"] === undefined) { + continue; + } + var bitModel, currentCodingpassType; + bitModel = new BitModel( + blockWidth, + blockHeight, + codeblock.subbandType, + codeblock.zeroBitPlanes, + mb, + ); + currentCodingpassType = 2; + var data = codeblock.data, + totalLength = 0, + codingpasses = 0; + var j, jj, dataItem; + for (j = 0, jj = data.length; j < jj; j++) { + dataItem = data[j]; + totalLength += dataItem.end - dataItem.start; + codingpasses += dataItem.codingpasses; + } + var encodedData = new Uint8Array(totalLength); + var position = 0; + for (j = 0, jj = data.length; j < jj; j++) { + dataItem = data[j]; + var chunk = dataItem.data.subarray(dataItem.start, dataItem.end); + encodedData.set(chunk, position); + position += chunk.length; + } + var decoder = new ArithmeticDecoder(encodedData, 0, totalLength); + bitModel.setDecoder(decoder); + for (j = 0; j < codingpasses; j++) { + switch (currentCodingpassType) { + case 0: + bitModel.runSignificancePropogationPass(); + break; + + case 1: + bitModel.runMagnitudeRefinementPass(); + break; + + case 2: + bitModel.runCleanupPass(); + if (segmentationSymbolUsed) { + bitModel.checkSegmentationSymbol(); + } + break; + } + currentCodingpassType = (currentCodingpassType + 1) % 3; + } + var offset = codeblock.tbx0_ - x0 + (codeblock.tby0_ - y0) * width; + var sign = bitModel.coefficentsSign; + var magnitude = bitModel.coefficentsMagnitude; + var bitsDecoded = bitModel.bitsDecoded; + var magnitudeCorrection = reversible ? 0 : 0.5; + var k, n, nb; + position = 0; + var interleave = subband.type !== "LL"; + for (j = 0; j < blockHeight; j++) { + var row = (offset / width) | 0; + var levelOffset = 2 * row * (levelWidth - width) + right + bottom; + for (k = 0; k < blockWidth; k++) { + n = magnitude[position]; + if (n !== 0) { + n = (n + magnitudeCorrection) * delta; + if (sign[position] !== 0) { + n = -n; + } + nb = bitsDecoded[position]; + var pos = interleave ? levelOffset + (offset << 1) : offset; + if (reversible && nb >= mb) { + coefficients[pos] = n; + } else { + coefficients[pos] = n * (1 << (mb - nb)); + } + } + offset++; + position++; + } + offset += width - blockWidth; + } + } + } + function transformTile(context, tile, c) { + var component = tile.components[c]; + var codingStyleParameters = component.codingStyleParameters; + var quantizationParameters = component.quantizationParameters; + var decompositionLevelsCount = + codingStyleParameters.decompositionLevelsCount; + var spqcds = quantizationParameters.SPqcds; + var scalarExpounded = quantizationParameters.scalarExpounded; + var guardBits = quantizationParameters.guardBits; + var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed; + var precision = context.components[c].precision; + var reversible = codingStyleParameters.reversibleTransformation; + var transform = reversible + ? new ReversibleTransform() + : new IrreversibleTransform(); + var subbandCoefficients = []; + var b = 0; + for (var i = 0; i <= decompositionLevelsCount; i++) { + var resolution = component.resolutions[i]; + var width = resolution.trx1 - resolution.trx0; + var height = resolution.try1 - resolution.try0; + var coefficients = new Float32Array(width * height); + for (var j = 0, jj = resolution.subbands.length; j < jj; j++) { + var mu, epsilon; + if (!scalarExpounded) { + mu = spqcds[0].mu; + epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0); + } else { + mu = spqcds[b].mu; + epsilon = spqcds[b].epsilon; + b++; + } + var subband = resolution.subbands[j]; + var gainLog2 = SubbandsGainLog2[subband.type]; + var delta = reversible + ? 1 + : Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048); + var mb = guardBits + epsilon - 1; + copyCoefficients( + coefficients, + width, + height, + subband, + delta, + mb, + reversible, + segmentationSymbolUsed, + ); + } + subbandCoefficients.push({ + width: width, + height: height, + items: coefficients, + }); + } + var result = transform.calculate( + subbandCoefficients, + component.tcx0, + component.tcy0, + ); + return { + left: component.tcx0, + top: component.tcy0, + width: result.width, + height: result.height, + items: result.items, + }; + } + function transformComponents(context) { + var siz = context.SIZ; + var components = context.components; + var componentsCount = siz.Csiz; + var resultImages = []; + for (var i = 0, ii = context.tiles.length; i < ii; i++) { + var tile = context.tiles[i]; + var transformedTiles = []; + var c; + for (c = 0; c < componentsCount; c++) { + transformedTiles[c] = transformTile(context, tile, c); + } + var tile0 = transformedTiles[0]; + var out = new Uint8Array(tile0.items.length * componentsCount); + var result = { + left: tile0.left, + top: tile0.top, + width: tile0.width, + height: tile0.height, + items: out, + }; + var shift, offset, max, min, maxK; + var pos = 0, + j, + jj, + y0, + y1, + y2, + r, + g, + b, + k, + val; + if (tile.codingStyleDefaultParameters.multipleComponentTransform) { + var fourComponents = componentsCount === 4; + var y0items = transformedTiles[0].items; + var y1items = transformedTiles[1].items; + var y2items = transformedTiles[2].items; + var y3items = fourComponents ? transformedTiles[3].items : null; + shift = components[0].precision - 8; + offset = (128 << shift) + 0.5; + max = 255 * (1 << shift); + maxK = max * 0.5; + min = -maxK; + var component0 = tile.components[0]; + var alpha01 = componentsCount - 3; + jj = y0items.length; + if (!component0.codingStyleParameters.reversibleTransformation) { + for (j = 0; j < jj; j++, pos += alpha01) { + y0 = y0items[j] + offset; + y1 = y1items[j]; + y2 = y2items[j]; + r = y0 + 1.402 * y2; + g = y0 - 0.34413 * y1 - 0.71414 * y2; + b = y0 + 1.772 * y1; + out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift; + out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift; + out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift; + } + } else { + for (j = 0; j < jj; j++, pos += alpha01) { + y0 = y0items[j] + offset; + y1 = y1items[j]; + y2 = y2items[j]; + g = y0 - ((y2 + y1) >> 2); + r = g + y2; + b = g + y1; + out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift; + out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift; + out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift; + } + } + if (fourComponents) { + for (j = 0, pos = 3; j < jj; j++, pos += 4) { + k = y3items[j]; + out[pos] = k <= min ? 0 : k >= maxK ? 255 : (k + offset) >> shift; + } + } + } else { + for (c = 0; c < componentsCount; c++) { + var items = transformedTiles[c].items; + shift = components[c].precision - 8; + offset = (128 << shift) + 0.5; + max = 127.5 * (1 << shift); + min = -max; + for (pos = c, j = 0, jj = items.length; j < jj; j++) { + val = items[j]; + out[pos] = + val <= min ? 0 : val >= max ? 255 : (val + offset) >> shift; + pos += componentsCount; + } + } + } + resultImages.push(result); + } + return resultImages; + } + function initializeTile(context, tileIndex) { + var siz = context.SIZ; + var componentsCount = siz.Csiz; + var tile = context.tiles[tileIndex]; + for (var c = 0; c < componentsCount; c++) { + var component = tile.components[c]; + var qcdOrQcc = + context.currentTile.QCC[c] !== undefined + ? context.currentTile.QCC[c] + : context.currentTile.QCD; + component.quantizationParameters = qcdOrQcc; + var codOrCoc = + context.currentTile.COC[c] !== undefined + ? context.currentTile.COC[c] + : context.currentTile.COD; + component.codingStyleParameters = codOrCoc; + } + tile.codingStyleDefaultParameters = context.currentTile.COD; + } + var TagTree = (function TagTreeClosure() { + function TagTree(width, height) { + var levelsLength = log2(Math.max(width, height)) + 1; + this.levels = []; + for (var i = 0; i < levelsLength; i++) { + var level = { + width: width, + height: height, + items: [], + }; + this.levels.push(level); + width = Math.ceil(width / 2); + height = Math.ceil(height / 2); + } + } + TagTree.prototype = { + reset: function TagTree_reset(i, j) { + var currentLevel = 0, + value = 0, + level; + while (currentLevel < this.levels.length) { + level = this.levels[currentLevel]; + var index = i + j * level.width; + if (level.items[index] !== undefined) { + value = level.items[index]; + break; + } + level.index = index; + i >>= 1; + j >>= 1; + currentLevel++; + } + currentLevel--; + level = this.levels[currentLevel]; + level.items[level.index] = value; + this.currentLevel = currentLevel; + delete this.value; + }, + incrementValue: function TagTree_incrementValue() { + var level = this.levels[this.currentLevel]; + level.items[level.index]++; + }, + nextLevel: function TagTree_nextLevel() { + var currentLevel = this.currentLevel; + var level = this.levels[currentLevel]; + var value = level.items[level.index]; + currentLevel--; + if (currentLevel < 0) { + this.value = value; + return false; + } + this.currentLevel = currentLevel; + level = this.levels[currentLevel]; + level.items[level.index] = value; + return true; + }, + }; + return TagTree; + })(); + var InclusionTree = (function InclusionTreeClosure() { + function InclusionTree(width, height, defaultValue) { + var levelsLength = log2(Math.max(width, height)) + 1; + this.levels = []; + for (var i = 0; i < levelsLength; i++) { + var items = new Uint8Array(width * height); + for (var j = 0, jj = items.length; j < jj; j++) { + items[j] = defaultValue; + } + var level = { + width: width, + height: height, + items: items, + }; + this.levels.push(level); + width = Math.ceil(width / 2); + height = Math.ceil(height / 2); + } + } + InclusionTree.prototype = { + reset: function InclusionTree_reset(i, j, stopValue) { + var currentLevel = 0; + while (currentLevel < this.levels.length) { + var level = this.levels[currentLevel]; + var index = i + j * level.width; + level.index = index; + var value = level.items[index]; + if (value === 255) { + break; + } + if (value > stopValue) { + this.currentLevel = currentLevel; + this.propagateValues(); + return false; + } + i >>= 1; + j >>= 1; + currentLevel++; + } + this.currentLevel = currentLevel - 1; + return true; + }, + incrementValue: function InclusionTree_incrementValue(stopValue) { + var level = this.levels[this.currentLevel]; + level.items[level.index] = stopValue + 1; + this.propagateValues(); + }, + propagateValues: function InclusionTree_propagateValues() { + var levelIndex = this.currentLevel; + var level = this.levels[levelIndex]; + var currentValue = level.items[level.index]; + while (--levelIndex >= 0) { + level = this.levels[levelIndex]; + level.items[level.index] = currentValue; + } + }, + nextLevel: function InclusionTree_nextLevel() { + var currentLevel = this.currentLevel; + var level = this.levels[currentLevel]; + var value = level.items[level.index]; + level.items[level.index] = 255; + currentLevel--; + if (currentLevel < 0) { + return false; + } + this.currentLevel = currentLevel; + level = this.levels[currentLevel]; + level.items[level.index] = value; + return true; + }, + }; + return InclusionTree; + })(); + var BitModel = (function BitModelClosure() { + var UNIFORM_CONTEXT = 17; + var RUNLENGTH_CONTEXT = 18; + var LLAndLHContextsLabel = new Uint8Array([ + 0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, + 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, + 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, + 4, 7, 8, + ]); + var HLContextLabel = new Uint8Array([ + 0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, + 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, + 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, + 8, 8, 8, + ]); + var HHContextLabel = new Uint8Array([ + 0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, + 5, 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, + 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, + 8, 8, 8, + ]); + function BitModel(width, height, subband, zeroBitPlanes, mb) { + this.width = width; + this.height = height; + this.contextLabelTable = + subband === "HH" + ? HHContextLabel + : subband === "HL" + ? HLContextLabel + : LLAndLHContextsLabel; + var coefficientCount = width * height; + this.neighborsSignificance = new Uint8Array(coefficientCount); + this.coefficentsSign = new Uint8Array(coefficientCount); + this.coefficentsMagnitude = + mb > 14 + ? new Uint32Array(coefficientCount) + : mb > 6 + ? new Uint16Array(coefficientCount) + : new Uint8Array(coefficientCount); + this.processingFlags = new Uint8Array(coefficientCount); + var bitsDecoded = new Uint8Array(coefficientCount); + if (zeroBitPlanes !== 0) { + for (var i = 0; i < coefficientCount; i++) { + bitsDecoded[i] = zeroBitPlanes; + } + } + this.bitsDecoded = bitsDecoded; + this.reset(); + } + BitModel.prototype = { + setDecoder: function BitModel_setDecoder(decoder) { + this.decoder = decoder; + }, + reset: function BitModel_reset() { + this.contexts = new Int8Array(19); + this.contexts[0] = (4 << 1) | 0; + this.contexts[UNIFORM_CONTEXT] = (46 << 1) | 0; + this.contexts[RUNLENGTH_CONTEXT] = (3 << 1) | 0; + }, + setNeighborsSignificance: function BitModel_setNeighborsSignificance( + row, + column, + index, + ) { + var neighborsSignificance = this.neighborsSignificance; + var width = this.width, + height = this.height; + var left = column > 0; + var right = column + 1 < width; + var i; + if (row > 0) { + i = index - width; + if (left) { + neighborsSignificance[i - 1] += 16; + } + if (right) { + neighborsSignificance[i + 1] += 16; + } + neighborsSignificance[i] += 4; + } + if (row + 1 < height) { + i = index + width; + if (left) { + neighborsSignificance[i - 1] += 16; + } + if (right) { + neighborsSignificance[i + 1] += 16; + } + neighborsSignificance[i] += 4; + } + if (left) { + neighborsSignificance[index - 1] += 1; + } + if (right) { + neighborsSignificance[index + 1] += 1; + } + neighborsSignificance[index] |= 128; + }, + runSignificancePropogationPass: + function BitModel_runSignificancePropogationPass() { + var decoder = this.decoder; + var width = this.width, + height = this.height; + var coefficentsMagnitude = this.coefficentsMagnitude; + var coefficentsSign = this.coefficentsSign; + var neighborsSignificance = this.neighborsSignificance; + var processingFlags = this.processingFlags; + var contexts = this.contexts; + var labels = this.contextLabelTable; + var bitsDecoded = this.bitsDecoded; + var processedInverseMask = ~1; + var processedMask = 1; + var firstMagnitudeBitMask = 2; + for (var i0 = 0; i0 < height; i0 += 4) { + for (var j = 0; j < width; j++) { + var index = i0 * width + j; + for (var i1 = 0; i1 < 4; i1++, index += width) { + var i = i0 + i1; + if (i >= height) { + break; + } + processingFlags[index] &= processedInverseMask; + if ( + coefficentsMagnitude[index] || + !neighborsSignificance[index] + ) { + continue; + } + var contextLabel = labels[neighborsSignificance[index]]; + var decision = decoder.readBit(contexts, contextLabel); + if (decision) { + var sign = this.decodeSignBit(i, j, index); + coefficentsSign[index] = sign; + coefficentsMagnitude[index] = 1; + this.setNeighborsSignificance(i, j, index); + processingFlags[index] |= firstMagnitudeBitMask; + } + bitsDecoded[index]++; + processingFlags[index] |= processedMask; + } + } + } + }, + decodeSignBit: function BitModel_decodeSignBit(row, column, index) { + var width = this.width, + height = this.height; + var coefficentsMagnitude = this.coefficentsMagnitude; + var coefficentsSign = this.coefficentsSign; + var contribution, sign0, sign1, significance1; + var contextLabel, decoded; + significance1 = column > 0 && coefficentsMagnitude[index - 1] !== 0; + if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) { + sign1 = coefficentsSign[index + 1]; + if (significance1) { + sign0 = coefficentsSign[index - 1]; + contribution = 1 - sign1 - sign0; + } else { + contribution = 1 - sign1 - sign1; + } + } else if (significance1) { + sign0 = coefficentsSign[index - 1]; + contribution = 1 - sign0 - sign0; + } else { + contribution = 0; + } + var horizontalContribution = 3 * contribution; + significance1 = row > 0 && coefficentsMagnitude[index - width] !== 0; + if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) { + sign1 = coefficentsSign[index + width]; + if (significance1) { + sign0 = coefficentsSign[index - width]; + contribution = 1 - sign1 - sign0 + horizontalContribution; + } else { + contribution = 1 - sign1 - sign1 + horizontalContribution; + } + } else if (significance1) { + sign0 = coefficentsSign[index - width]; + contribution = 1 - sign0 - sign0 + horizontalContribution; + } else { + contribution = horizontalContribution; + } + if (contribution >= 0) { + contextLabel = 9 + contribution; + decoded = this.decoder.readBit(this.contexts, contextLabel); + } else { + contextLabel = 9 - contribution; + decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1; + } + return decoded; + }, + runMagnitudeRefinementPass: + function BitModel_runMagnitudeRefinementPass() { + var decoder = this.decoder; + var width = this.width, + height = this.height; + var coefficentsMagnitude = this.coefficentsMagnitude; + var neighborsSignificance = this.neighborsSignificance; + var contexts = this.contexts; + var bitsDecoded = this.bitsDecoded; + var processingFlags = this.processingFlags; + var processedMask = 1; + var firstMagnitudeBitMask = 2; + var length = width * height; + var width4 = width * 4; + for ( + var index0 = 0, indexNext; + index0 < length; + index0 = indexNext + ) { + indexNext = Math.min(length, index0 + width4); + for (var j = 0; j < width; j++) { + for ( + var index = index0 + j; + index < indexNext; + index += width + ) { + if ( + !coefficentsMagnitude[index] || + (processingFlags[index] & processedMask) !== 0 + ) { + continue; + } + var contextLabel = 16; + if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) { + processingFlags[index] ^= firstMagnitudeBitMask; + var significance = neighborsSignificance[index] & 127; + contextLabel = significance === 0 ? 15 : 14; + } + var bit = decoder.readBit(contexts, contextLabel); + coefficentsMagnitude[index] = + (coefficentsMagnitude[index] << 1) | bit; + bitsDecoded[index]++; + processingFlags[index] |= processedMask; + } + } + } + }, + runCleanupPass: function BitModel_runCleanupPass() { + var decoder = this.decoder; + var width = this.width, + height = this.height; + var neighborsSignificance = this.neighborsSignificance; + var coefficentsMagnitude = this.coefficentsMagnitude; + var coefficentsSign = this.coefficentsSign; + var contexts = this.contexts; + var labels = this.contextLabelTable; + var bitsDecoded = this.bitsDecoded; + var processingFlags = this.processingFlags; + var processedMask = 1; + var firstMagnitudeBitMask = 2; + var oneRowDown = width; + var twoRowsDown = width * 2; + var threeRowsDown = width * 3; + var iNext; + for (var i0 = 0; i0 < height; i0 = iNext) { + iNext = Math.min(i0 + 4, height); + var indexBase = i0 * width; + var checkAllEmpty = i0 + 3 < height; + for (var j = 0; j < width; j++) { + var index0 = indexBase + j; + var allEmpty = + checkAllEmpty && + processingFlags[index0] === 0 && + processingFlags[index0 + oneRowDown] === 0 && + processingFlags[index0 + twoRowsDown] === 0 && + processingFlags[index0 + threeRowsDown] === 0 && + neighborsSignificance[index0] === 0 && + neighborsSignificance[index0 + oneRowDown] === 0 && + neighborsSignificance[index0 + twoRowsDown] === 0 && + neighborsSignificance[index0 + threeRowsDown] === 0; + var i1 = 0, + index = index0; + var i = i0, + sign; + if (allEmpty) { + var hasSignificantCoefficent = decoder.readBit( + contexts, + RUNLENGTH_CONTEXT, + ); + if (!hasSignificantCoefficent) { + bitsDecoded[index0]++; + bitsDecoded[index0 + oneRowDown]++; + bitsDecoded[index0 + twoRowsDown]++; + bitsDecoded[index0 + threeRowsDown]++; + continue; + } + i1 = + (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) | + decoder.readBit(contexts, UNIFORM_CONTEXT); + if (i1 !== 0) { + i = i0 + i1; + index += i1 * width; + } + sign = this.decodeSignBit(i, j, index); + coefficentsSign[index] = sign; + coefficentsMagnitude[index] = 1; + this.setNeighborsSignificance(i, j, index); + processingFlags[index] |= firstMagnitudeBitMask; + index = index0; + for (var i2 = i0; i2 <= i; i2++, index += width) { + bitsDecoded[index]++; + } + i1++; + } + for (i = i0 + i1; i < iNext; i++, index += width) { + if ( + coefficentsMagnitude[index] || + (processingFlags[index] & processedMask) !== 0 + ) { + continue; + } + var contextLabel = labels[neighborsSignificance[index]]; + var decision = decoder.readBit(contexts, contextLabel); + if (decision === 1) { + sign = this.decodeSignBit(i, j, index); + coefficentsSign[index] = sign; + coefficentsMagnitude[index] = 1; + this.setNeighborsSignificance(i, j, index); + processingFlags[index] |= firstMagnitudeBitMask; + } + bitsDecoded[index]++; + } + } + } + }, + checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() { + var decoder = this.decoder; + var contexts = this.contexts; + var symbol = + (decoder.readBit(contexts, UNIFORM_CONTEXT) << 3) | + (decoder.readBit(contexts, UNIFORM_CONTEXT) << 2) | + (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) | + decoder.readBit(contexts, UNIFORM_CONTEXT); + if (symbol !== 10) { + throw new Error("JPX Error: Invalid segmentation symbol"); + } + }, + }; + return BitModel; + })(); + var Transform = (function TransformClosure() { + function Transform() {} + Transform.prototype.calculate = function transformCalculate( + subbands, + u0, + v0, + ) { + var ll = subbands[0]; + for (var i = 1, ii = subbands.length; i < ii; i++) { + ll = this.iterate(ll, subbands[i], u0, v0); + } + return ll; + }; + Transform.prototype.extend = function extend(buffer, offset, size) { + var i1 = offset - 1, + j1 = offset + 1; + var i2 = offset + size - 2, + j2 = offset + size; + buffer[i1--] = buffer[j1++]; + buffer[j2++] = buffer[i2--]; + buffer[i1--] = buffer[j1++]; + buffer[j2++] = buffer[i2--]; + buffer[i1--] = buffer[j1++]; + buffer[j2++] = buffer[i2--]; + buffer[i1] = buffer[j1]; + buffer[j2] = buffer[i2]; + }; + Transform.prototype.iterate = function Transform_iterate( + ll, + hl_lh_hh, + u0, + v0, + ) { + var llWidth = ll.width, + llHeight = ll.height, + llItems = ll.items; + var width = hl_lh_hh.width; + var height = hl_lh_hh.height; + var items = hl_lh_hh.items; + var i, j, k, l, u, v; + for (k = 0, i = 0; i < llHeight; i++) { + l = i * 2 * width; + for (j = 0; j < llWidth; j++, k++, l += 2) { + items[l] = llItems[k]; + } + } + llItems = ll.items = null; + var bufferPadding = 4; + var rowBuffer = new Float32Array(width + 2 * bufferPadding); + if (width === 1) { + if ((u0 & 1) !== 0) { + for (v = 0, k = 0; v < height; v++, k += width) { + items[k] *= 0.5; + } + } + } else { + for (v = 0, k = 0; v < height; v++, k += width) { + rowBuffer.set(items.subarray(k, k + width), bufferPadding); + this.extend(rowBuffer, bufferPadding, width); + this.filter(rowBuffer, bufferPadding, width); + items.set( + rowBuffer.subarray(bufferPadding, bufferPadding + width), + k, + ); + } + } + var numBuffers = 16; + var colBuffers = []; + for (i = 0; i < numBuffers; i++) { + colBuffers.push(new Float32Array(height + 2 * bufferPadding)); + } + var b, + currentBuffer = 0; + ll = bufferPadding + height; + if (height === 1) { + if ((v0 & 1) !== 0) { + for (u = 0; u < width; u++) { + items[u] *= 0.5; + } + } + } else { + for (u = 0; u < width; u++) { + if (currentBuffer === 0) { + numBuffers = Math.min(width - u, numBuffers); + for (k = u, l = bufferPadding; l < ll; k += width, l++) { + for (b = 0; b < numBuffers; b++) { + colBuffers[b][l] = items[k + b]; + } + } + currentBuffer = numBuffers; + } + currentBuffer--; + var buffer = colBuffers[currentBuffer]; + this.extend(buffer, bufferPadding, height); + this.filter(buffer, bufferPadding, height); + if (currentBuffer === 0) { + k = u - numBuffers + 1; + for (l = bufferPadding; l < ll; k += width, l++) { + for (b = 0; b < numBuffers; b++) { + items[k + b] = colBuffers[b][l]; + } + } + } + } + } + return { + width: width, + height: height, + items: items, + }; + }; + return Transform; + })(); + var IrreversibleTransform = (function IrreversibleTransformClosure() { + function IrreversibleTransform() { + Transform.call(this); + } + IrreversibleTransform.prototype = Object.create(Transform.prototype); + IrreversibleTransform.prototype.filter = + function irreversibleTransformFilter(x, offset, length) { + var len = length >> 1; + offset = offset | 0; + var j, n, current, next; + var alpha = -1.586134342059924; + var beta = -0.052980118572961; + var gamma = 0.882911075530934; + var delta = 0.443506852043971; + var K = 1.230174104914001; + var K_ = 1 / K; + j = offset - 3; + for (n = len + 4; n--; j += 2) { + x[j] *= K_; + } + j = offset - 2; + current = delta * x[j - 1]; + for (n = len + 3; n--; j += 2) { + next = delta * x[j + 1]; + x[j] = K * x[j] - current - next; + if (n--) { + j += 2; + current = delta * x[j + 1]; + x[j] = K * x[j] - current - next; + } else { + break; + } + } + j = offset - 1; + current = gamma * x[j - 1]; + for (n = len + 2; n--; j += 2) { + next = gamma * x[j + 1]; + x[j] -= current + next; + if (n--) { + j += 2; + current = gamma * x[j + 1]; + x[j] -= current + next; + } else { + break; + } + } + j = offset; + current = beta * x[j - 1]; + for (n = len + 1; n--; j += 2) { + next = beta * x[j + 1]; + x[j] -= current + next; + if (n--) { + j += 2; + current = beta * x[j + 1]; + x[j] -= current + next; + } else { + break; + } + } + if (len !== 0) { + j = offset + 1; + current = alpha * x[j - 1]; + for (n = len; n--; j += 2) { + next = alpha * x[j + 1]; + x[j] -= current + next; + if (n--) { + j += 2; + current = alpha * x[j + 1]; + x[j] -= current + next; + } else { + break; + } + } + } + }; + return IrreversibleTransform; + })(); + var ReversibleTransform = (function ReversibleTransformClosure() { + function ReversibleTransform() { + Transform.call(this); + } + ReversibleTransform.prototype = Object.create(Transform.prototype); + ReversibleTransform.prototype.filter = function reversibleTransformFilter( + x, + offset, + length, + ) { + var len = length >> 1; + offset = offset | 0; + var j, n; + for (j = offset, n = len + 1; n--; j += 2) { + x[j] -= (x[j - 1] + x[j + 1] + 2) >> 2; + } + for (j = offset + 1, n = len; n--; j += 2) { + x[j] += (x[j - 1] + x[j + 1]) >> 1; + } + }; + return ReversibleTransform; + })(); + return JpxImage; + })(); + ("use strict"); + var Jbig2Image = (function Jbig2ImageClosure() { + function ContextCache() {} + ContextCache.prototype = { + getContexts: function (id) { + if (id in this) { + return this[id]; + } + return (this[id] = new Int8Array(1 << 16)); + }, + }; + function DecodingContext(data, start, end) { + this.data = data; + this.start = start; + this.end = end; + } + DecodingContext.prototype = { + get decoder() { + var decoder = new ArithmeticDecoder(this.data, this.start, this.end); + return shadow(this, "decoder", decoder); + }, + get contextCache() { + var cache = new ContextCache(); + return shadow(this, "contextCache", cache); + }, + }; + function decodeInteger(contextCache, procedure, decoder) { + var contexts = contextCache.getContexts(procedure); + var prev = 1; + function readBits(length) { + var v = 0; + for (var i = 0; i < length; i++) { + var bit = decoder.readBit(contexts, prev); + prev = + prev < 256 ? (prev << 1) | bit : (((prev << 1) | bit) & 511) | 256; + v = (v << 1) | bit; + } + return v >>> 0; + } + var sign = readBits(1); + var value = readBits(1) + ? readBits(1) + ? readBits(1) + ? readBits(1) + ? readBits(1) + ? readBits(32) + 4436 + : readBits(12) + 340 + : readBits(8) + 84 + : readBits(6) + 20 + : readBits(4) + 4 + : readBits(2); + return sign === 0 ? value : value > 0 ? -value : null; + } + function decodeIAID(contextCache, decoder, codeLength) { + var contexts = contextCache.getContexts("IAID"); + var prev = 1; + for (var i = 0; i < codeLength; i++) { + var bit = decoder.readBit(contexts, prev); + prev = (prev << 1) | bit; + } + if (codeLength < 31) { + return prev & ((1 << codeLength) - 1); + } + return prev & 2147483647; + } + var SegmentTypes = [ + "SymbolDictionary", + null, + null, + null, + "IntermediateTextRegion", + null, + "ImmediateTextRegion", + "ImmediateLosslessTextRegion", + null, + null, + null, + null, + null, + null, + null, + null, + "patternDictionary", + null, + null, + null, + "IntermediateHalftoneRegion", + null, + "ImmediateHalftoneRegion", + "ImmediateLosslessHalftoneRegion", + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + "IntermediateGenericRegion", + null, + "ImmediateGenericRegion", + "ImmediateLosslessGenericRegion", + "IntermediateGenericRefinementRegion", + null, + "ImmediateGenericRefinementRegion", + "ImmediateLosslessGenericRefinementRegion", + null, + null, + null, + null, + "PageInformation", + "EndOfPage", + "EndOfStripe", + "EndOfFile", + "Profiles", + "Tables", + null, + null, + null, + null, + null, + null, + null, + null, + "Extension", + ]; + var CodingTemplates = [ + [ + { + x: -1, + y: -2, + }, + { + x: 0, + y: -2, + }, + { + x: 1, + y: -2, + }, + { + x: -2, + y: -1, + }, + { + x: -1, + y: -1, + }, + { + x: 0, + y: -1, + }, + { + x: 1, + y: -1, + }, + { + x: 2, + y: -1, + }, + { + x: -4, + y: 0, + }, + { + x: -3, + y: 0, + }, + { + x: -2, + y: 0, + }, + { + x: -1, + y: 0, + }, + ], + [ + { + x: -1, + y: -2, + }, + { + x: 0, + y: -2, + }, + { + x: 1, + y: -2, + }, + { + x: 2, + y: -2, + }, + { + x: -2, + y: -1, + }, + { + x: -1, + y: -1, + }, + { + x: 0, + y: -1, + }, + { + x: 1, + y: -1, + }, + { + x: 2, + y: -1, + }, + { + x: -3, + y: 0, + }, + { + x: -2, + y: 0, + }, + { + x: -1, + y: 0, + }, + ], + [ + { + x: -1, + y: -2, + }, + { + x: 0, + y: -2, + }, + { + x: 1, + y: -2, + }, + { + x: -2, + y: -1, + }, + { + x: -1, + y: -1, + }, + { + x: 0, + y: -1, + }, + { + x: 1, + y: -1, + }, + { + x: -2, + y: 0, + }, + { + x: -1, + y: 0, + }, + ], + [ + { + x: -3, + y: -1, + }, + { + x: -2, + y: -1, + }, + { + x: -1, + y: -1, + }, + { + x: 0, + y: -1, + }, + { + x: 1, + y: -1, + }, + { + x: -4, + y: 0, + }, + { + x: -3, + y: 0, + }, + { + x: -2, + y: 0, + }, + { + x: -1, + y: 0, + }, + ], + ]; + var RefinementTemplates = [ + { + coding: [ + { + x: 0, + y: -1, + }, + { + x: 1, + y: -1, + }, + { + x: -1, + y: 0, + }, + ], + reference: [ + { + x: 0, + y: -1, + }, + { + x: 1, + y: -1, + }, + { + x: -1, + y: 0, + }, + { + x: 0, + y: 0, + }, + { + x: 1, + y: 0, + }, + { + x: -1, + y: 1, + }, + { + x: 0, + y: 1, + }, + { + x: 1, + y: 1, + }, + ], + }, + { + coding: [ + { + x: -1, + y: -1, + }, + { + x: 0, + y: -1, + }, + { + x: 1, + y: -1, + }, + { + x: -1, + y: 0, + }, + ], + reference: [ + { + x: 0, + y: -1, + }, + { + x: -1, + y: 0, + }, + { + x: 0, + y: 0, + }, + { + x: 1, + y: 0, + }, + { + x: 0, + y: 1, + }, + { + x: 1, + y: 1, + }, + ], + }, + ]; + var ReusedContexts = [39717, 1941, 229, 405]; + var RefinementReusedContexts = [32, 8]; + function decodeBitmapTemplate0(width, height, decodingContext) { + var decoder = decodingContext.decoder; + var contexts = decodingContext.contextCache.getContexts("GB"); + var contextLabel, + i, + j, + pixel, + row, + row1, + row2, + bitmap = []; + var OLD_PIXEL_MASK = 31735; + for (i = 0; i < height; i++) { + row = bitmap[i] = new Uint8Array(width); + row1 = i < 1 ? row : bitmap[i - 1]; + row2 = i < 2 ? row : bitmap[i - 2]; + contextLabel = + (row2[0] << 13) | + (row2[1] << 12) | + (row2[2] << 11) | + (row1[0] << 7) | + (row1[1] << 6) | + (row1[2] << 5) | + (row1[3] << 4); + for (j = 0; j < width; j++) { + row[j] = pixel = decoder.readBit(contexts, contextLabel); + contextLabel = + ((contextLabel & OLD_PIXEL_MASK) << 1) | + (j + 3 < width ? row2[j + 3] << 11 : 0) | + (j + 4 < width ? row1[j + 4] << 4 : 0) | + pixel; + } + } + return bitmap; + } + function decodeBitmap( + mmr, + width, + height, + templateIndex, + prediction, + skip, + at, + decodingContext, + ) { + if (mmr) { + error("JBIG2 error: MMR encoding is not supported"); + } + if ( + templateIndex === 0 && + !skip && + !prediction && + at.length === 4 && + at[0].x === 3 && + at[0].y === -1 && + at[1].x === -3 && + at[1].y === -1 && + at[2].x === 2 && + at[2].y === -2 && + at[3].x === -2 && + at[3].y === -2 + ) { + return decodeBitmapTemplate0(width, height, decodingContext); + } + var useskip = !!skip; + var template = CodingTemplates[templateIndex].concat(at); + template.sort(function (a, b) { + return a.y - b.y || a.x - b.x; + }); + var templateLength = template.length; + var templateX = new Int8Array(templateLength); + var templateY = new Int8Array(templateLength); + var changingTemplateEntries = []; + var reuseMask = 0, + minX = 0, + maxX = 0, + minY = 0; + var c, k; + for (k = 0; k < templateLength; k++) { + templateX[k] = template[k].x; + templateY[k] = template[k].y; + minX = Math.min(minX, template[k].x); + maxX = Math.max(maxX, template[k].x); + minY = Math.min(minY, template[k].y); + if ( + k < templateLength - 1 && + template[k].y === template[k + 1].y && + template[k].x === template[k + 1].x - 1 + ) { + reuseMask |= 1 << (templateLength - 1 - k); + } else { + changingTemplateEntries.push(k); + } + } + var changingEntriesLength = changingTemplateEntries.length; + var changingTemplateX = new Int8Array(changingEntriesLength); + var changingTemplateY = new Int8Array(changingEntriesLength); + var changingTemplateBit = new Uint16Array(changingEntriesLength); + for (c = 0; c < changingEntriesLength; c++) { + k = changingTemplateEntries[c]; + changingTemplateX[c] = template[k].x; + changingTemplateY[c] = template[k].y; + changingTemplateBit[c] = 1 << (templateLength - 1 - k); + } + var sbb_left = -minX; + var sbb_top = -minY; + var sbb_right = width - maxX; + var pseudoPixelContext = ReusedContexts[templateIndex]; + var row = new Uint8Array(width); + var bitmap = []; + var decoder = decodingContext.decoder; + var contexts = decodingContext.contextCache.getContexts("GB"); + var ltp = 0, + j, + i0, + j0, + contextLabel = 0, + bit, + shift; + for (var i = 0; i < height; i++) { + if (prediction) { + var sltp = decoder.readBit(contexts, pseudoPixelContext); + ltp ^= sltp; + if (ltp) { + bitmap.push(row); + continue; + } + } + row = new Uint8Array(row); + bitmap.push(row); + for (j = 0; j < width; j++) { + if (useskip && skip[i][j]) { + row[j] = 0; + continue; + } + if (j >= sbb_left && j < sbb_right && i >= sbb_top) { + contextLabel = (contextLabel << 1) & reuseMask; + for (k = 0; k < changingEntriesLength; k++) { + i0 = i + changingTemplateY[k]; + j0 = j + changingTemplateX[k]; + bit = bitmap[i0][j0]; + if (bit) { + bit = changingTemplateBit[k]; + contextLabel |= bit; + } + } + } else { + contextLabel = 0; + shift = templateLength - 1; + for (k = 0; k < templateLength; k++, shift--) { + j0 = j + templateX[k]; + if (j0 >= 0 && j0 < width) { + i0 = i + templateY[k]; + if (i0 >= 0) { + bit = bitmap[i0][j0]; + if (bit) { + contextLabel |= bit << shift; + } + } + } + } + } + var pixel = decoder.readBit(contexts, contextLabel); + row[j] = pixel; + } + } + return bitmap; + } + function decodeRefinement( + width, + height, + templateIndex, + referenceBitmap, + offsetX, + offsetY, + prediction, + at, + decodingContext, + ) { + var codingTemplate = RefinementTemplates[templateIndex].coding; + if (templateIndex === 0) { + codingTemplate = codingTemplate.concat([at[0]]); + } + var codingTemplateLength = codingTemplate.length; + var codingTemplateX = new Int32Array(codingTemplateLength); + var codingTemplateY = new Int32Array(codingTemplateLength); + var k; + for (k = 0; k < codingTemplateLength; k++) { + codingTemplateX[k] = codingTemplate[k].x; + codingTemplateY[k] = codingTemplate[k].y; + } + var referenceTemplate = RefinementTemplates[templateIndex].reference; + if (templateIndex === 0) { + referenceTemplate = referenceTemplate.concat([at[1]]); + } + var referenceTemplateLength = referenceTemplate.length; + var referenceTemplateX = new Int32Array(referenceTemplateLength); + var referenceTemplateY = new Int32Array(referenceTemplateLength); + for (k = 0; k < referenceTemplateLength; k++) { + referenceTemplateX[k] = referenceTemplate[k].x; + referenceTemplateY[k] = referenceTemplate[k].y; + } + var referenceWidth = referenceBitmap[0].length; + var referenceHeight = referenceBitmap.length; + var pseudoPixelContext = RefinementReusedContexts[templateIndex]; + var bitmap = []; + var decoder = decodingContext.decoder; + var contexts = decodingContext.contextCache.getContexts("GR"); + var ltp = 0; + for (var i = 0; i < height; i++) { + if (prediction) { + var sltp = decoder.readBit(contexts, pseudoPixelContext); + ltp ^= sltp; + if (ltp) { + error("JBIG2 error: prediction is not supported"); + } + } + var row = new Uint8Array(width); + bitmap.push(row); + for (var j = 0; j < width; j++) { + var i0, j0; + var contextLabel = 0; + for (k = 0; k < codingTemplateLength; k++) { + i0 = i + codingTemplateY[k]; + j0 = j + codingTemplateX[k]; + if (i0 < 0 || j0 < 0 || j0 >= width) { + contextLabel <<= 1; + } else { + contextLabel = (contextLabel << 1) | bitmap[i0][j0]; + } + } + for (k = 0; k < referenceTemplateLength; k++) { + i0 = i + referenceTemplateY[k] + offsetY; + j0 = j + referenceTemplateX[k] + offsetX; + if ( + i0 < 0 || + i0 >= referenceHeight || + j0 < 0 || + j0 >= referenceWidth + ) { + contextLabel <<= 1; + } else { + contextLabel = (contextLabel << 1) | referenceBitmap[i0][j0]; + } + } + var pixel = decoder.readBit(contexts, contextLabel); + row[j] = pixel; + } + } + return bitmap; + } + function decodeSymbolDictionary( + huffman, + refinement, + symbols, + numberOfNewSymbols, + numberOfExportedSymbols, + huffmanTables, + templateIndex, + at, + refinementTemplateIndex, + refinementAt, + decodingContext, + ) { + if (huffman) { + error("JBIG2 error: huffman is not supported"); + } + var newSymbols = []; + var currentHeight = 0; + var symbolCodeLength = log2(symbols.length + numberOfNewSymbols); + var decoder = decodingContext.decoder; + var contextCache = decodingContext.contextCache; + while (newSymbols.length < numberOfNewSymbols) { + var deltaHeight = decodeInteger(contextCache, "IADH", decoder); + currentHeight += deltaHeight; + var currentWidth = 0; + var totalWidth = 0; + while (true) { + var deltaWidth = decodeInteger(contextCache, "IADW", decoder); + if (deltaWidth === null) { + break; + } + currentWidth += deltaWidth; + totalWidth += currentWidth; + var bitmap; + if (refinement) { + var numberOfInstances = decodeInteger( + contextCache, + "IAAI", + decoder, + ); + if (numberOfInstances > 1) { + bitmap = decodeTextRegion( + huffman, + refinement, + currentWidth, + currentHeight, + 0, + numberOfInstances, + 1, + symbols.concat(newSymbols), + symbolCodeLength, + 0, + 0, + 1, + 0, + huffmanTables, + refinementTemplateIndex, + refinementAt, + decodingContext, + ); + } else { + var symbolId = decodeIAID( + contextCache, + decoder, + symbolCodeLength, + ); + var rdx = decodeInteger(contextCache, "IARDX", decoder); + var rdy = decodeInteger(contextCache, "IARDY", decoder); + var symbol = + symbolId < symbols.length + ? symbols[symbolId] + : newSymbols[symbolId - symbols.length]; + bitmap = decodeRefinement( + currentWidth, + currentHeight, + refinementTemplateIndex, + symbol, + rdx, + rdy, + false, + refinementAt, + decodingContext, + ); + } + } else { + bitmap = decodeBitmap( + false, + currentWidth, + currentHeight, + templateIndex, + false, + null, + at, + decodingContext, + ); + } + newSymbols.push(bitmap); + } + } + var exportedSymbols = []; + var flags = [], + currentFlag = false; + var totalSymbolsLength = symbols.length + numberOfNewSymbols; + while (flags.length < totalSymbolsLength) { + var runLength = decodeInteger(contextCache, "IAEX", decoder); + while (runLength--) { + flags.push(currentFlag); + } + currentFlag = !currentFlag; + } + for (var i = 0, ii = symbols.length; i < ii; i++) { + if (flags[i]) { + exportedSymbols.push(symbols[i]); + } + } + for (var j = 0; j < numberOfNewSymbols; i++, j++) { + if (flags[i]) { + exportedSymbols.push(newSymbols[j]); + } + } + return exportedSymbols; + } + function decodeTextRegion( + huffman, + refinement, + width, + height, + defaultPixelValue, + numberOfSymbolInstances, + stripSize, + inputSymbols, + symbolCodeLength, + transposed, + dsOffset, + referenceCorner, + combinationOperator, + huffmanTables, + refinementTemplateIndex, + refinementAt, + decodingContext, + ) { + if (huffman) { + error("JBIG2 error: huffman is not supported"); + } + var bitmap = []; + var i, row; + for (i = 0; i < height; i++) { + row = new Uint8Array(width); + if (defaultPixelValue) { + for (var j = 0; j < width; j++) { + row[j] = defaultPixelValue; + } + } + bitmap.push(row); + } + var decoder = decodingContext.decoder; + var contextCache = decodingContext.contextCache; + var stripT = -decodeInteger(contextCache, "IADT", decoder); + var firstS = 0; + i = 0; + while (i < numberOfSymbolInstances) { + var deltaT = decodeInteger(contextCache, "IADT", decoder); + stripT += deltaT; + var deltaFirstS = decodeInteger(contextCache, "IAFS", decoder); + firstS += deltaFirstS; + var currentS = firstS; + do { + var currentT = + stripSize === 1 ? 0 : decodeInteger(contextCache, "IAIT", decoder); + var t = stripSize * stripT + currentT; + var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); + var applyRefinement = + refinement && decodeInteger(contextCache, "IARI", decoder); + var symbolBitmap = inputSymbols[symbolId]; + var symbolWidth = symbolBitmap[0].length; + var symbolHeight = symbolBitmap.length; + if (applyRefinement) { + var rdw = decodeInteger(contextCache, "IARDW", decoder); + var rdh = decodeInteger(contextCache, "IARDH", decoder); + var rdx = decodeInteger(contextCache, "IARDX", decoder); + var rdy = decodeInteger(contextCache, "IARDY", decoder); + symbolWidth += rdw; + symbolHeight += rdh; + symbolBitmap = decodeRefinement( + symbolWidth, + symbolHeight, + refinementTemplateIndex, + symbolBitmap, + (rdw >> 1) + rdx, + (rdh >> 1) + rdy, + false, + refinementAt, + decodingContext, + ); + } + var offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight); + var offsetS = currentS - (referenceCorner & 2 ? symbolWidth : 0); + var s2, t2, symbolRow; + if (transposed) { + for (s2 = 0; s2 < symbolHeight; s2++) { + row = bitmap[offsetS + s2]; + if (!row) { + continue; + } + symbolRow = symbolBitmap[s2]; + var maxWidth = Math.min(width - offsetT, symbolWidth); + switch (combinationOperator) { + case 0: + for (t2 = 0; t2 < maxWidth; t2++) { + row[offsetT + t2] |= symbolRow[t2]; + } + break; + + case 2: + for (t2 = 0; t2 < maxWidth; t2++) { + row[offsetT + t2] ^= symbolRow[t2]; + } + break; + + default: + error( + "JBIG2 error: operator " + + combinationOperator + + " is not supported", + ); + } + } + currentS += symbolHeight - 1; + } else { + for (t2 = 0; t2 < symbolHeight; t2++) { + row = bitmap[offsetT + t2]; + if (!row) { + continue; + } + symbolRow = symbolBitmap[t2]; + switch (combinationOperator) { + case 0: + for (s2 = 0; s2 < symbolWidth; s2++) { + row[offsetS + s2] |= symbolRow[s2]; + } + break; + + case 2: + for (s2 = 0; s2 < symbolWidth; s2++) { + row[offsetS + s2] ^= symbolRow[s2]; + } + break; + + default: + error( + "JBIG2 error: operator " + + combinationOperator + + " is not supported", + ); + } + } + currentS += symbolWidth - 1; + } + i++; + var deltaS = decodeInteger(contextCache, "IADS", decoder); + if (deltaS === null) { + break; + } + currentS += deltaS + dsOffset; + } while (true); + } + return bitmap; + } + function readSegmentHeader(data, start) { + var segmentHeader = {}; + segmentHeader.number = readUint32(data, start); + var flags = data[start + 4]; + var segmentType = flags & 63; + if (!SegmentTypes[segmentType]) { + error("JBIG2 error: invalid segment type: " + segmentType); + } + segmentHeader.type = segmentType; + segmentHeader.typeName = SegmentTypes[segmentType]; + segmentHeader.deferredNonRetain = !!(flags & 128); + var pageAssociationFieldSize = !!(flags & 64); + var referredFlags = data[start + 5]; + var referredToCount = (referredFlags >> 5) & 7; + var retainBits = [referredFlags & 31]; + var position = start + 6; + if (referredFlags === 7) { + referredToCount = readUint32(data, position - 1) & 536870911; + position += 3; + var bytes = (referredToCount + 7) >> 3; + retainBits[0] = data[position++]; + while (--bytes > 0) { + retainBits.push(data[position++]); + } + } else if (referredFlags === 5 || referredFlags === 6) { + error("JBIG2 error: invalid referred-to flags"); + } + segmentHeader.retainBits = retainBits; + var referredToSegmentNumberSize = + segmentHeader.number <= 256 ? 1 : segmentHeader.number <= 65536 ? 2 : 4; + var referredTo = []; + var i, ii; + for (i = 0; i < referredToCount; i++) { + var number = + referredToSegmentNumberSize === 1 + ? data[position] + : referredToSegmentNumberSize === 2 + ? readUint16(data, position) + : readUint32(data, position); + referredTo.push(number); + position += referredToSegmentNumberSize; + } + segmentHeader.referredTo = referredTo; + if (!pageAssociationFieldSize) { + segmentHeader.pageAssociation = data[position++]; + } else { + segmentHeader.pageAssociation = readUint32(data, position); + position += 4; + } + segmentHeader.length = readUint32(data, position); + position += 4; + if (segmentHeader.length === 4294967295) { + if (segmentType === 38) { + var genericRegionInfo = readRegionSegmentInformation(data, position); + var genericRegionSegmentFlags = + data[position + RegionSegmentInformationFieldLength]; + var genericRegionMmr = !!(genericRegionSegmentFlags & 1); + var searchPatternLength = 6; + var searchPattern = new Uint8Array(searchPatternLength); + if (!genericRegionMmr) { + searchPattern[0] = 255; + searchPattern[1] = 172; + } + searchPattern[2] = (genericRegionInfo.height >>> 24) & 255; + searchPattern[3] = (genericRegionInfo.height >> 16) & 255; + searchPattern[4] = (genericRegionInfo.height >> 8) & 255; + searchPattern[5] = genericRegionInfo.height & 255; + for (i = position, ii = data.length; i < ii; i++) { + var j = 0; + while ( + j < searchPatternLength && + searchPattern[j] === data[i + j] + ) { + j++; + } + if (j === searchPatternLength) { + segmentHeader.length = i + searchPatternLength; + break; + } + } + if (segmentHeader.length === 4294967295) { + error("JBIG2 error: segment end was not found"); + } + } else { + error("JBIG2 error: invalid unknown segment length"); + } + } + segmentHeader.headerEnd = position; + return segmentHeader; + } + function readSegments(header, data, start, end) { + var segments = []; + var position = start; + while (position < end) { + var segmentHeader = readSegmentHeader(data, position); + position = segmentHeader.headerEnd; + var segment = { + header: segmentHeader, + data: data, + }; + if (!header.randomAccess) { + segment.start = position; + position += segmentHeader.length; + segment.end = position; + } + segments.push(segment); + if (segmentHeader.type === 51) { + break; + } + } + if (header.randomAccess) { + for (var i = 0, ii = segments.length; i < ii; i++) { + segments[i].start = position; + position += segments[i].header.length; + segments[i].end = position; + } + } + return segments; + } + function readRegionSegmentInformation(data, start) { + return { + width: readUint32(data, start), + height: readUint32(data, start + 4), + x: readUint32(data, start + 8), + y: readUint32(data, start + 12), + combinationOperator: data[start + 16] & 7, + }; + } + var RegionSegmentInformationFieldLength = 17; + function processSegment(segment, visitor) { + var header = segment.header; + var data = segment.data, + position = segment.start, + end = segment.end; + var args, at, i, atLength; + switch (header.type) { + case 0: + var dictionary = {}; + var dictionaryFlags = readUint16(data, position); + dictionary.huffman = !!(dictionaryFlags & 1); + dictionary.refinement = !!(dictionaryFlags & 2); + dictionary.huffmanDHSelector = (dictionaryFlags >> 2) & 3; + dictionary.huffmanDWSelector = (dictionaryFlags >> 4) & 3; + dictionary.bitmapSizeSelector = (dictionaryFlags >> 6) & 1; + dictionary.aggregationInstancesSelector = (dictionaryFlags >> 7) & 1; + dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256); + dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512); + dictionary.template = (dictionaryFlags >> 10) & 3; + dictionary.refinementTemplate = (dictionaryFlags >> 12) & 1; + position += 2; + if (!dictionary.huffman) { + atLength = dictionary.template === 0 ? 4 : 1; + at = []; + for (i = 0; i < atLength; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1), + }); + position += 2; + } + dictionary.at = at; + } + if (dictionary.refinement && !dictionary.refinementTemplate) { + at = []; + for (i = 0; i < 2; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1), + }); + position += 2; + } + dictionary.refinementAt = at; + } + dictionary.numberOfExportedSymbols = readUint32(data, position); + position += 4; + dictionary.numberOfNewSymbols = readUint32(data, position); + position += 4; + args = [ + dictionary, + header.number, + header.referredTo, + data, + position, + end, + ]; + break; + + case 6: + case 7: + var textRegion = {}; + textRegion.info = readRegionSegmentInformation(data, position); + position += RegionSegmentInformationFieldLength; + var textRegionSegmentFlags = readUint16(data, position); + position += 2; + textRegion.huffman = !!(textRegionSegmentFlags & 1); + textRegion.refinement = !!(textRegionSegmentFlags & 2); + textRegion.stripSize = 1 << ((textRegionSegmentFlags >> 2) & 3); + textRegion.referenceCorner = (textRegionSegmentFlags >> 4) & 3; + textRegion.transposed = !!(textRegionSegmentFlags & 64); + textRegion.combinationOperator = (textRegionSegmentFlags >> 7) & 3; + textRegion.defaultPixelValue = (textRegionSegmentFlags >> 9) & 1; + textRegion.dsOffset = (textRegionSegmentFlags << 17) >> 27; + textRegion.refinementTemplate = (textRegionSegmentFlags >> 15) & 1; + if (textRegion.huffman) { + var textRegionHuffmanFlags = readUint16(data, position); + position += 2; + textRegion.huffmanFS = textRegionHuffmanFlags & 3; + textRegion.huffmanDS = (textRegionHuffmanFlags >> 2) & 3; + textRegion.huffmanDT = (textRegionHuffmanFlags >> 4) & 3; + textRegion.huffmanRefinementDW = (textRegionHuffmanFlags >> 6) & 3; + textRegion.huffmanRefinementDH = (textRegionHuffmanFlags >> 8) & 3; + textRegion.huffmanRefinementDX = (textRegionHuffmanFlags >> 10) & 3; + textRegion.huffmanRefinementDY = (textRegionHuffmanFlags >> 12) & 3; + textRegion.huffmanRefinementSizeSelector = !!( + textRegionHuffmanFlags & 14 + ); + } + if (textRegion.refinement && !textRegion.refinementTemplate) { + at = []; + for (i = 0; i < 2; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1), + }); + position += 2; + } + textRegion.refinementAt = at; + } + textRegion.numberOfSymbolInstances = readUint32(data, position); + position += 4; + if (textRegion.huffman) { + error("JBIG2 error: huffman is not supported"); + } + args = [textRegion, header.referredTo, data, position, end]; + break; + + case 38: + case 39: + var genericRegion = {}; + genericRegion.info = readRegionSegmentInformation(data, position); + position += RegionSegmentInformationFieldLength; + var genericRegionSegmentFlags = data[position++]; + genericRegion.mmr = !!(genericRegionSegmentFlags & 1); + genericRegion.template = (genericRegionSegmentFlags >> 1) & 3; + genericRegion.prediction = !!(genericRegionSegmentFlags & 8); + if (!genericRegion.mmr) { + atLength = genericRegion.template === 0 ? 4 : 1; + at = []; + for (i = 0; i < atLength; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1), + }); + position += 2; + } + genericRegion.at = at; + } + args = [genericRegion, data, position, end]; + break; + + case 48: + var pageInfo = { + width: readUint32(data, position), + height: readUint32(data, position + 4), + resolutionX: readUint32(data, position + 8), + resolutionY: readUint32(data, position + 12), + }; + if (pageInfo.height === 4294967295) { + delete pageInfo.height; + } + var pageSegmentFlags = data[position + 16]; + var pageStripingInformatiom = readUint16(data, position + 17); + pageInfo.lossless = !!(pageSegmentFlags & 1); + pageInfo.refinement = !!(pageSegmentFlags & 2); + pageInfo.defaultPixelValue = (pageSegmentFlags >> 2) & 1; + pageInfo.combinationOperator = (pageSegmentFlags >> 3) & 3; + pageInfo.requiresBuffer = !!(pageSegmentFlags & 32); + pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64); + args = [pageInfo]; + break; + + case 49: + break; + + case 50: + break; + + case 51: + break; + + case 62: + break; + + default: + error( + "JBIG2 error: segment type " + + header.typeName + + "(" + + header.type + + ") is not implemented", + ); + } + var callbackName = "on" + header.typeName; + if (callbackName in visitor) { + visitor[callbackName].apply(visitor, args); + } + } + function processSegments(segments, visitor) { + for (var i = 0, ii = segments.length; i < ii; i++) { + processSegment(segments[i], visitor); + } + } + function parseJbig2(data, start, end) { + var position = start; + if ( + data[position] !== 151 || + data[position + 1] !== 74 || + data[position + 2] !== 66 || + data[position + 3] !== 50 || + data[position + 4] !== 13 || + data[position + 5] !== 10 || + data[position + 6] !== 26 || + data[position + 7] !== 10 + ) { + error("JBIG2 error: invalid header"); + } + var header = {}; + position += 8; + var flags = data[position++]; + header.randomAccess = !(flags & 1); + if (!(flags & 2)) { + header.numberOfPages = readUint32(data, position); + position += 4; + } + var segments = readSegments(header, data, position, end); + error("Not implemented"); + } + function parseJbig2Chunks(chunks) { + var visitor = new SimpleSegmentVisitor(); + for (var i = 0, ii = chunks.length; i < ii; i++) { + var chunk = chunks[i]; + var segments = readSegments({}, chunk.data, chunk.start, chunk.end); + processSegments(segments, visitor); + } + return visitor; + } + function SimpleSegmentVisitor() {} + SimpleSegmentVisitor.prototype = { + onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) { + this.currentPageInfo = info; + var rowSize = (info.width + 7) >> 3; + var buffer = new Uint8Array(rowSize * info.height); + if (info.defaultPixelValue) { + for (var i = 0, ii = buffer.length; i < ii; i++) { + buffer[i] = 255; + } + } + this.buffer = buffer; + }, + drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) { + var pageInfo = this.currentPageInfo; + var width = regionInfo.width, + height = regionInfo.height; + var rowSize = (pageInfo.width + 7) >> 3; + var combinationOperator = pageInfo.combinationOperatorOverride + ? regionInfo.combinationOperator + : pageInfo.combinationOperator; + var buffer = this.buffer; + var mask0 = 128 >> (regionInfo.x & 7); + var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3); + var i, j, mask, offset; + switch (combinationOperator) { + case 0: + for (i = 0; i < height; i++) { + mask = mask0; + offset = offset0; + for (j = 0; j < width; j++) { + if (bitmap[i][j]) { + buffer[offset] |= mask; + } + mask >>= 1; + if (!mask) { + mask = 128; + offset++; + } + } + offset0 += rowSize; + } + break; + + case 2: + for (i = 0; i < height; i++) { + mask = mask0; + offset = offset0; + for (j = 0; j < width; j++) { + if (bitmap[i][j]) { + buffer[offset] ^= mask; + } + mask >>= 1; + if (!mask) { + mask = 128; + offset++; + } + } + offset0 += rowSize; + } + break; + + default: + error( + "JBIG2 error: operator " + + combinationOperator + + " is not supported", + ); + } + }, + onImmediateGenericRegion: + function SimpleSegmentVisitor_onImmediateGenericRegion( + region, + data, + start, + end, + ) { + var regionInfo = region.info; + var decodingContext = new DecodingContext(data, start, end); + var bitmap = decodeBitmap( + region.mmr, + regionInfo.width, + regionInfo.height, + region.template, + region.prediction, + null, + region.at, + decodingContext, + ); + this.drawBitmap(regionInfo, bitmap); + }, + onImmediateLosslessGenericRegion: + function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() { + this.onImmediateGenericRegion.apply(this, arguments); + }, + onSymbolDictionary: function SimpleSegmentVisitor_onSymbolDictionary( + dictionary, + currentSegment, + referredSegments, + data, + start, + end, + ) { + var huffmanTables; + if (dictionary.huffman) { + error("JBIG2 error: huffman is not supported"); + } + var symbols = this.symbols; + if (!symbols) { + this.symbols = symbols = {}; + } + var inputSymbols = []; + for (var i = 0, ii = referredSegments.length; i < ii; i++) { + inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]); + } + var decodingContext = new DecodingContext(data, start, end); + symbols[currentSegment] = decodeSymbolDictionary( + dictionary.huffman, + dictionary.refinement, + inputSymbols, + dictionary.numberOfNewSymbols, + dictionary.numberOfExportedSymbols, + huffmanTables, + dictionary.template, + dictionary.at, + dictionary.refinementTemplate, + dictionary.refinementAt, + decodingContext, + ); + }, + onImmediateTextRegion: + function SimpleSegmentVisitor_onImmediateTextRegion( + region, + referredSegments, + data, + start, + end, + ) { + var regionInfo = region.info; + var huffmanTables; + var symbols = this.symbols; + var inputSymbols = []; + for (var i = 0, ii = referredSegments.length; i < ii; i++) { + inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]); + } + var symbolCodeLength = log2(inputSymbols.length); + var decodingContext = new DecodingContext(data, start, end); + var bitmap = decodeTextRegion( + region.huffman, + region.refinement, + regionInfo.width, + regionInfo.height, + region.defaultPixelValue, + region.numberOfSymbolInstances, + region.stripSize, + inputSymbols, + symbolCodeLength, + region.transposed, + region.dsOffset, + region.referenceCorner, + region.combinationOperator, + huffmanTables, + region.refinementTemplate, + region.refinementAt, + decodingContext, + ); + this.drawBitmap(regionInfo, bitmap); + }, + onImmediateLosslessTextRegion: + function SimpleSegmentVisitor_onImmediateLosslessTextRegion() { + this.onImmediateTextRegion.apply(this, arguments); + }, + }; + function Jbig2Image() {} + Jbig2Image.prototype = { + parseChunks: function Jbig2Image_parseChunks(chunks) { + return parseJbig2Chunks(chunks); + }, + }; + return Jbig2Image; + })(); + function log2(x) { + var n = 1, + i = 0; + while (x > n) { + n <<= 1; + i++; + } + return i; + } + function readInt8(data, start) { + return (data[start] << 24) >> 24; + } + function readUint16(data, offset) { + return (data[offset] << 8) | data[offset + 1]; + } + function readUint32(data, offset) { + return ( + ((data[offset] << 24) | + (data[offset + 1] << 16) | + (data[offset + 2] << 8) | + data[offset + 3]) >>> + 0 + ); + } + function shadow(obj, prop, value) { + Object.defineProperty(obj, prop, { + value: value, + enumerable: true, + configurable: true, + writable: false, + }); + return value; + } + var error = function () { + console.error.apply(console, arguments); + throw new Error("PDFJS error: " + arguments[0]); + }; + var warn = function () { + console.warn.apply(console, arguments); + }; + var info = function () { + console.info.apply(console, arguments); + }; + Jbig2Image.prototype.parse = function parseJbig2(data) { + var position = 0, + end = data.length; + if ( + data[position] !== 151 || + data[position + 1] !== 74 || + data[position + 2] !== 66 || + data[position + 3] !== 50 || + data[position + 4] !== 13 || + data[position + 5] !== 10 || + data[position + 6] !== 26 || + data[position + 7] !== 10 + ) { + error("JBIG2 error: invalid header"); + } + var header = {}; + position += 8; + var flags = data[position++]; + header.randomAccess = !(flags & 1); + if (!(flags & 2)) { + header.numberOfPages = readUint32(data, position); + position += 4; + } + var visitor = this.parseChunks([ + { + data: data, + start: position, + end: end, + }, + ]); + var width = visitor.currentPageInfo.width; + var height = visitor.currentPageInfo.height; + var bitPacked = visitor.buffer; + var data = new Uint8Array(width * height); + var q = 0, + k = 0; + for (var i = 0; i < height; i++) { + var mask = 0, + buffer; + for (var j = 0; j < width; j++) { + if (!mask) { + mask = 128; + buffer = bitPacked[k++]; + } + data[q++] = buffer & mask ? 0 : 255; + mask >>= 1; + } + } + this.width = width; + this.height = height; + this.data = data; + }; + PDFJS.JpegImage = JpegImage; + PDFJS.JpxImage = JpxImage; + PDFJS.Jbig2Image = Jbig2Image; +})(PDFJS || (PDFJS = {})); + +var JpegDecoder = PDFJS.JpegImage; + +var JpxDecoder = PDFJS.JpxImage; + +var Jbig2Decoder = PDFJS.Jbig2Image; + +export { JpegImage, JpegDecoder, JpxDecoder, Jbig2Decoder }; diff --git a/third_party/jpgjs/webpack-fix.diff b/src/third_party/jpgjs/webpack-fix.diff similarity index 100% rename from third_party/jpgjs/webpack-fix.diff rename to src/third_party/jpgjs/webpack-fix.diff diff --git a/src/trackable_alpha.ts b/src/trackable_alpha.ts index 2f5b13368e..8013935ee5 100644 --- a/src/trackable_alpha.ts +++ b/src/trackable_alpha.ts @@ -19,8 +19,8 @@ * (opacity) values. */ -import { TrackableValue } from "#/trackable_value"; -import { verifyFloat01 } from "#/util/json"; +import { TrackableValue } from "#src/trackable_value.js"; +import { verifyFloat01 } from "#src/util/json.js"; export type TrackableAlphaValue = TrackableValue; diff --git a/src/trackable_blend.ts b/src/trackable_blend.ts index f26b0b2a1a..01b79bc7e3 100644 --- a/src/trackable_blend.ts +++ b/src/trackable_blend.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { TrackableEnum } from "#/util/trackable_enum"; +import { TrackableEnum } from "#src/util/trackable_enum.js"; export enum BLEND_MODES { DEFAULT = 0, diff --git a/src/trackable_boolean.ts b/src/trackable_boolean.ts index 2fb7c45c69..2fd2653b49 100644 --- a/src/trackable_boolean.ts +++ b/src/trackable_boolean.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import debounce from "lodash/debounce"; -import { WatchableValueInterface } from "#/trackable_value"; -import { RefCounted } from "#/util/disposable"; -import { NullarySignal } from "#/util/signal"; -import { Trackable } from "#/util/trackable"; +import { debounce } from "lodash-es"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { Trackable } from "#src/util/trackable.js"; export class TrackableBoolean implements Trackable { get value() { diff --git a/src/trackable_finite_float.ts b/src/trackable_finite_float.ts index 18bb4ac903..626319b899 100644 --- a/src/trackable_finite_float.ts +++ b/src/trackable_finite_float.ts @@ -19,8 +19,8 @@ * (opacity) values. */ -import { TrackableValue } from "#/trackable_value"; -import { verifyFiniteFloat } from "#/util/json"; +import { TrackableValue } from "#src/trackable_value.js"; +import { verifyFiniteFloat } from "#src/util/json.js"; export type TrackableFiniteFloat = TrackableValue; diff --git a/src/trackable_value.ts b/src/trackable_value.ts index 69834026d0..6a2dd786e2 100644 --- a/src/trackable_value.ts +++ b/src/trackable_value.ts @@ -14,21 +14,12 @@ * limitations under the License. */ -import debounce from "lodash/debounce"; -import { - Borrowed, - Disposable, - invokeDisposers, - Owned, - RefCounted, -} from "#/util/disposable"; -import { - neverSignal, - NullaryReadonlySignal, - NullarySignal, - Signal, -} from "#/util/signal"; -import { Trackable } from "#/util/trackable"; +import { debounce } from "lodash-es"; +import type { Borrowed, Disposable, Owned } from "#src/util/disposable.js"; +import { invokeDisposers, RefCounted } from "#src/util/disposable.js"; +import type { NullaryReadonlySignal } from "#src/util/signal.js"; +import { neverSignal, NullarySignal, Signal } from "#src/util/signal.js"; +import type { Trackable } from "#src/util/trackable.js"; export interface WatchableValueInterface { value: T; @@ -78,7 +69,9 @@ export class TrackableValue extends WatchableValue implements Trackable { try { this.value = validator(x); return; - } catch (ignoredError) {} + } catch { + // Ignore invalid values in JSON representation. + } } this.value = this.defaultValue; } diff --git a/src/trackable_vec3.ts b/src/trackable_vec3.ts index 835b5ab538..c220858393 100644 --- a/src/trackable_vec3.ts +++ b/src/trackable_vec3.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import { vec3 } from "#/util/geom"; -import { verify3dVec } from "#/util/json"; -import { NullarySignal } from "#/util/signal"; -import { Trackable } from "#/util/trackable"; +import { vec3 } from "#src/util/geom.js"; +import { verify3dVec } from "#src/util/json.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { Trackable } from "#src/util/trackable.js"; export function trackableVec3(defaultValue = vec3.create()) { return new TrackableVec3(defaultValue, defaultValue); diff --git a/src/ui/annotations.ts b/src/ui/annotations.ts index 601451ec71..022b802476 100644 --- a/src/ui/annotations.ts +++ b/src/ui/annotations.ts @@ -18,99 +18,99 @@ * @file User interface for display and editing annotations. */ -import "./annotations.css"; - +import "#src/ui/annotations.css"; import { + AnnotationDisplayState, + AnnotationLayerState, +} from "#src/annotation/annotation_layer_state.js"; +import { MultiscaleAnnotationSource } from "#src/annotation/frontend_source.js"; +import type { Annotation, AnnotationId, - AnnotationPropertySerializer, AnnotationReference, + AxisAlignedBoundingBox, + Ellipsoid, + Line, +} from "#src/annotation/index.js"; +import { + AnnotationPropertySerializer, AnnotationSource, annotationToJson, AnnotationType, annotationTypeHandlers, - AxisAlignedBoundingBox, - Ellipsoid, formatNumericProperty, - Line, -} from "#/annotation"; -import { - AnnotationDisplayState, - AnnotationLayerState, -} from "#/annotation/annotation_layer_state"; -import { MultiscaleAnnotationSource } from "#/annotation/frontend_source"; +} from "#src/annotation/index.js"; import { AnnotationLayer, PerspectiveViewAnnotationLayer, SliceViewAnnotationLayer, SpatiallyIndexedPerspectiveViewAnnotationLayer, SpatiallyIndexedSliceViewAnnotationLayer, -} from "#/annotation/renderlayer"; -import { CoordinateSpace } from "#/coordinate_transform"; -import { MouseSelectionState, UserLayer } from "#/layer"; -import { LoadedDataSubsource } from "#/layer_data_source"; -import { - ChunkTransformParameters, - getChunkPositionFromCombinedGlobalLocalPositions, -} from "#/render_coordinate_transform"; +} from "#src/annotation/renderlayer.js"; +import type { CoordinateSpace } from "#src/coordinate_transform.js"; +import type { MouseSelectionState, UserLayer } from "#src/layer/index.js"; +import type { LoadedDataSubsource } from "#src/layer/layer_data_source.js"; +import type { ChunkTransformParameters } from "#src/render_coordinate_transform.js"; +import { getChunkPositionFromCombinedGlobalLocalPositions } from "#src/render_coordinate_transform.js"; import { RenderScaleHistogram, trackableRenderScaleTarget, -} from "#/render_scale_statistics"; -import { RenderLayerRole } from "#/renderlayer"; +} from "#src/render_scale_statistics.js"; +import { RenderLayerRole } from "#src/renderlayer.js"; +import type { SegmentationDisplayState } from "#src/segmentation_display_state/frontend.js"; import { bindSegmentListWidth, registerCallbackWhenSegmentationDisplayStateChanged, - SegmentationDisplayState, SegmentWidgetFactory, -} from "#/segmentation_display_state/frontend"; -import { ElementVisibilityFromTrackableBoolean } from "#/trackable_boolean"; +} from "#src/segmentation_display_state/frontend.js"; +import { ElementVisibilityFromTrackableBoolean } from "#src/trackable_boolean.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; import { AggregateWatchableValue, makeCachedLazyDerivedWatchableValue, registerNested, WatchableValue, - WatchableValueInterface, -} from "#/trackable_value"; -import { getDefaultAnnotationListBindings } from "#/ui/default_input_event_bindings"; -import { LegacyTool, registerLegacyTool } from "#/ui/tool"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { arraysEqual, ArraySpliceOp } from "#/util/array"; -import { setClipboard } from "#/util/clipboard"; +} from "#src/trackable_value.js"; +import { getDefaultAnnotationListBindings } from "#src/ui/default_input_event_bindings.js"; +import { LegacyTool, registerLegacyTool } from "#src/ui/tool.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import type { ArraySpliceOp } from "#src/util/array.js"; +import { arraysEqual } from "#src/util/array.js"; +import { setClipboard } from "#src/util/clipboard.js"; import { serializeColor, unpackRGB, unpackRGBA, useWhiteBackground, -} from "#/util/color"; -import { Borrowed, disposableOnce, RefCounted } from "#/util/disposable"; -import { removeChildren } from "#/util/dom"; -import { Endianness, ENDIANNESS } from "#/util/endian"; -import { ValueOrError } from "#/util/error"; -import { vec3 } from "#/util/geom"; +} from "#src/util/color.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { disposableOnce, RefCounted } from "#src/util/disposable.js"; +import { removeChildren } from "#src/util/dom.js"; +import { Endianness, ENDIANNESS } from "#src/util/endian.js"; +import type { ValueOrError } from "#src/util/error.js"; +import { vec3 } from "#src/util/geom.js"; import { EventActionMap, KeyboardEventBinder, registerActionListener, -} from "#/util/keyboard_bindings"; -import * as matrix from "#/util/matrix"; -import { MouseEventBinder } from "#/util/mouse_bindings"; -import { formatScaleWithUnitAsString } from "#/util/si_units"; -import { NullarySignal, Signal } from "#/util/signal"; -import { Uint64 } from "#/util/uint64"; -import * as vector from "#/util/vector"; -import { makeAddButton } from "#/widget/add_button"; -import { ColorWidget } from "#/widget/color"; -import { makeCopyButton } from "#/widget/copy_button"; -import { makeDeleteButton } from "#/widget/delete_button"; -import { - DependentViewContext, - DependentViewWidget, -} from "#/widget/dependent_view_widget"; -import { makeIcon } from "#/widget/icon"; -import { makeMoveToButton } from "#/widget/move_to_button"; -import { Tab } from "#/widget/tab_view"; -import { VirtualList, VirtualListSource } from "#/widget/virtual_list"; +} from "#src/util/keyboard_bindings.js"; +import * as matrix from "#src/util/matrix.js"; +import { MouseEventBinder } from "#src/util/mouse_bindings.js"; +import { formatScaleWithUnitAsString } from "#src/util/si_units.js"; +import { NullarySignal, Signal } from "#src/util/signal.js"; +import { Uint64 } from "#src/util/uint64.js"; +import * as vector from "#src/util/vector.js"; +import { makeAddButton } from "#src/widget/add_button.js"; +import { ColorWidget } from "#src/widget/color.js"; +import { makeCopyButton } from "#src/widget/copy_button.js"; +import { makeDeleteButton } from "#src/widget/delete_button.js"; +import type { DependentViewContext } from "#src/widget/dependent_view_widget.js"; +import { DependentViewWidget } from "#src/widget/dependent_view_widget.js"; +import { makeIcon } from "#src/widget/icon.js"; +import { makeMoveToButton } from "#src/widget/move_to_button.js"; +import { Tab } from "#src/widget/tab_view.js"; +import type { VirtualListSource } from "#src/widget/virtual_list.js"; +import { VirtualList } from "#src/widget/virtual_list.js"; export class MergedAnnotationStates extends RefCounted diff --git a/src/ui/context_menu.ts b/src/ui/context_menu.ts index b3946641ef..5890a1a8d5 100644 --- a/src/ui/context_menu.ts +++ b/src/ui/context_menu.ts @@ -14,11 +14,10 @@ * limitations under the License. */ -import { RefCounted, registerEventListener } from "#/util/disposable"; -import { removeFromParent } from "#/util/dom"; -import { NullarySignal } from "#/util/signal"; - -import "./context_menu.css"; +import { RefCounted, registerEventListener } from "#src/util/disposable.js"; +import { removeFromParent } from "#src/util/dom.js"; +import { NullarySignal } from "#src/util/signal.js"; +import "#src/ui/context_menu.css"; export function positionContextMenu(menu: HTMLElement, event: MouseEvent) { // Set the display to block before checking the offset, or the offset will be diff --git a/src/ui/default_clipboard_handling.spec.ts b/src/ui/default_clipboard_handling.spec.ts index becf8f1849..1d49aa7444 100644 --- a/src/ui/default_clipboard_handling.spec.ts +++ b/src/ui/default_clipboard_handling.spec.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { parsePositionString } from "#/ui/default_clipboard_handling"; +import { describe, it, expect } from "vitest"; +import { parsePositionString } from "#src/ui/default_clipboard_handling.js"; describe("default_clipboard_handling", () => { describe("parsePositionString", () => { diff --git a/src/ui/default_clipboard_handling.ts b/src/ui/default_clipboard_handling.ts index 8dae455cc7..b49b1ba333 100644 --- a/src/ui/default_clipboard_handling.ts +++ b/src/ui/default_clipboard_handling.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { isInputTextTarget } from "#/util/dom"; -import { getCachedJson } from "#/util/trackable"; -import { Viewer } from "#/viewer"; +import { isInputTextTarget } from "#src/util/dom.js"; +import { getCachedJson } from "#src/util/trackable.js"; +import type { Viewer } from "#src/viewer.js"; export function bindDefaultCopyHandler(viewer: Viewer) { viewer.registerEventListener(document, "copy", (event: ClipboardEvent) => { diff --git a/src/ui/default_input_event_bindings.ts b/src/ui/default_input_event_bindings.ts index 7f1b2d3b08..3e1816582b 100644 --- a/src/ui/default_input_event_bindings.ts +++ b/src/ui/default_input_event_bindings.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { EventActionMap } from "#/util/event_action_map"; -import { InputEventBindings } from "#/viewer"; +import { EventActionMap } from "#src/util/event_action_map.js"; +import type { InputEventBindings } from "#src/viewer.js"; let defaultGlobalBindings: EventActionMap | undefined; diff --git a/src/ui/default_viewer.ts b/src/ui/default_viewer.ts index 667a5bd542..a617d85c9a 100644 --- a/src/ui/default_viewer.ts +++ b/src/ui/default_viewer.ts @@ -14,13 +14,15 @@ * limitations under the License. */ -import "./default_viewer.css"; +import "#src/ui/default_viewer.css"; +import { + disableContextMenu, + disableWheel, +} from "#src/ui/disable_default_actions.js"; +import type { MinimalViewerOptions } from "#src/ui/minimal_viewer.js"; +import { makeMinimalViewer } from "#src/ui/minimal_viewer.js"; -import { ViewerOptions } from "#/viewer"; -import { disableContextMenu, disableWheel } from "#/ui/disable_default_actions"; -import { makeMinimalViewer } from "./minimal_viewer"; - -export function makeDefaultViewer(options?: Partial) { +export function makeDefaultViewer(options?: Partial) { disableContextMenu(); disableWheel(); return makeMinimalViewer(options); diff --git a/src/ui/default_viewer_setup.ts b/src/ui/default_viewer_setup.ts index 29cb56486f..fc5d5aeaee 100644 --- a/src/ui/default_viewer_setup.ts +++ b/src/ui/default_viewer_setup.ts @@ -14,23 +14,24 @@ * limitations under the License. */ -import { StatusMessage } from "#/status"; +import { StatusMessage } from "#src/status.js"; import { bindDefaultCopyHandler, bindDefaultPasteHandler, -} from "#/ui/default_clipboard_handling"; -import { setDefaultInputEventBindings } from "#/ui/default_input_event_bindings"; -import { makeDefaultViewer } from "#/ui/default_viewer"; -import { bindTitle } from "#/ui/title"; -import { UrlHashBinding } from "#/ui/url_hash_binding"; +} from "#src/ui/default_clipboard_handling.js"; +import { setDefaultInputEventBindings } from "#src/ui/default_input_event_bindings.js"; +import { makeDefaultViewer } from "#src/ui/default_viewer.js"; +import type { MinimalViewerOptions } from "#src/ui/minimal_viewer.js"; +import { bindTitle } from "#src/ui/title.js"; +import { UrlHashBinding } from "#src/ui/url_hash_binding.js"; declare let NEUROGLANCER_DEFAULT_STATE_FRAGMENT: string | undefined; /** * Sets up the default neuroglancer viewer. */ -export function setupDefaultViewer() { - const viewer = ((window).viewer = makeDefaultViewer()); +export function setupDefaultViewer(options?: Partial) { + const viewer = ((window).viewer = makeDefaultViewer(options)); setDefaultInputEventBindings(viewer.inputEventBindings); const hashBinding = viewer.registerDisposer( diff --git a/src/ui/disable_default_actions.ts b/src/ui/disable_default_actions.ts index 402f12788b..022573e0ac 100644 --- a/src/ui/disable_default_actions.ts +++ b/src/ui/disable_default_actions.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { registerEventListener } from "#/util/disposable"; +import { registerEventListener } from "#src/util/disposable.js"; /** * Prevent context menu on right click, as this interferes with other event handlers for right mouse diff --git a/src/ui/drag_and_drop.ts b/src/ui/drag_and_drop.ts index 564f08d21b..715e53c590 100644 --- a/src/ui/drag_and_drop.ts +++ b/src/ui/drag_and_drop.ts @@ -14,10 +14,9 @@ * limitations under the License. */ -import "./drag_and_drop.css"; - -import { filterArrayInplace } from "#/util/array"; -import { removeChildren } from "#/util/dom"; +import "#src/ui/drag_and_drop.css"; +import { filterArrayInplace } from "#src/util/array.js"; +import { removeChildren } from "#src/util/dom.js"; let dragStatusElement: HTMLElement | undefined; diff --git a/src/ui/layer_bar.ts b/src/ui/layer_bar.ts index 78b9a6d195..cb6eadeea7 100644 --- a/src/ui/layer_bar.ts +++ b/src/ui/layer_bar.ts @@ -14,28 +14,28 @@ * limitations under the License. */ -import "#/noselect.css"; -import "./layer_bar.css"; - -import svg_plus from "ikonate/icons/plus.svg"; -import { addNewLayer, deleteLayer, makeLayer, ManagedUserLayer } from "#/layer"; -import { LayerGroupViewer } from "#/layer_group_viewer"; -import { NavigationLinkType } from "#/navigation_state"; -import { WatchableValueInterface } from "#/trackable_value"; +import "#src/noselect.css"; +import "#src/ui/layer_bar.css"; +import svg_plus from "ikonate/icons/plus.svg?raw"; +import type { ManagedUserLayer } from "#src/layer/index.js"; +import { addNewLayer, deleteLayer, makeLayer } from "#src/layer/index.js"; +import type { LayerGroupViewer } from "#src/layer_group_viewer.js"; +import { NavigationLinkType } from "#src/navigation_state.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import type { DropLayers } from "#src/ui/layer_drag_and_drop.js"; import { - DropLayers, registerLayerBarDragLeaveHandler, registerLayerBarDropHandlers, registerLayerDragHandlers, -} from "#/ui/layer_drag_and_drop"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { RefCounted } from "#/util/disposable"; -import { removeFromParent } from "#/util/dom"; -import { preventDrag } from "#/util/drag_and_drop"; -import { makeCloseButton } from "#/widget/close_button"; -import { makeDeleteButton } from "#/widget/delete_button"; -import { makeIcon } from "#/widget/icon"; -import { PositionWidget } from "#/widget/position_widget"; +} from "#src/ui/layer_drag_and_drop.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeFromParent } from "#src/util/dom.js"; +import { preventDrag } from "#src/util/drag_and_drop.js"; +import { makeCloseButton } from "#src/widget/close_button.js"; +import { makeDeleteButton } from "#src/widget/delete_button.js"; +import { makeIcon } from "#src/widget/icon.js"; +import { PositionWidget } from "#src/widget/position_widget.js"; class LayerWidget extends RefCounted { element = document.createElement("div"); diff --git a/src/ui/layer_data_sources_tab.ts b/src/ui/layer_data_sources_tab.ts index 127a2b1622..5174f9209b 100644 --- a/src/ui/layer_data_sources_tab.ts +++ b/src/ui/layer_data_sources_tab.ts @@ -18,42 +18,46 @@ * @file Tab for showing layer data sources and coordinate transforms. */ -import "./layer_data_sources_tab.css"; - -import { LocalDataSource } from "#/datasource"; +import "#src/ui/layer_data_sources_tab.css"; +import { LocalDataSource } from "#src/datasource/index.js"; +import type { UserLayer, UserLayerConstructor } from "#src/layer/index.js"; import { changeLayerName, changeLayerType, NewUserLayer, - UserLayer, - UserLayerConstructor, -} from "#/layer"; -import { + USER_LAYER_TABS, +} from "#src/layer/index.js"; +import type { LayerDataSource, LoadedDataSubsource, - LoadedLayerDataSource, -} from "#/layer_data_source"; -import { MeshSource, MultiscaleMeshSource } from "#/mesh/frontend"; -import { SkeletonSource } from "#/skeleton/frontend"; -import { MultiscaleVolumeChunkSource } from "#/sliceview/volume/frontend"; -import { TrackableBooleanCheckbox } from "#/trackable_boolean"; -import { WatchableValue, WatchableValueInterface } from "#/trackable_value"; +} from "#src/layer/layer_data_source.js"; +import { LoadedLayerDataSource } from "#src/layer/layer_data_source.js"; +import { MeshSource, MultiscaleMeshSource } from "#src/mesh/frontend.js"; +import { SkeletonSource } from "#src/skeleton/frontend.js"; +import { MultiscaleVolumeChunkSource } from "#src/sliceview/volume/frontend.js"; +import { TrackableBooleanCheckbox } from "#src/trackable_boolean.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { WatchableValue } from "#src/trackable_value.js"; +import type { DebouncedFunction } from "#src/util/animation_frame_debounce.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { DataType } from "#src/util/data_type.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; import { - animationFrameDebounce, - DebouncedFunction, -} from "#/util/animation_frame_debounce"; -import { CancellationToken } from "#/util/cancellation"; -import { DataType } from "#/util/data_type"; -import { Borrowed, RefCounted } from "#/util/disposable"; -import { removeChildren, removeFromParent, updateChildren } from "#/util/dom"; -import { MessageList, MessageSeverity } from "#/util/message_list"; -import { makeAddButton } from "#/widget/add_button"; -import { CoordinateSpaceTransformWidget } from "#/widget/coordinate_transform"; + removeChildren, + removeFromParent, + updateChildren, +} from "#src/util/dom.js"; +import type { MessageList } from "#src/util/message_list.js"; +import { MessageSeverity } from "#src/util/message_list.js"; +import { makeAddButton } from "#src/widget/add_button.js"; +import { CoordinateSpaceTransformWidget } from "#src/widget/coordinate_transform.js"; import { AutocompleteTextInput, makeCompletionElementWithDescription, -} from "#/widget/multiline_autocomplete"; -import { Tab } from "#/widget/tab_view"; +} from "#src/widget/multiline_autocomplete.js"; +import { Tab } from "#src/widget/tab_view.js"; class SourceUrlAutocomplete extends AutocompleteTextInput { dataSourceView: DataSourceView; @@ -330,7 +334,9 @@ export class DataSourceView extends RefCounted { const newName = userLayer.manager.dataSourceProviderRegistry.suggestLayerName(url); changeLayerName(userLayer.managedLayer, newName); - } catch {} + } catch { + // Ignore errors obtaining a suggested layer name. + } } source.spec = { ...existingSpec, url }; }; @@ -523,3 +529,10 @@ export class LayerDataSourcesTab extends Tab { this.updateLayerTypeDetection(); } } + +USER_LAYER_TABS.push({ + id: "source", + label: "Source", + order: -100, + getter: (layer) => new LayerDataSourcesTab(layer), +}); diff --git a/src/ui/layer_drag_and_drop.ts b/src/ui/layer_drag_and_drop.ts index 131c46cfaa..fb6f87d9dc 100644 --- a/src/ui/layer_drag_and_drop.ts +++ b/src/ui/layer_drag_and_drop.ts @@ -14,26 +14,26 @@ * limitations under the License. */ +import type { LayerListSpecification } from "#src/layer/index.js"; import { initializeLayerFromSpecShowErrorStatus, - LayerListSpecification, ManagedUserLayer, -} from "#/layer"; -import { popDragStatus, pushDragStatus } from "#/ui/drag_and_drop"; -import { Borrowed, Owned } from "#/util/disposable"; +} from "#src/layer/index.js"; +import { popDragStatus, pushDragStatus } from "#src/ui/drag_and_drop.js"; +import type { Borrowed, Owned } from "#src/util/disposable.js"; +import type { DragInfo } from "#src/util/drag_and_drop.js"; import { decodeParametersFromDragTypeList, - DragInfo, encodeParametersAsDragType, getDropEffect, setDropEffect, -} from "#/util/drag_and_drop"; +} from "#src/util/drag_and_drop.js"; import { parseArray, verifyBoolean, verifyObjectProperty, verifyString, -} from "#/util/json"; +} from "#src/util/json.js"; const layerDragTypePrefix = "neuroglancer-layer\0"; @@ -390,7 +390,9 @@ export function getDropLayers( result.dragType = info.dragType; result.layers = new Map(layers); return result; - } catch {} + } catch { + // Ignore invalid drag info. + } } return undefined; } diff --git a/src/ui/layer_list_panel.ts b/src/ui/layer_list_panel.ts index 60b99ff391..d3251143b8 100644 --- a/src/ui/layer_list_panel.ts +++ b/src/ui/layer_list_panel.ts @@ -14,40 +14,39 @@ * limitations under the License. */ -import "./layer_list_panel.css"; - -import svg_controls_alt from "ikonate/icons/controls-alt.svg"; -import svg_eye_crossed from "ikonate/icons/eye-crossed.svg"; -import svg_eye from "ikonate/icons/eye.svg"; -import { - deleteLayer, +import "#src/ui/layer_list_panel.css"; +import svg_controls_alt from "ikonate/icons/controls-alt.svg?raw"; +import svg_eye_crossed from "ikonate/icons/eye-crossed.svg?raw"; +import svg_eye from "ikonate/icons/eye.svg?raw"; +import type { LayerManager, ManagedUserLayer, TopLevelLayerListSpecification, -} from "#/layer"; -import { TrackableBooleanCheckbox } from "#/trackable_boolean"; +} from "#src/layer/index.js"; +import { deleteLayer } from "#src/layer/index.js"; +import { TrackableBooleanCheckbox } from "#src/trackable_boolean.js"; +import type { DropLayers } from "#src/ui/layer_drag_and_drop.js"; import { - DropLayers, registerLayerBarDragLeaveHandler, registerLayerBarDropHandlers, registerLayerDragHandlers, -} from "#/ui/layer_drag_and_drop"; -import { LayerNameWidget } from "#/ui/layer_side_panel"; -import { SidePanel, SidePanelManager } from "#/ui/side_panel"; +} from "#src/ui/layer_drag_and_drop.js"; +import { LayerNameWidget } from "#src/ui/layer_side_panel.js"; +import type { SidePanelManager } from "#src/ui/side_panel.js"; +import { SidePanel } from "#src/ui/side_panel.js"; +import type { SidePanelLocation } from "#src/ui/side_panel_location.js"; import { DEFAULT_SIDE_PANEL_LOCATION, - SidePanelLocation, TrackableSidePanelLocation, -} from "#/ui/side_panel_location"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { RefCounted } from "#/util/disposable"; -import { updateChildren } from "#/util/dom"; -import { emptyToUndefined } from "#/util/json"; -import { Trackable } from "#/util/trackable"; -import { makeDeleteButton } from "#/widget/delete_button"; -import { makeIcon } from "#/widget/icon"; - -import { CheckboxIcon } from "../widget/checkbox_icon"; +} from "#src/ui/side_panel_location.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { updateChildren } from "#src/util/dom.js"; +import { emptyToUndefined } from "#src/util/json.js"; +import type { Trackable } from "#src/util/trackable.js"; +import { CheckboxIcon } from "#src/widget/checkbox_icon.js"; +import { makeDeleteButton } from "#src/widget/delete_button.js"; +import { makeIcon } from "#src/widget/icon.js"; const DEFAULT_LAYER_LIST_PANEL_LOCATION: SidePanelLocation = { ...DEFAULT_SIDE_PANEL_LOCATION, diff --git a/src/ui/layer_side_panel.ts b/src/ui/layer_side_panel.ts index b8f0988f12..b10ec3049f 100644 --- a/src/ui/layer_side_panel.ts +++ b/src/ui/layer_side_panel.ts @@ -18,40 +18,39 @@ * @file Side panel for displaying/editing layer details. */ -import "#/ui/layer_side_panel.css"; +import "#src/ui/layer_side_panel.css"; -import svg_cursor from "ikonate/icons/cursor.svg"; +import svg_cursor from "ikonate/icons/cursor.svg?raw"; +import type { + ManagedUserLayer, + SelectedLayerState, + UserLayer, +} from "#src/layer/index.js"; import { changeLayerName, changeLayerType, deleteLayer, layerTypes, - ManagedUserLayer, - SelectedLayerState, - UserLayer, -} from "#/layer"; -import { ElementVisibilityFromTrackableBoolean } from "#/trackable_boolean"; -import { CachedWatchableValue, observeWatchable } from "#/trackable_value"; -import { - LAYER_SIDE_PANEL_DEFAULT_LOCATION, - UserLayerSidePanelState, -} from "#/ui//layer_side_panel_state"; -import { popDragStatus, pushDragStatus } from "#/ui/drag_and_drop"; +} from "#src/layer/index.js"; +import { ElementVisibilityFromTrackableBoolean } from "#src/trackable_boolean.js"; import { - DRAG_OVER_CLASSNAME, - DragSource, - SidePanel, - SidePanelManager, -} from "#/ui/side_panel"; -import { RefCounted } from "#/util/disposable"; + CachedWatchableValue, + observeWatchable, +} from "#src/trackable_value.js"; +import type { UserLayerSidePanelState } from "#src/ui//layer_side_panel_state.js"; +import { LAYER_SIDE_PANEL_DEFAULT_LOCATION } from "#src/ui//layer_side_panel_state.js"; +import { popDragStatus, pushDragStatus } from "#src/ui/drag_and_drop.js"; +import type { DragSource, SidePanelManager } from "#src/ui/side_panel.js"; +import { DRAG_OVER_CLASSNAME, SidePanel } from "#src/ui/side_panel.js"; +import { RefCounted } from "#src/util/disposable.js"; import { KeyboardEventBinder, registerActionListener, -} from "#/util/keyboard_bindings"; -import { EventActionMap } from "#/util/mouse_bindings"; -import { CheckboxIcon } from "#/widget/checkbox_icon"; -import { makeDeleteButton } from "#/widget/delete_button"; -import { TabView } from "#/widget/tab_view"; +} from "#src/util/keyboard_bindings.js"; +import { EventActionMap } from "#src/util/mouse_bindings.js"; +import { CheckboxIcon } from "#src/widget/checkbox_icon.js"; +import { makeDeleteButton } from "#src/widget/delete_button.js"; +import { TabView } from "#src/widget/tab_view.js"; const layerNameInputEventMap = EventActionMap.fromObject({ escape: { action: "cancel" }, diff --git a/src/ui/layer_side_panel_state.ts b/src/ui/layer_side_panel_state.ts index 27a0e24d2c..1f60e08ae9 100644 --- a/src/ui/layer_side_panel_state.ts +++ b/src/ui/layer_side_panel_state.ts @@ -14,23 +14,23 @@ * limitations under the License. */ -import { UserLayer } from "#/layer"; -import { WatchableValue } from "#/trackable_value"; +import type { UserLayer } from "#src/layer/index.js"; +import { WatchableValue } from "#src/trackable_value.js"; +import type { SidePanelLocation } from "#src/ui/side_panel_location.js"; import { DEFAULT_SIDE_PANEL_LOCATION, - SidePanelLocation, TrackableSidePanelLocation, -} from "#/ui/side_panel_location"; -import { arraysEqual } from "#/util/array"; -import { RefCounted } from "#/util/disposable"; +} from "#src/ui/side_panel_location.js"; +import { arraysEqual } from "#src/util/array.js"; +import { RefCounted } from "#src/util/disposable.js"; import { parseArray, verifyObject, verifyOptionalObjectProperty, verifyString, verifyStringArray, -} from "#/util/json"; -import { Signal } from "#/util/signal"; +} from "#src/util/json.js"; +import { Signal } from "#src/util/signal.js"; const TAB_JSON_KEY = "tab"; const TABS_JSON_KEY = "tabs"; diff --git a/src/ui/minimal_viewer.ts b/src/ui/minimal_viewer.ts index 71264ea2c9..f66b171841 100644 --- a/src/ui/minimal_viewer.ts +++ b/src/ui/minimal_viewer.ts @@ -14,17 +14,26 @@ * limitations under the License. */ -import "#/sliceview/chunk_format_handlers"; +import "#src/sliceview/chunk_format_handlers.js"; -import { StatusMessage } from "#/status"; -import { DisplayContext } from "#/display_context"; -import { Viewer, ViewerOptions } from "#/viewer"; +import { DisplayContext } from "#src/display_context.js"; +import { StatusMessage } from "#src/status.js"; +import type { ViewerOptions } from "#src/viewer.js"; +import { Viewer } from "#src/viewer.js"; -export function makeMinimalViewer( - options?: Partial, - target = document.getElementById("neuroglancer-container")!, -) { +export interface MinimalViewerOptions extends ViewerOptions { + target: HTMLElement; +} + +export function makeMinimalViewer(options: Partial = {}) { try { + let { target = document.getElementById("neuroglancer-container") } = + options; + if (target === null) { + target = document.createElement("div"); + target.id = "neuroglancer-container"; + document.body.appendChild(target); + } const display = new DisplayContext(target); return new Viewer(display, options); } catch (error) { diff --git a/src/ui/position_drag_and_drop.ts b/src/ui/position_drag_and_drop.ts index 8cc335e1be..507e95b717 100644 --- a/src/ui/position_drag_and_drop.ts +++ b/src/ui/position_drag_and_drop.ts @@ -14,16 +14,17 @@ * limitations under the License. */ -import { dimensionNamesFromJson } from "#/coordinate_transform"; -import { Position } from "#/navigation_state"; -import { Borrowed, registerEventListener } from "#/util/disposable"; +import { dimensionNamesFromJson } from "#src/coordinate_transform.js"; +import type { Position } from "#src/navigation_state.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { registerEventListener } from "#src/util/disposable.js"; import { parseArray, verifyFiniteFloat, verifyObject, verifyObjectProperty, -} from "#/util/json"; -import { positionDragType } from "#/widget/position_widget"; +} from "#src/util/json.js"; +import { positionDragType } from "#src/widget/position_widget.js"; export function setupPositionDropHandlers( target: EventTarget, diff --git a/src/ui/segment_list.ts b/src/ui/segment_list.ts index b9597ff7c6..2d18e5f229 100644 --- a/src/ui/segment_list.ts +++ b/src/ui/segment_list.ts @@ -14,85 +14,85 @@ * limitations under the License. */ -import "./segment_list.css"; +import "#src/ui/segment_list.css"; -import type { DebouncedFunc } from "lodash"; -import debounce from "lodash/debounce"; -import throttle from "lodash/throttle"; +import type { DebouncedFunc } from "lodash-es"; +import { debounce, throttle } from "lodash-es"; +import type { + SegmentationUserLayer, + SegmentationUserLayerGroupState, +} from "#src/layer/segmentation/index.js"; +import type { SegmentationDisplayState } from "#src/segmentation_display_state/frontend.js"; import { registerCallbackWhenSegmentationDisplayStateChanged, - SegmentationDisplayState, SegmentWidgetWithExtraColumnsFactory, -} from "#/segmentation_display_state/frontend"; +} from "#src/segmentation_display_state/frontend.js"; +import type { + ExplicitIdQuery, + FilterQuery, + InlineSegmentNumericalProperty, + NumericalPropertyConstraint, + PreprocessedSegmentPropertyMap, + PropertyHistogram, + QueryResult, +} from "#src/segmentation_display_state/property_map.js"; import { changeTagConstraintInSegmentQuery, executeSegmentQuery, - ExplicitIdQuery, - FilterQuery, findQueryResultIntersectionSize, forEachQueryResultSegmentIdGenerator, - InlineSegmentNumericalProperty, isQueryUnconstrained, - NumericalPropertyConstraint, parseSegmentQuery, - PreprocessedSegmentPropertyMap, - PropertyHistogram, queryIncludesColumn, - QueryResult, unparseSegmentQuery, updatePropertyHistograms, -} from "#/segmentation_display_state/property_map"; -import type { - SegmentationUserLayer, - SegmentationUserLayerGroupState, -} from "#/segmentation_user_layer"; +} from "#src/segmentation_display_state/property_map.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { observeWatchable, WatchableValue } from "#src/trackable_value.js"; +import { getDefaultSelectBindings } from "#src/ui/default_input_event_bindings.js"; +import { SELECT_SEGMENTS_TOOLS_ID } from "#src/ui/segment_select_tools.js"; import { - observeWatchable, - WatchableValue, - WatchableValueInterface, -} from "#/trackable_value"; -import { getDefaultSelectBindings } from "#/ui/default_input_event_bindings"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { ArraySpliceOp, getFixedOrderMergeSplices } from "#/util/array"; -import { setClipboard } from "#/util/clipboard"; -import { RefCounted } from "#/util/disposable"; -import { removeChildren, updateInputFieldWidth } from "#/util/dom"; + ANNOTATE_MERGE_SEGMENTS_TOOL_ID, + ANNOTATE_SPLIT_SEGMENTS_TOOL_ID, +} from "#src/ui/segment_split_merge_tools.js"; +import { makeToolButton } from "#src/ui/tool.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import type { ArraySpliceOp } from "#src/util/array.js"; +import { getFixedOrderMergeSplices } from "#src/util/array.js"; +import { setClipboard } from "#src/util/clipboard.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeChildren, updateInputFieldWidth } from "#src/util/dom.js"; import { EventActionMap, KeyboardEventBinder, registerActionListener, -} from "#/util/keyboard_bindings"; -import { MouseEventBinder } from "#/util/mouse_bindings"; -import { neverSignal, NullarySignal, Signal } from "#/util/signal"; -import { Uint64 } from "#/util/uint64"; -import { CheckboxIcon } from "#/widget/checkbox_icon"; -import { makeCopyButton } from "#/widget/copy_button"; -import { DependentViewWidget } from "#/widget/dependent_view_widget"; -import { Tab } from "#/widget/tab_view"; -import { VirtualList, VirtualListSource } from "#/widget/virtual_list"; +} from "#src/util/keyboard_bindings.js"; +import type { DataTypeInterval } from "#src/util/lerp.js"; import { clampToInterval, computeInvlerp, dataTypeCompare, - DataTypeInterval, dataTypeIntervalEqual, getClampedInterval, getIntervalBoundsEffectiveFraction, parseDataTypeValue, -} from "#/util/lerp"; +} from "#src/util/lerp.js"; +import { MouseEventBinder } from "#src/util/mouse_bindings.js"; +import { neverSignal, NullarySignal, Signal } from "#src/util/signal.js"; +import { Uint64 } from "#src/util/uint64.js"; +import { CheckboxIcon } from "#src/widget/checkbox_icon.js"; +import { makeCopyButton } from "#src/widget/copy_button.js"; +import { DependentViewWidget } from "#src/widget/dependent_view_widget.js"; +import { makeEyeButton } from "#src/widget/eye_button.js"; +import type { RangeAndWindowIntervals } from "#src/widget/invlerp.js"; import { CdfController, getUpdatedRangeAndWindowParameters, - RangeAndWindowIntervals, -} from "#/widget/invlerp"; -import { makeToolButton } from "#/ui/tool"; -import { - ANNOTATE_MERGE_SEGMENTS_TOOL_ID, - ANNOTATE_SPLIT_SEGMENTS_TOOL_ID, -} from "#/ui/segment_split_merge_tools"; -import { SELECT_SEGMENTS_TOOLS_ID } from "#/ui/segment_select_tools"; -import { makeEyeButton } from "#/widget/eye_button"; -import { makeStarButton } from "#/widget/star_button"; +} from "#src/widget/invlerp.js"; +import { makeStarButton } from "#src/widget/star_button.js"; +import { Tab } from "#src/widget/tab_view.js"; +import type { VirtualListSource } from "#src/widget/virtual_list.js"; +import { VirtualList } from "#src/widget/virtual_list.js"; const tempUint64 = new Uint64(); @@ -725,7 +725,9 @@ class NumericalPropertiesSummary extends RefCounted { value as number, ); this.bounds[boundType].changed.dispatch(); - } catch {} + } catch { + // Ignore invalid input. + } updateInputBoundValue( e, this.bounds[boundType].value[propertyIndex][ diff --git a/src/ui/segment_select_tools.ts b/src/ui/segment_select_tools.ts index 99e302840f..c1209e9fb8 100644 --- a/src/ui/segment_select_tools.ts +++ b/src/ui/segment_select_tools.ts @@ -19,21 +19,18 @@ * limitations under the License. */ -import { SegmentationUserLayer } from "#/segmentation_user_layer"; -import { removeChildren } from "#/util/dom"; +import type { SegmentationUserLayer } from "#src/layer/segmentation/index.js"; +import type { ToolActivation } from "#src/ui/tool.js"; import { makeToolActivationStatusMessageWithHeader, registerTool, LayerTool, - ToolActivation, -} from "#/ui/tool"; -import { - ActionEvent, - EventActionMap, - Modifiers, -} from "#/util/event_action_map"; -import { startRelativeMouseDrag } from "#/util/mouse_drag"; -import { globalModifiers } from "#/util/keyboard_bindings"; +} from "#src/ui/tool.js"; +import { removeChildren } from "#src/util/dom.js"; +import type { ActionEvent } from "#src/util/event_action_map.js"; +import { EventActionMap, Modifiers } from "#src/util/event_action_map.js"; +import { globalModifiers } from "#src/util/keyboard_bindings.js"; +import { startRelativeMouseDrag } from "#src/util/mouse_drag.js"; export const SELECT_SEGMENTS_TOOLS_ID = "selectSegments"; @@ -180,8 +177,10 @@ export class SelectSegmentsTool extends LayerTool { } } -export function registerSegmentSelectTools() { - registerTool(SegmentationUserLayer, SELECT_SEGMENTS_TOOLS_ID, (layer) => { +export function registerSegmentSelectTools( + contextType: typeof SegmentationUserLayer, +) { + registerTool(contextType, SELECT_SEGMENTS_TOOLS_ID, (layer) => { return new SelectSegmentsTool(layer); }); } diff --git a/src/ui/segment_split_merge_tools.ts b/src/ui/segment_split_merge_tools.ts index 21c9223b24..4b3211b515 100644 --- a/src/ui/segment_split_merge_tools.ts +++ b/src/ui/segment_split_merge_tools.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import "./segment_split_merge_tools.css"; +import "#src/ui/segment_split_merge_tools.css"; +import type { SegmentationUserLayer } from "#src/layer/segmentation/index.js"; import { augmentSegmentId, bindSegmentListWidth, @@ -23,24 +24,23 @@ import { registerCallbackWhenSegmentationDisplayStateChanged, resetTemporaryVisibleSegmentsState, Uint64MapEntry, -} from "#/segmentation_display_state/frontend"; +} from "#src/segmentation_display_state/frontend.js"; import { isBaseSegmentId, VisibleSegmentEquivalencePolicy, -} from "#/segmentation_graph/segment_id"; -import { SegmentationUserLayer } from "#/segmentation_user_layer"; -import { StatusMessage } from "#/status"; -import { WatchableValue } from "#/trackable_value"; +} from "#src/segmentation_graph/segment_id.js"; +import { StatusMessage } from "#src/status.js"; +import { WatchableValue } from "#src/trackable_value.js"; +import type { ToolActivation } from "#src/ui/tool.js"; import { LayerTool, makeToolActivationStatusMessageWithHeader, registerTool, - ToolActivation, -} from "#/ui/tool"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { removeChildren } from "#/util/dom"; -import { EventActionMap } from "#/util/keyboard_bindings"; -import { Uint64 } from "#/util/uint64"; +} from "#src/ui/tool.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import { removeChildren } from "#src/util/dom.js"; +import { EventActionMap } from "#src/util/keyboard_bindings.js"; +import { Uint64 } from "#src/util/uint64.js"; export const ANNOTATE_MERGE_SEGMENTS_TOOL_ID = "mergeSegments"; export const ANNOTATE_SPLIT_SEGMENTS_TOOL_ID = "splitSegments"; @@ -536,20 +536,14 @@ export class SplitSegmentsTool extends LayerTool { } } -export function registerSegmentSplitMergeTools() { - registerTool( - SegmentationUserLayer, - ANNOTATE_MERGE_SEGMENTS_TOOL_ID, - (layer) => { - return new MergeSegmentsTool(layer); - }, - ); +export function registerSegmentSplitMergeTools( + contextType: typeof SegmentationUserLayer, +) { + registerTool(contextType, ANNOTATE_MERGE_SEGMENTS_TOOL_ID, (layer) => { + return new MergeSegmentsTool(layer); + }); - registerTool( - SegmentationUserLayer, - ANNOTATE_SPLIT_SEGMENTS_TOOL_ID, - (layer) => { - return new SplitSegmentsTool(layer); - }, - ); + registerTool(contextType, ANNOTATE_SPLIT_SEGMENTS_TOOL_ID, (layer) => { + return new SplitSegmentsTool(layer); + }); } diff --git a/src/ui/segmentation_display_options_tab.ts b/src/ui/segmentation_display_options_tab.ts index 62ec572cb6..a37b4339a7 100644 --- a/src/ui/segmentation_display_options_tab.ts +++ b/src/ui/segmentation_display_options_tab.ts @@ -14,20 +14,18 @@ * limitations under the License. */ -import { Overlay } from "#/overlay"; -import { - LAYER_CONTROLS, - SegmentationUserLayer, - SKELETON_RENDERING_SHADER_CONTROL_TOOL_ID, -} from "#/segmentation_user_layer"; -import { DependentViewWidget } from "#/widget/dependent_view_widget"; -import { makeHelpButton } from "#/widget/help_button"; -import { addLayerControlToOptionsTab } from "#/widget/layer_control"; -import { LinkedLayerGroupWidget } from "#/widget/linked_layer"; -import { makeMaximizeButton } from "#/widget/maximize_button"; -import { ShaderCodeWidget } from "#/widget/shader_code_widget"; -import { ShaderControls } from "#/widget/shader_controls"; -import { Tab } from "#/widget/tab_view"; +import type { SegmentationUserLayer } from "#src/layer/segmentation/index.js"; +import { SKELETON_RENDERING_SHADER_CONTROL_TOOL_ID } from "#src/layer/segmentation/json_keys.js"; +import { LAYER_CONTROLS } from "#src/layer/segmentation/layer_controls.js"; +import { Overlay } from "#src/overlay.js"; +import { DependentViewWidget } from "#src/widget/dependent_view_widget.js"; +import { makeHelpButton } from "#src/widget/help_button.js"; +import { addLayerControlToOptionsTab } from "#src/widget/layer_control.js"; +import { LinkedLayerGroupWidget } from "#src/widget/linked_layer.js"; +import { makeMaximizeButton } from "#src/widget/maximize_button.js"; +import { ShaderCodeWidget } from "#src/widget/shader_code_widget.js"; +import { ShaderControls } from "#src/widget/shader_controls.js"; +import { Tab } from "#src/widget/tab_view.js"; function makeSkeletonShaderCodeWidget(layer: SegmentationUserLayer) { return new ShaderCodeWidget({ diff --git a/src/ui/selection_details.ts b/src/ui/selection_details.ts index 77808336d6..53f7cdfd90 100644 --- a/src/ui/selection_details.ts +++ b/src/ui/selection_details.ts @@ -14,25 +14,26 @@ * limitations under the License. */ -import "./selection_details.css"; +import "#src/ui/selection_details.css"; -import svg_arrowLeft from "ikonate/icons/arrow-left.svg"; -import svg_arrowRight from "ikonate/icons/arrow-right.svg"; -import { +import svg_arrowLeft from "ikonate/icons/arrow-left.svg?raw"; +import svg_arrowRight from "ikonate/icons/arrow-right.svg?raw"; +import type { SelectedLayerState, TopLevelLayerListSpecification, TrackableDataSelectionState, -} from "#/layer"; -import { getDefaultSelectBindings } from "#/ui/default_input_event_bindings"; -import { SidePanel, SidePanelManager } from "#/ui/side_panel"; -import { setClipboard } from "#/util/clipboard"; -import { Borrowed } from "#/util/disposable"; -import { MouseEventBinder } from "#/util/mouse_bindings"; -import { CheckboxIcon } from "#/widget/checkbox_icon"; -import { makeCopyButton } from "#/widget/copy_button"; -import { DependentViewWidget } from "#/widget/dependent_view_widget"; -import { makeIcon } from "#/widget/icon"; -import { makeMoveToButton } from "#/widget/move_to_button"; +} from "#src/layer/index.js"; +import { getDefaultSelectBindings } from "#src/ui/default_input_event_bindings.js"; +import type { SidePanelManager } from "#src/ui/side_panel.js"; +import { SidePanel } from "#src/ui/side_panel.js"; +import { setClipboard } from "#src/util/clipboard.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { MouseEventBinder } from "#src/util/mouse_bindings.js"; +import { CheckboxIcon } from "#src/widget/checkbox_icon.js"; +import { makeCopyButton } from "#src/widget/copy_button.js"; +import { DependentViewWidget } from "#src/widget/dependent_view_widget.js"; +import { makeIcon } from "#src/widget/icon.js"; +import { makeMoveToButton } from "#src/widget/move_to_button.js"; export function isWithinSelectionPanel(element: HTMLElement) { return element.closest(".neuroglancer-selection-details"); diff --git a/src/ui/side_panel.ts b/src/ui/side_panel.ts index 383aaa5995..a0e9c285f7 100644 --- a/src/ui/side_panel.ts +++ b/src/ui/side_panel.ts @@ -14,17 +14,18 @@ * limitations under the License. */ -import "./side_panel.css"; - -import { DisplayContext } from "#/display_context"; -import { popDragStatus, pushDragStatus } from "#/ui/drag_and_drop"; -import { Side, TrackableSidePanelLocation } from "#/ui/side_panel_location"; -import { RefCounted } from "#/util/disposable"; -import { updateChildren } from "#/util/dom"; -import { startRelativeMouseDrag } from "#/util/mouse_drag"; -import { Signal } from "#/util/signal"; -import { WatchableVisibilityPriority } from "#/visibility_priority/frontend"; -import { makeCloseButton } from "#/widget/close_button"; +import "#src/ui/side_panel.css"; + +import type { DisplayContext } from "#src/display_context.js"; +import { popDragStatus, pushDragStatus } from "#src/ui/drag_and_drop.js"; +import type { Side } from "#src/ui/side_panel_location.js"; +import { TrackableSidePanelLocation } from "#src/ui/side_panel_location.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { updateChildren } from "#src/util/dom.js"; +import { startRelativeMouseDrag } from "#src/util/mouse_drag.js"; +import { Signal } from "#src/util/signal.js"; +import { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; +import { makeCloseButton } from "#src/widget/close_button.js"; export const DRAG_OVER_CLASSNAME = "neuroglancer-drag-over"; diff --git a/src/ui/side_panel_location.ts b/src/ui/side_panel_location.ts index cceab4de89..0d4c92f085 100644 --- a/src/ui/side_panel_location.ts +++ b/src/ui/side_panel_location.ts @@ -14,16 +14,16 @@ * limitations under the License. */ +import type { WatchableValueInterface } from "#src/trackable_value.js"; import { verifyBoolean, verifyFiniteFloat, verifyObject, verifyOptionalObjectProperty, verifyPositiveInt, -} from "#/util/json"; -import { Signal } from "#/util/signal"; -import { Trackable } from "#/util/trackable"; -import { WatchableValueInterface } from "../trackable_value"; +} from "#src/util/json.js"; +import { Signal } from "#src/util/signal.js"; +import type { Trackable } from "#src/util/trackable.js"; export type Side = "left" | "right" | "top" | "bottom"; diff --git a/src/ui/state_editor.ts b/src/ui/state_editor.ts index dfbb0702c9..d22a6aca4f 100644 --- a/src/ui/state_editor.ts +++ b/src/ui/state_editor.ts @@ -19,19 +19,19 @@ */ import "codemirror/lib/codemirror.css"; -import "codemirror/mode/javascript/javascript"; -import "codemirror/addon/fold/foldcode"; -import "codemirror/addon/fold/foldgutter"; -import "codemirror/addon/fold/brace-fold"; +import "codemirror/mode/javascript/javascript.js"; +import "codemirror/addon/fold/foldcode.js"; +import "codemirror/addon/fold/foldgutter.js"; +import "codemirror/addon/fold/brace-fold.js"; import "codemirror/addon/fold/foldgutter.css"; import "codemirror/addon/lint/lint.css"; -import "./state_editor.css"; - import CodeMirror from "codemirror"; -import debounce from "lodash/debounce"; -import { Overlay } from "#/overlay"; -import { getCachedJson } from "#/util/trackable"; -import { Viewer } from "#/viewer"; +import { debounce } from "lodash-es"; +import { Overlay } from "#src/overlay.js"; +import "#src/ui/state_editor.css"; + +import { getCachedJson } from "#src/util/trackable.js"; +import type { Viewer } from "#src/viewer.js"; const valueUpdateDelay = 100; diff --git a/src/ui/statistics.ts b/src/ui/statistics.ts index a3d7ca565c..f0137b9313 100644 --- a/src/ui/statistics.ts +++ b/src/ui/statistics.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import "#/ui/statistics.css"; +import "#src/ui/statistics.css"; -import debounce from "lodash/debounce"; +import { debounce } from "lodash-es"; import { ChunkDownloadStatistics, ChunkMemoryStatistics, @@ -26,23 +26,21 @@ import { getChunkStateStatisticIndex, numChunkMemoryStatistics, numChunkStates, -} from "#/chunk_manager/base"; -import { +} from "#src/chunk_manager/base.js"; +import type { ChunkQueueManager, ChunkSource, ChunkStatistics, -} from "#/chunk_manager/frontend"; -import { WatchableValueInterface } from "#/trackable_value"; -import { - SidePanelLocation, - TrackableSidePanelLocation, -} from "#/ui/side_panel_location"; -import { Borrowed } from "#/util/disposable"; -import { removeChildren } from "#/util/dom"; -import { emptyToUndefined } from "#/util/json"; -import { Trackable } from "#/util/trackable"; - -import { SidePanel, SidePanelManager } from "./side_panel"; +} from "#src/chunk_manager/frontend.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import type { SidePanelManager } from "#src/ui/side_panel.js"; +import { SidePanel } from "#src/ui/side_panel.js"; +import type { SidePanelLocation } from "#src/ui/side_panel_location.js"; +import { TrackableSidePanelLocation } from "#src/ui/side_panel_location.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { removeChildren } from "#src/util/dom.js"; +import { emptyToUndefined } from "#src/util/json.js"; +import type { Trackable } from "#src/util/trackable.js"; const DEFAULT_STATISTICS_PANEL_LOCATION: SidePanelLocation = { side: "bottom", diff --git a/src/ui/title.ts b/src/ui/title.ts index e5ba093f55..3df180933f 100644 --- a/src/ui/title.ts +++ b/src/ui/title.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { WatchableValueInterface } from "#/trackable_value"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; export function bindTitle(title: WatchableValueInterface) { const debouncedSetTitle = animationFrameDebounce(() => { diff --git a/src/ui/tool.ts b/src/ui/tool.ts index 374bf13303..c422e430ff 100644 --- a/src/ui/tool.ts +++ b/src/ui/tool.ts @@ -18,22 +18,27 @@ * @file Support for defining user-selectable tools. */ -import "./tool.css"; - -import debounce from "lodash/debounce"; -import { MouseSelectionState, UserLayer } from "#/layer"; -import { StatusMessage } from "#/status"; -import { TrackableValueInterface } from "#/trackable_value"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { Borrowed, Owned, RefCounted } from "#/util/disposable"; -import { +import "#src/ui/tool.css"; + +import { debounce } from "lodash-es"; +import type { MouseSelectionState, UserLayer } from "#src/layer/index.js"; +import { StatusMessage } from "#src/status.js"; +import type { TrackableValueInterface } from "#src/trackable_value.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import type { Borrowed, Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import type { ActionEvent, EventActionMap, - registerActionListener, -} from "#/util/event_action_map"; -import { verifyObject, verifyObjectProperty, verifyString } from "#/util/json"; -import { AnyConstructor } from "#/util/mixin"; -import { Signal } from "#/util/signal"; +} from "#src/util/event_action_map.js"; +import { registerActionListener } from "#src/util/event_action_map.js"; +import { + verifyObject, + verifyObjectProperty, + verifyString, +} from "#src/util/json.js"; +import type { AnyConstructor } from "#src/util/mixin.js"; +import { Signal } from "#src/util/signal.js"; const TOOL_KEY_PATTERN = /^[A-Z]$/; @@ -66,7 +71,7 @@ export class ToolActivation extends RefCounted { } } -export abstract class Tool extends RefCounted { +export abstract class Tool extends RefCounted { changed = new Signal(); keyBinding: string | undefined = undefined; @@ -134,7 +139,7 @@ export abstract class LegacyTool< } } -export function restoreTool( +export function restoreTool( context: Context, obj: unknown, ) { @@ -176,7 +181,7 @@ export function restoreLegacyTool(layer: UserLayer, obj: any) { return getter(layer, obj); } -export type ToolGetter = ( +export type ToolGetter = ( context: Context, options: any, ) => Owned | undefined; @@ -187,13 +192,13 @@ export type LegacyToolGetter = ( ) => Owned | undefined; const legacyTools = new Map(); -const toolsForPrototype = new Map>(); +const toolsForPrototype = new Map>(); export function registerLegacyTool(type: string, getter: LegacyToolGetter) { legacyTools.set(type, getter); } -export function registerTool( +export function registerTool( contextType: AnyConstructor, type: string, getter: ToolGetter, @@ -403,7 +408,7 @@ export class GlobalToolBinder extends RefCounted { } export class LocalToolBinder< - Context extends Object = Object, + Context extends object = object, > extends RefCounted { // Maps the the tool key (i.e. "A", "B", ...) to the bound tool. bindings = new Map>(); @@ -486,7 +491,7 @@ export class LocalToolBinder< } } -export class ToolBindingWidget extends RefCounted { +export class ToolBindingWidget extends RefCounted { element = document.createElement("div"); private toolJsonString = JSON.stringify(this.toolJson); constructor( diff --git a/src/ui/url_hash_binding.ts b/src/ui/url_hash_binding.ts index 3c23925273..48d6e40099 100644 --- a/src/ui/url_hash_binding.ts +++ b/src/ui/url_hash_binding.ts @@ -14,18 +14,19 @@ * limitations under the License. */ -import debounce from "lodash/debounce"; -import { CredentialsManager } from "#/credentials_provider"; -import { StatusMessage } from "#/status"; -import { WatchableValue } from "#/trackable_value"; -import { RefCounted } from "#/util/disposable"; -import { responseJson } from "#/util/http_request"; -import { urlSafeParse, verifyObject } from "#/util/json"; +import { debounce } from "lodash-es"; +import type { CredentialsManager } from "#src/credentials_provider/index.js"; +import { StatusMessage } from "#src/status.js"; +import { WatchableValue } from "#src/trackable_value.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { responseJson } from "#src/util/http_request.js"; +import { urlSafeParse, verifyObject } from "#src/util/json.js"; import { cancellableFetchSpecialOk, parseSpecialUrl, -} from "#/util/special_protocol_request"; -import { getCachedJson, Trackable } from "#/util/trackable"; +} from "#src/util/special_protocol_request.js"; +import type { Trackable } from "#src/util/trackable.js"; +import { getCachedJson } from "#src/util/trackable.js"; /** * @file Implements a binding between a Trackable value and the URL hash state. diff --git a/src/ui/viewer_settings.ts b/src/ui/viewer_settings.ts index a11990bca8..5c41ad8fa6 100644 --- a/src/ui/viewer_settings.ts +++ b/src/ui/viewer_settings.ts @@ -14,22 +14,26 @@ * limitations under the License. */ -import "./viewer_settings.css"; +import "#src/ui/viewer_settings.css"; -import { TrackableBooleanCheckbox } from "#/trackable_boolean"; -import { TrackableValue, WatchableValueInterface } from "#/trackable_value"; -import { SidePanel, SidePanelManager } from "#/ui/side_panel"; +import { TrackableBooleanCheckbox } from "#src/trackable_boolean.js"; +import type { + TrackableValue, + WatchableValueInterface, +} from "#src/trackable_value.js"; +import type { SidePanelManager } from "#src/ui/side_panel.js"; +import { SidePanel } from "#src/ui/side_panel.js"; +import type { SidePanelLocation } from "#src/ui/side_panel_location.js"; import { DEFAULT_SIDE_PANEL_LOCATION, - SidePanelLocation, TrackableSidePanelLocation, -} from "#/ui/side_panel_location"; -import { vec3 } from "#/util/geom"; -import { emptyToUndefined } from "#/util/json"; -import { Viewer } from "#/viewer"; -import { ColorWidget } from "#/widget/color"; -import { NumberInputWidget } from "#/widget/number_input_widget"; -import { TextInputWidget } from "#/widget/text_input"; +} from "#src/ui/side_panel_location.js"; +import type { vec3 } from "#src/util/geom.js"; +import { emptyToUndefined } from "#src/util/json.js"; +import type { Viewer } from "#src/viewer.js"; +import { ColorWidget } from "#src/widget/color.js"; +import { NumberInputWidget } from "#src/widget/number_input_widget.js"; +import { TextInputWidget } from "#src/widget/text_input.js"; const DEFAULT_SETTINGS_PANEL_LOCATION: SidePanelLocation = { ...DEFAULT_SIDE_PANEL_LOCATION, diff --git a/src/uint64_map.spec.ts b/src/uint64_map.spec.ts index 379aef8dc8..c908755eb0 100644 --- a/src/uint64_map.spec.ts +++ b/src/uint64_map.spec.ts @@ -18,8 +18,9 @@ * limitations under the License. */ -import { Uint64Map } from "#/uint64_map"; -import { Uint64 } from "#/util/uint64"; +import { describe, it, expect } from "vitest"; +import { Uint64Map } from "#src/uint64_map.js"; +import { Uint64 } from "#src/util/uint64.js"; describe("Uint64Map", () => { it("basic", () => { diff --git a/src/uint64_map.ts b/src/uint64_map.ts index 8014472a27..22f94d58ef 100644 --- a/src/uint64_map.ts +++ b/src/uint64_map.ts @@ -18,16 +18,16 @@ * limitations under the License. */ -import { HashMapUint64 } from "#/gpu_hash/hash_table"; -import { WatchableValueInterface } from "#/trackable_value"; -import { Signal } from "#/util/signal"; -import { Uint64 } from "#/util/uint64"; +import { HashMapUint64 } from "#src/gpu_hash/hash_table.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { Signal } from "#src/util/signal.js"; +import type { Uint64 } from "#src/util/uint64.js"; +import type { RPC } from "#src/worker_rpc.js"; import { registerRPC, registerSharedObject, - RPC, SharedObjectCounterpart, -} from "#/worker_rpc"; +} from "#src/worker_rpc.js"; @registerSharedObject("Uint64Map") export class Uint64Map diff --git a/src/uint64_ordered_set.ts b/src/uint64_ordered_set.ts index 5de76112ef..5986d250ee 100644 --- a/src/uint64_ordered_set.ts +++ b/src/uint64_ordered_set.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { WatchableValueInterface } from "#/trackable_value"; -import { Signal } from "#/util/signal"; -import { Uint64 } from "#/util/uint64"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { Signal } from "#src/util/signal.js"; +import type { Uint64 } from "#src/util/uint64.js"; export class Uint64OrderedSet implements WatchableValueInterface diff --git a/src/uint64_set.spec.ts b/src/uint64_set.spec.ts index 776ec18847..bf03098e94 100644 --- a/src/uint64_set.spec.ts +++ b/src/uint64_set.spec.ts @@ -18,8 +18,9 @@ * limitations under the License. */ -import { Uint64Set } from "#/uint64_set"; -import { Uint64 } from "#/util/uint64"; +import { describe, it, expect } from "vitest"; +import { Uint64Set } from "#src/uint64_set.js"; +import { Uint64 } from "#src/util/uint64.js"; describe("Uint64Set", () => { it("basic", () => { diff --git a/src/uint64_set.ts b/src/uint64_set.ts index 0dcd15b1d6..671106d287 100644 --- a/src/uint64_set.ts +++ b/src/uint64_set.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import { HashSetUint64 } from "#/gpu_hash/hash_table"; -import { WatchableValueInterface } from "#/trackable_value"; -import { Signal } from "#/util/signal"; -import { Uint64 } from "#/util/uint64"; +import { HashSetUint64 } from "#src/gpu_hash/hash_table.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { Signal } from "#src/util/signal.js"; +import type { Uint64 } from "#src/util/uint64.js"; +import type { RPC } from "#src/worker_rpc.js"; import { registerRPC, registerSharedObject, - RPC, SharedObjectCounterpart, -} from "#/worker_rpc"; +} from "#src/worker_rpc.js"; @registerSharedObject("Uint64Set") export class Uint64Set diff --git a/src/util/array.spec.ts b/src/util/array.spec.ts index a02ba99237..d9b2a5c73f 100644 --- a/src/util/array.spec.ts +++ b/src/util/array.spec.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { describe, it, expect } from "vitest"; import { getInsertPermutation, getMergeSplices, @@ -21,7 +22,7 @@ import { spliceArray, tile2dArray, transposeArray2d, -} from "#/util/array"; +} from "#src/util/array.js"; describe("partitionArray", () => { it("basic test", () => { diff --git a/src/util/automatic_focus.ts b/src/util/automatic_focus.ts index 3ca5340690..a6ae9b3dd9 100644 --- a/src/util/automatic_focus.ts +++ b/src/util/automatic_focus.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import debounce from "lodash/debounce"; -import { RefCounted } from "#/util/disposable"; -import { isInputTextTarget } from "#/util/dom"; -import LinkedListOperations from "#/util/linked_list.0"; +import { debounce } from "lodash-es"; +import { RefCounted } from "#src/util/disposable.js"; +import { isInputTextTarget } from "#src/util/dom.js"; +import LinkedListOperations from "#src/util/linked_list.0.js"; class AutomaticFocusList { next0: AutomaticallyFocusedElement | null; diff --git a/src/util/byte_range_http_requests.ts b/src/util/byte_range_http_requests.ts index f117527156..440d9d0efc 100644 --- a/src/util/byte_range_http_requests.ts +++ b/src/util/byte_range_http_requests.ts @@ -14,13 +14,14 @@ * limitations under the License. */ -import { CancellationToken } from "#/util/cancellation"; -import { getByteRangeHeader, responseArrayBuffer } from "#/util/http_request"; +import type { CancellationToken } from "#src/util/cancellation.js"; import { - cancellableFetchSpecialOk, - SpecialProtocolCredentialsProvider, -} from "#/util/special_protocol_request"; -import { Uint64 } from "#/util/uint64"; + getByteRangeHeader, + responseArrayBuffer, +} from "#src/util/http_request.js"; +import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; +import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; +import type { Uint64 } from "#src/util/uint64.js"; /** * On Chromium, multiple concurrent byte range requests to the same URL are serialized unless the diff --git a/src/util/cancellation.spec.ts b/src/util/cancellation.spec.ts index 361f62c9c5..f1f9cfad50 100644 --- a/src/util/cancellation.spec.ts +++ b/src/util/cancellation.spec.ts @@ -14,6 +14,8 @@ * limitations under the License. */ +import { describe, expect, it } from "vitest"; + import { CANCELED, CancellationTokenSource, @@ -21,7 +23,7 @@ import { MultipleConsumerCancellationTokenSource, throwIfCanceled, uncancelableToken, -} from "#/util/cancellation"; +} from "#src/util/cancellation.js"; describe("cancellation", () => { describe("CancellationTokenSource", () => { @@ -125,29 +127,23 @@ describe("cancellation", () => { }); describe("makeCancellablePromise", () => { - it("supports basic resolve behavior", (done) => { + it("supports basic resolve behavior", async () => { const promise = makeCancelablePromise( uncancelableToken, (resolve, _reject, _token) => { resolve(3); }, ); - promise.then((value) => { - expect(value).toBe(3); - done(); - }); + expect(await promise).toBe(3); }); - it("supports basic reject behavior", (done) => { - const promise = makeCancelablePromise( + it("supports basic reject behavior", async () => { + const promise = makeCancelablePromise( uncancelableToken, (_resolve, reject, _token) => { - reject(3); + reject(new Error("abc")); }, ); - promise.catch((value) => { - expect(value).toBe(3); - done(); - }); + expect(promise).rejects.toThrow("abc"); }); it("unregisters the cancellation handler when the promise is fulfilled", () => { diff --git a/src/util/cancellation.ts b/src/util/cancellation.ts index c8e14f9fcc..e4e031b660 100644 --- a/src/util/cancellation.ts +++ b/src/util/cancellation.ts @@ -53,7 +53,7 @@ export interface CancellationToken { remove(handler: () => void): void; } -class CancellationError { +export class CancellationError extends Error { name = "CancellationError"; message = "CANCELED"; toString() { diff --git a/src/util/clipboard.ts b/src/util/clipboard.ts index bd0348e65f..c87a1ea28e 100644 --- a/src/util/clipboard.ts +++ b/src/util/clipboard.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { registerEventListener } from "#/util/disposable"; +import { registerEventListener } from "#src/util/disposable.js"; export function setClipboard(data: string, format = "text/plain") { let success = false; diff --git a/src/util/color.spec.ts b/src/util/color.browser_test.ts similarity index 96% rename from src/util/color.spec.ts rename to src/util/color.browser_test.ts index 7adfac0545..b296eb073d 100644 --- a/src/util/color.spec.ts +++ b/src/util/color.browser_test.ts @@ -14,14 +14,15 @@ * limitations under the License. */ +import { describe, it, expect } from "vitest"; import { parseColorSerialization, parseRGBColorSpecification, packColor, serializeColor, useWhiteBackground, -} from "#/util/color"; -import { vec3, vec4 } from "#/util/geom"; +} from "#src/util/color.js"; +import { vec3, vec4 } from "#src/util/geom.js"; describe("color", () => { it("parseColorSerialization works", () => { diff --git a/src/util/color.ts b/src/util/color.ts index 30fc63d7b8..a92d856a54 100644 --- a/src/util/color.ts +++ b/src/util/color.ts @@ -18,10 +18,10 @@ * @file Facilities for converting between strings and RGB/RGBA colors. */ -import { WatchableValue } from "#/trackable_value"; -import { float32ToString } from "#/util/float32_to_string"; -import { vec3, vec4 } from "#/util/geom"; -import { hexEncodeByte } from "#/util/hex"; +import { WatchableValue } from "#src/trackable_value.js"; +import { float32ToString } from "#src/util/float32_to_string.js"; +import { vec3, vec4 } from "#src/util/geom.js"; +import { hexEncodeByte } from "#src/util/hex.js"; /** * Parse the serialization of a color. diff --git a/src/util/completion.ts b/src/util/completion.ts index 5a1b742882..a406a70b0d 100644 --- a/src/util/completion.ts +++ b/src/util/completion.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { defaultStringCompare } from "#/util/string"; +import { defaultStringCompare } from "#src/util/string.js"; export interface Completion { value: string; diff --git a/src/util/data_type.ts b/src/util/data_type.ts index ab353e0b8c..3e478f4e15 100644 --- a/src/util/data_type.ts +++ b/src/util/data_type.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { TypedArrayConstructor } from "#/util/array"; +import type { TypedArrayConstructor } from "#src/util/array.js"; /** * If this is updated, DATA_TYPE_BYTES must also be updated. diff --git a/src/util/disjoint_sets.spec.ts b/src/util/disjoint_sets.spec.ts index cccc78e8b3..61ef1519df 100644 --- a/src/util/disjoint_sets.spec.ts +++ b/src/util/disjoint_sets.spec.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import { DisjointUint64Sets } from "#/util/disjoint_sets"; -import { Uint64 } from "#/util/uint64"; +import { describe, it, expect } from "vitest"; +import { DisjointUint64Sets } from "#src/util/disjoint_sets.js"; +import { Uint64 } from "#src/util/uint64.js"; function getSortedElementStrings(disjointSets: DisjointUint64Sets, x: Uint64) { const members = Array.from(disjointSets.setElements(x)); diff --git a/src/util/disjoint_sets.ts b/src/util/disjoint_sets.ts index f7b0fa5651..94e8c1e873 100644 --- a/src/util/disjoint_sets.ts +++ b/src/util/disjoint_sets.ts @@ -14,9 +14,10 @@ * limitations under the License. */ -import { VisibleSegmentEquivalencePolicy } from "#/segmentation_graph/segment_id"; -import { WatchableValue, WatchableValueInterface } from "#/trackable_value"; -import { Uint64 } from "#/util/uint64"; +import { VisibleSegmentEquivalencePolicy } from "#src/segmentation_graph/segment_id.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { WatchableValue } from "#src/trackable_value.js"; +import { Uint64 } from "#src/util/uint64.js"; const rankSymbol = Symbol("disjoint_sets:rank"); const parentSymbol = Symbol("disjoint_sets:parent"); diff --git a/src/util/disposable.ts b/src/util/disposable.ts index 4616c0d925..dbcb95eea8 100644 --- a/src/util/disposable.ts +++ b/src/util/disposable.ts @@ -57,8 +57,6 @@ export class RefCounted implements Disposable { disposedStacks: any; dispose() { if (DEBUG_REF_COUNTS) { - if (this.refCount === 0) { - } (this.disposedStacks = this.disposedStacks || []).push(new Error().stack); } if (--this.refCount !== 0) { diff --git a/src/util/drag_and_drop.spec.ts b/src/util/drag_and_drop.spec.ts index df28a17841..96c5b4ec80 100644 --- a/src/util/drag_and_drop.spec.ts +++ b/src/util/drag_and_drop.spec.ts @@ -14,10 +14,11 @@ * limitations under the License. */ +import { describe, it, expect } from "vitest"; import { encodeParametersAsDragType, decodeParametersFromDragType, -} from "#/util/drag_and_drop"; +} from "#src/util/drag_and_drop.js"; describe("drag_and_drop", () => { const prefix = "my-prefix\0"; diff --git a/src/util/drag_and_drop.ts b/src/util/drag_and_drop.ts index c94980fd89..5006c6fd4e 100644 --- a/src/util/drag_and_drop.ts +++ b/src/util/drag_and_drop.ts @@ -28,8 +28,8 @@ * munges other characters as well. Therefore, we hex encode to be safe. */ -import { hexEncode, hexDecode } from "#/util/hex"; -import { registerEventListener } from "#/util/disposable"; +import { registerEventListener } from "#src/util/disposable.js"; +import { hexEncode, hexDecode } from "#src/util/hex.js"; export function encodeStringAsDragType(s: string) { return hexEncode(new TextEncoder().encode(s)); diff --git a/src/util/endian.spec.ts b/src/util/endian.spec.ts index f47290c48e..1cc78d0ef8 100644 --- a/src/util/endian.spec.ts +++ b/src/util/endian.spec.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { swapEndian16, swapEndian32 } from "#/util/endian"; +import { describe, it, expect } from "vitest"; +import { swapEndian16, swapEndian32 } from "#src/util/endian.js"; describe("endian", () => { it("swapEndian16", () => { diff --git a/src/util/event_action_map.ts b/src/util/event_action_map.ts index f4b8b7c342..e2985c77d9 100644 --- a/src/util/event_action_map.ts +++ b/src/util/event_action_map.ts @@ -14,11 +14,9 @@ * limitations under the License. */ -import { registerEventListener } from "#/util/disposable"; -import { - HierarchicalMap, - HierarchicalMapInterface, -} from "#/util/hierarchical_map"; +import { registerEventListener } from "#src/util/disposable.js"; +import type { HierarchicalMapInterface } from "#src/util/hierarchical_map.js"; +import { HierarchicalMap } from "#src/util/hierarchical_map.js"; /** * @file Facilities for dispatching user-defined actions in response to input events. diff --git a/src/util/false.ts b/src/util/false.ts new file mode 100644 index 0000000000..0a0abcb50f --- /dev/null +++ b/src/util/false.ts @@ -0,0 +1,3 @@ +// No-op module to which other modules are conditionally redirected in order to +// disable them. +export default false; diff --git a/src/util/float.ts b/src/util/float.ts index 671b554675..86f5cfbe15 100644 --- a/src/util/float.ts +++ b/src/util/float.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Endianness, ENDIANNESS } from "#/util/endian"; +import { Endianness, ENDIANNESS } from "#src/util/endian.js"; const denormMin = 2 ** -1074; diff --git a/src/util/float32_to_string.spec.ts b/src/util/float32_to_string.spec.ts index 4710b5e03c..2be812cf77 100644 --- a/src/util/float32_to_string.spec.ts +++ b/src/util/float32_to_string.spec.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { float32ToString } from "#/util/float32_to_string"; +import { describe, it, expect } from "vitest"; +import { float32ToString } from "#src/util/float32_to_string.js"; describe("float32_to_minimal_string", () => { it("valid_float_to_minimal_string", () => { diff --git a/src/util/gcs_bucket_listing.ts b/src/util/gcs_bucket_listing.ts index 9a20199964..54de284571 100644 --- a/src/util/gcs_bucket_listing.ts +++ b/src/util/gcs_bucket_listing.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import { fetchWithOAuth2Credentials } from "#/credentials_provider/oauth2"; -import { CancellationToken } from "#/util/cancellation"; -import { BasicCompletionResult } from "#/util/completion"; -import { responseJson } from "#/util/http_request"; +import { fetchWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import type { BasicCompletionResult } from "#src/util/completion.js"; +import { responseJson } from "#src/util/http_request.js"; import { parseArray, verifyObject, @@ -25,8 +25,8 @@ import { verifyOptionalObjectProperty, verifyString, verifyStringArray, -} from "#/util/json"; -import { SpecialProtocolCredentialsProvider } from "#/util/special_protocol_request"; +} from "#src/util/json.js"; +import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; export async function getGcsBucketListing( credentialsProvider: SpecialProtocolCredentialsProvider, diff --git a/src/util/geom.spec.ts b/src/util/geom.spec.ts index bdcd3d30da..9b0e31a5ef 100644 --- a/src/util/geom.spec.ts +++ b/src/util/geom.spec.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { getFrustrumPlanes, isAABBVisible, mat4 } from "#/util/geom"; +import { describe, it, expect } from "vitest"; +import { getFrustrumPlanes, isAABBVisible, mat4 } from "#src/util/geom.js"; describe("getFrustrumPlanes", () => { it("works for simple example", () => { @@ -32,7 +33,7 @@ describe("getFrustrumPlanes", () => { // near 0, 0, -1, -7, // far - 0, 0, 0.13207542896270752, 14.924528121948242, + 0, 0, 1, 113, ]; planes.every((x, i) => expect(x).toBeCloseTo(expectedPlanes[i])); }); diff --git a/src/util/geom.ts b/src/util/geom.ts index 929949138b..9f33ca7287 100644 --- a/src/util/geom.ts +++ b/src/util/geom.ts @@ -14,8 +14,10 @@ * limitations under the License. */ -import { mat3, mat4, quat, vec3, vec4 } from "gl-matrix"; -import { findMatchingIndices, TypedArray } from "#/util/array"; +import type { mat3 } from "gl-matrix"; +import { mat4, quat, vec3, vec4 } from "gl-matrix"; +import type { TypedArray } from "#src/util/array.js"; +import { findMatchingIndices } from "#src/util/array.js"; export { mat2, mat3, mat4, quat, vec2, vec3, vec4 } from "gl-matrix"; diff --git a/src/util/google_oauth2.ts b/src/util/google_oauth2.ts index 524d92343b..e285ab7c33 100644 --- a/src/util/google_oauth2.ts +++ b/src/util/google_oauth2.ts @@ -17,18 +17,23 @@ import { CredentialsProvider, makeCredentialsGetter, -} from "#/credentials_provider"; -import { StatusMessage } from "#/status"; +} from "#src/credentials_provider/index.js"; +import { StatusMessage } from "#src/status.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; import { CANCELED, - CancellationToken, CancellationTokenSource, uncancelableToken, -} from "#/util/cancellation"; -import { RefCounted } from "#/util/disposable"; -import { removeFromParent } from "#/util/dom"; -import { verifyObject, verifyObjectProperty, verifyString } from "#/util/json"; -import { getRandomHexString } from "#/util/random"; +} from "#src/util/cancellation.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeFromParent } from "#src/util/dom.js"; +import redirectUrl from "#src/util/google_oauth2_redirect.html?url"; +import { + verifyObject, + verifyObjectProperty, + verifyString, +} from "#src/util/json.js"; +import { getRandomHexString } from "#src/util/random.js"; export const EMAIL_SCOPE = "email"; export const OPENID_SCOPE = "openid"; @@ -128,10 +133,11 @@ function makeAuthRequestUrl(options: { immediate?: boolean; }) { let url = `${AUTH_SERVER}?client_id=${encodeURIComponent(options.clientId)}`; - const redirectUri = new URL( - "google_oauth2_redirect.html", - window.location.href, - ).href; + const redirectUri = new URL(redirectUrl, import.meta.url).href.replace( + /\?.*$/, + "", + ); + url += `&redirect_uri=${redirectUri}`; let responseType = "token"; const { scopes } = options; @@ -218,7 +224,9 @@ export async function authenticateGoogleOAuth2( cleanup = () => { try { newWindow.close(); - } catch {} + } catch { + // Ignore error closing window. + } }; } } diff --git a/src/util/google_tag_manager.ts b/src/util/google_tag_manager.ts new file mode 100644 index 0000000000..59527e804b --- /dev/null +++ b/src/util/google_tag_manager.ts @@ -0,0 +1,16 @@ +// Inject google tag manager script if `NEUROGLANCER_GOOGLE_TAG_MANAGER` is defined. +declare const NEUROGLANCER_GOOGLE_TAG_MANAGER: string | undefined; + +if (typeof NEUROGLANCER_GOOGLE_TAG_MANAGER !== "undefined") { + const l = "dataLayer"; + const i = NEUROGLANCER_GOOGLE_TAG_MANAGER; + (window as any)[l] = (window as any)[l] || []; + (window as any)[l].push({ + "gtm.start": new Date().getTime(), + event: "gtm.js", + }); + const script = document.createElement("script"); + script.async = true; + script.src = `https://www.googletagmanager.com/gtm.js?id=${i}`; + document.head.appendChild(script); +} diff --git a/src/util/hash.ts b/src/util/hash.ts index f8f43b100c..70ed1de192 100644 --- a/src/util/hash.ts +++ b/src/util/hash.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Uint64 } from "#/util/uint64"; +import type { Uint64 } from "#src/util/uint64.js"; /** * This is a very simple string hash function. It isn't secure, but diff --git a/src/util/http_path_completion.ts b/src/util/http_path_completion.ts index 58ce7b0d53..93743b7597 100644 --- a/src/util/http_path_completion.ts +++ b/src/util/http_path_completion.ts @@ -14,23 +14,23 @@ * limitations under the License. */ -import { CredentialsManager } from "#/credentials_provider"; -import { CancellationToken } from "#/util/cancellation"; -import { +import type { CredentialsManager } from "#src/credentials_provider/index.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import type { BasicCompletionResult, Completion, CompletionWithDescription, - getPrefixMatchesWithDescriptions, -} from "#/util/completion"; -import { getGcsPathCompletions } from "#/util/gcs_bucket_listing"; +} from "#src/util/completion.js"; +import { getPrefixMatchesWithDescriptions } from "#src/util/completion.js"; +import { getGcsPathCompletions } from "#src/util/gcs_bucket_listing.js"; +import { parseUrl } from "#src/util/http_request.js"; +import { getS3PathCompletions } from "#src/util/s3.js"; +import { getS3CompatiblePathCompletions } from "#src/util/s3_bucket_listing.js"; +import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; import { cancellableFetchSpecialOk, parseSpecialUrl, - SpecialProtocolCredentialsProvider, -} from "#/util/special_protocol_request"; -import { parseUrl } from "#/util/http_request"; -import { getS3PathCompletions } from "#/util/s3"; -import { getS3CompatiblePathCompletions } from "#/util/s3_bucket_listing"; +} from "#src/util/special_protocol_request.js"; /** * Obtains a directory listing from a server that supports HTML directory listings. @@ -78,7 +78,7 @@ export async function getHtmlPathCompletions( credentialsProvider?: SpecialProtocolCredentialsProvider, ): Promise { console.log("getHtmlPathCompletions"); - const m = url.match(/^([a-z]+:\/\/.*\/)([^\/?#]*)$/); + const m = url.match(/^([a-z]+:\/\/.*\/)([^/?#]*)$/); if (m === null) throw null; const entries = await getHtmlDirectoryListing( m[1], @@ -172,7 +172,7 @@ export async function completeHttpPath( return await getS3PathCompletions(host, path, cancellationToken); } const s3Match = parsedUrl.match( - /^((?:http|https):\/\/(?:storage\.googleapis\.com\/[^\/]+|[^\/]+\.storage\.googleapis\.com|[^\/]+\.s3(?:[^./]+)?\.amazonaws.com))(\/.*)$/, + /^((?:http|https):\/\/(?:storage\.googleapis\.com\/[^/]+|[^/]+\.storage\.googleapis\.com|[^/]+\.s3(?:[^./]+)?\.amazonaws.com))(\/.*)$/, ); if (s3Match !== null) { return await getS3CompatiblePathCompletions( diff --git a/src/util/http_request.ts b/src/util/http_request.ts index ea30d05927..dbfef9c38c 100644 --- a/src/util/http_request.ts +++ b/src/util/http_request.ts @@ -14,12 +14,9 @@ * limitations under the License. */ -import { - CANCELED, - CancellationToken, - uncancelableToken, -} from "#/util/cancellation"; -import { Uint64 } from "#/util/uint64"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { CANCELED, uncancelableToken } from "#src/util/cancellation.js"; +import { Uint64 } from "#src/util/uint64.js"; export class HttpError extends Error { url: string; @@ -198,7 +195,7 @@ export function parseUrl(url: string): { host: string; path: string; } { - const urlProtocolPattern = /^([^:\/]+):\/\/([^\/]+)((?:\/.*)?)$/; + const urlProtocolPattern = /^([^:/]+):\/\/([^/]+)((?:\/.*)?)$/; const match = url.match(urlProtocolPattern); if (match === null) { throw new Error(`Invalid URL: ${JSON.stringify(url)}`); diff --git a/src/util/json.spec.ts b/src/util/json.spec.ts index 6195a6bbfe..ff8c8879b3 100644 --- a/src/util/json.spec.ts +++ b/src/util/json.spec.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { describe, it, expect } from "vitest"; import { normalizeStringLiteral, pythonLiteralParse, @@ -22,7 +23,7 @@ import { urlSafeStringify, urlSafeStringifyString, urlSafeToJSON, -} from "#/util/json"; +} from "#src/util/json.js"; describe("url safe json", () => { it("urlSafeStringifyString", () => { diff --git a/src/util/json.ts b/src/util/json.ts index 301cbedb1f..793ad16041 100644 --- a/src/util/json.ts +++ b/src/util/json.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { WritableArrayLike } from "#/util/array"; -import { vec3 } from "#/util/geom"; +import type { WritableArrayLike } from "#src/util/array.js"; +import { vec3 } from "#src/util/geom.js"; export function verifyFloat(obj: any): number { const t = typeof obj; @@ -396,7 +396,7 @@ export function pythonLiteralToJSON(x: string) { .replace(/\)/g, "]") .replace("True", "true") .replace("False", "false") - .replace(/,\s*([\}\]])/g, "$1"); + .replace(/,\s*([}\]])/g, "$1"); s += replacement; } return s; diff --git a/src/util/keyboard_bindings.ts b/src/util/keyboard_bindings.ts index 7434385096..a2766afa25 100644 --- a/src/util/keyboard_bindings.ts +++ b/src/util/keyboard_bindings.ts @@ -20,16 +20,18 @@ // This is based on goog/ui/keyboardshortcuthandler.js in the Google Closure library. -import { WatchableValue } from "#/trackable_value"; -import { RefCounted } from "#/util/disposable"; -import { +import { WatchableValue } from "#src/trackable_value.js"; +import { RefCounted } from "#src/util/disposable.js"; +import type { ActionEvent, + EventActionMapInterface, +} from "#src/util/event_action_map.js"; +import { dispatchEventWithModifiers, EventActionMap, - EventActionMapInterface, registerActionListener, getEventModifierMask, -} from "#/util/event_action_map"; +} from "#src/util/event_action_map.js"; export const globalModifiers = new WatchableValue(0); window.addEventListener("keydown", (event) => { diff --git a/src/util/lerp.ts b/src/util/lerp.ts index 7b03788041..c8cc7558cd 100644 --- a/src/util/lerp.ts +++ b/src/util/lerp.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import { DataType } from "#/util/data_type"; -import { nextAfterFloat64 } from "#/util/float"; -import { parseFixedLengthArray } from "#/util/json"; -import { Uint64 } from "#/util/uint64"; +import { DataType } from "#src/util/data_type.js"; +import { nextAfterFloat64 } from "#src/util/float.js"; +import { parseFixedLengthArray } from "#src/util/json.js"; +import { Uint64 } from "#src/util/uint64.js"; export type DataTypeInterval = [number, number] | [Uint64, Uint64]; diff --git a/src/util/matrix.spec.ts b/src/util/matrix.spec.ts index 25e01a2b34..ed3a55905d 100644 --- a/src/util/matrix.spec.ts +++ b/src/util/matrix.spec.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import * as matrix from "#/util/matrix"; +import { describe, it, expect } from "vitest"; +import * as matrix from "#src/util/matrix.js"; describe("matrix identity", () => { it("works for n=0", () => { diff --git a/src/util/matrix.ts b/src/util/matrix.ts index 95700b1436..7dd52a489b 100644 --- a/src/util/matrix.ts +++ b/src/util/matrix.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { TypedArray } from "#/util/array"; +import type { TypedArray } from "#src/util/array.js"; /** * Sets the `m * k` matrix `c` to the product of `m * n` matrix `a` and `n * k` matrix `b`. diff --git a/src/util/memoize.ts b/src/util/memoize.ts index 5cac299063..c9da1cfbf4 100644 --- a/src/util/memoize.ts +++ b/src/util/memoize.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import { RefCounted, RefCountedValue } from "#/util/disposable"; -import { stableStringify } from "#/util/json"; +import type { RefCounted } from "#src/util/disposable.js"; +import { RefCountedValue } from "#src/util/disposable.js"; +import { stableStringify } from "#src/util/json.js"; export class Memoize { private map = new Map(); diff --git a/src/util/message_list.ts b/src/util/message_list.ts index 6ccdaf0a62..2945deb178 100644 --- a/src/util/message_list.ts +++ b/src/util/message_list.ts @@ -18,7 +18,7 @@ * @file Message list framework for messages to be displayed in the UI. */ -import { NullarySignal } from "#/util/signal"; +import { NullarySignal } from "#src/util/signal.js"; export enum MessageSeverity { info = 0, diff --git a/src/util/mouse_bindings.ts b/src/util/mouse_bindings.ts index b0408644fc..57af93dc21 100644 --- a/src/util/mouse_bindings.ts +++ b/src/util/mouse_bindings.ts @@ -18,14 +18,16 @@ * @file Facility for triggering named actions in response to mouse events. */ -import { RefCounted } from "#/util/disposable"; -import { +import { RefCounted } from "#src/util/disposable.js"; +import type { ActionEvent, + EventActionMapInterface, +} from "#src/util/event_action_map.js"; +import { dispatchEventWithModifiers, EventActionMap, - EventActionMapInterface, registerActionListener, -} from "#/util/event_action_map"; +} from "#src/util/event_action_map.js"; export class MouseEventBinder< EventMap extends EventActionMapInterface, diff --git a/src/util/npy.spec.ts b/src/util/npy.spec.ts index de01e247d8..e8112c7c72 100644 --- a/src/util/npy.spec.ts +++ b/src/util/npy.spec.ts @@ -14,8 +14,24 @@ * limitations under the License. */ -import { DataType } from "#/util/data_type"; -import { parseNpy } from "#/util/npy"; +import { describe, it, expect } from "vitest"; +import { DataType } from "#src/util/data_type.js"; +import { parseNpy } from "#src/util/npy.js"; + +import float32be_npy from "#testdata/npy_test.float32-be.npy?binary"; +import float32le_npy from "#testdata/npy_test.float32-le.npy?binary"; +import float32_example from "#testdata/npy_test.float32.json"; +import uint16be_npy from "#testdata/npy_test.uint16-be.npy?binary"; +import uint16le_npy from "#testdata/npy_test.uint16-le.npy?binary"; +import uint16_example from "#testdata/npy_test.uint16.json"; +import uint32be_npy from "#testdata/npy_test.uint32-be.npy?binary"; +import uint32le_npy from "#testdata/npy_test.uint32-le.npy?binary"; +import uint32_example from "#testdata/npy_test.uint32.json"; +import uint64be_npy from "#testdata/npy_test.uint64-be.npy?binary"; +import uint64le_npy from "#testdata/npy_test.uint64-le.npy?binary"; +import uint64_example from "#testdata/npy_test.uint64.json"; +import uint8_example from "#testdata/npy_test.uint8.json"; +import uint8_npy from "#testdata/npy_test.uint8.npy?binary"; interface ExampleSpec { dataType: string; @@ -23,70 +39,43 @@ interface ExampleSpec { data: number[]; } -function checkNpy(spec: ExampleSpec, encoded: Uint8Array) { +async function checkNpy(spec: ExampleSpec, encoded: Uint8Array) { const decoded = parseNpy(encoded); expect(decoded.shape).toEqual(spec.shape); expect(DataType[decoded.dataType].toLowerCase()).toBe(spec.dataType); - expect(Array.from(decoded.data)).toEqual(spec.data); + expect(Array.from(decoded.data)).toEqual(spec.data); } describe("parseNpy", () => { - it("uint8", () => { - checkNpy( - require("neuroglancer-testdata/npy_test.uint8.json"), - require("neuroglancer-testdata/npy_test.uint8.npy"), - ); + it("uint8", async () => { + await checkNpy(uint8_example, uint8_npy); }); - it("uint16-le", () => { - checkNpy( - require("neuroglancer-testdata/npy_test.uint16.json"), - require("neuroglancer-testdata/npy_test.uint16-le.npy"), - ); + it("uint16-le", async () => { + checkNpy(uint16_example, uint16le_npy); }); - it("uint16-be", () => { - checkNpy( - require("neuroglancer-testdata/npy_test.uint16.json"), - require("neuroglancer-testdata/npy_test.uint16-be.npy"), - ); + it("uint16-be", async () => { + checkNpy(uint16_example, uint16be_npy); }); - it("uint32-le", () => { - checkNpy( - require("neuroglancer-testdata/npy_test.uint32.json"), - require("neuroglancer-testdata/npy_test.uint32-le.npy"), - ); + it("uint32-le", async () => { + checkNpy(uint32_example, uint32le_npy); }); - it("uint32-be", () => { - checkNpy( - require("neuroglancer-testdata/npy_test.uint32.json"), - require("neuroglancer-testdata/npy_test.uint32-be.npy"), - ); + it("uint32-be", async () => { + checkNpy(uint32_example, uint32be_npy); }); - it("uint64-le", () => { - checkNpy( - require("neuroglancer-testdata/npy_test.uint64.json"), - require("neuroglancer-testdata/npy_test.uint64-le.npy"), - ); + it("uint64-le", async () => { + checkNpy(uint64_example, uint64le_npy); }); - it("uint64-be", () => { - checkNpy( - require("neuroglancer-testdata/npy_test.uint64.json"), - require("neuroglancer-testdata/npy_test.uint64-be.npy"), - ); + it("uint64-be", async () => { + checkNpy(uint64_example, uint64be_npy); }); - it("float32-le", () => { - checkNpy( - require("neuroglancer-testdata/npy_test.float32.json"), - require("neuroglancer-testdata/npy_test.float32-le.npy"), - ); + it("float32-le", async () => { + checkNpy(float32_example, float32le_npy); }); - it("float32-be", () => { - checkNpy( - require("neuroglancer-testdata/npy_test.float32.json"), - require("neuroglancer-testdata/npy_test.float32-be.npy"), - ); + it("float32-be", async () => { + checkNpy(float32_example, float32be_npy); }); }); diff --git a/src/util/npy.ts b/src/util/npy.ts index 4f22d10fea..4fcf433861 100644 --- a/src/util/npy.ts +++ b/src/util/npy.ts @@ -20,19 +20,20 @@ * See http://docs.scipy.org/doc/numpy-dev/neps/npy-format.html */ +import type { TypedArray } from "#src/util/array.js"; +import type { DataType } from "#src/util/data_type.js"; import { DATA_TYPE_ARRAY_CONSTRUCTOR, DATA_TYPE_BYTES, DATA_TYPE_JAVASCRIPT_ELEMENTS_PER_ARRAY_ELEMENT, - DataType, -} from "#/util/data_type"; -import { convertEndian } from "#/util/endian"; -import { pythonLiteralParse } from "#/util/json"; -import { parseNumpyDtype } from "#/util/numpy_dtype"; +} from "#src/util/data_type.js"; +import { convertEndian } from "#src/util/endian.js"; +import { pythonLiteralParse } from "#src/util/json.js"; +import { parseNumpyDtype } from "#src/util/numpy_dtype.js"; export class NumpyArray { constructor( - public data: ArrayBufferView, + public data: TypedArray, public shape: number[], public dataType: DataType, public fortranOrder: boolean, diff --git a/src/util/number_to_string.spec.ts b/src/util/number_to_string.spec.ts index 4ba9d9dd0f..659a728e01 100644 --- a/src/util/number_to_string.spec.ts +++ b/src/util/number_to_string.spec.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { numberToStringFixed } from "#/util/number_to_string"; +import { describe, it, expect } from "vitest"; +import { numberToStringFixed } from "#src/util/number_to_string.js"; describe("numberToStringFixed", () => { it("works for simple cases", () => { diff --git a/src/util/numpy_dtype.ts b/src/util/numpy_dtype.ts index aa41328884..8827ed1639 100644 --- a/src/util/numpy_dtype.ts +++ b/src/util/numpy_dtype.ts @@ -18,8 +18,8 @@ * @file Support for parsing NumPy dtype strings. */ -import { DataType } from "#/util/data_type"; -import { Endianness } from "#/util/endian"; +import { DataType } from "#src/util/data_type.js"; +import { Endianness } from "#src/util/endian.js"; export interface NumpyDtype { dataType: DataType; diff --git a/src/util/pairing_heap.0.ts b/src/util/pairing_heap.0.ts index f29c452cab..10e222c028 100644 --- a/src/util/pairing_heap.0.ts +++ b/src/util/pairing_heap.0.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { PairingHeapOperations } from "#/util/pairing_heap"; +import type { PairingHeapOperations } from "#src/util/pairing_heap.js"; interface Node { child0: T | null; diff --git a/src/util/pairing_heap.1.ts b/src/util/pairing_heap.1.ts index 1b831eced4..3b4f5f3d66 100644 --- a/src/util/pairing_heap.1.ts +++ b/src/util/pairing_heap.1.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { PairingHeapOperations } from "#/util/pairing_heap"; +import type { PairingHeapOperations } from "#src/util/pairing_heap.js"; interface Node { child1: T | null; diff --git a/src/util/random.ts b/src/util/random.ts index 7cfc05a819..ac87ad4acc 100644 --- a/src/util/random.ts +++ b/src/util/random.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { TypedArray } from "#/util/array"; +import type { TypedArray } from "#src/util/array.js"; export function getRandomHexString(numBits = 128) { const numValues = Math.ceil(numBits / 32); diff --git a/src/util/s3.ts b/src/util/s3.ts index 358605ec82..e7be327c0e 100644 --- a/src/util/s3.ts +++ b/src/util/s3.ts @@ -14,9 +14,11 @@ * limitations under the License. */ -import { CancellationToken, uncancelableToken } from "#/util/cancellation"; -import { cancellableFetchOk, ResponseTransform } from "#/util/http_request"; -import { getS3CompatiblePathCompletions } from "#/util/s3_bucket_listing"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { uncancelableToken } from "#src/util/cancellation.js"; +import type { ResponseTransform } from "#src/util/http_request.js"; +import { cancellableFetchOk } from "#src/util/http_request.js"; +import { getS3CompatiblePathCompletions } from "#src/util/s3_bucket_listing.js"; // Support for s3:// special protocol. diff --git a/src/util/s3_bucket_listing.ts b/src/util/s3_bucket_listing.ts index 72489db3ce..39540266d7 100644 --- a/src/util/s3_bucket_listing.ts +++ b/src/util/s3_bucket_listing.ts @@ -19,10 +19,10 @@ * and GCS). */ -import { fetchWithOAuth2Credentials } from "#/credentials_provider/oauth2"; -import { CancellationToken } from "#/util/cancellation"; -import { BasicCompletionResult } from "#/util/completion"; -import { SpecialProtocolCredentialsProvider } from "#/util/special_protocol_request"; +import { fetchWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import type { BasicCompletionResult } from "#src/util/completion.js"; +import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; export async function getS3BucketListing( credentialsProvider: SpecialProtocolCredentialsProvider, diff --git a/src/util/si_units.spec.ts b/src/util/si_units.spec.ts index 3836ed50eb..9fc8e9653d 100644 --- a/src/util/si_units.spec.ts +++ b/src/util/si_units.spec.ts @@ -14,7 +14,12 @@ * limitations under the License. */ -import { parseScale, scaleByExp10, formatScaleWithUnit } from "#/util/si_units"; +import { describe, it, expect } from "vitest"; +import { + parseScale, + scaleByExp10, + formatScaleWithUnit, +} from "#src/util/si_units.js"; describe("parseScale", () => { const patterns: [string, { scale: number; unit: string } | undefined][] = [ diff --git a/src/util/si_units.ts b/src/util/si_units.ts index 1792e03ccc..26d3b6b5be 100644 --- a/src/util/si_units.ts +++ b/src/util/si_units.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { binarySearchLowerBound } from "#/util/array"; +import { binarySearchLowerBound } from "#src/util/array.js"; export interface SiPrefix { readonly prefix: string; diff --git a/src/util/signal.spec.ts b/src/util/signal.spec.ts index 48d26ed733..c0d243f62c 100644 --- a/src/util/signal.spec.ts +++ b/src/util/signal.spec.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { NullarySignal, Signal } from "#/util/signal"; +import { describe, it, expect } from "vitest"; +import { NullarySignal, Signal } from "#src/util/signal.js"; describe("signal", () => { it("should invoke the handler when dispatched", () => { @@ -24,6 +25,7 @@ describe("signal", () => { "use strict"; // TODO(jbms): remove this "use strict" when karma/esbuild config issues // is resolved. + // eslint-disable-next-line prefer-rest-params results.push([this, ...arguments]); }); expect(signal.count).toEqual(0); diff --git a/src/util/signal.ts b/src/util/signal.ts index 07564299e1..52ca03c34b 100644 --- a/src/util/signal.ts +++ b/src/util/signal.ts @@ -40,6 +40,7 @@ export class Signal void> { this.dispatch = (function (this: any) { ++obj.count; obj.handlers.forEach((handler) => { + // eslint-disable-next-line prefer-rest-params handler.apply(this, arguments); }); }); diff --git a/src/util/signal_binding_updater.ts b/src/util/signal_binding_updater.ts index ed7f809ca3..fe52e0da54 100644 --- a/src/util/signal_binding_updater.ts +++ b/src/util/signal_binding_updater.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Signal } from "#/util/signal"; +import type { Signal } from "#src/util/signal.js"; export function removeSignalBinding( signal: Signal, diff --git a/src/util/spatial_units.ts b/src/util/spatial_units.ts index ecc4311e0d..eeeb09eb71 100644 --- a/src/util/spatial_units.ts +++ b/src/util/spatial_units.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import { mat3, mat4, prod3, transformVectorByMat4, vec3 } from "#/util/geom"; -import { pickLengthUnit, pickVolumeUnit } from "#/widget/scale_bar"; +import type { mat4 } from "#src/util/geom.js"; +import { mat3, prod3, transformVectorByMat4, vec3 } from "#src/util/geom.js"; +import { pickLengthUnit, pickVolumeUnit } from "#src/widget/scale_bar.js"; export function formatIntegerPoint(point: Float32Array) { let result = "("; diff --git a/src/util/special_protocol_request.ts b/src/util/special_protocol_request.ts index 177cbca186..f79590b789 100644 --- a/src/util/special_protocol_request.ts +++ b/src/util/special_protocol_request.ts @@ -14,15 +14,18 @@ * limitations under the License. */ -import { +import pythonIntegration from "#python_integration_build"; +import type { CredentialsManager, MaybeOptionalCredentialsProvider, -} from "#/credentials_provider"; -import { fetchWithOAuth2Credentials } from "#/credentials_provider/oauth2"; -import { CancellationToken, uncancelableToken } from "#/util/cancellation"; -import { parseUrl, ResponseTransform } from "#/util/http_request"; -import { getRandomHexString } from "#/util/random"; -import { cancellableFetchS3Ok } from "#/util/s3"; +} from "#src/credentials_provider/index.js"; +import { fetchWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { uncancelableToken } from "#src/util/cancellation.js"; +import type { ResponseTransform } from "#src/util/http_request.js"; +import { parseUrl } from "#src/util/http_request.js"; +import { getRandomHexString } from "#src/util/random.js"; +import { cancellableFetchS3Ok } from "#src/util/s3.js"; export type SpecialProtocolCredentials = any; export type SpecialProtocolCredentialsProvider = @@ -43,10 +46,10 @@ function getNgauthCredentialsProvider( serverUrl: string, path: string, ): SpecialProtocolCredentialsProvider { - const bucketPattern = /^\/([^\/]+)/; + const bucketPattern = /^\/([^/]+)/; const m = path.match(bucketPattern); if (m === null) return undefined; - return typeof NEUROGLANCER_PYTHON_INTEGRATION !== "undefined" + return pythonIntegration ? credentialsManager.getCredentialsProvider("gcs", { bucket: m[1] }) : credentialsManager.getCredentialsProvider("ngauth_gcs", { authServer: serverUrl, @@ -63,12 +66,11 @@ export function parseSpecialUrl( case "gs": case "gs+xml": return { - credentialsProvider: - typeof NEUROGLANCER_PYTHON_INTEGRATION !== "undefined" - ? credentialsManager.getCredentialsProvider("gcs", { - bucket: u.host, - }) - : undefined, + credentialsProvider: pythonIntegration + ? credentialsManager.getCredentialsProvider("gcs", { + bucket: u.host, + }) + : undefined, url, }; case "gs+ngauth+http": diff --git a/src/util/touch_bindings.ts b/src/util/touch_bindings.ts index 7cc0640c3f..7adead3a63 100644 --- a/src/util/touch_bindings.ts +++ b/src/util/touch_bindings.ts @@ -18,15 +18,17 @@ * @file Facility for triggering named actions in response to touch events. */ -import throttle from "lodash/throttle"; -import { RefCounted } from "#/util/disposable"; -import { +import { throttle } from "lodash-es"; +import { RefCounted } from "#src/util/disposable.js"; +import type { ActionEvent, + EventActionMapInterface, +} from "#src/util/event_action_map.js"; +import { dispatchEvent, EventActionMap, - EventActionMapInterface, registerActionListener, -} from "#/util/event_action_map"; +} from "#src/util/event_action_map.js"; export interface TouchTapInfo { event: TouchEvent; diff --git a/src/util/trackable.ts b/src/util/trackable.ts index 50a59a7545..e3080419ae 100644 --- a/src/util/trackable.ts +++ b/src/util/trackable.ts @@ -18,9 +18,10 @@ * @file Defines a generic interface for a simple state tracking mechanism. */ -import { RefCounted } from "#/util/disposable"; -import { verifyObject, verifyOptionalObjectProperty } from "#/util/json"; -import { NullaryReadonlySignal, NullarySignal } from "#/util/signal"; +import { RefCounted } from "#src/util/disposable.js"; +import { verifyObject, verifyOptionalObjectProperty } from "#src/util/json.js"; +import type { NullaryReadonlySignal } from "#src/util/signal.js"; +import { NullarySignal } from "#src/util/signal.js"; export interface JsonRestorable { restoreState: (x: any) => void; diff --git a/src/util/trackable_enum.ts b/src/util/trackable_enum.ts index cadb64f270..c59867d82d 100644 --- a/src/util/trackable_enum.ts +++ b/src/util/trackable_enum.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { verifyEnumString } from "#/util/json"; -import { NullarySignal } from "#/util/signal"; -import { Trackable } from "#/util/trackable"; +import { verifyEnumString } from "#src/util/json.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { Trackable } from "#src/util/trackable.js"; export class TrackableEnum implements Trackable { changed = new NullarySignal(); diff --git a/src/util/true.ts b/src/util/true.ts new file mode 100644 index 0000000000..6d7aa08b73 --- /dev/null +++ b/src/util/true.ts @@ -0,0 +1,3 @@ +// No-op module to which other modules are conditionally redirected in order to +// indicate something is enabled. +export default true; diff --git a/src/util/uint64.spec.ts b/src/util/uint64.spec.ts index 25f8789e50..118c1b86a9 100644 --- a/src/util/uint64.spec.ts +++ b/src/util/uint64.spec.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { Uint64 } from "#/util/uint64"; +import { describe, it, expect } from "vitest"; +import { Uint64 } from "#src/util/uint64.js"; describe("uint64", () => { it("less", () => { @@ -80,16 +81,15 @@ describe("uint64", () => { expect(temp.tryParseString("1")).toBe(true); }); - it("parseString toString round trip", () => { + describe("parseString toString round trip", () => { function check(s: string, base: number) { const x = Uint64.parseString(s, base); - expect(x.valid()).toBe( - true, - `low=${x.low}, high=${x.high}, toString(${base}) = ${x.toString( - base, - )}, s=${s}`, - ); - expect(x.toString(base)).toEqual(s); + it(`low=${x.low}, high=${x.high}, toString(${base}) = ${x.toString( + base, + )}, s=${s}`, () => { + expect(x.valid()).toBe(true); + expect(x.toString(base)).toEqual(s); + }); } check("0", 10); check("1", 10); @@ -98,18 +98,13 @@ describe("uint64", () => { check("3w5e11264sgsf", 36); }); - it("toString parseString round trip", () => { + describe("toString parseString round trip", () => { function check(x: Uint64, base: number) { const s = x.toString(base); const y = Uint64.parseString(s, base); - expect(y.low).toBe( - x.low, - `s=${s}, x.low=${x.low}, x.high=${x.high}, y.low=${y.low}, y.high=${y.high}, base=${base}`, - ); - expect(y.high).toBe( - x.high, - `s=${s}, x.low=${x.low}, x.high=${x.high}, y.low=${y.low}, y.high=${y.high}, base=${base}`, - ); + it(`s=${s}, x.low=${x.low}, x.high=${x.high}, y.low=${y.low}, y.high=${y.high}, base=${base}`, () => { + expect([y.low, y.high]).toEqual([x.low, x.high]); + }); } const count = 100; { diff --git a/src/util/vector.ts b/src/util/vector.ts index 3372c33624..80412c80e0 100644 --- a/src/util/vector.ts +++ b/src/util/vector.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { TypedArray } from "#/util/array"; +import type { TypedArray } from "#src/util/array.js"; export function equal(a: T, b: U) { const n = a.length; diff --git a/src/util/watchable_map.ts b/src/util/watchable_map.ts index 7ad2ecdd79..f5005edc5d 100644 --- a/src/util/watchable_map.ts +++ b/src/util/watchable_map.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { RefCounted } from "#/util/disposable"; -import { NullarySignal } from "#/util/signal"; +import { RefCounted } from "#src/util/disposable.js"; +import { NullarySignal } from "#src/util/signal.js"; export class WatchableMap extends RefCounted { changed = new NullarySignal(); diff --git a/src/util/zorder.spec.ts b/src/util/zorder.spec.ts index 19090ff077..16486518c5 100644 --- a/src/util/zorder.spec.ts +++ b/src/util/zorder.spec.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import { Uint64 } from "#/util/uint64"; -import { decodeZIndexCompressed, zorder3LessThan } from "#/util/zorder"; +import { describe, it, expect } from "vitest"; +import { Uint64 } from "#src/util/uint64.js"; +import { decodeZIndexCompressed, zorder3LessThan } from "#src/util/zorder.js"; describe("decodeZIndexCompressed", () => { it("works for repetitive pattern 21,21,21", () => { diff --git a/src/util/zorder.ts b/src/util/zorder.ts index 37fd2fcd81..7f8bb9dd5a 100644 --- a/src/util/zorder.ts +++ b/src/util/zorder.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { TypedArray } from "#/util/array"; -import { Uint64 } from "#/util/uint64"; +import type { TypedArray } from "#src/util/array.js"; +import type { Uint64 } from "#src/util/uint64.js"; export function getOctreeChildIndex(x: number, y: number, z: number) { return (x & 1) | ((y << 1) & 2) | ((z << 2) & 4); diff --git a/src/viewer.ts b/src/viewer.ts index e717626de6..e1e81de296 100644 --- a/src/viewer.ts +++ b/src/viewer.ts @@ -14,34 +14,35 @@ * limitations under the License. */ -import "./viewer.css"; -import "#/noselect.css"; - -import svg_controls_alt from "ikonate/icons/controls-alt.svg"; -import svg_layers from "ikonate/icons/layers.svg"; -import svg_list from "ikonate/icons/list.svg"; -import svg_settings from "ikonate/icons/settings.svg"; -import debounce from "lodash/debounce"; +import "#src/viewer.css"; +import "#src/ui/layer_data_sources_tab.js"; +import "#src/noselect.css"; +import svg_controls_alt from "ikonate/icons/controls-alt.svg?raw"; +import svg_layers from "ikonate/icons/layers.svg?raw"; +import svg_list from "ikonate/icons/list.svg?raw"; +import svg_settings from "ikonate/icons/settings.svg?raw"; +import { debounce } from "lodash-es"; +import type { FrameNumberCounter } from "#src/chunk_manager/frontend.js"; import { CapacitySpecification, ChunkManager, ChunkQueueManager, - FrameNumberCounter, -} from "#/chunk_manager/frontend"; +} from "#src/chunk_manager/frontend.js"; import { makeCoordinateSpace, TrackableCoordinateSpace, -} from "#/coordinate_transform"; -import { defaultCredentialsManager } from "#/credentials_provider/default_manager"; -import { InputEventBindings as DataPanelInputEventBindings } from "#/data_panel_layout"; -import { DataSourceProviderRegistry } from "#/datasource"; -import { getDefaultDataSourceProvider } from "#/datasource/default_provider"; -import { StateShare, stateShareEnabled } from "#/datasource/state_share"; -import { DisplayContext, TrackableWindowedViewport } from "#/display_context"; +} from "#src/coordinate_transform.js"; +import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { InputEventBindings as DataPanelInputEventBindings } from "#src/data_panel_layout.js"; +import { getDefaultDataSourceProvider } from "#src/datasource/default_provider.js"; +import type { DataSourceProviderRegistry } from "#src/datasource/index.js"; +import { StateShare, stateShareEnabled } from "#src/datasource/state_share.js"; +import type { DisplayContext } from "#src/display_context.js"; +import { TrackableWindowedViewport } from "#src/display_context.js"; import { HelpPanelState, InputEventBindingHelpDialog, -} from "#/help/input_event_bindings"; +} from "#src/help/input_event_bindings.js"; import { addNewLayer, LayerManager, @@ -50,8 +51,10 @@ import { SelectedLayerState, TopLevelLayerListSpecification, TrackableDataSelectionState, -} from "#/layer"; -import { RootLayoutContainer } from "#/layer_groups_layout"; + UserLayer, +} from "#src/layer/index.js"; +import { LayerGroupViewer } from "#src/layer_group_viewer.js"; +import { RootLayoutContainer } from "#src/layer_groups_layout.js"; import { CoordinateSpacePlaybackVelocity, DisplayPose, @@ -65,64 +68,78 @@ import { TrackableProjectionZoom, TrackableRelativeDisplayScales, WatchableDisplayDimensionRenderInfo, -} from "#/navigation_state"; -import { overlaysOpen } from "#/overlay"; -import { allRenderLayerRoles, RenderLayerRole } from "#/renderlayer"; -import { StatusMessage } from "#/status"; +} from "#src/navigation_state.js"; +import { overlaysOpen } from "#src/overlay.js"; +import { allRenderLayerRoles, RenderLayerRole } from "#src/renderlayer.js"; +import { StatusMessage } from "#src/status.js"; import { ElementVisibilityFromTrackableBoolean, TrackableBoolean, -} from "#/trackable_boolean"; +} from "#src/trackable_boolean.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; import { makeDerivedWatchableValue, observeWatchable, TrackableValue, - WatchableValueInterface, -} from "#/trackable_value"; +} from "#src/trackable_value.js"; import { LayerArchiveCountWidget, LayerListPanel, LayerListPanelState, -} from "#/ui/layer_list_panel"; -import { LayerSidePanelManager } from "#/ui/layer_side_panel"; -import { setupPositionDropHandlers } from "#/ui/position_drag_and_drop"; -import { SelectionDetailsPanel } from "#/ui/selection_details"; -import { SidePanelManager } from "#/ui/side_panel"; -import { StateEditorDialog } from "#/ui/state_editor"; -import { StatisticsDisplayState, StatisticsPanel } from "#/ui/statistics"; -import { GlobalToolBinder, LocalToolBinder } from "#/ui/tool"; +} from "#src/ui/layer_list_panel.js"; +import { LayerSidePanelManager } from "#src/ui/layer_side_panel.js"; +import { setupPositionDropHandlers } from "#src/ui/position_drag_and_drop.js"; +import { SelectionDetailsPanel } from "#src/ui/selection_details.js"; +import { SidePanelManager } from "#src/ui/side_panel.js"; +import { StateEditorDialog } from "#src/ui/state_editor.js"; +import { StatisticsDisplayState, StatisticsPanel } from "#src/ui/statistics.js"; +import { GlobalToolBinder, LocalToolBinder } from "#src/ui/tool.js"; import { ViewerSettingsPanel, ViewerSettingsPanelState, -} from "#/ui/viewer_settings"; -import { AutomaticallyFocusedElement } from "#/util/automatic_focus"; -import { TrackableRGB } from "#/util/color"; -import { Borrowed, Owned, RefCounted } from "#/util/disposable"; -import { removeFromParent } from "#/util/dom"; -import { ActionEvent, registerActionListener } from "#/util/event_action_map"; -import { vec3 } from "#/util/geom"; +} from "#src/ui/viewer_settings.js"; +import { AutomaticallyFocusedElement } from "#src/util/automatic_focus.js"; +import { TrackableRGB } from "#src/util/color.js"; +import type { Borrowed, Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeFromParent } from "#src/util/dom.js"; +import type { ActionEvent } from "#src/util/event_action_map.js"; +import { registerActionListener } from "#src/util/event_action_map.js"; +import { vec3 } from "#src/util/geom.js"; import { parseFixedLengthArray, verifyFinitePositiveFloat, verifyObject, verifyOptionalObjectProperty, verifyString, -} from "#/util/json"; -import { EventActionMap, KeyboardEventBinder } from "#/util/keyboard_bindings"; -import { NullarySignal } from "#/util/signal"; +} from "#src/util/json.js"; +import { + EventActionMap, + KeyboardEventBinder, +} from "#src/util/keyboard_bindings.js"; +import { NullarySignal } from "#src/util/signal.js"; import { CompoundTrackable, optionallyRestoreFromJsonMember, -} from "#/util/trackable"; -import { ViewerState, VisibilityPrioritySpecification } from "#/viewer_state"; -import { WatchableVisibilityPriority } from "#/visibility_priority/frontend"; -import { GL } from "#/webgl/context"; -import { AnnotationToolStatusWidget } from "#/widget/annotation_tool_status"; -import { CheckboxIcon } from "#/widget/checkbox_icon"; -import { makeIcon } from "#/widget/icon"; -import { MousePositionWidget, PositionWidget } from "#/widget/position_widget"; -import { TrackableScaleBarOptions } from "#/widget/scale_bar"; -import { RPC } from "#/worker_rpc"; +} from "#src/util/trackable.js"; +import type { + ViewerState, + VisibilityPrioritySpecification, +} from "#src/viewer_state.js"; +import { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; +import type { GL } from "#src/webgl/context.js"; +import { AnnotationToolStatusWidget } from "#src/widget/annotation_tool_status.js"; +import { CheckboxIcon } from "#src/widget/checkbox_icon.js"; +import { makeIcon } from "#src/widget/icon.js"; +import { + MousePositionWidget, + PositionWidget, + registerDimensionToolForLayerGroupViewer, + registerDimensionToolForUserLayer, + registerDimensionToolForViewer, +} from "#src/widget/position_widget.js"; +import { TrackableScaleBarOptions } from "#src/widget/scale_bar.js"; +import { RPC } from "#src/worker_rpc.js"; declare let NEUROGLANCER_OVERRIDE_DEFAULT_VIEWER_OPTIONS: any; @@ -145,11 +162,15 @@ export class DataManagementContext extends RefCounted { constructor( public gl: GL, public frameNumberCounter: FrameNumberCounter, - bundleRoot = "", ) { super(); - const chunk_worker_url = bundleRoot + "chunk_worker.bundle.js"; - this.worker = new Worker(chunk_worker_url); + // Note: For compatibility with multiple bundlers, a browser-compatible URL + // must be used with `new URL`, which means a Node.js subpath import like + // "#src/chunk_worker.bundle.js" cannot be used. + this.worker = new Worker( + new URL("./chunk_worker.bundle.js", import.meta.url), + { type: "module" }, + ); this.chunkQueueManager = this.registerDisposer( new ChunkQueueManager( new RPC(this.worker), @@ -245,7 +266,6 @@ export interface ViewerOptions showLayerDialog: boolean; inputEventBindings: InputEventBindings; resetStateWhenEmpty: boolean; - bundleRoot: string; } const defaultViewerOptions = @@ -516,11 +536,7 @@ export class Viewer extends RefCounted implements ViewerState { super(); const { - dataContext = new DataManagementContext( - display.gl, - display, - options.bundleRoot, - ), + dataContext = new DataManagementContext(display.gl, display), visibility = new WatchableVisibilityPriority( WatchableVisibilityPriority.VISIBLE, ), @@ -1141,4 +1157,21 @@ export class Viewer extends RefCounted implements ViewerState { } } } + + isReady() { + this.chunkQueueManager.flushPendingChunkUpdates(); + if (!this.display.isReady()) { + return false; + } + for (const layer of this.layerManager.managedLayers) { + if (!layer.isReady()) { + return false; + } + } + return true; + } } + +registerDimensionToolForViewer(Viewer); +registerDimensionToolForLayerGroupViewer(LayerGroupViewer); +registerDimensionToolForUserLayer(UserLayer); diff --git a/src/viewer_state.ts b/src/viewer_state.ts index 6998e850be..abb11b03bd 100644 --- a/src/viewer_state.ts +++ b/src/viewer_state.ts @@ -14,17 +14,17 @@ * limitations under the License. */ -import { +import type { LayerManager, MouseSelectionState, SelectedLayerState, TrackableDataSelectionState, -} from "#/layer"; -import { NavigationState } from "#/navigation_state"; -import { RenderLayerRole } from "#/renderlayer"; -import { TrackableBoolean } from "#/trackable_boolean"; -import { WatchableSet } from "#/trackable_value"; -import { VisibilityPrioritySpecification } from "#/visibility_priority/frontend"; +} from "#src/layer/index.js"; +import type { NavigationState } from "#src/navigation_state.js"; +import type { RenderLayerRole } from "#src/renderlayer.js"; +import type { TrackableBoolean } from "#src/trackable_boolean.js"; +import type { WatchableSet } from "#src/trackable_value.js"; +import { VisibilityPrioritySpecification } from "#src/visibility_priority/frontend.js"; export { VisibilityPrioritySpecification }; diff --git a/src/visibility_priority/backend.ts b/src/visibility_priority/backend.ts index 1d08d0c199..0f92c211d4 100644 --- a/src/visibility_priority/backend.ts +++ b/src/visibility_priority/backend.ts @@ -14,15 +14,13 @@ * limitations under the License. */ -import "#/shared_watchable_value"; - -import { ChunkRequester } from "#/chunk_manager/backend"; +import type { ChunkRequester } from "#src/chunk_manager/backend.js"; import { ChunkPriorityTier, PREFETCH_PRIORITY_MULTIPLIER, -} from "#/chunk_manager/base"; -import { SharedWatchableValue } from "#/shared_watchable_value"; -import { RPC } from "#/worker_rpc"; +} from "#src/chunk_manager/base.js"; +import type { SharedWatchableValue } from "#src/shared_watchable_value.js"; +import type { RPC } from "#src/worker_rpc.js"; /** * Mixin for adding a visibility shared property to a ChunkRequester. Calls diff --git a/src/visibility_priority/frontend.ts b/src/visibility_priority/frontend.ts index 9a8c652828..4f79043402 100644 --- a/src/visibility_priority/frontend.ts +++ b/src/visibility_priority/frontend.ts @@ -14,10 +14,9 @@ * limitations under the License. */ -import { SharedWatchableValue } from "#/shared_watchable_value"; -import { WatchableValue } from "#/trackable_value"; -import { RPC } from "#/worker_rpc"; -import { SharedObject } from "#/worker_rpc"; +import { SharedWatchableValue } from "#src/shared_watchable_value.js"; +import { WatchableValue } from "#src/trackable_value.js"; +import type { RPC, SharedObject } from "#src/worker_rpc.js"; /** * Numeric value specifying a visibility or prefetch priority. diff --git a/src/volume_rendering/backend.ts b/src/volume_rendering/backend.ts index 4eb599da27..83963430f0 100644 --- a/src/volume_rendering/backend.ts +++ b/src/volume_rendering/backend.ts @@ -14,33 +14,34 @@ * limitations under the License. */ -import { withChunkManager } from "#/chunk_manager/backend"; -import { ChunkState } from "#/chunk_manager/base"; -import { DisplayDimensionRenderInfo } from "#/navigation_state"; -import { +import { withChunkManager } from "#src/chunk_manager/backend.js"; +import { ChunkState } from "#src/chunk_manager/base.js"; +import type { DisplayDimensionRenderInfo } from "#src/navigation_state.js"; +import type { RenderedViewBackend, - RenderLayerBackend, RenderLayerBackendAttachment, -} from "#/render_layer_backend"; -import { SharedWatchableValue } from "#/shared_watchable_value"; +} from "#src/render_layer_backend.js"; +import { RenderLayerBackend } from "#src/render_layer_backend.js"; +import type { SharedWatchableValue } from "#src/shared_watchable_value.js"; import { BASE_PRIORITY, deserializeTransformedSources, SCALE_PRIORITY_MULTIPLIER, -} from "#/sliceview/backend"; -import { TransformedSource } from "#/sliceview/base"; -import { VolumeChunkSource } from "#/sliceview/volume/backend"; -import { vec3 } from "#/util/geom"; +} from "#src/sliceview/backend.js"; +import type { TransformedSource } from "#src/sliceview/base.js"; +import type { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; +import { vec3 } from "#src/util/geom.js"; import { getBasePriority, getPriorityTier, -} from "#/visibility_priority/backend"; +} from "#src/visibility_priority/backend.js"; import { forEachVisibleVolumeRenderingChunk, VOLUME_RENDERING_RENDER_LAYER_RPC_ID, VOLUME_RENDERING_RENDER_LAYER_UPDATE_SOURCES_RPC_ID, -} from "#/volume_rendering/base"; -import { registerRPC, registerSharedObject, RPC } from "#/worker_rpc"; +} from "#src/volume_rendering/base.js"; +import type { RPC } from "#src/worker_rpc.js"; +import { registerRPC, registerSharedObject } from "#src/worker_rpc.js"; interface VolumeRenderingRenderLayerAttachmentState { displayDimensionRenderInfo: DisplayDimensionRenderInfo; @@ -148,7 +149,6 @@ class VolumeRenderingRenderLayerBackend extends withChunkManager( transformedSources[0], (tsource, scaleIndex) => { const { chunkLayout } = tsource; - for (let i = 0; i < 3; ++i) {} chunkLayout.globalToLocalSpatial(localCenter, centerDataPosition); const { size, finiteRank } = chunkLayout; vec3.copy(chunkSize, size); diff --git a/src/volume_rendering/base.ts b/src/volume_rendering/base.ts index 7be734f805..f9805b75ac 100644 --- a/src/volume_rendering/base.ts +++ b/src/volume_rendering/base.ts @@ -14,20 +14,20 @@ * limitations under the License. */ -import { ProjectionParameters } from "#/projection_parameters"; -import { - forEachVisibleVolumetricChunk, +import type { ProjectionParameters } from "#src/projection_parameters.js"; +import type { MultiscaleVolumetricDataRenderLayer, TransformedSource, -} from "#/sliceview/base"; -import { VolumeChunkSource } from "#/sliceview/volume/base"; +} from "#src/sliceview/base.js"; +import { forEachVisibleVolumetricChunk } from "#src/sliceview/base.js"; +import type { VolumeChunkSource } from "#src/sliceview/volume/base.js"; +import type { vec3 } from "#src/util/geom.js"; import { getViewFrustrumDepthRange, mat3, mat3FromMat4, prod3, - vec3, -} from "#/util/geom"; +} from "#src/util/geom.js"; export const VOLUME_RENDERING_RENDER_LAYER_RPC_ID = "volume_rendering/VolumeRenderingRenderLayer"; diff --git a/src/volume_rendering/volume_render_layer.spec.ts b/src/volume_rendering/volume_render_layer.browser_test.ts similarity index 88% rename from src/volume_rendering/volume_render_layer.spec.ts rename to src/volume_rendering/volume_render_layer.browser_test.ts index 6b87e965b0..eea870fb4f 100644 --- a/src/volume_rendering/volume_render_layer.spec.ts +++ b/src/volume_rendering/volume_render_layer.browser_test.ts @@ -1,7 +1,8 @@ -import { fragmentShaderTest } from "#/webgl/shader_testing"; -import { glsl_computeOITWeight } from "#/perspective_view/panel"; -import { glsl_emitRGBAVolumeRendering } from "#/volume_rendering/volume_render_layer"; import { vec3 } from "gl-matrix"; +import { describe, it, expect } from "vitest"; +import { glsl_computeOITWeight } from "#src/perspective_view/panel.js"; +import { glsl_emitRGBAVolumeRendering } from "#src/volume_rendering/volume_render_layer.js"; +import { fragmentShaderTest } from "#src/webgl/shader_testing.js"; describe("volume rendering compositing", () => { const steps = [16, 22, 32, 37, 64, 100, 128, 256, 512, 551, 1024, 2048]; diff --git a/src/volume_rendering/volume_render_layer.ts b/src/volume_rendering/volume_render_layer.ts index 42d8176143..e47e1d149a 100644 --- a/src/volume_rendering/volume_render_layer.ts +++ b/src/volume_rendering/volume_render_layer.ts @@ -14,70 +14,79 @@ * limitations under the License. */ -import { ChunkState } from "#/chunk_manager/base"; -import { ChunkRenderLayerFrontend } from "#/chunk_manager/frontend"; -import { CoordinateSpace } from "#/coordinate_transform"; -import { VisibleLayerInfo } from "#/layer"; -import { PerspectivePanel } from "#/perspective_view/panel"; -import { +import { ChunkState } from "#src/chunk_manager/base.js"; +import { ChunkRenderLayerFrontend } from "#src/chunk_manager/frontend.js"; +import type { CoordinateSpace } from "#src/coordinate_transform.js"; +import type { VisibleLayerInfo } from "#src/layer/index.js"; +import type { PerspectivePanel } from "#src/perspective_view/panel.js"; +import type { PerspectiveViewReadyRenderContext, PerspectiveViewRenderContext, - PerspectiveViewRenderLayer, -} from "#/perspective_view/render_layer"; -import { RenderLayerTransformOrError } from "#/render_coordinate_transform"; +} from "#src/perspective_view/render_layer.js"; +import { PerspectiveViewRenderLayer } from "#src/perspective_view/render_layer.js"; +import type { RenderLayerTransformOrError } from "#src/render_coordinate_transform.js"; +import type { RenderScaleHistogram } from "#src/render_scale_statistics.js"; import { numRenderScaleHistogramBins, - RenderScaleHistogram, renderScaleHistogramBinSize, -} from "#/render_scale_statistics"; -import { SharedWatchableValue } from "#/shared_watchable_value"; -import { getNormalizedChunkLayout } from "#/sliceview/base"; +} from "#src/render_scale_statistics.js"; +import { SharedWatchableValue } from "#src/shared_watchable_value.js"; +import { getNormalizedChunkLayout } from "#src/sliceview/base.js"; +import type { FrontendTransformedSource } from "#src/sliceview/frontend.js"; import { - FrontendTransformedSource, getVolumetricTransformedSources, serializeAllTransformedSources, -} from "#/sliceview/frontend"; -import { SliceViewRenderLayer } from "#/sliceview/renderlayer"; -import { +} from "#src/sliceview/frontend.js"; +import type { SliceViewRenderLayer } from "#src/sliceview/renderlayer.js"; +import type { ChunkFormat, - defineChunkDataShaderAccess, MultiscaleVolumeChunkSource, VolumeChunk, VolumeChunkSource, -} from "#/sliceview/volume/frontend"; +} from "#src/sliceview/volume/frontend.js"; +import { defineChunkDataShaderAccess } from "#src/sliceview/volume/frontend.js"; +import type { + NestedStateManager, + WatchableValueInterface, +} from "#src/trackable_value.js"; import { makeCachedDerivedWatchableValue, - NestedStateManager, registerNested, - WatchableValueInterface, -} from "#/trackable_value"; -import { getFrustrumPlanes, mat4, vec3 } from "#/util/geom"; -import { getObjectId } from "#/util/object_id"; +} from "#src/trackable_value.js"; +import { getFrustrumPlanes, mat4, vec3 } from "#src/util/geom.js"; +import { clampToInterval } from "#src/util/lerp.js"; +import { getObjectId } from "#src/util/object_id.js"; +import type { HistogramInformation } from "#src/volume_rendering/base.js"; import { forEachVisibleVolumeRenderingChunk, getVolumeRenderingNearFarBounds, - HistogramInformation, VOLUME_RENDERING_RENDER_LAYER_RPC_ID, VOLUME_RENDERING_RENDER_LAYER_UPDATE_SOURCES_RPC_ID, -} from "#/volume_rendering/base"; -import { drawBoxes, glsl_getBoxFaceVertexPosition } from "#/webgl/bounding_box"; -import { glsl_COLORMAPS } from "#/webgl/colormaps"; +} from "#src/volume_rendering/base.js"; import { + drawBoxes, + glsl_getBoxFaceVertexPosition, +} from "#src/webgl/bounding_box.js"; +import { glsl_COLORMAPS } from "#src/webgl/colormaps.js"; +import type { ParameterizedContextDependentShaderGetter, - parameterizedContextDependentShaderGetter, ParameterizedShaderGetterResult, - shaderCodeWithLineDirective, WatchableShaderError, -} from "#/webgl/dynamic_shader"; -import { ShaderModule, ShaderProgram } from "#/webgl/shader"; +} from "#src/webgl/dynamic_shader.js"; import { - addControlsToBuilder, - setControlsInShader, + parameterizedContextDependentShaderGetter, + shaderCodeWithLineDirective, +} from "#src/webgl/dynamic_shader.js"; +import type { ShaderModule, ShaderProgram } from "#src/webgl/shader.js"; +import type { ShaderControlsBuilderState, ShaderControlState, -} from "#/webgl/shader_ui_controls"; -import { defineVertexId, VertexIdHelper } from "#/webgl/vertex_id"; -import { clampToInterval } from "#/util/lerp"; +} from "#src/webgl/shader_ui_controls.js"; +import { + addControlsToBuilder, + setControlsInShader, +} from "#src/webgl/shader_ui_controls.js"; +import { defineVertexId, VertexIdHelper } from "#src/webgl/vertex_id.js"; export const VOLUME_RENDERING_DEPTH_SAMPLES_DEFAULT_VALUE = 64; const VOLUME_RENDERING_DEPTH_SAMPLES_LOG_SCALE_ORIGIN = 1; diff --git a/src/webgl/buffer.ts b/src/webgl/buffer.ts index a33d2f9d04..d976cde8de 100644 --- a/src/webgl/buffer.ts +++ b/src/webgl/buffer.ts @@ -14,11 +14,12 @@ * limitations under the License. */ -import { Disposable, RefCountedValue } from "#/util/disposable"; -import { stableStringify } from "#/util/json"; -import { getObjectId } from "#/util/object_id"; -import { GL } from "#/webgl/context"; -import { AttributeIndex } from "#/webgl/shader"; +import type { Disposable } from "#src/util/disposable.js"; +import { RefCountedValue } from "#src/util/disposable.js"; +import { stableStringify } from "#src/util/json.js"; +import { getObjectId } from "#src/util/object_id.js"; +import type { GL } from "#src/webgl/context.js"; +import type { AttributeIndex } from "#src/webgl/shader.js"; export type BufferType = number; export type WebGLDataType = number; diff --git a/src/webgl/circles.ts b/src/webgl/circles.ts index a17f258a81..3015542127 100644 --- a/src/webgl/circles.ts +++ b/src/webgl/circles.ts @@ -22,8 +22,8 @@ import { drawQuads, glsl_getQuadVertexPosition, VERTICES_PER_QUAD, -} from "#/webgl/quad"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; +} from "#src/webgl/quad.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; export const VERTICES_PER_CIRCLE = VERTICES_PER_QUAD; diff --git a/src/webgl/context.ts b/src/webgl/context.ts index b9eccb4037..5241781a6e 100644 --- a/src/webgl/context.ts +++ b/src/webgl/context.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { RefCounted } from "#/util/disposable"; -import { Memoize } from "#/util/memoize"; +import type { RefCounted } from "#src/util/disposable.js"; +import { Memoize } from "#src/util/memoize.js"; export interface GL extends WebGL2RenderingContext { memoize: Memoize; diff --git a/src/webgl/dynamic_shader.ts b/src/webgl/dynamic_shader.ts index 1277cb138e..e385a5220e 100644 --- a/src/webgl/dynamic_shader.ts +++ b/src/webgl/dynamic_shader.ts @@ -14,23 +14,23 @@ * limitations under the License. */ +import type { WatchableValueInterface } from "#src/trackable_value.js"; import { constantWatchableValue, WatchableValue, - WatchableValueInterface, -} from "#/trackable_value"; -import { TrackableValue } from "#/trackable_value"; -import { RefCounted } from "#/util/disposable"; -import { stableStringify, verifyString } from "#/util/json"; -import { getObjectId } from "#/util/object_id"; -import { GL } from "#/webgl/context"; -import { - ShaderBuilder, + TrackableValue, +} from "#src/trackable_value.js"; +import type { RefCounted } from "#src/util/disposable.js"; +import { stableStringify, verifyString } from "#src/util/json.js"; +import { getObjectId } from "#src/util/object_id.js"; +import type { GL } from "#src/webgl/context.js"; +import type { ShaderCompilationError, ShaderLinkError, ShaderModule, ShaderProgram, -} from "#/webgl/shader"; +} from "#src/webgl/shader.js"; +import { ShaderBuilder } from "#src/webgl/shader.js"; /** * undefined means shader has not been compiled. null means shader was compiled successfully. @@ -200,7 +200,9 @@ export function parameterizedContextDependentShaderGetter< ); entry.parameters = fallbackParametersValue; entry.fallback = true; - } catch {} + } catch { + // Ignore error creating fallback shader. + } } } if (oldShader !== null) { diff --git a/src/webgl/ellipse.ts b/src/webgl/ellipse.ts index daeb557a4a..9d156faebe 100644 --- a/src/webgl/ellipse.ts +++ b/src/webgl/ellipse.ts @@ -18,7 +18,8 @@ * @file Ellipse-related shader functions. */ -import { mat3, vec2, vec3 } from "#/util/geom"; +import type { mat3, vec3 } from "#src/util/geom.js"; +import { vec2 } from "#src/util/geom.js"; /** * Specifies the parameters of an ellipse in quadratic form. diff --git a/src/webgl/empirical_cdf.ts b/src/webgl/empirical_cdf.ts index 847f2379dd..799fe98120 100644 --- a/src/webgl/empirical_cdf.ts +++ b/src/webgl/empirical_cdf.ts @@ -24,20 +24,20 @@ * rendering point primitives. */ -import { WatchableValueInterface } from "#/trackable_value"; -import { RefCounted } from "#/util/disposable"; -import { DataTypeInterval } from "#/util/lerp"; -import { VisibilityPriorityAggregator } from "#/visibility_priority/frontend"; -import { getMemoizedBuffer } from "#/webgl/buffer"; -import { GL } from "#/webgl/context"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { RefCounted } from "#src/util/disposable.js"; +import type { DataTypeInterval } from "#src/util/lerp.js"; +import { VisibilityPriorityAggregator } from "#src/visibility_priority/frontend.js"; +import { getMemoizedBuffer } from "#src/webgl/buffer.js"; +import type { GL } from "#src/webgl/context.js"; +import type { TextureBuffer } from "#src/webgl/offscreen.js"; import { FramebufferConfiguration, makeTextureBuffers, - TextureBuffer, -} from "#/webgl/offscreen"; -import { ShaderBuilder } from "#/webgl/shader"; -import { glsl_simpleFloatHash } from "#/webgl/shader_lib"; -import { setRawTextureParameters } from "#/webgl/texture"; +} from "#src/webgl/offscreen.js"; +import { ShaderBuilder } from "#src/webgl/shader.js"; +import { glsl_simpleFloatHash } from "#src/webgl/shader_lib.js"; +import { setRawTextureParameters } from "#src/webgl/texture.js"; const DEBUG_HISTOGRAMS = false; diff --git a/src/webgl/index_emulation.spec.ts b/src/webgl/index_emulation.browser_test.ts similarity index 91% rename from src/webgl/index_emulation.spec.ts rename to src/webgl/index_emulation.browser_test.ts index 38f8fda6ab..e2c5e791e2 100644 --- a/src/webgl/index_emulation.spec.ts +++ b/src/webgl/index_emulation.browser_test.ts @@ -14,11 +14,12 @@ * limitations under the License. */ +import { it, describe, expect } from "vitest"; import { IndexBufferAttributeHelper, makeIndexBuffer, -} from "#/webgl/index_emulation"; -import { fragmentShaderTest } from "#/webgl/shader_testing"; +} from "#src/webgl/index_emulation.js"; +import { fragmentShaderTest } from "#src/webgl/shader_testing.js"; describe("webgl/index_emulation", () => { it("indexBuffer", () => { diff --git a/src/webgl/index_emulation.ts b/src/webgl/index_emulation.ts index 15b8d0dedb..c1976599f6 100644 --- a/src/webgl/index_emulation.ts +++ b/src/webgl/index_emulation.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import { RefCounted } from "#/util/disposable"; -import { Buffer } from "#/webgl/buffer"; -import { GL } from "#/webgl/context"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; -import { glsl_uint32 } from "#/webgl/shader_lib"; +import { RefCounted } from "#src/util/disposable.js"; +import { Buffer } from "#src/webgl/buffer.js"; +import type { GL } from "#src/webgl/context.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; +import { glsl_uint32 } from "#src/webgl/shader_lib.js"; export class CountingBuffer extends RefCounted { length: number | undefined; diff --git a/src/webgl/lerp.spec.ts b/src/webgl/lerp.browser_test.ts similarity index 94% rename from src/webgl/lerp.spec.ts rename to src/webgl/lerp.browser_test.ts index 9dd22888d8..c700d6761e 100644 --- a/src/webgl/lerp.spec.ts +++ b/src/webgl/lerp.browser_test.ts @@ -14,21 +14,22 @@ * limitations under the License. */ -import { DATA_TYPE_ARRAY_CONSTRUCTOR, DataType } from "#/util/data_type"; +import { expect, describe, it } from "vitest"; +import { DATA_TYPE_ARRAY_CONSTRUCTOR, DataType } from "#src/util/data_type.js"; +import type { DataTypeInterval } from "#src/util/lerp.js"; import { computeInvlerp, computeLerp, - DataTypeInterval, defaultDataTypeRange, -} from "#/util/lerp"; -import { getRandomValues } from "#/util/random"; -import { Uint64 } from "#/util/uint64"; +} from "#src/util/lerp.js"; +import { getRandomValues } from "#src/util/random.js"; +import { Uint64 } from "#src/util/uint64.js"; import { defineInvlerpShaderFunction, defineLerpShaderFunction, enableLerpShaderFunction, -} from "#/webgl/lerp"; -import { fragmentShaderTest } from "#/webgl/shader_testing"; +} from "#src/webgl/lerp.js"; +import { fragmentShaderTest } from "#src/webgl/shader_testing.js"; function getRandomValue(dataType: DataType) { switch (dataType) { @@ -75,10 +76,10 @@ function testInvlerpRoundtrip( for (const x of values) { const t = computeInvlerp(interval, x); const y = computeLerp(interval, dataType, t); - expect(y.toString()).toBe( - x.toString(), + expect( + y.toString(), `interval=[${interval[0]}, ${interval[1]}], t=${t}`, - ); + ).toBe(x.toString()); } } @@ -119,14 +120,14 @@ function testLerpRoundtrip( ) { const { x, u } = roundtrip(dataType, interval, t); const errorBound = getLerpErrorBound(interval, dataType); - expect(u).toBeGreaterThan( - t - errorBound, + expect( + u, `x=${x}, t=${t}, errorBound=${errorBound}, interval=[${interval[0]}, ${interval[1]}]`, - ); - expect(u).toBeLessThan( - t + errorBound, + ).toBeGreaterThan(t - errorBound); + expect( + u, `x=${x}, t=${t}, errorBound=${errorBound}, interval=[${interval[0]}, ${interval[1]}]`, - ); + ).toBeLessThan(t + errorBound); } function getValuesInInterval(interval: DataTypeInterval) { @@ -368,10 +369,10 @@ outputValue = doLerp(invlerpOutput); getValuesInInterval(example.interval)) { tester.execute({ inputValue: value }); const results = tester.values; - expect(results.outputValue.toString()).toBe( - value.toString(), + expect( + results.outputValue.toString(), `interval=${example.interval}, u=${results.invlerpOutput}`, - ); + ).toBe(value.toString()); } }; for (const example of examples) { diff --git a/src/webgl/lerp.ts b/src/webgl/lerp.ts index d9d3fe16fe..5e6546c924 100644 --- a/src/webgl/lerp.ts +++ b/src/webgl/lerp.ts @@ -18,10 +18,14 @@ * @file Defines lerp/invlerp functionality for all supported data types. */ -import { DataType, DATA_TYPE_SIGNED } from "#/util/data_type"; -import { DataTypeInterval } from "#/util/lerp"; -import { Uint64 } from "#/util/uint64"; -import { ShaderBuilder, ShaderCodePart, ShaderProgram } from "#/webgl/shader"; +import { DataType, DATA_TYPE_SIGNED } from "#src/util/data_type.js"; +import type { DataTypeInterval } from "#src/util/lerp.js"; +import { Uint64 } from "#src/util/uint64.js"; +import type { + ShaderBuilder, + ShaderCodePart, + ShaderProgram, +} from "#src/webgl/shader.js"; import { dataTypeShaderDefinition, getShaderType, @@ -38,7 +42,7 @@ import { glsl_subtractSaturateUint64, glsl_subtractUint64, glsl_uint64, -} from "#/webgl/shader_lib"; +} from "#src/webgl/shader_lib.js"; export const dataTypeShaderLerpParametersType: Record = { [DataType.UINT8]: "vec2", @@ -253,6 +257,7 @@ function defineLerpUniforms( case DataType.INT16: case DataType.UINT16: // {uint,int}{8,16} can be converted with float32 without any loss of precision + // fallthrough case DataType.FLOAT32: builder.addUniform("vec2", pName); break; diff --git a/src/webgl/lines.ts b/src/webgl/lines.ts index f2eecf8e5d..66d3572f25 100644 --- a/src/webgl/lines.ts +++ b/src/webgl/lines.ts @@ -22,9 +22,9 @@ import { drawQuads, glsl_getQuadVertexPosition, VERTICES_PER_QUAD, -} from "#/webgl/quad"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; -import { glsl_clipLineToDepthRange } from "#/webgl/shader_lib"; +} from "#src/webgl/quad.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; +import { glsl_clipLineToDepthRange } from "#src/webgl/shader_lib.js"; export const VERTICES_PER_LINE = VERTICES_PER_QUAD; diff --git a/src/webgl/offscreen.ts b/src/webgl/offscreen.ts index ad0ecc00b9..12754a55c2 100644 --- a/src/webgl/offscreen.ts +++ b/src/webgl/offscreen.ts @@ -14,17 +14,17 @@ * limitations under the License. */ -import { RefCounted } from "#/util/disposable"; -import { identityMat4 } from "#/util/geom"; -import { getObjectId } from "#/util/object_id"; -import { GL } from "#/webgl/context"; -import { ShaderModule, ShaderProgram } from "#/webgl/shader"; -import { getSquareCornersBuffer } from "#/webgl/square_corners_buffer"; -import { resizeTexture } from "#/webgl/texture"; +import { RefCounted } from "#src/util/disposable.js"; +import { identityMat4 } from "#src/util/geom.js"; +import { getObjectId } from "#src/util/object_id.js"; +import type { GL } from "#src/webgl/context.js"; +import type { ShaderModule, ShaderProgram } from "#src/webgl/shader.js"; +import { getSquareCornersBuffer } from "#src/webgl/square_corners_buffer.js"; +import { resizeTexture } from "#src/webgl/texture.js"; import { defineCopyFragmentShader, elementWiseTextureShader, -} from "#/webgl/trivial_shaders"; +} from "#src/webgl/trivial_shaders.js"; export abstract class SizeManaged extends RefCounted { width = Number.NaN; diff --git a/src/webgl/shader.ts b/src/webgl/shader.ts index 8c8c8c33f3..37335c7fde 100644 --- a/src/webgl/shader.ts +++ b/src/webgl/shader.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { RefCounted } from "#/util/disposable"; -import { GL } from "#/webgl/context"; +import { RefCounted } from "#src/util/disposable.js"; +import type { GL } from "#src/webgl/context.js"; const DEBUG_SHADER = false; @@ -126,7 +126,9 @@ export function getShader( if (w !== null) { try { w.document.write(s); - } catch (writeError) {} + } catch { + // Ignore error writing output, e.g. due to popup blocking. + } } } diff --git a/src/webgl/shader_lib.spec.ts b/src/webgl/shader_lib.browser_test.ts similarity index 86% rename from src/webgl/shader_lib.spec.ts rename to src/webgl/shader_lib.browser_test.ts index d25d63d784..38b758228b 100644 --- a/src/webgl/shader_lib.spec.ts +++ b/src/webgl/shader_lib.browser_test.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import { DataType } from "#/util/data_type"; -import { Uint64 } from "#/util/uint64"; +import { describe, it, expect } from "vitest"; +import { DataType } from "#src/util/data_type.js"; +import { Uint64 } from "#src/util/uint64.js"; import { glsl_addSaturateInt32, glsl_addSaturateUint32, @@ -24,8 +25,8 @@ import { glsl_shiftLeftSaturateUint32, glsl_subtractSaturateInt32, glsl_subtractSaturateUint32, -} from "#/webgl/shader_lib"; -import { fragmentShaderTest } from "#/webgl/shader_testing"; +} from "#src/webgl/shader_lib.js"; +import { fragmentShaderTest } from "#src/webgl/shader_testing.js"; describe("glsl_log2Exact", () => { it("works for small examples", () => { @@ -36,11 +37,11 @@ describe("glsl_log2Exact", () => { const { builder } = tester; builder.addFragmentCode(glsl_log2Exact); builder.setFragmentMain("outputValue = log2Exact(inputValue);"); - for (let i = 0; i <= 31; ++i) { + for (let i = 0; i < 32; ++i) { const j = 2 ** i; tester.execute({ inputValue: j }); const values = tester.values; - expect(values.outputValue).toBe(i, `i=${i}, 2^i=${j}`); + expect(values.outputValue, `i=${i}, 2**i=${j}`).toBe(i); } }, ); @@ -184,23 +185,23 @@ describe("uint64AddSaturate", () => { const { builder } = tester; builder.addFragmentCode(glsl_addSaturateUint64); builder.setFragmentMain("outputValue = addSaturate(inputA, inputB);"); - const doTest = (a: string, b: string, expected: string) => { + + for (const [a, b, expected] of [ + ["0", "0", "0"], + ["1", "2", "3"], + ["fffffffffffffffd", "1", "fffffffffffffffe"], + ["fffffffffffffffd", "2", "ffffffffffffffff"], + ["fffffffffffffffd", "3", "ffffffffffffffff"], + ["1", "fffffffffffffffd", "fffffffffffffffe"], + ["2", "fffffffffffffffd", "ffffffffffffffff"], + ["3", "fffffffffffffffd", "ffffffffffffffff"], + ["1", "ffffffffffffffff", "ffffffffffffffff"], + ]) { + const msg = `addSaturate(${a}, ${b}) = ${expected}`; tester.execute({ inputA: u64(a, 16), inputB: u64(b, 16) }); const result = tester.values.outputValue; - expect(result.toString(16)).toBe( - u64(expected, 16).toString(16), - `a=${a}, b=${b}`, - ); - }; - doTest("0", "0", "0"); - doTest("1", "2", "3"); - doTest("fffffffffffffffd", "1", "fffffffffffffffe"); - doTest("fffffffffffffffd", "2", "ffffffffffffffff"); - doTest("fffffffffffffffd", "3", "ffffffffffffffff"); - doTest("1", "fffffffffffffffd", "fffffffffffffffe"); - doTest("2", "fffffffffffffffd", "ffffffffffffffff"); - doTest("3", "fffffffffffffffd", "ffffffffffffffff"); - doTest("1", "ffffffffffffffff", "ffffffffffffffff"); + expect(result.toString(16), msg).toBe(u64(expected, 16).toString(16)); + } }, ); }); diff --git a/src/webgl/shader_lib.ts b/src/webgl/shader_lib.ts index f4adf0cadd..963dd4d7ee 100644 --- a/src/webgl/shader_lib.ts +++ b/src/webgl/shader_lib.ts @@ -14,8 +14,16 @@ * limitations under the License. */ -import { DATA_TYPE_BYTES, DATA_TYPE_SIGNED, DataType } from "#/util/data_type"; -import { AttributeIndex, ShaderBuilder, ShaderCodePart } from "#/webgl/shader"; +import { + DATA_TYPE_BYTES, + DATA_TYPE_SIGNED, + DataType, +} from "#src/util/data_type.js"; +import type { + AttributeIndex, + ShaderBuilder, + ShaderCodePart, +} from "#src/webgl/shader.js"; export const glsl_mixLinear = ` float mixLinear(float x, float y, float a) { return mix(x, y, a); } diff --git a/src/webgl/shader_testing.spec.ts b/src/webgl/shader_testing.browser_test.ts similarity index 97% rename from src/webgl/shader_testing.spec.ts rename to src/webgl/shader_testing.browser_test.ts index eb2dc6f174..6c7b916610 100644 --- a/src/webgl/shader_testing.spec.ts +++ b/src/webgl/shader_testing.browser_test.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { fragmentShaderTest } from "#/webgl/shader_testing"; +import { describe, it, expect } from "vitest"; +import { fragmentShaderTest } from "#src/webgl/shader_testing.js"; describe("FragmentShaderTester", () => { it("uint passthrough", () => { diff --git a/src/webgl/shader_testing.ts b/src/webgl/shader_testing.ts index b99b20f299..b65104a0cb 100644 --- a/src/webgl/shader_testing.ts +++ b/src/webgl/shader_testing.ts @@ -14,15 +14,22 @@ * limitations under the License. */ -import { DataType } from "#/util/data_type"; -import { RefCounted } from "#/util/disposable"; -import { Uint64 } from "#/util/uint64"; -import { GL } from "#/webgl/context"; -import { FramebufferConfiguration, TextureBuffer } from "#/webgl/offscreen"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; -import { dataTypeShaderDefinition, getShaderType } from "#/webgl/shader_lib"; -import { getSquareCornersBuffer } from "#/webgl/square_corners_buffer"; -import { webglTest } from "#/webgl/testing"; +import { DataType } from "#src/util/data_type.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { Uint64 } from "#src/util/uint64.js"; +import type { GL } from "#src/webgl/context.js"; +import { + FramebufferConfiguration, + TextureBuffer, +} from "#src/webgl/offscreen.js"; +import type { ShaderProgram } from "#src/webgl/shader.js"; +import { ShaderBuilder } from "#src/webgl/shader.js"; +import { + dataTypeShaderDefinition, + getShaderType, +} from "#src/webgl/shader_lib.js"; +import { getSquareCornersBuffer } from "#src/webgl/square_corners_buffer.js"; +import { webglTest } from "#src/webgl/testing.js"; export type ShaderIoType = "int" | "uint" | "float" | "bool" | DataType; diff --git a/src/webgl/shader_ui_controls.spec.ts b/src/webgl/shader_ui_controls.browser_test.ts similarity index 98% rename from src/webgl/shader_ui_controls.spec.ts rename to src/webgl/shader_ui_controls.browser_test.ts index d0f3fe95ee..09d70c10cc 100644 --- a/src/webgl/shader_ui_controls.spec.ts +++ b/src/webgl/shader_ui_controls.browser_test.ts @@ -14,12 +14,13 @@ * limitations under the License. */ -import { DataType } from "#/util/data_type"; -import { vec3 } from "#/util/geom"; +import { expect, describe, it } from "vitest"; +import { DataType } from "#src/util/data_type.js"; +import { vec3 } from "#src/util/geom.js"; import { parseShaderUiControls, stripComments, -} from "#/webgl/shader_ui_controls"; +} from "#src/webgl/shader_ui_controls.js"; describe("stripComments", () => { it("handles code without comments", () => { diff --git a/src/webgl/shader_ui_controls.ts b/src/webgl/shader_ui_controls.ts index 884dabb8fc..7439a9750f 100644 --- a/src/webgl/shader_ui_controls.ts +++ b/src/webgl/shader_ui_controls.ts @@ -14,21 +14,23 @@ * limitations under the License. */ -import { CoordinateSpaceCombiner } from "#/coordinate_transform"; -import { TrackableBoolean } from "#/trackable_boolean"; +import type { CoordinateSpaceCombiner } from "#src/coordinate_transform.js"; +import { TrackableBoolean } from "#src/trackable_boolean.js"; +import type { + TrackableValueInterface, + WatchableValueInterface, +} from "#src/trackable_value.js"; import { constantWatchableValue, makeCachedDerivedWatchableValue, makeCachedLazyDerivedWatchableValue, TrackableValue, - TrackableValueInterface, - WatchableValueInterface, -} from "#/trackable_value"; -import { arraysEqual, arraysEqualWithPredicate } from "#/util/array"; -import { parseRGBColorSpecification, TrackableRGB } from "#/util/color"; -import { DataType } from "#/util/data_type"; -import { RefCounted } from "#/util/disposable"; -import { vec3 } from "#/util/geom"; +} from "#src/trackable_value.js"; +import { arraysEqual, arraysEqualWithPredicate } from "#src/util/array.js"; +import { parseRGBColorSpecification, TrackableRGB } from "#src/util/color.js"; +import type { DataType } from "#src/util/data_type.js"; +import { RefCounted } from "#src/util/disposable.js"; +import type { vec3 } from "#src/util/geom.js"; import { parseFixedLengthArray, verifyFiniteFloat, @@ -36,29 +38,27 @@ import { verifyObject, verifyOptionalObjectProperty, verifyString, -} from "#/util/json"; +} from "#src/util/json.js"; +import type { DataTypeInterval } from "#src/util/lerp.js"; import { convertDataTypeInterval, - DataTypeInterval, dataTypeIntervalToJson, defaultDataTypeRange, normalizeDataTypeInterval, parseDataTypeInterval, parseUnknownDataTypeInterval, validateDataTypeInterval, -} from "#/util/lerp"; -import { NullarySignal } from "#/util/signal"; -import { Trackable } from "#/util/trackable"; -import { GL } from "#/webgl/context"; -import { - HistogramChannelSpecification, - HistogramSpecifications, -} from "#/webgl/empirical_cdf"; +} from "#src/util/lerp.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { Trackable } from "#src/util/trackable.js"; +import type { GL } from "#src/webgl/context.js"; +import type { HistogramChannelSpecification } from "#src/webgl/empirical_cdf.js"; +import { HistogramSpecifications } from "#src/webgl/empirical_cdf.js"; import { defineInvlerpShaderFunction, enableLerpShaderFunction, -} from "#/webgl/lerp"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; +} from "#src/webgl/lerp.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; export interface ShaderSliderControl { type: "slider"; diff --git a/src/webgl/spheres.ts b/src/webgl/spheres.ts index 1cb96deb85..e42e6790e2 100644 --- a/src/webgl/spheres.ts +++ b/src/webgl/spheres.ts @@ -18,10 +18,11 @@ * @file Facilities for drawing spheres in WebGL */ -import { RefCounted } from "#/util/disposable"; -import { Buffer, getMemoizedBuffer } from "#/webgl/buffer"; -import { GL } from "#/webgl/context"; -import { ShaderBuilder, ShaderProgram } from "#/webgl/shader"; +import { RefCounted } from "#src/util/disposable.js"; +import type { Buffer } from "#src/webgl/buffer.js"; +import { getMemoizedBuffer } from "#src/webgl/buffer.js"; +import type { GL } from "#src/webgl/context.js"; +import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; export function getSphereVertexArray( latitudeBands: number, diff --git a/src/webgl/square_corners_buffer.ts b/src/webgl/square_corners_buffer.ts index 223cf21c60..aeca9928bd 100644 --- a/src/webgl/square_corners_buffer.ts +++ b/src/webgl/square_corners_buffer.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { tile2dArray } from "#/util/array"; -import { getMemoizedBuffer } from "#/webgl/buffer"; -import { GL } from "#/webgl/context"; +import { tile2dArray } from "#src/util/array.js"; +import { getMemoizedBuffer } from "#src/webgl/buffer.js"; +import type { GL } from "#src/webgl/context.js"; export function getSquareCornersArray( startX = -1, diff --git a/src/webgl/testing.ts b/src/webgl/testing.ts index cbcce3691d..3ba5dfcc85 100644 --- a/src/webgl/testing.ts +++ b/src/webgl/testing.ts @@ -14,18 +14,10 @@ * limitations under the License. */ -import { GL, initializeWebGL } from "#/webgl/context"; - -declare const NEUROGLANCER_SKIP_WEBGL_TESTS: boolean | undefined; +import type { GL } from "#src/webgl/context.js"; +import { initializeWebGL } from "#src/webgl/context.js"; export function webglTest(f: (gl: GL, canvas: HTMLCanvasElement) => void) { - if ( - typeof NEUROGLANCER_SKIP_WEBGL_TESTS !== "undefined" && - NEUROGLANCER_SKIP_WEBGL_TESTS === true - ) { - pending("NEUROGLANCER_SKIP_WEBGL_TESTS=true"); - return; - } const canvas = document.createElement("canvas"); document.body.appendChild(canvas); let gl: GL | undefined; diff --git a/src/webgl/texture.ts b/src/webgl/texture.ts index 7b9cf4364f..affe74e394 100644 --- a/src/webgl/texture.ts +++ b/src/webgl/texture.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { GL } from "#/webgl/context"; +import type { GL } from "#src/webgl/context.js"; /** * Sets parameters to make a texture suitable for use as a raw array: NEAREST diff --git a/src/webgl/texture_access.spec.ts b/src/webgl/texture_access.browser_test.ts similarity index 80% rename from src/webgl/texture_access.spec.ts rename to src/webgl/texture_access.browser_test.ts index 3e05971884..0cb1030eb8 100644 --- a/src/webgl/texture_access.spec.ts +++ b/src/webgl/texture_access.browser_test.ts @@ -14,14 +14,15 @@ * limitations under the License. */ -import { DataType } from "#/util/data_type"; -import { fragmentShaderTest } from "#/webgl/shader_testing"; +import { expect, describe, test } from "vitest"; +import { DataType } from "#src/util/data_type.js"; +import { fragmentShaderTest } from "#src/webgl/shader_testing.js"; import { computeTextureFormat, OneDimensionalTextureAccessHelper, setOneDimensionalTextureData, TextureFormat, -} from "#/webgl/texture_access"; +} from "#src/webgl/texture_access.js"; function testTextureAccess(dataLength: number) { const dataType = DataType.UINT32; @@ -70,27 +71,20 @@ outputValue = readValue(uOffset); setOneDimensionalTextureData(gl, format, data); gl.bindTexture(gl.TEXTURE_2D, null); - function testOffset(x: number) { + const COUNT = 100; + for (const x of [ + 255, + ...Array.from(Array(100).keys()), + ...Array.from(Array(COUNT), () => + Math.floor(Math.random() * data.length), + ), + ]) { const value = data[x]; gl.activeTexture(gl.TEXTURE0 + textureUnit); gl.bindTexture(gl.TEXTURE_2D, texture); tester.execute({ uOffset: x }); gl.bindTexture(gl.TEXTURE_2D, null); - expect(tester.values.outputValue).toBe( - value, - `offset = ${x}, value = ${value}`, - ); - } - - testOffset(255 /*+ 256 * 256 * 9*/); - for (let i = 0; i < 100; ++i) { - testOffset(i); - } - - const COUNT = 100; - for (let i = 0; i < COUNT; ++i) { - const offset = Math.floor(Math.random() * data.length); - testOffset(offset); + expect(tester.values.outputValue, `offset=${x}`).toBe(value); } }, ); @@ -101,7 +95,7 @@ function test1dTextureAccess(dataLength: number) { } describe("one_dimensional_texture_access", () => { - it("uint32 access works correctly for 1-D 128*128*128", () => { + test("uint32 access works correctly for 1-D 128*128*128", () => { test1dTextureAccess(128 * 128 * 128); }); }); diff --git a/src/webgl/texture_access.ts b/src/webgl/texture_access.ts index ab935c18a2..82e225e999 100644 --- a/src/webgl/texture_access.ts +++ b/src/webgl/texture_access.ts @@ -23,15 +23,16 @@ * require padding. */ -import { maybePadArray, TypedArray, TypedArrayConstructor } from "#/util/array"; -import { DATA_TYPE_SIGNED, DataType } from "#/util/data_type"; -import { vec3 } from "#/util/geom"; -import { GL } from "#/webgl/context"; -import { +import type { TypedArray, TypedArrayConstructor } from "#src/util/array.js"; +import { maybePadArray } from "#src/util/array.js"; +import { DATA_TYPE_SIGNED, DataType } from "#src/util/data_type.js"; +import type { vec3 } from "#src/util/geom.js"; +import type { GL } from "#src/webgl/context.js"; +import type { ShaderBuilder, ShaderCodePart, ShaderSamplerPrefix, -} from "#/webgl/shader"; +} from "#src/webgl/shader.js"; import { getShaderType, glsl_float, @@ -44,11 +45,11 @@ import { glsl_uint64, glsl_uint8, glsl_unpackUint64leFromUint32, -} from "#/webgl/shader_lib"; +} from "#src/webgl/shader_lib.js"; import { setRawTexture3DParameters, setRawTextureParameters, -} from "#/webgl/texture"; +} from "#src/webgl/texture.js"; export type TextureAccessCoefficients = vec3; diff --git a/src/webgl/trivial_shaders.ts b/src/webgl/trivial_shaders.ts index 8f5bd83daf..aa16d61bdf 100644 --- a/src/webgl/trivial_shaders.ts +++ b/src/webgl/trivial_shaders.ts @@ -14,9 +14,10 @@ * limitations under the License. */ -import { getObjectId } from "#/util/object_id"; -import { GL } from "#/webgl/context"; -import { ShaderBuilder, ShaderModule, ShaderProgram } from "#/webgl/shader"; +import { getObjectId } from "#src/util/object_id.js"; +import type { GL } from "#src/webgl/context.js"; +import type { ShaderModule, ShaderProgram } from "#src/webgl/shader.js"; +import { ShaderBuilder } from "#src/webgl/shader.js"; export function defineCopyFragmentShader(builder: ShaderBuilder) { builder.addOutputBuffer("vec4", "v4f_fragColor", null); diff --git a/src/webgl/vertex_id.ts b/src/webgl/vertex_id.ts index 5422d57131..9f20345679 100644 --- a/src/webgl/vertex_id.ts +++ b/src/webgl/vertex_id.ts @@ -21,10 +21,10 @@ * https://github.com/KhronosGroup/WebGL/pull/2662 */ -import { RefCounted } from "#/util/disposable"; -import { Buffer } from "#/webgl/buffer"; -import { GL } from "#/webgl/context"; -import { ShaderBuilder } from "#/webgl/shader"; +import { RefCounted } from "#src/util/disposable.js"; +import { Buffer } from "#src/webgl/buffer.js"; +import type { GL } from "#src/webgl/context.js"; +import type { ShaderBuilder } from "#src/webgl/shader.js"; export function defineVertexId(builder: ShaderBuilder) { // Define attribute for location 0 that will always equal 0. diff --git a/src/widget/add_button.ts b/src/widget/add_button.ts index c59e43998a..284319d7c6 100644 --- a/src/widget/add_button.ts +++ b/src/widget/add_button.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import svg_plus from "ikonate/icons/plus.svg"; -import { makeIcon, MakeIconOptions } from "#/widget/icon"; +import svg_plus from "ikonate/icons/plus.svg?raw"; +import type { MakeIconOptions } from "#src/widget/icon.js"; +import { makeIcon } from "#src/widget/icon.js"; export function makeAddButton(options: MakeIconOptions = {}) { return makeIcon({ svg: svg_plus, ...options }); diff --git a/src/widget/annotation_tool_status.ts b/src/widget/annotation_tool_status.ts index 7b3211b505..d359071859 100644 --- a/src/widget/annotation_tool_status.ts +++ b/src/widget/annotation_tool_status.ts @@ -14,19 +14,16 @@ * limitations under the License. */ -import "./annotation_tool_status.css"; +import "#src/widget/annotation_tool_status.css"; -import { SelectedLayerState, UserLayer } from "#/layer"; -import { - addToolKeyBindHandlers, - Tool, - GlobalToolBinder, - LegacyTool, -} from "#/ui/tool"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { RefCounted } from "#/util/disposable"; -import { removeChildren } from "#/util/dom"; -import { defaultStringCompare } from "#/util/string"; +import type { SelectedLayerState } from "#src/layer/index.js"; +import { UserLayer } from "#src/layer/index.js"; +import type { GlobalToolBinder } from "#src/ui/tool.js"; +import { addToolKeyBindHandlers, Tool, LegacyTool } from "#src/ui/tool.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeChildren } from "#src/util/dom.js"; +import { defaultStringCompare } from "#src/util/string.js"; export class AnnotationToolStatusWidget extends RefCounted { element = document.createElement("div"); diff --git a/src/widget/channel_dimensions_widget.ts b/src/widget/channel_dimensions_widget.ts index 9c025f6504..701f0b6a98 100644 --- a/src/widget/channel_dimensions_widget.ts +++ b/src/widget/channel_dimensions_widget.ts @@ -14,24 +14,26 @@ * limitations under the License. */ -import "./channel_dimensions_widget.css"; +import "#src/widget/channel_dimensions_widget.css"; -import { +import type { CoordinateSpace, CoordinateSpaceCombiner, DimensionId, +} from "#src/coordinate_transform.js"; +import { getDisplayLowerUpperBounds, insertDimensionAt, -} from "#/coordinate_transform"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { arraysEqual } from "#/util/array"; -import { RefCounted } from "#/util/disposable"; -import { updateChildren, updateInputFieldWidth } from "#/util/dom"; +} from "#src/coordinate_transform.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import { arraysEqual } from "#src/util/array.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { updateChildren, updateInputFieldWidth } from "#src/util/dom.js"; import { KeyboardEventBinder, registerActionListener, -} from "#/util/keyboard_bindings"; -import { EventActionMap } from "#/util/mouse_bindings"; +} from "#src/util/keyboard_bindings.js"; +import { EventActionMap } from "#src/util/mouse_bindings.js"; const inputEventMap = EventActionMap.fromObject({ arrowup: { action: "tab-backward" }, diff --git a/src/widget/checkbox_icon.ts b/src/widget/checkbox_icon.ts index 1e02af8b01..a87dc635ab 100644 --- a/src/widget/checkbox_icon.ts +++ b/src/widget/checkbox_icon.ts @@ -14,11 +14,12 @@ * limitations under the License. */ -import "./checkbox_icon.css"; +import "#src/widget/checkbox_icon.css"; -import { WatchableValueInterface } from "#/trackable_value"; -import { RefCounted } from "#/util/disposable"; -import { makeIcon, MakeIconOptions } from "#/widget/icon"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { RefCounted } from "#src/util/disposable.js"; +import type { MakeIconOptions } from "#src/widget/icon.js"; +import { makeIcon } from "#src/widget/icon.js"; export interface MakeCheckboxIconOptions extends Omit { diff --git a/src/widget/close_button.ts b/src/widget/close_button.ts index 1d112047be..5805fb93f7 100644 --- a/src/widget/close_button.ts +++ b/src/widget/close_button.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import svg_close from "ikonate/icons/close.svg"; -import { makeIcon, MakeIconOptions } from "#/widget/icon"; +import svg_close from "ikonate/icons/close.svg?raw"; +import type { MakeIconOptions } from "#src/widget/icon.js"; +import { makeIcon } from "#src/widget/icon.js"; export function makeCloseButton(options: MakeIconOptions = {}) { return makeIcon({ svg: svg_close, ...options }); diff --git a/src/widget/color.ts b/src/widget/color.ts index 34e7e69f26..48321cd28b 100644 --- a/src/widget/color.ts +++ b/src/widget/color.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import { WatchableValueInterface } from "#/trackable_value"; -import { parseRGBColorSpecification, serializeColor } from "#/util/color"; -import { hsvToRgb, rgbToHsv } from "#/util/colorspace"; -import { RefCounted } from "#/util/disposable"; -import { vec3 } from "#/util/geom"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { parseRGBColorSpecification, serializeColor } from "#src/util/color.js"; +import { hsvToRgb, rgbToHsv } from "#src/util/colorspace.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { vec3 } from "#src/util/geom.js"; export class ColorWidget< Color extends vec3 | undefined = vec3, diff --git a/src/widget/coordinate_transform.ts b/src/widget/coordinate_transform.ts index 17b2bad827..91871cbf51 100644 --- a/src/widget/coordinate_transform.ts +++ b/src/widget/coordinate_transform.ts @@ -18,14 +18,17 @@ * @file Coordinate space transform editor widget. */ -import "./coordinate_transform.css"; +import "#src/widget/coordinate_transform.css"; -import svg_updateArrow from "ikonate/icons/arrow-up.svg"; -import svg_plus from "ikonate/icons/plus.svg"; -import { +import svg_updateArrow from "ikonate/icons/arrow-up.svg?raw"; +import svg_plus from "ikonate/icons/plus.svg?raw"; +import type { CoordinateSpace, CoordinateSpaceCombiner, CoordinateSpaceTransform, + WatchableCoordinateSpaceTransform, +} from "#src/coordinate_transform.js"; +import { coordinateSpaceTransformsEquivalent, extendTransformedBoundingBoxUpToRank, getDefaultInputScale, @@ -38,26 +41,25 @@ import { newDimensionId, permuteCoordinateSpace, validateDimensionNames, - WatchableCoordinateSpaceTransform, -} from "#/coordinate_transform"; -import { WatchableValueInterface } from "#/trackable_value"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { arraysEqual } from "#/util/array"; -import { RefCounted } from "#/util/disposable"; -import { removeChildren, removeFromParent } from "#/util/dom"; +} from "#src/coordinate_transform.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import { arraysEqual } from "#src/util/array.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeChildren, removeFromParent } from "#src/util/dom.js"; +import type { ActionEvent } from "#src/util/keyboard_bindings.js"; import { - ActionEvent, KeyboardEventBinder, registerActionListener, -} from "#/util/keyboard_bindings"; +} from "#src/util/keyboard_bindings.js"; import { createIdentity, extendHomogeneousTransform, isIdentity, -} from "#/util/matrix"; -import { EventActionMap, MouseEventBinder } from "#/util/mouse_bindings"; -import { formatScaleWithUnitAsString, parseScale } from "#/util/si_units"; -import { makeIcon } from "#/widget/icon"; +} from "#src/util/matrix.js"; +import { EventActionMap, MouseEventBinder } from "#src/util/mouse_bindings.js"; +import { formatScaleWithUnitAsString, parseScale } from "#src/util/si_units.js"; +import { makeIcon } from "#src/widget/icon.js"; function updateInputFieldWidth( element: HTMLInputElement, diff --git a/src/widget/copy_button.ts b/src/widget/copy_button.ts index 880337503e..a33d797996 100644 --- a/src/widget/copy_button.ts +++ b/src/widget/copy_button.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import svg_copy from "ikonate/icons/copy.svg"; -import { makeIcon, MakeIconOptions } from "#/widget/icon"; +import svg_copy from "ikonate/icons/copy.svg?raw"; +import type { MakeIconOptions } from "#src/widget/icon.js"; +import { makeIcon } from "#src/widget/icon.js"; export function makeCopyButton(options: MakeIconOptions = {}) { return makeIcon({ svg: svg_copy, ...options }); diff --git a/src/widget/delete_button.ts b/src/widget/delete_button.ts index 6199d58bd0..2a5f890e6a 100644 --- a/src/widget/delete_button.ts +++ b/src/widget/delete_button.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import svg_bin from "ikonate/icons/bin.svg"; -import { makeIcon, MakeIconOptions } from "#/widget/icon"; +import svg_bin from "ikonate/icons/bin.svg?raw"; +import type { MakeIconOptions } from "#src/widget/icon.js"; +import { makeIcon } from "#src/widget/icon.js"; export function makeDeleteButton(options: MakeIconOptions = {}) { const icon = makeIcon({ svg: svg_bin, ...options }); diff --git a/src/widget/dependent_view_widget.ts b/src/widget/dependent_view_widget.ts index cc1c04d092..26e15ff62e 100644 --- a/src/widget/dependent_view_widget.ts +++ b/src/widget/dependent_view_widget.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import { WatchableValueInterface } from "#/trackable_value"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { RefCounted } from "#/util/disposable"; -import { removeChildren } from "#/util/dom"; -import { WatchableVisibilityPriority } from "#/visibility_priority/frontend"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeChildren } from "#src/util/dom.js"; +import { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; export class DependentViewContext extends RefCounted { constructor(public redraw: () => void) { diff --git a/src/widget/display_dimensions_widget.ts b/src/widget/display_dimensions_widget.ts index cc59a4239c..9917b494d2 100644 --- a/src/widget/display_dimensions_widget.ts +++ b/src/widget/display_dimensions_widget.ts @@ -14,34 +14,35 @@ * limitations under the License. */ -import "./display_dimensions_widget.css"; +import "#src/widget/display_dimensions_widget.css"; -import debounce from "lodash/debounce"; +import { debounce } from "lodash-es"; import { getDimensionNameValidity, validateDimensionNames, -} from "#/coordinate_transform"; -import { +} from "#src/coordinate_transform.js"; +import type { TrackableDepthRange, TrackableZoomInterface, WatchableDisplayDimensionRenderInfo, -} from "#/navigation_state"; -import { registerNested } from "#/trackable_value"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { arraysEqual } from "#/util/array"; -import { Owned, RefCounted } from "#/util/disposable"; +} from "#src/navigation_state.js"; +import { registerNested } from "#src/trackable_value.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import { arraysEqual } from "#src/util/array.js"; +import type { Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; import { removeChildren, removeFromParent, updateInputFieldWidth, -} from "#/util/dom"; +} from "#src/util/dom.js"; import { KeyboardEventBinder, registerActionListener, -} from "#/util/keyboard_bindings"; -import { EventActionMap, MouseEventBinder } from "#/util/mouse_bindings"; -import { numberToStringFixed } from "#/util/number_to_string"; -import { formatScaleWithUnitAsString, parseScale } from "#/util/si_units"; +} from "#src/util/keyboard_bindings.js"; +import { EventActionMap, MouseEventBinder } from "#src/util/mouse_bindings.js"; +import { numberToStringFixed } from "#src/util/number_to_string.js"; +import { formatScaleWithUnitAsString, parseScale } from "#src/util/si_units.js"; const dimensionColors = ["#f00", "#0f0", "#99f"]; diff --git a/src/widget/enum_widget.ts b/src/widget/enum_widget.ts index 428d20d47f..4118a37334 100644 --- a/src/widget/enum_widget.ts +++ b/src/widget/enum_widget.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { TrackableEnum } from "#/util/trackable_enum"; -import { RefCounted } from "#/util/disposable"; +import { RefCounted } from "#src/util/disposable.js"; +import type { TrackableEnum } from "#src/util/trackable_enum.js"; export class EnumSelectWidget extends RefCounted { element = document.createElement("select"); diff --git a/src/widget/eye_button.ts b/src/widget/eye_button.ts index 43974f400d..9b56efabcc 100644 --- a/src/widget/eye_button.ts +++ b/src/widget/eye_button.ts @@ -14,10 +14,11 @@ * limitations under the License. */ -import "./eye_button.css"; +import "#src/widget/eye_button.css"; -import svg_eye_crossed from "ikonate/icons/eye-crossed.svg"; -import { makeIcon, MakeIconOptions } from "#/widget/icon"; +import svg_eye_crossed from "ikonate/icons/eye-crossed.svg?raw"; +import type { MakeIconOptions } from "#src/widget/icon.js"; +import { makeIcon } from "#src/widget/icon.js"; export function makeEyeButton(options: MakeIconOptions = {}) { const icon = makeIcon({ svg: svg_eye_crossed, ...options }); diff --git a/src/widget/filter_button.ts b/src/widget/filter_button.ts index 59d136f054..dead111288 100644 --- a/src/widget/filter_button.ts +++ b/src/widget/filter_button.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import svg_filter from "ikonate/icons/filter.svg"; -import { makeIcon, MakeIconOptions } from "#/widget/icon"; +import svg_filter from "ikonate/icons/filter.svg?raw"; +import type { MakeIconOptions } from "#src/widget/icon.js"; +import { makeIcon } from "#src/widget/icon.js"; export function makeFilterButton(options: MakeIconOptions = {}) { return makeIcon({ svg: svg_filter, ...options }); diff --git a/src/widget/help_button.ts b/src/widget/help_button.ts index 482c2d0bd3..3e6b2f0a42 100644 --- a/src/widget/help_button.ts +++ b/src/widget/help_button.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { makeIcon, MakeIconOptions } from "#/widget/icon"; +import type { MakeIconOptions } from "#src/widget/icon.js"; +import { makeIcon } from "#src/widget/icon.js"; export function makeHelpButton(options: MakeIconOptions = {}) { return makeIcon({ text: "?", ...options }); diff --git a/src/widget/icon.ts b/src/widget/icon.ts index 89a627e098..fa74b5976a 100644 --- a/src/widget/icon.ts +++ b/src/widget/icon.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import "./icon.css"; +import "#src/widget/icon.css"; export interface MakeIconOptions { text?: string; diff --git a/src/widget/invlerp.ts b/src/widget/invlerp.ts index 7a2a3d0ede..312e4de6a8 100644 --- a/src/widget/invlerp.ts +++ b/src/widget/invlerp.ts @@ -14,63 +14,63 @@ * limitations under the License. */ -import "./invlerp.css"; - -import svg_arrowLeft from "ikonate/icons/arrow-left.svg"; -import svg_arrowRight from "ikonate/icons/arrow-right.svg"; -import { DisplayContext, IndirectRenderedPanel } from "#/display_context"; -import { WatchableValueInterface } from "#/trackable_value"; -import { ToolActivation } from "#/ui/tool"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { DataType } from "#/util/data_type"; -import { Owned, RefCounted } from "#/util/disposable"; -import { removeChildren, updateInputFieldWidth } from "#/util/dom"; +import "#src/widget/invlerp.css"; + +import svg_arrowLeft from "ikonate/icons/arrow-left.svg?raw"; +import svg_arrowRight from "ikonate/icons/arrow-right.svg?raw"; +import type { DisplayContext } from "#src/display_context.js"; +import { IndirectRenderedPanel } from "#src/display_context.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import type { ToolActivation } from "#src/ui/tool.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import type { DataType } from "#src/util/data_type.js"; +import type { Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeChildren, updateInputFieldWidth } from "#src/util/dom.js"; import { EventActionMap, registerActionListener, -} from "#/util/event_action_map"; +} from "#src/util/event_action_map.js"; +import type { DataTypeInterval } from "#src/util/lerp.js"; import { computeInvlerp, computeLerp, dataTypeCompare, - DataTypeInterval, dataTypeIntervalEqual, getClampedInterval, getClosestEndpoint, getIntervalBoundsEffectiveFraction, getIntervalBoundsEffectiveOffset, parseDataTypeValue, -} from "#/util/lerp"; -import { MouseEventBinder } from "#/util/mouse_bindings"; -import { startRelativeMouseDrag } from "#/util/mouse_drag"; -import { Uint64 } from "#/util/uint64"; -import { getWheelZoomAmount } from "#/util/wheel_zoom"; -import { WatchableVisibilityPriority } from "#/visibility_priority/frontend"; -import { getMemoizedBuffer } from "#/webgl/buffer"; -import { - ParameterizedEmitterDependentShaderGetter, - parameterizedEmitterDependentShaderGetter, -} from "#/webgl/dynamic_shader"; -import { HistogramSpecifications } from "#/webgl/empirical_cdf"; +} from "#src/util/lerp.js"; +import { MouseEventBinder } from "#src/util/mouse_bindings.js"; +import { startRelativeMouseDrag } from "#src/util/mouse_drag.js"; +import { Uint64 } from "#src/util/uint64.js"; +import { getWheelZoomAmount } from "#src/util/wheel_zoom.js"; +import type { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; +import { getMemoizedBuffer } from "#src/webgl/buffer.js"; +import type { ParameterizedEmitterDependentShaderGetter } from "#src/webgl/dynamic_shader.js"; +import { parameterizedEmitterDependentShaderGetter } from "#src/webgl/dynamic_shader.js"; +import type { HistogramSpecifications } from "#src/webgl/empirical_cdf.js"; import { defineLerpShaderFunction, enableLerpShaderFunction, -} from "#/webgl/lerp"; +} from "#src/webgl/lerp.js"; import { defineLineShader, drawLines, initializeLineShader, VERTICES_PER_LINE, -} from "#/webgl/lines"; -import { ShaderBuilder } from "#/webgl/shader"; -import { getShaderType } from "#/webgl/shader_lib"; -import { InvlerpParameters } from "#/webgl/shader_ui_controls"; -import { getSquareCornersBuffer } from "#/webgl/square_corners_buffer"; -import { setRawTextureParameters } from "#/webgl/texture"; -import { makeIcon } from "#/widget/icon"; -import { LayerControlTool } from "#/widget/layer_control"; -import { LegendShaderOptions } from "#/widget/shader_controls"; -import { Tab } from "#/widget/tab_view"; +} from "#src/webgl/lines.js"; +import { ShaderBuilder } from "#src/webgl/shader.js"; +import { getShaderType } from "#src/webgl/shader_lib.js"; +import type { InvlerpParameters } from "#src/webgl/shader_ui_controls.js"; +import { getSquareCornersBuffer } from "#src/webgl/square_corners_buffer.js"; +import { setRawTextureParameters } from "#src/webgl/texture.js"; +import { makeIcon } from "#src/widget/icon.js"; +import type { LayerControlTool } from "#src/widget/layer_control.js"; +import type { LegendShaderOptions } from "#src/widget/shader_controls.js"; +import { Tab } from "#src/widget/tab_view.js"; const inputEventMap = EventActionMap.fromObject({ "shift?+mousedown0": { action: "set" }, diff --git a/src/widget/layer_control.ts b/src/widget/layer_control.ts index f505522812..d1c14a06f5 100644 --- a/src/widget/layer_control.ts +++ b/src/widget/layer_control.ts @@ -14,21 +14,21 @@ * limitations under the License. */ -import "./layer_control.css"; +import "#src/widget/layer_control.css"; -import { DisplayContext } from "#/display_context"; -import { UserLayer, UserLayerConstructor } from "#/layer"; -import { WatchableValueInterface } from "#/trackable_value"; +import type { DisplayContext } from "#src/display_context.js"; +import type { UserLayer, UserLayerConstructor } from "#src/layer/index.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import type { ToolActivation } from "#src/ui/tool.js"; import { LayerTool, makeToolActivationStatusMessageWithHeader, registerTool, - ToolActivation, ToolBindingWidget, -} from "#/ui/tool"; -import { RefCounted } from "#/util/disposable"; -import { WatchableVisibilityPriority } from "#/visibility_priority/frontend"; -import { DependentViewWidget } from "#/widget/dependent_view_widget"; +} from "#src/ui/tool.js"; +import type { RefCounted } from "#src/util/disposable.js"; +import { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; +import { DependentViewWidget } from "#src/widget/dependent_view_widget.js"; export interface LayerControlLabelOptions< LayerType extends UserLayer = UserLayer, diff --git a/src/widget/layer_control_channel_invlerp.ts b/src/widget/layer_control_channel_invlerp.ts index badd4e836f..90eac95222 100644 --- a/src/widget/layer_control_channel_invlerp.ts +++ b/src/widget/layer_control_channel_invlerp.ts @@ -14,18 +14,18 @@ * limitations under the License. */ -import { CoordinateSpaceCombiner } from "#/coordinate_transform"; -import { UserLayer } from "#/layer"; -import { Position } from "#/navigation_state"; -import { WatchableValueInterface } from "#/trackable_value"; -import { arraysEqual } from "#/util/array"; -import { DataType } from "#/util/data_type"; -import { HistogramSpecifications } from "#/webgl/empirical_cdf"; -import { ImageInvlerpParameters } from "#/webgl/shader_ui_controls"; -import { activateInvlerpTool, InvlerpWidget } from "#/widget/invlerp"; -import { LayerControlFactory } from "#/widget/layer_control"; -import { PositionWidget } from "#/widget/position_widget"; -import { LegendShaderOptions } from "#/widget/shader_controls"; +import type { CoordinateSpaceCombiner } from "#src/coordinate_transform.js"; +import type { UserLayer } from "#src/layer/index.js"; +import { Position } from "#src/navigation_state.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { arraysEqual } from "#src/util/array.js"; +import type { DataType } from "#src/util/data_type.js"; +import type { HistogramSpecifications } from "#src/webgl/empirical_cdf.js"; +import type { ImageInvlerpParameters } from "#src/webgl/shader_ui_controls.js"; +import { activateInvlerpTool, InvlerpWidget } from "#src/widget/invlerp.js"; +import type { LayerControlFactory } from "#src/widget/layer_control.js"; +import { PositionWidget } from "#src/widget/position_widget.js"; +import type { LegendShaderOptions } from "#src/widget/shader_controls.js"; export function channelInvlerpLayerControl( getter: (layer: LayerType) => { diff --git a/src/widget/layer_control_checkbox.ts b/src/widget/layer_control_checkbox.ts index 638481b0e8..6bd4d5bff2 100644 --- a/src/widget/layer_control_checkbox.ts +++ b/src/widget/layer_control_checkbox.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import { UserLayer } from "#/layer"; -import { TrackableBooleanCheckbox } from "#/trackable_boolean"; -import { WatchableValueInterface } from "#/trackable_value"; -import { LayerControlFactory } from "#/widget/layer_control"; +import type { UserLayer } from "#src/layer/index.js"; +import { TrackableBooleanCheckbox } from "#src/trackable_boolean.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import type { LayerControlFactory } from "#src/widget/layer_control.js"; export function checkboxLayerControl( getter: (layer: LayerType) => WatchableValueInterface, diff --git a/src/widget/layer_control_color.ts b/src/widget/layer_control_color.ts index cac17f0682..ad992e3298 100644 --- a/src/widget/layer_control_color.ts +++ b/src/widget/layer_control_color.ts @@ -14,12 +14,13 @@ * limitations under the License. */ -import { UserLayer } from "#/layer"; -import { WatchableValueInterface } from "#/trackable_value"; -import { ActionEvent, EventActionMap } from "#/util/event_action_map"; -import { vec3 } from "#/util/geom"; -import { ColorWidget } from "#/widget/color"; -import { LayerControlFactory } from "#/widget/layer_control"; +import type { UserLayer } from "#src/layer/index.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import type { ActionEvent } from "#src/util/event_action_map.js"; +import { EventActionMap } from "#src/util/event_action_map.js"; +import type { vec3 } from "#src/util/geom.js"; +import { ColorWidget } from "#src/widget/color.js"; +import type { LayerControlFactory } from "#src/widget/layer_control.js"; const TOOL_INPUT_EVENT_MAP = EventActionMap.fromObject({ "at:shift+wheel": { action: "adjust-hue-via-wheel" }, diff --git a/src/widget/layer_control_enum.ts b/src/widget/layer_control_enum.ts index 39a3aa92ad..ce2cb35af6 100644 --- a/src/widget/layer_control_enum.ts +++ b/src/widget/layer_control_enum.ts @@ -14,11 +14,12 @@ * limitations under the License. */ -import { UserLayer } from "#/layer"; -import { ActionEvent, EventActionMap } from "#/util/event_action_map"; -import { TrackableEnum } from "#/util/trackable_enum"; -import { EnumSelectWidget } from "#/widget/enum_widget"; -import { LayerControlFactory } from "#/widget/layer_control"; +import type { UserLayer } from "#src/layer/index.js"; +import type { ActionEvent } from "#src/util/event_action_map.js"; +import { EventActionMap } from "#src/util/event_action_map.js"; +import type { TrackableEnum } from "#src/util/trackable_enum.js"; +import { EnumSelectWidget } from "#src/widget/enum_widget.js"; +import type { LayerControlFactory } from "#src/widget/layer_control.js"; const TOOL_INPUT_EVENT_MAP = EventActionMap.fromObject({ "at:shift+wheel": { action: "adjust-via-wheel" }, diff --git a/src/widget/layer_control_property_invlerp.ts b/src/widget/layer_control_property_invlerp.ts index 7c7276993c..463ba0dbd8 100644 --- a/src/widget/layer_control_property_invlerp.ts +++ b/src/widget/layer_control_property_invlerp.ts @@ -14,29 +14,27 @@ * limitations under the License. */ -import { UserLayer } from "#/layer"; -import { - makeCachedDerivedWatchableValue, - WatchableValueInterface, -} from "#/trackable_value"; -import { DataType } from "#/util/data_type"; +import type { UserLayer } from "#src/layer/index.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { makeCachedDerivedWatchableValue } from "#src/trackable_value.js"; +import { DataType } from "#src/util/data_type.js"; import { convertDataTypeInterval, defaultDataTypeRange, normalizeDataTypeInterval, -} from "#/util/lerp"; -import { HistogramSpecifications } from "#/webgl/empirical_cdf"; -import { +} from "#src/util/lerp.js"; +import type { HistogramSpecifications } from "#src/webgl/empirical_cdf.js"; +import type { InvlerpParameters, PropertiesSpecification, PropertyInvlerpParameters, -} from "#/webgl/shader_ui_controls"; +} from "#src/webgl/shader_ui_controls.js"; import { activateInvlerpTool, VariableDataTypeInvlerpWidget, -} from "#/widget/invlerp"; -import { LayerControlFactory } from "#/widget/layer_control"; -import { LegendShaderOptions } from "#/widget/shader_controls"; +} from "#src/widget/invlerp.js"; +import type { LayerControlFactory } from "#src/widget/layer_control.js"; +import type { LegendShaderOptions } from "#src/widget/shader_controls.js"; export function propertyInvlerpLayerControl( getter: (layer: LayerType) => { diff --git a/src/widget/layer_control_range.ts b/src/widget/layer_control_range.ts index 5c32800746..af3e12b3a8 100644 --- a/src/widget/layer_control_range.ts +++ b/src/widget/layer_control_range.ts @@ -14,11 +14,13 @@ * limitations under the License. */ -import { UserLayer } from "#/layer"; -import { WatchableValueInterface } from "#/trackable_value"; -import { ActionEvent, EventActionMap } from "#/util/event_action_map"; -import { LayerControlFactory } from "#/widget/layer_control"; -import { RangeWidget, RangeWidgetOptions } from "#/widget/range"; +import type { UserLayer } from "#src/layer/index.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import type { ActionEvent } from "#src/util/event_action_map.js"; +import { EventActionMap } from "#src/util/event_action_map.js"; +import type { LayerControlFactory } from "#src/widget/layer_control.js"; +import type { RangeWidgetOptions } from "#src/widget/range.js"; +import { RangeWidget } from "#src/widget/range.js"; const TOOL_INPUT_EVENT_MAP = EventActionMap.fromObject({ "at:shift+wheel": { action: "adjust-via-wheel" }, diff --git a/src/widget/layer_reference.ts b/src/widget/layer_reference.ts index a5e45ea3aa..2b0a5f4301 100644 --- a/src/widget/layer_reference.ts +++ b/src/widget/layer_reference.ts @@ -14,10 +14,11 @@ * limitations under the License. */ -import debounce from "lodash/debounce"; -import { LayerReference } from "#/layer"; -import { Owned, RefCounted } from "#/util/disposable"; -import { removeChildren } from "#/util/dom"; +import { debounce } from "lodash-es"; +import type { LayerReference } from "#src/layer/index.js"; +import type { Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeChildren } from "#src/util/dom.js"; export class LayerReferenceWidget extends RefCounted { element = document.createElement("label"); diff --git a/src/widget/linked_layer.ts b/src/widget/linked_layer.ts index 95f236e8dd..f13b03a4a9 100644 --- a/src/widget/linked_layer.ts +++ b/src/widget/linked_layer.ts @@ -14,13 +14,14 @@ * limitations under the License. */ -import "./linked_layer.css"; +import "#src/widget/linked_layer.css"; -import debounce from "lodash/debounce"; -import { LinkedLayerGroup } from "#/layer"; -import { Borrowed, RefCounted } from "#/util/disposable"; -import { removeChildren } from "#/util/dom"; -import { makeCloseButton } from "#/widget/close_button"; +import { debounce } from "lodash-es"; +import type { LinkedLayerGroup } from "#src/layer/index.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeChildren } from "#src/util/dom.js"; +import { makeCloseButton } from "#src/widget/close_button.js"; export class LinkedLayerGroupWidget extends RefCounted { element = document.createElement("div"); diff --git a/src/widget/maximize_button.ts b/src/widget/maximize_button.ts index 7edd62cbad..3407efe1f4 100644 --- a/src/widget/maximize_button.ts +++ b/src/widget/maximize_button.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import svg_maximize from "ikonate/icons/maximise.svg"; -import { makeIcon, MakeIconOptions } from "#/widget/icon"; +import svg_maximize from "ikonate/icons/maximise.svg?raw"; +import type { MakeIconOptions } from "#src/widget/icon.js"; +import { makeIcon } from "#src/widget/icon.js"; export function makeMaximizeButton(options: MakeIconOptions = {}) { return makeIcon({ svg: svg_maximize, ...options }); diff --git a/src/widget/move_to_button.ts b/src/widget/move_to_button.ts index 318069a581..2f79ec30c5 100644 --- a/src/widget/move_to_button.ts +++ b/src/widget/move_to_button.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { makeIcon, MakeIconOptions } from "#/widget/icon"; +import type { MakeIconOptions } from "#src/widget/icon.js"; +import { makeIcon } from "#src/widget/icon.js"; export function makeMoveToButton(options: MakeIconOptions = {}) { return makeIcon({ text: "↗", ...options }); diff --git a/src/widget/multiline_autocomplete.ts b/src/widget/multiline_autocomplete.ts index 190684f176..4a3f8c5a60 100644 --- a/src/widget/multiline_autocomplete.ts +++ b/src/widget/multiline_autocomplete.ts @@ -14,31 +14,32 @@ * limitations under the License. */ -import "./multiline_autocomplete.css"; +import "#src/widget/multiline_autocomplete.css"; -import debounce from "lodash/debounce"; -import { - CancellationToken, - CancellationTokenSource, -} from "#/util/cancellation"; -import { +import { debounce } from "lodash-es"; +import type { CancellationToken } from "#src/util/cancellation.js"; +import { CancellationTokenSource } from "#src/util/cancellation.js"; +import type { BasicCompletionResult, Completion, CompletionWithDescription, -} from "#/util/completion"; -import { RefCounted } from "#/util/disposable"; -import { removeChildren, removeFromParent } from "#/util/dom"; -import { positionDropdown } from "#/util/dropdown"; +} from "#src/util/completion.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeChildren, removeFromParent } from "#src/util/dom.js"; +import { positionDropdown } from "#src/util/dropdown.js"; import { EventActionMap, KeyboardEventBinder, registerActionListener, -} from "#/util/keyboard_bindings"; -import { longestCommonPrefix } from "#/util/longest_common_prefix"; -import { Signal } from "#/util/signal"; -import { VirtualList } from "#/widget/virtual_list"; +} from "#src/util/keyboard_bindings.js"; +import { longestCommonPrefix } from "#src/util/longest_common_prefix.js"; +import { Signal } from "#src/util/signal.js"; +import { VirtualList } from "#src/widget/virtual_list.js"; -export type { Completion, CompletionWithDescription } from "#/util/completion"; +export type { + Completion, + CompletionWithDescription, +} from "#src/util/completion.js"; const ACTIVE_COMPLETION_CLASS_NAME = "neuroglancer-multiline-autocomplete-completion-active"; diff --git a/src/widget/number_input_widget.ts b/src/widget/number_input_widget.ts index d6f7bfc6c7..40d170521e 100644 --- a/src/widget/number_input_widget.ts +++ b/src/widget/number_input_widget.ts @@ -14,9 +14,10 @@ * limitations under the License. */ -import { TrackableValue, WatchableValue } from "#/trackable_value"; -import { RefCounted } from "#/util/disposable"; -import { removeFromParent } from "#/util/dom"; +import type { WatchableValue } from "#src/trackable_value.js"; +import { TrackableValue } from "#src/trackable_value.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeFromParent } from "#src/util/dom.js"; export class NumberInputWidget extends RefCounted { element = document.createElement("label"); diff --git a/src/widget/position_plot.ts b/src/widget/position_plot.ts index 717356a3bd..0138de285f 100644 --- a/src/widget/position_plot.ts +++ b/src/widget/position_plot.ts @@ -14,20 +14,22 @@ * limitations under the License. */ -import "./position_plot.css"; +import "#src/widget/position_plot.css"; -import { - computeCombinedLowerUpperBound, +import type { CoordinateSpace, DimensionId, +} from "#src/coordinate_transform.js"; +import { + computeCombinedLowerUpperBound, getDisplayLowerUpperBounds, -} from "#/coordinate_transform"; -import { Position } from "#/navigation_state"; -import { WatchableValue } from "#/trackable_value"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { filterArrayInplace } from "#/util/array"; -import { RefCounted } from "#/util/disposable"; -import { startRelativeMouseDrag } from "#/util/mouse_drag"; +} from "#src/coordinate_transform.js"; +import type { Position } from "#src/navigation_state.js"; +import { WatchableValue } from "#src/trackable_value.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import { filterArrayInplace } from "#src/util/array.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { startRelativeMouseDrag } from "#src/util/mouse_drag.js"; interface NormalizedDimensionBounds { lowerBound: number; diff --git a/src/widget/position_widget.ts b/src/widget/position_widget.ts index 140d790b04..7dfb1eb6db 100644 --- a/src/widget/position_widget.ts +++ b/src/widget/position_widget.ts @@ -14,70 +14,72 @@ * limitations under the License. */ -import "./position_widget.css"; +import "#src/widget/position_widget.css"; -import svg_pause from "ikonate/icons/pause.svg"; -import svg_play from "ikonate/icons/play.svg"; -import svg_video from "ikonate/icons/video.svg"; -import { - clampAndRoundCoordinateToVoxelCenter, +import svg_pause from "ikonate/icons/pause.svg?raw"; +import svg_play from "ikonate/icons/play.svg?raw"; +import svg_video from "ikonate/icons/video.svg?raw"; +import type { CoordinateArray, CoordinateSpace, CoordinateSpaceCombiner, DimensionId, +} from "#src/coordinate_transform.js"; +import { + clampAndRoundCoordinateToVoxelCenter, emptyInvalidCoordinateSpace, insertDimensionAt, makeCoordinateSpace, -} from "#/coordinate_transform"; -import { MouseSelectionState, UserLayer } from "#/layer"; -import { LayerGroupViewer } from "#/layer_group_viewer"; -import { +} from "#src/coordinate_transform.js"; +import type { MouseSelectionState, UserLayer } from "#src/layer/index.js"; +import type { LayerGroupViewer } from "#src/layer_group_viewer.js"; +import type { CoordinateSpacePlaybackVelocity, Position, - VelocityBoundaryBehavior, -} from "#/navigation_state"; -import { StatusMessage } from "#/status"; +} from "#src/navigation_state.js"; +import { VelocityBoundaryBehavior } from "#src/navigation_state.js"; +import { StatusMessage } from "#src/status.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; import { makeCachedDerivedWatchableValue, WatchableValue, - WatchableValueInterface, -} from "#/trackable_value"; +} from "#src/trackable_value.js"; +import type { LocalToolBinder, ToolActivation } from "#src/ui/tool.js"; import { - LocalToolBinder, makeToolActivationStatusMessage, makeToolButton, registerTool, Tool, - ToolActivation, -} from "#/ui/tool"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { arraysEqual, binarySearch } from "#/util/array"; -import { setClipboard } from "#/util/clipboard"; -import { Borrowed, RefCounted } from "#/util/disposable"; +} from "#src/ui/tool.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import { arraysEqual, binarySearch } from "#src/util/array.js"; +import { setClipboard } from "#src/util/clipboard.js"; +import type { Borrowed } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; import { removeFromParent, updateChildren, updateInputFieldWidth, -} from "#/util/dom"; -import { vec3 } from "#/util/geom"; -import { verifyObjectProperty, verifyString } from "#/util/json"; +} from "#src/util/dom.js"; +import { vec3 } from "#src/util/geom.js"; +import { verifyObjectProperty, verifyString } from "#src/util/json.js"; +import type { ActionEvent } from "#src/util/keyboard_bindings.js"; import { - ActionEvent, KeyboardEventBinder, registerActionListener, -} from "#/util/keyboard_bindings"; -import { EventActionMap, MouseEventBinder } from "#/util/mouse_bindings"; -import { formatScaleWithUnit, parseScale } from "#/util/si_units"; -import { TrackableEnum } from "#/util/trackable_enum"; -import { getWheelZoomAmount } from "#/util/wheel_zoom"; -import { Viewer } from "#/viewer"; -import { CheckboxIcon } from "#/widget/checkbox_icon"; -import { makeCopyButton } from "#/widget/copy_button"; -import { DependentViewWidget } from "#/widget/dependent_view_widget"; -import { EnumSelectWidget } from "#/widget/enum_widget"; -import { makeIcon } from "#/widget/icon"; -import { NumberInputWidget } from "#/widget/number_input_widget"; -import { PositionPlot } from "#/widget/position_plot"; +} from "#src/util/keyboard_bindings.js"; +import { EventActionMap, MouseEventBinder } from "#src/util/mouse_bindings.js"; +import { formatScaleWithUnit, parseScale } from "#src/util/si_units.js"; +import { TrackableEnum } from "#src/util/trackable_enum.js"; +import { getWheelZoomAmount } from "#src/util/wheel_zoom.js"; +import type { Viewer } from "#src/viewer.js"; +import { CheckboxIcon } from "#src/widget/checkbox_icon.js"; +import { makeCopyButton } from "#src/widget/copy_button.js"; +import { DependentViewWidget } from "#src/widget/dependent_view_widget.js"; +import { EnumSelectWidget } from "#src/widget/enum_widget.js"; +import { makeIcon } from "#src/widget/icon.js"; +import { NumberInputWidget } from "#src/widget/number_input_widget.js"; +import { PositionPlot } from "#src/widget/position_plot.js"; export const positionDragType = "neuroglancer-position"; @@ -640,7 +642,7 @@ export class PositionWidget extends RefCounted { if (selectionStart !== 0 || selectionEnd !== value.length) { if (selectionStart == null) selectionStart = 0; if (selectionEnd == null) selectionEnd = 0; - const invalidMatch = text.match(/[^\-0-9\.]/); + const invalidMatch = text.match(/[^\-0-9.]/); if (invalidMatch !== null) { text = text.substring(0, invalidMatch.index); } @@ -661,7 +663,7 @@ export class PositionWidget extends RefCounted { if (selectionStart === null) selectionStart = 0; if (selectionEnd === null) selectionEnd = selectionStart; let newValue = ""; - const invalidPattern = /[^\-0-9\.]/g; + const invalidPattern = /[^\-0-9.]/g; newValue += value .substring(0, selectionStart) .replace(invalidPattern, ""); @@ -1301,7 +1303,7 @@ export class MousePositionWidget extends RefCounted { const DIMENSION_TOOL_ID = "dimension"; -interface SupportsDimensionTool { +interface SupportsDimensionTool { position: Position; velocity: CoordinateSpacePlaybackVelocity; coordinateSpaceCombiner: CoordinateSpaceCombiner; @@ -1315,7 +1317,7 @@ const TOOL_INPUT_EVENT_MAP = EventActionMap.fromObject({ "at:shift?+alt?+mousedown0": { action: "toggle-playback" }, }); -class DimensionTool extends Tool { +class DimensionTool extends Tool { get position() { return this.viewer.position; } @@ -1533,40 +1535,50 @@ function makeDimensionTool(viewer: SupportsDimensionTool, obj: unknown) { return new DimensionTool(viewer, coordinateSpace.ids[dimensionIndex]); } -registerTool(Viewer, DIMENSION_TOOL_ID, (viewer, obj) => - makeDimensionTool( - { - position: viewer.position, - velocity: viewer.velocity, - coordinateSpaceCombiner: - viewer.layerSpecification.coordinateSpaceCombiner, - toolBinder: viewer.toolBinder, - }, - obj, - ), -); - -registerTool(UserLayer, DIMENSION_TOOL_ID, (layer, obj) => - makeDimensionTool( - { - position: layer.localPosition, - velocity: layer.localVelocity, - coordinateSpaceCombiner: layer.localCoordinateSpaceCombiner, - toolBinder: layer.toolBinder, - }, - obj, - ), -); - -registerTool(LayerGroupViewer, DIMENSION_TOOL_ID, (layerGroupViewer, obj) => - makeDimensionTool( - { - position: layerGroupViewer.viewerNavigationState.position.value, - velocity: layerGroupViewer.viewerNavigationState.velocity.velocity, - coordinateSpaceCombiner: - layerGroupViewer.layerSpecification.root.coordinateSpaceCombiner, - toolBinder: layerGroupViewer.toolBinder, - }, - obj, - ), -); +export function registerDimensionToolForViewer(contextType: typeof Viewer) { + registerTool(contextType, DIMENSION_TOOL_ID, (viewer, obj) => + makeDimensionTool( + { + position: viewer.position, + velocity: viewer.velocity, + coordinateSpaceCombiner: + viewer.layerSpecification.coordinateSpaceCombiner, + toolBinder: viewer.toolBinder, + }, + obj, + ), + ); +} + +export function registerDimensionToolForUserLayer( + contextType: typeof UserLayer, +) { + registerTool(contextType, DIMENSION_TOOL_ID, (layer, obj) => + makeDimensionTool( + { + position: layer.localPosition, + velocity: layer.localVelocity, + coordinateSpaceCombiner: layer.localCoordinateSpaceCombiner, + toolBinder: layer.toolBinder, + }, + obj, + ), + ); +} + +export function registerDimensionToolForLayerGroupViewer( + contextType: typeof LayerGroupViewer, +) { + registerTool(contextType, DIMENSION_TOOL_ID, (layerGroupViewer, obj) => + makeDimensionTool( + { + position: layerGroupViewer.viewerNavigationState.position.value, + velocity: layerGroupViewer.viewerNavigationState.velocity.velocity, + coordinateSpaceCombiner: + layerGroupViewer.layerSpecification.root.coordinateSpaceCombiner, + toolBinder: layerGroupViewer.toolBinder, + }, + obj, + ), + ); +} diff --git a/src/widget/range.ts b/src/widget/range.ts index d3fd69a9f8..7558abc3e4 100644 --- a/src/widget/range.ts +++ b/src/widget/range.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import "./range.css"; +import "#src/widget/range.css"; -import { WatchableValueInterface } from "#/trackable_value"; -import { RefCounted } from "#/util/disposable"; -import { removeFromParent } from "#/util/dom"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeFromParent } from "#src/util/dom.js"; export interface RangeWidgetOptions { min?: number; diff --git a/src/widget/render_scale_widget.ts b/src/widget/render_scale_widget.ts index 56b1038050..694236fb49 100644 --- a/src/widget/render_scale_widget.ts +++ b/src/widget/render_scale_widget.ts @@ -14,34 +14,34 @@ * limitations under the License. */ -import "#/widget/render_scale_widget.css"; +import "#src/widget/render_scale_widget.css"; -import debounce from "lodash/debounce"; -import throttle from "lodash/throttle"; -import { UserLayer } from "#/layer"; +import { debounce, throttle } from "lodash-es"; +import type { UserLayer } from "#src/layer/index.js"; +import type { RenderScaleHistogram } from "#src/render_scale_statistics.js"; import { getRenderScaleFromHistogramOffset, getRenderScaleHistogramOffset, numRenderScaleHistogramBins, - RenderScaleHistogram, renderScaleHistogramBinSize, renderScaleHistogramOrigin, -} from "#/render_scale_statistics"; -import { TrackableValueInterface, WatchableValue } from "#/trackable_value"; -import { serializeColor } from "#/util/color"; -import { hsvToRgb } from "#/util/colorspace"; -import { RefCounted } from "#/util/disposable"; +} from "#src/render_scale_statistics.js"; +import type { TrackableValueInterface } from "#src/trackable_value.js"; +import { WatchableValue } from "#src/trackable_value.js"; +import { serializeColor } from "#src/util/color.js"; +import { hsvToRgb } from "#src/util/colorspace.js"; +import { RefCounted } from "#src/util/disposable.js"; +import type { ActionEvent } from "#src/util/event_action_map.js"; import { - ActionEvent, EventActionMap, registerActionListener, -} from "#/util/event_action_map"; -import { vec3 } from "#/util/geom"; -import { MouseEventBinder } from "#/util/mouse_bindings"; -import { numberToStringFixed } from "#/util/number_to_string"; -import { formatScaleWithUnitAsString } from "#/util/si_units"; -import { LayerControlFactory } from "#/widget/layer_control"; -import { clampToInterval } from "#/util/lerp"; +} from "#src/util/event_action_map.js"; +import { vec3 } from "#src/util/geom.js"; +import { clampToInterval } from "#src/util/lerp.js"; +import { MouseEventBinder } from "#src/util/mouse_bindings.js"; +import { numberToStringFixed } from "#src/util/number_to_string.js"; +import { formatScaleWithUnitAsString } from "#src/util/si_units.js"; +import type { LayerControlFactory } from "#src/widget/layer_control.js"; const updateInterval = 200; diff --git a/src/widget/scale_bar.ts b/src/widget/scale_bar.ts index 6a9baa7b2f..4d6c8198e7 100644 --- a/src/widget/scale_bar.ts +++ b/src/widget/scale_bar.ts @@ -29,18 +29,22 @@ * understand. */ -import { RenderViewport } from "#/display_context"; -import { +import type { RenderViewport } from "#src/display_context.js"; +import type { DisplayDimensionRenderInfo, RelativeDisplayScales, -} from "#/navigation_state"; -import { TrackableValue } from "#/trackable_value"; -import { RefCounted } from "#/util/disposable"; -import { verifyFloat, verifyObjectProperty, verifyString } from "#/util/json"; -import { pickSiPrefix } from "#/util/si_units"; -import { GL } from "#/webgl/context"; -import { OffscreenCopyHelper } from "#/webgl/offscreen"; -import { setTextureFromCanvas } from "#/webgl/texture"; +} from "#src/navigation_state.js"; +import { TrackableValue } from "#src/trackable_value.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { + verifyFloat, + verifyObjectProperty, + verifyString, +} from "#src/util/json.js"; +import { pickSiPrefix } from "#src/util/si_units.js"; +import type { GL } from "#src/webgl/context.js"; +import { OffscreenCopyHelper } from "#src/webgl/offscreen.js"; +import { setTextureFromCanvas } from "#src/webgl/texture.js"; /** * Default set of allowed significand values. 1 is implicitly part of the set. diff --git a/src/widget/segmentation_color_mode.ts b/src/widget/segmentation_color_mode.ts index 554172e24e..b2d9cbe566 100644 --- a/src/widget/segmentation_color_mode.ts +++ b/src/widget/segmentation_color_mode.ts @@ -14,17 +14,17 @@ * limitations under the License. */ -import "./segmentation_color_mode.css"; +import "#src/widget/segmentation_color_mode.css"; -import svg_rotate from "ikonate/icons/rotate.svg"; -import { SegmentationUserLayer } from "#/segmentation_user_layer"; -import { observeWatchable } from "#/trackable_value"; -import { vec3 } from "#/util/geom"; -import { ColorWidget } from "#/widget/color"; -import { makeIcon } from "#/widget/icon"; -import { LayerControlFactory } from "#/widget/layer_control"; -import { colorLayerControl } from "#/widget/layer_control_color"; -import { TextInputWidget } from "#/widget/text_input"; +import svg_rotate from "ikonate/icons/rotate.svg?raw"; +import type { SegmentationUserLayer } from "#src/layer/segmentation/index.js"; +import { observeWatchable } from "#src/trackable_value.js"; +import { vec3 } from "#src/util/geom.js"; +import type { ColorWidget } from "#src/widget/color.js"; +import { makeIcon } from "#src/widget/icon.js"; +import type { LayerControlFactory } from "#src/widget/layer_control.js"; +import { colorLayerControl } from "#src/widget/layer_control_color.js"; +import { TextInputWidget } from "#src/widget/text_input.js"; function chooseColorMode(layer: SegmentationUserLayer, useFixedColor: boolean) { if (!useFixedColor) { diff --git a/src/widget/shader_code_widget.ts b/src/widget/shader_code_widget.ts index e6c36acff7..c86fae81cf 100644 --- a/src/widget/shader_code_widget.ts +++ b/src/widget/shader_code_widget.ts @@ -15,22 +15,25 @@ */ import "codemirror/addon/lint/lint.js"; -import "./shader_code_widget.css"; +import "#src/widget/shader_code_widget.css"; import "codemirror/lib/codemirror.css"; import "codemirror/addon/lint/lint.css"; import CodeMirror from "codemirror"; -import glslCodeMirror from "glsl-editor/glsl"; -import debounce from "lodash/debounce"; -import { WatchableValue } from "#/trackable_value"; -import { RefCounted } from "#/util/disposable"; -import { removeFromParent } from "#/util/dom"; -import { WatchableShaderError } from "#/webgl/dynamic_shader"; -import { ShaderCompilationError, ShaderLinkError } from "#/webgl/shader"; -import { +import glslCodeMirror from "glsl-editor/glsl.js"; +import { debounce } from "lodash-es"; +import type { WatchableValue } from "#src/trackable_value.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeFromParent } from "#src/util/dom.js"; +import type { WatchableShaderError } from "#src/webgl/dynamic_shader.js"; +import type { + ShaderCompilationError, + ShaderLinkError, +} from "#src/webgl/shader.js"; +import type { ShaderControlParseError, ShaderControlState, -} from "#/webgl/shader_ui_controls"; +} from "#src/webgl/shader_ui_controls.js"; // Install glsl support in CodeMirror. glslCodeMirror(CodeMirror); diff --git a/src/widget/shader_controls.ts b/src/widget/shader_controls.ts index 4602555383..3f18f8300e 100644 --- a/src/widget/shader_controls.ts +++ b/src/widget/shader_controls.ts @@ -14,32 +14,35 @@ * limitations under the License. */ -import debounce from "lodash/debounce"; -import { DisplayContext } from "#/display_context"; -import { UserLayer, UserLayerConstructor } from "#/layer"; -import { registerTool, ToolActivation } from "#/ui/tool"; -import { RefCounted } from "#/util/disposable"; -import { removeChildren } from "#/util/dom"; -import { verifyObjectProperty, verifyString } from "#/util/json"; -import { AnyConstructor } from "#/util/mixin"; -import { WatchableVisibilityPriority } from "#/visibility_priority/frontend"; -import { +import { debounce } from "lodash-es"; +import type { DisplayContext } from "#src/display_context.js"; +import type { UserLayer, UserLayerConstructor } from "#src/layer/index.js"; +import type { ToolActivation } from "#src/ui/tool.js"; +import { registerTool } from "#src/ui/tool.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeChildren } from "#src/util/dom.js"; +import { verifyObjectProperty, verifyString } from "#src/util/json.js"; +import type { AnyConstructor } from "#src/util/mixin.js"; +import type { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; +import type { ParameterizedEmitterDependentShaderOptions, ParameterizedShaderGetterResult, -} from "#/webgl/dynamic_shader"; -import { ShaderControlState } from "#/webgl/shader_ui_controls"; -import { - addLayerControlToOptionsTab, +} from "#src/webgl/dynamic_shader.js"; +import type { ShaderControlState } from "#src/webgl/shader_ui_controls.js"; +import type { LayerControlDefinition, LayerControlFactory, +} from "#src/widget/layer_control.js"; +import { + addLayerControlToOptionsTab, LayerControlTool, -} from "#/widget/layer_control"; -import { channelInvlerpLayerControl } from "#/widget/layer_control_channel_invlerp"; -import { checkboxLayerControl } from "#/widget/layer_control_checkbox"; -import { colorLayerControl } from "#/widget/layer_control_color"; -import { propertyInvlerpLayerControl } from "#/widget/layer_control_property_invlerp"; -import { rangeLayerControl } from "#/widget/layer_control_range"; -import { Tab } from "#/widget/tab_view"; +} from "#src/widget/layer_control.js"; +import { channelInvlerpLayerControl } from "#src/widget/layer_control_channel_invlerp.js"; +import { checkboxLayerControl } from "#src/widget/layer_control_checkbox.js"; +import { colorLayerControl } from "#src/widget/layer_control_color.js"; +import { propertyInvlerpLayerControl } from "#src/widget/layer_control_property_invlerp.js"; +import { rangeLayerControl } from "#src/widget/layer_control_range.js"; +import { Tab } from "#src/widget/tab_view.js"; export interface LegendShaderOptions extends ParameterizedEmitterDependentShaderOptions { diff --git a/src/widget/star_button.ts b/src/widget/star_button.ts index fe60bd925e..0a1437a792 100644 --- a/src/widget/star_button.ts +++ b/src/widget/star_button.ts @@ -14,10 +14,11 @@ * limitations under the License. */ -import "./star_button.css"; +import "#src/widget/star_button.css"; -import svg_star from "ikonate/icons/star.svg"; -import { makeIcon, MakeIconOptions } from "#/widget/icon"; +import svg_star from "ikonate/icons/star.svg?raw"; +import type { MakeIconOptions } from "#src/widget/icon.js"; +import { makeIcon } from "#src/widget/icon.js"; export function makeStarButton(options: MakeIconOptions = {}) { const icon = makeIcon({ svg: svg_star, ...options }); diff --git a/src/widget/tab_view.ts b/src/widget/tab_view.ts index 0326f93c11..32e783f3b4 100644 --- a/src/widget/tab_view.ts +++ b/src/widget/tab_view.ts @@ -18,18 +18,19 @@ * @file Tabbed view widget. */ -import "#/widget/tab_view.css"; +import "#src/widget/tab_view.css"; -import { +import type { WatchableValueChangeInterface, WatchableValueInterface, -} from "#/trackable_value"; -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { Owned, RefCounted } from "#/util/disposable"; -import { removeChildren, removeFromParent } from "#/util/dom"; -import { NullarySignal, Signal } from "#/util/signal"; -import { Trackable } from "#/util/trackable"; -import { WatchableVisibilityPriority } from "#/visibility_priority/frontend"; +} from "#src/trackable_value.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import type { Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeChildren, removeFromParent } from "#src/util/dom.js"; +import { NullarySignal, Signal } from "#src/util/signal.js"; +import type { Trackable } from "#src/util/trackable.js"; +import { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; export class Tab extends RefCounted { element = document.createElement("div"); @@ -146,6 +147,7 @@ export class OptionSpecification extends RefCounted implements Trackable { if (value !== this.ready_) { this.ready_ = value; if (value) { + // eslint-disable-next-line no-self-assign this.value = this.value; } this.changed.dispatch(); diff --git a/src/widget/text_icon_button.ts b/src/widget/text_icon_button.ts index b7cd63ce57..0a40bc0e1d 100644 --- a/src/widget/text_icon_button.ts +++ b/src/widget/text_icon_button.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import "./text_icon_button.css"; +import "#src/widget/text_icon_button.css"; export function makeTextIconButton(iconText: string, title?: string) { const element = document.createElement("div"); diff --git a/src/widget/text_input.ts b/src/widget/text_input.ts index 79ea3ec1e2..322bc485d2 100644 --- a/src/widget/text_input.ts +++ b/src/widget/text_input.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { TrackableValueInterface } from "#/trackable_value"; -import { RefCounted } from "#/util/disposable"; -import { removeFromParent } from "#/util/dom"; +import type { TrackableValueInterface } from "#src/trackable_value.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeFromParent } from "#src/util/dom.js"; export class TextInputWidget extends RefCounted { element = document.createElement("input"); @@ -40,7 +40,9 @@ export class TextInputWidget extends RefCounted { private updateModel() { try { this.model.restoreState(this.element.value); - } catch {} + } catch { + // Ignore invalid input. + } this.updateView(); } } diff --git a/src/widget/tooltip.ts b/src/widget/tooltip.ts index 15084f2404..430bf93b02 100644 --- a/src/widget/tooltip.ts +++ b/src/widget/tooltip.ts @@ -18,10 +18,10 @@ * @file Facilities for creating tooltips. */ -import "./tooltip.css"; +import "#src/widget/tooltip.css"; -import { RefCounted } from "#/util/disposable"; -import { removeFromParent } from "#/util/dom"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeFromParent } from "#src/util/dom.js"; export class Tooltip extends RefCounted { element = document.createElement("div"); diff --git a/src/widget/vec3_entry_widget.ts b/src/widget/vec3_entry_widget.ts index 20e9a4b552..0d8cce9cb5 100644 --- a/src/widget/vec3_entry_widget.ts +++ b/src/widget/vec3_entry_widget.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import { TrackableVec3 } from "#/trackable_vec3"; -import { RefCounted } from "#/util/disposable"; -import { vec3 } from "#/util/geom"; -import { verifyFiniteFloat } from "#/util/json"; -import { Signal } from "#/util/signal"; +import type { TrackableVec3 } from "#src/trackable_vec3.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { vec3 } from "#src/util/geom.js"; +import { verifyFiniteFloat } from "#src/util/json.js"; +import { Signal } from "#src/util/signal.js"; -import "./vec3.css"; +import "#src/widget/vec3.css"; export class Vec3Widget extends RefCounted { promptElement = document.createElement("span"); diff --git a/src/widget/virtual_list.ts b/src/widget/virtual_list.ts index 3db02367fa..b83d3d88c2 100644 --- a/src/widget/virtual_list.ts +++ b/src/widget/virtual_list.ts @@ -14,11 +14,12 @@ * limitations under the License. */ -import { animationFrameDebounce } from "#/util/animation_frame_debounce"; -import { ArraySpliceOp, spliceArray } from "#/util/array"; -import { RefCounted } from "#/util/disposable"; -import { removeFromParent, updateChildren } from "#/util/dom"; -import { Signal } from "#/util/signal"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import type { ArraySpliceOp } from "#src/util/array.js"; +import { spliceArray } from "#src/util/array.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { removeFromParent, updateChildren } from "#src/util/dom.js"; +import type { Signal } from "#src/util/signal.js"; // Must be a multiple of 2. const defaultNumItemsToRender = 10; diff --git a/src/worker_rpc.ts b/src/worker_rpc.ts index 7e22090585..a14bf06eef 100644 --- a/src/worker_rpc.ts +++ b/src/worker_rpc.ts @@ -14,14 +14,14 @@ * limitations under the License. */ +import type { CancellationToken } from "#src/util/cancellation.js"; import { CANCELED, - CancellationToken, CancellationTokenSource, makeCancelablePromise, uncancelableToken, -} from "#/util/cancellation"; -import { RefCounted } from "#/util/disposable"; +} from "#src/util/cancellation.js"; +import { RefCounted } from "#src/util/disposable.js"; export type RPCHandler = (this: RPC, x: any) => void; @@ -315,19 +315,6 @@ registerRPC("SharedObject.dispose", function (x) { obj.rpc = null; }); -// RPC ID used to request the other thread to create a worker. -// -// On Safari, workers cannot themselves create additional workers. As a workaround, workers can -// send the main thread a worker URL and a `MessagePort` and the main thread will create the worker -// and send it the message port. -export const WORKER_RPC_ID = "Worker"; - -registerRPC(WORKER_RPC_ID, (x) => { - const { port, path } = x; - const worker = new Worker(path); - worker.postMessage({ port }, [port]); -}); - registerRPC("SharedObject.refCountReachedZero", function (x) { const obj = this.get(x.id); const generation = x.gen; diff --git a/src/worker_rpc_context.ts b/src/worker_rpc_context.ts index 1edd5242c8..b1ccb29e5e 100644 --- a/src/worker_rpc_context.ts +++ b/src/worker_rpc_context.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { RPC } from "#/worker_rpc"; +import { RPC } from "#src/worker_rpc.js"; export const rpc = new RPC(self); (self).rpc = rpc; diff --git a/third_party/jpgjs/jpg.js b/third_party/jpgjs/jpg.js deleted file mode 100644 index d51d348f34..0000000000 --- a/third_party/jpgjs/jpg.js +++ /dev/null @@ -1,4280 +0,0 @@ -/** - * @license - * Copyright 2015 Mozilla Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function loadURLasArrayBuffer(path, callback) { - if (path.indexOf("data:") === 0) { - var offset = path.indexOf("base64,") + 7; - var data = atob(path.substring(offset)); - var arr = new Uint8Array(data.length); - for (var i = data.length - 1; i >= 0; i--) { - arr[i] = data.charCodeAt(i); - } - callback(arr.buffer); - return; - } - var xhr = new XMLHttpRequest(); - xhr.open("GET", path, true); - xhr.responseType = "arraybuffer"; - xhr.onload = function() { - callback(xhr.response); - }; - xhr.send(null); -} - -var JpegImage = function jpegImage() { - function JpegImage() { - this._src = null; - this._parser = new PDFJS.JpegImage(); - this.onload = null; - } - JpegImage.prototype = { - get src() { - return this._src; - }, - set src(value) { - this.load(value); - }, - get width() { - return this._parser.width; - }, - get height() { - return this._parser.height; - }, - load: function load(path) { - this._src = path; - loadURLasArrayBuffer(path, function(buffer) { - this.parse(new Uint8Array(buffer)); - if (this.onload) { - this.onload(); - } - }.bind(this)); - }, - parse: function(data) { - this._parser.parse(data); - }, - getData: function(width, height) { - return this._parser.getData(width, height, false); - }, - copyToImageData: function copyToImageData(imageData) { - if (this._parser.numComponents === 2 || this._parser.numComponents > 4) { - throw new Error("Unsupported amount of components"); - } - var width = imageData.width, height = imageData.height; - var imageDataBytes = width * height * 4; - var imageDataArray = imageData.data; - var i, j; - if (this._parser.numComponents === 1) { - var values = this._parser.getData(width, height, false); - for (i = 0, j = 0; i < imageDataBytes; ) { - var value = values[j++]; - imageDataArray[i++] = value; - imageDataArray[i++] = value; - imageDataArray[i++] = value; - imageDataArray[i++] = 255; - } - return; - } - var rgb = this._parser.getData(width, height, true); - for (i = 0, j = 0; i < imageDataBytes; ) { - imageDataArray[i++] = rgb[j++]; - imageDataArray[i++] = rgb[j++]; - imageDataArray[i++] = rgb[j++]; - imageDataArray[i++] = 255; - } - } - }; - return JpegImage; -}(); - -var PDFJS; - -(function(PDFJS) { - "use strict"; - var JpegImage = function jpegImage() { - var dctZigZag = new Uint8Array([ 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 ]); - var dctCos1 = 4017; - var dctSin1 = 799; - var dctCos3 = 3406; - var dctSin3 = 2276; - var dctCos6 = 1567; - var dctSin6 = 3784; - var dctSqrt2 = 5793; - var dctSqrt1d2 = 2896; - function constructor() {} - function buildHuffmanTable(codeLengths, values) { - var k = 0, code = [], i, j, length = 16; - while (length > 0 && !codeLengths[length - 1]) { - length--; - } - code.push({ - children: [], - index: 0 - }); - var p = code[0], q; - for (i = 0; i < length; i++) { - for (j = 0; j < codeLengths[i]; j++) { - p = code.pop(); - p.children[p.index] = values[k]; - while (p.index > 0) { - p = code.pop(); - } - p.index++; - code.push(p); - while (code.length <= i) { - code.push(q = { - children: [], - index: 0 - }); - p.children[p.index] = q.children; - p = q; - } - k++; - } - if (i + 1 < length) { - code.push(q = { - children: [], - index: 0 - }); - p.children[p.index] = q.children; - p = q; - } - } - return code[0].children; - } - function getBlockBufferOffset(component, row, col) { - return 64 * ((component.blocksPerLine + 1) * row + col); - } - function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) { - var precision = frame.precision; - var samplesPerLine = frame.samplesPerLine; - var scanLines = frame.scanLines; - var mcusPerLine = frame.mcusPerLine; - var progressive = frame.progressive; - var maxH = frame.maxH, maxV = frame.maxV; - var startOffset = offset, bitsData = 0, bitsCount = 0; - function readBit() { - if (bitsCount > 0) { - bitsCount--; - return bitsData >> bitsCount & 1; - } - bitsData = data[offset++]; - if (bitsData === 255) { - var nextByte = data[offset++]; - if (nextByte) { - throw "unexpected marker: " + (bitsData << 8 | nextByte).toString(16); - } - } - bitsCount = 7; - return bitsData >>> 7; - } - function decodeHuffman(tree) { - var node = tree; - while (true) { - node = node[readBit()]; - if (typeof node === "number") { - return node; - } - if (typeof node !== "object") { - throw "invalid huffman sequence"; - } - } - } - function receive(length) { - var n = 0; - while (length > 0) { - n = n << 1 | readBit(); - length--; - } - return n; - } - function receiveAndExtend(length) { - if (length === 1) { - return readBit() === 1 ? 1 : -1; - } - var n = receive(length); - if (n >= 1 << length - 1) { - return n; - } - return n + (-1 << length) + 1; - } - function decodeBaseline(component, offset) { - var t = decodeHuffman(component.huffmanTableDC); - var diff = t === 0 ? 0 : receiveAndExtend(t); - component.blockData[offset] = component.pred += diff; - var k = 1; - while (k < 64) { - var rs = decodeHuffman(component.huffmanTableAC); - var s = rs & 15, r = rs >> 4; - if (s === 0) { - if (r < 15) { - break; - } - k += 16; - continue; - } - k += r; - var z = dctZigZag[k]; - component.blockData[offset + z] = receiveAndExtend(s); - k++; - } - } - function decodeDCFirst(component, offset) { - var t = decodeHuffman(component.huffmanTableDC); - var diff = t === 0 ? 0 : receiveAndExtend(t) << successive; - component.blockData[offset] = component.pred += diff; - } - function decodeDCSuccessive(component, offset) { - component.blockData[offset] |= readBit() << successive; - } - var eobrun = 0; - function decodeACFirst(component, offset) { - if (eobrun > 0) { - eobrun--; - return; - } - var k = spectralStart, e = spectralEnd; - while (k <= e) { - var rs = decodeHuffman(component.huffmanTableAC); - var s = rs & 15, r = rs >> 4; - if (s === 0) { - if (r < 15) { - eobrun = receive(r) + (1 << r) - 1; - break; - } - k += 16; - continue; - } - k += r; - var z = dctZigZag[k]; - component.blockData[offset + z] = receiveAndExtend(s) * (1 << successive); - k++; - } - } - var successiveACState = 0, successiveACNextValue; - function decodeACSuccessive(component, offset) { - var k = spectralStart; - var e = spectralEnd; - var r = 0; - var s; - var rs; - while (k <= e) { - var z = dctZigZag[k]; - switch (successiveACState) { - case 0: - rs = decodeHuffman(component.huffmanTableAC); - s = rs & 15; - r = rs >> 4; - if (s === 0) { - if (r < 15) { - eobrun = receive(r) + (1 << r); - successiveACState = 4; - } else { - r = 16; - successiveACState = 1; - } - } else { - if (s !== 1) { - throw "invalid ACn encoding"; - } - successiveACNextValue = receiveAndExtend(s); - successiveACState = r ? 2 : 3; - } - continue; - - case 1: - case 2: - if (component.blockData[offset + z]) { - component.blockData[offset + z] += readBit() << successive; - } else { - r--; - if (r === 0) { - successiveACState = successiveACState === 2 ? 3 : 0; - } - } - break; - - case 3: - if (component.blockData[offset + z]) { - component.blockData[offset + z] += readBit() << successive; - } else { - component.blockData[offset + z] = successiveACNextValue << successive; - successiveACState = 0; - } - break; - - case 4: - if (component.blockData[offset + z]) { - component.blockData[offset + z] += readBit() << successive; - } - break; - } - k++; - } - if (successiveACState === 4) { - eobrun--; - if (eobrun === 0) { - successiveACState = 0; - } - } - } - function decodeMcu(component, decode, mcu, row, col) { - var mcuRow = mcu / mcusPerLine | 0; - var mcuCol = mcu % mcusPerLine; - var blockRow = mcuRow * component.v + row; - var blockCol = mcuCol * component.h + col; - var offset = getBlockBufferOffset(component, blockRow, blockCol); - decode(component, offset); - } - function decodeBlock(component, decode, mcu) { - var blockRow = mcu / component.blocksPerLine | 0; - var blockCol = mcu % component.blocksPerLine; - var offset = getBlockBufferOffset(component, blockRow, blockCol); - decode(component, offset); - } - var componentsLength = components.length; - var component, i, j, k, n; - var decodeFn; - if (progressive) { - if (spectralStart === 0) { - decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; - } else { - decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; - } - } else { - decodeFn = decodeBaseline; - } - var mcu = 0, marker; - var mcuExpected; - if (componentsLength === 1) { - mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn; - } else { - mcuExpected = mcusPerLine * frame.mcusPerColumn; - } - if (!resetInterval) { - resetInterval = mcuExpected; - } - var h, v; - while (mcu < mcuExpected) { - for (i = 0; i < componentsLength; i++) { - components[i].pred = 0; - } - eobrun = 0; - if (componentsLength === 1) { - component = components[0]; - for (n = 0; n < resetInterval; n++) { - decodeBlock(component, decodeFn, mcu); - mcu++; - } - } else { - for (n = 0; n < resetInterval; n++) { - for (i = 0; i < componentsLength; i++) { - component = components[i]; - h = component.h; - v = component.v; - for (j = 0; j < v; j++) { - for (k = 0; k < h; k++) { - decodeMcu(component, decodeFn, mcu, j, k); - } - } - } - mcu++; - } - } - bitsCount = 0; - marker = data[offset] << 8 | data[offset + 1]; - if (marker <= 65280) { - throw "marker was not found"; - } - if (marker >= 65488 && marker <= 65495) { - offset += 2; - } else { - break; - } - } - return offset - startOffset; - } - function quantizeAndInverse(component, blockBufferOffset, p) { - var qt = component.quantizationTable, blockData = component.blockData; - var v0, v1, v2, v3, v4, v5, v6, v7; - var p0, p1, p2, p3, p4, p5, p6, p7; - var t; - for (var row = 0; row < 64; row += 8) { - p0 = blockData[blockBufferOffset + row]; - p1 = blockData[blockBufferOffset + row + 1]; - p2 = blockData[blockBufferOffset + row + 2]; - p3 = blockData[blockBufferOffset + row + 3]; - p4 = blockData[blockBufferOffset + row + 4]; - p5 = blockData[blockBufferOffset + row + 5]; - p6 = blockData[blockBufferOffset + row + 6]; - p7 = blockData[blockBufferOffset + row + 7]; - p0 *= qt[row]; - if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { - t = dctSqrt2 * p0 + 512 >> 10; - p[row] = t; - p[row + 1] = t; - p[row + 2] = t; - p[row + 3] = t; - p[row + 4] = t; - p[row + 5] = t; - p[row + 6] = t; - p[row + 7] = t; - continue; - } - p1 *= qt[row + 1]; - p2 *= qt[row + 2]; - p3 *= qt[row + 3]; - p4 *= qt[row + 4]; - p5 *= qt[row + 5]; - p6 *= qt[row + 6]; - p7 *= qt[row + 7]; - v0 = dctSqrt2 * p0 + 128 >> 8; - v1 = dctSqrt2 * p4 + 128 >> 8; - v2 = p2; - v3 = p6; - v4 = dctSqrt1d2 * (p1 - p7) + 128 >> 8; - v7 = dctSqrt1d2 * (p1 + p7) + 128 >> 8; - v5 = p3 << 4; - v6 = p5 << 4; - v0 = v0 + v1 + 1 >> 1; - v1 = v0 - v1; - t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8; - v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8; - v3 = t; - v4 = v4 + v6 + 1 >> 1; - v6 = v4 - v6; - v7 = v7 + v5 + 1 >> 1; - v5 = v7 - v5; - v0 = v0 + v3 + 1 >> 1; - v3 = v0 - v3; - v1 = v1 + v2 + 1 >> 1; - v2 = v1 - v2; - t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12; - v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12; - v7 = t; - t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12; - v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12; - v6 = t; - p[row] = v0 + v7; - p[row + 7] = v0 - v7; - p[row + 1] = v1 + v6; - p[row + 6] = v1 - v6; - p[row + 2] = v2 + v5; - p[row + 5] = v2 - v5; - p[row + 3] = v3 + v4; - p[row + 4] = v3 - v4; - } - for (var col = 0; col < 8; ++col) { - p0 = p[col]; - p1 = p[col + 8]; - p2 = p[col + 16]; - p3 = p[col + 24]; - p4 = p[col + 32]; - p5 = p[col + 40]; - p6 = p[col + 48]; - p7 = p[col + 56]; - if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { - t = dctSqrt2 * p0 + 8192 >> 14; - t = t < -2040 ? 0 : t >= 2024 ? 255 : t + 2056 >> 4; - blockData[blockBufferOffset + col] = t; - blockData[blockBufferOffset + col + 8] = t; - blockData[blockBufferOffset + col + 16] = t; - blockData[blockBufferOffset + col + 24] = t; - blockData[blockBufferOffset + col + 32] = t; - blockData[blockBufferOffset + col + 40] = t; - blockData[blockBufferOffset + col + 48] = t; - blockData[blockBufferOffset + col + 56] = t; - continue; - } - v0 = dctSqrt2 * p0 + 2048 >> 12; - v1 = dctSqrt2 * p4 + 2048 >> 12; - v2 = p2; - v3 = p6; - v4 = dctSqrt1d2 * (p1 - p7) + 2048 >> 12; - v7 = dctSqrt1d2 * (p1 + p7) + 2048 >> 12; - v5 = p3; - v6 = p5; - v0 = (v0 + v1 + 1 >> 1) + 4112; - v1 = v0 - v1; - t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12; - v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12; - v3 = t; - v4 = v4 + v6 + 1 >> 1; - v6 = v4 - v6; - v7 = v7 + v5 + 1 >> 1; - v5 = v7 - v5; - v0 = v0 + v3 + 1 >> 1; - v3 = v0 - v3; - v1 = v1 + v2 + 1 >> 1; - v2 = v1 - v2; - t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12; - v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12; - v7 = t; - t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12; - v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12; - v6 = t; - p0 = v0 + v7; - p7 = v0 - v7; - p1 = v1 + v6; - p6 = v1 - v6; - p2 = v2 + v5; - p5 = v2 - v5; - p3 = v3 + v4; - p4 = v3 - v4; - p0 = p0 < 16 ? 0 : p0 >= 4080 ? 255 : p0 >> 4; - p1 = p1 < 16 ? 0 : p1 >= 4080 ? 255 : p1 >> 4; - p2 = p2 < 16 ? 0 : p2 >= 4080 ? 255 : p2 >> 4; - p3 = p3 < 16 ? 0 : p3 >= 4080 ? 255 : p3 >> 4; - p4 = p4 < 16 ? 0 : p4 >= 4080 ? 255 : p4 >> 4; - p5 = p5 < 16 ? 0 : p5 >= 4080 ? 255 : p5 >> 4; - p6 = p6 < 16 ? 0 : p6 >= 4080 ? 255 : p6 >> 4; - p7 = p7 < 16 ? 0 : p7 >= 4080 ? 255 : p7 >> 4; - blockData[blockBufferOffset + col] = p0; - blockData[blockBufferOffset + col + 8] = p1; - blockData[blockBufferOffset + col + 16] = p2; - blockData[blockBufferOffset + col + 24] = p3; - blockData[blockBufferOffset + col + 32] = p4; - blockData[blockBufferOffset + col + 40] = p5; - blockData[blockBufferOffset + col + 48] = p6; - blockData[blockBufferOffset + col + 56] = p7; - } - } - function buildComponentData(frame, component) { - var blocksPerLine = component.blocksPerLine; - var blocksPerColumn = component.blocksPerColumn; - var computationBuffer = new Int16Array(64); - for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) { - for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) { - var offset = getBlockBufferOffset(component, blockRow, blockCol); - quantizeAndInverse(component, offset, computationBuffer); - } - } - return component.blockData; - } - function clamp0to255(a) { - return a <= 0 ? 0 : a >= 255 ? 255 : a; - } - constructor.prototype = { - parse: function parse(data) { - function readUint16() { - var value = data[offset] << 8 | data[offset + 1]; - offset += 2; - return value; - } - function readDataBlock() { - var length = readUint16(); - var array = data.subarray(offset, offset + length - 2); - offset += array.length; - return array; - } - function prepareComponents(frame) { - var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH); - var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV); - for (var i = 0; i < frame.components.length; i++) { - component = frame.components[i]; - var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH); - var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV); - var blocksPerLineForMcu = mcusPerLine * component.h; - var blocksPerColumnForMcu = mcusPerColumn * component.v; - var blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1); - component.blockData = new Int16Array(blocksBufferSize); - component.blocksPerLine = blocksPerLine; - component.blocksPerColumn = blocksPerColumn; - } - frame.mcusPerLine = mcusPerLine; - frame.mcusPerColumn = mcusPerColumn; - } - var offset = 0, length = data.length; - var jfif = null; - var adobe = null; - var pixels = null; - var frame, resetInterval; - var quantizationTables = []; - var huffmanTablesAC = [], huffmanTablesDC = []; - var fileMarker = readUint16(); - if (fileMarker !== 65496) { - throw "SOI not found"; - } - fileMarker = readUint16(); - while (fileMarker !== 65497) { - var i, j, l; - switch (fileMarker) { - case 65504: - case 65505: - case 65506: - case 65507: - case 65508: - case 65509: - case 65510: - case 65511: - case 65512: - case 65513: - case 65514: - case 65515: - case 65516: - case 65517: - case 65518: - case 65519: - case 65534: - var appData = readDataBlock(); - if (fileMarker === 65504) { - if (appData[0] === 74 && appData[1] === 70 && appData[2] === 73 && appData[3] === 70 && appData[4] === 0) { - jfif = { - version: { - major: appData[5], - minor: appData[6] - }, - densityUnits: appData[7], - xDensity: appData[8] << 8 | appData[9], - yDensity: appData[10] << 8 | appData[11], - thumbWidth: appData[12], - thumbHeight: appData[13], - thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13]) - }; - } - } - if (fileMarker === 65518) { - if (appData[0] === 65 && appData[1] === 100 && appData[2] === 111 && appData[3] === 98 && appData[4] === 101 && appData[5] === 0) { - adobe = { - version: appData[6], - flags0: appData[7] << 8 | appData[8], - flags1: appData[9] << 8 | appData[10], - transformCode: appData[11] - }; - } - } - break; - - case 65499: - var quantizationTablesLength = readUint16(); - var quantizationTablesEnd = quantizationTablesLength + offset - 2; - var z; - while (offset < quantizationTablesEnd) { - var quantizationTableSpec = data[offset++]; - var tableData = new Uint16Array(64); - if (quantizationTableSpec >> 4 === 0) { - for (j = 0; j < 64; j++) { - z = dctZigZag[j]; - tableData[z] = data[offset++]; - } - } else if (quantizationTableSpec >> 4 === 1) { - for (j = 0; j < 64; j++) { - z = dctZigZag[j]; - tableData[z] = readUint16(); - } - } else { - throw "DQT: invalid table spec"; - } - quantizationTables[quantizationTableSpec & 15] = tableData; - } - break; - - case 65472: - case 65473: - case 65474: - if (frame) { - throw "Only single frame JPEGs supported"; - } - readUint16(); - frame = {}; - frame.extended = fileMarker === 65473; - frame.progressive = fileMarker === 65474; - frame.precision = data[offset++]; - frame.scanLines = readUint16(); - frame.samplesPerLine = readUint16(); - frame.components = []; - frame.componentIds = {}; - var componentsCount = data[offset++], componentId; - var maxH = 0, maxV = 0; - for (i = 0; i < componentsCount; i++) { - componentId = data[offset]; - var h = data[offset + 1] >> 4; - var v = data[offset + 1] & 15; - if (maxH < h) { - maxH = h; - } - if (maxV < v) { - maxV = v; - } - var qId = data[offset + 2]; - l = frame.components.push({ - h: h, - v: v, - quantizationTable: quantizationTables[qId] - }); - frame.componentIds[componentId] = l - 1; - offset += 3; - } - frame.maxH = maxH; - frame.maxV = maxV; - prepareComponents(frame); - break; - - case 65476: - var huffmanLength = readUint16(); - for (i = 2; i < huffmanLength; ) { - var huffmanTableSpec = data[offset++]; - var codeLengths = new Uint8Array(16); - var codeLengthSum = 0; - for (j = 0; j < 16; j++, offset++) { - codeLengthSum += codeLengths[j] = data[offset]; - } - var huffmanValues = new Uint8Array(codeLengthSum); - for (j = 0; j < codeLengthSum; j++, offset++) { - huffmanValues[j] = data[offset]; - } - i += 17 + codeLengthSum; - (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues); - } - break; - - case 65501: - readUint16(); - resetInterval = readUint16(); - break; - - case 65498: - var scanLength = readUint16(); - var selectorsCount = data[offset++]; - var components = [], component; - for (i = 0; i < selectorsCount; i++) { - var componentIndex = frame.componentIds[data[offset++]]; - component = frame.components[componentIndex]; - var tableSpec = data[offset++]; - component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; - component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; - components.push(component); - } - var spectralStart = data[offset++]; - var spectralEnd = data[offset++]; - var successiveApproximation = data[offset++]; - var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); - offset += processed; - break; - - case 65535: - if (data[offset] !== 255) { - offset--; - } - break; - - default: - if (data[offset - 3] === 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) { - offset -= 3; - break; - } - throw "unknown JPEG marker " + fileMarker.toString(16); - } - fileMarker = readUint16(); - } - this.width = frame.samplesPerLine; - this.height = frame.scanLines; - this.jfif = jfif; - this.adobe = adobe; - this.components = []; - for (i = 0; i < frame.components.length; i++) { - component = frame.components[i]; - this.components.push({ - output: buildComponentData(frame, component), - scaleX: component.h / frame.maxH, - scaleY: component.v / frame.maxV, - blocksPerLine: component.blocksPerLine, - blocksPerColumn: component.blocksPerColumn - }); - } - this.numComponents = this.components.length; - }, - _getLinearizedBlockData: function getLinearizedBlockData(width, height) { - var scaleX = this.width / width, scaleY = this.height / height; - var component, componentScaleX, componentScaleY, blocksPerScanline; - var x, y, i, j, k; - var index; - var offset = 0; - var output; - var numComponents = this.components.length; - var dataLength = width * height * numComponents; - var data = new Uint8Array(dataLength); - var xScaleBlockOffset = new Uint32Array(width); - var mask3LSB = 4294967288; - for (i = 0; i < numComponents; i++) { - component = this.components[i]; - componentScaleX = component.scaleX * scaleX; - componentScaleY = component.scaleY * scaleY; - offset = i; - output = component.output; - blocksPerScanline = component.blocksPerLine + 1 << 3; - for (x = 0; x < width; x++) { - j = 0 | x * componentScaleX; - xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7; - } - for (y = 0; y < height; y++) { - j = 0 | y * componentScaleY; - index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3; - for (x = 0; x < width; x++) { - data[offset] = output[index + xScaleBlockOffset[x]]; - offset += numComponents; - } - } - } - var transform = this.decodeTransform; - if (transform) { - for (i = 0; i < dataLength; ) { - for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) { - data[i] = (data[i] * transform[k] >> 8) + transform[k + 1]; - } - } - } - return data; - }, - _isColorConversionNeeded: function isColorConversionNeeded() { - if (this.adobe && this.adobe.transformCode) { - return true; - } else if (this.numComponents === 3) { - return true; - } else { - return false; - } - }, - _convertYccToRgb: function convertYccToRgb(data) { - var Y, Cb, Cr; - for (var i = 0, length = data.length; i < length; i += 3) { - Y = data[i]; - Cb = data[i + 1]; - Cr = data[i + 2]; - data[i] = clamp0to255(Y - 179.456 + 1.402 * Cr); - data[i + 1] = clamp0to255(Y + 135.459 - .344 * Cb - .714 * Cr); - data[i + 2] = clamp0to255(Y - 226.816 + 1.772 * Cb); - } - return data; - }, - _convertYcckToRgb: function convertYcckToRgb(data) { - var Y, Cb, Cr, k; - var offset = 0; - for (var i = 0, length = data.length; i < length; i += 4) { - Y = data[i]; - Cb = data[i + 1]; - Cr = data[i + 2]; - k = data[i + 3]; - var r = -122.67195406894 + Cb * (-660635669420364e-19 * Cb + .000437130475926232 * Cr - 54080610064599e-18 * Y + .00048449797120281 * k - .154362151871126) + Cr * (-.000957964378445773 * Cr + .000817076911346625 * Y - .00477271405408747 * k + 1.53380253221734) + Y * (.000961250184130688 * Y - .00266257332283933 * k + .48357088451265) + k * (-.000336197177618394 * k + .484791561490776); - var g = 107.268039397724 + Cb * (219927104525741e-19 * Cb - .000640992018297945 * Cr + .000659397001245577 * Y + .000426105652938837 * k - .176491792462875) + Cr * (-.000778269941513683 * Cr + .00130872261408275 * Y + .000770482631801132 * k - .151051492775562) + Y * (.00126935368114843 * Y - .00265090189010898 * k + .25802910206845) + k * (-.000318913117588328 * k - .213742400323665); - var b = -20.810012546947 + Cb * (-.000570115196973677 * Cb - 263409051004589e-19 * Cr + .0020741088115012 * Y - .00288260236853442 * k + .814272968359295) + Cr * (-153496057440975e-19 * Cr - .000132689043961446 * Y + .000560833691242812 * k - .195152027534049) + Y * (.00174418132927582 * Y - .00255243321439347 * k + .116935020465145) + k * (-.000343531996510555 * k + .24165260232407); - data[offset++] = clamp0to255(r); - data[offset++] = clamp0to255(g); - data[offset++] = clamp0to255(b); - } - return data; - }, - _convertYcckToCmyk: function convertYcckToCmyk(data) { - var Y, Cb, Cr; - for (var i = 0, length = data.length; i < length; i += 4) { - Y = data[i]; - Cb = data[i + 1]; - Cr = data[i + 2]; - data[i] = clamp0to255(434.456 - Y - 1.402 * Cr); - data[i + 1] = clamp0to255(119.541 - Y + .344 * Cb + .714 * Cr); - data[i + 2] = clamp0to255(481.816 - Y - 1.772 * Cb); - } - return data; - }, - _convertCmykToRgb: function convertCmykToRgb(data) { - var c, m, y, k; - var offset = 0; - var min = -255 * 255 * 255; - var scale = 1 / 255 / 255; - for (var i = 0, length = data.length; i < length; i += 4) { - c = data[i]; - m = data[i + 1]; - y = data[i + 2]; - k = data[i + 3]; - var r = c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k - 72734.4411664936) + m * (1.7149763477362134 * m - 5.6096736904047315 * y - 17.873870861415444 * k - 1401.7366389350734) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 4465.541406466231) - k * (21.86122147463605 * k + 48317.86113160301); - var g = c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k - 20220.756542821975) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 48691.05921601825) + y * (4.444339102852739 * y + 9.8632861493405 * k - 6341.191035517494) - k * (20.737325471181034 * k + 47890.15695978492); - var b = c * (.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - .23883238689178934 * k - 3616.812083916688) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 28620.90484698408) + y * (.03296041114873217 * y + 115.60384449646641 * k - 49363.43385999684) - k * (22.33816807309886 * k + 45932.16563550634); - data[offset++] = r >= 0 ? 255 : r <= min ? 0 : 255 + r * scale | 0; - data[offset++] = g >= 0 ? 255 : g <= min ? 0 : 255 + g * scale | 0; - data[offset++] = b >= 0 ? 255 : b <= min ? 0 : 255 + b * scale | 0; - } - return data; - }, - getData: function getData(width, height, forceRGBoutput) { - if (this.numComponents > 4) { - throw "Unsupported color mode"; - } - var data = this._getLinearizedBlockData(width, height); - if (this.numComponents === 3) { - return this._convertYccToRgb(data); - } else if (this.numComponents === 4) { - if (this._isColorConversionNeeded()) { - if (forceRGBoutput) { - return this._convertYcckToRgb(data); - } else { - return this._convertYcckToCmyk(data); - } - } else if (forceRGBoutput) { - return this._convertCmykToRgb(data); - } - } - return data; - } - }; - return constructor; - }(); - "use strict"; - var ArithmeticDecoder = function ArithmeticDecoderClosure() { - var QeTable = [ { - qe: 22017, - nmps: 1, - nlps: 1, - switchFlag: 1 - }, { - qe: 13313, - nmps: 2, - nlps: 6, - switchFlag: 0 - }, { - qe: 6145, - nmps: 3, - nlps: 9, - switchFlag: 0 - }, { - qe: 2753, - nmps: 4, - nlps: 12, - switchFlag: 0 - }, { - qe: 1313, - nmps: 5, - nlps: 29, - switchFlag: 0 - }, { - qe: 545, - nmps: 38, - nlps: 33, - switchFlag: 0 - }, { - qe: 22017, - nmps: 7, - nlps: 6, - switchFlag: 1 - }, { - qe: 21505, - nmps: 8, - nlps: 14, - switchFlag: 0 - }, { - qe: 18433, - nmps: 9, - nlps: 14, - switchFlag: 0 - }, { - qe: 14337, - nmps: 10, - nlps: 14, - switchFlag: 0 - }, { - qe: 12289, - nmps: 11, - nlps: 17, - switchFlag: 0 - }, { - qe: 9217, - nmps: 12, - nlps: 18, - switchFlag: 0 - }, { - qe: 7169, - nmps: 13, - nlps: 20, - switchFlag: 0 - }, { - qe: 5633, - nmps: 29, - nlps: 21, - switchFlag: 0 - }, { - qe: 22017, - nmps: 15, - nlps: 14, - switchFlag: 1 - }, { - qe: 21505, - nmps: 16, - nlps: 14, - switchFlag: 0 - }, { - qe: 20737, - nmps: 17, - nlps: 15, - switchFlag: 0 - }, { - qe: 18433, - nmps: 18, - nlps: 16, - switchFlag: 0 - }, { - qe: 14337, - nmps: 19, - nlps: 17, - switchFlag: 0 - }, { - qe: 13313, - nmps: 20, - nlps: 18, - switchFlag: 0 - }, { - qe: 12289, - nmps: 21, - nlps: 19, - switchFlag: 0 - }, { - qe: 10241, - nmps: 22, - nlps: 19, - switchFlag: 0 - }, { - qe: 9217, - nmps: 23, - nlps: 20, - switchFlag: 0 - }, { - qe: 8705, - nmps: 24, - nlps: 21, - switchFlag: 0 - }, { - qe: 7169, - nmps: 25, - nlps: 22, - switchFlag: 0 - }, { - qe: 6145, - nmps: 26, - nlps: 23, - switchFlag: 0 - }, { - qe: 5633, - nmps: 27, - nlps: 24, - switchFlag: 0 - }, { - qe: 5121, - nmps: 28, - nlps: 25, - switchFlag: 0 - }, { - qe: 4609, - nmps: 29, - nlps: 26, - switchFlag: 0 - }, { - qe: 4353, - nmps: 30, - nlps: 27, - switchFlag: 0 - }, { - qe: 2753, - nmps: 31, - nlps: 28, - switchFlag: 0 - }, { - qe: 2497, - nmps: 32, - nlps: 29, - switchFlag: 0 - }, { - qe: 2209, - nmps: 33, - nlps: 30, - switchFlag: 0 - }, { - qe: 1313, - nmps: 34, - nlps: 31, - switchFlag: 0 - }, { - qe: 1089, - nmps: 35, - nlps: 32, - switchFlag: 0 - }, { - qe: 673, - nmps: 36, - nlps: 33, - switchFlag: 0 - }, { - qe: 545, - nmps: 37, - nlps: 34, - switchFlag: 0 - }, { - qe: 321, - nmps: 38, - nlps: 35, - switchFlag: 0 - }, { - qe: 273, - nmps: 39, - nlps: 36, - switchFlag: 0 - }, { - qe: 133, - nmps: 40, - nlps: 37, - switchFlag: 0 - }, { - qe: 73, - nmps: 41, - nlps: 38, - switchFlag: 0 - }, { - qe: 37, - nmps: 42, - nlps: 39, - switchFlag: 0 - }, { - qe: 21, - nmps: 43, - nlps: 40, - switchFlag: 0 - }, { - qe: 9, - nmps: 44, - nlps: 41, - switchFlag: 0 - }, { - qe: 5, - nmps: 45, - nlps: 42, - switchFlag: 0 - }, { - qe: 1, - nmps: 45, - nlps: 43, - switchFlag: 0 - }, { - qe: 22017, - nmps: 46, - nlps: 46, - switchFlag: 0 - } ]; - function ArithmeticDecoder(data, start, end) { - this.data = data; - this.bp = start; - this.dataEnd = end; - this.chigh = data[start]; - this.clow = 0; - this.byteIn(); - this.chigh = this.chigh << 7 & 65535 | this.clow >> 9 & 127; - this.clow = this.clow << 7 & 65535; - this.ct -= 7; - this.a = 32768; - } - ArithmeticDecoder.prototype = { - byteIn: function ArithmeticDecoder_byteIn() { - var data = this.data; - var bp = this.bp; - if (data[bp] === 255) { - var b1 = data[bp + 1]; - if (b1 > 143) { - this.clow += 65280; - this.ct = 8; - } else { - bp++; - this.clow += data[bp] << 9; - this.ct = 7; - this.bp = bp; - } - } else { - bp++; - this.clow += bp < this.dataEnd ? data[bp] << 8 : 65280; - this.ct = 8; - this.bp = bp; - } - if (this.clow > 65535) { - this.chigh += this.clow >> 16; - this.clow &= 65535; - } - }, - readBit: function ArithmeticDecoder_readBit(contexts, pos) { - var cx_index = contexts[pos] >> 1, cx_mps = contexts[pos] & 1; - var qeTableIcx = QeTable[cx_index]; - var qeIcx = qeTableIcx.qe; - var d; - var a = this.a - qeIcx; - if (this.chigh < qeIcx) { - if (a < qeIcx) { - a = qeIcx; - d = cx_mps; - cx_index = qeTableIcx.nmps; - } else { - a = qeIcx; - d = 1 ^ cx_mps; - if (qeTableIcx.switchFlag === 1) { - cx_mps = d; - } - cx_index = qeTableIcx.nlps; - } - } else { - this.chigh -= qeIcx; - if ((a & 32768) !== 0) { - this.a = a; - return cx_mps; - } - if (a < qeIcx) { - d = 1 ^ cx_mps; - if (qeTableIcx.switchFlag === 1) { - cx_mps = d; - } - cx_index = qeTableIcx.nlps; - } else { - d = cx_mps; - cx_index = qeTableIcx.nmps; - } - } - do { - if (this.ct === 0) { - this.byteIn(); - } - a <<= 1; - this.chigh = this.chigh << 1 & 65535 | this.clow >> 15 & 1; - this.clow = this.clow << 1 & 65535; - this.ct--; - } while ((a & 32768) === 0); - this.a = a; - contexts[pos] = cx_index << 1 | cx_mps; - return d; - } - }; - return ArithmeticDecoder; - }(); - "use strict"; - var JpxImage = function JpxImageClosure() { - var SubbandsGainLog2 = { - LL: 0, - LH: 1, - HL: 1, - HH: 2 - }; - function JpxImage() { - this.failOnCorruptedImage = false; - } - JpxImage.prototype = { - parse: function JpxImage_parse(data) { - var head = readUint16(data, 0); - if (head === 65359) { - this.parseCodestream(data, 0, data.length); - return; - } - var position = 0, length = data.length; - while (position < length) { - var headerSize = 8; - var lbox = readUint32(data, position); - var tbox = readUint32(data, position + 4); - position += headerSize; - if (lbox === 1) { - lbox = readUint32(data, position) * 4294967296 + readUint32(data, position + 4); - position += 8; - headerSize += 8; - } - if (lbox === 0) { - lbox = length - position + headerSize; - } - if (lbox < headerSize) { - throw new Error("JPX Error: Invalid box field size"); - } - var dataLength = lbox - headerSize; - var jumpDataLength = true; - switch (tbox) { - case 1785737832: - jumpDataLength = false; - break; - - case 1668246642: - var method = data[position]; - var precedence = data[position + 1]; - var approximation = data[position + 2]; - if (method === 1) { - var colorspace = readUint32(data, position + 3); - switch (colorspace) { - case 16: - case 17: - case 18: - break; - - default: - warn("Unknown colorspace " + colorspace); - break; - } - } else if (method === 2) { - info("ICC profile not supported"); - } - break; - - case 1785737827: - this.parseCodestream(data, position, position + dataLength); - break; - - case 1783636e3: - if (218793738 !== readUint32(data, position)) { - warn("Invalid JP2 signature"); - } - break; - - case 1783634458: - case 1718909296: - case 1920099697: - case 1919251232: - case 1768449138: - break; - - default: - var headerType = String.fromCharCode(tbox >> 24 & 255, tbox >> 16 & 255, tbox >> 8 & 255, tbox & 255); - warn("Unsupported header type " + tbox + " (" + headerType + ")"); - break; - } - if (jumpDataLength) { - position += dataLength; - } - } - }, - parseImageProperties: function JpxImage_parseImageProperties(stream) { - var newByte = stream.getByte(); - while (newByte >= 0) { - var oldByte = newByte; - newByte = stream.getByte(); - var code = oldByte << 8 | newByte; - if (code === 65361) { - stream.skip(4); - var Xsiz = stream.getInt32() >>> 0; - var Ysiz = stream.getInt32() >>> 0; - var XOsiz = stream.getInt32() >>> 0; - var YOsiz = stream.getInt32() >>> 0; - stream.skip(16); - var Csiz = stream.getUint16(); - this.width = Xsiz - XOsiz; - this.height = Ysiz - YOsiz; - this.componentsCount = Csiz; - this.bitsPerComponent = 8; - return; - } - } - throw new Error("JPX Error: No size marker found in JPX stream"); - }, - parseCodestream: function JpxImage_parseCodestream(data, start, end) { - var context = {}; - try { - var doNotRecover = false; - var position = start; - while (position + 1 < end) { - var code = readUint16(data, position); - position += 2; - var length = 0, j, sqcd, spqcds, spqcdSize, scalarExpounded, tile; - switch (code) { - case 65359: - context.mainHeader = true; - break; - - case 65497: - break; - - case 65361: - length = readUint16(data, position); - var siz = {}; - siz.Xsiz = readUint32(data, position + 4); - siz.Ysiz = readUint32(data, position + 8); - siz.XOsiz = readUint32(data, position + 12); - siz.YOsiz = readUint32(data, position + 16); - siz.XTsiz = readUint32(data, position + 20); - siz.YTsiz = readUint32(data, position + 24); - siz.XTOsiz = readUint32(data, position + 28); - siz.YTOsiz = readUint32(data, position + 32); - var componentsCount = readUint16(data, position + 36); - siz.Csiz = componentsCount; - var components = []; - j = position + 38; - for (var i = 0; i < componentsCount; i++) { - var component = { - precision: (data[j] & 127) + 1, - isSigned: !!(data[j] & 128), - XRsiz: data[j + 1], - YRsiz: data[j + 1] - }; - calculateComponentDimensions(component, siz); - components.push(component); - } - context.SIZ = siz; - context.components = components; - calculateTileGrids(context, components); - context.QCC = []; - context.COC = []; - break; - - case 65372: - length = readUint16(data, position); - var qcd = {}; - j = position + 2; - sqcd = data[j++]; - switch (sqcd & 31) { - case 0: - spqcdSize = 8; - scalarExpounded = true; - break; - - case 1: - spqcdSize = 16; - scalarExpounded = false; - break; - - case 2: - spqcdSize = 16; - scalarExpounded = true; - break; - - default: - throw new Error("JPX Error: Invalid SQcd value " + sqcd); - } - qcd.noQuantization = spqcdSize === 8; - qcd.scalarExpounded = scalarExpounded; - qcd.guardBits = sqcd >> 5; - spqcds = []; - while (j < length + position) { - var spqcd = {}; - if (spqcdSize === 8) { - spqcd.epsilon = data[j++] >> 3; - spqcd.mu = 0; - } else { - spqcd.epsilon = data[j] >> 3; - spqcd.mu = (data[j] & 7) << 8 | data[j + 1]; - j += 2; - } - spqcds.push(spqcd); - } - qcd.SPqcds = spqcds; - if (context.mainHeader) { - context.QCD = qcd; - } else { - context.currentTile.QCD = qcd; - context.currentTile.QCC = []; - } - break; - - case 65373: - length = readUint16(data, position); - var qcc = {}; - j = position + 2; - var cqcc; - if (context.SIZ.Csiz < 257) { - cqcc = data[j++]; - } else { - cqcc = readUint16(data, j); - j += 2; - } - sqcd = data[j++]; - switch (sqcd & 31) { - case 0: - spqcdSize = 8; - scalarExpounded = true; - break; - - case 1: - spqcdSize = 16; - scalarExpounded = false; - break; - - case 2: - spqcdSize = 16; - scalarExpounded = true; - break; - - default: - throw new Error("JPX Error: Invalid SQcd value " + sqcd); - } - qcc.noQuantization = spqcdSize === 8; - qcc.scalarExpounded = scalarExpounded; - qcc.guardBits = sqcd >> 5; - spqcds = []; - while (j < length + position) { - spqcd = {}; - if (spqcdSize === 8) { - spqcd.epsilon = data[j++] >> 3; - spqcd.mu = 0; - } else { - spqcd.epsilon = data[j] >> 3; - spqcd.mu = (data[j] & 7) << 8 | data[j + 1]; - j += 2; - } - spqcds.push(spqcd); - } - qcc.SPqcds = spqcds; - if (context.mainHeader) { - context.QCC[cqcc] = qcc; - } else { - context.currentTile.QCC[cqcc] = qcc; - } - break; - - case 65362: - length = readUint16(data, position); - var cod = {}; - j = position + 2; - var scod = data[j++]; - cod.entropyCoderWithCustomPrecincts = !!(scod & 1); - cod.sopMarkerUsed = !!(scod & 2); - cod.ephMarkerUsed = !!(scod & 4); - cod.progressionOrder = data[j++]; - cod.layersCount = readUint16(data, j); - j += 2; - cod.multipleComponentTransform = data[j++]; - cod.decompositionLevelsCount = data[j++]; - cod.xcb = (data[j++] & 15) + 2; - cod.ycb = (data[j++] & 15) + 2; - var blockStyle = data[j++]; - cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1); - cod.resetContextProbabilities = !!(blockStyle & 2); - cod.terminationOnEachCodingPass = !!(blockStyle & 4); - cod.verticalyStripe = !!(blockStyle & 8); - cod.predictableTermination = !!(blockStyle & 16); - cod.segmentationSymbolUsed = !!(blockStyle & 32); - cod.reversibleTransformation = data[j++]; - if (cod.entropyCoderWithCustomPrecincts) { - var precinctsSizes = []; - while (j < length + position) { - var precinctsSize = data[j++]; - precinctsSizes.push({ - PPx: precinctsSize & 15, - PPy: precinctsSize >> 4 - }); - } - cod.precinctsSizes = precinctsSizes; - } - var unsupported = []; - if (cod.selectiveArithmeticCodingBypass) { - unsupported.push("selectiveArithmeticCodingBypass"); - } - if (cod.resetContextProbabilities) { - unsupported.push("resetContextProbabilities"); - } - if (cod.terminationOnEachCodingPass) { - unsupported.push("terminationOnEachCodingPass"); - } - if (cod.verticalyStripe) { - unsupported.push("verticalyStripe"); - } - if (cod.predictableTermination) { - unsupported.push("predictableTermination"); - } - if (unsupported.length > 0) { - doNotRecover = true; - throw new Error("JPX Error: Unsupported COD options (" + unsupported.join(", ") + ")"); - } - if (context.mainHeader) { - context.COD = cod; - } else { - context.currentTile.COD = cod; - context.currentTile.COC = []; - } - break; - - case 65424: - length = readUint16(data, position); - tile = {}; - tile.index = readUint16(data, position + 2); - tile.length = readUint32(data, position + 4); - tile.dataEnd = tile.length + position - 2; - tile.partIndex = data[position + 8]; - tile.partsCount = data[position + 9]; - context.mainHeader = false; - if (tile.partIndex === 0) { - tile.COD = context.COD; - tile.COC = context.COC.slice(0); - tile.QCD = context.QCD; - tile.QCC = context.QCC.slice(0); - } - context.currentTile = tile; - break; - - case 65427: - tile = context.currentTile; - if (tile.partIndex === 0) { - initializeTile(context, tile.index); - buildPackets(context); - } - length = tile.dataEnd - position; - parseTilePackets(context, data, position, length); - break; - - case 65365: - case 65367: - case 65368: - case 65380: - length = readUint16(data, position); - break; - - case 65363: - throw new Error("JPX Error: Codestream code 0xFF53 (COC) is " + "not implemented"); - - default: - throw new Error("JPX Error: Unknown codestream code: " + code.toString(16)); - } - position += length; - } - } catch (e) { - if (doNotRecover || this.failOnCorruptedImage) { - throw e; - } else { - warn("Trying to recover from " + e.message); - } - } - this.tiles = transformComponents(context); - this.width = context.SIZ.Xsiz - context.SIZ.XOsiz; - this.height = context.SIZ.Ysiz - context.SIZ.YOsiz; - this.componentsCount = context.SIZ.Csiz; - } - }; - function calculateComponentDimensions(component, siz) { - component.x0 = Math.ceil(siz.XOsiz / component.XRsiz); - component.x1 = Math.ceil(siz.Xsiz / component.XRsiz); - component.y0 = Math.ceil(siz.YOsiz / component.YRsiz); - component.y1 = Math.ceil(siz.Ysiz / component.YRsiz); - component.width = component.x1 - component.x0; - component.height = component.y1 - component.y0; - } - function calculateTileGrids(context, components) { - var siz = context.SIZ; - var tile, tiles = []; - var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz); - var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz); - for (var q = 0; q < numYtiles; q++) { - for (var p = 0; p < numXtiles; p++) { - tile = {}; - tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz); - tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz); - tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz); - tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz); - tile.width = tile.tx1 - tile.tx0; - tile.height = tile.ty1 - tile.ty0; - tile.components = []; - tiles.push(tile); - } - } - context.tiles = tiles; - var componentsCount = siz.Csiz; - for (var i = 0, ii = componentsCount; i < ii; i++) { - var component = components[i]; - for (var j = 0, jj = tiles.length; j < jj; j++) { - var tileComponent = {}; - tile = tiles[j]; - tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz); - tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz); - tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz); - tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz); - tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0; - tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0; - tile.components[i] = tileComponent; - } - } - } - function getBlocksDimensions(context, component, r) { - var codOrCoc = component.codingStyleParameters; - var result = {}; - if (!codOrCoc.entropyCoderWithCustomPrecincts) { - result.PPx = 15; - result.PPy = 15; - } else { - result.PPx = codOrCoc.precinctsSizes[r].PPx; - result.PPy = codOrCoc.precinctsSizes[r].PPy; - } - result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : Math.min(codOrCoc.xcb, result.PPx); - result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : Math.min(codOrCoc.ycb, result.PPy); - return result; - } - function buildPrecincts(context, resolution, dimensions) { - var precinctWidth = 1 << dimensions.PPx; - var precinctHeight = 1 << dimensions.PPy; - var isZeroRes = resolution.resLevel === 0; - var precinctWidthInSubband = 1 << dimensions.PPx + (isZeroRes ? 0 : -1); - var precinctHeightInSubband = 1 << dimensions.PPy + (isZeroRes ? 0 : -1); - var numprecinctswide = resolution.trx1 > resolution.trx0 ? Math.ceil(resolution.trx1 / precinctWidth) - Math.floor(resolution.trx0 / precinctWidth) : 0; - var numprecinctshigh = resolution.try1 > resolution.try0 ? Math.ceil(resolution.try1 / precinctHeight) - Math.floor(resolution.try0 / precinctHeight) : 0; - var numprecincts = numprecinctswide * numprecinctshigh; - resolution.precinctParameters = { - precinctWidth: precinctWidth, - precinctHeight: precinctHeight, - numprecinctswide: numprecinctswide, - numprecinctshigh: numprecinctshigh, - numprecincts: numprecincts, - precinctWidthInSubband: precinctWidthInSubband, - precinctHeightInSubband: precinctHeightInSubband - }; - } - function buildCodeblocks(context, subband, dimensions) { - var xcb_ = dimensions.xcb_; - var ycb_ = dimensions.ycb_; - var codeblockWidth = 1 << xcb_; - var codeblockHeight = 1 << ycb_; - var cbx0 = subband.tbx0 >> xcb_; - var cby0 = subband.tby0 >> ycb_; - var cbx1 = subband.tbx1 + codeblockWidth - 1 >> xcb_; - var cby1 = subband.tby1 + codeblockHeight - 1 >> ycb_; - var precinctParameters = subband.resolution.precinctParameters; - var codeblocks = []; - var precincts = []; - var i, j, codeblock, precinctNumber; - for (j = cby0; j < cby1; j++) { - for (i = cbx0; i < cbx1; i++) { - codeblock = { - cbx: i, - cby: j, - tbx0: codeblockWidth * i, - tby0: codeblockHeight * j, - tbx1: codeblockWidth * (i + 1), - tby1: codeblockHeight * (j + 1) - }; - codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0); - codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0); - codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1); - codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1); - var pi = Math.floor((codeblock.tbx0_ - subband.tbx0) / precinctParameters.precinctWidthInSubband); - var pj = Math.floor((codeblock.tby0_ - subband.tby0) / precinctParameters.precinctHeightInSubband); - precinctNumber = pi + pj * precinctParameters.numprecinctswide; - codeblock.precinctNumber = precinctNumber; - codeblock.subbandType = subband.type; - codeblock.Lblock = 3; - if (codeblock.tbx1_ <= codeblock.tbx0_ || codeblock.tby1_ <= codeblock.tby0_) { - continue; - } - codeblocks.push(codeblock); - var precinct = precincts[precinctNumber]; - if (precinct !== undefined) { - if (i < precinct.cbxMin) { - precinct.cbxMin = i; - } else if (i > precinct.cbxMax) { - precinct.cbxMax = i; - } - if (j < precinct.cbyMin) { - precinct.cbxMin = j; - } else if (j > precinct.cbyMax) { - precinct.cbyMax = j; - } - } else { - precincts[precinctNumber] = precinct = { - cbxMin: i, - cbyMin: j, - cbxMax: i, - cbyMax: j - }; - } - codeblock.precinct = precinct; - } - } - subband.codeblockParameters = { - codeblockWidth: xcb_, - codeblockHeight: ycb_, - numcodeblockwide: cbx1 - cbx0 + 1, - numcodeblockhigh: cby1 - cby0 + 1 - }; - subband.codeblocks = codeblocks; - subband.precincts = precincts; - } - function createPacket(resolution, precinctNumber, layerNumber) { - var precinctCodeblocks = []; - var subbands = resolution.subbands; - for (var i = 0, ii = subbands.length; i < ii; i++) { - var subband = subbands[i]; - var codeblocks = subband.codeblocks; - for (var j = 0, jj = codeblocks.length; j < jj; j++) { - var codeblock = codeblocks[j]; - if (codeblock.precinctNumber !== precinctNumber) { - continue; - } - precinctCodeblocks.push(codeblock); - } - } - return { - layerNumber: layerNumber, - codeblocks: precinctCodeblocks - }; - } - function LayerResolutionComponentPositionIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var maxDecompositionLevelsCount = 0; - for (var q = 0; q < componentsCount; q++) { - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount); - } - var l = 0, r = 0, i = 0, k = 0; - this.nextPacket = function JpxImage_nextPacket() { - for (;l < layersCount; l++) { - for (;r <= maxDecompositionLevelsCount; r++) { - for (;i < componentsCount; i++) { - var component = tile.components[i]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; - } - var resolution = component.resolutions[r]; - var numprecincts = resolution.precinctParameters.numprecincts; - for (;k < numprecincts; ) { - var packet = createPacket(resolution, k, l); - k++; - return packet; - } - k = 0; - } - i = 0; - } - r = 0; - } - throw new Error("JPX Error: Out of packets"); - }; - } - function ResolutionLayerComponentPositionIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var maxDecompositionLevelsCount = 0; - for (var q = 0; q < componentsCount; q++) { - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount); - } - var r = 0, l = 0, i = 0, k = 0; - this.nextPacket = function JpxImage_nextPacket() { - for (;r <= maxDecompositionLevelsCount; r++) { - for (;l < layersCount; l++) { - for (;i < componentsCount; i++) { - var component = tile.components[i]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; - } - var resolution = component.resolutions[r]; - var numprecincts = resolution.precinctParameters.numprecincts; - for (;k < numprecincts; ) { - var packet = createPacket(resolution, k, l); - k++; - return packet; - } - k = 0; - } - i = 0; - } - l = 0; - } - throw new Error("JPX Error: Out of packets"); - }; - } - function ResolutionPositionComponentLayerIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var l, r, c, p; - var maxDecompositionLevelsCount = 0; - for (c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, component.codingStyleParameters.decompositionLevelsCount); - } - var maxNumPrecinctsInLevel = new Int32Array(maxDecompositionLevelsCount + 1); - for (r = 0; r <= maxDecompositionLevelsCount; ++r) { - var maxNumPrecincts = 0; - for (c = 0; c < componentsCount; ++c) { - var resolutions = tile.components[c].resolutions; - if (r < resolutions.length) { - maxNumPrecincts = Math.max(maxNumPrecincts, resolutions[r].precinctParameters.numprecincts); - } - } - maxNumPrecinctsInLevel[r] = maxNumPrecincts; - } - l = 0; - r = 0; - c = 0; - p = 0; - this.nextPacket = function JpxImage_nextPacket() { - for (;r <= maxDecompositionLevelsCount; r++) { - for (;p < maxNumPrecinctsInLevel[r]; p++) { - for (;c < componentsCount; c++) { - var component = tile.components[c]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; - } - var resolution = component.resolutions[r]; - var numprecincts = resolution.precinctParameters.numprecincts; - if (p >= numprecincts) { - continue; - } - for (;l < layersCount; ) { - var packet = createPacket(resolution, p, l); - l++; - return packet; - } - l = 0; - } - c = 0; - } - p = 0; - } - throw new Error("JPX Error: Out of packets"); - }; - } - function PositionComponentResolutionLayerIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var precinctsSizes = getPrecinctSizesInImageScale(tile); - var precinctsIterationSizes = precinctsSizes; - var l = 0, r = 0, c = 0, px = 0, py = 0; - this.nextPacket = function JpxImage_nextPacket() { - for (;py < precinctsIterationSizes.maxNumHigh; py++) { - for (;px < precinctsIterationSizes.maxNumWide; px++) { - for (;c < componentsCount; c++) { - var component = tile.components[c]; - var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; - for (;r <= decompositionLevelsCount; r++) { - var resolution = component.resolutions[r]; - var sizeInImageScale = precinctsSizes.components[c].resolutions[r]; - var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution); - if (k === null) { - continue; - } - for (;l < layersCount; ) { - var packet = createPacket(resolution, k, l); - l++; - return packet; - } - l = 0; - } - r = 0; - } - c = 0; - } - px = 0; - } - throw new Error("JPX Error: Out of packets"); - }; - } - function ComponentPositionResolutionLayerIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var precinctsSizes = getPrecinctSizesInImageScale(tile); - var l = 0, r = 0, c = 0, px = 0, py = 0; - this.nextPacket = function JpxImage_nextPacket() { - for (;c < componentsCount; ++c) { - var component = tile.components[c]; - var precinctsIterationSizes = precinctsSizes.components[c]; - var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; - for (;py < precinctsIterationSizes.maxNumHigh; py++) { - for (;px < precinctsIterationSizes.maxNumWide; px++) { - for (;r <= decompositionLevelsCount; r++) { - var resolution = component.resolutions[r]; - var sizeInImageScale = precinctsIterationSizes.resolutions[r]; - var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution); - if (k === null) { - continue; - } - for (;l < layersCount; ) { - var packet = createPacket(resolution, k, l); - l++; - return packet; - } - l = 0; - } - r = 0; - } - px = 0; - } - py = 0; - } - throw new Error("JPX Error: Out of packets"); - }; - } - function getPrecinctIndexIfExist(pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) { - var posX = pxIndex * precinctIterationSizes.minWidth; - var posY = pyIndex * precinctIterationSizes.minHeight; - if (posX % sizeInImageScale.width !== 0 || posY % sizeInImageScale.height !== 0) { - return null; - } - var startPrecinctRowIndex = posY / sizeInImageScale.width * resolution.precinctParameters.numprecinctswide; - return posX / sizeInImageScale.height + startPrecinctRowIndex; - } - function getPrecinctSizesInImageScale(tile) { - var componentsCount = tile.components.length; - var minWidth = Number.MAX_VALUE; - var minHeight = Number.MAX_VALUE; - var maxNumWide = 0; - var maxNumHigh = 0; - var sizePerComponent = new Array(componentsCount); - for (var c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; - var sizePerResolution = new Array(decompositionLevelsCount + 1); - var minWidthCurrentComponent = Number.MAX_VALUE; - var minHeightCurrentComponent = Number.MAX_VALUE; - var maxNumWideCurrentComponent = 0; - var maxNumHighCurrentComponent = 0; - var scale = 1; - for (var r = decompositionLevelsCount; r >= 0; --r) { - var resolution = component.resolutions[r]; - var widthCurrentResolution = scale * resolution.precinctParameters.precinctWidth; - var heightCurrentResolution = scale * resolution.precinctParameters.precinctHeight; - minWidthCurrentComponent = Math.min(minWidthCurrentComponent, widthCurrentResolution); - minHeightCurrentComponent = Math.min(minHeightCurrentComponent, heightCurrentResolution); - maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent, resolution.precinctParameters.numprecinctswide); - maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent, resolution.precinctParameters.numprecinctshigh); - sizePerResolution[r] = { - width: widthCurrentResolution, - height: heightCurrentResolution - }; - scale <<= 1; - } - minWidth = Math.min(minWidth, minWidthCurrentComponent); - minHeight = Math.min(minHeight, minHeightCurrentComponent); - maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent); - maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent); - sizePerComponent[c] = { - resolutions: sizePerResolution, - minWidth: minWidthCurrentComponent, - minHeight: minHeightCurrentComponent, - maxNumWide: maxNumWideCurrentComponent, - maxNumHigh: maxNumHighCurrentComponent - }; - } - return { - components: sizePerComponent, - minWidth: minWidth, - minHeight: minHeight, - maxNumWide: maxNumWide, - maxNumHigh: maxNumHigh - }; - } - function buildPackets(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var componentsCount = siz.Csiz; - for (var c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; - var resolutions = []; - var subbands = []; - for (var r = 0; r <= decompositionLevelsCount; r++) { - var blocksDimensions = getBlocksDimensions(context, component, r); - var resolution = {}; - var scale = 1 << decompositionLevelsCount - r; - resolution.trx0 = Math.ceil(component.tcx0 / scale); - resolution.try0 = Math.ceil(component.tcy0 / scale); - resolution.trx1 = Math.ceil(component.tcx1 / scale); - resolution.try1 = Math.ceil(component.tcy1 / scale); - resolution.resLevel = r; - buildPrecincts(context, resolution, blocksDimensions); - resolutions.push(resolution); - var subband; - if (r === 0) { - subband = {}; - subband.type = "LL"; - subband.tbx0 = Math.ceil(component.tcx0 / scale); - subband.tby0 = Math.ceil(component.tcy0 / scale); - subband.tbx1 = Math.ceil(component.tcx1 / scale); - subband.tby1 = Math.ceil(component.tcy1 / scale); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolution.subbands = [ subband ]; - } else { - var bscale = 1 << decompositionLevelsCount - r + 1; - var resolutionSubbands = []; - subband = {}; - subband.type = "HL"; - subband.tbx0 = Math.ceil(component.tcx0 / bscale - .5); - subband.tby0 = Math.ceil(component.tcy0 / bscale); - subband.tbx1 = Math.ceil(component.tcx1 / bscale - .5); - subband.tby1 = Math.ceil(component.tcy1 / bscale); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - subband = {}; - subband.type = "LH"; - subband.tbx0 = Math.ceil(component.tcx0 / bscale); - subband.tby0 = Math.ceil(component.tcy0 / bscale - .5); - subband.tbx1 = Math.ceil(component.tcx1 / bscale); - subband.tby1 = Math.ceil(component.tcy1 / bscale - .5); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - subband = {}; - subband.type = "HH"; - subband.tbx0 = Math.ceil(component.tcx0 / bscale - .5); - subband.tby0 = Math.ceil(component.tcy0 / bscale - .5); - subband.tbx1 = Math.ceil(component.tcx1 / bscale - .5); - subband.tby1 = Math.ceil(component.tcy1 / bscale - .5); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - resolution.subbands = resolutionSubbands; - } - } - component.resolutions = resolutions; - component.subbands = subbands; - } - var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder; - switch (progressionOrder) { - case 0: - tile.packetsIterator = new LayerResolutionComponentPositionIterator(context); - break; - - case 1: - tile.packetsIterator = new ResolutionLayerComponentPositionIterator(context); - break; - - case 2: - tile.packetsIterator = new ResolutionPositionComponentLayerIterator(context); - break; - - case 3: - tile.packetsIterator = new PositionComponentResolutionLayerIterator(context); - break; - - case 4: - tile.packetsIterator = new ComponentPositionResolutionLayerIterator(context); - break; - - default: - throw new Error("JPX Error: Unsupported progression order " + progressionOrder); - } - } - function parseTilePackets(context, data, offset, dataLength) { - var position = 0; - var buffer, bufferSize = 0, skipNextBit = false; - function readBits(count) { - while (bufferSize < count) { - var b = data[offset + position]; - position++; - if (skipNextBit) { - buffer = buffer << 7 | b; - bufferSize += 7; - skipNextBit = false; - } else { - buffer = buffer << 8 | b; - bufferSize += 8; - } - if (b === 255) { - skipNextBit = true; - } - } - bufferSize -= count; - return buffer >>> bufferSize & (1 << count) - 1; - } - function skipMarkerIfEqual(value) { - if (data[offset + position - 1] === 255 && data[offset + position] === value) { - skipBytes(1); - return true; - } else if (data[offset + position] === 255 && data[offset + position + 1] === value) { - skipBytes(2); - return true; - } - return false; - } - function skipBytes(count) { - position += count; - } - function alignToByte() { - bufferSize = 0; - if (skipNextBit) { - position++; - skipNextBit = false; - } - } - function readCodingpasses() { - if (readBits(1) === 0) { - return 1; - } - if (readBits(1) === 0) { - return 2; - } - var value = readBits(2); - if (value < 3) { - return value + 3; - } - value = readBits(5); - if (value < 31) { - return value + 6; - } - value = readBits(7); - return value + 37; - } - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var sopMarkerUsed = context.COD.sopMarkerUsed; - var ephMarkerUsed = context.COD.ephMarkerUsed; - var packetsIterator = tile.packetsIterator; - while (position < dataLength) { - alignToByte(); - if (sopMarkerUsed && skipMarkerIfEqual(145)) { - skipBytes(4); - } - var packet = packetsIterator.nextPacket(); - if (!readBits(1)) { - continue; - } - var layerNumber = packet.layerNumber; - var queue = [], codeblock; - for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) { - codeblock = packet.codeblocks[i]; - var precinct = codeblock.precinct; - var codeblockColumn = codeblock.cbx - precinct.cbxMin; - var codeblockRow = codeblock.cby - precinct.cbyMin; - var codeblockIncluded = false; - var firstTimeInclusion = false; - var valueReady; - if (codeblock["included"] !== undefined) { - codeblockIncluded = !!readBits(1); - } else { - precinct = codeblock.precinct; - var inclusionTree, zeroBitPlanesTree; - if (precinct["inclusionTree"] !== undefined) { - inclusionTree = precinct.inclusionTree; - } else { - var width = precinct.cbxMax - precinct.cbxMin + 1; - var height = precinct.cbyMax - precinct.cbyMin + 1; - inclusionTree = new InclusionTree(width, height, layerNumber); - zeroBitPlanesTree = new TagTree(width, height); - precinct.inclusionTree = inclusionTree; - precinct.zeroBitPlanesTree = zeroBitPlanesTree; - } - if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) { - while (true) { - if (readBits(1)) { - valueReady = !inclusionTree.nextLevel(); - if (valueReady) { - codeblock.included = true; - codeblockIncluded = firstTimeInclusion = true; - break; - } - } else { - inclusionTree.incrementValue(layerNumber); - break; - } - } - } - } - if (!codeblockIncluded) { - continue; - } - if (firstTimeInclusion) { - zeroBitPlanesTree = precinct.zeroBitPlanesTree; - zeroBitPlanesTree.reset(codeblockColumn, codeblockRow); - while (true) { - if (readBits(1)) { - valueReady = !zeroBitPlanesTree.nextLevel(); - if (valueReady) { - break; - } - } else { - zeroBitPlanesTree.incrementValue(); - } - } - codeblock.zeroBitPlanes = zeroBitPlanesTree.value; - } - var codingpasses = readCodingpasses(); - while (readBits(1)) { - codeblock.Lblock++; - } - var codingpassesLog2 = log2(codingpasses); - var bits = (codingpasses < 1 << codingpassesLog2 ? codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock; - var codedDataLength = readBits(bits); - queue.push({ - codeblock: codeblock, - codingpasses: codingpasses, - dataLength: codedDataLength - }); - } - alignToByte(); - if (ephMarkerUsed) { - skipMarkerIfEqual(146); - } - while (queue.length > 0) { - var packetItem = queue.shift(); - codeblock = packetItem.codeblock; - if (codeblock["data"] === undefined) { - codeblock.data = []; - } - codeblock.data.push({ - data: data, - start: offset + position, - end: offset + position + packetItem.dataLength, - codingpasses: packetItem.codingpasses - }); - position += packetItem.dataLength; - } - } - return position; - } - function copyCoefficients(coefficients, levelWidth, levelHeight, subband, delta, mb, reversible, segmentationSymbolUsed) { - var x0 = subband.tbx0; - var y0 = subband.tby0; - var width = subband.tbx1 - subband.tbx0; - var codeblocks = subband.codeblocks; - var right = subband.type.charAt(0) === "H" ? 1 : 0; - var bottom = subband.type.charAt(1) === "H" ? levelWidth : 0; - for (var i = 0, ii = codeblocks.length; i < ii; ++i) { - var codeblock = codeblocks[i]; - var blockWidth = codeblock.tbx1_ - codeblock.tbx0_; - var blockHeight = codeblock.tby1_ - codeblock.tby0_; - if (blockWidth === 0 || blockHeight === 0) { - continue; - } - if (codeblock["data"] === undefined) { - continue; - } - var bitModel, currentCodingpassType; - bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, codeblock.zeroBitPlanes, mb); - currentCodingpassType = 2; - var data = codeblock.data, totalLength = 0, codingpasses = 0; - var j, jj, dataItem; - for (j = 0, jj = data.length; j < jj; j++) { - dataItem = data[j]; - totalLength += dataItem.end - dataItem.start; - codingpasses += dataItem.codingpasses; - } - var encodedData = new Uint8Array(totalLength); - var position = 0; - for (j = 0, jj = data.length; j < jj; j++) { - dataItem = data[j]; - var chunk = dataItem.data.subarray(dataItem.start, dataItem.end); - encodedData.set(chunk, position); - position += chunk.length; - } - var decoder = new ArithmeticDecoder(encodedData, 0, totalLength); - bitModel.setDecoder(decoder); - for (j = 0; j < codingpasses; j++) { - switch (currentCodingpassType) { - case 0: - bitModel.runSignificancePropogationPass(); - break; - - case 1: - bitModel.runMagnitudeRefinementPass(); - break; - - case 2: - bitModel.runCleanupPass(); - if (segmentationSymbolUsed) { - bitModel.checkSegmentationSymbol(); - } - break; - } - currentCodingpassType = (currentCodingpassType + 1) % 3; - } - var offset = codeblock.tbx0_ - x0 + (codeblock.tby0_ - y0) * width; - var sign = bitModel.coefficentsSign; - var magnitude = bitModel.coefficentsMagnitude; - var bitsDecoded = bitModel.bitsDecoded; - var magnitudeCorrection = reversible ? 0 : .5; - var k, n, nb; - position = 0; - var interleave = subband.type !== "LL"; - for (j = 0; j < blockHeight; j++) { - var row = offset / width | 0; - var levelOffset = 2 * row * (levelWidth - width) + right + bottom; - for (k = 0; k < blockWidth; k++) { - n = magnitude[position]; - if (n !== 0) { - n = (n + magnitudeCorrection) * delta; - if (sign[position] !== 0) { - n = -n; - } - nb = bitsDecoded[position]; - var pos = interleave ? levelOffset + (offset << 1) : offset; - if (reversible && nb >= mb) { - coefficients[pos] = n; - } else { - coefficients[pos] = n * (1 << mb - nb); - } - } - offset++; - position++; - } - offset += width - blockWidth; - } - } - } - function transformTile(context, tile, c) { - var component = tile.components[c]; - var codingStyleParameters = component.codingStyleParameters; - var quantizationParameters = component.quantizationParameters; - var decompositionLevelsCount = codingStyleParameters.decompositionLevelsCount; - var spqcds = quantizationParameters.SPqcds; - var scalarExpounded = quantizationParameters.scalarExpounded; - var guardBits = quantizationParameters.guardBits; - var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed; - var precision = context.components[c].precision; - var reversible = codingStyleParameters.reversibleTransformation; - var transform = reversible ? new ReversibleTransform() : new IrreversibleTransform(); - var subbandCoefficients = []; - var b = 0; - for (var i = 0; i <= decompositionLevelsCount; i++) { - var resolution = component.resolutions[i]; - var width = resolution.trx1 - resolution.trx0; - var height = resolution.try1 - resolution.try0; - var coefficients = new Float32Array(width * height); - for (var j = 0, jj = resolution.subbands.length; j < jj; j++) { - var mu, epsilon; - if (!scalarExpounded) { - mu = spqcds[0].mu; - epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0); - } else { - mu = spqcds[b].mu; - epsilon = spqcds[b].epsilon; - b++; - } - var subband = resolution.subbands[j]; - var gainLog2 = SubbandsGainLog2[subband.type]; - var delta = reversible ? 1 : Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048); - var mb = guardBits + epsilon - 1; - copyCoefficients(coefficients, width, height, subband, delta, mb, reversible, segmentationSymbolUsed); - } - subbandCoefficients.push({ - width: width, - height: height, - items: coefficients - }); - } - var result = transform.calculate(subbandCoefficients, component.tcx0, component.tcy0); - return { - left: component.tcx0, - top: component.tcy0, - width: result.width, - height: result.height, - items: result.items - }; - } - function transformComponents(context) { - var siz = context.SIZ; - var components = context.components; - var componentsCount = siz.Csiz; - var resultImages = []; - for (var i = 0, ii = context.tiles.length; i < ii; i++) { - var tile = context.tiles[i]; - var transformedTiles = []; - var c; - for (c = 0; c < componentsCount; c++) { - transformedTiles[c] = transformTile(context, tile, c); - } - var tile0 = transformedTiles[0]; - var out = new Uint8Array(tile0.items.length * componentsCount); - var result = { - left: tile0.left, - top: tile0.top, - width: tile0.width, - height: tile0.height, - items: out - }; - var shift, offset, max, min, maxK; - var pos = 0, j, jj, y0, y1, y2, r, g, b, k, val; - if (tile.codingStyleDefaultParameters.multipleComponentTransform) { - var fourComponents = componentsCount === 4; - var y0items = transformedTiles[0].items; - var y1items = transformedTiles[1].items; - var y2items = transformedTiles[2].items; - var y3items = fourComponents ? transformedTiles[3].items : null; - shift = components[0].precision - 8; - offset = (128 << shift) + .5; - max = 255 * (1 << shift); - maxK = max * .5; - min = -maxK; - var component0 = tile.components[0]; - var alpha01 = componentsCount - 3; - jj = y0items.length; - if (!component0.codingStyleParameters.reversibleTransformation) { - for (j = 0; j < jj; j++, pos += alpha01) { - y0 = y0items[j] + offset; - y1 = y1items[j]; - y2 = y2items[j]; - r = y0 + 1.402 * y2; - g = y0 - .34413 * y1 - .71414 * y2; - b = y0 + 1.772 * y1; - out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift; - out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift; - out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift; - } - } else { - for (j = 0; j < jj; j++, pos += alpha01) { - y0 = y0items[j] + offset; - y1 = y1items[j]; - y2 = y2items[j]; - g = y0 - (y2 + y1 >> 2); - r = g + y2; - b = g + y1; - out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift; - out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift; - out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift; - } - } - if (fourComponents) { - for (j = 0, pos = 3; j < jj; j++, pos += 4) { - k = y3items[j]; - out[pos] = k <= min ? 0 : k >= maxK ? 255 : k + offset >> shift; - } - } - } else { - for (c = 0; c < componentsCount; c++) { - var items = transformedTiles[c].items; - shift = components[c].precision - 8; - offset = (128 << shift) + .5; - max = 127.5 * (1 << shift); - min = -max; - for (pos = c, j = 0, jj = items.length; j < jj; j++) { - val = items[j]; - out[pos] = val <= min ? 0 : val >= max ? 255 : val + offset >> shift; - pos += componentsCount; - } - } - } - resultImages.push(result); - } - return resultImages; - } - function initializeTile(context, tileIndex) { - var siz = context.SIZ; - var componentsCount = siz.Csiz; - var tile = context.tiles[tileIndex]; - for (var c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - var qcdOrQcc = context.currentTile.QCC[c] !== undefined ? context.currentTile.QCC[c] : context.currentTile.QCD; - component.quantizationParameters = qcdOrQcc; - var codOrCoc = context.currentTile.COC[c] !== undefined ? context.currentTile.COC[c] : context.currentTile.COD; - component.codingStyleParameters = codOrCoc; - } - tile.codingStyleDefaultParameters = context.currentTile.COD; - } - var TagTree = function TagTreeClosure() { - function TagTree(width, height) { - var levelsLength = log2(Math.max(width, height)) + 1; - this.levels = []; - for (var i = 0; i < levelsLength; i++) { - var level = { - width: width, - height: height, - items: [] - }; - this.levels.push(level); - width = Math.ceil(width / 2); - height = Math.ceil(height / 2); - } - } - TagTree.prototype = { - reset: function TagTree_reset(i, j) { - var currentLevel = 0, value = 0, level; - while (currentLevel < this.levels.length) { - level = this.levels[currentLevel]; - var index = i + j * level.width; - if (level.items[index] !== undefined) { - value = level.items[index]; - break; - } - level.index = index; - i >>= 1; - j >>= 1; - currentLevel++; - } - currentLevel--; - level = this.levels[currentLevel]; - level.items[level.index] = value; - this.currentLevel = currentLevel; - delete this.value; - }, - incrementValue: function TagTree_incrementValue() { - var level = this.levels[this.currentLevel]; - level.items[level.index]++; - }, - nextLevel: function TagTree_nextLevel() { - var currentLevel = this.currentLevel; - var level = this.levels[currentLevel]; - var value = level.items[level.index]; - currentLevel--; - if (currentLevel < 0) { - this.value = value; - return false; - } - this.currentLevel = currentLevel; - level = this.levels[currentLevel]; - level.items[level.index] = value; - return true; - } - }; - return TagTree; - }(); - var InclusionTree = function InclusionTreeClosure() { - function InclusionTree(width, height, defaultValue) { - var levelsLength = log2(Math.max(width, height)) + 1; - this.levels = []; - for (var i = 0; i < levelsLength; i++) { - var items = new Uint8Array(width * height); - for (var j = 0, jj = items.length; j < jj; j++) { - items[j] = defaultValue; - } - var level = { - width: width, - height: height, - items: items - }; - this.levels.push(level); - width = Math.ceil(width / 2); - height = Math.ceil(height / 2); - } - } - InclusionTree.prototype = { - reset: function InclusionTree_reset(i, j, stopValue) { - var currentLevel = 0; - while (currentLevel < this.levels.length) { - var level = this.levels[currentLevel]; - var index = i + j * level.width; - level.index = index; - var value = level.items[index]; - if (value === 255) { - break; - } - if (value > stopValue) { - this.currentLevel = currentLevel; - this.propagateValues(); - return false; - } - i >>= 1; - j >>= 1; - currentLevel++; - } - this.currentLevel = currentLevel - 1; - return true; - }, - incrementValue: function InclusionTree_incrementValue(stopValue) { - var level = this.levels[this.currentLevel]; - level.items[level.index] = stopValue + 1; - this.propagateValues(); - }, - propagateValues: function InclusionTree_propagateValues() { - var levelIndex = this.currentLevel; - var level = this.levels[levelIndex]; - var currentValue = level.items[level.index]; - while (--levelIndex >= 0) { - level = this.levels[levelIndex]; - level.items[level.index] = currentValue; - } - }, - nextLevel: function InclusionTree_nextLevel() { - var currentLevel = this.currentLevel; - var level = this.levels[currentLevel]; - var value = level.items[level.index]; - level.items[level.index] = 255; - currentLevel--; - if (currentLevel < 0) { - return false; - } - this.currentLevel = currentLevel; - level = this.levels[currentLevel]; - level.items[level.index] = value; - return true; - } - }; - return InclusionTree; - }(); - var BitModel = function BitModelClosure() { - var UNIFORM_CONTEXT = 17; - var RUNLENGTH_CONTEXT = 18; - var LLAndLHContextsLabel = new Uint8Array([ 0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8 ]); - var HLContextLabel = new Uint8Array([ 0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8 ]); - var HHContextLabel = new Uint8Array([ 0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5, 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8 ]); - function BitModel(width, height, subband, zeroBitPlanes, mb) { - this.width = width; - this.height = height; - this.contextLabelTable = subband === "HH" ? HHContextLabel : subband === "HL" ? HLContextLabel : LLAndLHContextsLabel; - var coefficientCount = width * height; - this.neighborsSignificance = new Uint8Array(coefficientCount); - this.coefficentsSign = new Uint8Array(coefficientCount); - this.coefficentsMagnitude = mb > 14 ? new Uint32Array(coefficientCount) : mb > 6 ? new Uint16Array(coefficientCount) : new Uint8Array(coefficientCount); - this.processingFlags = new Uint8Array(coefficientCount); - var bitsDecoded = new Uint8Array(coefficientCount); - if (zeroBitPlanes !== 0) { - for (var i = 0; i < coefficientCount; i++) { - bitsDecoded[i] = zeroBitPlanes; - } - } - this.bitsDecoded = bitsDecoded; - this.reset(); - } - BitModel.prototype = { - setDecoder: function BitModel_setDecoder(decoder) { - this.decoder = decoder; - }, - reset: function BitModel_reset() { - this.contexts = new Int8Array(19); - this.contexts[0] = 4 << 1 | 0; - this.contexts[UNIFORM_CONTEXT] = 46 << 1 | 0; - this.contexts[RUNLENGTH_CONTEXT] = 3 << 1 | 0; - }, - setNeighborsSignificance: function BitModel_setNeighborsSignificance(row, column, index) { - var neighborsSignificance = this.neighborsSignificance; - var width = this.width, height = this.height; - var left = column > 0; - var right = column + 1 < width; - var i; - if (row > 0) { - i = index - width; - if (left) { - neighborsSignificance[i - 1] += 16; - } - if (right) { - neighborsSignificance[i + 1] += 16; - } - neighborsSignificance[i] += 4; - } - if (row + 1 < height) { - i = index + width; - if (left) { - neighborsSignificance[i - 1] += 16; - } - if (right) { - neighborsSignificance[i + 1] += 16; - } - neighborsSignificance[i] += 4; - } - if (left) { - neighborsSignificance[index - 1] += 1; - } - if (right) { - neighborsSignificance[index + 1] += 1; - } - neighborsSignificance[index] |= 128; - }, - runSignificancePropogationPass: function BitModel_runSignificancePropogationPass() { - var decoder = this.decoder; - var width = this.width, height = this.height; - var coefficentsMagnitude = this.coefficentsMagnitude; - var coefficentsSign = this.coefficentsSign; - var neighborsSignificance = this.neighborsSignificance; - var processingFlags = this.processingFlags; - var contexts = this.contexts; - var labels = this.contextLabelTable; - var bitsDecoded = this.bitsDecoded; - var processedInverseMask = ~1; - var processedMask = 1; - var firstMagnitudeBitMask = 2; - for (var i0 = 0; i0 < height; i0 += 4) { - for (var j = 0; j < width; j++) { - var index = i0 * width + j; - for (var i1 = 0; i1 < 4; i1++, index += width) { - var i = i0 + i1; - if (i >= height) { - break; - } - processingFlags[index] &= processedInverseMask; - if (coefficentsMagnitude[index] || !neighborsSignificance[index]) { - continue; - } - var contextLabel = labels[neighborsSignificance[index]]; - var decision = decoder.readBit(contexts, contextLabel); - if (decision) { - var sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - } - bitsDecoded[index]++; - processingFlags[index] |= processedMask; - } - } - } - }, - decodeSignBit: function BitModel_decodeSignBit(row, column, index) { - var width = this.width, height = this.height; - var coefficentsMagnitude = this.coefficentsMagnitude; - var coefficentsSign = this.coefficentsSign; - var contribution, sign0, sign1, significance1; - var contextLabel, decoded; - significance1 = column > 0 && coefficentsMagnitude[index - 1] !== 0; - if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) { - sign1 = coefficentsSign[index + 1]; - if (significance1) { - sign0 = coefficentsSign[index - 1]; - contribution = 1 - sign1 - sign0; - } else { - contribution = 1 - sign1 - sign1; - } - } else if (significance1) { - sign0 = coefficentsSign[index - 1]; - contribution = 1 - sign0 - sign0; - } else { - contribution = 0; - } - var horizontalContribution = 3 * contribution; - significance1 = row > 0 && coefficentsMagnitude[index - width] !== 0; - if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) { - sign1 = coefficentsSign[index + width]; - if (significance1) { - sign0 = coefficentsSign[index - width]; - contribution = 1 - sign1 - sign0 + horizontalContribution; - } else { - contribution = 1 - sign1 - sign1 + horizontalContribution; - } - } else if (significance1) { - sign0 = coefficentsSign[index - width]; - contribution = 1 - sign0 - sign0 + horizontalContribution; - } else { - contribution = horizontalContribution; - } - if (contribution >= 0) { - contextLabel = 9 + contribution; - decoded = this.decoder.readBit(this.contexts, contextLabel); - } else { - contextLabel = 9 - contribution; - decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1; - } - return decoded; - }, - runMagnitudeRefinementPass: function BitModel_runMagnitudeRefinementPass() { - var decoder = this.decoder; - var width = this.width, height = this.height; - var coefficentsMagnitude = this.coefficentsMagnitude; - var neighborsSignificance = this.neighborsSignificance; - var contexts = this.contexts; - var bitsDecoded = this.bitsDecoded; - var processingFlags = this.processingFlags; - var processedMask = 1; - var firstMagnitudeBitMask = 2; - var length = width * height; - var width4 = width * 4; - for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) { - indexNext = Math.min(length, index0 + width4); - for (var j = 0; j < width; j++) { - for (var index = index0 + j; index < indexNext; index += width) { - if (!coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) { - continue; - } - var contextLabel = 16; - if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) { - processingFlags[index] ^= firstMagnitudeBitMask; - var significance = neighborsSignificance[index] & 127; - contextLabel = significance === 0 ? 15 : 14; - } - var bit = decoder.readBit(contexts, contextLabel); - coefficentsMagnitude[index] = coefficentsMagnitude[index] << 1 | bit; - bitsDecoded[index]++; - processingFlags[index] |= processedMask; - } - } - } - }, - runCleanupPass: function BitModel_runCleanupPass() { - var decoder = this.decoder; - var width = this.width, height = this.height; - var neighborsSignificance = this.neighborsSignificance; - var coefficentsMagnitude = this.coefficentsMagnitude; - var coefficentsSign = this.coefficentsSign; - var contexts = this.contexts; - var labels = this.contextLabelTable; - var bitsDecoded = this.bitsDecoded; - var processingFlags = this.processingFlags; - var processedMask = 1; - var firstMagnitudeBitMask = 2; - var oneRowDown = width; - var twoRowsDown = width * 2; - var threeRowsDown = width * 3; - var iNext; - for (var i0 = 0; i0 < height; i0 = iNext) { - iNext = Math.min(i0 + 4, height); - var indexBase = i0 * width; - var checkAllEmpty = i0 + 3 < height; - for (var j = 0; j < width; j++) { - var index0 = indexBase + j; - var allEmpty = checkAllEmpty && processingFlags[index0] === 0 && processingFlags[index0 + oneRowDown] === 0 && processingFlags[index0 + twoRowsDown] === 0 && processingFlags[index0 + threeRowsDown] === 0 && neighborsSignificance[index0] === 0 && neighborsSignificance[index0 + oneRowDown] === 0 && neighborsSignificance[index0 + twoRowsDown] === 0 && neighborsSignificance[index0 + threeRowsDown] === 0; - var i1 = 0, index = index0; - var i = i0, sign; - if (allEmpty) { - var hasSignificantCoefficent = decoder.readBit(contexts, RUNLENGTH_CONTEXT); - if (!hasSignificantCoefficent) { - bitsDecoded[index0]++; - bitsDecoded[index0 + oneRowDown]++; - bitsDecoded[index0 + twoRowsDown]++; - bitsDecoded[index0 + threeRowsDown]++; - continue; - } - i1 = decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT); - if (i1 !== 0) { - i = i0 + i1; - index += i1 * width; - } - sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - index = index0; - for (var i2 = i0; i2 <= i; i2++, index += width) { - bitsDecoded[index]++; - } - i1++; - } - for (i = i0 + i1; i < iNext; i++, index += width) { - if (coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) { - continue; - } - var contextLabel = labels[neighborsSignificance[index]]; - var decision = decoder.readBit(contexts, contextLabel); - if (decision === 1) { - sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - } - bitsDecoded[index]++; - } - } - } - }, - checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() { - var decoder = this.decoder; - var contexts = this.contexts; - var symbol = decoder.readBit(contexts, UNIFORM_CONTEXT) << 3 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 2 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT); - if (symbol !== 10) { - throw new Error("JPX Error: Invalid segmentation symbol"); - } - } - }; - return BitModel; - }(); - var Transform = function TransformClosure() { - function Transform() {} - Transform.prototype.calculate = function transformCalculate(subbands, u0, v0) { - var ll = subbands[0]; - for (var i = 1, ii = subbands.length; i < ii; i++) { - ll = this.iterate(ll, subbands[i], u0, v0); - } - return ll; - }; - Transform.prototype.extend = function extend(buffer, offset, size) { - var i1 = offset - 1, j1 = offset + 1; - var i2 = offset + size - 2, j2 = offset + size; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1] = buffer[j1]; - buffer[j2] = buffer[i2]; - }; - Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh, u0, v0) { - var llWidth = ll.width, llHeight = ll.height, llItems = ll.items; - var width = hl_lh_hh.width; - var height = hl_lh_hh.height; - var items = hl_lh_hh.items; - var i, j, k, l, u, v; - for (k = 0, i = 0; i < llHeight; i++) { - l = i * 2 * width; - for (j = 0; j < llWidth; j++, k++, l += 2) { - items[l] = llItems[k]; - } - } - llItems = ll.items = null; - var bufferPadding = 4; - var rowBuffer = new Float32Array(width + 2 * bufferPadding); - if (width === 1) { - if ((u0 & 1) !== 0) { - for (v = 0, k = 0; v < height; v++, k += width) { - items[k] *= .5; - } - } - } else { - for (v = 0, k = 0; v < height; v++, k += width) { - rowBuffer.set(items.subarray(k, k + width), bufferPadding); - this.extend(rowBuffer, bufferPadding, width); - this.filter(rowBuffer, bufferPadding, width); - items.set(rowBuffer.subarray(bufferPadding, bufferPadding + width), k); - } - } - var numBuffers = 16; - var colBuffers = []; - for (i = 0; i < numBuffers; i++) { - colBuffers.push(new Float32Array(height + 2 * bufferPadding)); - } - var b, currentBuffer = 0; - ll = bufferPadding + height; - if (height === 1) { - if ((v0 & 1) !== 0) { - for (u = 0; u < width; u++) { - items[u] *= .5; - } - } - } else { - for (u = 0; u < width; u++) { - if (currentBuffer === 0) { - numBuffers = Math.min(width - u, numBuffers); - for (k = u, l = bufferPadding; l < ll; k += width, l++) { - for (b = 0; b < numBuffers; b++) { - colBuffers[b][l] = items[k + b]; - } - } - currentBuffer = numBuffers; - } - currentBuffer--; - var buffer = colBuffers[currentBuffer]; - this.extend(buffer, bufferPadding, height); - this.filter(buffer, bufferPadding, height); - if (currentBuffer === 0) { - k = u - numBuffers + 1; - for (l = bufferPadding; l < ll; k += width, l++) { - for (b = 0; b < numBuffers; b++) { - items[k + b] = colBuffers[b][l]; - } - } - } - } - } - return { - width: width, - height: height, - items: items - }; - }; - return Transform; - }(); - var IrreversibleTransform = function IrreversibleTransformClosure() { - function IrreversibleTransform() { - Transform.call(this); - } - IrreversibleTransform.prototype = Object.create(Transform.prototype); - IrreversibleTransform.prototype.filter = function irreversibleTransformFilter(x, offset, length) { - var len = length >> 1; - offset = offset | 0; - var j, n, current, next; - var alpha = -1.586134342059924; - var beta = -.052980118572961; - var gamma = .882911075530934; - var delta = .443506852043971; - var K = 1.230174104914001; - var K_ = 1 / K; - j = offset - 3; - for (n = len + 4; n--; j += 2) { - x[j] *= K_; - } - j = offset - 2; - current = delta * x[j - 1]; - for (n = len + 3; n--; j += 2) { - next = delta * x[j + 1]; - x[j] = K * x[j] - current - next; - if (n--) { - j += 2; - current = delta * x[j + 1]; - x[j] = K * x[j] - current - next; - } else { - break; - } - } - j = offset - 1; - current = gamma * x[j - 1]; - for (n = len + 2; n--; j += 2) { - next = gamma * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = gamma * x[j + 1]; - x[j] -= current + next; - } else { - break; - } - } - j = offset; - current = beta * x[j - 1]; - for (n = len + 1; n--; j += 2) { - next = beta * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = beta * x[j + 1]; - x[j] -= current + next; - } else { - break; - } - } - if (len !== 0) { - j = offset + 1; - current = alpha * x[j - 1]; - for (n = len; n--; j += 2) { - next = alpha * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = alpha * x[j + 1]; - x[j] -= current + next; - } else { - break; - } - } - } - }; - return IrreversibleTransform; - }(); - var ReversibleTransform = function ReversibleTransformClosure() { - function ReversibleTransform() { - Transform.call(this); - } - ReversibleTransform.prototype = Object.create(Transform.prototype); - ReversibleTransform.prototype.filter = function reversibleTransformFilter(x, offset, length) { - var len = length >> 1; - offset = offset | 0; - var j, n; - for (j = offset, n = len + 1; n--; j += 2) { - x[j] -= x[j - 1] + x[j + 1] + 2 >> 2; - } - for (j = offset + 1, n = len; n--; j += 2) { - x[j] += x[j - 1] + x[j + 1] >> 1; - } - }; - return ReversibleTransform; - }(); - return JpxImage; - }(); - "use strict"; - var Jbig2Image = function Jbig2ImageClosure() { - function ContextCache() {} - ContextCache.prototype = { - getContexts: function(id) { - if (id in this) { - return this[id]; - } - return this[id] = new Int8Array(1 << 16); - } - }; - function DecodingContext(data, start, end) { - this.data = data; - this.start = start; - this.end = end; - } - DecodingContext.prototype = { - get decoder() { - var decoder = new ArithmeticDecoder(this.data, this.start, this.end); - return shadow(this, "decoder", decoder); - }, - get contextCache() { - var cache = new ContextCache(); - return shadow(this, "contextCache", cache); - } - }; - function decodeInteger(contextCache, procedure, decoder) { - var contexts = contextCache.getContexts(procedure); - var prev = 1; - function readBits(length) { - var v = 0; - for (var i = 0; i < length; i++) { - var bit = decoder.readBit(contexts, prev); - prev = prev < 256 ? prev << 1 | bit : (prev << 1 | bit) & 511 | 256; - v = v << 1 | bit; - } - return v >>> 0; - } - var sign = readBits(1); - var value = readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(32) + 4436 : readBits(12) + 340 : readBits(8) + 84 : readBits(6) + 20 : readBits(4) + 4 : readBits(2); - return sign === 0 ? value : value > 0 ? -value : null; - } - function decodeIAID(contextCache, decoder, codeLength) { - var contexts = contextCache.getContexts("IAID"); - var prev = 1; - for (var i = 0; i < codeLength; i++) { - var bit = decoder.readBit(contexts, prev); - prev = prev << 1 | bit; - } - if (codeLength < 31) { - return prev & (1 << codeLength) - 1; - } - return prev & 2147483647; - } - var SegmentTypes = [ "SymbolDictionary", null, null, null, "IntermediateTextRegion", null, "ImmediateTextRegion", "ImmediateLosslessTextRegion", null, null, null, null, null, null, null, null, "patternDictionary", null, null, null, "IntermediateHalftoneRegion", null, "ImmediateHalftoneRegion", "ImmediateLosslessHalftoneRegion", null, null, null, null, null, null, null, null, null, null, null, null, "IntermediateGenericRegion", null, "ImmediateGenericRegion", "ImmediateLosslessGenericRegion", "IntermediateGenericRefinementRegion", null, "ImmediateGenericRefinementRegion", "ImmediateLosslessGenericRefinementRegion", null, null, null, null, "PageInformation", "EndOfPage", "EndOfStripe", "EndOfFile", "Profiles", "Tables", null, null, null, null, null, null, null, null, "Extension" ]; - var CodingTemplates = [ [ { - x: -1, - y: -2 - }, { - x: 0, - y: -2 - }, { - x: 1, - y: -2 - }, { - x: -2, - y: -1 - }, { - x: -1, - y: -1 - }, { - x: 0, - y: -1 - }, { - x: 1, - y: -1 - }, { - x: 2, - y: -1 - }, { - x: -4, - y: 0 - }, { - x: -3, - y: 0 - }, { - x: -2, - y: 0 - }, { - x: -1, - y: 0 - } ], [ { - x: -1, - y: -2 - }, { - x: 0, - y: -2 - }, { - x: 1, - y: -2 - }, { - x: 2, - y: -2 - }, { - x: -2, - y: -1 - }, { - x: -1, - y: -1 - }, { - x: 0, - y: -1 - }, { - x: 1, - y: -1 - }, { - x: 2, - y: -1 - }, { - x: -3, - y: 0 - }, { - x: -2, - y: 0 - }, { - x: -1, - y: 0 - } ], [ { - x: -1, - y: -2 - }, { - x: 0, - y: -2 - }, { - x: 1, - y: -2 - }, { - x: -2, - y: -1 - }, { - x: -1, - y: -1 - }, { - x: 0, - y: -1 - }, { - x: 1, - y: -1 - }, { - x: -2, - y: 0 - }, { - x: -1, - y: 0 - } ], [ { - x: -3, - y: -1 - }, { - x: -2, - y: -1 - }, { - x: -1, - y: -1 - }, { - x: 0, - y: -1 - }, { - x: 1, - y: -1 - }, { - x: -4, - y: 0 - }, { - x: -3, - y: 0 - }, { - x: -2, - y: 0 - }, { - x: -1, - y: 0 - } ] ]; - var RefinementTemplates = [ { - coding: [ { - x: 0, - y: -1 - }, { - x: 1, - y: -1 - }, { - x: -1, - y: 0 - } ], - reference: [ { - x: 0, - y: -1 - }, { - x: 1, - y: -1 - }, { - x: -1, - y: 0 - }, { - x: 0, - y: 0 - }, { - x: 1, - y: 0 - }, { - x: -1, - y: 1 - }, { - x: 0, - y: 1 - }, { - x: 1, - y: 1 - } ] - }, { - coding: [ { - x: -1, - y: -1 - }, { - x: 0, - y: -1 - }, { - x: 1, - y: -1 - }, { - x: -1, - y: 0 - } ], - reference: [ { - x: 0, - y: -1 - }, { - x: -1, - y: 0 - }, { - x: 0, - y: 0 - }, { - x: 1, - y: 0 - }, { - x: 0, - y: 1 - }, { - x: 1, - y: 1 - } ] - } ]; - var ReusedContexts = [ 39717, 1941, 229, 405 ]; - var RefinementReusedContexts = [ 32, 8 ]; - function decodeBitmapTemplate0(width, height, decodingContext) { - var decoder = decodingContext.decoder; - var contexts = decodingContext.contextCache.getContexts("GB"); - var contextLabel, i, j, pixel, row, row1, row2, bitmap = []; - var OLD_PIXEL_MASK = 31735; - for (i = 0; i < height; i++) { - row = bitmap[i] = new Uint8Array(width); - row1 = i < 1 ? row : bitmap[i - 1]; - row2 = i < 2 ? row : bitmap[i - 2]; - contextLabel = row2[0] << 13 | row2[1] << 12 | row2[2] << 11 | row1[0] << 7 | row1[1] << 6 | row1[2] << 5 | row1[3] << 4; - for (j = 0; j < width; j++) { - row[j] = pixel = decoder.readBit(contexts, contextLabel); - contextLabel = (contextLabel & OLD_PIXEL_MASK) << 1 | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel; - } - } - return bitmap; - } - function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) { - if (mmr) { - error("JBIG2 error: MMR encoding is not supported"); - } - if (templateIndex === 0 && !skip && !prediction && at.length === 4 && at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) { - return decodeBitmapTemplate0(width, height, decodingContext); - } - var useskip = !!skip; - var template = CodingTemplates[templateIndex].concat(at); - template.sort(function(a, b) { - return a.y - b.y || a.x - b.x; - }); - var templateLength = template.length; - var templateX = new Int8Array(templateLength); - var templateY = new Int8Array(templateLength); - var changingTemplateEntries = []; - var reuseMask = 0, minX = 0, maxX = 0, minY = 0; - var c, k; - for (k = 0; k < templateLength; k++) { - templateX[k] = template[k].x; - templateY[k] = template[k].y; - minX = Math.min(minX, template[k].x); - maxX = Math.max(maxX, template[k].x); - minY = Math.min(minY, template[k].y); - if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 1].x - 1) { - reuseMask |= 1 << templateLength - 1 - k; - } else { - changingTemplateEntries.push(k); - } - } - var changingEntriesLength = changingTemplateEntries.length; - var changingTemplateX = new Int8Array(changingEntriesLength); - var changingTemplateY = new Int8Array(changingEntriesLength); - var changingTemplateBit = new Uint16Array(changingEntriesLength); - for (c = 0; c < changingEntriesLength; c++) { - k = changingTemplateEntries[c]; - changingTemplateX[c] = template[k].x; - changingTemplateY[c] = template[k].y; - changingTemplateBit[c] = 1 << templateLength - 1 - k; - } - var sbb_left = -minX; - var sbb_top = -minY; - var sbb_right = width - maxX; - var pseudoPixelContext = ReusedContexts[templateIndex]; - var row = new Uint8Array(width); - var bitmap = []; - var decoder = decodingContext.decoder; - var contexts = decodingContext.contextCache.getContexts("GB"); - var ltp = 0, j, i0, j0, contextLabel = 0, bit, shift; - for (var i = 0; i < height; i++) { - if (prediction) { - var sltp = decoder.readBit(contexts, pseudoPixelContext); - ltp ^= sltp; - if (ltp) { - bitmap.push(row); - continue; - } - } - row = new Uint8Array(row); - bitmap.push(row); - for (j = 0; j < width; j++) { - if (useskip && skip[i][j]) { - row[j] = 0; - continue; - } - if (j >= sbb_left && j < sbb_right && i >= sbb_top) { - contextLabel = contextLabel << 1 & reuseMask; - for (k = 0; k < changingEntriesLength; k++) { - i0 = i + changingTemplateY[k]; - j0 = j + changingTemplateX[k]; - bit = bitmap[i0][j0]; - if (bit) { - bit = changingTemplateBit[k]; - contextLabel |= bit; - } - } - } else { - contextLabel = 0; - shift = templateLength - 1; - for (k = 0; k < templateLength; k++, shift--) { - j0 = j + templateX[k]; - if (j0 >= 0 && j0 < width) { - i0 = i + templateY[k]; - if (i0 >= 0) { - bit = bitmap[i0][j0]; - if (bit) { - contextLabel |= bit << shift; - } - } - } - } - } - var pixel = decoder.readBit(contexts, contextLabel); - row[j] = pixel; - } - } - return bitmap; - } - function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, decodingContext) { - var codingTemplate = RefinementTemplates[templateIndex].coding; - if (templateIndex === 0) { - codingTemplate = codingTemplate.concat([ at[0] ]); - } - var codingTemplateLength = codingTemplate.length; - var codingTemplateX = new Int32Array(codingTemplateLength); - var codingTemplateY = new Int32Array(codingTemplateLength); - var k; - for (k = 0; k < codingTemplateLength; k++) { - codingTemplateX[k] = codingTemplate[k].x; - codingTemplateY[k] = codingTemplate[k].y; - } - var referenceTemplate = RefinementTemplates[templateIndex].reference; - if (templateIndex === 0) { - referenceTemplate = referenceTemplate.concat([ at[1] ]); - } - var referenceTemplateLength = referenceTemplate.length; - var referenceTemplateX = new Int32Array(referenceTemplateLength); - var referenceTemplateY = new Int32Array(referenceTemplateLength); - for (k = 0; k < referenceTemplateLength; k++) { - referenceTemplateX[k] = referenceTemplate[k].x; - referenceTemplateY[k] = referenceTemplate[k].y; - } - var referenceWidth = referenceBitmap[0].length; - var referenceHeight = referenceBitmap.length; - var pseudoPixelContext = RefinementReusedContexts[templateIndex]; - var bitmap = []; - var decoder = decodingContext.decoder; - var contexts = decodingContext.contextCache.getContexts("GR"); - var ltp = 0; - for (var i = 0; i < height; i++) { - if (prediction) { - var sltp = decoder.readBit(contexts, pseudoPixelContext); - ltp ^= sltp; - if (ltp) { - error("JBIG2 error: prediction is not supported"); - } - } - var row = new Uint8Array(width); - bitmap.push(row); - for (var j = 0; j < width; j++) { - var i0, j0; - var contextLabel = 0; - for (k = 0; k < codingTemplateLength; k++) { - i0 = i + codingTemplateY[k]; - j0 = j + codingTemplateX[k]; - if (i0 < 0 || j0 < 0 || j0 >= width) { - contextLabel <<= 1; - } else { - contextLabel = contextLabel << 1 | bitmap[i0][j0]; - } - } - for (k = 0; k < referenceTemplateLength; k++) { - i0 = i + referenceTemplateY[k] + offsetY; - j0 = j + referenceTemplateX[k] + offsetX; - if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) { - contextLabel <<= 1; - } else { - contextLabel = contextLabel << 1 | referenceBitmap[i0][j0]; - } - } - var pixel = decoder.readBit(contexts, contextLabel); - row[j] = pixel; - } - } - return bitmap; - } - function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext) { - if (huffman) { - error("JBIG2 error: huffman is not supported"); - } - var newSymbols = []; - var currentHeight = 0; - var symbolCodeLength = log2(symbols.length + numberOfNewSymbols); - var decoder = decodingContext.decoder; - var contextCache = decodingContext.contextCache; - while (newSymbols.length < numberOfNewSymbols) { - var deltaHeight = decodeInteger(contextCache, "IADH", decoder); - currentHeight += deltaHeight; - var currentWidth = 0; - var totalWidth = 0; - while (true) { - var deltaWidth = decodeInteger(contextCache, "IADW", decoder); - if (deltaWidth === null) { - break; - } - currentWidth += deltaWidth; - totalWidth += currentWidth; - var bitmap; - if (refinement) { - var numberOfInstances = decodeInteger(contextCache, "IAAI", decoder); - if (numberOfInstances > 1) { - bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, numberOfInstances, 1, symbols.concat(newSymbols), symbolCodeLength, 0, 0, 1, 0, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext); - } else { - var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); - var rdx = decodeInteger(contextCache, "IARDX", decoder); - var rdy = decodeInteger(contextCache, "IARDY", decoder); - var symbol = symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - symbols.length]; - bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, decodingContext); - } - } else { - bitmap = decodeBitmap(false, currentWidth, currentHeight, templateIndex, false, null, at, decodingContext); - } - newSymbols.push(bitmap); - } - } - var exportedSymbols = []; - var flags = [], currentFlag = false; - var totalSymbolsLength = symbols.length + numberOfNewSymbols; - while (flags.length < totalSymbolsLength) { - var runLength = decodeInteger(contextCache, "IAEX", decoder); - while (runLength--) { - flags.push(currentFlag); - } - currentFlag = !currentFlag; - } - for (var i = 0, ii = symbols.length; i < ii; i++) { - if (flags[i]) { - exportedSymbols.push(symbols[i]); - } - } - for (var j = 0; j < numberOfNewSymbols; i++, j++) { - if (flags[i]) { - exportedSymbols.push(newSymbols[j]); - } - } - return exportedSymbols; - } - function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext) { - if (huffman) { - error("JBIG2 error: huffman is not supported"); - } - var bitmap = []; - var i, row; - for (i = 0; i < height; i++) { - row = new Uint8Array(width); - if (defaultPixelValue) { - for (var j = 0; j < width; j++) { - row[j] = defaultPixelValue; - } - } - bitmap.push(row); - } - var decoder = decodingContext.decoder; - var contextCache = decodingContext.contextCache; - var stripT = -decodeInteger(contextCache, "IADT", decoder); - var firstS = 0; - i = 0; - while (i < numberOfSymbolInstances) { - var deltaT = decodeInteger(contextCache, "IADT", decoder); - stripT += deltaT; - var deltaFirstS = decodeInteger(contextCache, "IAFS", decoder); - firstS += deltaFirstS; - var currentS = firstS; - do { - var currentT = stripSize === 1 ? 0 : decodeInteger(contextCache, "IAIT", decoder); - var t = stripSize * stripT + currentT; - var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); - var applyRefinement = refinement && decodeInteger(contextCache, "IARI", decoder); - var symbolBitmap = inputSymbols[symbolId]; - var symbolWidth = symbolBitmap[0].length; - var symbolHeight = symbolBitmap.length; - if (applyRefinement) { - var rdw = decodeInteger(contextCache, "IARDW", decoder); - var rdh = decodeInteger(contextCache, "IARDH", decoder); - var rdx = decodeInteger(contextCache, "IARDX", decoder); - var rdy = decodeInteger(contextCache, "IARDY", decoder); - symbolWidth += rdw; - symbolHeight += rdh; - symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext); - } - var offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight); - var offsetS = currentS - (referenceCorner & 2 ? symbolWidth : 0); - var s2, t2, symbolRow; - if (transposed) { - for (s2 = 0; s2 < symbolHeight; s2++) { - row = bitmap[offsetS + s2]; - if (!row) { - continue; - } - symbolRow = symbolBitmap[s2]; - var maxWidth = Math.min(width - offsetT, symbolWidth); - switch (combinationOperator) { - case 0: - for (t2 = 0; t2 < maxWidth; t2++) { - row[offsetT + t2] |= symbolRow[t2]; - } - break; - - case 2: - for (t2 = 0; t2 < maxWidth; t2++) { - row[offsetT + t2] ^= symbolRow[t2]; - } - break; - - default: - error("JBIG2 error: operator " + combinationOperator + " is not supported"); - } - } - currentS += symbolHeight - 1; - } else { - for (t2 = 0; t2 < symbolHeight; t2++) { - row = bitmap[offsetT + t2]; - if (!row) { - continue; - } - symbolRow = symbolBitmap[t2]; - switch (combinationOperator) { - case 0: - for (s2 = 0; s2 < symbolWidth; s2++) { - row[offsetS + s2] |= symbolRow[s2]; - } - break; - - case 2: - for (s2 = 0; s2 < symbolWidth; s2++) { - row[offsetS + s2] ^= symbolRow[s2]; - } - break; - - default: - error("JBIG2 error: operator " + combinationOperator + " is not supported"); - } - } - currentS += symbolWidth - 1; - } - i++; - var deltaS = decodeInteger(contextCache, "IADS", decoder); - if (deltaS === null) { - break; - } - currentS += deltaS + dsOffset; - } while (true); - } - return bitmap; - } - function readSegmentHeader(data, start) { - var segmentHeader = {}; - segmentHeader.number = readUint32(data, start); - var flags = data[start + 4]; - var segmentType = flags & 63; - if (!SegmentTypes[segmentType]) { - error("JBIG2 error: invalid segment type: " + segmentType); - } - segmentHeader.type = segmentType; - segmentHeader.typeName = SegmentTypes[segmentType]; - segmentHeader.deferredNonRetain = !!(flags & 128); - var pageAssociationFieldSize = !!(flags & 64); - var referredFlags = data[start + 5]; - var referredToCount = referredFlags >> 5 & 7; - var retainBits = [ referredFlags & 31 ]; - var position = start + 6; - if (referredFlags === 7) { - referredToCount = readUint32(data, position - 1) & 536870911; - position += 3; - var bytes = referredToCount + 7 >> 3; - retainBits[0] = data[position++]; - while (--bytes > 0) { - retainBits.push(data[position++]); - } - } else if (referredFlags === 5 || referredFlags === 6) { - error("JBIG2 error: invalid referred-to flags"); - } - segmentHeader.retainBits = retainBits; - var referredToSegmentNumberSize = segmentHeader.number <= 256 ? 1 : segmentHeader.number <= 65536 ? 2 : 4; - var referredTo = []; - var i, ii; - for (i = 0; i < referredToCount; i++) { - var number = referredToSegmentNumberSize === 1 ? data[position] : referredToSegmentNumberSize === 2 ? readUint16(data, position) : readUint32(data, position); - referredTo.push(number); - position += referredToSegmentNumberSize; - } - segmentHeader.referredTo = referredTo; - if (!pageAssociationFieldSize) { - segmentHeader.pageAssociation = data[position++]; - } else { - segmentHeader.pageAssociation = readUint32(data, position); - position += 4; - } - segmentHeader.length = readUint32(data, position); - position += 4; - if (segmentHeader.length === 4294967295) { - if (segmentType === 38) { - var genericRegionInfo = readRegionSegmentInformation(data, position); - var genericRegionSegmentFlags = data[position + RegionSegmentInformationFieldLength]; - var genericRegionMmr = !!(genericRegionSegmentFlags & 1); - var searchPatternLength = 6; - var searchPattern = new Uint8Array(searchPatternLength); - if (!genericRegionMmr) { - searchPattern[0] = 255; - searchPattern[1] = 172; - } - searchPattern[2] = genericRegionInfo.height >>> 24 & 255; - searchPattern[3] = genericRegionInfo.height >> 16 & 255; - searchPattern[4] = genericRegionInfo.height >> 8 & 255; - searchPattern[5] = genericRegionInfo.height & 255; - for (i = position, ii = data.length; i < ii; i++) { - var j = 0; - while (j < searchPatternLength && searchPattern[j] === data[i + j]) { - j++; - } - if (j === searchPatternLength) { - segmentHeader.length = i + searchPatternLength; - break; - } - } - if (segmentHeader.length === 4294967295) { - error("JBIG2 error: segment end was not found"); - } - } else { - error("JBIG2 error: invalid unknown segment length"); - } - } - segmentHeader.headerEnd = position; - return segmentHeader; - } - function readSegments(header, data, start, end) { - var segments = []; - var position = start; - while (position < end) { - var segmentHeader = readSegmentHeader(data, position); - position = segmentHeader.headerEnd; - var segment = { - header: segmentHeader, - data: data - }; - if (!header.randomAccess) { - segment.start = position; - position += segmentHeader.length; - segment.end = position; - } - segments.push(segment); - if (segmentHeader.type === 51) { - break; - } - } - if (header.randomAccess) { - for (var i = 0, ii = segments.length; i < ii; i++) { - segments[i].start = position; - position += segments[i].header.length; - segments[i].end = position; - } - } - return segments; - } - function readRegionSegmentInformation(data, start) { - return { - width: readUint32(data, start), - height: readUint32(data, start + 4), - x: readUint32(data, start + 8), - y: readUint32(data, start + 12), - combinationOperator: data[start + 16] & 7 - }; - } - var RegionSegmentInformationFieldLength = 17; - function processSegment(segment, visitor) { - var header = segment.header; - var data = segment.data, position = segment.start, end = segment.end; - var args, at, i, atLength; - switch (header.type) { - case 0: - var dictionary = {}; - var dictionaryFlags = readUint16(data, position); - dictionary.huffman = !!(dictionaryFlags & 1); - dictionary.refinement = !!(dictionaryFlags & 2); - dictionary.huffmanDHSelector = dictionaryFlags >> 2 & 3; - dictionary.huffmanDWSelector = dictionaryFlags >> 4 & 3; - dictionary.bitmapSizeSelector = dictionaryFlags >> 6 & 1; - dictionary.aggregationInstancesSelector = dictionaryFlags >> 7 & 1; - dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256); - dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512); - dictionary.template = dictionaryFlags >> 10 & 3; - dictionary.refinementTemplate = dictionaryFlags >> 12 & 1; - position += 2; - if (!dictionary.huffman) { - atLength = dictionary.template === 0 ? 4 : 1; - at = []; - for (i = 0; i < atLength; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - dictionary.at = at; - } - if (dictionary.refinement && !dictionary.refinementTemplate) { - at = []; - for (i = 0; i < 2; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - dictionary.refinementAt = at; - } - dictionary.numberOfExportedSymbols = readUint32(data, position); - position += 4; - dictionary.numberOfNewSymbols = readUint32(data, position); - position += 4; - args = [ dictionary, header.number, header.referredTo, data, position, end ]; - break; - - case 6: - case 7: - var textRegion = {}; - textRegion.info = readRegionSegmentInformation(data, position); - position += RegionSegmentInformationFieldLength; - var textRegionSegmentFlags = readUint16(data, position); - position += 2; - textRegion.huffman = !!(textRegionSegmentFlags & 1); - textRegion.refinement = !!(textRegionSegmentFlags & 2); - textRegion.stripSize = 1 << (textRegionSegmentFlags >> 2 & 3); - textRegion.referenceCorner = textRegionSegmentFlags >> 4 & 3; - textRegion.transposed = !!(textRegionSegmentFlags & 64); - textRegion.combinationOperator = textRegionSegmentFlags >> 7 & 3; - textRegion.defaultPixelValue = textRegionSegmentFlags >> 9 & 1; - textRegion.dsOffset = textRegionSegmentFlags << 17 >> 27; - textRegion.refinementTemplate = textRegionSegmentFlags >> 15 & 1; - if (textRegion.huffman) { - var textRegionHuffmanFlags = readUint16(data, position); - position += 2; - textRegion.huffmanFS = textRegionHuffmanFlags & 3; - textRegion.huffmanDS = textRegionHuffmanFlags >> 2 & 3; - textRegion.huffmanDT = textRegionHuffmanFlags >> 4 & 3; - textRegion.huffmanRefinementDW = textRegionHuffmanFlags >> 6 & 3; - textRegion.huffmanRefinementDH = textRegionHuffmanFlags >> 8 & 3; - textRegion.huffmanRefinementDX = textRegionHuffmanFlags >> 10 & 3; - textRegion.huffmanRefinementDY = textRegionHuffmanFlags >> 12 & 3; - textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 14); - } - if (textRegion.refinement && !textRegion.refinementTemplate) { - at = []; - for (i = 0; i < 2; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - textRegion.refinementAt = at; - } - textRegion.numberOfSymbolInstances = readUint32(data, position); - position += 4; - if (textRegion.huffman) { - error("JBIG2 error: huffman is not supported"); - } - args = [ textRegion, header.referredTo, data, position, end ]; - break; - - case 38: - case 39: - var genericRegion = {}; - genericRegion.info = readRegionSegmentInformation(data, position); - position += RegionSegmentInformationFieldLength; - var genericRegionSegmentFlags = data[position++]; - genericRegion.mmr = !!(genericRegionSegmentFlags & 1); - genericRegion.template = genericRegionSegmentFlags >> 1 & 3; - genericRegion.prediction = !!(genericRegionSegmentFlags & 8); - if (!genericRegion.mmr) { - atLength = genericRegion.template === 0 ? 4 : 1; - at = []; - for (i = 0; i < atLength; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - genericRegion.at = at; - } - args = [ genericRegion, data, position, end ]; - break; - - case 48: - var pageInfo = { - width: readUint32(data, position), - height: readUint32(data, position + 4), - resolutionX: readUint32(data, position + 8), - resolutionY: readUint32(data, position + 12) - }; - if (pageInfo.height === 4294967295) { - delete pageInfo.height; - } - var pageSegmentFlags = data[position + 16]; - var pageStripingInformatiom = readUint16(data, position + 17); - pageInfo.lossless = !!(pageSegmentFlags & 1); - pageInfo.refinement = !!(pageSegmentFlags & 2); - pageInfo.defaultPixelValue = pageSegmentFlags >> 2 & 1; - pageInfo.combinationOperator = pageSegmentFlags >> 3 & 3; - pageInfo.requiresBuffer = !!(pageSegmentFlags & 32); - pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64); - args = [ pageInfo ]; - break; - - case 49: - break; - - case 50: - break; - - case 51: - break; - - case 62: - break; - - default: - error("JBIG2 error: segment type " + header.typeName + "(" + header.type + ") is not implemented"); - } - var callbackName = "on" + header.typeName; - if (callbackName in visitor) { - visitor[callbackName].apply(visitor, args); - } - } - function processSegments(segments, visitor) { - for (var i = 0, ii = segments.length; i < ii; i++) { - processSegment(segments[i], visitor); - } - } - function parseJbig2(data, start, end) { - var position = start; - if (data[position] !== 151 || data[position + 1] !== 74 || data[position + 2] !== 66 || data[position + 3] !== 50 || data[position + 4] !== 13 || data[position + 5] !== 10 || data[position + 6] !== 26 || data[position + 7] !== 10) { - error("JBIG2 error: invalid header"); - } - var header = {}; - position += 8; - var flags = data[position++]; - header.randomAccess = !(flags & 1); - if (!(flags & 2)) { - header.numberOfPages = readUint32(data, position); - position += 4; - } - var segments = readSegments(header, data, position, end); - error("Not implemented"); - } - function parseJbig2Chunks(chunks) { - var visitor = new SimpleSegmentVisitor(); - for (var i = 0, ii = chunks.length; i < ii; i++) { - var chunk = chunks[i]; - var segments = readSegments({}, chunk.data, chunk.start, chunk.end); - processSegments(segments, visitor); - } - return visitor; - } - function SimpleSegmentVisitor() {} - SimpleSegmentVisitor.prototype = { - onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) { - this.currentPageInfo = info; - var rowSize = info.width + 7 >> 3; - var buffer = new Uint8Array(rowSize * info.height); - if (info.defaultPixelValue) { - for (var i = 0, ii = buffer.length; i < ii; i++) { - buffer[i] = 255; - } - } - this.buffer = buffer; - }, - drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) { - var pageInfo = this.currentPageInfo; - var width = regionInfo.width, height = regionInfo.height; - var rowSize = pageInfo.width + 7 >> 3; - var combinationOperator = pageInfo.combinationOperatorOverride ? regionInfo.combinationOperator : pageInfo.combinationOperator; - var buffer = this.buffer; - var mask0 = 128 >> (regionInfo.x & 7); - var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3); - var i, j, mask, offset; - switch (combinationOperator) { - case 0: - for (i = 0; i < height; i++) { - mask = mask0; - offset = offset0; - for (j = 0; j < width; j++) { - if (bitmap[i][j]) { - buffer[offset] |= mask; - } - mask >>= 1; - if (!mask) { - mask = 128; - offset++; - } - } - offset0 += rowSize; - } - break; - - case 2: - for (i = 0; i < height; i++) { - mask = mask0; - offset = offset0; - for (j = 0; j < width; j++) { - if (bitmap[i][j]) { - buffer[offset] ^= mask; - } - mask >>= 1; - if (!mask) { - mask = 128; - offset++; - } - } - offset0 += rowSize; - } - break; - - default: - error("JBIG2 error: operator " + combinationOperator + " is not supported"); - } - }, - onImmediateGenericRegion: function SimpleSegmentVisitor_onImmediateGenericRegion(region, data, start, end) { - var regionInfo = region.info; - var decodingContext = new DecodingContext(data, start, end); - var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, region.template, region.prediction, null, region.at, decodingContext); - this.drawBitmap(regionInfo, bitmap); - }, - onImmediateLosslessGenericRegion: function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() { - this.onImmediateGenericRegion.apply(this, arguments); - }, - onSymbolDictionary: function SimpleSegmentVisitor_onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) { - var huffmanTables; - if (dictionary.huffman) { - error("JBIG2 error: huffman is not supported"); - } - var symbols = this.symbols; - if (!symbols) { - this.symbols = symbols = {}; - } - var inputSymbols = []; - for (var i = 0, ii = referredSegments.length; i < ii; i++) { - inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]); - } - var decodingContext = new DecodingContext(data, start, end); - symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext); - }, - onImmediateTextRegion: function SimpleSegmentVisitor_onImmediateTextRegion(region, referredSegments, data, start, end) { - var regionInfo = region.info; - var huffmanTables; - var symbols = this.symbols; - var inputSymbols = []; - for (var i = 0, ii = referredSegments.length; i < ii; i++) { - inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]); - } - var symbolCodeLength = log2(inputSymbols.length); - var decodingContext = new DecodingContext(data, start, end); - var bitmap = decodeTextRegion(region.huffman, region.refinement, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.numberOfSymbolInstances, region.stripSize, inputSymbols, symbolCodeLength, region.transposed, region.dsOffset, region.referenceCorner, region.combinationOperator, huffmanTables, region.refinementTemplate, region.refinementAt, decodingContext); - this.drawBitmap(regionInfo, bitmap); - }, - onImmediateLosslessTextRegion: function SimpleSegmentVisitor_onImmediateLosslessTextRegion() { - this.onImmediateTextRegion.apply(this, arguments); - } - }; - function Jbig2Image() {} - Jbig2Image.prototype = { - parseChunks: function Jbig2Image_parseChunks(chunks) { - return parseJbig2Chunks(chunks); - } - }; - return Jbig2Image; - }(); - function log2(x) { - var n = 1, i = 0; - while (x > n) { - n <<= 1; - i++; - } - return i; - } - function readInt8(data, start) { - return data[start] << 24 >> 24; - } - function readUint16(data, offset) { - return data[offset] << 8 | data[offset + 1]; - } - function readUint32(data, offset) { - return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0; - } - function shadow(obj, prop, value) { - Object.defineProperty(obj, prop, { - value: value, - enumerable: true, - configurable: true, - writable: false - }); - return value; - } - var error = function() { - console.error.apply(console, arguments); - throw new Error("PDFJS error: " + arguments[0]); - }; - var warn = function() { - console.warn.apply(console, arguments); - }; - var info = function() { - console.info.apply(console, arguments); - }; - Jbig2Image.prototype.parse = function parseJbig2(data) { - var position = 0, end = data.length; - if (data[position] !== 151 || data[position + 1] !== 74 || data[position + 2] !== 66 || data[position + 3] !== 50 || data[position + 4] !== 13 || data[position + 5] !== 10 || data[position + 6] !== 26 || data[position + 7] !== 10) { - error("JBIG2 error: invalid header"); - } - var header = {}; - position += 8; - var flags = data[position++]; - header.randomAccess = !(flags & 1); - if (!(flags & 2)) { - header.numberOfPages = readUint32(data, position); - position += 4; - } - var visitor = this.parseChunks([ { - data: data, - start: position, - end: end - } ]); - var width = visitor.currentPageInfo.width; - var height = visitor.currentPageInfo.height; - var bitPacked = visitor.buffer; - var data = new Uint8Array(width * height); - var q = 0, k = 0; - for (var i = 0; i < height; i++) { - var mask = 0, buffer; - for (var j = 0; j < width; j++) { - if (!mask) { - mask = 128; - buffer = bitPacked[k++]; - } - data[q++] = buffer & mask ? 0 : 255; - mask >>= 1; - } - } - this.width = width; - this.height = height; - this.data = data; - }; - PDFJS.JpegImage = JpegImage; - PDFJS.JpxImage = JpxImage; - PDFJS.Jbig2Image = Jbig2Image; -})(PDFJS || (PDFJS = {})); - -var JpegDecoder = PDFJS.JpegImage; - -var JpxDecoder = PDFJS.JpxImage; - -var Jbig2Decoder = PDFJS.Jbig2Image; - -if (typeof exports !== "undefined") { - module.exports = { - JpegImage: JpegImage, - JpegDecoder: JpegDecoder, - JpxDecoder: JpxDecoder, - Jbig2Decoder: Jbig2Decoder - }; -} diff --git a/tsconfig.json b/tsconfig.json index 8ba5f26acf..1e1d89ca18 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,24 +8,22 @@ "preserveConstEnums": true, "experimentalDecorators": true, "alwaysStrict": true, + "allowJs": true, "strictNullChecks": true, + "skipLibCheck": true, "allowSyntheticDefaultImports": true, + "allowImportingTsExtensions": true, "esModuleInterop": true, "sourceMap": true, "moduleResolution": "bundler", "incremental": true, + "resolveJsonModule": true, "target": "ES2017", "newLine": "LF", "baseUrl": ".", - "paths": { - "*": ["*"], - "#/*": ["src/*"], - "jpgjs": ["third_party/jpgjs/jpg.js"], - "neuroglancer-testdata/*": ["testdata/*"] - }, "lib": ["dom", "es2020", "dom.iterable"], "typeRoots": [], - "module": "ESNext" + "module": "ESNext", }, "exclude": [ "node_modules", @@ -34,6 +32,7 @@ "python", "testdata", "examples", - "config" - ] + "config", + "tests", + ], } diff --git a/typings/binary.d.ts b/typings/binary.d.ts new file mode 100644 index 0000000000..3599f4e784 --- /dev/null +++ b/typings/binary.d.ts @@ -0,0 +1,4 @@ +declare module "*?binary" { + const value: Uint8Array; + export default value; +} diff --git a/typings/glsl-editor.d.ts b/typings/glsl-editor.d.ts index 1b81b1e314..c32e7ba06d 100644 --- a/typings/glsl-editor.d.ts +++ b/typings/glsl-editor.d.ts @@ -17,7 +17,7 @@ /** * Basic typings for glsl-editor package. */ -declare module "glsl-editor/glsl" { +declare module "glsl-editor/glsl.js" { import CodeMirror from "codemirror"; const f: (codeMirror: typeof CodeMirror) => void; export default f; diff --git a/typings/glsl.d.ts b/typings/glsl.d.ts deleted file mode 100644 index 7e430d9ac6..0000000000 --- a/typings/glsl.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * @license - * Copyright 2019 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @file Permits .glsl files to be imported as strings. - */ - -declare module "*.glsl" { - const value: string; - export default value; -} diff --git a/typings/html.d.ts b/typings/html.d.ts new file mode 100644 index 0000000000..0877141d37 --- /dev/null +++ b/typings/html.d.ts @@ -0,0 +1,4 @@ +declare module "*.html" { + const value: string; + export default value; +} diff --git a/typings/index.d.ts b/typings/index.d.ts index 5962a3c1a4..ea8848a6c6 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1,12 +1,5 @@ -/// -/// -/// +/// /// -/// /// /// -/// -/// - -// Defined when running via the Python integration. -declare const NEUROGLANCER_PYTHON_INTEGRATION: boolean | undefined; +/// diff --git a/typings/jpgjs.d.ts b/typings/jpgjs.d.ts deleted file mode 100644 index da1c6337de..0000000000 --- a/typings/jpgjs.d.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @license - * Copyright 2016 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Basic typings for jpgjs package. - */ - -declare module "jpgjs" { - interface JpegDecoder { - width: number; - height: number; - numComponents: number; - parse(data: Uint8Array): void; - getData( - width: number, - height: number, - forceRGBOutput?: boolean, - ): Uint8Array; - } - - interface JpegDecoderConstructor { - new (): JpegDecoder; - } - - const JpegDecoder: JpegDecoderConstructor; -} diff --git a/typings/svg.d.ts b/typings/svg.d.ts deleted file mode 100644 index 6fb8cab1dc..0000000000 --- a/typings/svg.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * @license - * Copyright 2019 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @file Permits .svg files to be imported as strings. - */ - -declare module "*.svg" { - const value: string; - export default value; -} diff --git a/typings/url-loader.d.ts b/typings/url-loader.d.ts deleted file mode 100644 index cc861f152a..0000000000 --- a/typings/url-loader.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * @license - * Copyright 2019 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @file Permits webpack url-loader modules to be imported as strings. - */ - -declare module "*.wasm" { - const value: string; - export default value; -} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000000..468ee3da3b --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,76 @@ +import type { UserConfig } from "vite"; +import { defineConfig } from "vite"; +import devServerPathMapPlugin from "./build_tools/vite/vite-plugin-dev-server-path-map.js"; + +// Ensure that the Google oauth2 and bossDB auth redirect pages have the +// expected names, as otherwise authentication requests will fail. +const AUTH_REDIRECT_HTML = new Map([ + ["/google_oauth2_redirect.html", "/src/util/google_oauth2_redirect.html"], + ["/bossauth.html", "/src/datasource/boss/bossauth.html"], +]); + +export default defineConfig( + ({ mode }): UserConfig => ({ + define: { + // This is the default client ID used for the hosted neuroglancer. + // In addition to the hosted neuroglancer origin, it is valid for + // the origins: + // + // localhost:8000 + // 127.0.0.1:8000 + // localhost:8080 + // 127.0.0.1:8080 + // + // To deploy to a different origin, you will need to generate your + // own client ID from on the Google Developer Console and substitute + // it in. + NEUROGLANCER_BRAINMAPS_CLIENT_ID: JSON.stringify( + "639403125587-4k5hgdfumtrvur8v48e3pr7oo91d765k.apps.googleusercontent.com", + ), + + // NEUROGLANCER_CREDIT_LINK: JSON.stringify({url: '...', text: '...'}), + // NEUROGLANCER_DEFAULT_STATE_FRAGMENT: JSON.stringify('gs://bucket/state.json'), + // NEUROGLANCER_SHOW_LAYER_BAR_EXTRA_BUTTONS: true, + // NEUROGLANCER_SHOW_OBJECT_SELECTION_TOOLTIP: true + + // NEUROGLANCER_GOOGLE_TAG_MANAGER: JSON.stringify('GTM-XXXXXX'), + }, + + // Use relative URLs to reference other files, in order to allow built assets + // to be served from any path. + base: "", + // Prevent *.html redirecting to `index.html` on dev server, to avoid confusion. + appType: "mpa", + optimizeDeps: { + include: ["nifti-reader-js", "pako", "numcodecs/blosc", "numcodecs/zstd"], + }, + plugins: [ + devServerPathMapPlugin({ + map: AUTH_REDIRECT_HTML, + }), + ], + build: { + outDir: mode === "development" ? "dist/dev" : "dist/min", + chunkSizeWarningLimit: 2 * 1024 * 1024, + assetsDir: "", + rollupOptions: { + output: { + format: "esm", + assetFileNames: (assetInfo) => { + const { name } = assetInfo; + if (name !== undefined && AUTH_REDIRECT_HTML.has(`/${name}`)) { + return "[name][extname]"; + } + return "[name]-[hash][extname]"; + }, + }, + }, + }, + worker: { + format: "es", + }, + server: { + port: 8080, + }, + }), +); diff --git a/vitest.workspace.ts b/vitest.workspace.ts new file mode 100644 index 0000000000..04966bd41a --- /dev/null +++ b/vitest.workspace.ts @@ -0,0 +1,34 @@ +import { defineWorkspace } from "vitest/config"; +import binaryPlugin from "./build_tools/vite/vite-plugin-binary.ts"; + +const baseConfig = { + extends: "./vite.config.ts", + plugins: [binaryPlugin({ include: ["**/*.npy", "**/*.dat"] })], +}; + +export default defineWorkspace([ + { + ...baseConfig, + test: { + environment: "node", + include: ["src/**/*.spec.ts"], + benchmark: { + include: ["src/**/*.benchmark.ts"], + }, + }, + }, + { + ...baseConfig, + test: { + include: ["src/**/*.browser_test.ts"], + benchmark: { + include: [], + }, + browser: { + enabled: true, + headless: true, + name: "chrome", + }, + }, + }, +]);