From 7b80fae2ed187c779d38333dc2bee4c49035ef29 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Sun, 10 Mar 2024 22:48:08 -0400 Subject: [PATCH 01/25] refactor(viewer): move typescript package into its own directory For corresponding python package to live adjacent. --- packages/element/tsconfig.build.json | 2 +- packages/remote-viewport/tsconfig.build.json | 2 +- packages/viewer/{ => typescript}/CHANGELOG.md | 0 packages/viewer/{ => typescript}/index.html | 0 packages/viewer/{ => typescript}/package.json | 0 .../viewer/typescript/src/camera-machine.ts | 68 + .../viewer/{ => typescript}/src/camera.ts | 0 .../viewer/{ => typescript}/src/children.ts | 0 .../src/fps-watcher-machine.ts} | 0 packages/viewer/typescript/src/fps-watcher.ts | 82 + .../viewer/{ => typescript}/src/view-2d.cy.ts | 0 .../viewer/{ => typescript}/src/view-2d.ts | 0 .../viewer/{ => typescript}/src/view-3d.ts | 0 .../viewer/typescript/src/viewer-machine.ts | 129 ++ .../viewer/{ => typescript}/src/viewer.cy.ts | 0 .../viewer/{ => typescript}/src/viewer.ts | 0 .../viewer/typescript/src/viewport-machine.ts | 158 ++ .../{ => typescript}/src/viewport.cy.ts | 0 .../viewer/{ => typescript}/src/viewport.ts | 0 .../{ => typescript}/tsconfig.build.json | 4 +- packages/vtkjs/tsconfig.build.json | 2 +- pnpm-lock.yaml | 2008 ++++++++--------- pnpm-workspace.yaml | 1 + 23 files changed, 1405 insertions(+), 1051 deletions(-) rename packages/viewer/{ => typescript}/CHANGELOG.md (100%) rename packages/viewer/{ => typescript}/index.html (100%) rename packages/viewer/{ => typescript}/package.json (100%) create mode 100644 packages/viewer/typescript/src/camera-machine.ts rename packages/viewer/{ => typescript}/src/camera.ts (100%) rename packages/viewer/{ => typescript}/src/children.ts (100%) rename packages/viewer/{src/fps-watcher.ts => typescript/src/fps-watcher-machine.ts} (100%) create mode 100644 packages/viewer/typescript/src/fps-watcher.ts rename packages/viewer/{ => typescript}/src/view-2d.cy.ts (100%) rename packages/viewer/{ => typescript}/src/view-2d.ts (100%) rename packages/viewer/{ => typescript}/src/view-3d.ts (100%) create mode 100644 packages/viewer/typescript/src/viewer-machine.ts rename packages/viewer/{ => typescript}/src/viewer.cy.ts (100%) rename packages/viewer/{ => typescript}/src/viewer.ts (100%) create mode 100644 packages/viewer/typescript/src/viewport-machine.ts rename packages/viewer/{ => typescript}/src/viewport.cy.ts (100%) rename packages/viewer/{ => typescript}/src/viewport.ts (100%) rename packages/viewer/{ => typescript}/tsconfig.build.json (61%) diff --git a/packages/element/tsconfig.build.json b/packages/element/tsconfig.build.json index 9cc35d04..5d34f4aa 100644 --- a/packages/element/tsconfig.build.json +++ b/packages/element/tsconfig.build.json @@ -13,7 +13,7 @@ "./**/vite.config.ts" ], "references": [ - { "path": "../viewer/tsconfig.build.json" }, + { "path": "../viewer/typescript/tsconfig.build.json" }, { "path": "../io/tsconfig.build.json" }, { "path": "../remote-viewport/tsconfig.build.json" } ] diff --git a/packages/remote-viewport/tsconfig.build.json b/packages/remote-viewport/tsconfig.build.json index 01046e22..c4b0074f 100644 --- a/packages/remote-viewport/tsconfig.build.json +++ b/packages/remote-viewport/tsconfig.build.json @@ -6,5 +6,5 @@ "tsBuildInfoFile": "./dist/tsconfig.build.tsbuildinfo" }, "include": ["./src/*.ts"], - "references": [{ "path": "../viewer/tsconfig.build.json" }] + "references": [{ "path": "../viewer/typescript/tsconfig.build.json" }] } diff --git a/packages/viewer/CHANGELOG.md b/packages/viewer/typescript/CHANGELOG.md similarity index 100% rename from packages/viewer/CHANGELOG.md rename to packages/viewer/typescript/CHANGELOG.md diff --git a/packages/viewer/index.html b/packages/viewer/typescript/index.html similarity index 100% rename from packages/viewer/index.html rename to packages/viewer/typescript/index.html diff --git a/packages/viewer/package.json b/packages/viewer/typescript/package.json similarity index 100% rename from packages/viewer/package.json rename to packages/viewer/typescript/package.json diff --git a/packages/viewer/typescript/src/camera-machine.ts b/packages/viewer/typescript/src/camera-machine.ts new file mode 100644 index 00000000..9e80fb45 --- /dev/null +++ b/packages/viewer/typescript/src/camera-machine.ts @@ -0,0 +1,68 @@ +import { ReadonlyMat4, ReadonlyVec3, mat4 } from 'gl-matrix'; +import { assign, createActor, createMachine } from 'xstate'; + +export type LookAtParams = { + eye: ReadonlyVec3; + center: ReadonlyVec3; + up: ReadonlyVec3; +}; + +type Context = { + pose: ReadonlyMat4; + lookAt: LookAtParams; + verticalFieldOfView: number; +}; + +type SetPoseEvent = { + type: 'setPose'; + pose: ReadonlyMat4; +}; + +type LookAtEvent = { + type: 'lookAt'; + lookAt: LookAtParams; +}; + +const cameraMachine = createMachine({ + types: {} as { + context: Context; + events: SetPoseEvent | LookAtEvent; + }, + id: 'camera', + initial: 'active', + context: { + pose: mat4.create(), + lookAt: { eye: [0, 0, 0], center: [0, 0, 1], up: [0, 1, 0] }, + verticalFieldOfView: 50, + }, + states: { + active: { + on: { + setPose: { + actions: [ + assign({ + pose: ({ event: { pose } }: { event: SetPoseEvent }) => pose, + }), + ], + }, + lookAt: { + actions: [ + assign({ + lookAt: ({ event: { lookAt } }) => lookAt, + pose: ({ event: { lookAt } }) => { + const { eye, center, up } = lookAt; + return mat4.lookAt(mat4.create(), eye, center, up); + }, + }), + ], + }, + }, + }, + }, +}); + +export const createCamera = () => { + return createActor(cameraMachine).start(); +}; + +export type Camera = ReturnType; diff --git a/packages/viewer/src/camera.ts b/packages/viewer/typescript/src/camera.ts similarity index 100% rename from packages/viewer/src/camera.ts rename to packages/viewer/typescript/src/camera.ts diff --git a/packages/viewer/src/children.ts b/packages/viewer/typescript/src/children.ts similarity index 100% rename from packages/viewer/src/children.ts rename to packages/viewer/typescript/src/children.ts diff --git a/packages/viewer/src/fps-watcher.ts b/packages/viewer/typescript/src/fps-watcher-machine.ts similarity index 100% rename from packages/viewer/src/fps-watcher.ts rename to packages/viewer/typescript/src/fps-watcher-machine.ts diff --git a/packages/viewer/typescript/src/fps-watcher.ts b/packages/viewer/typescript/src/fps-watcher.ts new file mode 100644 index 00000000..a3c11cf3 --- /dev/null +++ b/packages/viewer/typescript/src/fps-watcher.ts @@ -0,0 +1,82 @@ +import { assign, createMachine, sendParent } from 'xstate'; + +const DEBUG = Boolean(import.meta.env.VITE_DEBUG ?? false); + +const SAMPLE_SIZE = 30; + +const SLOW_FPS = 15; +const FAST_FPS = 30; +const SLOW_FRAME_TIME = 1 / SLOW_FPS; +const FAST_FRAME_TIME = 1 / FAST_FPS; + +const context = { + samples: [] as Array, + average: 0, +}; + +export const fpsWatcher = createMachine( + { + types: {} as { + context: typeof context; + events: { type: 'newSample'; renderTime: number }; + }, + context, + id: 'fpsWatcher', + initial: 'sample', + states: { + sample: { + always: [{ target: 'judge', guard: 'checkEnoughSamples' }], + on: { + newSample: [ + { + actions: [ + assign({ + samples: ({ + event: { renderTime }, + context: { samples }, + }) => [...samples, renderTime], + }), + ], + target: 'sample', + }, + ], + }, + }, + judge: { + entry: [ + assign({ + average: ({ context: { samples } }) => { + const average = samples.reduce((a, b) => a + b) / samples.length; + if (DEBUG) console.log('FPS Watcher Average:', average); + return average; + }, + }), + ], + always: [ + { guard: 'checkSlow', target: 'slow' }, + { guard: 'checkFast', target: 'fast' }, + { target: 'sample' }, + ], + exit: assign({ + samples: () => [], + }), + }, + slow: { + entry: [sendParent({ type: 'slowFps' })], + always: { target: 'sample' }, + }, + fast: { + entry: [sendParent({ type: 'fastFps' })], + always: { target: 'sample' }, + }, + }, + }, + { + guards: { + checkEnoughSamples: ({ context: { samples } }) => + samples.length >= SAMPLE_SIZE, + checkSlow: ({ context: { average } }) => average > SLOW_FRAME_TIME, + checkFast: ({ context: { average } }) => average < FAST_FRAME_TIME, + }, + }, +); diff --git a/packages/viewer/src/view-2d.cy.ts b/packages/viewer/typescript/src/view-2d.cy.ts similarity index 100% rename from packages/viewer/src/view-2d.cy.ts rename to packages/viewer/typescript/src/view-2d.cy.ts diff --git a/packages/viewer/src/view-2d.ts b/packages/viewer/typescript/src/view-2d.ts similarity index 100% rename from packages/viewer/src/view-2d.ts rename to packages/viewer/typescript/src/view-2d.ts diff --git a/packages/viewer/src/view-3d.ts b/packages/viewer/typescript/src/view-3d.ts similarity index 100% rename from packages/viewer/src/view-3d.ts rename to packages/viewer/typescript/src/view-3d.ts diff --git a/packages/viewer/typescript/src/viewer-machine.ts b/packages/viewer/typescript/src/viewer-machine.ts new file mode 100644 index 00000000..e29ecaab --- /dev/null +++ b/packages/viewer/typescript/src/viewer-machine.ts @@ -0,0 +1,129 @@ +import { + ActorRefFrom, + AnyActorLogic, + assertEvent, + assign, + createMachine, + raise, +} from 'xstate'; + +import MultiscaleSpatialImage from '@itk-viewer/io/MultiscaleSpatialImage.js'; +import { viewportMachine } from './viewport-machine.js'; + +type ViewportActor = ActorRefFrom; + +type AddViewportEvent = { + type: 'addViewport'; + name: string; + viewport: ViewportActor; +}; + +type CreateViewport = { + type: 'createViewport'; + logic: AnyActorLogic; +}; + +type SetImageEvent = { + type: 'setImage'; + image: MultiscaleSpatialImage; + name?: string; +}; + +type SendImageToViewports = { + type: 'sendImageToViewports'; + image: MultiscaleSpatialImage; +}; + +type context = { + nextId: string; + viewports: Record>; + images: Record; +}; + +export const viewerMachine = createMachine({ + types: {} as { + context: context; + events: + | AddViewportEvent + | SetImageEvent + | CreateViewport + | SendImageToViewports; + }, + id: 'viewer', + initial: 'active', + context: { + nextId: '0', + viewports: {}, + images: {}, + }, + states: { + active: { + on: { + addViewport: { + actions: assign({ + viewports: ({ + event: { name, viewport }, + context, + }: { + event: AddViewportEvent; + context: context; + }) => ({ + ...context.viewports, + [name]: viewport, + }), + }), + }, + createViewport: { + actions: [ + assign({ + viewports: ({ spawn, event, context }) => { + assertEvent(event, 'createViewport'); + const { logic } = event; + const id = context.nextId; + const view = spawn(logic, { id }); + return { + ...context.viewports, + [id]: view, + }; + }, + nextId: ({ context }) => String(Number(context.nextId) + 1), + }), + ], + }, + setImage: { + actions: [ + assign({ + images: ({ + event: { image, name = 'image' }, + context, + }: { + event: SetImageEvent; + context: context; + }) => ({ + ...context.images, + [name]: image, + }), + }), + raise(({ context }) => ({ + type: 'sendImageToViewports' as const, + image: Object.values(context.images).at(-1)!, + })), + ], + }, + sendImageToViewports: { + actions: [ + ({ context, event }) => { + const { image } = event as SendImageToViewports; + Object.values(context.viewports).forEach((viewport) => { + viewport.send({ + type: 'setImage', + image, + }); + }); + }, + ], + }, + }, + }, + }, +}); diff --git a/packages/viewer/src/viewer.cy.ts b/packages/viewer/typescript/src/viewer.cy.ts similarity index 100% rename from packages/viewer/src/viewer.cy.ts rename to packages/viewer/typescript/src/viewer.cy.ts diff --git a/packages/viewer/src/viewer.ts b/packages/viewer/typescript/src/viewer.ts similarity index 100% rename from packages/viewer/src/viewer.ts rename to packages/viewer/typescript/src/viewer.ts diff --git a/packages/viewer/typescript/src/viewport-machine.ts b/packages/viewer/typescript/src/viewport-machine.ts new file mode 100644 index 00000000..dbb6cf33 --- /dev/null +++ b/packages/viewer/typescript/src/viewport-machine.ts @@ -0,0 +1,158 @@ +import { assign, createMachine, sendParent } from 'xstate'; + +import { MultiscaleSpatialImage } from '@itk-viewer/io/MultiscaleSpatialImage.js'; +import { Camera } from './camera-machine.js'; +import { ReadonlyMat4, vec3 } from 'gl-matrix'; + +type Context = { + image?: MultiscaleSpatialImage; + camera?: Camera; + cameraSubscription?: ReturnType; + resolution: [number, number]; +}; + +type SetImageEvent = { + type: 'setImage'; + image: MultiscaleSpatialImage; +}; + +type SetCameraEvent = { + type: 'setCamera'; + camera: Camera; +}; + +type CameraPoseUpdatedEvent = { + type: 'cameraPoseUpdated'; + pose: ReadonlyMat4; +}; + +export type Events = + | SetImageEvent + | SetCameraEvent + | CameraPoseUpdatedEvent + | { type: 'setResolution'; resolution: [number, number] }; + +export const viewportMachine = createMachine( + { + types: {} as { + context: Context; + events: Events; + }, + id: 'viewport', + initial: 'active', + context: { + image: undefined, + camera: undefined, + cameraSubscription: undefined, + resolution: [0, 0], + }, + states: { + active: { + on: { + setImage: { + actions: [ + assign({ + image: ({ event: { image } }: { event: SetImageEvent }) => + image, + }), + 'sendImageAssigned', + 'resetCameraPose', + ], + }, + setCamera: { + actions: [ + assign({ + camera: ({ event: { camera } }: { event: SetCameraEvent }) => + camera, + }), + 'resetCameraPose', + ({ context, self }) => { + if (context.cameraSubscription) + context.cameraSubscription.unsubscribe(); + + // Let observers of Viewport know that camera has updated + context.cameraSubscription = context.camera?.subscribe( + (cameraState) => { + self.send({ + type: 'cameraPoseUpdated', + pose: cameraState.context.pose, + }); + }, + ); + }, + ], + }, + cameraPoseUpdated: { + actions: ['forwardToParent'], + }, + setResolution: { + actions: [ + assign({ + resolution: ({ event: { resolution } }) => resolution, + }), + 'forwardToParent', + ], + }, + }, + }, + }, + }, + { + actions: { + forwardToParent: sendParent(({ event }) => { + return event; + }), + sendImageAssigned: sendParent(({ event }) => { + const { image } = event as SetImageEvent; + return { type: 'imageAssigned', image }; + }), + resetCameraPose: async ({ context: { image, camera } }) => { + if (!image || !camera) return; + + const { pose: currentPose, verticalFieldOfView } = + camera.getSnapshot().context; + + const bounds = await image.getWorldBounds(image.coarsestScale); + + const center = vec3.fromValues( + (bounds[0] + bounds[1]) / 2.0, + (bounds[2] + bounds[3]) / 2.0, + (bounds[4] + bounds[5]) / 2.0, + ); + + let w1 = bounds[1] - bounds[0]; + let w2 = bounds[3] - bounds[2]; + let w3 = bounds[5] - bounds[4]; + w1 *= w1; + w2 *= w2; + w3 *= w3; + let radius = w1 + w2 + w3; + // If we have just a single point, pick a radius of 1.0 + radius = radius === 0 ? 1.0 : radius; + // compute the radius of the enclosing sphere + radius = Math.sqrt(radius) * 0.5; + + const angle = verticalFieldOfView * (Math.PI / 180); // to radians + const distance = radius / Math.sin(angle * 0.5); + + const forward = [currentPose[8], currentPose[9], currentPose[10]]; + const up = vec3.fromValues( + currentPose[4], + currentPose[5], + currentPose[6], + ); + + const eye = vec3.fromValues( + center[0] + distance * forward[0], + center[1] + distance * forward[1], + center[2] + distance * forward[2], + ); + + camera.send({ + type: 'lookAt', + lookAt: { eye, center: center, up }, + }); + }, + }, + }, +); diff --git a/packages/viewer/src/viewport.cy.ts b/packages/viewer/typescript/src/viewport.cy.ts similarity index 100% rename from packages/viewer/src/viewport.cy.ts rename to packages/viewer/typescript/src/viewport.cy.ts diff --git a/packages/viewer/src/viewport.ts b/packages/viewer/typescript/src/viewport.ts similarity index 100% rename from packages/viewer/src/viewport.ts rename to packages/viewer/typescript/src/viewport.ts diff --git a/packages/viewer/tsconfig.build.json b/packages/viewer/typescript/tsconfig.build.json similarity index 61% rename from packages/viewer/tsconfig.build.json rename to packages/viewer/typescript/tsconfig.build.json index 719193b1..ccca88b1 100644 --- a/packages/viewer/tsconfig.build.json +++ b/packages/viewer/typescript/tsconfig.build.json @@ -1,10 +1,10 @@ { - "extends": "../../tsconfig.build", + "extends": "../../../tsconfig.build", "compilerOptions": { "outDir": "dist", "rootDir": "src", "tsBuildInfoFile": "./dist/tsconfig.build.tsbuildinfo" }, "include": ["./src/*.ts"], - "references": [{ "path": "../io/tsconfig.build.json" }] + "references": [{ "path": "../../io/tsconfig.build.json" }] } diff --git a/packages/vtkjs/tsconfig.build.json b/packages/vtkjs/tsconfig.build.json index 01046e22..c4b0074f 100644 --- a/packages/vtkjs/tsconfig.build.json +++ b/packages/vtkjs/tsconfig.build.json @@ -6,5 +6,5 @@ "tsBuildInfoFile": "./dist/tsconfig.build.tsbuildinfo" }, "include": ["./src/*.ts"], - "references": [{ "path": "../viewer/tsconfig.build.json" }] + "references": [{ "path": "../viewer/typescript/tsconfig.build.json" }] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3e04185d..8886c821 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,7 +19,7 @@ importers: version: 1.9.7 '@typescript-eslint/eslint-plugin': specifier: ^6.16.0 - version: 6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3) + version: 6.17.0(@typescript-eslint/parser@6.17.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': specifier: ^6.16.0 version: 6.17.0(eslint@8.56.0)(typescript@5.3.3) @@ -52,10 +52,10 @@ importers: version: 5.3.3 vite: specifier: ^4.4.11 - version: 4.4.11 + version: 4.4.11(@types/node@20.11.0)(terser@5.26.0) vite-plugin-static-copy: specifier: ^0.17.0 - version: 0.17.0(vite@4.4.11) + version: 0.17.0(vite@4.4.11(@types/node@20.11.0)(terser@5.26.0)) packages/arcball: dependencies: @@ -92,7 +92,7 @@ importers: version: link:../utils '@itk-viewer/viewer': specifier: workspace:^ - version: link:../viewer + version: link:../viewer/typescript '@itk-viewer/vtkjs': specifier: workspace:^ version: link:../vtkjs @@ -117,19 +117,19 @@ importers: devDependencies: '@itk-wasm/image-io': specifier: ^1.1.1 - version: 1.1.1 + version: 1.2.0 '@material/web': specifier: ^1.3.0 - version: 1.3.0 + version: 1.4.1 typescript: specifier: ^5.3.3 version: 5.3.3 vite: specifier: ^4.4.11 - version: 4.4.11 + version: 4.4.11(@types/node@20.11.0)(terser@5.26.0) vite-plugin-static-copy: specifier: ^0.17.0 - version: 0.17.0(vite@4.4.11) + version: 0.17.0(vite@4.4.11(@types/node@20.11.0)(terser@5.26.0)) packages/icons: devDependencies: @@ -150,7 +150,7 @@ importers: version: link:../io '@itk-viewer/viewer': specifier: workspace:^ - version: link:../viewer + version: link:../viewer/typescript imjoy-rpc: specifier: ^0.5.44 version: 0.5.46 @@ -163,10 +163,10 @@ importers: version: 5.3.3 vite: specifier: ^4.4.11 - version: 4.4.11 + version: 4.4.11(@types/node@20.11.0)(terser@5.26.0) vite-plugin-static-copy: specifier: ^0.17.0 - version: 0.17.0(vite@4.4.11) + version: 0.17.0(vite@4.4.11(@types/node@20.11.0)(terser@5.26.0)) packages/io: dependencies: @@ -197,7 +197,7 @@ importers: devDependencies: '@itk-wasm/image-io': specifier: ^1.1.1 - version: 1.1.1 + version: 1.2.0 typescript: specifier: ^5.3.3 version: 5.3.3 @@ -212,7 +212,7 @@ importers: version: link:../utils '@itk-viewer/viewer': specifier: workspace:^ - version: link:../viewer + version: link:../viewer/typescript '@itk-wasm/htj2k': specifier: 2.1.0 version: 2.1.0 @@ -231,13 +231,13 @@ importers: version: 5.3.3 vite: specifier: ^5.0.10 - version: 5.0.10 + version: 5.0.10(@types/node@20.11.0)(terser@5.26.0) packages/transfer-function-editor: devDependencies: '@vitest/ui': specifier: ^1.0.4 - version: 1.0.4(vitest@1.0.4) + version: 1.2.2(vitest@1.2.2) happy-dom: specifier: ^12.10.3 version: 12.10.3 @@ -252,23 +252,23 @@ importers: version: 5.3.3 vite: specifier: ^5.0.8 - version: 5.0.10 + version: 5.0.10(@types/node@20.11.0)(terser@5.26.0) vitest: specifier: ^1.0.4 - version: 1.0.4(@vitest/ui@1.0.4)(happy-dom@12.10.3) + version: 1.2.2(@types/node@20.11.0)(@vitest/ui@1.2.2)(happy-dom@12.10.3)(terser@5.26.0) vitest-canvas-mock: specifier: ^0.3.3 - version: 0.3.3(vitest@1.0.4) + version: 0.3.3(vitest@1.2.2(@types/node@20.11.0)(@vitest/ui@1.2.2)(happy-dom@12.10.3)(terser@5.26.0)) packages/transfer-function-editor/examples/vtk-js: dependencies: '@kitware/vtk.js': specifier: ^29.2.0 - version: 29.3.0(@babel/preset-env@7.24.5)(autoprefixer@10.4.19)(webpack@5.91.0)(wslink@1.12.4) + version: 29.3.1(@babel/preset-env@7.23.8(@babel/core@7.23.7))(autoprefixer@10.4.16(postcss@8.4.33))(webpack@5.89.0)(wslink@1.12.4) devDependencies: vite: specifier: ^5.0.8 - version: 5.0.10 + version: 5.0.10(@types/node@20.11.0)(terser@5.26.0) packages/utils: dependencies: @@ -280,14 +280,14 @@ importers: specifier: ^5.3.3 version: 5.3.3 - packages/viewer: + packages/viewer/typescript: dependencies: '@itk-viewer/io': specifier: workspace:^ - version: link:../io + version: link:../../io '@itk-viewer/utils': specifier: workspace:^ - version: link:../utils + version: link:../../utils gl-matrix: specifier: ^3.4.3 version: 3.4.3 @@ -300,7 +300,7 @@ importers: version: 5.3.3 vite: specifier: ^5.0.10 - version: 5.0.10 + version: 5.0.10(@types/node@20.11.0)(terser@5.26.0) packages/vtkjs: dependencies: @@ -309,10 +309,10 @@ importers: version: link:../io '@itk-viewer/viewer': specifier: workspace:^ - version: link:../viewer + version: link:../viewer/typescript '@kitware/vtk.js': specifier: ^30.4.1 - version: 30.4.1(@babel/preset-env@7.24.5)(autoprefixer@10.4.19)(webpack@5.91.0)(wslink@2.0.2) + version: 30.5.0(@babel/preset-env@7.23.8(@babel/core@7.23.7))(autoprefixer@10.4.16(postcss@8.4.33))(webpack@5.89.0)(wslink@1.12.4) gl-matrix: specifier: ^3.4.3 version: 3.4.3 @@ -328,7 +328,7 @@ importers: version: 5.3.3 vite: specifier: ^5.0.10 - version: 5.0.10 + version: 5.0.10(@types/node@20.11.0)(terser@5.26.0) packages: @@ -357,8 +357,8 @@ packages: '@actions/tool-cache@2.0.1': resolution: {integrity: sha512-iPU+mNwrbA8jodY8eyo/0S/QqCKDajiR8OxWTnSk/SnYg0sj8Hp4QcUEVC1YFpHWXtrfbQrE13Jz4k4HXJQKcA==} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + '@ampproject/remapping@2.2.1': + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} '@azure/abort-controller@1.1.0': @@ -400,24 +400,24 @@ packages: resolution: {integrity: sha512-jz33rUSUGUB65FgYrTRgRDjG6hdPHwfvHe+g/UrwVG8MsyLqSxg9TaW7Yuhjxu1v1OZ5xam2NU6+IpCN0xJO8Q==} engines: {node: '>=14.0.0'} - '@babel/code-frame@7.23.5': - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + '@babel/code-frame@7.22.13': + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} - '@babel/code-frame@7.24.2': - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + '@babel/code-frame@7.23.5': + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.24.4': - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + '@babel/compat-data@7.23.5': + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} - '@babel/core@7.24.5': - resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + '@babel/core@7.23.7': + resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.24.5': - resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + '@babel/generator@7.23.6': + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.22.5': @@ -432,8 +432,8 @@ packages: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.24.5': - resolution: {integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==} + '@babel/helper-create-class-features-plugin@7.23.7': + resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -444,8 +444,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.2': - resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + '@babel/helper-define-polyfill-provider@0.4.4': + resolution: {integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -461,16 +461,16 @@ packages: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.24.5': - resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} + '@babel/helper-member-expression-to-functions@7.23.0': + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.3': - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + '@babel/helper-module-imports@7.22.15': + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.24.5': - resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + '@babel/helper-module-transforms@7.23.3': + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -479,8 +479,8 @@ packages: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.24.5': - resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + '@babel/helper-plugin-utils@7.22.5': + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} '@babel/helper-remap-async-to-generator@7.22.20': @@ -489,81 +489,71 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.24.1': - resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + '@babel/helper-replace-supers@7.22.20': + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.24.5': - resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} + '@babel/helper-simple-access@7.22.5': + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} '@babel/helper-skip-transparent-expression-wrappers@7.22.5': resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.24.5': - resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + '@babel/helper-split-export-declaration@7.22.6': + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.1': - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + '@babel/helper-string-parser@7.23.4': + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.22.20': resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.5': - resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.23.5': resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.24.5': - resolution: {integrity: sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==} + '@babel/helper-wrap-function@7.22.20': + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.5': - resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} + '@babel/helpers@7.23.8': + resolution: {integrity: sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.23.4': - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + '@babel/highlight@7.22.13': + resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.5': - resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} + '@babel/highlight@7.23.4': + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.5': - resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + '@babel/parser@7.23.6': + resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5': - resolution: {integrity: sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3': + resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1': - resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1': - resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3': + resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1': - resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7': + resolution: {integrity: sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -600,14 +590,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.24.1': - resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} + '@babel/plugin-syntax-import-assertions@7.23.3': + resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.24.1': - resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} + '@babel/plugin-syntax-import-attributes@7.23.3': + resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -670,152 +660,152 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.24.1': - resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} + '@babel/plugin-transform-arrow-functions@7.23.3': + resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.24.3': - resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} + '@babel/plugin-transform-async-generator-functions@7.23.7': + resolution: {integrity: sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.24.1': - resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} + '@babel/plugin-transform-async-to-generator@7.23.3': + resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.24.1': - resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} + '@babel/plugin-transform-block-scoped-functions@7.23.3': + resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.24.5': - resolution: {integrity: sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==} + '@babel/plugin-transform-block-scoping@7.23.4': + resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.24.1': - resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} + '@babel/plugin-transform-class-properties@7.23.3': + resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.24.4': - resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} + '@babel/plugin-transform-class-static-block@7.23.4': + resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.24.5': - resolution: {integrity: sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==} + '@babel/plugin-transform-classes@7.23.8': + resolution: {integrity: sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.24.1': - resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} + '@babel/plugin-transform-computed-properties@7.23.3': + resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.24.5': - resolution: {integrity: sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==} + '@babel/plugin-transform-destructuring@7.23.3': + resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.24.1': - resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} + '@babel/plugin-transform-dotall-regex@7.23.3': + resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.24.1': - resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} + '@babel/plugin-transform-duplicate-keys@7.23.3': + resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dynamic-import@7.24.1': - resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} + '@babel/plugin-transform-dynamic-import@7.23.4': + resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.24.1': - resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} + '@babel/plugin-transform-exponentiation-operator@7.23.3': + resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.24.1': - resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} + '@babel/plugin-transform-export-namespace-from@7.23.4': + resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.24.1': - resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} + '@babel/plugin-transform-for-of@7.23.6': + resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.24.1': - resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} + '@babel/plugin-transform-function-name@7.23.3': + resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.24.1': - resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} + '@babel/plugin-transform-json-strings@7.23.4': + resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.24.1': - resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} + '@babel/plugin-transform-literals@7.23.3': + resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.24.1': - resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} + '@babel/plugin-transform-logical-assignment-operators@7.23.4': + resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.24.1': - resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} + '@babel/plugin-transform-member-expression-literals@7.23.3': + resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.24.1': - resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} + '@babel/plugin-transform-modules-amd@7.23.3': + resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.24.1': - resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + '@babel/plugin-transform-modules-commonjs@7.23.3': + resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.24.1': - resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} + '@babel/plugin-transform-modules-systemjs@7.23.3': + resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.24.1': - resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} + '@babel/plugin-transform-modules-umd@7.23.3': + resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -826,140 +816,140 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.24.1': - resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} + '@babel/plugin-transform-new-target@7.23.3': + resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.1': - resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} + '@babel/plugin-transform-nullish-coalescing-operator@7.23.4': + resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.24.1': - resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} + '@babel/plugin-transform-numeric-separator@7.23.4': + resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.24.5': - resolution: {integrity: sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==} + '@babel/plugin-transform-object-rest-spread@7.23.4': + resolution: {integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.24.1': - resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} + '@babel/plugin-transform-object-super@7.23.3': + resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.24.1': - resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} + '@babel/plugin-transform-optional-catch-binding@7.23.4': + resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.24.5': - resolution: {integrity: sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==} + '@babel/plugin-transform-optional-chaining@7.23.4': + resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.24.5': - resolution: {integrity: sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==} + '@babel/plugin-transform-parameters@7.23.3': + resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.24.1': - resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} + '@babel/plugin-transform-private-methods@7.23.3': + resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.24.5': - resolution: {integrity: sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==} + '@babel/plugin-transform-private-property-in-object@7.23.4': + resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.24.1': - resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} + '@babel/plugin-transform-property-literals@7.23.3': + resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.24.1': - resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} + '@babel/plugin-transform-regenerator@7.23.3': + resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-reserved-words@7.24.1': - resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} + '@babel/plugin-transform-reserved-words@7.23.3': + resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.24.1': - resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} + '@babel/plugin-transform-shorthand-properties@7.23.3': + resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.24.1': - resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} + '@babel/plugin-transform-spread@7.23.3': + resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.24.1': - resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} + '@babel/plugin-transform-sticky-regex@7.23.3': + resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.24.1': - resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} + '@babel/plugin-transform-template-literals@7.23.3': + resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.24.5': - resolution: {integrity: sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==} + '@babel/plugin-transform-typeof-symbol@7.23.3': + resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.24.1': - resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} + '@babel/plugin-transform-unicode-escapes@7.23.3': + resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.24.1': - resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} + '@babel/plugin-transform-unicode-property-regex@7.23.3': + resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.24.1': - resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} + '@babel/plugin-transform-unicode-regex@7.23.3': + resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.24.1': - resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} + '@babel/plugin-transform-unicode-sets-regex@7.23.3': + resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.24.5': - resolution: {integrity: sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==} + '@babel/preset-env@7.23.8': + resolution: {integrity: sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -976,24 +966,20 @@ packages: resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.23.9': - resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} - engines: {node: '>=6.9.0'} - - '@babel/runtime@7.24.5': - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} + '@babel/runtime@7.23.8': + resolution: {integrity: sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==} engines: {node: '>=6.9.0'} - '@babel/template@7.24.0': - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + '@babel/template@7.22.15': + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.5': - resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} + '@babel/traverse@7.23.7': + resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.5': - resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} + '@babel/types@7.23.6': + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} engines: {node: '>=6.9.0'} '@changesets/apply-release-plan@7.0.0': @@ -1395,44 +1381,44 @@ packages: '@itk-wasm/htj2k@2.1.0': resolution: {integrity: sha512-22+mWgXr/LYRCqzzfIJ5il5bgYdJjPD5jiP4XXPvSgCjp48bui5zvZSkvMmXy89bJbVinUB1O6KHuB3K0MUong==} - '@itk-wasm/image-io@1.1.1': - resolution: {integrity: sha512-AVybK3JCh4nUud5nCB7H0RHkUbjQ36iQT2z1MGibX1f763xYOfge3ZNrKdm0bZ+aMUVB4SDEo4iBN0IOh2GQGg==} + '@itk-wasm/image-io@1.2.0': + resolution: {integrity: sha512-BljHiUWdYCBUzsVTqZDdmECCGs6vhkVqMg6C4uXv3O/bHAPyWX8tcvXOguLprwXYDiv/xddIGFTC5pjs6U+2LA==} '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + '@jridgewell/gen-mapping@0.3.3': + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + '@jridgewell/resolve-uri@3.1.1': + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + '@jridgewell/set-array@1.1.2': + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/source-map@0.3.5': + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.20': + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} - '@kitware/vtk.js@29.3.0': - resolution: {integrity: sha512-EofIxo6Qcfhh8SRx8Xp7B8HGM//2tzjQbhrMQsiaoPgs3yhtrqm+CBFmqboxt+waF8qUKxuUQb+DzM8cX2ivAg==} + '@kitware/vtk.js@29.3.1': + resolution: {integrity: sha512-TM3uBVwJWdMIU+VD+OnSxQU45lJiJiOxxkx56Du6K4d18u5fHi7nBkSlNhTtOCX5H8amwIofaPCKRnYRNkjosA==} hasBin: true peerDependencies: '@babel/preset-env': ^7.17.10 autoprefixer: ^10.4.7 wslink: ^1.1.0 - '@kitware/vtk.js@30.4.1': - resolution: {integrity: sha512-jBJFm8AyWpJjNFFBadXyvBwegdD9M6WRdxmIb+x/MVpCyA5lEZSMemhiMn71oKsznaEe5Pjv2VDVJWmwK0vhUg==} + '@kitware/vtk.js@30.5.0': + resolution: {integrity: sha512-mLXmFv/xou2KQ+JgK3s+G/5aMfBUeuFrr8jSJDvOhFvKn+Vcah9rfnTedmF7O1UMSvxYqiQvYSMGhrkNAO6bJA==} hasBin: true peerDependencies: '@babel/preset-env': ^7.17.10 @@ -1454,8 +1440,8 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@material/web@1.3.0': - resolution: {integrity: sha512-yUqF35yygXreiPXQneD3l210UoSMlbgHZrJ0V1dUiEizGpWfVmuAKp9LnLnV/Qx5MhJlNOZddsGJOGR9lU8R/w==} + '@material/web@1.4.1': + resolution: {integrity: sha512-17MZA6Bt7ie6uDc5cVEGtm6frQfm7ASLGVJhJuYJ0W2Fs7Zogd8wJ3ExoYU8jyzv8LEXcfvnZKcvr8dlquGsig==} '@msgpack/msgpack@2.8.0': resolution: {integrity: sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==} @@ -1720,14 +1706,17 @@ packages: '@thewtex/zstddec@0.2.0': resolution: {integrity: sha512-lIS+smrfa48WGlDVQSQSm0jBnwVp5XmfGJWU9q0J0fRFY9ohzK4s27Zg2SFMb1NWMp9RiANAdK+/q86EBGWR1Q==} + '@thewtex/zstddec@0.2.1': + resolution: {integrity: sha512-1yTu7m/qU1nsJy4mCZAB3GAhczsClhw+WIXK0oe598eHcvefH16WLOYN4Uko7K2/Ttz9KEBvvT7WFrZD41ShgA==} + '@types/emscripten@1.39.10': resolution: {integrity: sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==} '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - '@types/eslint@8.56.10': - resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + '@types/eslint@8.56.2': + resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -1750,11 +1739,11 @@ packages: '@types/node@18.19.4': resolution: {integrity: sha512-xNzlUhzoHotIsnFoXmJB+yWmBvFZgKCI9TtPIEdYIMM1KWfwuY8zh7wvc1u1OAXlC7dlf6mZVx/s+Y5KfFz19A==} - '@types/node@20.11.9': - resolution: {integrity: sha512-CQXNuMoS/VcoAMISe5pm4JnEd1Br5jildbQEToEMQvutmv+EaQr90ry9raiudgpyDuqFiV9e4rnjSfLNq12M5w==} + '@types/node@20.11.0': + resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==} - '@types/node@20.12.10': - resolution: {integrity: sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==} + '@types/node@20.5.7': + resolution: {integrity: sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==} '@types/normalize-package-data@2.4.1': resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -1777,14 +1766,11 @@ packages: '@types/tunnel@0.0.3': resolution: {integrity: sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==} - '@types/webxr@0.5.16': - resolution: {integrity: sha512-0E0Cl84FECtzrB4qG19TNTqpunw0F1YF0QZZnFMF6pDw1kNKJtrlTKlVB34stGIsHbZsYQ7H0tNjPfZftkHHoA==} - '@types/webxr@0.5.7': resolution: {integrity: sha512-Rcgs5c2eNFnHp53YOjgtKfl/zWX1Y+uFGUwlSXrWcZWu3yhANRezmph4MninmqybUYT6g9ZE0aQ9QIdPkLR3Kg==} - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@types/yauzl@2.10.1': + resolution: {integrity: sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw==} '@typescript-eslint/eslint-plugin@6.17.0': resolution: {integrity: sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ==} @@ -1847,31 +1833,31 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitest/expect@1.0.4': - resolution: {integrity: sha512-/NRN9N88qjg3dkhmFcCBwhn/Ie4h064pY3iv7WLRsDJW7dXnEgeoa8W9zy7gIPluhz6CkgqiB3HmpIXgmEY5dQ==} + '@vitest/expect@1.2.2': + resolution: {integrity: sha512-3jpcdPAD7LwHUUiT2pZTj2U82I2Tcgg2oVPvKxhn6mDI2On6tfvPQTjAI4628GUGDZrCm4Zna9iQHm5cEexOAg==} - '@vitest/runner@1.0.4': - resolution: {integrity: sha512-rhOQ9FZTEkV41JWXozFM8YgOqaG9zA7QXbhg5gy6mFOVqh4PcupirIJ+wN7QjeJt8S8nJRYuZH1OjJjsbxAXTQ==} + '@vitest/runner@1.2.2': + resolution: {integrity: sha512-JctG7QZ4LSDXr5CsUweFgcpEvrcxOV1Gft7uHrvkQ+fsAVylmWQvnaAr/HDp3LAH1fztGMQZugIheTWjaGzYIg==} - '@vitest/snapshot@1.0.4': - resolution: {integrity: sha512-vkfXUrNyNRA/Gzsp2lpyJxh94vU2OHT1amoD6WuvUAA12n32xeVZQ0KjjQIf8F6u7bcq2A2k969fMVxEsxeKYA==} + '@vitest/snapshot@1.2.2': + resolution: {integrity: sha512-SmGY4saEw1+bwE1th6S/cZmPxz/Q4JWsl7LvbQIky2tKE35US4gd0Mjzqfr84/4OD0tikGWaWdMja/nWL5NIPA==} - '@vitest/spy@1.0.4': - resolution: {integrity: sha512-9ojTFRL1AJVh0hvfzAQpm0QS6xIS+1HFIw94kl/1ucTfGCaj1LV/iuJU4Y6cdR03EzPDygxTHwE1JOm+5RCcvA==} + '@vitest/spy@1.2.2': + resolution: {integrity: sha512-k9Gcahssw8d7X3pSLq3e3XEu/0L78mUkCjivUqCQeXJm9clfXR/Td8+AP+VC1O6fKPIDLcHDTAmBOINVuv6+7g==} - '@vitest/ui@1.0.4': - resolution: {integrity: sha512-gd4p6e7pjukSe4joWS5wpnm/JcEfzCZUYkYWQOORqJK1mDJ0MOaXa/9BbPOEVO5TcvdnKvFJUdJpFHnqoyYwZA==} + '@vitest/ui@1.2.2': + resolution: {integrity: sha512-CG+5fa8lyoBr+9i+UZGS31Qw81v33QlD10uecHxN2CLJVN+jLnqx4pGzGvFFeJ7jSnUCT0AlbmVWY6fU6NJZmw==} peerDependencies: vitest: ^1.0.0 - '@vitest/utils@1.0.4': - resolution: {integrity: sha512-gsswWDXxtt0QvtK/y/LWukN7sGMYmnCcv1qv05CsY6cU/Y1zpGX1QuvLs+GO1inczpE6Owixeel3ShkjhYtGfA==} + '@vitest/utils@1.2.2': + resolution: {integrity: sha512-WKITBHLsBHlpjnDQahr+XK6RE7MiAsgrIkr0pGhQ9ygoxBfUeG0lUG5iLlzqjmKSlBv3+j5EGsriBzh+C3Tq9g==} '@web3-storage/car-block-validator@1.2.0': resolution: {integrity: sha512-KKQ/M5WtpH/JlkX+bQYKzdG4azmSF495T7vpewje2xh7MBh1d94/BLblxCcLM/larWvXDxOkbAyTTdlECAAuUw==} - '@webassemblyjs/ast@1.12.1': - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + '@webassemblyjs/ast@1.11.6': + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} '@webassemblyjs/floating-point-hex-parser@1.11.6': resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} @@ -1879,8 +1865,8 @@ packages: '@webassemblyjs/helper-api-error@1.11.6': resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - '@webassemblyjs/helper-buffer@1.12.1': - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + '@webassemblyjs/helper-buffer@1.11.6': + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} '@webassemblyjs/helper-numbers@1.11.6': resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} @@ -1888,8 +1874,8 @@ packages: '@webassemblyjs/helper-wasm-bytecode@1.11.6': resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - '@webassemblyjs/helper-wasm-section@1.12.1': - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + '@webassemblyjs/helper-wasm-section@1.11.6': + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} '@webassemblyjs/ieee754@1.11.6': resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} @@ -1900,20 +1886,20 @@ packages: '@webassemblyjs/utf8@1.11.6': resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - '@webassemblyjs/wasm-edit@1.12.1': - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + '@webassemblyjs/wasm-edit@1.11.6': + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} - '@webassemblyjs/wasm-gen@1.12.1': - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + '@webassemblyjs/wasm-gen@1.11.6': + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} - '@webassemblyjs/wasm-opt@1.12.1': - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + '@webassemblyjs/wasm-opt@1.11.6': + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} - '@webassemblyjs/wasm-parser@1.12.1': - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + '@webassemblyjs/wasm-parser@1.11.6': + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} - '@webassemblyjs/wast-printer@1.12.1': - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + '@webassemblyjs/wast-printer@1.11.6': + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -1943,6 +1929,11 @@ packages: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} + acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + acorn@8.11.3: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} @@ -2072,8 +2063,8 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - autoprefixer@10.4.19: - resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + autoprefixer@10.4.16: + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -2092,18 +2083,18 @@ packages: axios@1.6.3: resolution: {integrity: sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==} - babel-plugin-polyfill-corejs2@0.4.11: - resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + babel-plugin-polyfill-corejs2@0.4.7: + resolution: {integrity: sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.10.4: - resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + babel-plugin-polyfill-corejs3@0.8.7: + resolution: {integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.2: - resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + babel-plugin-polyfill-regenerator@0.5.4: + resolution: {integrity: sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -2158,8 +2149,8 @@ packages: breakword@1.0.6: resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2204,8 +2195,8 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - caniuse-lite@1.0.30001616: - resolution: {integrity: sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw==} + caniuse-lite@1.0.30001576: + resolution: {integrity: sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==} cardinal@2.1.1: resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} @@ -2214,8 +2205,8 @@ packages: caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - cborg@4.1.1: - resolution: {integrity: sha512-XBEXWdr1N0pjAX0l2a+BKmWGIMDYoLrrqgAWWETtaqn3HC4zn0dZoNO8vC+8oDZfDLMyVRfRD3kMuoYgT67KBQ==} + cborg@4.2.0: + resolution: {integrity: sha512-q6cFW5m3KxfP/9xGI3yGLaC1l5DP6DWM9IvjiJojnIwohL5CQDl02EXViPV852mOfQo+7PJGPN01MI87vFGzyA==} hasBin: true chai@4.4.1: @@ -2376,8 +2367,8 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - core-js-compat@3.37.0: - resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} + core-js-compat@3.35.0: + resolution: {integrity: sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==} core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -2529,18 +2520,10 @@ packages: defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -2577,8 +2560,8 @@ packages: ecc-jsbn@0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - electron-to-chromium@1.4.757: - resolution: {integrity: sha512-jftDaCknYSSt/+KKeXzH3LX5E2CvRLm75P3Hj+J/dv3CL0qUYcOt13d5FN1NiL5IJbbhzHrb3BomeG2tkSlZmw==} + electron-to-chromium@1.4.628: + resolution: {integrity: sha512-2k7t5PHvLsufpP6Zwk0nof62yLOsCf032wZx7/q0mv8gwlXjhcxI3lz6f0jBr0GrnWKcm3burXzI3t5IrcdUxw==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2603,8 +2586,8 @@ packages: resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} engines: {node: '>=10.0.0'} - enhanced-resolve@5.16.0: - resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} engines: {node: '>=10.13.0'} enquirer@2.4.1: @@ -2629,16 +2612,8 @@ packages: resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} engines: {node: '>= 0.4'} - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-module-lexer@1.5.2: - resolution: {integrity: sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==} + es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} @@ -2665,10 +2640,6 @@ packages: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -2723,6 +2694,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -2945,6 +2919,9 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -2969,10 +2946,6 @@ packages: get-intrinsic@1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - get-stream@2.3.1: resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} engines: {node: '>=0.10.0'} @@ -3048,10 +3021,6 @@ packages: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -3104,17 +3073,10 @@ packages: has-property-descriptors@1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} @@ -3131,10 +3093,6 @@ packages: resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} engines: {node: '>= 0.4'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - hook-std@3.0.0: resolution: {integrity: sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3257,8 +3215,8 @@ packages: ipfs-unixfs-exporter@13.5.0: resolution: {integrity: sha512-s1eWXzoyhQFNEAB1p+QE3adjhW+lBdgpORmmjiCLiruHs5z7T5zsAgRVcWpM8LWYhq2flRtJHObb7Hg73J+oLQ==} - ipfs-unixfs@11.1.3: - resolution: {integrity: sha512-sy6Koojwm/EcM8yvDlycRYA89C8wIcLcGTMMpqnCPUtqTCdl+JxsuPNCBgAu7tmO8Nipm7Tv7f0g/erxTGKKRA==} + ipfs-unixfs@11.1.4: + resolution: {integrity: sha512-RE4nyx5qgG2w7JOLj0Y0D7SfAR1ZkEdramNaBx0OSD4DlQ2Y2NORgc4FHfej3Pgy31v+QISDVP1pQJhdv3bUUg==} is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} @@ -3415,23 +3373,23 @@ packages: resolution: {integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==} engines: {node: '>=10.13'} - it-filter@3.0.4: - resolution: {integrity: sha512-e0sz+st4sudK/zH6GZ/gRTRP8A/ADuJFCYDmRgMbZvR79y5+v4ZXav850bBZk5wL9zXaYZFxS1v/6Qi+Vjwh5g==} + it-filter@3.1.0: + resolution: {integrity: sha512-FiYuzdsUhmMZJTJQ8YLdgX3ArjQmAtCG1lyrtZd+92/2eC6YO9UoybdrwVj/yyZkuXAPykrSipLuZ+KSKpt29A==} - it-last@3.0.4: - resolution: {integrity: sha512-Ns+KTsQWhs0KCvfv5X3Ck3lpoYxHcp4zUp4d+AOdmC8cXXqDuoZqAjfWhgCbxJubXyIYWdfE2nRcfWqgvZHP8Q==} + it-last@3.0.6: + resolution: {integrity: sha512-M4/get95O85u2vWvWQinF8SJUc/RPC5bWTveBTYXvlP2q5TF9Y+QhT3nz+CRCyS2YEc66VJkyl/da6WrJ0wKhw==} - it-map@3.0.5: - resolution: {integrity: sha512-hB0TDXo/h4KSJJDSRLgAPmDroiXP6Fx1ck4Bzl3US9hHfZweTKsuiP0y4gXuTMcJlS6vj0bb+f70rhkD47ZA3w==} + it-map@3.1.0: + resolution: {integrity: sha512-B7zNmHYRE0qes8oTiNYU7jXEF5WvKZNAUosskCks1JT9Z4DNwRClrQyd+C/hgITG8ewDbVZMGx9VXAx3KMY2kA==} - it-merge@3.0.3: - resolution: {integrity: sha512-FYVU15KC5pb/GQX1Ims+lee8d4pdqGVCpWr0lkNj8o4xuNo7jY71k6GuEiWdP+T7W1bJqewSxX5yoTy5yZpRVA==} + it-merge@3.0.5: + resolution: {integrity: sha512-2l7+mPf85pyRF5pqi0dKcA54E5Jm/2FyY5GsOaN51Ta0ipC7YZ3szuAsH8wOoB6eKY4XsU4k2X+mzPmFBMayEA==} - it-parallel@3.0.6: - resolution: {integrity: sha512-i7UM7I9LTkDJw3YIqXHFAPZX6CWYzGc+X3irdNrVExI4vPazrJdI7t5OqrSVN8CONXLAunCiqaSV/zZRbQR56A==} + it-parallel@3.0.7: + resolution: {integrity: sha512-aIIc2t8knfER/mQu4uEHaAYZrnj/2Tdp+Vj6BA94Gi7xghx1kblvpyrLkCYO9K+eDyPS1cE3Vfhh9a20MEmzXA==} - it-peekable@3.0.3: - resolution: {integrity: sha512-Wx21JX/rMzTEl9flx3DGHuPV1KQFGOl8uoKfQtmZHgPQtGb89eQ6RyVd82h3HuP9Ghpt0WgBDlmmdWeHXqyx7w==} + it-peekable@3.0.4: + resolution: {integrity: sha512-Bb4xyMX5xAveFyh9ySbCrHMCpIF0+fIbl+0ZkcxP94JVofLe5j/mSBK0gjrrISsSVURVyey8X4L/IqrekOxjiA==} it-pipe@3.0.1: resolution: {integrity: sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==} @@ -3448,8 +3406,8 @@ packages: resolution: {integrity: sha512-yrt0uRukqI9Q5s9HhzArxMNYvyU5CMbI1ddGzH0A4O3JWscnJug7J0RtY+RTl6nTHcqdrppNH7IRbnTXLZ79Rg==} hasBin: true - itk-wasm@1.0.0-b.171: - resolution: {integrity: sha512-5V3L7bSCtuOTTvZdc5l6/oWHHwpgbhgNLP0sAXtV7OnP52d9Q6lH2JtX4osTle43EoqPSych6o7A0S/zu1ajnw==} + itk-wasm@1.0.0-b.175: + resolution: {integrity: sha512-6vhMXur95FwAkd7XyvH39VWAXyAK6DCKb1SWPvhcKwDYGdpqyLZtfWs0qQp0BkyLMLBuCOD4sxA7ENcvZZpWCg==} hasBin: true jackspeak@2.3.6: @@ -4001,8 +3959,8 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - p-defer@4.0.0: - resolution: {integrity: sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==} + p-defer@4.0.1: + resolution: {integrity: sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==} engines: {node: '>=12'} p-each-series@3.0.0: @@ -4193,8 +4151,8 @@ packages: resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} engines: {node: ^10 || ^12 || >=14} - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + postcss@8.4.33: + resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} engines: {node: ^10 || ^12 || >=14} preferred-pm@3.0.3: @@ -4237,8 +4195,8 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - protobufjs@7.2.6: - resolution: {integrity: sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==} + protobufjs@7.3.0: + resolution: {integrity: sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==} engines: {node: '>=12.0.0'} protons-runtime@5.4.0: @@ -4340,6 +4298,9 @@ packages: regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -4576,10 +4537,6 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -4766,8 +4723,8 @@ packages: uglify-js: optional: true - terser@5.31.0: - resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} + terser@5.26.0: + resolution: {integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==} engines: {node: '>=10'} hasBin: true @@ -4907,8 +4864,8 @@ packages: resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} engines: {node: '>=14.16'} - type-fest@4.10.2: - resolution: {integrity: sha512-anpAG63wSpdEbLwOqH8L84urkL6PiVIov3EMmgIhhThevh9aiMQov+6Btx0wldNcvm4wV+e2/Rt1QdDwKHFbHw==} + type-fest@4.10.1: + resolution: {integrity: sha512-7ZnJYTp6uc04uYRISWtiX3DSKB/fxNQT0B5o1OUeCqiQiwF+JC9+rJiZIDrPrNCLLuTqyQmh4VdQqh/ZOkv9MQ==} engines: {node: '>=16'} typed-array-buffer@1.0.0: @@ -4948,8 +4905,8 @@ packages: uint8arrays@3.1.1: resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} - uint8arrays@5.0.2: - resolution: {integrity: sha512-S0GaeR+orZt7LaqzTRs4ZP8QqzAauJ+0d4xvP2lJTA99jIkKsE2FgDs4tGF/K/z5O9I/2W5Yvrh7IuqNeYH+0Q==} + uint8arrays@5.1.0: + resolution: {integrity: sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==} unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} @@ -5015,8 +4972,8 @@ packages: resolution: {integrity: sha512-bOgQLUnd2G5rhzaTvh1VCI9Fo6bC5cLTpH17T5aFfamyXFYDbbdzN6IXdeoc3jBS7T9hNTmJtYUzJCJ2Xlc9gA==} engines: {node: '>=16'} - update-browserslist-db@1.0.15: - resolution: {integrity: sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==} + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -5053,8 +5010,8 @@ packages: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} - vite-node@1.0.4: - resolution: {integrity: sha512-9xQQtHdsz5Qn8hqbV7UKqkm8YkJhzT/zr41Dmt5N7AlD8hJXw/Z7y0QiD5I8lnTthV9Rvcvi0QW7PI0Fq83ZPg==} + vite-node@1.2.2: + resolution: {integrity: sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -5125,8 +5082,8 @@ packages: peerDependencies: vitest: '*' - vitest@1.0.4: - resolution: {integrity: sha512-s1GQHp/UOeWEo4+aXDOeFBJwFzL6mjycbQwwKWX2QcYfh/7tIerS59hWQ20mxzupTJluA2SdwiBuWwQHH67ckg==} + vitest@1.2.2: + resolution: {integrity: sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5153,8 +5110,8 @@ packages: wasm-feature-detect@1.6.1: resolution: {integrity: sha512-R1i9ED8UlLu/foILNB1ck9XS63vdtqU/tP1MCugVekETp/ySCrBZRk5I/zI67cI1wlQYeSonNm1PLjDHZDNg6g==} - watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} wcwidth@1.0.1: @@ -5171,8 +5128,8 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - webpack@5.91.0: - resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} + webpack@5.89.0: + resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -5267,9 +5224,6 @@ packages: wslink@1.12.4: resolution: {integrity: sha512-4AJtHZ0qtBa7zOp0e3R5OJxQ6HY9eo+jDPcjms6E2ChXgQ5D4hlMynFF8mEFXx54+PmLo8f2DMiM9bxN6QTAjg==} - wslink@2.0.2: - resolution: {integrity: sha512-bImsYQCn/6H3w31Yn1kpqxs5HFSOWv7ULxescTpL2SGswImWetCbFYVQmDzK2QkvYug6nHBVmdtr9fDAxK89dQ==} - xml2js@0.5.0: resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} engines: {node: '>=4.0.0'} @@ -5398,10 +5352,10 @@ snapshots: semver: 6.3.1 uuid: 3.4.0 - '@ampproject/remapping@2.3.0': + '@ampproject/remapping@2.2.1': dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 '@azure/abort-controller@1.1.0': dependencies: @@ -5483,30 +5437,30 @@ snapshots: transitivePeerDependencies: - encoding - '@babel/code-frame@7.23.5': + '@babel/code-frame@7.22.13': dependencies: - '@babel/highlight': 7.23.4 + '@babel/highlight': 7.22.13 chalk: 2.4.2 - '@babel/code-frame@7.24.2': + '@babel/code-frame@7.23.5': dependencies: - '@babel/highlight': 7.24.5 - picocolors: 1.0.0 + '@babel/highlight': 7.23.4 + chalk: 2.4.2 - '@babel/compat-data@7.24.4': {} + '@babel/compat-data@7.23.5': {} - '@babel/core@7.24.5': + '@babel/core@7.23.7': dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helpers': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helpers': 7.23.8 + '@babel/parser': 7.23.6 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 convert-source-map: 2.0.0 debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -5515,54 +5469,54 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.24.5': + '@babel/generator@7.23.6': dependencies: - '@babel/types': 7.24.5 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/types': 7.23.6 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 '@babel/helper-annotate-as-pure@7.22.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.23.6 '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.23.6 '@babel/helper-compilation-targets@7.23.6': dependencies: - '@babel/compat-data': 7.24.4 + '@babel/compat-data': 7.23.5 '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 + browserslist: 4.22.2 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.24.5)': + '@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.23.7 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.24.5 + '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 + '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 - '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.5)': + '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.23.7 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.5)': + '@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.23.7 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.8 @@ -5573,644 +5527,631 @@ snapshots: '@babel/helper-function-name@7.23.0': dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 '@babel/helper-hoist-variables@7.22.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.23.6 - '@babel/helper-member-expression-to-functions@7.24.5': + '@babel/helper-member-expression-to-functions@7.23.0': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.23.6 - '@babel/helper-module-imports@7.24.3': + '@babel/helper-module-imports@7.22.15': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.23.6 - '@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)': + '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.23.7 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.24.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 '@babel/helper-optimise-call-expression@7.22.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.23.6 - '@babel/helper-plugin-utils@7.24.5': {} + '@babel/helper-plugin-utils@7.22.5': {} - '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.5)': + '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.23.7 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.24.5 + '@babel/helper-wrap-function': 7.22.20 - '@babel/helper-replace-supers@7.24.1(@babel/core@7.24.5)': + '@babel/helper-replace-supers@7.22.20(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.23.7 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.24.5 + '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-simple-access@7.24.5': + '@babel/helper-simple-access@7.22.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.23.6 '@babel/helper-skip-transparent-expression-wrappers@7.22.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.23.6 - '@babel/helper-split-export-declaration@7.24.5': + '@babel/helper-split-export-declaration@7.22.6': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.23.6 - '@babel/helper-string-parser@7.24.1': {} + '@babel/helper-string-parser@7.23.4': {} '@babel/helper-validator-identifier@7.22.20': {} - '@babel/helper-validator-identifier@7.24.5': {} - '@babel/helper-validator-option@7.23.5': {} - '@babel/helper-wrap-function@7.24.5': + '@babel/helper-wrap-function@7.22.20': dependencies: '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 - '@babel/helpers@7.24.5': + '@babel/helpers@7.23.8': dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 transitivePeerDependencies: - supports-color - '@babel/highlight@7.23.4': + '@babel/highlight@7.22.13': dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - '@babel/highlight@7.24.5': + '@babel/highlight@7.23.4': dependencies: - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.0 - '@babel/parser@7.24.5': + '@babel/parser@7.23.6': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.23.6 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.7) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.23.7 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.23.7 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.5)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.5)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.5)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.5)': + '@babel/plugin-transform-async-generator-functions@7.23.7(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.23.7 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.7) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.7) - '@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) + '@babel/core': 7.23.7 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.7) - '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.5)': + '@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) + '@babel/core': 7.23.7 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.7) - '@babel/plugin-transform-classes@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-classes@7.23.8(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.23.7 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) - '@babel/helper-split-export-declaration': 7.24.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) + '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 - '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/template': 7.24.0 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 - '@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.23.7 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.23.7 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.7) - '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-simple-access': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 - '@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.23.7 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 - '@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.5)': + '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.7) - '@babel/plugin-transform-object-rest-spread@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.7 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) - '@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-transform-optional-chaining@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-transform-parameters@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-private-property-in-object@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.23.7 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.7) - '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.2 - '@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-typeof-symbol@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 - '@babel/preset-env@7.24.5(@babel/core@7.24.5)': + '@babel/preset-env@7.23.8(@babel/core@7.23.7)': dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.7 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.5) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.5) - '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.5) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-object-rest-spread': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-private-property-in-object': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-typeof-symbol': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.5) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.5) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.5) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.5) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.5) - core-js-compat: 3.37.0 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.23.7) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.7) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.7) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.7) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.7) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.7) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-async-generator-functions': 7.23.7(@babel/core@7.23.7) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.23.7) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.23.7) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-systemjs': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.7) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.7) + babel-plugin-polyfill-corejs2: 0.4.7(@babel/core@7.23.7) + babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.7) + babel-plugin-polyfill-regenerator: 0.5.4(@babel/core@7.23.7) + core-js-compat: 3.35.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.5)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/types': 7.24.5 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.23.6 esutils: 2.0.3 '@babel/regjsgen@0.8.0': {} '@babel/runtime@7.22.11': dependencies: - regenerator-runtime: 0.14.1 - - '@babel/runtime@7.23.9': - dependencies: - regenerator-runtime: 0.14.1 + regenerator-runtime: 0.14.0 - '@babel/runtime@7.24.5': + '@babel/runtime@7.23.8': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.24.0': + '@babel/template@7.22.15': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 - '@babel/traverse@7.24.5': + '@babel/traverse@7.23.7': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.24.5': + '@babel/types@7.23.6': dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 '@changesets/apply-release-plan@7.0.0': @@ -6569,18 +6510,18 @@ snapshots: '@ipld/car@5.3.0': dependencies: '@ipld/dag-cbor': 9.2.0 - cborg: 4.1.1 + cborg: 4.2.0 multiformats: 13.1.0 varint: 6.0.0 '@ipld/dag-cbor@9.2.0': dependencies: - cborg: 4.1.1 + cborg: 4.2.0 multiformats: 13.1.0 '@ipld/dag-json@10.2.0': dependencies: - cborg: 4.1.1 + cborg: 4.2.0 multiformats: 13.1.0 '@ipld/dag-pb@4.1.0': @@ -6594,7 +6535,7 @@ snapshots: '@perma/map': 1.0.3 actor: 2.3.1 multiformats: 13.1.0 - protobufjs: 7.2.6 + protobufjs: 7.3.0 rabin-rs: 2.1.0 '@isaacs/cliui@8.0.2': @@ -6623,10 +6564,10 @@ snapshots: transitivePeerDependencies: - debug - '@itk-wasm/image-io@1.1.1': + '@itk-wasm/image-io@1.2.0': dependencies: axios: 1.6.3 - itk-wasm: 1.0.0-b.171 + itk-wasm: 1.0.0-b.175 mime-types: 2.1.35 transitivePeerDependencies: - debug @@ -6635,34 +6576,34 @@ snapshots: dependencies: '@sinclair/typebox': 0.27.8 - '@jridgewell/gen-mapping@0.3.5': + '@jridgewell/gen-mapping@0.3.3': dependencies: - '@jridgewell/set-array': 1.2.1 + '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.20 - '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/resolve-uri@3.1.1': {} - '@jridgewell/set-array@1.2.1': {} + '@jridgewell/set-array@1.1.2': {} - '@jridgewell/source-map@0.3.6': + '@jridgewell/source-map@0.3.5': dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 '@jridgewell/sourcemap-codec@1.4.15': {} - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.20': dependencies: - '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@kitware/vtk.js@29.3.0(@babel/preset-env@7.24.5)(autoprefixer@10.4.19)(webpack@5.91.0)(wslink@1.12.4)': + '@kitware/vtk.js@29.3.1(@babel/preset-env@7.23.8(@babel/core@7.23.7))(autoprefixer@10.4.16(postcss@8.4.33))(webpack@5.89.0)(wslink@1.12.4)': dependencies: - '@babel/preset-env': 7.24.5(@babel/core@7.24.5) + '@babel/preset-env': 7.23.8(@babel/core@7.23.7) '@babel/runtime': 7.22.11 '@types/webxr': 0.5.7 - autoprefixer: 10.4.19(postcss@8.4.38) + autoprefixer: 10.4.16(postcss@8.4.33) commander: 9.2.0 d3-scale: 4.0.2 fast-deep-equal: 3.1.3 @@ -6675,18 +6616,18 @@ snapshots: spark-md5: 3.0.2 stream-browserify: 3.0.0 webworker-promise: 0.5.0 - worker-loader: 3.0.8(webpack@5.91.0) + worker-loader: 3.0.8(webpack@5.89.0) wslink: 1.12.4 xmlbuilder2: 3.0.2 transitivePeerDependencies: - webpack - '@kitware/vtk.js@30.4.1(@babel/preset-env@7.24.5)(autoprefixer@10.4.19)(webpack@5.91.0)(wslink@2.0.2)': + '@kitware/vtk.js@30.5.0(@babel/preset-env@7.23.8(@babel/core@7.23.7))(autoprefixer@10.4.16(postcss@8.4.33))(webpack@5.89.0)(wslink@1.12.4)': dependencies: - '@babel/preset-env': 7.24.5(@babel/core@7.24.5) + '@babel/preset-env': 7.23.8(@babel/core@7.23.7) '@babel/runtime': 7.22.11 - '@types/webxr': 0.5.16 - autoprefixer: 10.4.19(postcss@8.4.38) + '@types/webxr': 0.5.7 + autoprefixer: 10.4.16(postcss@8.4.33) commander: 9.2.0 d3-scale: 4.0.2 fast-deep-equal: 3.1.3 @@ -6699,8 +6640,8 @@ snapshots: spark-md5: 3.0.2 stream-browserify: 3.0.0 webworker-promise: 0.5.0 - worker-loader: 3.0.8(webpack@5.91.0) - wslink: 2.0.2 + worker-loader: 3.0.8(webpack@5.89.0) + wslink: 1.12.4 xmlbuilder2: 3.0.2 transitivePeerDependencies: - webpack @@ -6731,7 +6672,7 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@material/web@1.3.0': + '@material/web@1.4.1': dependencies: lit: 3.1.0 tslib: 2.6.2 @@ -6933,7 +6874,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.9.2': optional: true - '@semantic-release/commit-analyzer@11.1.0(semantic-release@22.0.12)': + '@semantic-release/commit-analyzer@11.1.0(semantic-release@22.0.12(typescript@5.3.3))': dependencies: conventional-changelog-angular: 7.0.0 conventional-commits-filter: 4.0.0 @@ -6948,7 +6889,7 @@ snapshots: '@semantic-release/error@4.0.0': {} - '@semantic-release/github@9.2.6(semantic-release@22.0.12)': + '@semantic-release/github@9.2.6(semantic-release@22.0.12(typescript@5.3.3))': dependencies: '@octokit/core': 5.1.0 '@octokit/plugin-paginate-rest': 9.1.5(@octokit/core@5.1.0) @@ -6970,7 +6911,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@semantic-release/npm@11.0.2(semantic-release@22.0.12)': + '@semantic-release/npm@11.0.2(semantic-release@22.0.12(typescript@5.3.3))': dependencies: '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 @@ -6987,7 +6928,7 @@ snapshots: semver: 7.5.4 tempy: 3.1.0 - '@semantic-release/release-notes-generator@12.1.0(semantic-release@22.0.12)': + '@semantic-release/release-notes-generator@12.1.0(semantic-release@22.0.12(typescript@5.3.3))': dependencies: conventional-changelog-angular: 7.0.0 conventional-changelog-writer: 7.0.1 @@ -7028,14 +6969,16 @@ snapshots: '@thewtex/zstddec@0.2.0': {} + '@thewtex/zstddec@0.2.1': {} + '@types/emscripten@1.39.10': {} '@types/eslint-scope@3.7.7': dependencies: - '@types/eslint': 8.56.10 + '@types/eslint': 8.56.2 '@types/estree': 1.0.5 - '@types/eslint@8.56.10': + '@types/eslint@8.56.2': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 @@ -7050,7 +6993,7 @@ snapshots: '@types/node-fetch@2.6.7': dependencies: - '@types/node': 20.11.9 + '@types/node': 20.5.7 form-data: 4.0.0 '@types/node@12.20.55': {} @@ -7059,13 +7002,11 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@20.11.9': + '@types/node@20.11.0': dependencies: undici-types: 5.26.5 - '@types/node@20.12.10': - dependencies: - undici-types: 5.26.5 + '@types/node@20.5.7': {} '@types/normalize-package-data@2.4.1': {} @@ -7081,18 +7022,16 @@ snapshots: '@types/tunnel@0.0.3': dependencies: - '@types/node': 20.11.9 - - '@types/webxr@0.5.16': {} + '@types/node': 20.5.7 '@types/webxr@0.5.7': {} - '@types/yauzl@2.10.3': + '@types/yauzl@2.10.1': dependencies: - '@types/node': 20.11.9 + '@types/node': 20.5.7 optional: true - '@typescript-eslint/eslint-plugin@6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3)': + '@typescript-eslint/eslint-plugin@6.17.0(@typescript-eslint/parser@6.17.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)': dependencies: '@eslint-community/regexpp': 4.8.0 '@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) @@ -7107,6 +7046,7 @@ snapshots: natural-compare: 1.4.0 semver: 7.5.4 ts-api-utils: 1.0.2(typescript@5.3.3) + optionalDependencies: typescript: 5.3.3 transitivePeerDependencies: - supports-color @@ -7119,6 +7059,7 @@ snapshots: '@typescript-eslint/visitor-keys': 6.17.0 debug: 4.3.4(supports-color@8.1.1) eslint: 8.56.0 + optionalDependencies: typescript: 5.3.3 transitivePeerDependencies: - supports-color @@ -7135,6 +7076,7 @@ snapshots: debug: 4.3.4(supports-color@8.1.1) eslint: 8.56.0 ts-api-utils: 1.0.2(typescript@5.3.3) + optionalDependencies: typescript: 5.3.3 transitivePeerDependencies: - supports-color @@ -7151,6 +7093,7 @@ snapshots: minimatch: 9.0.3 semver: 7.5.4 ts-api-utils: 1.0.2(typescript@5.3.3) + optionalDependencies: typescript: 5.3.3 transitivePeerDependencies: - supports-color @@ -7176,42 +7119,43 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitest/expect@1.0.4': + '@vitest/expect@1.2.2': dependencies: - '@vitest/spy': 1.0.4 - '@vitest/utils': 1.0.4 + '@vitest/spy': 1.2.2 + '@vitest/utils': 1.2.2 chai: 4.4.1 - '@vitest/runner@1.0.4': + '@vitest/runner@1.2.2': dependencies: - '@vitest/utils': 1.0.4 + '@vitest/utils': 1.2.2 p-limit: 5.0.0 pathe: 1.1.2 - '@vitest/snapshot@1.0.4': + '@vitest/snapshot@1.2.2': dependencies: magic-string: 0.30.5 pathe: 1.1.2 pretty-format: 29.7.0 - '@vitest/spy@1.0.4': + '@vitest/spy@1.2.2': dependencies: tinyspy: 2.2.0 - '@vitest/ui@1.0.4(vitest@1.0.4)': + '@vitest/ui@1.2.2(vitest@1.2.2)': dependencies: - '@vitest/utils': 1.0.4 + '@vitest/utils': 1.2.2 fast-glob: 3.3.2 fflate: 0.8.1 flatted: 3.2.9 pathe: 1.1.2 picocolors: 1.0.0 sirv: 2.0.4 - vitest: 1.0.4(@vitest/ui@1.0.4)(happy-dom@12.10.3) + vitest: 1.2.2(@types/node@20.11.0)(@vitest/ui@1.2.2)(happy-dom@12.10.3)(terser@5.26.0) - '@vitest/utils@1.0.4': + '@vitest/utils@1.2.2': dependencies: diff-sequences: 29.6.3 + estree-walker: 3.0.3 loupe: 2.3.7 pretty-format: 29.7.0 @@ -7223,7 +7167,7 @@ snapshots: multiformats: 9.9.0 uint8arrays: 3.1.1 - '@webassemblyjs/ast@1.12.1': + '@webassemblyjs/ast@1.11.6': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 @@ -7232,7 +7176,7 @@ snapshots: '@webassemblyjs/helper-api-error@1.11.6': {} - '@webassemblyjs/helper-buffer@1.12.1': {} + '@webassemblyjs/helper-buffer@1.11.6': {} '@webassemblyjs/helper-numbers@1.11.6': dependencies: @@ -7242,12 +7186,12 @@ snapshots: '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} - '@webassemblyjs/helper-wasm-section@1.12.1': + '@webassemblyjs/helper-wasm-section@1.11.6': dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-gen': 1.11.6 '@webassemblyjs/ieee754@1.11.6': dependencies: @@ -7259,44 +7203,44 @@ snapshots: '@webassemblyjs/utf8@1.11.6': {} - '@webassemblyjs/wasm-edit@1.12.1': + '@webassemblyjs/wasm-edit@1.11.6': dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-opt': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - '@webassemblyjs/wast-printer': 1.12.1 + '@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 - '@webassemblyjs/wasm-gen@1.12.1': + '@webassemblyjs/wasm-gen@1.11.6': dependencies: - '@webassemblyjs/ast': 1.12.1 + '@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 - '@webassemblyjs/wasm-opt@1.12.1': + '@webassemblyjs/wasm-opt@1.11.6': dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wasm-parser@1.12.1': + '@webassemblyjs/wasm-parser@1.11.6': dependencies: - '@webassemblyjs/ast': 1.12.1 + '@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 - '@webassemblyjs/wast-printer@1.12.1': + '@webassemblyjs/wast-printer@1.11.6': dependencies: - '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 '@xtuc/ieee754@1.2.0': {} @@ -7316,12 +7260,14 @@ snapshots: dependencies: acorn: 8.11.3 - acorn-jsx@5.3.2(acorn@8.11.3): + acorn-jsx@5.3.2(acorn@8.10.0): dependencies: - acorn: 8.11.3 + acorn: 8.10.0 acorn-walk@8.3.2: {} + acorn@8.10.0: {} + acorn@8.11.3: {} actor@2.3.1: {} @@ -7439,14 +7385,14 @@ snapshots: at-least-node@1.0.0: {} - autoprefixer@10.4.19(postcss@8.4.38): + autoprefixer@10.4.16(postcss@8.4.33): dependencies: - browserslist: 4.23.0 - caniuse-lite: 1.0.30001616 + browserslist: 4.22.2 + caniuse-lite: 1.0.30001576 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.38 + postcss: 8.4.33 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.5: {} @@ -7463,27 +7409,27 @@ snapshots: transitivePeerDependencies: - debug - babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.5): + babel-plugin-polyfill-corejs2@0.4.7(@babel/core@7.23.7): dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.7 + '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.7) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.5): + babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.7): dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) - core-js-compat: 3.37.0 + '@babel/core': 7.23.7 + '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.7) + core-js-compat: 3.35.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.5): + babel-plugin-polyfill-regenerator@0.5.4(@babel/core@7.23.7): dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) + '@babel/core': 7.23.7 + '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.7) transitivePeerDependencies: - supports-color @@ -7535,12 +7481,12 @@ snapshots: dependencies: wcwidth: 1.0.1 - browserslist@4.23.0: + browserslist@4.22.2: dependencies: - caniuse-lite: 1.0.30001616 - electron-to-chromium: 1.4.757 + caniuse-lite: 1.0.30001576 + electron-to-chromium: 1.4.628 node-releases: 2.0.14 - update-browserslist-db: 1.0.15(browserslist@4.23.0) + update-browserslist-db: 1.0.13(browserslist@4.22.2) buffer-alloc-unsafe@1.1.0: {} @@ -7566,7 +7512,7 @@ snapshots: call-bind@1.0.2: dependencies: - function-bind: 1.1.2 + function-bind: 1.1.1 get-intrinsic: 1.2.1 callsites@3.1.0: {} @@ -7579,7 +7525,7 @@ snapshots: camelcase@5.3.1: {} - caniuse-lite@1.0.30001616: {} + caniuse-lite@1.0.30001576: {} cardinal@2.1.1: dependencies: @@ -7588,7 +7534,7 @@ snapshots: caseless@0.12.0: {} - cborg@4.1.1: {} + cborg@4.2.0: {} chai@4.4.1: dependencies: @@ -7756,9 +7702,9 @@ snapshots: convert-source-map@2.0.0: {} - core-js-compat@3.37.0: + core-js-compat@3.35.0: dependencies: - browserslist: 4.23.0 + browserslist: 4.22.2 core-util-is@1.0.2: {} @@ -7768,6 +7714,7 @@ snapshots: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 + optionalDependencies: typescript: 5.3.3 cross-spawn@5.1.0: @@ -7887,18 +7834,20 @@ snapshots: date-fns@2.30.0: dependencies: - '@babel/runtime': 7.23.9 + '@babel/runtime': 7.22.11 dayjs@1.11.9: {} debug@3.2.7(supports-color@8.1.1): dependencies: ms: 2.1.3 + optionalDependencies: supports-color: 8.1.1 debug@4.3.4(supports-color@8.1.1): dependencies: ms: 2.1.2 + optionalDependencies: supports-color: 8.1.1 decamelize-keys@1.1.1: @@ -7958,23 +7907,11 @@ snapshots: dependencies: clone: 1.0.4 - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - define-properties@1.2.0: dependencies: has-property-descriptors: 1.0.0 object-keys: 1.1.1 - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - delayed-stream@1.0.0: {} deprecation@2.3.1: {} @@ -8006,7 +7943,7 @@ snapshots: jsbn: 0.1.1 safer-buffer: 2.1.2 - electron-to-chromium@1.4.757: {} + electron-to-chromium@1.4.628: {} emoji-regex@8.0.0: {} @@ -8034,7 +7971,7 @@ snapshots: engine.io-parser@5.2.1: {} - enhanced-resolve@5.16.0: + enhanced-resolve@5.15.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -8068,7 +8005,7 @@ snapshots: function.prototype.name: 1.1.6 get-intrinsic: 1.2.1 get-symbol-description: 1.0.0 - globalthis: 1.0.4 + globalthis: 1.0.3 gopd: 1.0.1 has: 1.0.3 has-property-descriptors: 1.0.0 @@ -8099,13 +8036,7 @@ snapshots: unbox-primitive: 1.0.2 which-typed-array: 1.1.11 - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - es-module-lexer@1.5.2: {} + es-module-lexer@1.4.1: {} es-set-tostringtag@2.0.1: dependencies: @@ -8176,8 +8107,6 @@ snapshots: escalade@3.1.1: {} - escalade@3.1.2: {} - escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} @@ -8241,8 +8170,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -8259,6 +8188,10 @@ snapshots: estraverse@5.3.0: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + esutils@2.0.3: {} event-target-shim@5.0.1: {} @@ -8313,7 +8246,7 @@ snapshots: get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: - '@types/yauzl': 2.10.3 + '@types/yauzl': 2.10.1 transitivePeerDependencies: - supports-color @@ -8500,6 +8433,8 @@ snapshots: fsevents@2.3.3: optional: true + function-bind@1.1.1: {} + function-bind@1.1.2: {} function.prototype.name@1.1.6: @@ -8519,19 +8454,11 @@ snapshots: get-intrinsic@1.2.1: dependencies: - function-bind: 1.1.2 + function-bind: 1.1.1 has: 1.0.3 has-proto: 1.0.1 has-symbols: 1.0.3 - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - get-stream@2.3.1: dependencies: object-assign: 4.1.1 @@ -8618,12 +8545,7 @@ snapshots: globalthis@1.0.3: dependencies: - define-properties: 1.2.1 - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.0.1 + define-properties: 1.2.0 globby@11.1.0: dependencies: @@ -8658,7 +8580,7 @@ snapshots: hamt-sharding@3.0.6: dependencies: sparse-array: 1.3.2 - uint8arrays: 5.0.2 + uint8arrays: 5.1.0 handlebars@4.7.8: dependencies: @@ -8690,14 +8612,8 @@ snapshots: dependencies: get-intrinsic: 1.2.1 - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - has-proto@1.0.1: {} - has-proto@1.0.3: {} - has-symbols@1.0.3: {} has-tostringtag@1.0.0: @@ -8706,16 +8622,12 @@ snapshots: has@1.0.3: dependencies: - function-bind: 1.1.2 + function-bind: 1.1.1 hasown@2.0.0: dependencies: function-bind: 1.1.2 - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - hook-std@3.0.0: {} hosted-git-info@2.8.9: {} @@ -8849,18 +8761,18 @@ snapshots: err-code: 3.0.1 hamt-sharding: 3.0.6 interface-blockstore: 5.2.10 - ipfs-unixfs: 11.1.3 - it-filter: 3.0.4 - it-last: 3.0.4 - it-map: 3.0.5 - it-parallel: 3.0.6 + ipfs-unixfs: 11.1.4 + it-filter: 3.1.0 + it-last: 3.0.6 + it-map: 3.1.0 + it-parallel: 3.0.7 it-pipe: 3.0.1 it-pushable: 3.2.3 multiformats: 13.1.0 p-queue: 8.0.1 progress-events: 1.0.0 - ipfs-unixfs@11.1.3: + ipfs-unixfs@11.1.4: dependencies: err-code: 3.0.1 protons-runtime: 5.4.0 @@ -8999,35 +8911,35 @@ snapshots: lodash.isstring: 4.0.1 lodash.uniqby: 4.7.0 - it-filter@3.0.4: + it-filter@3.1.0: dependencies: - it-peekable: 3.0.3 + it-peekable: 3.0.4 - it-last@3.0.4: {} + it-last@3.0.6: {} - it-map@3.0.5: + it-map@3.1.0: dependencies: - it-peekable: 3.0.3 + it-peekable: 3.0.4 - it-merge@3.0.3: + it-merge@3.0.5: dependencies: it-pushable: 3.2.3 - it-parallel@3.0.6: + it-parallel@3.0.7: dependencies: - p-defer: 4.0.0 + p-defer: 4.0.1 - it-peekable@3.0.3: {} + it-peekable@3.0.4: {} it-pipe@3.0.1: dependencies: - it-merge: 3.0.3 + it-merge: 3.0.5 it-pushable: 3.2.3 it-stream-types: 2.0.1 it-pushable@3.2.3: dependencies: - p-defer: 4.0.0 + p-defer: 4.0.1 it-stream-types@2.0.1: {} @@ -9046,10 +8958,10 @@ snapshots: transitivePeerDependencies: - debug - itk-wasm@1.0.0-b.171: + itk-wasm@1.0.0-b.175: dependencies: '@itk-wasm/dam': 1.1.1 - '@thewtex/zstddec': 0.2.0 + '@thewtex/zstddec': 0.2.1 '@types/emscripten': 1.39.10 axios: 1.6.3 chalk: 5.3.0 @@ -9078,7 +8990,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.12.10 + '@types/node': 20.11.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -9168,13 +9080,14 @@ snapshots: dependencies: cli-truncate: 2.1.0 colorette: 2.0.20 - enquirer: 2.4.1 log-update: 4.0.0 p-map: 4.0.0 rfdc: 1.3.0 rxjs: 7.8.1 through: 2.3.8 wrap-ansi: 7.0.0 + optionalDependencies: + enquirer: 2.4.1 lit-element@4.0.0: dependencies: @@ -9511,7 +9424,7 @@ snapshots: outdent@0.5.0: {} - p-defer@4.0.0: {} + p-defer@4.0.1: {} p-each-series@3.0.0: {} @@ -9585,7 +9498,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.22.13 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -9594,7 +9507,7 @@ snapshots: dependencies: '@babel/code-frame': 7.23.5 index-to-position: 0.1.2 - type-fest: 4.10.2 + type-fest: 4.10.1 path-exists@3.0.0: {} @@ -9670,11 +9583,11 @@ snapshots: picocolors: 1.0.0 source-map-js: 1.0.2 - postcss@8.4.38: + postcss@8.4.33: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.2.0 + source-map-js: 1.0.2 preferred-pm@3.0.3: dependencies: @@ -9705,7 +9618,7 @@ snapshots: proto-list@1.2.4: {} - protobufjs@7.2.6: + protobufjs@7.3.0: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 @@ -9717,14 +9630,14 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.12.10 + '@types/node': 20.11.0 long: 5.2.3 protons-runtime@5.4.0: dependencies: uint8-varint: 2.0.4 uint8arraylist: 2.4.8 - uint8arrays: 5.0.2 + uint8arrays: 5.1.0 proxy-from-env@1.0.0: {} @@ -9770,7 +9683,7 @@ snapshots: dependencies: find-up-simple: 1.0.0 read-pkg: 9.0.1 - type-fest: 4.10.2 + type-fest: 4.10.1 read-pkg-up@7.0.1: dependencies: @@ -9790,7 +9703,7 @@ snapshots: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.0 parse-json: 8.1.0 - type-fest: 4.10.2 + type-fest: 4.10.1 unicorn-magic: 0.1.0 read-yaml-file@1.1.0: @@ -9822,7 +9735,7 @@ snapshots: rechoir@0.6.2: dependencies: - resolve: 1.22.8 + resolve: 1.22.4 redent@3.0.0: dependencies: @@ -9839,11 +9752,13 @@ snapshots: regenerate@1.4.2: {} + regenerator-runtime@0.14.0: {} + regenerator-runtime@0.14.1: {} regenerator-transform@0.15.2: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.23.8 regexp.prototype.flags@1.5.0: dependencies: @@ -9886,13 +9801,13 @@ snapshots: resolve@1.22.4: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@1.22.8: dependencies: - is-core-module: 2.13.0 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -9965,7 +9880,7 @@ snapshots: schema-utils@3.3.0: dependencies: - '@types/json-schema': 7.0.15 + '@types/json-schema': 7.0.12 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) @@ -9977,11 +9892,11 @@ snapshots: semantic-release@22.0.12(typescript@5.3.3): dependencies: - '@semantic-release/commit-analyzer': 11.1.0(semantic-release@22.0.12) + '@semantic-release/commit-analyzer': 11.1.0(semantic-release@22.0.12(typescript@5.3.3)) '@semantic-release/error': 4.0.0 - '@semantic-release/github': 9.2.6(semantic-release@22.0.12) - '@semantic-release/npm': 11.0.2(semantic-release@22.0.12) - '@semantic-release/release-notes-generator': 12.1.0(semantic-release@22.0.12) + '@semantic-release/github': 9.2.6(semantic-release@22.0.12(typescript@5.3.3)) + '@semantic-release/npm': 11.0.2(semantic-release@22.0.12(typescript@5.3.3)) + '@semantic-release/release-notes-generator': 12.1.0(semantic-release@22.0.12(typescript@5.3.3)) aggregate-error: 5.0.0 cosmiconfig: 8.3.6(typescript@5.3.3) debug: 4.3.4(supports-color@8.1.1) @@ -10127,8 +10042,6 @@ snapshots: source-map-js@1.0.2: {} - source-map-js@1.2.0: {} - source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -10320,18 +10233,18 @@ snapshots: term-size@2.2.1: {} - terser-webpack-plugin@5.3.10(webpack@5.91.0): + terser-webpack-plugin@5.3.10(webpack@5.89.0): dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.20 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.31.0 - webpack: 5.91.0 + terser: 5.26.0 + webpack: 5.89.0 - terser@5.31.0: + terser@5.26.0: dependencies: - '@jridgewell/source-map': 0.3.6 + '@jridgewell/source-map': 0.3.5 acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 @@ -10436,7 +10349,7 @@ snapshots: type-fest@3.13.1: {} - type-fest@4.10.2: {} + type-fest@4.10.1: {} typed-array-buffer@1.0.0: dependencies: @@ -10475,17 +10388,17 @@ snapshots: uint8-varint@2.0.4: dependencies: uint8arraylist: 2.4.8 - uint8arrays: 5.0.2 + uint8arrays: 5.1.0 uint8arraylist@2.4.8: dependencies: - uint8arrays: 5.0.2 + uint8arrays: 5.1.0 uint8arrays@3.1.1: dependencies: multiformats: 9.9.0 - uint8arrays@5.0.2: + uint8arrays@5.1.0: dependencies: multiformats: 13.1.0 @@ -10538,10 +10451,10 @@ snapshots: untildify@5.0.0: {} - update-browserslist-db@1.0.15(browserslist@4.23.0): + update-browserslist-db@1.0.13(browserslist@4.22.2): dependencies: - browserslist: 4.23.0 - escalade: 3.1.2 + browserslist: 4.22.2 + escalade: 3.1.1 picocolors: 1.0.0 uri-js@4.4.1: @@ -10574,13 +10487,13 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - vite-node@1.0.4: + vite-node@1.2.2(@types/node@20.11.0)(terser@5.26.0): dependencies: cac: 6.7.14 debug: 4.3.4(supports-color@8.1.1) pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.0.10 + vite: 5.0.10(@types/node@20.11.0)(terser@5.26.0) transitivePeerDependencies: - '@types/node' - less @@ -10591,49 +10504,51 @@ snapshots: - supports-color - terser - vite-plugin-static-copy@0.17.0(vite@4.4.11): + vite-plugin-static-copy@0.17.0(vite@4.4.11(@types/node@20.11.0)(terser@5.26.0)): dependencies: chokidar: 3.5.3 fast-glob: 3.3.1 fs-extra: 11.1.1 picocolors: 1.0.0 - vite: 4.4.11 + vite: 4.4.11(@types/node@20.11.0)(terser@5.26.0) - vite@4.4.11: + vite@4.4.11(@types/node@20.11.0)(terser@5.26.0): dependencies: esbuild: 0.18.20 postcss: 8.4.31 rollup: 3.29.4 optionalDependencies: + '@types/node': 20.11.0 fsevents: 2.3.3 + terser: 5.26.0 - vite@5.0.10: + vite@5.0.10(@types/node@20.11.0)(terser@5.26.0): dependencies: esbuild: 0.19.11 postcss: 8.4.32 rollup: 4.9.2 optionalDependencies: + '@types/node': 20.11.0 fsevents: 2.3.3 + terser: 5.26.0 - vitest-canvas-mock@0.3.3(vitest@1.0.4): + vitest-canvas-mock@0.3.3(vitest@1.2.2(@types/node@20.11.0)(@vitest/ui@1.2.2)(happy-dom@12.10.3)(terser@5.26.0)): dependencies: jest-canvas-mock: 2.5.2 - vitest: 1.0.4(@vitest/ui@1.0.4)(happy-dom@12.10.3) + vitest: 1.2.2(@types/node@20.11.0)(@vitest/ui@1.2.2)(happy-dom@12.10.3)(terser@5.26.0) - vitest@1.0.4(@vitest/ui@1.0.4)(happy-dom@12.10.3): + vitest@1.2.2(@types/node@20.11.0)(@vitest/ui@1.2.2)(happy-dom@12.10.3)(terser@5.26.0): dependencies: - '@vitest/expect': 1.0.4 - '@vitest/runner': 1.0.4 - '@vitest/snapshot': 1.0.4 - '@vitest/spy': 1.0.4 - '@vitest/ui': 1.0.4(vitest@1.0.4) - '@vitest/utils': 1.0.4 + '@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.4.1 debug: 4.3.4(supports-color@8.1.1) execa: 8.0.1 - happy-dom: 12.10.3 local-pkg: 0.5.0 magic-string: 0.30.5 pathe: 1.1.2 @@ -10642,9 +10557,13 @@ snapshots: strip-literal: 1.3.0 tinybench: 2.6.0 tinypool: 0.8.2 - vite: 5.0.10 - vite-node: 1.0.4 + vite: 5.0.10(@types/node@20.11.0)(terser@5.26.0) + vite-node: 1.2.2(@types/node@20.11.0)(terser@5.26.0) why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.11.0 + '@vitest/ui': 1.2.2(vitest@1.2.2) + happy-dom: 12.10.3 transitivePeerDependencies: - less - lightningcss @@ -10656,7 +10575,7 @@ snapshots: wasm-feature-detect@1.6.1: {} - watchpack@2.4.1: + watchpack@2.4.0: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 @@ -10671,19 +10590,19 @@ snapshots: webpack-sources@3.2.3: {} - webpack@5.91.0: + webpack@5.89.0: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 acorn: 8.11.3 acorn-import-assertions: 1.9.0(acorn@8.11.3) - browserslist: 4.23.0 + browserslist: 4.22.2 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.16.0 - es-module-lexer: 1.5.2 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.4.1 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -10694,8 +10613,8 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.91.0) - watchpack: 2.4.1 + terser-webpack-plugin: 5.3.10(webpack@5.89.0) + watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -10757,11 +10676,11 @@ snapshots: wordwrap@1.0.0: {} - worker-loader@3.0.8(webpack@5.91.0): + worker-loader@3.0.8(webpack@5.89.0): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.91.0 + webpack: 5.89.0 wrap-ansi@6.2.0: dependencies: @@ -10789,10 +10708,6 @@ snapshots: dependencies: json5: 2.2.3 - wslink@2.0.2: - dependencies: - '@msgpack/msgpack': 2.8.0 - xml2js@0.5.0: dependencies: sax: 1.3.0 @@ -10803,7 +10718,7 @@ snapshots: '@oozcitak/dom': 1.15.10 '@oozcitak/infra': 1.0.8 '@oozcitak/util': 8.3.8 - '@types/node': 20.12.10 + '@types/node': 20.11.0 js-yaml: 3.14.0 xmlbuilder@11.0.1: {} @@ -10812,9 +10727,10 @@ snapshots: xstate-lit@2.0.4(@lit/context@1.1.0)(lit@3.1.0)(xstate@5.5.2): dependencies: - '@lit/context': 1.1.0 lit: 3.1.0 xstate: 5.5.2 + optionalDependencies: + '@lit/context': 1.1.0 xstate@5.5.2: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 7f32cd96..93d3d93b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,4 @@ packages: - packages/* + - packages/viewer/typescript - packages/transfer-function-editor/examples/* From c4181386af62ca0ab7e61fcfe216f30458280b6e Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Mon, 11 Mar 2024 19:41:50 -0400 Subject: [PATCH 02/25] feat: Add itkviewer Python interface --- packages/viewer/python/LICENSE | 202 +++++++++++++++++++ packages/viewer/python/README.md | 9 + packages/viewer/python/itkviewer/__init__.py | 9 + packages/viewer/python/itkviewer/viewer.py | 6 + packages/viewer/python/pyproject.toml | 60 ++++++ 5 files changed, 286 insertions(+) create mode 100644 packages/viewer/python/LICENSE create mode 100644 packages/viewer/python/README.md create mode 100644 packages/viewer/python/itkviewer/__init__.py create mode 100644 packages/viewer/python/itkviewer/viewer.py create mode 100644 packages/viewer/python/pyproject.toml diff --git a/packages/viewer/python/LICENSE b/packages/viewer/python/LICENSE new file mode 100644 index 00000000..62589edd --- /dev/null +++ b/packages/viewer/python/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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 + + https://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. diff --git a/packages/viewer/python/README.md b/packages/viewer/python/README.md new file mode 100644 index 00000000..ce1b448f --- /dev/null +++ b/packages/viewer/python/README.md @@ -0,0 +1,9 @@ +# itkviewer + +Python interfaces for itk-viewer. + +## Installation + +```sh +pip install itkviewer +``` diff --git a/packages/viewer/python/itkviewer/__init__.py b/packages/viewer/python/itkviewer/__init__.py new file mode 100644 index 00000000..d37335c9 --- /dev/null +++ b/packages/viewer/python/itkviewer/__init__.py @@ -0,0 +1,9 @@ +"""itkviewer: Python interface to itk-viewer.""" + +__version__ = "0.0.1" + +from .viewer import Viewer + +__all__ = [ + "Viewer", + ] diff --git a/packages/viewer/python/itkviewer/viewer.py b/packages/viewer/python/itkviewer/viewer.py new file mode 100644 index 00000000..f94dd42d --- /dev/null +++ b/packages/viewer/python/itkviewer/viewer.py @@ -0,0 +1,6 @@ +from abc import ABC, abstractmethod + + +class Viewer(ABC): + """Viewer class.""" + pass diff --git a/packages/viewer/python/pyproject.toml b/packages/viewer/python/pyproject.toml new file mode 100644 index 00000000..0006e87e --- /dev/null +++ b/packages/viewer/python/pyproject.toml @@ -0,0 +1,60 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "itkviewer" +description = "Python interface itk-viewer." +authors = [{name = "Matt McCormick", email = "matt.mccormick@kitware.com"}] +readme = "README.md" +license = {file = "LICENSE"} +classifiers = [ + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python", + 'Development Status :: 3 - Alpha', + 'Intended Audience :: Developers', + 'Intended Audience :: Science/Research', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', +] +keywords = [ + "itk", + "imaging", + "visualization", +] +dynamic = ["version"] + +requires-python = ">=3.8" +dependencies = [ + "numpy", +] + +[project.urls] +Home = "https://github.com/InsightSoftwareConsorrtium/itk-viewer" +Source = "https://github.com/InsightSoftwareConsortium/itk-viewer" +Issues = "https://github.com/InsightSoftwareConsortium/itk-viewer/issues" + +[tool.hatch.envs.default] +dependencies = [ + "pytest >=2.7.3", + "pytest-pyodide", +] + +[tool.hatch.envs.default.scripts] +test = [ + "hatch build -t wheel", + "pytest --dist-dir=./dist --rt=chrome", +] +download-pyodide = [ + "curl -L https://github.com/pyodide/pyodide/releases/download/0.25.0/pyodide-0.25.0.tar.bz2 -o pyodide.tar.bz2", + "tar xjf pyodide.tar.bz2", + "rm -rf dist pyodide.tar.bz2", + "mv pyodide dist", +] + +[tool.hatch.version] +path = "itkviewer/__init__.py" From 7b953def4908fb658feb79aadbce0caa02b825dd Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Mon, 11 Mar 2024 20:43:06 -0400 Subject: [PATCH 03/25] feat(itkviewer): add Viewport, MultiscaleImage --- packages/viewer/python/itkviewer/__init__.py | 4 ++++ packages/viewer/python/itkviewer/multiscale_image.py | 6 ++++++ packages/viewer/python/itkviewer/viewport.py | 6 ++++++ 3 files changed, 16 insertions(+) create mode 100644 packages/viewer/python/itkviewer/multiscale_image.py create mode 100644 packages/viewer/python/itkviewer/viewport.py diff --git a/packages/viewer/python/itkviewer/__init__.py b/packages/viewer/python/itkviewer/__init__.py index d37335c9..1674d790 100644 --- a/packages/viewer/python/itkviewer/__init__.py +++ b/packages/viewer/python/itkviewer/__init__.py @@ -3,7 +3,11 @@ __version__ = "0.0.1" from .viewer import Viewer +from .viewport import Viewport +from .multiscale_image import MultiscaleImage __all__ = [ + "MultiscaleImage", "Viewer", + "Viewport", ] diff --git a/packages/viewer/python/itkviewer/multiscale_image.py b/packages/viewer/python/itkviewer/multiscale_image.py new file mode 100644 index 00000000..05694134 --- /dev/null +++ b/packages/viewer/python/itkviewer/multiscale_image.py @@ -0,0 +1,6 @@ +from abc import ABC + + +class MultiscaleImage(ABC): + """Multiscale spatial image.""" + pass \ No newline at end of file diff --git a/packages/viewer/python/itkviewer/viewport.py b/packages/viewer/python/itkviewer/viewport.py new file mode 100644 index 00000000..aa69e6dd --- /dev/null +++ b/packages/viewer/python/itkviewer/viewport.py @@ -0,0 +1,6 @@ +from abc import ABC + + +class Viewport(ABC): + """Viewport class.""" + pass \ No newline at end of file From f7362a5c34186361cf6cbbb922a7bb164353d743 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Wed, 13 Mar 2024 16:21:04 -0400 Subject: [PATCH 04/25] feat(linkml): initial schema definition --- itk-viewer.yml | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 itk-viewer.yml diff --git a/itk-viewer.yml b/itk-viewer.yml new file mode 100644 index 00000000..0882de09 --- /dev/null +++ b/itk-viewer.yml @@ -0,0 +1,53 @@ +id: https://w3id.org/itk/viewer +name: itk-viewer +prefixes: + itk: https://w3id.org/itk/ + viewer: https://w3id.org/itk/viewer + linkml: https://w3id.org/linkml/ +imports: + - linkml:types +default_range: string +default_prefix: viewer + +classes: + Actor: + tree_root: true + description: >- + In the Actor Model mathematical of computation, an actor is a computational entity that, + in response to a message it receives, can concurrently: + + - send a finite number of messages to other actors; + - create a finite number of new actors; + - designate the behavior to be used for the next message it receives. + + Supported messages are defined in the Event classes. The valid Events' for an Actor are defined + defined by the `receives` relationship. To send an Event to an Actor, use the `send` method. + + Actors are typically implement as finite state machines. + class_uri: viewer:Actor + + Viewer: + is_a: Actor + description: >- + A viewer is an interface that allows users to view and interact with + multi-dimensional images, geometry, and point sets. + class_uri: viewer:Viewer + + Viewport: + is_a: Actor + description: >- + A viewport is a rectangular region of a viewer that displays a rendering of the scene. + class_uri: viewer:Viewport + + MultiscaleImage: + is_a: Actor + description: >- + A multiscale image is a multi-dimensional image, based on the OME-Zarr data model, often preprocessed, + that supports efficient rendering at multiple resolutions. + class_uri: viewer:MultiscaleImage + + Event: + description: >- + An event is a message that can be sent to an actor. The actor can respond to the event + by changing its state, sending messages to other actors, or creating new actors. + class_uri: viewer \ No newline at end of file From cdc2f6bb49632c0181b02e2f087f7172697eb9fd Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Wed, 13 Mar 2024 23:22:08 -0400 Subject: [PATCH 05/25] feat: itkviewer-clara-viz package config --- itk-viewer.yml | 7 + packages/clara-viz/LICENSE | 202 ++++++++++++++++++ packages/clara-viz/README.md | 9 + .../clara-viz/itkviewer_clara_viz/__init__.py | 9 + .../clara-viz/itkviewer_clara_viz/renderer.py | 3 + packages/clara-viz/pyproject.toml | 44 ++++ 6 files changed, 274 insertions(+) create mode 100644 packages/clara-viz/LICENSE create mode 100644 packages/clara-viz/README.md create mode 100644 packages/clara-viz/itkviewer_clara_viz/__init__.py create mode 100644 packages/clara-viz/itkviewer_clara_viz/renderer.py create mode 100644 packages/clara-viz/pyproject.toml diff --git a/itk-viewer.yml b/itk-viewer.yml index 0882de09..f1d148b3 100644 --- a/itk-viewer.yml +++ b/itk-viewer.yml @@ -46,6 +46,13 @@ classes: that supports efficient rendering at multiple resolutions. class_uri: viewer:MultiscaleImage + Renderer: + is_a: Actor + description: >- + A renderer is an actor that renders a scene to an in-memory RGB image for display in a viewport. + class_uri: viewer:Renderer + + Event: description: >- An event is a message that can be sent to an actor. The actor can respond to the event diff --git a/packages/clara-viz/LICENSE b/packages/clara-viz/LICENSE new file mode 100644 index 00000000..62589edd --- /dev/null +++ b/packages/clara-viz/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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 + + https://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. diff --git a/packages/clara-viz/README.md b/packages/clara-viz/README.md new file mode 100644 index 00000000..38f027d8 --- /dev/null +++ b/packages/clara-viz/README.md @@ -0,0 +1,9 @@ +# itkviewer-clara-viz + +NVIDIA clara-viz renderer for itkviewer. + +## Installation + +```sh +pip install itkviewer-clara-viz +``` diff --git a/packages/clara-viz/itkviewer_clara_viz/__init__.py b/packages/clara-viz/itkviewer_clara_viz/__init__.py new file mode 100644 index 00000000..82ad7a8e --- /dev/null +++ b/packages/clara-viz/itkviewer_clara_viz/__init__.py @@ -0,0 +1,9 @@ +"""itkviewer-clara-viz: NVIDIA clara-viz renderer for itkviewer.""" + +__version__ = "0.0.1" + +from .renderer import ClaraVizRenderer + +__all__ = [ + "ClaraVizRenderer", + ] diff --git a/packages/clara-viz/itkviewer_clara_viz/renderer.py b/packages/clara-viz/itkviewer_clara_viz/renderer.py new file mode 100644 index 00000000..acc0f384 --- /dev/null +++ b/packages/clara-viz/itkviewer_clara_viz/renderer.py @@ -0,0 +1,3 @@ + +class Renderer: + pass \ No newline at end of file diff --git a/packages/clara-viz/pyproject.toml b/packages/clara-viz/pyproject.toml new file mode 100644 index 00000000..fc72c68b --- /dev/null +++ b/packages/clara-viz/pyproject.toml @@ -0,0 +1,44 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "itkviewer-clara-viz" +description = "NVIDIA clara-viz renderer for itkviewer." +authors = [{name = "Matt McCormick", email = "matt.mccormick@kitware.com"}] +readme = "README.md" +license = {file = "LICENSE"} +classifiers = [ + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python", + 'Development Status :: 3 - Alpha', + 'Intended Audience :: Developers', + 'Intended Audience :: Science/Research', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', +] +keywords = [ + "itk", + "imaging", + "visualization", +] +dynamic = ["version"] + +requires-python = ">=3.8, <3.10" +dependencies = [ + "clara-viz-core", +] + +[project.urls] +Home = "https://github.com/InsightSoftwareConsorrtium/itk-viewer" +Source = "https://github.com/InsightSoftwareConsortium/itk-viewer" +Issues = "https://github.com/InsightSoftwareConsortium/itk-viewer/issues" + +[tool.hatch.envs.default] +dependencies = [ + "pytest >=2.7.3", +] + +[tool.hatch.version] +path = "itkviewer_clara_viz/__init__.py" From c66f7c698f385e0cc4e17e1494cdceb457e1446a Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Wed, 13 Mar 2024 23:31:08 -0400 Subject: [PATCH 06/25] feat: add itkviewer-textual package configuration --- packages/textual/LICENSE | 202 ++++++++++++++++++ packages/textual/README.md | 9 + .../textual/itkviewer_textual/__init__.py | 6 + packages/textual/pyproject.toml | 48 +++++ 4 files changed, 265 insertions(+) create mode 100644 packages/textual/LICENSE create mode 100644 packages/textual/README.md create mode 100644 packages/textual/itkviewer_textual/__init__.py create mode 100644 packages/textual/pyproject.toml diff --git a/packages/textual/LICENSE b/packages/textual/LICENSE new file mode 100644 index 00000000..62589edd --- /dev/null +++ b/packages/textual/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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 + + https://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. diff --git a/packages/textual/README.md b/packages/textual/README.md new file mode 100644 index 00000000..b318bfab --- /dev/null +++ b/packages/textual/README.md @@ -0,0 +1,9 @@ +# itkviewer-textual + +A textual user interface to itkviewer. + +## Installation + +```sh +pip install itkviewer-textual +``` diff --git a/packages/textual/itkviewer_textual/__init__.py b/packages/textual/itkviewer_textual/__init__.py new file mode 100644 index 00000000..890f4ea6 --- /dev/null +++ b/packages/textual/itkviewer_textual/__init__.py @@ -0,0 +1,6 @@ +"""itkviewer-textual: A textual user interface to itkviewer.""" + +__version__ = "0.0.1" + +__all__ = [ + ] diff --git a/packages/textual/pyproject.toml b/packages/textual/pyproject.toml new file mode 100644 index 00000000..9ebd35f9 --- /dev/null +++ b/packages/textual/pyproject.toml @@ -0,0 +1,48 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "itkviewer-textual" +description = "A textual user interface to itkviewer." +authors = [{name = "Matt McCormick", email = "matt.mccormick@kitware.com"}] +readme = "README.md" +license = {file = "LICENSE"} +classifiers = [ + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python", + 'Development Status :: 3 - Alpha', + 'Intended Audience :: Developers', + 'Intended Audience :: Science/Research', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', +] +keywords = [ + "itk", + "imaging", + "visualization", +] +dynamic = ["version"] + +requires-python = ">=3.8" +dependencies = [ + "textual", + "rich-pixels", +] + +[project.urls] +Home = "https://github.com/InsightSoftwareConsorrtium/itk-viewer" +Source = "https://github.com/InsightSoftwareConsortium/itk-viewer" +Issues = "https://github.com/InsightSoftwareConsortium/itk-viewer/issues" + +[tool.hatch.envs.default] +dependencies = [ + "pytest >=2.7.3", +] + +[tool.hatch.version] +path = "itkviewer_textual/__init__.py" From 5ad3a888312cf9ca63aac151a0d2aff3ace49282 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Thu, 14 Mar 2024 20:44:00 -0400 Subject: [PATCH 07/25] docs: add LinkML model README --- itk-viewer.yml => model/itk-viewer.yml | 0 model/requirements.txt | 1 + 2 files changed, 1 insertion(+) rename itk-viewer.yml => model/itk-viewer.yml (100%) create mode 100644 model/requirements.txt diff --git a/itk-viewer.yml b/model/itk-viewer.yml similarity index 100% rename from itk-viewer.yml rename to model/itk-viewer.yml diff --git a/model/requirements.txt b/model/requirements.txt new file mode 100644 index 00000000..48f47e08 --- /dev/null +++ b/model/requirements.txt @@ -0,0 +1 @@ +linkml \ No newline at end of file From 839d403c49816a505986b400b8cb255c9605b1a2 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Thu, 14 Mar 2024 21:49:39 -0400 Subject: [PATCH 08/25] feat: scripts to generate model Python and docs --- docs/{ => typescript}/s3.md | 0 model/README.md | 8 ++++++++ model/gen-docs.sh | 8 ++++++++ model/gen-python.sh | 8 ++++++++ packages/viewer/python/pyproject.toml | 1 + 5 files changed, 25 insertions(+) rename docs/{ => typescript}/s3.md (100%) create mode 100644 model/README.md create mode 100755 model/gen-docs.sh create mode 100755 model/gen-python.sh diff --git a/docs/s3.md b/docs/typescript/s3.md similarity index 100% rename from docs/s3.md rename to docs/typescript/s3.md diff --git a/model/README.md b/model/README.md new file mode 100644 index 00000000..062afcee --- /dev/null +++ b/model/README.md @@ -0,0 +1,8 @@ +# itk-viewer model + +A [LinkML] model of itk-viewer's architecture. + +The viewer is built on the [Actor Model]. This model defines the Actors and their relationships. It also defines the Events, which are the messages sent to Actors. It defines all the Events an Actor can receive. The data model of the Events is also used to generate the corresponding TypeScript interfaces and Python pydantic dataclasses. + +.. LinkML: https://linkml.io/ +.. Actor Model: https://en.wikipedia.org/wiki/Actor_model \ No newline at end of file diff --git a/model/gen-docs.sh b/model/gen-docs.sh new file mode 100755 index 00000000..e546df02 --- /dev/null +++ b/model/gen-docs.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +# Generate documentation for the model + +script_dir="`cd $(dirname $0); pwd`" +cd $script_dir + +gen-markdown -d ../docs/model ./itk-viewer.yml \ No newline at end of file diff --git a/model/gen-python.sh b/model/gen-python.sh new file mode 100755 index 00000000..75e9f4e6 --- /dev/null +++ b/model/gen-python.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +# Generate python code for the model + +script_dir="`cd $(dirname $0); pwd`" +cd $script_dir + +gen-pydantic ./itk-viewer.yml > ../packages/viewer/python/itkviewer/model.py diff --git a/packages/viewer/python/pyproject.toml b/packages/viewer/python/pyproject.toml index 0006e87e..9b68d587 100644 --- a/packages/viewer/python/pyproject.toml +++ b/packages/viewer/python/pyproject.toml @@ -31,6 +31,7 @@ dynamic = ["version"] requires-python = ">=3.8" dependencies = [ "numpy", + "pydantic", ] [project.urls] From aa6ecc0648d8ade0dbbb5fdb1850f88f32edc670 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Thu, 14 Mar 2024 21:56:16 -0400 Subject: [PATCH 09/25] feat(model): mark actors as abstract --- model/itk-viewer.yml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/model/itk-viewer.yml b/model/itk-viewer.yml index f1d148b3..3b8f8708 100644 --- a/model/itk-viewer.yml +++ b/model/itk-viewer.yml @@ -11,7 +11,7 @@ default_prefix: viewer classes: Actor: - tree_root: true + abstract: true description: >- In the Actor Model mathematical of computation, an actor is a computational entity that, in response to a message it receives, can concurrently: @@ -27,19 +27,23 @@ classes: class_uri: viewer:Actor Viewer: + abstract: true is_a: Actor + tree_root: true description: >- A viewer is an interface that allows users to view and interact with multi-dimensional images, geometry, and point sets. class_uri: viewer:Viewer Viewport: + abstract: true is_a: Actor description: >- A viewport is a rectangular region of a viewer that displays a rendering of the scene. class_uri: viewer:Viewport MultiscaleImage: + abstract: true is_a: Actor description: >- A multiscale image is a multi-dimensional image, based on the OME-Zarr data model, often preprocessed, @@ -47,6 +51,7 @@ classes: class_uri: viewer:MultiscaleImage Renderer: + abstract: true is_a: Actor description: >- A renderer is an actor that renders a scene to an in-memory RGB image for display in a viewport. @@ -54,7 +59,15 @@ classes: Event: + abstract: true description: >- An event is a message that can be sent to an actor. The actor can respond to the event by changing its state, sending messages to other actors, or creating new actors. - class_uri: viewer \ No newline at end of file + class_uri: viewer:Event + attributes: + type: + identifier: true + description: >- + The type of the event. + range: string + required: true \ No newline at end of file From 507e9757507f89c8d4435eb99ea9460e5fba1898 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Thu, 14 Mar 2024 21:58:33 -0400 Subject: [PATCH 10/25] docs(model): add description, license --- model/itk-viewer.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/model/itk-viewer.yml b/model/itk-viewer.yml index 3b8f8708..e0059be7 100644 --- a/model/itk-viewer.yml +++ b/model/itk-viewer.yml @@ -1,5 +1,8 @@ id: https://w3id.org/itk/viewer name: itk-viewer +description: >- + The itk-viewer model defines the classes and relationships for a viewer that allows users to view and interact with multi-dimensional images, geometry, and point sets. +license: https://creativecommons.org/publicdomain/zero/1.0/ prefixes: itk: https://w3id.org/itk/ viewer: https://w3id.org/itk/viewer From 557ff7931101fd325987275bfb078d7274a98e11 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Thu, 14 Mar 2024 23:32:46 -0400 Subject: [PATCH 11/25] feat(model): add viewport to Renderer --- model/itk-viewer.yml | 38 ++++++++++++++++++- .../clara-viz/itkviewer_clara_viz/renderer.py | 8 +++- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/model/itk-viewer.yml b/model/itk-viewer.yml index e0059be7..e62dec9c 100644 --- a/model/itk-viewer.yml +++ b/model/itk-viewer.yml @@ -44,6 +44,19 @@ classes: description: >- A viewport is a rectangular region of a viewer that displays a rendering of the scene. class_uri: viewer:Viewport + attributes: + width: + description: >- + The width of the viewport in pixels. + range: integer + required: true + ifabsent: int(640) + height: + description: >- + The height of the viewport in pixels. + range: integer + required: true + ifabsent: int(480) MultiscaleImage: abstract: true @@ -59,6 +72,21 @@ classes: description: >- A renderer is an actor that renders a scene to an in-memory RGB image for display in a viewport. class_uri: viewer:Renderer + attributes: + width: + description: >- + The width of the canvas in pixels. + range: integer + required: true + ifabsent: int(640) + height: + description: >- + The height of the canvas in pixels. + range: integer + required: true + ifabsent: int(480) + slots: + - viewport Event: @@ -73,4 +101,12 @@ classes: description: >- The type of the event. range: string - required: true \ No newline at end of file + required: true + +slots: + viewport: + description: >- + The viewport that displays the rendered RGB image. + domain: Renderer + range: Viewport + required: true \ No newline at end of file diff --git a/packages/clara-viz/itkviewer_clara_viz/renderer.py b/packages/clara-viz/itkviewer_clara_viz/renderer.py index acc0f384..c07f4265 100644 --- a/packages/clara-viz/itkviewer_clara_viz/renderer.py +++ b/packages/clara-viz/itkviewer_clara_viz/renderer.py @@ -1,3 +1,7 @@ +from itkviewer import Viewport, Renderer -class Renderer: - pass \ No newline at end of file +class ClaraVizRenderer(Renderer): + """itk-viewer renderer that renders images using ClaraViz.""" + + def __init__(self, viewport: Viewport, width: int=640, height: int=480): + super().__init__(viewport, width, height) \ No newline at end of file From c9b9d7ed2bb6fc86e40b3e218fba90d57c68ab17 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Fri, 15 Mar 2024 06:25:37 -0400 Subject: [PATCH 12/25] feat(python): use the generated pydantic model in the package --- packages/viewer/python/itkviewer/__init__.py | 10 +- packages/viewer/python/itkviewer/model.py | 97 +++++++++++++++++++ .../python/itkviewer/multiscale_image.py | 6 -- packages/viewer/python/itkviewer/viewer.py | 6 -- packages/viewer/python/itkviewer/viewport.py | 6 -- 5 files changed, 104 insertions(+), 21 deletions(-) create mode 100644 packages/viewer/python/itkviewer/model.py delete mode 100644 packages/viewer/python/itkviewer/multiscale_image.py delete mode 100644 packages/viewer/python/itkviewer/viewer.py delete mode 100644 packages/viewer/python/itkviewer/viewport.py diff --git a/packages/viewer/python/itkviewer/__init__.py b/packages/viewer/python/itkviewer/__init__.py index 1674d790..7ecd4c06 100644 --- a/packages/viewer/python/itkviewer/__init__.py +++ b/packages/viewer/python/itkviewer/__init__.py @@ -2,12 +2,16 @@ __version__ = "0.0.1" -from .viewer import Viewer -from .viewport import Viewport -from .multiscale_image import MultiscaleImage +from .model import ( + Viewer, + Viewport, + MultiscaleImage, + Renderer, +) __all__ = [ "MultiscaleImage", + "Renderer", "Viewer", "Viewport", ] diff --git a/packages/viewer/python/itkviewer/model.py b/packages/viewer/python/itkviewer/model.py new file mode 100644 index 00000000..84c3b172 --- /dev/null +++ b/packages/viewer/python/itkviewer/model.py @@ -0,0 +1,97 @@ +from __future__ import annotations +from datetime import datetime, date +from enum import Enum + +from decimal import Decimal +from typing import List, Dict, Optional, Any, Union +from pydantic import BaseModel as BaseModel, Field, validator +import re +import sys +if sys.version_info >= (3, 8): + from typing import Literal +else: + from typing_extensions import Literal + + +metamodel_version = "None" +version = "None" + +class WeakRefShimBaseModel(BaseModel): + __slots__ = '__weakref__' + +class ConfiguredBaseModel(WeakRefShimBaseModel, + validate_assignment = True, + validate_all = True, + underscore_attrs_are_private = True, + extra = 'forbid', + arbitrary_types_allowed = True, + use_enum_values = True): + + pass + + + +class Actor(ConfiguredBaseModel): + """ + In the Actor Model mathematical of computation, an actor is a computational entity that, in response to a message it receives, can concurrently: +- send a finite number of messages to other actors; - create a finite number of new actors; - designate the behavior to be used for the next message it receives. +Supported messages are defined in the Event classes. The valid Events' for an Actor are defined defined by the `receives` relationship. To send an Event to an Actor, use the `send` method. +Actors are typically implement as finite state machines. + """ + None + + + +class Viewer(Actor): + """ + A viewer is an interface that allows users to view and interact with multi-dimensional images, geometry, and point sets. + """ + None + + + +class Viewport(Actor): + """ + A viewport is a rectangular region of a viewer that displays a rendering of the scene. + """ + width: int = Field(640, description="""The width of the viewport in pixels.""") + height: int = Field(480, description="""The height of the viewport in pixels.""") + + + +class MultiscaleImage(Actor): + """ + A multiscale image is a multi-dimensional image, based on the OME-Zarr data model, often preprocessed, that supports efficient rendering at multiple resolutions. + """ + None + + + +class Renderer(Actor): + """ + A renderer is an actor that renders a scene to an in-memory RGB image for display in a viewport. + """ + viewport: Viewport = Field(..., description="""The viewport that displays the rendered RGB image.""") + width: int = Field(640, description="""The width of the canvas in pixels.""") + height: int = Field(480, description="""The height of the canvas in pixels.""") + + + +class Event(ConfiguredBaseModel): + """ + An event is a message that can be sent to an actor. The actor can respond to the event by changing its state, sending messages to other actors, or creating new actors. + """ + type: str = Field(..., description="""The type of the event.""") + + + + +# Update forward refs +# see https://pydantic-docs.helpmanual.io/usage/postponed_annotations/ +Actor.update_forward_refs() +Viewer.update_forward_refs() +Viewport.update_forward_refs() +MultiscaleImage.update_forward_refs() +Renderer.update_forward_refs() +Event.update_forward_refs() + diff --git a/packages/viewer/python/itkviewer/multiscale_image.py b/packages/viewer/python/itkviewer/multiscale_image.py deleted file mode 100644 index 05694134..00000000 --- a/packages/viewer/python/itkviewer/multiscale_image.py +++ /dev/null @@ -1,6 +0,0 @@ -from abc import ABC - - -class MultiscaleImage(ABC): - """Multiscale spatial image.""" - pass \ No newline at end of file diff --git a/packages/viewer/python/itkviewer/viewer.py b/packages/viewer/python/itkviewer/viewer.py deleted file mode 100644 index f94dd42d..00000000 --- a/packages/viewer/python/itkviewer/viewer.py +++ /dev/null @@ -1,6 +0,0 @@ -from abc import ABC, abstractmethod - - -class Viewer(ABC): - """Viewer class.""" - pass diff --git a/packages/viewer/python/itkviewer/viewport.py b/packages/viewer/python/itkviewer/viewport.py deleted file mode 100644 index aa69e6dd..00000000 --- a/packages/viewer/python/itkviewer/viewport.py +++ /dev/null @@ -1,6 +0,0 @@ -from abc import ABC - - -class Viewport(ABC): - """Viewport class.""" - pass \ No newline at end of file From 29fbd8a5ffff695f18026a6726dff64dee7e7e8c Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Fri, 15 Mar 2024 07:39:55 -0400 Subject: [PATCH 13/25] feat(model): add RendererEvent, RendererEventType --- model/itk-viewer.yml | 36 +++++++++++++++++- .../clara-viz/itkviewer_clara_viz/renderer.py | 23 +++++++++++- packages/viewer/python/itkviewer/__init__.py | 4 ++ packages/viewer/python/itkviewer/model.py | 37 ++++++++++++++++++- 4 files changed, 95 insertions(+), 5 deletions(-) diff --git a/model/itk-viewer.yml b/model/itk-viewer.yml index e62dec9c..b58249cc 100644 --- a/model/itk-viewer.yml +++ b/model/itk-viewer.yml @@ -100,13 +100,45 @@ classes: identifier: true description: >- The type of the event. - range: string + range: EventType required: true + RendererEvent: + abstract: true + is_a: Event + description: >- + A RendererEvent is an Event supported by a Renderer. + class_uri: viewer:RendererEvent + slot_usage: + type: + range: RendererEventType + + RenderEvent: + is_a: RendererEvent + description: >- + A render event is a message that instructs a renderer to render a scene to an in-memory RGB image. + class_uri: viewer:RenderEvent + slots: viewport: description: >- The viewport that displays the rendered RGB image. domain: Renderer range: Viewport - required: true \ No newline at end of file + required: true + +enums: + EventType: + description: >- + The types of events that can be sent to actors. + enum_uri: viewer:EventTypes + + RendererEventType: + description: >- + The types of render events that can be sent to renderers. + enum_uri: viewer:RenderEventTypes + inherits: EventType + permissible_values: + Render: + description: >- + A render event is a message that instructs a renderer to render a scene to an in-memory RGB image. \ No newline at end of file diff --git a/packages/clara-viz/itkviewer_clara_viz/renderer.py b/packages/clara-viz/itkviewer_clara_viz/renderer.py index c07f4265..7177e51e 100644 --- a/packages/clara-viz/itkviewer_clara_viz/renderer.py +++ b/packages/clara-viz/itkviewer_clara_viz/renderer.py @@ -1,7 +1,26 @@ -from itkviewer import Viewport, Renderer +from typing import List + +from itkviewer import Viewport, Renderer, RendererEvent, RendererEventType class ClaraVizRenderer(Renderer): """itk-viewer renderer that renders images using ClaraViz.""" def __init__(self, viewport: Viewport, width: int=640, height: int=480): - super().__init__(viewport, width, height) \ No newline at end of file + super().__init__(viewport, width, height) + + async def batch(self, events: List[RendererEvent]): + """Batch process a list of events.""" + for event in events: + self.send(event) + + async def send(self, event: RendererEvent): + """Send an event to the renderer.""" + match event.type: + case RendererEventType.Render: + self.render() + case _: + raise ValueError(f"Unknown event type: {event.type}") + + async def render(self): + """Render the scene to an in-memory RGB image.""" + pass \ No newline at end of file diff --git a/packages/viewer/python/itkviewer/__init__.py b/packages/viewer/python/itkviewer/__init__.py index 7ecd4c06..8a1b1ea7 100644 --- a/packages/viewer/python/itkviewer/__init__.py +++ b/packages/viewer/python/itkviewer/__init__.py @@ -7,11 +7,15 @@ Viewport, MultiscaleImage, Renderer, + RendererEvent, + RendererEventType, ) __all__ = [ "MultiscaleImage", "Renderer", + "RendererEvent", + "RendererEventType", "Viewer", "Viewport", ] diff --git a/packages/viewer/python/itkviewer/model.py b/packages/viewer/python/itkviewer/model.py index 84c3b172..0121c2d3 100644 --- a/packages/viewer/python/itkviewer/model.py +++ b/packages/viewer/python/itkviewer/model.py @@ -31,6 +31,23 @@ class ConfiguredBaseModel(WeakRefShimBaseModel, +class EventType(str): + """ + The types of events that can be sent to actors. + """ + + dummy = "dummy" + + +class RendererEventType(str, Enum): + """ + The types of render events that can be sent to renderers. + """ + # A render event is a message that instructs a renderer to render a scene to an in-memory RGB image. + Render = "Render" + + + class Actor(ConfiguredBaseModel): """ In the Actor Model mathematical of computation, an actor is a computational entity that, in response to a message it receives, can concurrently: @@ -81,7 +98,23 @@ class Event(ConfiguredBaseModel): """ An event is a message that can be sent to an actor. The actor can respond to the event by changing its state, sending messages to other actors, or creating new actors. """ - type: str = Field(..., description="""The type of the event.""") + type: EventType = Field(..., description="""The type of the event.""") + + + +class RendererEvent(Event): + """ + A RendererEvent is an Event supported by a Renderer. + """ + type: RendererEventType = Field(..., description="""The type of the event.""") + + + +class RenderEvent(RendererEvent): + """ + A render event is a message that instructs a renderer to render a scene to an in-memory RGB image. + """ + type: RendererEventType = Field(..., description="""The type of the event.""") @@ -94,4 +127,6 @@ class Event(ConfiguredBaseModel): MultiscaleImage.update_forward_refs() Renderer.update_forward_refs() Event.update_forward_refs() +RendererEvent.update_forward_refs() +RenderEvent.update_forward_refs() From bdaad87338c9dfb5cc6d7041a33185475b82c22c Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Fri, 15 Mar 2024 09:42:55 -0400 Subject: [PATCH 14/25] feat(model): add UnknownEventAction All actors are required to define it. --- model/itk-viewer.yml | 26 +++++++++++++++++-- .../itk_viewer_agave_renderer/__init__.py | 2 +- .../itk_viewer_agave_renderer/renderer.py | 23 +++++++--------- .../clara-viz/itkviewer_clara_viz/renderer.py | 23 ++++++++++++---- packages/viewer/python/itkviewer/__init__.py | 6 +++-- packages/viewer/python/itkviewer/model.py | 21 ++++++++++++--- 6 files changed, 74 insertions(+), 27 deletions(-) diff --git a/model/itk-viewer.yml b/model/itk-viewer.yml index b58249cc..3c2a16f8 100644 --- a/model/itk-viewer.yml +++ b/model/itk-viewer.yml @@ -28,6 +28,8 @@ classes: Actors are typically implement as finite state machines. class_uri: viewer:Actor + slots: + - unknown_event_action Viewer: abstract: true @@ -126,17 +128,37 @@ slots: domain: Renderer range: Viewport required: true + unknown_event_action: + description: >- + The action to take when an unknown event is received. + domain: Actor + range: UnknownEventAction enums: EventType: description: >- The types of events that can be sent to actors. - enum_uri: viewer:EventTypes + enum_uri: viewer:EventType + + UnknownEventAction: + description: >- + The types of actions that can be taken when an unknown event is received. + enum_uri: viewer:UnknownEventAction + permissible_values: + Ignore: + description: >- + Ignore the event. + Warn: + description: >- + Log a warning and ignore the event. + Error: + description: >- + Throw an error. RendererEventType: description: >- The types of render events that can be sent to renderers. - enum_uri: viewer:RenderEventTypes + enum_uri: viewer:RenderEventType inherits: EventType permissible_values: Render: diff --git a/packages/agave-renderer/itk_viewer_agave_renderer/__init__.py b/packages/agave-renderer/itk_viewer_agave_renderer/__init__.py index 7823ca61..102388ba 100644 --- a/packages/agave-renderer/itk_viewer_agave_renderer/__init__.py +++ b/packages/agave-renderer/itk_viewer_agave_renderer/__init__.py @@ -2,4 +2,4 @@ # # SPDX-License-Identifier: Apache-2.0 -from .renderer import Renderer +from .renderer import AgaveRenderer diff --git a/packages/agave-renderer/itk_viewer_agave_renderer/renderer.py b/packages/agave-renderer/itk_viewer_agave_renderer/renderer.py index 24c9614e..2eaa7f96 100644 --- a/packages/agave-renderer/itk_viewer_agave_renderer/renderer.py +++ b/packages/agave-renderer/itk_viewer_agave_renderer/renderer.py @@ -16,6 +16,7 @@ import fractions from av import VideoFrame from aiortc import MediaStreamTrack +from itkviewer import Renderer, UnknownEventAction # Should match constant in connected clients. # The WebRTC service id is different from this @@ -40,7 +41,7 @@ async def recv(self): frame = VideoFrame.from_image(img) - frame.pts = self.count + frame.pts = self.count self.count+=1 frame.time_base = fractions.Fraction(1, 1000) return frame @@ -64,22 +65,16 @@ def memory_redraw(self): return img -# how to handle unknown events -class UnknownEventAction(Enum): - ERROR = auto() - WARNING = auto() - IGNORE = auto() - - -class Renderer: +class AgaveRenderer(Renderer): def __init__( - self, width=500, height=400, unknown_event_action=UnknownEventAction.WARNING + self, width=500, height=400, unknown_event_action=UnknownEventAction.Warning ): self.width = width self.height = height self.unknown_event_action = unknown_event_action self.render_time = .1 self.agave = None + super().__init__(width, height, unknown_event_action) async def setup(self): # Note: the agave websocket server needs to be running @@ -167,11 +162,11 @@ async def update_renderer(self, events): def handle_unknown_event(self, event_type): match self.unknown_event_action: - case UnknownEventAction.ERROR: - raise Exception(f"Unknown event type: {event_type}") - case UnknownEventAction.WARNING: + case UnknownEventAction.Error: + raise ValueError(f"Unknown event type: {event_type}") + case UnknownEventAction.Warning: print(f"Unknown event type: {event_type}", flush=True) - case UnknownEventAction.IGNORE: + case UnknownEventAction.Ignore: pass diff --git a/packages/clara-viz/itkviewer_clara_viz/renderer.py b/packages/clara-viz/itkviewer_clara_viz/renderer.py index 7177e51e..0034fae9 100644 --- a/packages/clara-viz/itkviewer_clara_viz/renderer.py +++ b/packages/clara-viz/itkviewer_clara_viz/renderer.py @@ -1,12 +1,16 @@ +# SPDX-FileCopyrightText: 2024-present NumFOCUS +# +# SPDX-License-Identifier: Apache-2.0 + from typing import List -from itkviewer import Viewport, Renderer, RendererEvent, RendererEventType +from itkviewer import Viewport, Renderer, RendererEvent, RendererEventType, UnknownEventAction class ClaraVizRenderer(Renderer): """itk-viewer renderer that renders images using ClaraViz.""" - def __init__(self, viewport: Viewport, width: int=640, height: int=480): - super().__init__(viewport, width, height) + def __init__(self, viewport: Viewport, width: int=640, height: int=480, unknown_event_action=UnknownEventAction.Warning): + super().__init__(viewport, width, height, unknown_event_action) async def batch(self, events: List[RendererEvent]): """Batch process a list of events.""" @@ -19,8 +23,17 @@ async def send(self, event: RendererEvent): case RendererEventType.Render: self.render() case _: - raise ValueError(f"Unknown event type: {event.type}") + self.handle_unknown_event(event_type) async def render(self): """Render the scene to an in-memory RGB image.""" - pass \ No newline at end of file + pass + + def handle_unknown_event(self, event_type): + match self.unknown_event_action: + case UnknownEventAction.Error: + raise ValueError(f"Unknown event type: {event_type}") + case UnknownEventAction.Warning: + print(f"Unknown event type: {event_type}", flush=True) + case UnknownEventAction.Ignore: + pass \ No newline at end of file diff --git a/packages/viewer/python/itkviewer/__init__.py b/packages/viewer/python/itkviewer/__init__.py index 8a1b1ea7..2178a3bf 100644 --- a/packages/viewer/python/itkviewer/__init__.py +++ b/packages/viewer/python/itkviewer/__init__.py @@ -3,12 +3,13 @@ __version__ = "0.0.1" from .model import ( - Viewer, - Viewport, MultiscaleImage, Renderer, RendererEvent, RendererEventType, + UnknownEventAction, + Viewer, + Viewport, ) __all__ = [ @@ -17,5 +18,6 @@ "RendererEvent", "RendererEventType", "Viewer", + "UnknownEventAction", "Viewport", ] diff --git a/packages/viewer/python/itkviewer/model.py b/packages/viewer/python/itkviewer/model.py index 0121c2d3..6f7b816b 100644 --- a/packages/viewer/python/itkviewer/model.py +++ b/packages/viewer/python/itkviewer/model.py @@ -39,6 +39,19 @@ class EventType(str): dummy = "dummy" +class UnknownEventAction(str, Enum): + """ + The types of actions that can be taken when an unknown event is received. + """ + # Ignore the event. + Ignore = "Ignore" + # Log a warning and ignore the event. + Warn = "Warn" + # Throw an error. + Error = "Error" + + + class RendererEventType(str, Enum): """ The types of render events that can be sent to renderers. @@ -55,7 +68,7 @@ class Actor(ConfiguredBaseModel): Supported messages are defined in the Event classes. The valid Events' for an Actor are defined defined by the `receives` relationship. To send an Event to an Actor, use the `send` method. Actors are typically implement as finite state machines. """ - None + unknown_event_action: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") @@ -63,7 +76,7 @@ class Viewer(Actor): """ A viewer is an interface that allows users to view and interact with multi-dimensional images, geometry, and point sets. """ - None + unknown_event_action: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") @@ -73,6 +86,7 @@ class Viewport(Actor): """ width: int = Field(640, description="""The width of the viewport in pixels.""") height: int = Field(480, description="""The height of the viewport in pixels.""") + unknown_event_action: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") @@ -80,7 +94,7 @@ class MultiscaleImage(Actor): """ A multiscale image is a multi-dimensional image, based on the OME-Zarr data model, often preprocessed, that supports efficient rendering at multiple resolutions. """ - None + unknown_event_action: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") @@ -91,6 +105,7 @@ class Renderer(Actor): viewport: Viewport = Field(..., description="""The viewport that displays the rendered RGB image.""") width: int = Field(640, description="""The width of the canvas in pixels.""") height: int = Field(480, description="""The height of the canvas in pixels.""") + unknown_event_action: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") From c692d860f49d8368fc64613d95a9c02fd6ddf4fc Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Fri, 15 Mar 2024 09:53:32 -0400 Subject: [PATCH 15/25] feat(clara): instantiate internal renderer --- .../agave-renderer/itk_viewer_agave_renderer/renderer.py | 6 +++--- packages/clara-viz/itkviewer_clara_viz/renderer.py | 7 ++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/agave-renderer/itk_viewer_agave_renderer/renderer.py b/packages/agave-renderer/itk_viewer_agave_renderer/renderer.py index 2eaa7f96..ff3abc9b 100644 --- a/packages/agave-renderer/itk_viewer_agave_renderer/renderer.py +++ b/packages/agave-renderer/itk_viewer_agave_renderer/renderer.py @@ -16,7 +16,7 @@ import fractions from av import VideoFrame from aiortc import MediaStreamTrack -from itkviewer import Renderer, UnknownEventAction +from itkviewer import Viewport, Renderer, UnknownEventAction # Should match constant in connected clients. # The WebRTC service id is different from this @@ -67,14 +67,14 @@ def memory_redraw(self): class AgaveRenderer(Renderer): def __init__( - self, width=500, height=400, unknown_event_action=UnknownEventAction.Warning + self, viewport: Viewport, width: int=500, height: int=400, unknown_event_action: UnknownEventAction=UnknownEventAction.Warning ): self.width = width self.height = height self.unknown_event_action = unknown_event_action self.render_time = .1 self.agave = None - super().__init__(width, height, unknown_event_action) + super().__init__(viewport, width, height, unknown_event_action) async def setup(self): # Note: the agave websocket server needs to be running diff --git a/packages/clara-viz/itkviewer_clara_viz/renderer.py b/packages/clara-viz/itkviewer_clara_viz/renderer.py index 0034fae9..b3ebc65d 100644 --- a/packages/clara-viz/itkviewer_clara_viz/renderer.py +++ b/packages/clara-viz/itkviewer_clara_viz/renderer.py @@ -6,12 +6,17 @@ from itkviewer import Viewport, Renderer, RendererEvent, RendererEventType, UnknownEventAction +from clara.viz.core import Renderer as InternalRenderer +import numpy as np + class ClaraVizRenderer(Renderer): """itk-viewer renderer that renders images using ClaraViz.""" - def __init__(self, viewport: Viewport, width: int=640, height: int=480, unknown_event_action=UnknownEventAction.Warning): + def __init__(self, viewport: Viewport, width: int=640, height: int=480, unknown_event_action: UnknownEventAction=UnknownEventAction.Warning): super().__init__(viewport, width, height, unknown_event_action) + self._renderer = InternalRenderer() + async def batch(self, events: List[RendererEvent]): """Batch process a list of events.""" for event in events: From 6845862dd545250054c38e50508eb8a50d905cdd Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Fri, 15 Mar 2024 09:59:41 -0400 Subject: [PATCH 16/25] feat(model): add version --- model/itk-viewer.yml | 1 + packages/viewer/python/itkviewer/model.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/model/itk-viewer.yml b/model/itk-viewer.yml index 3c2a16f8..51a61e73 100644 --- a/model/itk-viewer.yml +++ b/model/itk-viewer.yml @@ -1,5 +1,6 @@ id: https://w3id.org/itk/viewer name: itk-viewer +version: 0.0.1 description: >- The itk-viewer model defines the classes and relationships for a viewer that allows users to view and interact with multi-dimensional images, geometry, and point sets. license: https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/packages/viewer/python/itkviewer/model.py b/packages/viewer/python/itkviewer/model.py index 6f7b816b..d95bd77d 100644 --- a/packages/viewer/python/itkviewer/model.py +++ b/packages/viewer/python/itkviewer/model.py @@ -14,7 +14,7 @@ metamodel_version = "None" -version = "None" +version = "0.0.1" class WeakRefShimBaseModel(BaseModel): __slots__ = '__weakref__' From dd602d89ecb01884802beb51f665a673a14103f3 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Sat, 16 Mar 2024 12:01:18 -0400 Subject: [PATCH 17/25] feat: initial ViewerEvent SetImageEvent --- model/itk-viewer.yml | 64 +++++++++++++++++++++++ packages/viewer/python/itkviewer/model.py | 48 +++++++++++++++++ 2 files changed, 112 insertions(+) diff --git a/model/itk-viewer.yml b/model/itk-viewer.yml index 51a61e73..118bba86 100644 --- a/model/itk-viewer.yml +++ b/model/itk-viewer.yml @@ -6,6 +6,7 @@ description: >- license: https://creativecommons.org/publicdomain/zero/1.0/ prefixes: itk: https://w3id.org/itk/ + wasm: https://w3id.org/itk/wasm viewer: https://w3id.org/itk/viewer linkml: https://w3id.org/linkml/ imports: @@ -61,6 +62,11 @@ classes: required: true ifabsent: int(480) + Image: + description: >- + An itk-wasm Image to be displayed in the viewer. + class_uri: wasm:Image + MultiscaleImage: abstract: true is_a: Actor @@ -69,6 +75,15 @@ classes: that supports efficient rendering at multiple resolutions. class_uri: viewer:MultiscaleImage + DataManager: + abstract: true + is_a: Actor + description: >- + A data manager is an actor that manages the loading and caching of data for rendering. + class_uri: viewer:DataManager + slots: + - images + Renderer: abstract: true is_a: Actor @@ -106,6 +121,29 @@ classes: range: EventType required: true + ViewerEvent: + abstract: true + is_a: Event + description: >- + A ViewerEvent is an Event that can be sent to a Viewer. + class_uri: viewer:ViewerEvent + slot_usage: + type: + range: ViewerEventType + + SetImageEvent: + is_a: ViewerEvent + description: >- + A SetImageEvent is an Event that sets an image to be displayed in a viewer. + class_uri: viewer:SetImageEvent + slots: + - image + attributes: + name: + description: >- + The name of the image to be displayed in the viewer. + range: string + RendererEvent: abstract: true is_a: Event @@ -129,12 +167,28 @@ slots: domain: Renderer range: Viewport required: true + unknown_event_action: description: >- The action to take when an unknown event is received. domain: Actor range: UnknownEventAction + image: + description: >- + The image to be displayed in the viewer. + domain: SetImageEvent + range: Image + required: true + + images: + description: >- + The images to be displayed in the viewer. + domain: DataManager + range: Image + multivalued: true + required: true + enums: EventType: description: >- @@ -156,6 +210,16 @@ enums: description: >- Throw an error. + ViewerEventType: + description: >- + The types of events that can be sent to viewers. + enum_uri: viewer:ViewerEventType + inherits: EventType + permissible_values: + SetImage: + description: >- + Set an image to be displayed in the viewer. + RendererEventType: description: >- The types of render events that can be sent to renderers. diff --git a/packages/viewer/python/itkviewer/model.py b/packages/viewer/python/itkviewer/model.py index d95bd77d..c211af5e 100644 --- a/packages/viewer/python/itkviewer/model.py +++ b/packages/viewer/python/itkviewer/model.py @@ -52,6 +52,15 @@ class UnknownEventAction(str, Enum): +class ViewerEventType(str, Enum): + """ + The types of events that can be sent to viewers. + """ + # Set an image to be displayed in the viewer. + SetImage = "SetImage" + + + class RendererEventType(str, Enum): """ The types of render events that can be sent to renderers. @@ -90,6 +99,14 @@ class Viewport(Actor): +class Image(ConfiguredBaseModel): + """ + An itk-wasm Image to be displayed in the viewer. + """ + None + + + class MultiscaleImage(Actor): """ A multiscale image is a multi-dimensional image, based on the OME-Zarr data model, often preprocessed, that supports efficient rendering at multiple resolutions. @@ -98,6 +115,15 @@ class MultiscaleImage(Actor): +class DataManager(Actor): + """ + A data manager is an actor that manages the loading and caching of data for rendering. + """ + images: List[Image] = Field(default_factory=list, description="""The images to be displayed in the viewer.""") + unknown_event_action: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") + + + class Renderer(Actor): """ A renderer is an actor that renders a scene to an in-memory RGB image for display in a viewport. @@ -117,6 +143,24 @@ class Event(ConfiguredBaseModel): +class ViewerEvent(Event): + """ + A ViewerEvent is an Event that can be sent to a Viewer. + """ + type: ViewerEventType = Field(..., description="""The type of the event.""") + + + +class SetImageEvent(ViewerEvent): + """ + A SetImageEvent is an Event that sets an image to be displayed in a viewer. + """ + image: Image = Field(..., description="""The image to be displayed in the viewer.""") + name: Optional[str] = Field(None, description="""The name of the image to be displayed in the viewer.""") + type: ViewerEventType = Field(..., description="""The type of the event.""") + + + class RendererEvent(Event): """ A RendererEvent is an Event supported by a Renderer. @@ -139,9 +183,13 @@ class RenderEvent(RendererEvent): Actor.update_forward_refs() Viewer.update_forward_refs() Viewport.update_forward_refs() +Image.update_forward_refs() MultiscaleImage.update_forward_refs() +DataManager.update_forward_refs() Renderer.update_forward_refs() Event.update_forward_refs() +ViewerEvent.update_forward_refs() +SetImageEvent.update_forward_refs() RendererEvent.update_forward_refs() RenderEvent.update_forward_refs() From 7da7f149cfdfecbec238cd49f5b66c0aa491c406 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Sat, 16 Mar 2024 22:34:49 -0400 Subject: [PATCH 18/25] feat(python): ViewerMachine --- packages/viewer/python/itkviewer/viewer.py | 33 ++++++++++++++++++++++ packages/viewer/python/pyproject.toml | 1 + 2 files changed, 34 insertions(+) create mode 100644 packages/viewer/python/itkviewer/viewer.py diff --git a/packages/viewer/python/itkviewer/viewer.py b/packages/viewer/python/itkviewer/viewer.py new file mode 100644 index 00000000..086f8e4e --- /dev/null +++ b/packages/viewer/python/itkviewer/viewer.py @@ -0,0 +1,33 @@ +from typing import Optional + +from statemachine import StateMachine, State + +from .model import Viewer, ViewerEventType + +class ViewerMachine(StateMachine): + idle = State(initial=True) + loading = State() + running = State() + shutting_down = State(final=True) + + load = idle.to(loading) + run = loading.to(running) + shutdown = running.to(shutting_down) + + def __init__(self, config: Optional[Viewer]=None): + super(ViewerMachine, self).__init__() + + self.viewer = config or Viewer() + if config: + self.load_config(config) + + @property + def config(self): + return self.viewer + + @config.setter + def config(self, config: Viewer): + self.load_config(config) + + def load_config(self, config: Viewer): + self.viewer = config diff --git a/packages/viewer/python/pyproject.toml b/packages/viewer/python/pyproject.toml index 9b68d587..d7d649f7 100644 --- a/packages/viewer/python/pyproject.toml +++ b/packages/viewer/python/pyproject.toml @@ -32,6 +32,7 @@ requires-python = ">=3.8" dependencies = [ "numpy", "pydantic", + "python-statemachine", ] [project.urls] From 4ab7393575b360a01a1c120704a778a87655906a Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Sun, 17 Mar 2024 11:42:18 -0400 Subject: [PATCH 19/25] feat: start DataManagerMachine --- .../viewer/python/itkviewer/data_manager.py | 34 +++++++++++++++++++ packages/viewer/python/itkviewer/viewer.py | 12 ++++--- 2 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 packages/viewer/python/itkviewer/data_manager.py diff --git a/packages/viewer/python/itkviewer/data_manager.py b/packages/viewer/python/itkviewer/data_manager.py new file mode 100644 index 00000000..cfeb4ae2 --- /dev/null +++ b/packages/viewer/python/itkviewer/data_manager.py @@ -0,0 +1,34 @@ +from typing import Optional + +from statemachine import StateMachine, State + +from .model import DataManager + +class DataManagerMachine(StateMachine): + idle = State(initial=True) + loading = State() + running = State() + shutting_down = State(final=True) + + load = idle.to(loading) + run = loading.to(running) + shutdown = running.to(shutting_down) + + def __init__(self, config: Optional[DataManager]=None): + super(DataManagerMachine, self).__init__() + + if config: + self.load_config(config) + + @property + def config(self): + return { + + } + + @config.setter + def config(self, config: DataManager): + self.load_config(config) + + def load_config(self, config: DataManager): + self.data_manager = config \ No newline at end of file diff --git a/packages/viewer/python/itkviewer/viewer.py b/packages/viewer/python/itkviewer/viewer.py index 086f8e4e..ded90ea7 100644 --- a/packages/viewer/python/itkviewer/viewer.py +++ b/packages/viewer/python/itkviewer/viewer.py @@ -2,7 +2,8 @@ from statemachine import StateMachine, State -from .model import Viewer, ViewerEventType +from .model import Viewer, DataManager +from .data_manager import DataManagerMachine class ViewerMachine(StateMachine): idle = State(initial=True) @@ -17,17 +18,20 @@ class ViewerMachine(StateMachine): def __init__(self, config: Optional[Viewer]=None): super(ViewerMachine, self).__init__() - self.viewer = config or Viewer() if config: self.load_config(config) + else: + self.load_config({}) @property def config(self): - return self.viewer + return { + 'DataManager': self.data_manager.config + } @config.setter def config(self, config: Viewer): self.load_config(config) def load_config(self, config: Viewer): - self.viewer = config + self.data_manager = DataManagerMachine(config=config.get('DataManager', DataManager())) From c258a44a15915fa89c69da243466e6d89bf95b0b Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Mon, 18 Mar 2024 09:29:29 -0400 Subject: [PATCH 20/25] feat(model): define ImageData --- model/itk-viewer.yml | 56 ++++++++++++++++++- packages/viewer/python/itkviewer/model.py | 48 +++++++++++++++- .../python/itkviewer/multiscale_image.py | 0 packages/viewer/python/pyproject.toml | 1 + 4 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 packages/viewer/python/itkviewer/multiscale_image.py diff --git a/model/itk-viewer.yml b/model/itk-viewer.yml index 118bba86..b8f80bc9 100644 --- a/model/itk-viewer.yml +++ b/model/itk-viewer.yml @@ -67,6 +67,58 @@ classes: An itk-wasm Image to be displayed in the viewer. class_uri: wasm:Image + ImageDataUri: + description: >- + A serialized itk-wasm Image to be displayed in the viewer, compressed and base64 encoded. + class_uri: viewer:ImageDataUri + attributes: + uri: + description: >- + The URI of the image data. + range: string + required: true + + StoreModel: + abstract: true + description: >- + Parameters of a Zarr store following the data model implied by Zarr-Python. + + DirectoryStore: + is_a: StoreModel + description: >- + A Zarr store that is backed by a directory on the file system. + attributes: + path: + description: >- + The path to the directory on the file system that contains the Zarr store. + range: string + required: true + + FSStore: + is_a: StoreModel + description: >- + A Zarr store that can be wrapped an fsspec.FSMap in Python to give access to arbitrary filesystems + attributes: + url: + description: >- + Protocol and path, like “s3://bucket/root.zarr” or "https://example.com/image.ome.zarr". + range: string + required: true + + ImageData: + description: >- + Image data displayed in the viewer. + class_uri: viewer:ImageData + attributes: + dataUri: + description: >- + The image data. + range: ImageDataUri + store: + description: >- + The OME-Zarr store model for the image data. + range: StoreModel + MultiscaleImage: abstract: true is_a: Actor @@ -183,9 +235,9 @@ slots: images: description: >- - The images to be displayed in the viewer. + The images displayed by the viewer. domain: DataManager - range: Image + range: ImageData multivalued: true required: true diff --git a/packages/viewer/python/itkviewer/model.py b/packages/viewer/python/itkviewer/model.py index c211af5e..8e4cc7e5 100644 --- a/packages/viewer/python/itkviewer/model.py +++ b/packages/viewer/python/itkviewer/model.py @@ -107,6 +107,47 @@ class Image(ConfiguredBaseModel): +class ImageDataUri(ConfiguredBaseModel): + """ + A serialized itk-wasm Image to be displayed in the viewer, compressed and base64 encoded. + """ + uri: str = Field(..., description="""The URI of the image data.""") + + + +class StoreModel(ConfiguredBaseModel): + """ + Parameters of a Zarr store following the data model implied by Zarr-Python. + """ + None + + + +class DirectoryStore(StoreModel): + """ + A Zarr store that is backed by a directory on the file system. + """ + path: str = Field(..., description="""The path to the directory on the file system that contains the Zarr store.""") + + + +class FSStore(StoreModel): + """ + A Zarr store that can be wrapped an fsspec.FSMap in Python to give access to arbitrary filesystems + """ + url: str = Field(..., description="""Protocol and path, like “s3://bucket/root.zarr” or \"https://example.com/image.ome.zarr\".""") + + + +class ImageData(ConfiguredBaseModel): + """ + Image data displayed in the viewer. + """ + dataUri: Optional[ImageDataUri] = Field(None, description="""The image data.""") + store: Optional[StoreModel] = Field(None, description="""The OME-Zarr store model for the image data.""") + + + class MultiscaleImage(Actor): """ A multiscale image is a multi-dimensional image, based on the OME-Zarr data model, often preprocessed, that supports efficient rendering at multiple resolutions. @@ -119,7 +160,7 @@ class DataManager(Actor): """ A data manager is an actor that manages the loading and caching of data for rendering. """ - images: List[Image] = Field(default_factory=list, description="""The images to be displayed in the viewer.""") + images: List[ImageData] = Field(default_factory=list, description="""The images displayed by the viewer.""") unknown_event_action: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") @@ -184,6 +225,11 @@ class RenderEvent(RendererEvent): Viewer.update_forward_refs() Viewport.update_forward_refs() Image.update_forward_refs() +ImageDataUri.update_forward_refs() +StoreModel.update_forward_refs() +DirectoryStore.update_forward_refs() +FSStore.update_forward_refs() +ImageData.update_forward_refs() MultiscaleImage.update_forward_refs() DataManager.update_forward_refs() Renderer.update_forward_refs() diff --git a/packages/viewer/python/itkviewer/multiscale_image.py b/packages/viewer/python/itkviewer/multiscale_image.py new file mode 100644 index 00000000..e69de29b diff --git a/packages/viewer/python/pyproject.toml b/packages/viewer/python/pyproject.toml index d7d649f7..d5df687c 100644 --- a/packages/viewer/python/pyproject.toml +++ b/packages/viewer/python/pyproject.toml @@ -31,6 +31,7 @@ dynamic = ["version"] requires-python = ">=3.8" dependencies = [ "numpy", + "ngff-zarr", "pydantic", "python-statemachine", ] From 7a0d3c7dae0ac23f6cd9f60b3593e5c7a340c073 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Mon, 18 Mar 2024 11:35:37 -0400 Subject: [PATCH 21/25] feat(model): add StoreModelType --- model/itk-viewer.yml | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/model/itk-viewer.yml b/model/itk-viewer.yml index b8f80bc9..f101bc3f 100644 --- a/model/itk-viewer.yml +++ b/model/itk-viewer.yml @@ -82,6 +82,12 @@ classes: abstract: true description: >- Parameters of a Zarr store following the data model implied by Zarr-Python. + attributes: + type: + description: >- + The type of the Zarr store model. + range: StoreModelType + required: true DirectoryStore: is_a: StoreModel @@ -280,4 +286,16 @@ enums: permissible_values: Render: description: >- - A render event is a message that instructs a renderer to render a scene to an in-memory RGB image. \ No newline at end of file + A render event is a message that instructs a renderer to render a scene to an in-memory RGB image. + + StoreModelType: + description: >- + The types of Zarr store models. + enum_uri: viewer:StoreModelType + permissible_values: + Directory: + description: >- + A Zarr store that is backed by a directory on the file system. + FSStore: + description: >- + A Zarr store that can be wrapped an fsspec.FSMap in Python to give access to arbitrary filesystems. \ No newline at end of file From 1c92eb9865998f6d843a4c056c33e24038237a31 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Mon, 18 Mar 2024 23:03:06 -0400 Subject: [PATCH 22/25] feat(python): instantiate ViewerMachine, DataManagerMachine --- environment.yml | 1 + model/gen-python.sh | 2 +- model/itk-viewer.yml | 14 ++- packages/viewer/python/itkviewer/__init__.py | 5 ++ .../viewer/python/itkviewer/data_manager.py | 42 ++++++--- packages/viewer/python/itkviewer/model.py | 86 +++++++++++-------- packages/viewer/python/itkviewer/viewer.py | 31 ++++--- packages/viewer/python/pyproject.toml | 1 + packages/viewer/python/test/__init__.py | 0 packages/viewer/python/test/common.py | 3 + .../viewer/python/test/test_data_manager.py | 20 +++++ 11 files changed, 144 insertions(+), 61 deletions(-) create mode 100644 packages/viewer/python/test/__init__.py create mode 100644 packages/viewer/python/test/common.py create mode 100644 packages/viewer/python/test/test_data_manager.py diff --git a/environment.yml b/environment.yml index 84170a82..38159d3e 100644 --- a/environment.yml +++ b/environment.yml @@ -9,3 +9,4 @@ dependencies: - python-dotenv - -e ./packages/agave-renderer - -e ./packages/remote-image + - itkwasm-image-io diff --git a/model/gen-python.sh b/model/gen-python.sh index 75e9f4e6..8accd6da 100755 --- a/model/gen-python.sh +++ b/model/gen-python.sh @@ -5,4 +5,4 @@ script_dir="`cd $(dirname $0); pwd`" cd $script_dir -gen-pydantic ./itk-viewer.yml > ../packages/viewer/python/itkviewer/model.py +gen-pydantic ./itk-viewer.yml --pydantic-version 2 > ../packages/viewer/python/itkviewer/model.py diff --git a/model/itk-viewer.yml b/model/itk-viewer.yml index f101bc3f..5551300b 100644 --- a/model/itk-viewer.yml +++ b/model/itk-viewer.yml @@ -31,7 +31,7 @@ classes: Actors are typically implement as finite state machines. class_uri: viewer:Actor slots: - - unknown_event_action + - unknownEventAction Viewer: abstract: true @@ -41,6 +41,16 @@ classes: A viewer is an interface that allows users to view and interact with multi-dimensional images, geometry, and point sets. class_uri: viewer:Viewer + attributes: + title: + description: >- + The title of the viewer. + range: string + ifabsent: string("ITK Viewer") + dataManager: + description: >- + The data manager for the viewer. + range: DataManager Viewport: abstract: true @@ -226,7 +236,7 @@ slots: range: Viewport required: true - unknown_event_action: + unknownEventAction: description: >- The action to take when an unknown event is received. domain: Actor diff --git a/packages/viewer/python/itkviewer/__init__.py b/packages/viewer/python/itkviewer/__init__.py index 2178a3bf..16e86b3e 100644 --- a/packages/viewer/python/itkviewer/__init__.py +++ b/packages/viewer/python/itkviewer/__init__.py @@ -3,6 +3,7 @@ __version__ = "0.0.1" from .model import ( + DataManager, MultiscaleImage, Renderer, RendererEvent, @@ -12,12 +13,16 @@ Viewport, ) +from .viewer import ViewerMachine + __all__ = [ + "DataManager", "MultiscaleImage", "Renderer", "RendererEvent", "RendererEventType", "Viewer", + "ViewerMachine", "UnknownEventAction", "Viewport", ] diff --git a/packages/viewer/python/itkviewer/data_manager.py b/packages/viewer/python/itkviewer/data_manager.py index cfeb4ae2..2cb1234b 100644 --- a/packages/viewer/python/itkviewer/data_manager.py +++ b/packages/viewer/python/itkviewer/data_manager.py @@ -2,7 +2,18 @@ from statemachine import StateMachine, State -from .model import DataManager +from .model import DataManager, StoreModel + +from itkwasm import Image +import ngff_zarr + +from dataclasses import dataclass + +@dataclass +class MachineImageData: + multiscales: ngff_zarr.Multiscales + store: Optional[StoreModel] = None + dataUri: Optional[str] = None class DataManagerMachine(StateMachine): idle = State(initial=True) @@ -14,21 +25,32 @@ class DataManagerMachine(StateMachine): run = loading.to(running) shutdown = running.to(shutting_down) + SetImage = running.to.itself(internal=True) + def __init__(self, config: Optional[DataManager]=None): super(DataManagerMachine, self).__init__() - if config: - self.load_config(config) + data_manager = config or DataManager() + self.config = data_manager @property def config(self): - return { - - } + return self.data_manager @config.setter def config(self, config: DataManager): - self.load_config(config) - - def load_config(self, config: DataManager): - self.data_manager = config \ No newline at end of file + self.data_manager = config + self.image_count = 0 + self.images = {} + # for image_data in self.data_manager.images: + # if image_data.store is not None: + # image_data.store = StoreMachine(image_data.store) + # elif image_data.dataUri is not None: + # image_data.dataUri = ImageDataUriMachine(image_data.dataUri) + # else: + # raise ValueError("ImageData must have a store or dataUri.") + + @SetImage.on + def set_image(self, image: Image): + pass + # self.images \ No newline at end of file diff --git a/packages/viewer/python/itkviewer/model.py b/packages/viewer/python/itkviewer/model.py index 8e4cc7e5..e6471c00 100644 --- a/packages/viewer/python/itkviewer/model.py +++ b/packages/viewer/python/itkviewer/model.py @@ -4,7 +4,7 @@ from decimal import Decimal from typing import List, Dict, Optional, Any, Union -from pydantic import BaseModel as BaseModel, Field, validator +from pydantic import BaseModel as BaseModel, ConfigDict, Field, field_validator import re import sys if sys.version_info >= (3, 8): @@ -16,16 +16,13 @@ metamodel_version = "None" version = "0.0.1" -class WeakRefShimBaseModel(BaseModel): - __slots__ = '__weakref__' - -class ConfiguredBaseModel(WeakRefShimBaseModel, - validate_assignment = True, - validate_all = True, - underscore_attrs_are_private = True, - extra = 'forbid', - arbitrary_types_allowed = True, - use_enum_values = True): +class ConfiguredBaseModel(BaseModel): + model_config = ConfigDict( + validate_assignment=True, + validate_default=True, + extra = 'forbid', + arbitrary_types_allowed=True, + use_enum_values = True) pass @@ -70,6 +67,17 @@ class RendererEventType(str, Enum): +class StoreModelType(str, Enum): + """ + The types of Zarr store models. + """ + # A Zarr store that is backed by a directory on the file system. + Directory = "Directory" + # A Zarr store that can be wrapped an fsspec.FSMap in Python to give access to arbitrary filesystems. + FSStore = "FSStore" + + + class Actor(ConfiguredBaseModel): """ In the Actor Model mathematical of computation, an actor is a computational entity that, in response to a message it receives, can concurrently: @@ -77,7 +85,7 @@ class Actor(ConfiguredBaseModel): Supported messages are defined in the Event classes. The valid Events' for an Actor are defined defined by the `receives` relationship. To send an Event to an Actor, use the `send` method. Actors are typically implement as finite state machines. """ - unknown_event_action: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") + unknownEventAction: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") @@ -85,7 +93,9 @@ class Viewer(Actor): """ A viewer is an interface that allows users to view and interact with multi-dimensional images, geometry, and point sets. """ - unknown_event_action: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") + title: Optional[str] = Field("\"ITK Viewer\"", description="""The title of the viewer.""") + dataManager: Optional[DataManager] = Field(None, description="""The data manager for the viewer.""") + unknownEventAction: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") @@ -95,7 +105,7 @@ class Viewport(Actor): """ width: int = Field(640, description="""The width of the viewport in pixels.""") height: int = Field(480, description="""The height of the viewport in pixels.""") - unknown_event_action: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") + unknownEventAction: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") @@ -119,7 +129,7 @@ class StoreModel(ConfiguredBaseModel): """ Parameters of a Zarr store following the data model implied by Zarr-Python. """ - None + type: StoreModelType = Field(..., description="""The type of the Zarr store model.""") @@ -128,6 +138,7 @@ class DirectoryStore(StoreModel): A Zarr store that is backed by a directory on the file system. """ path: str = Field(..., description="""The path to the directory on the file system that contains the Zarr store.""") + type: StoreModelType = Field(..., description="""The type of the Zarr store model.""") @@ -136,6 +147,7 @@ class FSStore(StoreModel): A Zarr store that can be wrapped an fsspec.FSMap in Python to give access to arbitrary filesystems """ url: str = Field(..., description="""Protocol and path, like “s3://bucket/root.zarr” or \"https://example.com/image.ome.zarr\".""") + type: StoreModelType = Field(..., description="""The type of the Zarr store model.""") @@ -152,7 +164,7 @@ class MultiscaleImage(Actor): """ A multiscale image is a multi-dimensional image, based on the OME-Zarr data model, often preprocessed, that supports efficient rendering at multiple resolutions. """ - unknown_event_action: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") + unknownEventAction: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") @@ -161,7 +173,7 @@ class DataManager(Actor): A data manager is an actor that manages the loading and caching of data for rendering. """ images: List[ImageData] = Field(default_factory=list, description="""The images displayed by the viewer.""") - unknown_event_action: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") + unknownEventAction: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") @@ -172,7 +184,7 @@ class Renderer(Actor): viewport: Viewport = Field(..., description="""The viewport that displays the rendered RGB image.""") width: int = Field(640, description="""The width of the canvas in pixels.""") height: int = Field(480, description="""The height of the canvas in pixels.""") - unknown_event_action: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") + unknownEventAction: Optional[UnknownEventAction] = Field(None, description="""The action to take when an unknown event is received.""") @@ -219,23 +231,23 @@ class RenderEvent(RendererEvent): -# Update forward refs -# see https://pydantic-docs.helpmanual.io/usage/postponed_annotations/ -Actor.update_forward_refs() -Viewer.update_forward_refs() -Viewport.update_forward_refs() -Image.update_forward_refs() -ImageDataUri.update_forward_refs() -StoreModel.update_forward_refs() -DirectoryStore.update_forward_refs() -FSStore.update_forward_refs() -ImageData.update_forward_refs() -MultiscaleImage.update_forward_refs() -DataManager.update_forward_refs() -Renderer.update_forward_refs() -Event.update_forward_refs() -ViewerEvent.update_forward_refs() -SetImageEvent.update_forward_refs() -RendererEvent.update_forward_refs() -RenderEvent.update_forward_refs() +# Model rebuild +# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model +Actor.model_rebuild() +Viewer.model_rebuild() +Viewport.model_rebuild() +Image.model_rebuild() +ImageDataUri.model_rebuild() +StoreModel.model_rebuild() +DirectoryStore.model_rebuild() +FSStore.model_rebuild() +ImageData.model_rebuild() +MultiscaleImage.model_rebuild() +DataManager.model_rebuild() +Renderer.model_rebuild() +Event.model_rebuild() +ViewerEvent.model_rebuild() +SetImageEvent.model_rebuild() +RendererEvent.model_rebuild() +RenderEvent.model_rebuild() diff --git a/packages/viewer/python/itkviewer/viewer.py b/packages/viewer/python/itkviewer/viewer.py index ded90ea7..e0413dc8 100644 --- a/packages/viewer/python/itkviewer/viewer.py +++ b/packages/viewer/python/itkviewer/viewer.py @@ -2,9 +2,11 @@ from statemachine import StateMachine, State -from .model import Viewer, DataManager +from .model import Viewer from .data_manager import DataManagerMachine +from itkwasm import Image + class ViewerMachine(StateMachine): idle = State(initial=True) loading = State() @@ -15,23 +17,30 @@ class ViewerMachine(StateMachine): run = loading.to(running) shutdown = running.to(shutting_down) + SetImage = running.to.itself(internal=True) + def __init__(self, config: Optional[Viewer]=None): super(ViewerMachine, self).__init__() - if config: - self.load_config(config) - else: - self.load_config({}) + viewer = config or Viewer() + self.config = viewer @property def config(self): - return { - 'DataManager': self.data_manager.config - } + self.viewer.dataManager = self.data_manager_machine.config + return self.viewer @config.setter def config(self, config: Viewer): - self.load_config(config) + self.viewer = config + self.data_manager_machine = DataManagerMachine(self.viewer.dataManager) + + def on_enter_loading(self): + self.data_manager_machine.load() + + def on_enter_running(self): + self.data_manager_machine.run() - def load_config(self, config: Viewer): - self.data_manager = DataManagerMachine(config=config.get('DataManager', DataManager())) + @SetImage.on + def set_image(self, image: Image): + self.data_manager_machine.send('SetImage', image) diff --git a/packages/viewer/python/pyproject.toml b/packages/viewer/python/pyproject.toml index d5df687c..c8ed1a1b 100644 --- a/packages/viewer/python/pyproject.toml +++ b/packages/viewer/python/pyproject.toml @@ -45,6 +45,7 @@ Issues = "https://github.com/InsightSoftwareConsortium/itk-viewer/issues" dependencies = [ "pytest >=2.7.3", "pytest-pyodide", + "itkwasm-image-io", ] [tool.hatch.envs.default.scripts] diff --git a/packages/viewer/python/test/__init__.py b/packages/viewer/python/test/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/packages/viewer/python/test/common.py b/packages/viewer/python/test/common.py new file mode 100644 index 00000000..b84bfc2d --- /dev/null +++ b/packages/viewer/python/test/common.py @@ -0,0 +1,3 @@ +from pathlib import Path + +test_input_path = Path(__file__).parent / '..' / '..' / '..' / '..' / 'test' / 'data' / 'input' \ No newline at end of file diff --git a/packages/viewer/python/test/test_data_manager.py b/packages/viewer/python/test/test_data_manager.py new file mode 100644 index 00000000..3ec4f99b --- /dev/null +++ b/packages/viewer/python/test/test_data_manager.py @@ -0,0 +1,20 @@ +from .common import test_input_path + +from itkwasm_image_io import imread + +from itkviewer import ViewerMachine + +def test_data_manager_serialization(): + viewer_machine = ViewerMachine() + + input_image_path = test_input_path / 'HeadMRVolume.nrrd' + image = imread(input_image_path) + + viewer_machine.load() + viewer_machine.run() + + from rich import print + assert len(viewer_machine.config.dataManager.images) == 0 + + viewer_machine.send('SetImage', image) + # assert len(viewer_machine.config.dataManager.images) == 1 From 9ee3eb3abe07d9e11a35e23fdda24b1bad00ebe1 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Tue, 19 Mar 2024 23:03:08 -0400 Subject: [PATCH 23/25] WIP: feat(DataManager): serialization and deserialization --- model/itk-viewer.yml | 17 +++-------------- .../viewer/python/itkviewer/data_manager.py | 10 ++++++++++ packages/viewer/python/pyproject.toml | 1 + 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/model/itk-viewer.yml b/model/itk-viewer.yml index 5551300b..5bae1bb0 100644 --- a/model/itk-viewer.yml +++ b/model/itk-viewer.yml @@ -77,17 +77,6 @@ classes: An itk-wasm Image to be displayed in the viewer. class_uri: wasm:Image - ImageDataUri: - description: >- - A serialized itk-wasm Image to be displayed in the viewer, compressed and base64 encoded. - class_uri: viewer:ImageDataUri - attributes: - uri: - description: >- - The URI of the image data. - range: string - required: true - StoreModel: abstract: true description: >- @@ -126,10 +115,10 @@ classes: Image data displayed in the viewer. class_uri: viewer:ImageData attributes: - dataUri: + imageJson: description: >- - The image data. - range: ImageDataUri + The image data in JSON format. An ITK-Wasm Image with the pixel data zstd compressed and base64-encoded. + range: string store: description: >- The OME-Zarr store model for the image data. diff --git a/packages/viewer/python/itkviewer/data_manager.py b/packages/viewer/python/itkviewer/data_manager.py index 2cb1234b..a5bd63e9 100644 --- a/packages/viewer/python/itkviewer/data_manager.py +++ b/packages/viewer/python/itkviewer/data_manager.py @@ -52,5 +52,15 @@ def config(self, config: DataManager): @SetImage.on def set_image(self, image: Image): + self.image_count += 1 + if isinstance(image, Image): + ngff_image = ngff_zarr.itk_image_to_ngff(image) + multiscales = ngff_zarr.to_multiscales(ngff_image) + name = image.name + if name in self.images: + name = f"{name}{self.image_count}" + + image_data = MachineImageData(multiscales) + pass # self.images \ No newline at end of file diff --git a/packages/viewer/python/pyproject.toml b/packages/viewer/python/pyproject.toml index c8ed1a1b..6f1761c5 100644 --- a/packages/viewer/python/pyproject.toml +++ b/packages/viewer/python/pyproject.toml @@ -34,6 +34,7 @@ dependencies = [ "ngff-zarr", "pydantic", "python-statemachine", + "itkwasm-compress-stringify", ] [project.urls] From 05407e551661798830ec45b0ecf24307af6958bf Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Wed, 20 Mar 2024 19:51:46 -0400 Subject: [PATCH 24/25] feat(model): use designates_type with Event --- model/itk-viewer.yml | 52 ++---------------- packages/viewer/python/itkviewer/model.py | 66 ++++------------------- 2 files changed, 15 insertions(+), 103 deletions(-) diff --git a/model/itk-viewer.yml b/model/itk-viewer.yml index 5bae1bb0..98e08300 100644 --- a/model/itk-viewer.yml +++ b/model/itk-viewer.yml @@ -85,7 +85,8 @@ classes: type: description: >- The type of the Zarr store model. - range: StoreModelType + designates_type: true + range: string required: true DirectoryStore: @@ -172,10 +173,10 @@ classes: class_uri: viewer:Event attributes: type: - identifier: true + designates_type: true description: >- The type of the event. - range: EventType + range: string required: true ViewerEvent: @@ -184,9 +185,6 @@ classes: description: >- A ViewerEvent is an Event that can be sent to a Viewer. class_uri: viewer:ViewerEvent - slot_usage: - type: - range: ViewerEventType SetImageEvent: is_a: ViewerEvent @@ -207,9 +205,6 @@ classes: description: >- A RendererEvent is an Event supported by a Renderer. class_uri: viewer:RendererEvent - slot_usage: - type: - range: RendererEventType RenderEvent: is_a: RendererEvent @@ -247,11 +242,6 @@ slots: required: true enums: - EventType: - description: >- - The types of events that can be sent to actors. - enum_uri: viewer:EventType - UnknownEventAction: description: >- The types of actions that can be taken when an unknown event is received. @@ -265,36 +255,4 @@ enums: Log a warning and ignore the event. Error: description: >- - Throw an error. - - ViewerEventType: - description: >- - The types of events that can be sent to viewers. - enum_uri: viewer:ViewerEventType - inherits: EventType - permissible_values: - SetImage: - description: >- - Set an image to be displayed in the viewer. - - RendererEventType: - description: >- - The types of render events that can be sent to renderers. - enum_uri: viewer:RenderEventType - inherits: EventType - permissible_values: - Render: - description: >- - A render event is a message that instructs a renderer to render a scene to an in-memory RGB image. - - StoreModelType: - description: >- - The types of Zarr store models. - enum_uri: viewer:StoreModelType - permissible_values: - Directory: - description: >- - A Zarr store that is backed by a directory on the file system. - FSStore: - description: >- - A Zarr store that can be wrapped an fsspec.FSMap in Python to give access to arbitrary filesystems. \ No newline at end of file + Throw an error. \ No newline at end of file diff --git a/packages/viewer/python/itkviewer/model.py b/packages/viewer/python/itkviewer/model.py index e6471c00..7d4dd4a9 100644 --- a/packages/viewer/python/itkviewer/model.py +++ b/packages/viewer/python/itkviewer/model.py @@ -28,14 +28,6 @@ class ConfiguredBaseModel(BaseModel): -class EventType(str): - """ - The types of events that can be sent to actors. - """ - - dummy = "dummy" - - class UnknownEventAction(str, Enum): """ The types of actions that can be taken when an unknown event is received. @@ -49,35 +41,6 @@ class UnknownEventAction(str, Enum): -class ViewerEventType(str, Enum): - """ - The types of events that can be sent to viewers. - """ - # Set an image to be displayed in the viewer. - SetImage = "SetImage" - - - -class RendererEventType(str, Enum): - """ - The types of render events that can be sent to renderers. - """ - # A render event is a message that instructs a renderer to render a scene to an in-memory RGB image. - Render = "Render" - - - -class StoreModelType(str, Enum): - """ - The types of Zarr store models. - """ - # A Zarr store that is backed by a directory on the file system. - Directory = "Directory" - # A Zarr store that can be wrapped an fsspec.FSMap in Python to give access to arbitrary filesystems. - FSStore = "FSStore" - - - class Actor(ConfiguredBaseModel): """ In the Actor Model mathematical of computation, an actor is a computational entity that, in response to a message it receives, can concurrently: @@ -117,19 +80,11 @@ class Image(ConfiguredBaseModel): -class ImageDataUri(ConfiguredBaseModel): - """ - A serialized itk-wasm Image to be displayed in the viewer, compressed and base64 encoded. - """ - uri: str = Field(..., description="""The URI of the image data.""") - - - class StoreModel(ConfiguredBaseModel): """ Parameters of a Zarr store following the data model implied by Zarr-Python. """ - type: StoreModelType = Field(..., description="""The type of the Zarr store model.""") + type: Literal["StoreModel"] = Field("StoreModel", description="""The type of the Zarr store model.""") @@ -138,7 +93,7 @@ class DirectoryStore(StoreModel): A Zarr store that is backed by a directory on the file system. """ path: str = Field(..., description="""The path to the directory on the file system that contains the Zarr store.""") - type: StoreModelType = Field(..., description="""The type of the Zarr store model.""") + type: Literal["DirectoryStore"] = Field("DirectoryStore", description="""The type of the Zarr store model.""") @@ -147,7 +102,7 @@ class FSStore(StoreModel): A Zarr store that can be wrapped an fsspec.FSMap in Python to give access to arbitrary filesystems """ url: str = Field(..., description="""Protocol and path, like “s3://bucket/root.zarr” or \"https://example.com/image.ome.zarr\".""") - type: StoreModelType = Field(..., description="""The type of the Zarr store model.""") + type: Literal["FSStore"] = Field("FSStore", description="""The type of the Zarr store model.""") @@ -155,8 +110,8 @@ class ImageData(ConfiguredBaseModel): """ Image data displayed in the viewer. """ - dataUri: Optional[ImageDataUri] = Field(None, description="""The image data.""") - store: Optional[StoreModel] = Field(None, description="""The OME-Zarr store model for the image data.""") + imageJson: Optional[str] = Field(None, description="""The image data in JSON format. An ITK-Wasm Image with the pixel data zstd compressed and base64-encoded.""") + store: Optional[Union[StoreModel,DirectoryStore,FSStore]] = Field(None, description="""The OME-Zarr store model for the image data.""") @@ -192,7 +147,7 @@ class Event(ConfiguredBaseModel): """ An event is a message that can be sent to an actor. The actor can respond to the event by changing its state, sending messages to other actors, or creating new actors. """ - type: EventType = Field(..., description="""The type of the event.""") + type: Literal["Event"] = Field("Event", description="""The type of the event.""") @@ -200,7 +155,7 @@ class ViewerEvent(Event): """ A ViewerEvent is an Event that can be sent to a Viewer. """ - type: ViewerEventType = Field(..., description="""The type of the event.""") + type: Literal["ViewerEvent"] = Field("ViewerEvent", description="""The type of the event.""") @@ -210,7 +165,7 @@ class SetImageEvent(ViewerEvent): """ image: Image = Field(..., description="""The image to be displayed in the viewer.""") name: Optional[str] = Field(None, description="""The name of the image to be displayed in the viewer.""") - type: ViewerEventType = Field(..., description="""The type of the event.""") + type: Literal["SetImageEvent"] = Field("SetImageEvent", description="""The type of the event.""") @@ -218,7 +173,7 @@ class RendererEvent(Event): """ A RendererEvent is an Event supported by a Renderer. """ - type: RendererEventType = Field(..., description="""The type of the event.""") + type: Literal["RendererEvent"] = Field("RendererEvent", description="""The type of the event.""") @@ -226,7 +181,7 @@ class RenderEvent(RendererEvent): """ A render event is a message that instructs a renderer to render a scene to an in-memory RGB image. """ - type: RendererEventType = Field(..., description="""The type of the event.""") + type: Literal["RenderEvent"] = Field("RenderEvent", description="""The type of the event.""") @@ -237,7 +192,6 @@ class RenderEvent(RendererEvent): Viewer.model_rebuild() Viewport.model_rebuild() Image.model_rebuild() -ImageDataUri.model_rebuild() StoreModel.model_rebuild() DirectoryStore.model_rebuild() FSStore.model_rebuild() From 591f19d8e23fba2c97cc709f61d21bb1ea73e70d Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Wed, 27 Mar 2024 07:57:02 -0400 Subject: [PATCH 25/25] feat(python): initial pygfx package --- packages/pygfx/LICENSE | 202 +++++++++++++++++++++ packages/pygfx/README.md | 9 + packages/pygfx/itkviewer_pygfx/__init__.py | 9 + packages/pygfx/itkviewer_pygfx/renderer.py | 42 +++++ packages/pygfx/pyproject.toml | 45 +++++ 5 files changed, 307 insertions(+) create mode 100644 packages/pygfx/LICENSE create mode 100644 packages/pygfx/README.md create mode 100644 packages/pygfx/itkviewer_pygfx/__init__.py create mode 100644 packages/pygfx/itkviewer_pygfx/renderer.py create mode 100644 packages/pygfx/pyproject.toml diff --git a/packages/pygfx/LICENSE b/packages/pygfx/LICENSE new file mode 100644 index 00000000..62589edd --- /dev/null +++ b/packages/pygfx/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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 + + https://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. diff --git a/packages/pygfx/README.md b/packages/pygfx/README.md new file mode 100644 index 00000000..d0b507f3 --- /dev/null +++ b/packages/pygfx/README.md @@ -0,0 +1,9 @@ +# itkviewer-pygfx + +[pygfx](https://pygfx.readthedocs.io/) renderer for itkviewer. + +## Installation + +```sh +pip install itkviewer-pygfx +``` diff --git a/packages/pygfx/itkviewer_pygfx/__init__.py b/packages/pygfx/itkviewer_pygfx/__init__.py new file mode 100644 index 00000000..a5deb7d4 --- /dev/null +++ b/packages/pygfx/itkviewer_pygfx/__init__.py @@ -0,0 +1,9 @@ +"""itkviewer-pygfx: pygfx renderer for itkviewer.""" + +__version__ = "0.0.1" + +from .renderer import PygfxRenderer + +__all__ = [ + "PygfxRenderer", + ] diff --git a/packages/pygfx/itkviewer_pygfx/renderer.py b/packages/pygfx/itkviewer_pygfx/renderer.py new file mode 100644 index 00000000..226f42c2 --- /dev/null +++ b/packages/pygfx/itkviewer_pygfx/renderer.py @@ -0,0 +1,42 @@ +# SPDX-FileCopyrightText: 2024-present NumFOCUS +# +# SPDX-License-Identifier: Apache-2.0 + +from typing import List + +from itkviewer import Viewport, Renderer, RendererEvent, RendererEventType, UnknownEventAction + +import pygfx as gfx +import numpy as np + +class PygfxRenderer(Renderer): + """itk-viewer renderer that renders images using pygfx.""" + + def __init__(self, viewport: Viewport, width: int=640, height: int=480, unknown_event_action: UnknownEventAction=UnknownEventAction.Warning): + super().__init__(viewport, width, height, unknown_event_action) + + async def batch(self, events: List[RendererEvent]): + """Batch process a list of events.""" + for event in events: + self.send(event) + + async def send(self, event: RendererEvent): + """Send an event to the renderer.""" + match event.type: + case RendererEventType.Render: + self.render() + case _: + self.handle_unknown_event(event_type) + + async def render(self): + """Render the scene to an in-memory sRGB image.""" + pass + + def handle_unknown_event(self, event_type): + match self.unknown_event_action: + case UnknownEventAction.Error: + raise ValueError(f"Unknown event type: {event_type}") + case UnknownEventAction.Warning: + print(f"Unknown event type: {event_type}", flush=True) + case UnknownEventAction.Ignore: + pass \ No newline at end of file diff --git a/packages/pygfx/pyproject.toml b/packages/pygfx/pyproject.toml new file mode 100644 index 00000000..39de0f8a --- /dev/null +++ b/packages/pygfx/pyproject.toml @@ -0,0 +1,45 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "itkviewer-pygfx" +description = "pygfx renderer for itkviewer." +authors = [{name = "Matt McCormick", email = "matt.mccormick@kitware.com"}] +readme = "README.md" +license = {file = "LICENSE"} +classifiers = [ + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python", + 'Development Status :: 3 - Alpha', + 'Intended Audience :: Developers', + 'Intended Audience :: Science/Research', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', +] +keywords = [ + "itk", + "pygfx", + "imaging", + "visualization", +] +dynamic = ["version"] + +requires-python = ">=3.8" +dependencies = [ + "pygfx", +] + +[project.urls] +Home = "https://github.com/InsightSoftwareConsorrtium/itk-viewer" +Source = "https://github.com/InsightSoftwareConsortium/itk-viewer" +Issues = "https://github.com/InsightSoftwareConsortium/itk-viewer/issues" + +[tool.hatch.envs.default] +dependencies = [ + "pytest >=2.7.3", +] + +[tool.hatch.version] +path = "itkviewer_pygfx/__init__.py"